@fusion.dev/helix-headless 0.166.0 → 0.167.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +2658 -481
- package/dist/canvas/arrange.d.ts +32 -0
- package/dist/canvas/arrange.js +144 -0
- package/dist/canvas/paste.d.ts +25 -0
- package/dist/canvas/paste.js +58 -0
- package/dist/canvas/root/canvas-root.d.ts +60 -3
- package/dist/canvas/root/canvas-root.js +166 -2
- package/dist/chat/composer/chat-composer.js +5 -1
- package/dist/combobox/root/combobox-root.d.ts +6 -1
- package/dist/combobox/root/combobox-root.js +2 -2
- package/dist/date-input/root/date-input-root.d.ts +1 -1
- package/dist/element-events.generated.js +2 -0
- package/dist/file-input/root/file-input-root.d.ts +1 -1
- package/dist/file-input/root/file-input-root.js +1 -1
- package/dist/format-date/root/format-date-root.d.ts +10 -3
- package/dist/format-date/root/format-date-root.js +6 -1
- package/dist/listbox/root/listbox-root.d.ts +12 -1
- package/dist/listbox/root/listbox-root.js +13 -1
- package/dist/select/root/select-root.js +1 -1
- package/dist/table/grid-controller.d.ts +10 -0
- package/dist/table/grid-controller.js +7 -0
- package/dist/table/root/table-root.d.ts +71 -1
- package/dist/table/root/table-root.js +122 -7
- package/dist/table/row/table-row.d.ts +17 -0
- package/dist/table/row/table-row.js +23 -0
- package/dist/time-input/root/time-input-root.d.ts +2 -1
- package/dist/time-input/root/time-input-root.js +1 -1
- package/dist/time-picker/root/time-picker-root.d.ts +48 -1
- package/dist/time-picker/root/time-picker-root.js +79 -21
- package/dist/virtual-list/root/virtual-list-root.d.ts +70 -2
- package/dist/virtual-list/root/virtual-list-root.js +216 -32
- package/dist/virtual-list/sections.d.ts +27 -0
- package/dist/virtual-list/sections.js +43 -0
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +454 -76
- package/types/vue.d.ts +89 -7
- package/types/words.d.ts +27 -0
package/custom-elements.json
CHANGED
|
@@ -11952,6 +11952,50 @@
|
|
|
11952
11952
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
11953
11953
|
}
|
|
11954
11954
|
},
|
|
11955
|
+
{
|
|
11956
|
+
"kind": "field",
|
|
11957
|
+
"name": "updateRunning",
|
|
11958
|
+
"type": {
|
|
11959
|
+
"text": "boolean"
|
|
11960
|
+
},
|
|
11961
|
+
"privacy": "private",
|
|
11962
|
+
"default": "false",
|
|
11963
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
11964
|
+
"inheritedFrom": {
|
|
11965
|
+
"name": "HelixFormElement",
|
|
11966
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
11967
|
+
}
|
|
11968
|
+
},
|
|
11969
|
+
{
|
|
11970
|
+
"kind": "method",
|
|
11971
|
+
"name": "performUpdate",
|
|
11972
|
+
"privacy": "protected",
|
|
11973
|
+
"return": {
|
|
11974
|
+
"type": {
|
|
11975
|
+
"text": "void"
|
|
11976
|
+
}
|
|
11977
|
+
},
|
|
11978
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
11979
|
+
"inheritedFrom": {
|
|
11980
|
+
"name": "HelixElement",
|
|
11981
|
+
"module": "src/helix-element/helix-element.ts"
|
|
11982
|
+
}
|
|
11983
|
+
},
|
|
11984
|
+
{
|
|
11985
|
+
"kind": "method",
|
|
11986
|
+
"name": "runPendingUpdate",
|
|
11987
|
+
"privacy": "private",
|
|
11988
|
+
"return": {
|
|
11989
|
+
"type": {
|
|
11990
|
+
"text": "void"
|
|
11991
|
+
}
|
|
11992
|
+
},
|
|
11993
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
11994
|
+
"inheritedFrom": {
|
|
11995
|
+
"name": "HelixFormElement",
|
|
11996
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
11997
|
+
}
|
|
11998
|
+
},
|
|
11955
11999
|
{
|
|
11956
12000
|
"kind": "field",
|
|
11957
12001
|
"name": "willValidate",
|
|
@@ -11973,7 +12017,7 @@
|
|
|
11973
12017
|
"text": "boolean"
|
|
11974
12018
|
}
|
|
11975
12019
|
},
|
|
11976
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
12020
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
11977
12021
|
"inheritedFrom": {
|
|
11978
12022
|
"name": "HelixFormElement",
|
|
11979
12023
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -11982,6 +12026,20 @@
|
|
|
11982
12026
|
"text": "checkValidity() => boolean"
|
|
11983
12027
|
}
|
|
11984
12028
|
},
|
|
12029
|
+
{
|
|
12030
|
+
"kind": "field",
|
|
12031
|
+
"name": "checkInProgress",
|
|
12032
|
+
"type": {
|
|
12033
|
+
"text": "boolean"
|
|
12034
|
+
},
|
|
12035
|
+
"privacy": "private",
|
|
12036
|
+
"default": "false",
|
|
12037
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
12038
|
+
"inheritedFrom": {
|
|
12039
|
+
"name": "HelixFormElement",
|
|
12040
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
12041
|
+
}
|
|
12042
|
+
},
|
|
11985
12043
|
{
|
|
11986
12044
|
"kind": "method",
|
|
11987
12045
|
"name": "reportValidity",
|
|
@@ -12464,21 +12522,6 @@
|
|
|
12464
12522
|
"name": "HelixElement",
|
|
12465
12523
|
"module": "src/helix-element/helix-element.ts"
|
|
12466
12524
|
}
|
|
12467
|
-
},
|
|
12468
|
-
{
|
|
12469
|
-
"kind": "method",
|
|
12470
|
-
"name": "performUpdate",
|
|
12471
|
-
"privacy": "protected",
|
|
12472
|
-
"return": {
|
|
12473
|
-
"type": {
|
|
12474
|
-
"text": "void"
|
|
12475
|
-
}
|
|
12476
|
-
},
|
|
12477
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
12478
|
-
"inheritedFrom": {
|
|
12479
|
-
"name": "HelixElement",
|
|
12480
|
-
"module": "src/helix-element/helix-element.ts"
|
|
12481
|
-
}
|
|
12482
12525
|
}
|
|
12483
12526
|
],
|
|
12484
12527
|
"events": [
|
|
@@ -13630,6 +13673,60 @@
|
|
|
13630
13673
|
}
|
|
13631
13674
|
]
|
|
13632
13675
|
},
|
|
13676
|
+
{
|
|
13677
|
+
"kind": "javascript-module",
|
|
13678
|
+
"path": "src/canvas/arrange.ts",
|
|
13679
|
+
"declarations": [
|
|
13680
|
+
{
|
|
13681
|
+
"kind": "function",
|
|
13682
|
+
"name": "arrangement",
|
|
13683
|
+
"return": {
|
|
13684
|
+
"type": {
|
|
13685
|
+
"text": "Map<string, { x: number; y: number }>"
|
|
13686
|
+
}
|
|
13687
|
+
},
|
|
13688
|
+
"parameters": [
|
|
13689
|
+
{
|
|
13690
|
+
"name": "nodes",
|
|
13691
|
+
"type": {
|
|
13692
|
+
"text": "readonly CanvasNode[]"
|
|
13693
|
+
}
|
|
13694
|
+
},
|
|
13695
|
+
{
|
|
13696
|
+
"name": "edges",
|
|
13697
|
+
"type": {
|
|
13698
|
+
"text": "readonly CanvasEdge[]"
|
|
13699
|
+
}
|
|
13700
|
+
},
|
|
13701
|
+
{
|
|
13702
|
+
"name": "options",
|
|
13703
|
+
"default": "{}",
|
|
13704
|
+
"type": {
|
|
13705
|
+
"text": "CanvasArrangeOptions"
|
|
13706
|
+
}
|
|
13707
|
+
},
|
|
13708
|
+
{
|
|
13709
|
+
"name": "snap",
|
|
13710
|
+
"optional": true,
|
|
13711
|
+
"type": {
|
|
13712
|
+
"text": "number"
|
|
13713
|
+
}
|
|
13714
|
+
}
|
|
13715
|
+
],
|
|
13716
|
+
"description": "Where each card goes, by id, so that no two cards overlap.\n\n**Layers where there are connections.** A card goes one layer past the\nfurthest card that points to it, a connection that would close a loop is\nread as pointing back, and the cards in each layer are ordered by where\nthe cards they connect to sit, so connections cross less. **A grid where\nthere are none**, in reading order, about as many columns as rows.\n\nA group is placed as one box and carries the cards inside it, so a card\nstays in its group. What is arranged starts where the board's top left\ncorner was, and every place lands on a multiple of `snap` where it is set."
|
|
13717
|
+
}
|
|
13718
|
+
],
|
|
13719
|
+
"exports": [
|
|
13720
|
+
{
|
|
13721
|
+
"kind": "js",
|
|
13722
|
+
"name": "arrangement",
|
|
13723
|
+
"declaration": {
|
|
13724
|
+
"name": "arrangement",
|
|
13725
|
+
"module": "src/canvas/arrange.ts"
|
|
13726
|
+
}
|
|
13727
|
+
}
|
|
13728
|
+
]
|
|
13729
|
+
},
|
|
13633
13730
|
{
|
|
13634
13731
|
"kind": "javascript-module",
|
|
13635
13732
|
"path": "src/canvas/describe.ts",
|
|
@@ -15342,6 +15439,85 @@
|
|
|
15342
15439
|
}
|
|
15343
15440
|
]
|
|
15344
15441
|
},
|
|
15442
|
+
{
|
|
15443
|
+
"kind": "javascript-module",
|
|
15444
|
+
"path": "src/canvas/paste.ts",
|
|
15445
|
+
"declarations": [
|
|
15446
|
+
{
|
|
15447
|
+
"kind": "function",
|
|
15448
|
+
"name": "parseCanvas",
|
|
15449
|
+
"return": {
|
|
15450
|
+
"type": {
|
|
15451
|
+
"text": "CanvasDocument | undefined"
|
|
15452
|
+
}
|
|
15453
|
+
},
|
|
15454
|
+
"parameters": [
|
|
15455
|
+
{
|
|
15456
|
+
"name": "text",
|
|
15457
|
+
"type": {
|
|
15458
|
+
"text": "string"
|
|
15459
|
+
}
|
|
15460
|
+
}
|
|
15461
|
+
],
|
|
15462
|
+
"description": "A JSON Canvas document read from pasted text, or nothing where the text is\nnot one: any text that does not parse, or a node without an id, a type and\na box. An edge whose ends are not both among the nodes is left out."
|
|
15463
|
+
},
|
|
15464
|
+
{
|
|
15465
|
+
"kind": "function",
|
|
15466
|
+
"name": "pasteInto",
|
|
15467
|
+
"return": {
|
|
15468
|
+
"type": {
|
|
15469
|
+
"text": "CanvasDocument"
|
|
15470
|
+
}
|
|
15471
|
+
},
|
|
15472
|
+
"parameters": [
|
|
15473
|
+
{
|
|
15474
|
+
"name": "document",
|
|
15475
|
+
"type": {
|
|
15476
|
+
"text": "CanvasDocument"
|
|
15477
|
+
}
|
|
15478
|
+
},
|
|
15479
|
+
{
|
|
15480
|
+
"name": "nodes",
|
|
15481
|
+
"type": {
|
|
15482
|
+
"text": "readonly CanvasNode[]"
|
|
15483
|
+
}
|
|
15484
|
+
},
|
|
15485
|
+
{
|
|
15486
|
+
"name": "taken",
|
|
15487
|
+
"type": {
|
|
15488
|
+
"text": "ReadonlySet<string>"
|
|
15489
|
+
}
|
|
15490
|
+
},
|
|
15491
|
+
{
|
|
15492
|
+
"name": "step",
|
|
15493
|
+
"type": {
|
|
15494
|
+
"text": "number"
|
|
15495
|
+
},
|
|
15496
|
+
"description": "How far each move is, in the document's own units."
|
|
15497
|
+
}
|
|
15498
|
+
],
|
|
15499
|
+
"description": "The document a paste adds to a board that already holds `nodes` and the\nconnections named in `taken`.\n\n**Every id is made new where the board has it**, by a count after it, and\nthe connections follow their cards to the new ids. **The cards move clear\nof what they were copied from**: a step down and to the right, and another\nwhile any pasted card would still sit where a card already is, so a second\npaste lands beside the first. Cards from another board, where nothing sits,\nstay where they were."
|
|
15500
|
+
}
|
|
15501
|
+
],
|
|
15502
|
+
"exports": [
|
|
15503
|
+
{
|
|
15504
|
+
"kind": "js",
|
|
15505
|
+
"name": "parseCanvas",
|
|
15506
|
+
"declaration": {
|
|
15507
|
+
"name": "parseCanvas",
|
|
15508
|
+
"module": "src/canvas/paste.ts"
|
|
15509
|
+
}
|
|
15510
|
+
},
|
|
15511
|
+
{
|
|
15512
|
+
"kind": "js",
|
|
15513
|
+
"name": "pasteInto",
|
|
15514
|
+
"declaration": {
|
|
15515
|
+
"name": "pasteInto",
|
|
15516
|
+
"module": "src/canvas/paste.ts"
|
|
15517
|
+
}
|
|
15518
|
+
}
|
|
15519
|
+
]
|
|
15520
|
+
},
|
|
15345
15521
|
{
|
|
15346
15522
|
"kind": "javascript-module",
|
|
15347
15523
|
"path": "src/canvas/root/canvas-document.ts",
|
|
@@ -15771,7 +15947,7 @@
|
|
|
15771
15947
|
"declarations": [
|
|
15772
15948
|
{
|
|
15773
15949
|
"kind": "class",
|
|
15774
|
-
"description": "A board of cards and connectors, drawn by Helix. On a canvas every position\nis data that someone placed, so drawing is arithmetic over rectangles with no\nlayout to compute. `Map` takes a slotted map, because another renderer draws\nits tiles.\n\nThe format is [JSON Canvas](https://jsoncanvas.org), an open format. Each\nnode has an `x`, `y`, `width`, `height`, and a type. Each edge names the two\nnodes it joins and the sides it leaves and arrives on. A card belongs to a\ngroup when it sits inside the group's bounds.\n\nThe cards are text in the DOM, so a screen reader can read them. The family\nadds a reading order and states each card's connections as text. `order` sets\nthe reading order:\n- `spatial` bands the cards into rows.\n- `edges` follows the arrows, starting from the cards that nothing points to.\n\n**Cards move by default.** The board writes the new `x` and `y` onto the\ncard, the way an input writes its own value, and dispatches two events:\n- `helix-before-move` for every step. Cancel it to hold the positions in your\n own state and apply them yourself.\n- `helix-move` once the move is finished.\n\nA resize dispatches the same pair with a size. Set `readonly` on the board to\nkeep every card in place, such as on a published board. Set `readonly` on one\ncard or connection to keep only that one in place.\n\nSet `snap` to a length in the document's units, such as `32`, and a card\nthat is moved or resized lands on a multiple of it. Carrying a card, a\ncorner, a connection, or the selection box near the edge of the board moves\nthe board under it, so a card can be taken to a place off screen in one\ndrag. A connection let go within 20 pixels of a card arrives at it. A\ndouble click on the empty board zooms in about that point, and Shift with a\ndouble click zooms out.\n\nKeyboard behavior:\n- One card holds the board's tab stop.\n- The arrow keys move through the cards in reading order. The card you land\n on scrolls into view, and its connections are announced with it.\n- The card you land on is selected. Control or Command with an arrow key,\n Home, or End moves without changing the selection, and Space adds the card\n to the selection or takes it out, so you can select cards that are not\n next to each other.\n- Shift with an arrow key moves the card: by 16 units, or to the next\n multiple of `snap` where it is set. Alt with an arrow key resizes it from\n its bottom right corner the same way.\n- The connections leaving a card are stops of their own, straight after it.\n Enter on one moves to the card it arrives at.\n- What a key changes that a reader cannot see is said: where a card moved\n to, its new size, how many cards are selected, and the zoom. A selected\n card or connection says so when a reader arrives on it.\n- Control or Command with C copies the selected cards, and the connections\n between them, as a JSON Canvas document in text, which another board or\n an app that reads the format takes
|
|
15950
|
+
"description": "A board of cards and connectors, drawn by Helix. On a canvas every position\nis data that someone placed, so drawing is arithmetic over rectangles with no\nlayout to compute. `Map` takes a slotted map, because another renderer draws\nits tiles.\n\nThe format is [JSON Canvas](https://jsoncanvas.org), an open format. Each\nnode has an `x`, `y`, `width`, `height`, and a type. Each edge names the two\nnodes it joins and the sides it leaves and arrives on. A card belongs to a\ngroup when it sits inside the group's bounds.\n\nThe cards are text in the DOM, so a screen reader can read them. The family\nadds a reading order and states each card's connections as text. `order` sets\nthe reading order:\n- `spatial` bands the cards into rows.\n- `edges` follows the arrows, starting from the cards that nothing points to.\n\n**Cards move by default.** The board writes the new `x` and `y` onto the\ncard, the way an input writes its own value, and dispatches two events:\n- `helix-before-move` for every step. Cancel it to hold the positions in your\n own state and apply them yourself.\n- `helix-move` once the move is finished.\n\nA resize dispatches the same pair with a size. Set `readonly` on the board to\nkeep every card in place, such as on a published board. Set `readonly` on one\ncard or connection to keep only that one in place.\n\nSet `snap` to a length in the document's units, such as `32`, and a card\nthat is moved or resized lands on a multiple of it. Carrying a card, a\ncorner, a connection, or the selection box near the edge of the board moves\nthe board under it, so a card can be taken to a place off screen in one\ndrag. A connection let go within 20 pixels of a card arrives at it. A\ndouble click on the empty board zooms in about that point, and Shift with a\ndouble click zooms out.\n\nKeyboard behavior:\n- One card holds the board's tab stop.\n- The arrow keys move through the cards in reading order. The card you land\n on scrolls into view, and its connections are announced with it.\n- The card you land on is selected. Control or Command with an arrow key,\n Home, or End moves without changing the selection, and Space adds the card\n to the selection or takes it out, so you can select cards that are not\n next to each other.\n- Shift with an arrow key moves the card: by 16 units, or to the next\n multiple of `snap` where it is set. Alt with an arrow key resizes it from\n its bottom right corner the same way.\n- The connections leaving a card are stops of their own, straight after it.\n Enter on one moves to the card it arrives at.\n- What a key changes that a reader cannot see is said: where a card moved\n to, its new size, how many cards are selected, and the zoom. A selected\n card or connection says so when a reader arrives on it.\n- Control or Command with C copies the selected cards, and the connections\n between them, as a JSON Canvas document in text, which another board or\n an app that reads the format takes.\n- Control or Command with V pastes a JSON Canvas document: the board adds\n its cards and connections, a step down and to the right of any card they\n would sit on, and selects them. It asks with `helix-before-paste` first.\n A page that renders its cards from its own state cancels it and adds the\n detail's document to that state, through `fromJsonCanvas`. `paste()` does\n the same from a script.\n- Control or Command with Z undoes the last move or resize the board made,\n and with Shift, or Control with Y, makes it again. `undo()` and `redo()`\n do the same from a script. Each asks with `helix-before-move` and tells\n with `helix-move`, as a move does, so a board that holds its positions in\n your state is undone through your state.\n\n**`arrange()` moves every card so that none overlaps another**, in layers\nthat follow the arrows, or in a grid on a board with no connections. The\ncards glide for as long as the board's own transition, and `undo()` puts\nthem back.\n\nEvery drag also works with clicks, as WCAG 2.5.7 requires for a pointer that\ncannot hold a button down. Click a selected card's move handle, a corner, a\ncard's connection point, or the end of a selected connection to pick it up.\nIt follows the pointer with no button held, and the next click puts it down\nwhere a drag would have. On touch, the next tap sets where it lands. Escape,\nor a press outside the board, puts it back. So a finger connects two cards\nwith three taps: the card, one of its points, and the card to connect to.\n\nConnecting and removing dispatch requests, and your code applies them:\n- Drawing from a card's handle to another card, or pressing C on one card and\n Enter on another, dispatches `helix-connect`.\n- Delete on a card or a connection dispatches `helix-remove`. The event names\n every connection that removing the card would leave without an end.\n\nOnce your page removes what Delete asked for, focus moves to the next stop,\nto the one before where it was the last, and to the board where none is\nleft. A focused card your page removes for its own reasons hands focus on\nthe same way, unless the reader has already moved focus somewhere else.\n\nThe board applies a move itself, because the card already exists. A\nconnection is a new element, and React discards an element the board adds to\nits markup on the next render, so you write the connection.\n\n**`edgeRoute` draws the connections' lines your own way**: a function from\nwhere a line leaves and arrives, and the sides it does, to its SVG path, for\na route such as one that bends around the cards between. What it returns\nis the line drawn, the line pressed and focused, and the one an arrowhead\nsits at the end of. Nothing back draws the board's own.\n\nAdd `minimap` to `controls` for a picture of the whole board in a corner:\neach card as a box, and a frame around what is on screen. A press or a drag\non it brings that place to the middle of the view. It is for a pointer, and\na screen reader skips it: the arrow keys and `show()` reach every card.\n\nCards and connections are `helix-canvas-node` and `helix-canvas-edge`\nelements, so they are in the served markup whichever renderer wrote them. The\nlibrary fetches nothing, and an array passed to an element is missing from\nthe first paint of a server-rendered React page. `fromJsonCanvas` turns a\nJSON Canvas document into their props, and `toJsonCanvas()` writes a board\nback out.",
|
|
15775
15951
|
"name": "HelixHeadlessCanvas",
|
|
15776
15952
|
"cssProperties": [
|
|
15777
15953
|
{
|
|
@@ -15990,6 +16166,19 @@
|
|
|
15990
16166
|
"module": "src/mixins/mixin-viewport/mixin-viewport.ts"
|
|
15991
16167
|
}
|
|
15992
16168
|
},
|
|
16169
|
+
{
|
|
16170
|
+
"kind": "field",
|
|
16171
|
+
"name": "arrangedLabel",
|
|
16172
|
+
"type": {
|
|
16173
|
+
"text": "string"
|
|
16174
|
+
},
|
|
16175
|
+
"default": "'Cards arranged'",
|
|
16176
|
+
"description": "What screen readers hear after `arrange()` moves the cards.",
|
|
16177
|
+
"attribute": "arranged-label",
|
|
16178
|
+
"helix": {
|
|
16179
|
+
"words": true
|
|
16180
|
+
}
|
|
16181
|
+
},
|
|
15993
16182
|
{
|
|
15994
16183
|
"kind": "field",
|
|
15995
16184
|
"name": "comesFromLabel",
|
|
@@ -16165,6 +16354,19 @@
|
|
|
16165
16354
|
"attribute": "order",
|
|
16166
16355
|
"reflects": true
|
|
16167
16356
|
},
|
|
16357
|
+
{
|
|
16358
|
+
"kind": "field",
|
|
16359
|
+
"name": "pastedLabel",
|
|
16360
|
+
"type": {
|
|
16361
|
+
"text": "string"
|
|
16362
|
+
},
|
|
16363
|
+
"default": "'{count, plural, one {# card pasted} other {# cards pasted}}'",
|
|
16364
|
+
"description": "What screen readers hear after a paste, with `{count}` for the cards pasted.",
|
|
16365
|
+
"attribute": "pasted-label",
|
|
16366
|
+
"helix": {
|
|
16367
|
+
"words": true
|
|
16368
|
+
}
|
|
16369
|
+
},
|
|
16168
16370
|
{
|
|
16169
16371
|
"kind": "field",
|
|
16170
16372
|
"name": "path",
|
|
@@ -16212,6 +16414,19 @@
|
|
|
16212
16414
|
"words": true
|
|
16213
16415
|
}
|
|
16214
16416
|
},
|
|
16417
|
+
{
|
|
16418
|
+
"kind": "field",
|
|
16419
|
+
"name": "removedLabel",
|
|
16420
|
+
"type": {
|
|
16421
|
+
"text": "string"
|
|
16422
|
+
},
|
|
16423
|
+
"default": "'{count, plural, one {Asked to remove {name}.} other {Asked to remove # items.}}'",
|
|
16424
|
+
"description": "What screen readers hear when Delete asks to remove what is selected, with\n`{count}` for how many cards and connections, and `{name}` for the one\nwhere there is one.",
|
|
16425
|
+
"attribute": "removed-label",
|
|
16426
|
+
"helix": {
|
|
16427
|
+
"words": true
|
|
16428
|
+
}
|
|
16429
|
+
},
|
|
16215
16430
|
{
|
|
16216
16431
|
"kind": "field",
|
|
16217
16432
|
"name": "resizedLabel",
|
|
@@ -17795,6 +18010,76 @@
|
|
|
17795
18010
|
"readonly": true,
|
|
17796
18011
|
"description": "A copy on the board with cards selected writes them, and the connections\nbetween them, as a JSON Canvas document in text. Not from a field a card\nholds, nor over text a reader selected, which are the platform's to copy."
|
|
17797
18012
|
},
|
|
18013
|
+
{
|
|
18014
|
+
"kind": "field",
|
|
18015
|
+
"name": "handlePaste",
|
|
18016
|
+
"privacy": "private",
|
|
18017
|
+
"readonly": true,
|
|
18018
|
+
"description": "A paste on the board of a JSON Canvas document, the text a copy writes,\nadds its cards and connections. Not into a field a card holds, nor onto a\n`readonly` board, nor text that is not a board, which are the platform's."
|
|
18019
|
+
},
|
|
18020
|
+
{
|
|
18021
|
+
"kind": "method",
|
|
18022
|
+
"name": "paste",
|
|
18023
|
+
"return": {
|
|
18024
|
+
"type": {
|
|
18025
|
+
"text": "boolean"
|
|
18026
|
+
}
|
|
18027
|
+
},
|
|
18028
|
+
"parameters": [
|
|
18029
|
+
{
|
|
18030
|
+
"name": "document",
|
|
18031
|
+
"type": {
|
|
18032
|
+
"text": "CanvasDocument | string"
|
|
18033
|
+
}
|
|
18034
|
+
}
|
|
18035
|
+
],
|
|
18036
|
+
"description": "Adds the cards and connections of a JSON Canvas document, as a paste does,\nand selects the cards. Ids the board already holds are given a count after\nthem, and the cards move a step down and to the right while they would sit\non cards already there.\n\nAsks with `helix-before-paste` first: cancel it to add the detail's\ndocument to your own state. Returns whether the board added the cards:\nfalse on a `readonly` board, for text that is not a board, or when the\nrequest was refused.",
|
|
18037
|
+
"type": {
|
|
18038
|
+
"text": "paste(document: CanvasDocument | string) => boolean"
|
|
18039
|
+
}
|
|
18040
|
+
},
|
|
18041
|
+
{
|
|
18042
|
+
"kind": "field",
|
|
18043
|
+
"name": "gliding",
|
|
18044
|
+
"type": {
|
|
18045
|
+
"text": "{ frame: number; to: MoveDetail['nodes'] } | undefined"
|
|
18046
|
+
},
|
|
18047
|
+
"privacy": "private",
|
|
18048
|
+
"description": "The glide `arrange()` started, while it runs."
|
|
18049
|
+
},
|
|
18050
|
+
{
|
|
18051
|
+
"kind": "method",
|
|
18052
|
+
"name": "settle",
|
|
18053
|
+
"privacy": "private",
|
|
18054
|
+
"return": {
|
|
18055
|
+
"type": {
|
|
18056
|
+
"text": "void"
|
|
18057
|
+
}
|
|
18058
|
+
},
|
|
18059
|
+
"description": "Ends a glide where it was going."
|
|
18060
|
+
},
|
|
18061
|
+
{
|
|
18062
|
+
"kind": "method",
|
|
18063
|
+
"name": "arrange",
|
|
18064
|
+
"return": {
|
|
18065
|
+
"type": {
|
|
18066
|
+
"text": "boolean"
|
|
18067
|
+
}
|
|
18068
|
+
},
|
|
18069
|
+
"parameters": [
|
|
18070
|
+
{
|
|
18071
|
+
"name": "options",
|
|
18072
|
+
"default": "{}",
|
|
18073
|
+
"type": {
|
|
18074
|
+
"text": "CanvasArrangeOptions"
|
|
18075
|
+
}
|
|
18076
|
+
}
|
|
18077
|
+
],
|
|
18078
|
+
"description": "Moves the cards so that none overlaps another: in layers that follow the\nconnections, or in a grid where there are none. A group moves as one box\nwith its cards. Each place lands on a multiple of `snap` where it is set.\n\nAsks with `helix-before-move` first and tells with `helix-move`, as a\nmove does, so `undo()` puts every card back. The cards glide to their\nplaces for as long as the board's plane takes to glide, and land at once\nwhere it does not, such as under `prefers-reduced-motion`. Returns whether\nthe cards moved.",
|
|
18079
|
+
"type": {
|
|
18080
|
+
"text": "arrange(options: CanvasArrangeOptions = {}) => boolean"
|
|
18081
|
+
}
|
|
18082
|
+
},
|
|
17798
18083
|
{
|
|
17799
18084
|
"kind": "field",
|
|
17800
18085
|
"name": "handleHistoryKey",
|
|
@@ -19668,6 +19953,14 @@
|
|
|
19668
19953
|
"name": "helix-before-move",
|
|
19669
19954
|
"reactProp": "onhelix-before-move"
|
|
19670
19955
|
},
|
|
19956
|
+
{
|
|
19957
|
+
"type": {
|
|
19958
|
+
"text": "HelixBeforePasteEvent"
|
|
19959
|
+
},
|
|
19960
|
+
"description": "Cards and connections are about to be pasted. Cancelable: cancel it to add the detail's document to your own state.",
|
|
19961
|
+
"name": "helix-before-paste",
|
|
19962
|
+
"reactProp": "onhelix-before-paste"
|
|
19963
|
+
},
|
|
19671
19964
|
{
|
|
19672
19965
|
"type": {
|
|
19673
19966
|
"text": "HelixBeforeReconnectEvent"
|
|
@@ -19732,6 +20025,14 @@
|
|
|
19732
20025
|
"name": "helix-move",
|
|
19733
20026
|
"reactProp": "onhelix-move"
|
|
19734
20027
|
},
|
|
20028
|
+
{
|
|
20029
|
+
"type": {
|
|
20030
|
+
"text": "HelixPastedEvent"
|
|
20031
|
+
},
|
|
20032
|
+
"description": "Cards and connections were pasted, and the board holds them.",
|
|
20033
|
+
"name": "helix-pasted",
|
|
20034
|
+
"reactProp": "onhelix-pasted"
|
|
20035
|
+
},
|
|
19735
20036
|
{
|
|
19736
20037
|
"type": {
|
|
19737
20038
|
"text": "HelixReconnectEvent"
|
|
@@ -19775,6 +20076,15 @@
|
|
|
19775
20076
|
"description": "The hint shown when the board, waiting to be pressed with\n`gestures=\"activate\"`, is scrolled or swiped over.",
|
|
19776
20077
|
"fieldName": "activateHintLabel"
|
|
19777
20078
|
},
|
|
20079
|
+
{
|
|
20080
|
+
"name": "arranged-label",
|
|
20081
|
+
"type": {
|
|
20082
|
+
"text": "string"
|
|
20083
|
+
},
|
|
20084
|
+
"default": "'Cards arranged'",
|
|
20085
|
+
"description": "What screen readers hear after `arrange()` moves the cards.",
|
|
20086
|
+
"fieldName": "arrangedLabel"
|
|
20087
|
+
},
|
|
19778
20088
|
{
|
|
19779
20089
|
"name": "comes-from-label",
|
|
19780
20090
|
"type": {
|
|
@@ -19891,6 +20201,15 @@
|
|
|
19891
20201
|
"description": "The order the arrow keys and screen readers move through the cards:\n`spatial` or `edges`.\n\n`spatial` bands them into rows and reads each row across, which is how a\nperson reads a board laid out on a grid and is a heuristic a loose board\ndefeats. `edges` follows the arrows from the cards nothing points to, which\non a board that is a flow is the order its author meant.\n\nAbsent is spatial, a resting value being an attribute's absence: a default\nthat reflected would write a choice onto every host that no server sent.",
|
|
19892
20202
|
"fieldName": "order"
|
|
19893
20203
|
},
|
|
20204
|
+
{
|
|
20205
|
+
"name": "pasted-label",
|
|
20206
|
+
"type": {
|
|
20207
|
+
"text": "string"
|
|
20208
|
+
},
|
|
20209
|
+
"default": "'{count, plural, one {# card pasted} other {# cards pasted}}'",
|
|
20210
|
+
"description": "What screen readers hear after a paste, with `{count}` for the cards pasted.",
|
|
20211
|
+
"fieldName": "pastedLabel"
|
|
20212
|
+
},
|
|
19894
20213
|
{
|
|
19895
20214
|
"name": "path",
|
|
19896
20215
|
"type": {
|
|
@@ -19926,6 +20245,15 @@
|
|
|
19926
20245
|
"description": "What screen readers hear after a move or a resize is made again.",
|
|
19927
20246
|
"fieldName": "redoneLabel"
|
|
19928
20247
|
},
|
|
20248
|
+
{
|
|
20249
|
+
"name": "removed-label",
|
|
20250
|
+
"type": {
|
|
20251
|
+
"text": "string"
|
|
20252
|
+
},
|
|
20253
|
+
"default": "'{count, plural, one {Asked to remove {name}.} other {Asked to remove # items.}}'",
|
|
20254
|
+
"description": "What screen readers hear when Delete asks to remove what is selected, with\n`{count}` for how many cards and connections, and `{name}` for the one\nwhere there is one.",
|
|
20255
|
+
"fieldName": "removedLabel"
|
|
20256
|
+
},
|
|
19929
20257
|
{
|
|
19930
20258
|
"name": "resized-label",
|
|
19931
20259
|
"type": {
|
|
@@ -20281,6 +20609,14 @@
|
|
|
20281
20609
|
}
|
|
20282
20610
|
],
|
|
20283
20611
|
"exports": [
|
|
20612
|
+
{
|
|
20613
|
+
"kind": "js",
|
|
20614
|
+
"name": "CanvasArrangeOptions",
|
|
20615
|
+
"declaration": {
|
|
20616
|
+
"name": "CanvasArrangeOptions",
|
|
20617
|
+
"module": "../arrange.js"
|
|
20618
|
+
}
|
|
20619
|
+
},
|
|
20284
20620
|
{
|
|
20285
20621
|
"kind": "js",
|
|
20286
20622
|
"name": "CanvasDocument",
|
|
@@ -23439,6 +23775,50 @@
|
|
|
23439
23775
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
23440
23776
|
}
|
|
23441
23777
|
},
|
|
23778
|
+
{
|
|
23779
|
+
"kind": "field",
|
|
23780
|
+
"name": "updateRunning",
|
|
23781
|
+
"type": {
|
|
23782
|
+
"text": "boolean"
|
|
23783
|
+
},
|
|
23784
|
+
"privacy": "private",
|
|
23785
|
+
"default": "false",
|
|
23786
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
23787
|
+
"inheritedFrom": {
|
|
23788
|
+
"name": "HelixFormElement",
|
|
23789
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
23790
|
+
}
|
|
23791
|
+
},
|
|
23792
|
+
{
|
|
23793
|
+
"kind": "method",
|
|
23794
|
+
"name": "performUpdate",
|
|
23795
|
+
"privacy": "protected",
|
|
23796
|
+
"return": {
|
|
23797
|
+
"type": {
|
|
23798
|
+
"text": "void"
|
|
23799
|
+
}
|
|
23800
|
+
},
|
|
23801
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
23802
|
+
"inheritedFrom": {
|
|
23803
|
+
"name": "HelixElement",
|
|
23804
|
+
"module": "src/helix-element/helix-element.ts"
|
|
23805
|
+
}
|
|
23806
|
+
},
|
|
23807
|
+
{
|
|
23808
|
+
"kind": "method",
|
|
23809
|
+
"name": "runPendingUpdate",
|
|
23810
|
+
"privacy": "private",
|
|
23811
|
+
"return": {
|
|
23812
|
+
"type": {
|
|
23813
|
+
"text": "void"
|
|
23814
|
+
}
|
|
23815
|
+
},
|
|
23816
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
23817
|
+
"inheritedFrom": {
|
|
23818
|
+
"name": "HelixFormElement",
|
|
23819
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
23820
|
+
}
|
|
23821
|
+
},
|
|
23442
23822
|
{
|
|
23443
23823
|
"kind": "field",
|
|
23444
23824
|
"name": "willValidate",
|
|
@@ -23460,7 +23840,7 @@
|
|
|
23460
23840
|
"text": "boolean"
|
|
23461
23841
|
}
|
|
23462
23842
|
},
|
|
23463
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
23843
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
23464
23844
|
"inheritedFrom": {
|
|
23465
23845
|
"name": "HelixFormElement",
|
|
23466
23846
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -23469,6 +23849,20 @@
|
|
|
23469
23849
|
"text": "checkValidity() => boolean"
|
|
23470
23850
|
}
|
|
23471
23851
|
},
|
|
23852
|
+
{
|
|
23853
|
+
"kind": "field",
|
|
23854
|
+
"name": "checkInProgress",
|
|
23855
|
+
"type": {
|
|
23856
|
+
"text": "boolean"
|
|
23857
|
+
},
|
|
23858
|
+
"privacy": "private",
|
|
23859
|
+
"default": "false",
|
|
23860
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
23861
|
+
"inheritedFrom": {
|
|
23862
|
+
"name": "HelixFormElement",
|
|
23863
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
23864
|
+
}
|
|
23865
|
+
},
|
|
23472
23866
|
{
|
|
23473
23867
|
"kind": "method",
|
|
23474
23868
|
"name": "reportValidity",
|
|
@@ -23951,21 +24345,6 @@
|
|
|
23951
24345
|
"name": "HelixElement",
|
|
23952
24346
|
"module": "src/helix-element/helix-element.ts"
|
|
23953
24347
|
}
|
|
23954
|
-
},
|
|
23955
|
-
{
|
|
23956
|
-
"kind": "method",
|
|
23957
|
-
"name": "performUpdate",
|
|
23958
|
-
"privacy": "protected",
|
|
23959
|
-
"return": {
|
|
23960
|
-
"type": {
|
|
23961
|
-
"text": "void"
|
|
23962
|
-
}
|
|
23963
|
-
},
|
|
23964
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
23965
|
-
"inheritedFrom": {
|
|
23966
|
-
"name": "HelixElement",
|
|
23967
|
-
"module": "src/helix-element/helix-element.ts"
|
|
23968
|
-
}
|
|
23969
24348
|
}
|
|
23970
24349
|
],
|
|
23971
24350
|
"events": [
|
|
@@ -27588,7 +27967,7 @@
|
|
|
27588
27967
|
},
|
|
27589
27968
|
"privacy": "private",
|
|
27590
27969
|
"default": "false",
|
|
27591
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
27970
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
27592
27971
|
"inheritedFrom": {
|
|
27593
27972
|
"name": "MixinField",
|
|
27594
27973
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -28028,6 +28407,50 @@
|
|
|
28028
28407
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
28029
28408
|
}
|
|
28030
28409
|
},
|
|
28410
|
+
{
|
|
28411
|
+
"kind": "field",
|
|
28412
|
+
"name": "updateRunning",
|
|
28413
|
+
"type": {
|
|
28414
|
+
"text": "boolean"
|
|
28415
|
+
},
|
|
28416
|
+
"privacy": "private",
|
|
28417
|
+
"default": "false",
|
|
28418
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
28419
|
+
"inheritedFrom": {
|
|
28420
|
+
"name": "HelixFormElement",
|
|
28421
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
28422
|
+
}
|
|
28423
|
+
},
|
|
28424
|
+
{
|
|
28425
|
+
"kind": "method",
|
|
28426
|
+
"name": "performUpdate",
|
|
28427
|
+
"privacy": "protected",
|
|
28428
|
+
"return": {
|
|
28429
|
+
"type": {
|
|
28430
|
+
"text": "void"
|
|
28431
|
+
}
|
|
28432
|
+
},
|
|
28433
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
28434
|
+
"inheritedFrom": {
|
|
28435
|
+
"name": "HelixElement",
|
|
28436
|
+
"module": "src/helix-element/helix-element.ts"
|
|
28437
|
+
}
|
|
28438
|
+
},
|
|
28439
|
+
{
|
|
28440
|
+
"kind": "method",
|
|
28441
|
+
"name": "runPendingUpdate",
|
|
28442
|
+
"privacy": "private",
|
|
28443
|
+
"return": {
|
|
28444
|
+
"type": {
|
|
28445
|
+
"text": "void"
|
|
28446
|
+
}
|
|
28447
|
+
},
|
|
28448
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
28449
|
+
"inheritedFrom": {
|
|
28450
|
+
"name": "HelixFormElement",
|
|
28451
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
28452
|
+
}
|
|
28453
|
+
},
|
|
28031
28454
|
{
|
|
28032
28455
|
"kind": "field",
|
|
28033
28456
|
"name": "willValidate",
|
|
@@ -28049,7 +28472,7 @@
|
|
|
28049
28472
|
"text": "boolean"
|
|
28050
28473
|
}
|
|
28051
28474
|
},
|
|
28052
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
28475
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
28053
28476
|
"inheritedFrom": {
|
|
28054
28477
|
"name": "HelixFormElement",
|
|
28055
28478
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -28058,6 +28481,20 @@
|
|
|
28058
28481
|
"text": "checkValidity() => boolean"
|
|
28059
28482
|
}
|
|
28060
28483
|
},
|
|
28484
|
+
{
|
|
28485
|
+
"kind": "field",
|
|
28486
|
+
"name": "checkInProgress",
|
|
28487
|
+
"type": {
|
|
28488
|
+
"text": "boolean"
|
|
28489
|
+
},
|
|
28490
|
+
"privacy": "private",
|
|
28491
|
+
"default": "false",
|
|
28492
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
28493
|
+
"inheritedFrom": {
|
|
28494
|
+
"name": "HelixFormElement",
|
|
28495
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
28496
|
+
}
|
|
28497
|
+
},
|
|
28061
28498
|
{
|
|
28062
28499
|
"kind": "method",
|
|
28063
28500
|
"name": "reportValidity",
|
|
@@ -28540,21 +28977,6 @@
|
|
|
28540
28977
|
"name": "HelixElement",
|
|
28541
28978
|
"module": "src/helix-element/helix-element.ts"
|
|
28542
28979
|
}
|
|
28543
|
-
},
|
|
28544
|
-
{
|
|
28545
|
-
"kind": "method",
|
|
28546
|
-
"name": "performUpdate",
|
|
28547
|
-
"privacy": "protected",
|
|
28548
|
-
"return": {
|
|
28549
|
-
"type": {
|
|
28550
|
-
"text": "void"
|
|
28551
|
-
}
|
|
28552
|
-
},
|
|
28553
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
28554
|
-
"inheritedFrom": {
|
|
28555
|
-
"name": "HelixElement",
|
|
28556
|
-
"module": "src/helix-element/helix-element.ts"
|
|
28557
|
-
}
|
|
28558
28980
|
}
|
|
28559
28981
|
],
|
|
28560
28982
|
"events": [
|
|
@@ -29386,7 +29808,7 @@
|
|
|
29386
29808
|
},
|
|
29387
29809
|
"privacy": "private",
|
|
29388
29810
|
"default": "false",
|
|
29389
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
29811
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
29390
29812
|
"inheritedFrom": {
|
|
29391
29813
|
"name": "MixinField",
|
|
29392
29814
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -29826,6 +30248,50 @@
|
|
|
29826
30248
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
29827
30249
|
}
|
|
29828
30250
|
},
|
|
30251
|
+
{
|
|
30252
|
+
"kind": "field",
|
|
30253
|
+
"name": "updateRunning",
|
|
30254
|
+
"type": {
|
|
30255
|
+
"text": "boolean"
|
|
30256
|
+
},
|
|
30257
|
+
"privacy": "private",
|
|
30258
|
+
"default": "false",
|
|
30259
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
30260
|
+
"inheritedFrom": {
|
|
30261
|
+
"name": "HelixFormElement",
|
|
30262
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
30263
|
+
}
|
|
30264
|
+
},
|
|
30265
|
+
{
|
|
30266
|
+
"kind": "method",
|
|
30267
|
+
"name": "performUpdate",
|
|
30268
|
+
"privacy": "protected",
|
|
30269
|
+
"return": {
|
|
30270
|
+
"type": {
|
|
30271
|
+
"text": "void"
|
|
30272
|
+
}
|
|
30273
|
+
},
|
|
30274
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
30275
|
+
"inheritedFrom": {
|
|
30276
|
+
"name": "HelixElement",
|
|
30277
|
+
"module": "src/helix-element/helix-element.ts"
|
|
30278
|
+
}
|
|
30279
|
+
},
|
|
30280
|
+
{
|
|
30281
|
+
"kind": "method",
|
|
30282
|
+
"name": "runPendingUpdate",
|
|
30283
|
+
"privacy": "private",
|
|
30284
|
+
"return": {
|
|
30285
|
+
"type": {
|
|
30286
|
+
"text": "void"
|
|
30287
|
+
}
|
|
30288
|
+
},
|
|
30289
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
30290
|
+
"inheritedFrom": {
|
|
30291
|
+
"name": "HelixFormElement",
|
|
30292
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
30293
|
+
}
|
|
30294
|
+
},
|
|
29829
30295
|
{
|
|
29830
30296
|
"kind": "field",
|
|
29831
30297
|
"name": "willValidate",
|
|
@@ -29847,7 +30313,7 @@
|
|
|
29847
30313
|
"text": "boolean"
|
|
29848
30314
|
}
|
|
29849
30315
|
},
|
|
29850
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
30316
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
29851
30317
|
"inheritedFrom": {
|
|
29852
30318
|
"name": "HelixFormElement",
|
|
29853
30319
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -29856,6 +30322,20 @@
|
|
|
29856
30322
|
"text": "checkValidity() => boolean"
|
|
29857
30323
|
}
|
|
29858
30324
|
},
|
|
30325
|
+
{
|
|
30326
|
+
"kind": "field",
|
|
30327
|
+
"name": "checkInProgress",
|
|
30328
|
+
"type": {
|
|
30329
|
+
"text": "boolean"
|
|
30330
|
+
},
|
|
30331
|
+
"privacy": "private",
|
|
30332
|
+
"default": "false",
|
|
30333
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
30334
|
+
"inheritedFrom": {
|
|
30335
|
+
"name": "HelixFormElement",
|
|
30336
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
30337
|
+
}
|
|
30338
|
+
},
|
|
29859
30339
|
{
|
|
29860
30340
|
"kind": "method",
|
|
29861
30341
|
"name": "reportValidity",
|
|
@@ -30338,21 +30818,6 @@
|
|
|
30338
30818
|
"name": "HelixElement",
|
|
30339
30819
|
"module": "src/helix-element/helix-element.ts"
|
|
30340
30820
|
}
|
|
30341
|
-
},
|
|
30342
|
-
{
|
|
30343
|
-
"kind": "method",
|
|
30344
|
-
"name": "performUpdate",
|
|
30345
|
-
"privacy": "protected",
|
|
30346
|
-
"return": {
|
|
30347
|
-
"type": {
|
|
30348
|
-
"text": "void"
|
|
30349
|
-
}
|
|
30350
|
-
},
|
|
30351
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
30352
|
-
"inheritedFrom": {
|
|
30353
|
-
"name": "HelixElement",
|
|
30354
|
-
"module": "src/helix-element/helix-element.ts"
|
|
30355
|
-
}
|
|
30356
30821
|
}
|
|
30357
30822
|
],
|
|
30358
30823
|
"events": [
|
|
@@ -34414,7 +34879,7 @@
|
|
|
34414
34879
|
},
|
|
34415
34880
|
"privacy": "private",
|
|
34416
34881
|
"default": "false",
|
|
34417
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
34882
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
34418
34883
|
"inheritedFrom": {
|
|
34419
34884
|
"name": "MixinField",
|
|
34420
34885
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -34854,6 +35319,50 @@
|
|
|
34854
35319
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
34855
35320
|
}
|
|
34856
35321
|
},
|
|
35322
|
+
{
|
|
35323
|
+
"kind": "field",
|
|
35324
|
+
"name": "updateRunning",
|
|
35325
|
+
"type": {
|
|
35326
|
+
"text": "boolean"
|
|
35327
|
+
},
|
|
35328
|
+
"privacy": "private",
|
|
35329
|
+
"default": "false",
|
|
35330
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
35331
|
+
"inheritedFrom": {
|
|
35332
|
+
"name": "HelixFormElement",
|
|
35333
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
35334
|
+
}
|
|
35335
|
+
},
|
|
35336
|
+
{
|
|
35337
|
+
"kind": "method",
|
|
35338
|
+
"name": "performUpdate",
|
|
35339
|
+
"privacy": "protected",
|
|
35340
|
+
"return": {
|
|
35341
|
+
"type": {
|
|
35342
|
+
"text": "void"
|
|
35343
|
+
}
|
|
35344
|
+
},
|
|
35345
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
35346
|
+
"inheritedFrom": {
|
|
35347
|
+
"name": "HelixElement",
|
|
35348
|
+
"module": "src/helix-element/helix-element.ts"
|
|
35349
|
+
}
|
|
35350
|
+
},
|
|
35351
|
+
{
|
|
35352
|
+
"kind": "method",
|
|
35353
|
+
"name": "runPendingUpdate",
|
|
35354
|
+
"privacy": "private",
|
|
35355
|
+
"return": {
|
|
35356
|
+
"type": {
|
|
35357
|
+
"text": "void"
|
|
35358
|
+
}
|
|
35359
|
+
},
|
|
35360
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
35361
|
+
"inheritedFrom": {
|
|
35362
|
+
"name": "HelixFormElement",
|
|
35363
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
35364
|
+
}
|
|
35365
|
+
},
|
|
34857
35366
|
{
|
|
34858
35367
|
"kind": "field",
|
|
34859
35368
|
"name": "willValidate",
|
|
@@ -34875,7 +35384,7 @@
|
|
|
34875
35384
|
"text": "boolean"
|
|
34876
35385
|
}
|
|
34877
35386
|
},
|
|
34878
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
35387
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
34879
35388
|
"inheritedFrom": {
|
|
34880
35389
|
"name": "HelixFormElement",
|
|
34881
35390
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -34884,6 +35393,20 @@
|
|
|
34884
35393
|
"text": "checkValidity() => boolean"
|
|
34885
35394
|
}
|
|
34886
35395
|
},
|
|
35396
|
+
{
|
|
35397
|
+
"kind": "field",
|
|
35398
|
+
"name": "checkInProgress",
|
|
35399
|
+
"type": {
|
|
35400
|
+
"text": "boolean"
|
|
35401
|
+
},
|
|
35402
|
+
"privacy": "private",
|
|
35403
|
+
"default": "false",
|
|
35404
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
35405
|
+
"inheritedFrom": {
|
|
35406
|
+
"name": "HelixFormElement",
|
|
35407
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
35408
|
+
}
|
|
35409
|
+
},
|
|
34887
35410
|
{
|
|
34888
35411
|
"kind": "method",
|
|
34889
35412
|
"name": "reportValidity",
|
|
@@ -35340,21 +35863,6 @@
|
|
|
35340
35863
|
"name": "HelixElement",
|
|
35341
35864
|
"module": "src/helix-element/helix-element.ts"
|
|
35342
35865
|
}
|
|
35343
|
-
},
|
|
35344
|
-
{
|
|
35345
|
-
"kind": "method",
|
|
35346
|
-
"name": "performUpdate",
|
|
35347
|
-
"privacy": "protected",
|
|
35348
|
-
"return": {
|
|
35349
|
-
"type": {
|
|
35350
|
-
"text": "void"
|
|
35351
|
-
}
|
|
35352
|
-
},
|
|
35353
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
35354
|
-
"inheritedFrom": {
|
|
35355
|
-
"name": "HelixElement",
|
|
35356
|
-
"module": "src/helix-element/helix-element.ts"
|
|
35357
|
-
}
|
|
35358
35866
|
}
|
|
35359
35867
|
],
|
|
35360
35868
|
"events": [
|
|
@@ -37526,6 +38034,50 @@
|
|
|
37526
38034
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
37527
38035
|
}
|
|
37528
38036
|
},
|
|
38037
|
+
{
|
|
38038
|
+
"kind": "field",
|
|
38039
|
+
"name": "updateRunning",
|
|
38040
|
+
"type": {
|
|
38041
|
+
"text": "boolean"
|
|
38042
|
+
},
|
|
38043
|
+
"privacy": "private",
|
|
38044
|
+
"default": "false",
|
|
38045
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
38046
|
+
"inheritedFrom": {
|
|
38047
|
+
"name": "HelixFormElement",
|
|
38048
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
38049
|
+
}
|
|
38050
|
+
},
|
|
38051
|
+
{
|
|
38052
|
+
"kind": "method",
|
|
38053
|
+
"name": "performUpdate",
|
|
38054
|
+
"privacy": "protected",
|
|
38055
|
+
"return": {
|
|
38056
|
+
"type": {
|
|
38057
|
+
"text": "void"
|
|
38058
|
+
}
|
|
38059
|
+
},
|
|
38060
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
38061
|
+
"inheritedFrom": {
|
|
38062
|
+
"name": "HelixElement",
|
|
38063
|
+
"module": "src/helix-element/helix-element.ts"
|
|
38064
|
+
}
|
|
38065
|
+
},
|
|
38066
|
+
{
|
|
38067
|
+
"kind": "method",
|
|
38068
|
+
"name": "runPendingUpdate",
|
|
38069
|
+
"privacy": "private",
|
|
38070
|
+
"return": {
|
|
38071
|
+
"type": {
|
|
38072
|
+
"text": "void"
|
|
38073
|
+
}
|
|
38074
|
+
},
|
|
38075
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
38076
|
+
"inheritedFrom": {
|
|
38077
|
+
"name": "HelixFormElement",
|
|
38078
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
38079
|
+
}
|
|
38080
|
+
},
|
|
37529
38081
|
{
|
|
37530
38082
|
"kind": "field",
|
|
37531
38083
|
"name": "willValidate",
|
|
@@ -37547,7 +38099,7 @@
|
|
|
37547
38099
|
"text": "boolean"
|
|
37548
38100
|
}
|
|
37549
38101
|
},
|
|
37550
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
38102
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
37551
38103
|
"inheritedFrom": {
|
|
37552
38104
|
"name": "HelixFormElement",
|
|
37553
38105
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -37556,6 +38108,20 @@
|
|
|
37556
38108
|
"text": "checkValidity() => boolean"
|
|
37557
38109
|
}
|
|
37558
38110
|
},
|
|
38111
|
+
{
|
|
38112
|
+
"kind": "field",
|
|
38113
|
+
"name": "checkInProgress",
|
|
38114
|
+
"type": {
|
|
38115
|
+
"text": "boolean"
|
|
38116
|
+
},
|
|
38117
|
+
"privacy": "private",
|
|
38118
|
+
"default": "false",
|
|
38119
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
38120
|
+
"inheritedFrom": {
|
|
38121
|
+
"name": "HelixFormElement",
|
|
38122
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
38123
|
+
}
|
|
38124
|
+
},
|
|
37559
38125
|
{
|
|
37560
38126
|
"kind": "method",
|
|
37561
38127
|
"name": "reportValidity",
|
|
@@ -38012,21 +38578,6 @@
|
|
|
38012
38578
|
"name": "HelixElement",
|
|
38013
38579
|
"module": "src/helix-element/helix-element.ts"
|
|
38014
38580
|
}
|
|
38015
|
-
},
|
|
38016
|
-
{
|
|
38017
|
-
"kind": "method",
|
|
38018
|
-
"name": "performUpdate",
|
|
38019
|
-
"privacy": "protected",
|
|
38020
|
-
"return": {
|
|
38021
|
-
"type": {
|
|
38022
|
-
"text": "void"
|
|
38023
|
-
}
|
|
38024
|
-
},
|
|
38025
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
38026
|
-
"inheritedFrom": {
|
|
38027
|
-
"name": "HelixElement",
|
|
38028
|
-
"module": "src/helix-element/helix-element.ts"
|
|
38029
|
-
}
|
|
38030
38581
|
}
|
|
38031
38582
|
],
|
|
38032
38583
|
"events": [
|
|
@@ -39756,7 +40307,7 @@
|
|
|
39756
40307
|
"text": "TemplateResult"
|
|
39757
40308
|
}
|
|
39758
40309
|
},
|
|
39759
|
-
"description": "The caret saying the field opens, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding. Those answer different people: the\nslot is for the page and the method is for whoever is building the styled\nlayer, and a fallback with only the first is one a tier can restyle and\ncannot change."
|
|
40310
|
+
"description": "The caret saying the field opens, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding. Those answer different people: the\nslot is for the page and the method is for whoever is building the styled\nlayer, and a fallback with only the first is one a tier can restyle and\ncannot change.\n\n**One em square by its own attributes**, which any stylesheet overrides.\nAn inline `<svg>` with a `viewBox` and no size fills the width it is given:\nmeasured with no stylesheet, the caret was 1,264px tall, the field 1,289px,\nand the panel opened above the top of the page."
|
|
39760
40311
|
},
|
|
39761
40312
|
{
|
|
39762
40313
|
"kind": "method",
|
|
@@ -40426,7 +40977,7 @@
|
|
|
40426
40977
|
},
|
|
40427
40978
|
"privacy": "private",
|
|
40428
40979
|
"default": "false",
|
|
40429
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
40980
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
40430
40981
|
"inheritedFrom": {
|
|
40431
40982
|
"name": "MixinField",
|
|
40432
40983
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -40866,6 +41417,50 @@
|
|
|
40866
41417
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
40867
41418
|
}
|
|
40868
41419
|
},
|
|
41420
|
+
{
|
|
41421
|
+
"kind": "field",
|
|
41422
|
+
"name": "updateRunning",
|
|
41423
|
+
"type": {
|
|
41424
|
+
"text": "boolean"
|
|
41425
|
+
},
|
|
41426
|
+
"privacy": "private",
|
|
41427
|
+
"default": "false",
|
|
41428
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
41429
|
+
"inheritedFrom": {
|
|
41430
|
+
"name": "HelixFormElement",
|
|
41431
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
41432
|
+
}
|
|
41433
|
+
},
|
|
41434
|
+
{
|
|
41435
|
+
"kind": "method",
|
|
41436
|
+
"name": "performUpdate",
|
|
41437
|
+
"privacy": "protected",
|
|
41438
|
+
"return": {
|
|
41439
|
+
"type": {
|
|
41440
|
+
"text": "void"
|
|
41441
|
+
}
|
|
41442
|
+
},
|
|
41443
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
41444
|
+
"inheritedFrom": {
|
|
41445
|
+
"name": "HelixElement",
|
|
41446
|
+
"module": "src/helix-element/helix-element.ts"
|
|
41447
|
+
}
|
|
41448
|
+
},
|
|
41449
|
+
{
|
|
41450
|
+
"kind": "method",
|
|
41451
|
+
"name": "runPendingUpdate",
|
|
41452
|
+
"privacy": "private",
|
|
41453
|
+
"return": {
|
|
41454
|
+
"type": {
|
|
41455
|
+
"text": "void"
|
|
41456
|
+
}
|
|
41457
|
+
},
|
|
41458
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
41459
|
+
"inheritedFrom": {
|
|
41460
|
+
"name": "HelixFormElement",
|
|
41461
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
41462
|
+
}
|
|
41463
|
+
},
|
|
40869
41464
|
{
|
|
40870
41465
|
"kind": "field",
|
|
40871
41466
|
"name": "willValidate",
|
|
@@ -40887,7 +41482,7 @@
|
|
|
40887
41482
|
"text": "boolean"
|
|
40888
41483
|
}
|
|
40889
41484
|
},
|
|
40890
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
41485
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
40891
41486
|
"inheritedFrom": {
|
|
40892
41487
|
"name": "HelixFormElement",
|
|
40893
41488
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -40896,6 +41491,20 @@
|
|
|
40896
41491
|
"text": "checkValidity() => boolean"
|
|
40897
41492
|
}
|
|
40898
41493
|
},
|
|
41494
|
+
{
|
|
41495
|
+
"kind": "field",
|
|
41496
|
+
"name": "checkInProgress",
|
|
41497
|
+
"type": {
|
|
41498
|
+
"text": "boolean"
|
|
41499
|
+
},
|
|
41500
|
+
"privacy": "private",
|
|
41501
|
+
"default": "false",
|
|
41502
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
41503
|
+
"inheritedFrom": {
|
|
41504
|
+
"name": "HelixFormElement",
|
|
41505
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
41506
|
+
}
|
|
41507
|
+
},
|
|
40899
41508
|
{
|
|
40900
41509
|
"kind": "method",
|
|
40901
41510
|
"name": "reportValidity",
|
|
@@ -41364,21 +41973,6 @@
|
|
|
41364
41973
|
"name": "HelixElement",
|
|
41365
41974
|
"module": "src/helix-element/helix-element.ts"
|
|
41366
41975
|
}
|
|
41367
|
-
},
|
|
41368
|
-
{
|
|
41369
|
-
"kind": "method",
|
|
41370
|
-
"name": "performUpdate",
|
|
41371
|
-
"privacy": "protected",
|
|
41372
|
-
"return": {
|
|
41373
|
-
"type": {
|
|
41374
|
-
"text": "void"
|
|
41375
|
-
}
|
|
41376
|
-
},
|
|
41377
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
41378
|
-
"inheritedFrom": {
|
|
41379
|
-
"name": "HelixElement",
|
|
41380
|
-
"module": "src/helix-element/helix-element.ts"
|
|
41381
|
-
}
|
|
41382
41976
|
}
|
|
41383
41977
|
],
|
|
41384
41978
|
"events": [
|
|
@@ -44221,6 +44815,50 @@
|
|
|
44221
44815
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
44222
44816
|
}
|
|
44223
44817
|
},
|
|
44818
|
+
{
|
|
44819
|
+
"kind": "field",
|
|
44820
|
+
"name": "updateRunning",
|
|
44821
|
+
"type": {
|
|
44822
|
+
"text": "boolean"
|
|
44823
|
+
},
|
|
44824
|
+
"privacy": "private",
|
|
44825
|
+
"default": "false",
|
|
44826
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
44827
|
+
"inheritedFrom": {
|
|
44828
|
+
"name": "HelixFormElement",
|
|
44829
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
44830
|
+
}
|
|
44831
|
+
},
|
|
44832
|
+
{
|
|
44833
|
+
"kind": "method",
|
|
44834
|
+
"name": "performUpdate",
|
|
44835
|
+
"privacy": "protected",
|
|
44836
|
+
"return": {
|
|
44837
|
+
"type": {
|
|
44838
|
+
"text": "void"
|
|
44839
|
+
}
|
|
44840
|
+
},
|
|
44841
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
44842
|
+
"inheritedFrom": {
|
|
44843
|
+
"name": "HelixElement",
|
|
44844
|
+
"module": "src/helix-element/helix-element.ts"
|
|
44845
|
+
}
|
|
44846
|
+
},
|
|
44847
|
+
{
|
|
44848
|
+
"kind": "method",
|
|
44849
|
+
"name": "runPendingUpdate",
|
|
44850
|
+
"privacy": "private",
|
|
44851
|
+
"return": {
|
|
44852
|
+
"type": {
|
|
44853
|
+
"text": "void"
|
|
44854
|
+
}
|
|
44855
|
+
},
|
|
44856
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
44857
|
+
"inheritedFrom": {
|
|
44858
|
+
"name": "HelixFormElement",
|
|
44859
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
44860
|
+
}
|
|
44861
|
+
},
|
|
44224
44862
|
{
|
|
44225
44863
|
"kind": "field",
|
|
44226
44864
|
"name": "willValidate",
|
|
@@ -44242,7 +44880,7 @@
|
|
|
44242
44880
|
"text": "boolean"
|
|
44243
44881
|
}
|
|
44244
44882
|
},
|
|
44245
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
44883
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
44246
44884
|
"inheritedFrom": {
|
|
44247
44885
|
"name": "HelixFormElement",
|
|
44248
44886
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -44251,6 +44889,20 @@
|
|
|
44251
44889
|
"text": "checkValidity() => boolean"
|
|
44252
44890
|
}
|
|
44253
44891
|
},
|
|
44892
|
+
{
|
|
44893
|
+
"kind": "field",
|
|
44894
|
+
"name": "checkInProgress",
|
|
44895
|
+
"type": {
|
|
44896
|
+
"text": "boolean"
|
|
44897
|
+
},
|
|
44898
|
+
"privacy": "private",
|
|
44899
|
+
"default": "false",
|
|
44900
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
44901
|
+
"inheritedFrom": {
|
|
44902
|
+
"name": "HelixFormElement",
|
|
44903
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
44904
|
+
}
|
|
44905
|
+
},
|
|
44254
44906
|
{
|
|
44255
44907
|
"kind": "method",
|
|
44256
44908
|
"name": "reportValidity",
|
|
@@ -44733,21 +45385,6 @@
|
|
|
44733
45385
|
"name": "HelixElement",
|
|
44734
45386
|
"module": "src/helix-element/helix-element.ts"
|
|
44735
45387
|
}
|
|
44736
|
-
},
|
|
44737
|
-
{
|
|
44738
|
-
"kind": "method",
|
|
44739
|
-
"name": "performUpdate",
|
|
44740
|
-
"privacy": "protected",
|
|
44741
|
-
"return": {
|
|
44742
|
-
"type": {
|
|
44743
|
-
"text": "void"
|
|
44744
|
-
}
|
|
44745
|
-
},
|
|
44746
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
44747
|
-
"inheritedFrom": {
|
|
44748
|
-
"name": "HelixElement",
|
|
44749
|
-
"module": "src/helix-element/helix-element.ts"
|
|
44750
|
-
}
|
|
44751
45388
|
}
|
|
44752
45389
|
],
|
|
44753
45390
|
"events": [
|
|
@@ -49191,7 +49828,7 @@
|
|
|
49191
49828
|
"declarations": [
|
|
49192
49829
|
{
|
|
49193
49830
|
"kind": "class",
|
|
49194
|
-
"description": "The calendar is `DatePicker`, which handles months, ranges, disabled days,\nthe first day of the week, and the grid's keyboard behavior. The date input\nadds the field, the overlay, and the connection between them.\n\nYou can type a date as well as pick one. The native `<input type=\"date\">`\ngives a picker and locale formatting but allows almost no styling, so the\nfield is a text field. Typing sends `input` on each keystroke and `change`\nwhen you leave the field, as a text field does. A date picked from the\ncalendar sends both. The field reads ISO, `2026-08-04`, and a date written\nin the order, the digits, and the month names of `locale`, `8/4/2026` or\n`Aug 4, 2026` in `en-US` and `4.8.2026` in `de-DE`, which becomes the value\nas you leave the field.\n\nThe trigger and ArrowDown open the calendar with focus on the selected day,\nTab moves between the calendar's controls without leaving it, and Escape\ncloses it and returns focus to the field. A press into the field opens the\ncalendar too. Tab into the field opens nothing, and Tab out of the field\ncloses the calendar. The text field is a `combobox` with\n`aria-haspopup=\"dialog\"`, `aria-expanded`, and `aria-controls`, as in the\nAPG date picker combobox, since Down opens the calendar from it.\n\nWith `segmented`, the field is a row of segments in place of the text: a\nmonth, a day and a year in the order the locale writes them, each set with\ndigits or the arrow keys. Alt+Down opens the calendar from a segment. A\n`range` is two rows with a dash between them, the start and the end, as\nReact Aria's DateRangePicker draws them, and `multiple` keeps the text.\n\nText that is not a date gives the form an empty value, as a native date\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the calendar with focus on the chosen day. |\n| Alt with Down | Opens the calendar, from the text field or a segment. |\n| Enter | In the text field, takes the typed date and submits the form, as a native field does. |\n| Escape | Closes the calendar and puts focus back in the field. |\n| Tab | In the open calendar, moves between its controls. Out of the field, closes it. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: a week of days, two months, or five years. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| Backspace, Delete on a segment |
|
|
49831
|
+
"description": "The calendar is `DatePicker`, which handles months, ranges, disabled days,\nthe first day of the week, and the grid's keyboard behavior. The date input\nadds the field, the overlay, and the connection between them.\n\nYou can type a date as well as pick one. The native `<input type=\"date\">`\ngives a picker and locale formatting but allows almost no styling, so the\nfield is a text field. Typing sends `input` on each keystroke and `change`\nwhen you leave the field, as a text field does. A date picked from the\ncalendar sends both. The field reads ISO, `2026-08-04`, and a date written\nin the order, the digits, and the month names of `locale`, `8/4/2026` or\n`Aug 4, 2026` in `en-US` and `4.8.2026` in `de-DE`, which becomes the value\nas you leave the field.\n\nThe trigger and ArrowDown open the calendar with focus on the selected day,\nTab moves between the calendar's controls without leaving it, and Escape\ncloses it and returns focus to the field. A press into the field opens the\ncalendar too. Tab into the field opens nothing, and Tab out of the field\ncloses the calendar. The text field is a `combobox` with\n`aria-haspopup=\"dialog\"`, `aria-expanded`, and `aria-controls`, as in the\nAPG date picker combobox, since Down opens the calendar from it.\n\nWith `segmented`, the field is a row of segments in place of the text: a\nmonth, a day and a year in the order the locale writes them, each set with\ndigits or the arrow keys. Alt+Down opens the calendar from a segment. A\n`range` is two rows with a dash between them, the start and the end, as\nReact Aria's DateRangePicker draws them, and `multiple` keeps the text.\n\nText that is not a date gives the form an empty value, as a native date\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the calendar with focus on the chosen day. |\n| Alt with Down | Opens the calendar, from the text field or a segment. |\n| Enter | In the text field, takes the typed date and submits the form, as a native field does. |\n| Escape | Closes the calendar and puts focus back in the field. |\n| Tab | In the open calendar, moves between its controls. Out of the field, closes it. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: a week of days, two months, or five years. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| Backspace, Delete on a segment | Take off its last digit, or move to the segment before where it is empty. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the calendar, the keys are `DatePicker`'s: the arrows move by a day or a\nweek, Page Up and Page Down by a month, with Shift by a year, and Home and\nEnd to the start and the end of the week.",
|
|
49195
49832
|
"name": "HelixHeadlessDateInput",
|
|
49196
49833
|
"cssParts": [
|
|
49197
49834
|
{
|
|
@@ -50743,6 +51380,29 @@
|
|
|
50743
51380
|
"module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
|
|
50744
51381
|
}
|
|
50745
51382
|
},
|
|
51383
|
+
{
|
|
51384
|
+
"kind": "method",
|
|
51385
|
+
"name": "erase",
|
|
51386
|
+
"privacy": "private",
|
|
51387
|
+
"return": {
|
|
51388
|
+
"type": {
|
|
51389
|
+
"text": "void"
|
|
51390
|
+
}
|
|
51391
|
+
},
|
|
51392
|
+
"parameters": [
|
|
51393
|
+
{
|
|
51394
|
+
"name": "element",
|
|
51395
|
+
"type": {
|
|
51396
|
+
"text": "HTMLElement"
|
|
51397
|
+
}
|
|
51398
|
+
}
|
|
51399
|
+
],
|
|
51400
|
+
"description": "Takes the last digit off the segment, or moves to the segment before it\nwhere this one is already empty, as React Aria's segments do. A reader\nclearing a date from its end holds Backspace and it empties right to\nleft.",
|
|
51401
|
+
"inheritedFrom": {
|
|
51402
|
+
"name": "MixinSegmentedField",
|
|
51403
|
+
"module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
|
|
51404
|
+
}
|
|
51405
|
+
},
|
|
50746
51406
|
{
|
|
50747
51407
|
"kind": "field",
|
|
50748
51408
|
"name": "composing",
|
|
@@ -51867,7 +52527,7 @@
|
|
|
51867
52527
|
},
|
|
51868
52528
|
"privacy": "private",
|
|
51869
52529
|
"default": "false",
|
|
51870
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
52530
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
51871
52531
|
"inheritedFrom": {
|
|
51872
52532
|
"name": "MixinField",
|
|
51873
52533
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -52307,6 +52967,50 @@
|
|
|
52307
52967
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
52308
52968
|
}
|
|
52309
52969
|
},
|
|
52970
|
+
{
|
|
52971
|
+
"kind": "field",
|
|
52972
|
+
"name": "updateRunning",
|
|
52973
|
+
"type": {
|
|
52974
|
+
"text": "boolean"
|
|
52975
|
+
},
|
|
52976
|
+
"privacy": "private",
|
|
52977
|
+
"default": "false",
|
|
52978
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
52979
|
+
"inheritedFrom": {
|
|
52980
|
+
"name": "HelixFormElement",
|
|
52981
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
52982
|
+
}
|
|
52983
|
+
},
|
|
52984
|
+
{
|
|
52985
|
+
"kind": "method",
|
|
52986
|
+
"name": "performUpdate",
|
|
52987
|
+
"privacy": "protected",
|
|
52988
|
+
"return": {
|
|
52989
|
+
"type": {
|
|
52990
|
+
"text": "void"
|
|
52991
|
+
}
|
|
52992
|
+
},
|
|
52993
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
52994
|
+
"inheritedFrom": {
|
|
52995
|
+
"name": "HelixElement",
|
|
52996
|
+
"module": "src/helix-element/helix-element.ts"
|
|
52997
|
+
}
|
|
52998
|
+
},
|
|
52999
|
+
{
|
|
53000
|
+
"kind": "method",
|
|
53001
|
+
"name": "runPendingUpdate",
|
|
53002
|
+
"privacy": "private",
|
|
53003
|
+
"return": {
|
|
53004
|
+
"type": {
|
|
53005
|
+
"text": "void"
|
|
53006
|
+
}
|
|
53007
|
+
},
|
|
53008
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
53009
|
+
"inheritedFrom": {
|
|
53010
|
+
"name": "HelixFormElement",
|
|
53011
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
53012
|
+
}
|
|
53013
|
+
},
|
|
52310
53014
|
{
|
|
52311
53015
|
"kind": "field",
|
|
52312
53016
|
"name": "willValidate",
|
|
@@ -52328,7 +53032,7 @@
|
|
|
52328
53032
|
"text": "boolean"
|
|
52329
53033
|
}
|
|
52330
53034
|
},
|
|
52331
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
53035
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
52332
53036
|
"inheritedFrom": {
|
|
52333
53037
|
"name": "HelixFormElement",
|
|
52334
53038
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -52337,6 +53041,20 @@
|
|
|
52337
53041
|
"text": "checkValidity() => boolean"
|
|
52338
53042
|
}
|
|
52339
53043
|
},
|
|
53044
|
+
{
|
|
53045
|
+
"kind": "field",
|
|
53046
|
+
"name": "checkInProgress",
|
|
53047
|
+
"type": {
|
|
53048
|
+
"text": "boolean"
|
|
53049
|
+
},
|
|
53050
|
+
"privacy": "private",
|
|
53051
|
+
"default": "false",
|
|
53052
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
53053
|
+
"inheritedFrom": {
|
|
53054
|
+
"name": "HelixFormElement",
|
|
53055
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
53056
|
+
}
|
|
53057
|
+
},
|
|
52340
53058
|
{
|
|
52341
53059
|
"kind": "method",
|
|
52342
53060
|
"name": "reportValidity",
|
|
@@ -52793,21 +53511,6 @@
|
|
|
52793
53511
|
"name": "HelixElement",
|
|
52794
53512
|
"module": "src/helix-element/helix-element.ts"
|
|
52795
53513
|
}
|
|
52796
|
-
},
|
|
52797
|
-
{
|
|
52798
|
-
"kind": "method",
|
|
52799
|
-
"name": "performUpdate",
|
|
52800
|
-
"privacy": "protected",
|
|
52801
|
-
"return": {
|
|
52802
|
-
"type": {
|
|
52803
|
-
"text": "void"
|
|
52804
|
-
}
|
|
52805
|
-
},
|
|
52806
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
52807
|
-
"inheritedFrom": {
|
|
52808
|
-
"name": "HelixElement",
|
|
52809
|
-
"module": "src/helix-element/helix-element.ts"
|
|
52810
|
-
}
|
|
52811
53514
|
}
|
|
52812
53515
|
],
|
|
52813
53516
|
"events": [
|
|
@@ -55453,6 +56156,50 @@
|
|
|
55453
56156
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
55454
56157
|
}
|
|
55455
56158
|
},
|
|
56159
|
+
{
|
|
56160
|
+
"kind": "field",
|
|
56161
|
+
"name": "updateRunning",
|
|
56162
|
+
"type": {
|
|
56163
|
+
"text": "boolean"
|
|
56164
|
+
},
|
|
56165
|
+
"privacy": "private",
|
|
56166
|
+
"default": "false",
|
|
56167
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
56168
|
+
"inheritedFrom": {
|
|
56169
|
+
"name": "HelixFormElement",
|
|
56170
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
56171
|
+
}
|
|
56172
|
+
},
|
|
56173
|
+
{
|
|
56174
|
+
"kind": "method",
|
|
56175
|
+
"name": "performUpdate",
|
|
56176
|
+
"privacy": "protected",
|
|
56177
|
+
"return": {
|
|
56178
|
+
"type": {
|
|
56179
|
+
"text": "void"
|
|
56180
|
+
}
|
|
56181
|
+
},
|
|
56182
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
56183
|
+
"inheritedFrom": {
|
|
56184
|
+
"name": "HelixElement",
|
|
56185
|
+
"module": "src/helix-element/helix-element.ts"
|
|
56186
|
+
}
|
|
56187
|
+
},
|
|
56188
|
+
{
|
|
56189
|
+
"kind": "method",
|
|
56190
|
+
"name": "runPendingUpdate",
|
|
56191
|
+
"privacy": "private",
|
|
56192
|
+
"return": {
|
|
56193
|
+
"type": {
|
|
56194
|
+
"text": "void"
|
|
56195
|
+
}
|
|
56196
|
+
},
|
|
56197
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
56198
|
+
"inheritedFrom": {
|
|
56199
|
+
"name": "HelixFormElement",
|
|
56200
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
56201
|
+
}
|
|
56202
|
+
},
|
|
55456
56203
|
{
|
|
55457
56204
|
"kind": "field",
|
|
55458
56205
|
"name": "willValidate",
|
|
@@ -55474,7 +56221,7 @@
|
|
|
55474
56221
|
"text": "boolean"
|
|
55475
56222
|
}
|
|
55476
56223
|
},
|
|
55477
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
56224
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
55478
56225
|
"inheritedFrom": {
|
|
55479
56226
|
"name": "HelixFormElement",
|
|
55480
56227
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -55483,6 +56230,20 @@
|
|
|
55483
56230
|
"text": "checkValidity() => boolean"
|
|
55484
56231
|
}
|
|
55485
56232
|
},
|
|
56233
|
+
{
|
|
56234
|
+
"kind": "field",
|
|
56235
|
+
"name": "checkInProgress",
|
|
56236
|
+
"type": {
|
|
56237
|
+
"text": "boolean"
|
|
56238
|
+
},
|
|
56239
|
+
"privacy": "private",
|
|
56240
|
+
"default": "false",
|
|
56241
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
56242
|
+
"inheritedFrom": {
|
|
56243
|
+
"name": "HelixFormElement",
|
|
56244
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
56245
|
+
}
|
|
56246
|
+
},
|
|
55486
56247
|
{
|
|
55487
56248
|
"kind": "method",
|
|
55488
56249
|
"name": "reportValidity",
|
|
@@ -55939,21 +56700,6 @@
|
|
|
55939
56700
|
"name": "HelixElement",
|
|
55940
56701
|
"module": "src/helix-element/helix-element.ts"
|
|
55941
56702
|
}
|
|
55942
|
-
},
|
|
55943
|
-
{
|
|
55944
|
-
"kind": "method",
|
|
55945
|
-
"name": "performUpdate",
|
|
55946
|
-
"privacy": "protected",
|
|
55947
|
-
"return": {
|
|
55948
|
-
"type": {
|
|
55949
|
-
"text": "void"
|
|
55950
|
-
}
|
|
55951
|
-
},
|
|
55952
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
55953
|
-
"inheritedFrom": {
|
|
55954
|
-
"name": "HelixElement",
|
|
55955
|
-
"module": "src/helix-element/helix-element.ts"
|
|
55956
|
-
}
|
|
55957
56703
|
}
|
|
55958
56704
|
],
|
|
55959
56705
|
"events": [
|
|
@@ -65112,7 +65858,7 @@
|
|
|
65112
65858
|
},
|
|
65113
65859
|
"privacy": "private",
|
|
65114
65860
|
"default": "false",
|
|
65115
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
65861
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
65116
65862
|
"inheritedFrom": {
|
|
65117
65863
|
"name": "MixinField",
|
|
65118
65864
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -65552,6 +66298,50 @@
|
|
|
65552
66298
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
65553
66299
|
}
|
|
65554
66300
|
},
|
|
66301
|
+
{
|
|
66302
|
+
"kind": "field",
|
|
66303
|
+
"name": "updateRunning",
|
|
66304
|
+
"type": {
|
|
66305
|
+
"text": "boolean"
|
|
66306
|
+
},
|
|
66307
|
+
"privacy": "private",
|
|
66308
|
+
"default": "false",
|
|
66309
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
66310
|
+
"inheritedFrom": {
|
|
66311
|
+
"name": "HelixFormElement",
|
|
66312
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
66313
|
+
}
|
|
66314
|
+
},
|
|
66315
|
+
{
|
|
66316
|
+
"kind": "method",
|
|
66317
|
+
"name": "performUpdate",
|
|
66318
|
+
"privacy": "protected",
|
|
66319
|
+
"return": {
|
|
66320
|
+
"type": {
|
|
66321
|
+
"text": "void"
|
|
66322
|
+
}
|
|
66323
|
+
},
|
|
66324
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
66325
|
+
"inheritedFrom": {
|
|
66326
|
+
"name": "HelixElement",
|
|
66327
|
+
"module": "src/helix-element/helix-element.ts"
|
|
66328
|
+
}
|
|
66329
|
+
},
|
|
66330
|
+
{
|
|
66331
|
+
"kind": "method",
|
|
66332
|
+
"name": "runPendingUpdate",
|
|
66333
|
+
"privacy": "private",
|
|
66334
|
+
"return": {
|
|
66335
|
+
"type": {
|
|
66336
|
+
"text": "void"
|
|
66337
|
+
}
|
|
66338
|
+
},
|
|
66339
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
66340
|
+
"inheritedFrom": {
|
|
66341
|
+
"name": "HelixFormElement",
|
|
66342
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
66343
|
+
}
|
|
66344
|
+
},
|
|
65555
66345
|
{
|
|
65556
66346
|
"kind": "field",
|
|
65557
66347
|
"name": "willValidate",
|
|
@@ -65573,7 +66363,7 @@
|
|
|
65573
66363
|
"text": "boolean"
|
|
65574
66364
|
}
|
|
65575
66365
|
},
|
|
65576
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
66366
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
65577
66367
|
"inheritedFrom": {
|
|
65578
66368
|
"name": "HelixFormElement",
|
|
65579
66369
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -65582,6 +66372,20 @@
|
|
|
65582
66372
|
"text": "checkValidity() => boolean"
|
|
65583
66373
|
}
|
|
65584
66374
|
},
|
|
66375
|
+
{
|
|
66376
|
+
"kind": "field",
|
|
66377
|
+
"name": "checkInProgress",
|
|
66378
|
+
"type": {
|
|
66379
|
+
"text": "boolean"
|
|
66380
|
+
},
|
|
66381
|
+
"privacy": "private",
|
|
66382
|
+
"default": "false",
|
|
66383
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
66384
|
+
"inheritedFrom": {
|
|
66385
|
+
"name": "HelixFormElement",
|
|
66386
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
66387
|
+
}
|
|
66388
|
+
},
|
|
65585
66389
|
{
|
|
65586
66390
|
"kind": "method",
|
|
65587
66391
|
"name": "reportValidity",
|
|
@@ -66038,21 +66842,6 @@
|
|
|
66038
66842
|
"name": "HelixElement",
|
|
66039
66843
|
"module": "src/helix-element/helix-element.ts"
|
|
66040
66844
|
}
|
|
66041
|
-
},
|
|
66042
|
-
{
|
|
66043
|
-
"kind": "method",
|
|
66044
|
-
"name": "performUpdate",
|
|
66045
|
-
"privacy": "protected",
|
|
66046
|
-
"return": {
|
|
66047
|
-
"type": {
|
|
66048
|
-
"text": "void"
|
|
66049
|
-
}
|
|
66050
|
-
},
|
|
66051
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
66052
|
-
"inheritedFrom": {
|
|
66053
|
-
"name": "HelixElement",
|
|
66054
|
-
"module": "src/helix-element/helix-element.ts"
|
|
66055
|
-
}
|
|
66056
66845
|
}
|
|
66057
66846
|
],
|
|
66058
66847
|
"events": [
|
|
@@ -70491,7 +71280,7 @@
|
|
|
70491
71280
|
},
|
|
70492
71281
|
"privacy": "private",
|
|
70493
71282
|
"default": "false",
|
|
70494
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
71283
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
70495
71284
|
"inheritedFrom": {
|
|
70496
71285
|
"name": "MixinField",
|
|
70497
71286
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -70931,6 +71720,50 @@
|
|
|
70931
71720
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
70932
71721
|
}
|
|
70933
71722
|
},
|
|
71723
|
+
{
|
|
71724
|
+
"kind": "field",
|
|
71725
|
+
"name": "updateRunning",
|
|
71726
|
+
"type": {
|
|
71727
|
+
"text": "boolean"
|
|
71728
|
+
},
|
|
71729
|
+
"privacy": "private",
|
|
71730
|
+
"default": "false",
|
|
71731
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
71732
|
+
"inheritedFrom": {
|
|
71733
|
+
"name": "HelixFormElement",
|
|
71734
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
71735
|
+
}
|
|
71736
|
+
},
|
|
71737
|
+
{
|
|
71738
|
+
"kind": "method",
|
|
71739
|
+
"name": "performUpdate",
|
|
71740
|
+
"privacy": "protected",
|
|
71741
|
+
"return": {
|
|
71742
|
+
"type": {
|
|
71743
|
+
"text": "void"
|
|
71744
|
+
}
|
|
71745
|
+
},
|
|
71746
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
71747
|
+
"inheritedFrom": {
|
|
71748
|
+
"name": "HelixElement",
|
|
71749
|
+
"module": "src/helix-element/helix-element.ts"
|
|
71750
|
+
}
|
|
71751
|
+
},
|
|
71752
|
+
{
|
|
71753
|
+
"kind": "method",
|
|
71754
|
+
"name": "runPendingUpdate",
|
|
71755
|
+
"privacy": "private",
|
|
71756
|
+
"return": {
|
|
71757
|
+
"type": {
|
|
71758
|
+
"text": "void"
|
|
71759
|
+
}
|
|
71760
|
+
},
|
|
71761
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
71762
|
+
"inheritedFrom": {
|
|
71763
|
+
"name": "HelixFormElement",
|
|
71764
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
71765
|
+
}
|
|
71766
|
+
},
|
|
70934
71767
|
{
|
|
70935
71768
|
"kind": "field",
|
|
70936
71769
|
"name": "willValidate",
|
|
@@ -70952,7 +71785,7 @@
|
|
|
70952
71785
|
"text": "boolean"
|
|
70953
71786
|
}
|
|
70954
71787
|
},
|
|
70955
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
71788
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
70956
71789
|
"inheritedFrom": {
|
|
70957
71790
|
"name": "HelixFormElement",
|
|
70958
71791
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -70961,6 +71794,20 @@
|
|
|
70961
71794
|
"text": "checkValidity() => boolean"
|
|
70962
71795
|
}
|
|
70963
71796
|
},
|
|
71797
|
+
{
|
|
71798
|
+
"kind": "field",
|
|
71799
|
+
"name": "checkInProgress",
|
|
71800
|
+
"type": {
|
|
71801
|
+
"text": "boolean"
|
|
71802
|
+
},
|
|
71803
|
+
"privacy": "private",
|
|
71804
|
+
"default": "false",
|
|
71805
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
71806
|
+
"inheritedFrom": {
|
|
71807
|
+
"name": "HelixFormElement",
|
|
71808
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
71809
|
+
}
|
|
71810
|
+
},
|
|
70964
71811
|
{
|
|
70965
71812
|
"kind": "method",
|
|
70966
71813
|
"name": "reportValidity",
|
|
@@ -71417,21 +72264,6 @@
|
|
|
71417
72264
|
"name": "HelixElement",
|
|
71418
72265
|
"module": "src/helix-element/helix-element.ts"
|
|
71419
72266
|
}
|
|
71420
|
-
},
|
|
71421
|
-
{
|
|
71422
|
-
"kind": "method",
|
|
71423
|
-
"name": "performUpdate",
|
|
71424
|
-
"privacy": "protected",
|
|
71425
|
-
"return": {
|
|
71426
|
-
"type": {
|
|
71427
|
-
"text": "void"
|
|
71428
|
-
}
|
|
71429
|
-
},
|
|
71430
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
71431
|
-
"inheritedFrom": {
|
|
71432
|
-
"name": "HelixElement",
|
|
71433
|
-
"module": "src/helix-element/helix-element.ts"
|
|
71434
|
-
}
|
|
71435
72267
|
}
|
|
71436
72268
|
],
|
|
71437
72269
|
"events": [
|
|
@@ -72173,10 +73005,10 @@
|
|
|
72173
73005
|
"kind": "field",
|
|
72174
73006
|
"name": "date",
|
|
72175
73007
|
"type": {
|
|
72176
|
-
"text": "string"
|
|
73008
|
+
"text": "Date | number | string"
|
|
72177
73009
|
},
|
|
72178
73010
|
"default": "''",
|
|
72179
|
-
"description": "The timestamp, in any
|
|
73011
|
+
"description": "The timestamp: a `Date`, milliseconds since the epoch, or a string in any\nformat `Date` can parse. The attribute is the string.\n\nAn ISO string is what an API sends and what `<time datetime>` takes, so it\nis the shape that needs no translation at either end. Left unset this\nrenders nothing rather than the epoch, which is what parsing an empty string\nwould give.\n\n**The element's own text is read as a fallback, and only in a browser.**\n`<helix-headless-format-date\nelapsed>2026-08-27T01:00:00Z</helix-headless-format-date>` is the spelling\nthat reads best in markup, and it cannot be the only one: measured against\nLit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see\nit. An element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
|
|
72180
73012
|
"attribute": "date"
|
|
72181
73013
|
},
|
|
72182
73014
|
{
|
|
@@ -72435,7 +73267,7 @@
|
|
|
72435
73267
|
"text": "string"
|
|
72436
73268
|
},
|
|
72437
73269
|
"privacy": "private",
|
|
72438
|
-
"description": "The timestamp as written, in the attribute or
|
|
73270
|
+
"description": "The timestamp as written, in the property, the attribute or the light DOM.\n\nA `Date` or a number is written as its ISO string, so it is read the way an\nattribute is. Measured before this: assigning `new Date()` threw, since\nonly a string has `trim`, where Shoelace and Web Awesome take a `Date`.",
|
|
72439
73271
|
"readonly": true
|
|
72440
73272
|
},
|
|
72441
73273
|
{
|
|
@@ -72846,10 +73678,10 @@
|
|
|
72846
73678
|
{
|
|
72847
73679
|
"name": "date",
|
|
72848
73680
|
"type": {
|
|
72849
|
-
"text": "string"
|
|
73681
|
+
"text": "Date | number | string"
|
|
72850
73682
|
},
|
|
72851
73683
|
"default": "''",
|
|
72852
|
-
"description": "The timestamp, in any
|
|
73684
|
+
"description": "The timestamp: a `Date`, milliseconds since the epoch, or a string in any\nformat `Date` can parse. The attribute is the string.\n\nAn ISO string is what an API sends and what `<time datetime>` takes, so it\nis the shape that needs no translation at either end. Left unset this\nrenders nothing rather than the epoch, which is what parsing an empty string\nwould give.\n\n**The element's own text is read as a fallback, and only in a browser.**\n`<helix-headless-format-date\nelapsed>2026-08-27T01:00:00Z</helix-headless-format-date>` is the spelling\nthat reads best in markup, and it cannot be the only one: measured against\nLit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see\nit. An element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
|
|
72853
73685
|
"fieldName": "date"
|
|
72854
73686
|
},
|
|
72855
73687
|
{
|
|
@@ -79102,6 +79934,50 @@
|
|
|
79102
79934
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
79103
79935
|
}
|
|
79104
79936
|
},
|
|
79937
|
+
{
|
|
79938
|
+
"kind": "field",
|
|
79939
|
+
"name": "updateRunning",
|
|
79940
|
+
"type": {
|
|
79941
|
+
"text": "boolean"
|
|
79942
|
+
},
|
|
79943
|
+
"privacy": "private",
|
|
79944
|
+
"default": "false",
|
|
79945
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
79946
|
+
"inheritedFrom": {
|
|
79947
|
+
"name": "HelixFormElement",
|
|
79948
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
79949
|
+
}
|
|
79950
|
+
},
|
|
79951
|
+
{
|
|
79952
|
+
"kind": "method",
|
|
79953
|
+
"name": "performUpdate",
|
|
79954
|
+
"privacy": "protected",
|
|
79955
|
+
"return": {
|
|
79956
|
+
"type": {
|
|
79957
|
+
"text": "void"
|
|
79958
|
+
}
|
|
79959
|
+
},
|
|
79960
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
79961
|
+
"inheritedFrom": {
|
|
79962
|
+
"name": "HelixElement",
|
|
79963
|
+
"module": "src/helix-element/helix-element.ts"
|
|
79964
|
+
}
|
|
79965
|
+
},
|
|
79966
|
+
{
|
|
79967
|
+
"kind": "method",
|
|
79968
|
+
"name": "runPendingUpdate",
|
|
79969
|
+
"privacy": "private",
|
|
79970
|
+
"return": {
|
|
79971
|
+
"type": {
|
|
79972
|
+
"text": "void"
|
|
79973
|
+
}
|
|
79974
|
+
},
|
|
79975
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
79976
|
+
"inheritedFrom": {
|
|
79977
|
+
"name": "HelixFormElement",
|
|
79978
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
79979
|
+
}
|
|
79980
|
+
},
|
|
79105
79981
|
{
|
|
79106
79982
|
"kind": "field",
|
|
79107
79983
|
"name": "willValidate",
|
|
@@ -79123,7 +79999,7 @@
|
|
|
79123
79999
|
"text": "boolean"
|
|
79124
80000
|
}
|
|
79125
80001
|
},
|
|
79126
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
80002
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
79127
80003
|
"inheritedFrom": {
|
|
79128
80004
|
"name": "HelixFormElement",
|
|
79129
80005
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -79132,6 +80008,20 @@
|
|
|
79132
80008
|
"text": "checkValidity() => boolean"
|
|
79133
80009
|
}
|
|
79134
80010
|
},
|
|
80011
|
+
{
|
|
80012
|
+
"kind": "field",
|
|
80013
|
+
"name": "checkInProgress",
|
|
80014
|
+
"type": {
|
|
80015
|
+
"text": "boolean"
|
|
80016
|
+
},
|
|
80017
|
+
"privacy": "private",
|
|
80018
|
+
"default": "false",
|
|
80019
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
80020
|
+
"inheritedFrom": {
|
|
80021
|
+
"name": "HelixFormElement",
|
|
80022
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
80023
|
+
}
|
|
80024
|
+
},
|
|
79135
80025
|
{
|
|
79136
80026
|
"kind": "method",
|
|
79137
80027
|
"name": "reportValidity",
|
|
@@ -79614,21 +80504,6 @@
|
|
|
79614
80504
|
"name": "HelixElement",
|
|
79615
80505
|
"module": "src/helix-element/helix-element.ts"
|
|
79616
80506
|
}
|
|
79617
|
-
},
|
|
79618
|
-
{
|
|
79619
|
-
"kind": "method",
|
|
79620
|
-
"name": "performUpdate",
|
|
79621
|
-
"privacy": "protected",
|
|
79622
|
-
"return": {
|
|
79623
|
-
"type": {
|
|
79624
|
-
"text": "void"
|
|
79625
|
-
}
|
|
79626
|
-
},
|
|
79627
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
79628
|
-
"inheritedFrom": {
|
|
79629
|
-
"name": "HelixElement",
|
|
79630
|
-
"module": "src/helix-element/helix-element.ts"
|
|
79631
|
-
}
|
|
79632
80507
|
}
|
|
79633
80508
|
],
|
|
79634
80509
|
"superclass": {
|
|
@@ -83495,7 +84370,7 @@
|
|
|
83495
84370
|
},
|
|
83496
84371
|
"privacy": "private",
|
|
83497
84372
|
"default": "false",
|
|
83498
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
84373
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
83499
84374
|
"inheritedFrom": {
|
|
83500
84375
|
"name": "MixinField",
|
|
83501
84376
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -83935,6 +84810,50 @@
|
|
|
83935
84810
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
83936
84811
|
}
|
|
83937
84812
|
},
|
|
84813
|
+
{
|
|
84814
|
+
"kind": "field",
|
|
84815
|
+
"name": "updateRunning",
|
|
84816
|
+
"type": {
|
|
84817
|
+
"text": "boolean"
|
|
84818
|
+
},
|
|
84819
|
+
"privacy": "private",
|
|
84820
|
+
"default": "false",
|
|
84821
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
84822
|
+
"inheritedFrom": {
|
|
84823
|
+
"name": "HelixFormElement",
|
|
84824
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
84825
|
+
}
|
|
84826
|
+
},
|
|
84827
|
+
{
|
|
84828
|
+
"kind": "method",
|
|
84829
|
+
"name": "performUpdate",
|
|
84830
|
+
"privacy": "protected",
|
|
84831
|
+
"return": {
|
|
84832
|
+
"type": {
|
|
84833
|
+
"text": "void"
|
|
84834
|
+
}
|
|
84835
|
+
},
|
|
84836
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
84837
|
+
"inheritedFrom": {
|
|
84838
|
+
"name": "HelixElement",
|
|
84839
|
+
"module": "src/helix-element/helix-element.ts"
|
|
84840
|
+
}
|
|
84841
|
+
},
|
|
84842
|
+
{
|
|
84843
|
+
"kind": "method",
|
|
84844
|
+
"name": "runPendingUpdate",
|
|
84845
|
+
"privacy": "private",
|
|
84846
|
+
"return": {
|
|
84847
|
+
"type": {
|
|
84848
|
+
"text": "void"
|
|
84849
|
+
}
|
|
84850
|
+
},
|
|
84851
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
84852
|
+
"inheritedFrom": {
|
|
84853
|
+
"name": "HelixFormElement",
|
|
84854
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
84855
|
+
}
|
|
84856
|
+
},
|
|
83938
84857
|
{
|
|
83939
84858
|
"kind": "field",
|
|
83940
84859
|
"name": "willValidate",
|
|
@@ -83956,7 +84875,7 @@
|
|
|
83956
84875
|
"text": "boolean"
|
|
83957
84876
|
}
|
|
83958
84877
|
},
|
|
83959
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
84878
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
83960
84879
|
"inheritedFrom": {
|
|
83961
84880
|
"name": "HelixFormElement",
|
|
83962
84881
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -83965,6 +84884,20 @@
|
|
|
83965
84884
|
"text": "checkValidity() => boolean"
|
|
83966
84885
|
}
|
|
83967
84886
|
},
|
|
84887
|
+
{
|
|
84888
|
+
"kind": "field",
|
|
84889
|
+
"name": "checkInProgress",
|
|
84890
|
+
"type": {
|
|
84891
|
+
"text": "boolean"
|
|
84892
|
+
},
|
|
84893
|
+
"privacy": "private",
|
|
84894
|
+
"default": "false",
|
|
84895
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
84896
|
+
"inheritedFrom": {
|
|
84897
|
+
"name": "HelixFormElement",
|
|
84898
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
84899
|
+
}
|
|
84900
|
+
},
|
|
83968
84901
|
{
|
|
83969
84902
|
"kind": "method",
|
|
83970
84903
|
"name": "reportValidity",
|
|
@@ -84421,21 +85354,6 @@
|
|
|
84421
85354
|
"name": "HelixElement",
|
|
84422
85355
|
"module": "src/helix-element/helix-element.ts"
|
|
84423
85356
|
}
|
|
84424
|
-
},
|
|
84425
|
-
{
|
|
84426
|
-
"kind": "method",
|
|
84427
|
-
"name": "performUpdate",
|
|
84428
|
-
"privacy": "protected",
|
|
84429
|
-
"return": {
|
|
84430
|
-
"type": {
|
|
84431
|
-
"text": "void"
|
|
84432
|
-
}
|
|
84433
|
-
},
|
|
84434
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
84435
|
-
"inheritedFrom": {
|
|
84436
|
-
"name": "HelixElement",
|
|
84437
|
-
"module": "src/helix-element/helix-element.ts"
|
|
84438
|
-
}
|
|
84439
85357
|
}
|
|
84440
85358
|
],
|
|
84441
85359
|
"events": [
|
|
@@ -94271,11 +95189,32 @@
|
|
|
94271
95189
|
"text": "void"
|
|
94272
95190
|
}
|
|
94273
95191
|
},
|
|
94274
|
-
"description": "Scrolls the chosen option to the middle of the list.\n\nA method rather than something this does on its own, because a listbox\nopening on its answer usually wants it merely *visible* and the browser\nalready manages that: centering is what a caller wants when the list is being\nread as a dial rather than scanned as a list, which is what Time Picker's\nwheels do with three of these.\n\nMeasured by core's `centerInView`, or, for a list of `items`, by the\narithmetic, since the chosen option may not be drawn.",
|
|
95192
|
+
"description": "Scrolls the chosen option to the middle of the list, or the highlighted one\nwhere nothing is chosen.\n\nA method rather than something this does on its own, because a listbox\nopening on its answer usually wants it merely *visible* and the browser\nalready manages that: centering is what a caller wants when the list is being\nread as a dial rather than scanned as a list, which is what Time Picker's\nwheels do with three of these.\n\nMeasured by core's `centerInView`, or, for a list of `items`, by the\narithmetic, since the chosen option may not be drawn.",
|
|
94275
95193
|
"type": {
|
|
94276
95194
|
"text": "reveal() => void"
|
|
94277
95195
|
}
|
|
94278
95196
|
},
|
|
95197
|
+
{
|
|
95198
|
+
"kind": "method",
|
|
95199
|
+
"name": "highlightValue",
|
|
95200
|
+
"return": {
|
|
95201
|
+
"type": {
|
|
95202
|
+
"text": "void"
|
|
95203
|
+
}
|
|
95204
|
+
},
|
|
95205
|
+
"parameters": [
|
|
95206
|
+
{
|
|
95207
|
+
"name": "value",
|
|
95208
|
+
"type": {
|
|
95209
|
+
"text": "string"
|
|
95210
|
+
}
|
|
95211
|
+
}
|
|
95212
|
+
],
|
|
95213
|
+
"description": "Puts the highlight on the option holding `value`, without choosing it, so\nthe arrow keys move from there. Nothing changes where no option a reader\ncan reach holds `value`.\n\nTime Picker calls it for a time between two of its steps, which no option\nholds: without it the first arrow moved from the top of the list, so Down\nfrom 14:07 went to midnight.",
|
|
95214
|
+
"type": {
|
|
95215
|
+
"text": "highlightValue(value: string) => void"
|
|
95216
|
+
}
|
|
95217
|
+
},
|
|
94279
95218
|
{
|
|
94280
95219
|
"kind": "method",
|
|
94281
95220
|
"name": "place",
|
|
@@ -95013,7 +95952,7 @@
|
|
|
95013
95952
|
},
|
|
95014
95953
|
"privacy": "private",
|
|
95015
95954
|
"default": "false",
|
|
95016
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
95955
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
95017
95956
|
"inheritedFrom": {
|
|
95018
95957
|
"name": "MixinField",
|
|
95019
95958
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -95453,6 +96392,50 @@
|
|
|
95453
96392
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
95454
96393
|
}
|
|
95455
96394
|
},
|
|
96395
|
+
{
|
|
96396
|
+
"kind": "field",
|
|
96397
|
+
"name": "updateRunning",
|
|
96398
|
+
"type": {
|
|
96399
|
+
"text": "boolean"
|
|
96400
|
+
},
|
|
96401
|
+
"privacy": "private",
|
|
96402
|
+
"default": "false",
|
|
96403
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
96404
|
+
"inheritedFrom": {
|
|
96405
|
+
"name": "HelixFormElement",
|
|
96406
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
96407
|
+
}
|
|
96408
|
+
},
|
|
96409
|
+
{
|
|
96410
|
+
"kind": "method",
|
|
96411
|
+
"name": "performUpdate",
|
|
96412
|
+
"privacy": "protected",
|
|
96413
|
+
"return": {
|
|
96414
|
+
"type": {
|
|
96415
|
+
"text": "void"
|
|
96416
|
+
}
|
|
96417
|
+
},
|
|
96418
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
96419
|
+
"inheritedFrom": {
|
|
96420
|
+
"name": "HelixElement",
|
|
96421
|
+
"module": "src/helix-element/helix-element.ts"
|
|
96422
|
+
}
|
|
96423
|
+
},
|
|
96424
|
+
{
|
|
96425
|
+
"kind": "method",
|
|
96426
|
+
"name": "runPendingUpdate",
|
|
96427
|
+
"privacy": "private",
|
|
96428
|
+
"return": {
|
|
96429
|
+
"type": {
|
|
96430
|
+
"text": "void"
|
|
96431
|
+
}
|
|
96432
|
+
},
|
|
96433
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
96434
|
+
"inheritedFrom": {
|
|
96435
|
+
"name": "HelixFormElement",
|
|
96436
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
96437
|
+
}
|
|
96438
|
+
},
|
|
95456
96439
|
{
|
|
95457
96440
|
"kind": "field",
|
|
95458
96441
|
"name": "willValidate",
|
|
@@ -95474,7 +96457,7 @@
|
|
|
95474
96457
|
"text": "boolean"
|
|
95475
96458
|
}
|
|
95476
96459
|
},
|
|
95477
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
96460
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
95478
96461
|
"inheritedFrom": {
|
|
95479
96462
|
"name": "HelixFormElement",
|
|
95480
96463
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -95483,6 +96466,20 @@
|
|
|
95483
96466
|
"text": "checkValidity() => boolean"
|
|
95484
96467
|
}
|
|
95485
96468
|
},
|
|
96469
|
+
{
|
|
96470
|
+
"kind": "field",
|
|
96471
|
+
"name": "checkInProgress",
|
|
96472
|
+
"type": {
|
|
96473
|
+
"text": "boolean"
|
|
96474
|
+
},
|
|
96475
|
+
"privacy": "private",
|
|
96476
|
+
"default": "false",
|
|
96477
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
96478
|
+
"inheritedFrom": {
|
|
96479
|
+
"name": "HelixFormElement",
|
|
96480
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
96481
|
+
}
|
|
96482
|
+
},
|
|
95486
96483
|
{
|
|
95487
96484
|
"kind": "method",
|
|
95488
96485
|
"name": "reportValidity",
|
|
@@ -95965,21 +96962,6 @@
|
|
|
95965
96962
|
"name": "HelixElement",
|
|
95966
96963
|
"module": "src/helix-element/helix-element.ts"
|
|
95967
96964
|
}
|
|
95968
|
-
},
|
|
95969
|
-
{
|
|
95970
|
-
"kind": "method",
|
|
95971
|
-
"name": "performUpdate",
|
|
95972
|
-
"privacy": "protected",
|
|
95973
|
-
"return": {
|
|
95974
|
-
"type": {
|
|
95975
|
-
"text": "void"
|
|
95976
|
-
}
|
|
95977
|
-
},
|
|
95978
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
95979
|
-
"inheritedFrom": {
|
|
95980
|
-
"name": "HelixElement",
|
|
95981
|
-
"module": "src/helix-element/helix-element.ts"
|
|
95982
|
-
}
|
|
95983
96965
|
}
|
|
95984
96966
|
],
|
|
95985
96967
|
"events": [
|
|
@@ -116901,7 +117883,7 @@
|
|
|
116901
117883
|
},
|
|
116902
117884
|
"privacy": "private",
|
|
116903
117885
|
"default": "false",
|
|
116904
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
117886
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
116905
117887
|
"inheritedFrom": {
|
|
116906
117888
|
"name": "MixinField",
|
|
116907
117889
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -117326,6 +118308,50 @@
|
|
|
117326
118308
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
117327
118309
|
}
|
|
117328
118310
|
},
|
|
118311
|
+
{
|
|
118312
|
+
"kind": "field",
|
|
118313
|
+
"name": "updateRunning",
|
|
118314
|
+
"type": {
|
|
118315
|
+
"text": "boolean"
|
|
118316
|
+
},
|
|
118317
|
+
"privacy": "private",
|
|
118318
|
+
"default": "false",
|
|
118319
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
118320
|
+
"inheritedFrom": {
|
|
118321
|
+
"name": "HelixFormElement",
|
|
118322
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
118323
|
+
}
|
|
118324
|
+
},
|
|
118325
|
+
{
|
|
118326
|
+
"kind": "method",
|
|
118327
|
+
"name": "performUpdate",
|
|
118328
|
+
"privacy": "protected",
|
|
118329
|
+
"return": {
|
|
118330
|
+
"type": {
|
|
118331
|
+
"text": "void"
|
|
118332
|
+
}
|
|
118333
|
+
},
|
|
118334
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
118335
|
+
"inheritedFrom": {
|
|
118336
|
+
"name": "HelixElement",
|
|
118337
|
+
"module": "src/helix-element/helix-element.ts"
|
|
118338
|
+
}
|
|
118339
|
+
},
|
|
118340
|
+
{
|
|
118341
|
+
"kind": "method",
|
|
118342
|
+
"name": "runPendingUpdate",
|
|
118343
|
+
"privacy": "private",
|
|
118344
|
+
"return": {
|
|
118345
|
+
"type": {
|
|
118346
|
+
"text": "void"
|
|
118347
|
+
}
|
|
118348
|
+
},
|
|
118349
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
118350
|
+
"inheritedFrom": {
|
|
118351
|
+
"name": "HelixFormElement",
|
|
118352
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
118353
|
+
}
|
|
118354
|
+
},
|
|
117329
118355
|
{
|
|
117330
118356
|
"kind": "field",
|
|
117331
118357
|
"name": "willValidate",
|
|
@@ -117347,7 +118373,7 @@
|
|
|
117347
118373
|
"text": "boolean"
|
|
117348
118374
|
}
|
|
117349
118375
|
},
|
|
117350
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
118376
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
117351
118377
|
"inheritedFrom": {
|
|
117352
118378
|
"name": "HelixFormElement",
|
|
117353
118379
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -117356,6 +118382,20 @@
|
|
|
117356
118382
|
"text": "checkValidity() => boolean"
|
|
117357
118383
|
}
|
|
117358
118384
|
},
|
|
118385
|
+
{
|
|
118386
|
+
"kind": "field",
|
|
118387
|
+
"name": "checkInProgress",
|
|
118388
|
+
"type": {
|
|
118389
|
+
"text": "boolean"
|
|
118390
|
+
},
|
|
118391
|
+
"privacy": "private",
|
|
118392
|
+
"default": "false",
|
|
118393
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
118394
|
+
"inheritedFrom": {
|
|
118395
|
+
"name": "HelixFormElement",
|
|
118396
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
118397
|
+
}
|
|
118398
|
+
},
|
|
117359
118399
|
{
|
|
117360
118400
|
"kind": "method",
|
|
117361
118401
|
"name": "reportValidity",
|
|
@@ -117812,21 +118852,6 @@
|
|
|
117812
118852
|
"name": "HelixElement",
|
|
117813
118853
|
"module": "src/helix-element/helix-element.ts"
|
|
117814
118854
|
}
|
|
117815
|
-
},
|
|
117816
|
-
{
|
|
117817
|
-
"kind": "method",
|
|
117818
|
-
"name": "performUpdate",
|
|
117819
|
-
"privacy": "protected",
|
|
117820
|
-
"return": {
|
|
117821
|
-
"type": {
|
|
117822
|
-
"text": "void"
|
|
117823
|
-
}
|
|
117824
|
-
},
|
|
117825
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
117826
|
-
"inheritedFrom": {
|
|
117827
|
-
"name": "HelixElement",
|
|
117828
|
-
"module": "src/helix-element/helix-element.ts"
|
|
117829
|
-
}
|
|
117830
118855
|
}
|
|
117831
118856
|
],
|
|
117832
118857
|
"events": [
|
|
@@ -124708,6 +125733,50 @@
|
|
|
124708
125733
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
124709
125734
|
}
|
|
124710
125735
|
},
|
|
125736
|
+
{
|
|
125737
|
+
"kind": "field",
|
|
125738
|
+
"name": "updateRunning",
|
|
125739
|
+
"type": {
|
|
125740
|
+
"text": "boolean"
|
|
125741
|
+
},
|
|
125742
|
+
"privacy": "private",
|
|
125743
|
+
"default": "false",
|
|
125744
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
125745
|
+
"inheritedFrom": {
|
|
125746
|
+
"name": "HelixFormElement",
|
|
125747
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
125748
|
+
}
|
|
125749
|
+
},
|
|
125750
|
+
{
|
|
125751
|
+
"kind": "method",
|
|
125752
|
+
"name": "performUpdate",
|
|
125753
|
+
"privacy": "protected",
|
|
125754
|
+
"return": {
|
|
125755
|
+
"type": {
|
|
125756
|
+
"text": "void"
|
|
125757
|
+
}
|
|
125758
|
+
},
|
|
125759
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
125760
|
+
"inheritedFrom": {
|
|
125761
|
+
"name": "HelixElement",
|
|
125762
|
+
"module": "src/helix-element/helix-element.ts"
|
|
125763
|
+
}
|
|
125764
|
+
},
|
|
125765
|
+
{
|
|
125766
|
+
"kind": "method",
|
|
125767
|
+
"name": "runPendingUpdate",
|
|
125768
|
+
"privacy": "private",
|
|
125769
|
+
"return": {
|
|
125770
|
+
"type": {
|
|
125771
|
+
"text": "void"
|
|
125772
|
+
}
|
|
125773
|
+
},
|
|
125774
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
125775
|
+
"inheritedFrom": {
|
|
125776
|
+
"name": "HelixFormElement",
|
|
125777
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
125778
|
+
}
|
|
125779
|
+
},
|
|
124711
125780
|
{
|
|
124712
125781
|
"kind": "field",
|
|
124713
125782
|
"name": "willValidate",
|
|
@@ -124729,7 +125798,7 @@
|
|
|
124729
125798
|
"text": "boolean"
|
|
124730
125799
|
}
|
|
124731
125800
|
},
|
|
124732
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
125801
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
124733
125802
|
"inheritedFrom": {
|
|
124734
125803
|
"name": "HelixFormElement",
|
|
124735
125804
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -124738,6 +125807,20 @@
|
|
|
124738
125807
|
"text": "checkValidity() => boolean"
|
|
124739
125808
|
}
|
|
124740
125809
|
},
|
|
125810
|
+
{
|
|
125811
|
+
"kind": "field",
|
|
125812
|
+
"name": "checkInProgress",
|
|
125813
|
+
"type": {
|
|
125814
|
+
"text": "boolean"
|
|
125815
|
+
},
|
|
125816
|
+
"privacy": "private",
|
|
125817
|
+
"default": "false",
|
|
125818
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
125819
|
+
"inheritedFrom": {
|
|
125820
|
+
"name": "HelixFormElement",
|
|
125821
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
125822
|
+
}
|
|
125823
|
+
},
|
|
124741
125824
|
{
|
|
124742
125825
|
"kind": "method",
|
|
124743
125826
|
"name": "reportValidity",
|
|
@@ -125220,21 +126303,6 @@
|
|
|
125220
126303
|
"name": "HelixElement",
|
|
125221
126304
|
"module": "src/helix-element/helix-element.ts"
|
|
125222
126305
|
}
|
|
125223
|
-
},
|
|
125224
|
-
{
|
|
125225
|
-
"kind": "method",
|
|
125226
|
-
"name": "performUpdate",
|
|
125227
|
-
"privacy": "protected",
|
|
125228
|
-
"return": {
|
|
125229
|
-
"type": {
|
|
125230
|
-
"text": "void"
|
|
125231
|
-
}
|
|
125232
|
-
},
|
|
125233
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
125234
|
-
"inheritedFrom": {
|
|
125235
|
-
"name": "HelixElement",
|
|
125236
|
-
"module": "src/helix-element/helix-element.ts"
|
|
125237
|
-
}
|
|
125238
126306
|
}
|
|
125239
126307
|
],
|
|
125240
126308
|
"events": [
|
|
@@ -126979,7 +128047,7 @@
|
|
|
126979
128047
|
},
|
|
126980
128048
|
"privacy": "private",
|
|
126981
128049
|
"default": "false",
|
|
126982
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
128050
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
126983
128051
|
"inheritedFrom": {
|
|
126984
128052
|
"name": "MixinField",
|
|
126985
128053
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -127419,6 +128487,50 @@
|
|
|
127419
128487
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
127420
128488
|
}
|
|
127421
128489
|
},
|
|
128490
|
+
{
|
|
128491
|
+
"kind": "field",
|
|
128492
|
+
"name": "updateRunning",
|
|
128493
|
+
"type": {
|
|
128494
|
+
"text": "boolean"
|
|
128495
|
+
},
|
|
128496
|
+
"privacy": "private",
|
|
128497
|
+
"default": "false",
|
|
128498
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
128499
|
+
"inheritedFrom": {
|
|
128500
|
+
"name": "HelixFormElement",
|
|
128501
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
128502
|
+
}
|
|
128503
|
+
},
|
|
128504
|
+
{
|
|
128505
|
+
"kind": "method",
|
|
128506
|
+
"name": "performUpdate",
|
|
128507
|
+
"privacy": "protected",
|
|
128508
|
+
"return": {
|
|
128509
|
+
"type": {
|
|
128510
|
+
"text": "void"
|
|
128511
|
+
}
|
|
128512
|
+
},
|
|
128513
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
128514
|
+
"inheritedFrom": {
|
|
128515
|
+
"name": "HelixElement",
|
|
128516
|
+
"module": "src/helix-element/helix-element.ts"
|
|
128517
|
+
}
|
|
128518
|
+
},
|
|
128519
|
+
{
|
|
128520
|
+
"kind": "method",
|
|
128521
|
+
"name": "runPendingUpdate",
|
|
128522
|
+
"privacy": "private",
|
|
128523
|
+
"return": {
|
|
128524
|
+
"type": {
|
|
128525
|
+
"text": "void"
|
|
128526
|
+
}
|
|
128527
|
+
},
|
|
128528
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
128529
|
+
"inheritedFrom": {
|
|
128530
|
+
"name": "HelixFormElement",
|
|
128531
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
128532
|
+
}
|
|
128533
|
+
},
|
|
127422
128534
|
{
|
|
127423
128535
|
"kind": "field",
|
|
127424
128536
|
"name": "willValidate",
|
|
@@ -127440,7 +128552,7 @@
|
|
|
127440
128552
|
"text": "boolean"
|
|
127441
128553
|
}
|
|
127442
128554
|
},
|
|
127443
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
128555
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
127444
128556
|
"inheritedFrom": {
|
|
127445
128557
|
"name": "HelixFormElement",
|
|
127446
128558
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -127449,6 +128561,20 @@
|
|
|
127449
128561
|
"text": "checkValidity() => boolean"
|
|
127450
128562
|
}
|
|
127451
128563
|
},
|
|
128564
|
+
{
|
|
128565
|
+
"kind": "field",
|
|
128566
|
+
"name": "checkInProgress",
|
|
128567
|
+
"type": {
|
|
128568
|
+
"text": "boolean"
|
|
128569
|
+
},
|
|
128570
|
+
"privacy": "private",
|
|
128571
|
+
"default": "false",
|
|
128572
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
128573
|
+
"inheritedFrom": {
|
|
128574
|
+
"name": "HelixFormElement",
|
|
128575
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
128576
|
+
}
|
|
128577
|
+
},
|
|
127452
128578
|
{
|
|
127453
128579
|
"kind": "method",
|
|
127454
128580
|
"name": "reportValidity",
|
|
@@ -127905,21 +129031,6 @@
|
|
|
127905
129031
|
"name": "HelixElement",
|
|
127906
129032
|
"module": "src/helix-element/helix-element.ts"
|
|
127907
129033
|
}
|
|
127908
|
-
},
|
|
127909
|
-
{
|
|
127910
|
-
"kind": "method",
|
|
127911
|
-
"name": "performUpdate",
|
|
127912
|
-
"privacy": "protected",
|
|
127913
|
-
"return": {
|
|
127914
|
-
"type": {
|
|
127915
|
-
"text": "void"
|
|
127916
|
-
}
|
|
127917
|
-
},
|
|
127918
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
127919
|
-
"inheritedFrom": {
|
|
127920
|
-
"name": "HelixElement",
|
|
127921
|
-
"module": "src/helix-element/helix-element.ts"
|
|
127922
|
-
}
|
|
127923
129034
|
}
|
|
127924
129035
|
],
|
|
127925
129036
|
"events": [
|
|
@@ -132206,7 +133317,7 @@
|
|
|
132206
133317
|
},
|
|
132207
133318
|
"privacy": "private",
|
|
132208
133319
|
"default": "false",
|
|
132209
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
133320
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
132210
133321
|
"inheritedFrom": {
|
|
132211
133322
|
"name": "MixinField",
|
|
132212
133323
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -132646,6 +133757,50 @@
|
|
|
132646
133757
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
132647
133758
|
}
|
|
132648
133759
|
},
|
|
133760
|
+
{
|
|
133761
|
+
"kind": "field",
|
|
133762
|
+
"name": "updateRunning",
|
|
133763
|
+
"type": {
|
|
133764
|
+
"text": "boolean"
|
|
133765
|
+
},
|
|
133766
|
+
"privacy": "private",
|
|
133767
|
+
"default": "false",
|
|
133768
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
133769
|
+
"inheritedFrom": {
|
|
133770
|
+
"name": "HelixFormElement",
|
|
133771
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
133772
|
+
}
|
|
133773
|
+
},
|
|
133774
|
+
{
|
|
133775
|
+
"kind": "method",
|
|
133776
|
+
"name": "performUpdate",
|
|
133777
|
+
"privacy": "protected",
|
|
133778
|
+
"return": {
|
|
133779
|
+
"type": {
|
|
133780
|
+
"text": "void"
|
|
133781
|
+
}
|
|
133782
|
+
},
|
|
133783
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
133784
|
+
"inheritedFrom": {
|
|
133785
|
+
"name": "HelixElement",
|
|
133786
|
+
"module": "src/helix-element/helix-element.ts"
|
|
133787
|
+
}
|
|
133788
|
+
},
|
|
133789
|
+
{
|
|
133790
|
+
"kind": "method",
|
|
133791
|
+
"name": "runPendingUpdate",
|
|
133792
|
+
"privacy": "private",
|
|
133793
|
+
"return": {
|
|
133794
|
+
"type": {
|
|
133795
|
+
"text": "void"
|
|
133796
|
+
}
|
|
133797
|
+
},
|
|
133798
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
133799
|
+
"inheritedFrom": {
|
|
133800
|
+
"name": "HelixFormElement",
|
|
133801
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
133802
|
+
}
|
|
133803
|
+
},
|
|
132649
133804
|
{
|
|
132650
133805
|
"kind": "field",
|
|
132651
133806
|
"name": "willValidate",
|
|
@@ -132667,7 +133822,7 @@
|
|
|
132667
133822
|
"text": "boolean"
|
|
132668
133823
|
}
|
|
132669
133824
|
},
|
|
132670
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
133825
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
132671
133826
|
"inheritedFrom": {
|
|
132672
133827
|
"name": "HelixFormElement",
|
|
132673
133828
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -132676,6 +133831,20 @@
|
|
|
132676
133831
|
"text": "checkValidity() => boolean"
|
|
132677
133832
|
}
|
|
132678
133833
|
},
|
|
133834
|
+
{
|
|
133835
|
+
"kind": "field",
|
|
133836
|
+
"name": "checkInProgress",
|
|
133837
|
+
"type": {
|
|
133838
|
+
"text": "boolean"
|
|
133839
|
+
},
|
|
133840
|
+
"privacy": "private",
|
|
133841
|
+
"default": "false",
|
|
133842
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
133843
|
+
"inheritedFrom": {
|
|
133844
|
+
"name": "HelixFormElement",
|
|
133845
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
133846
|
+
}
|
|
133847
|
+
},
|
|
132679
133848
|
{
|
|
132680
133849
|
"kind": "method",
|
|
132681
133850
|
"name": "reportValidity",
|
|
@@ -133144,21 +134313,6 @@
|
|
|
133144
134313
|
"name": "HelixElement",
|
|
133145
134314
|
"module": "src/helix-element/helix-element.ts"
|
|
133146
134315
|
}
|
|
133147
|
-
},
|
|
133148
|
-
{
|
|
133149
|
-
"kind": "method",
|
|
133150
|
-
"name": "performUpdate",
|
|
133151
|
-
"privacy": "protected",
|
|
133152
|
-
"return": {
|
|
133153
|
-
"type": {
|
|
133154
|
-
"text": "void"
|
|
133155
|
-
}
|
|
133156
|
-
},
|
|
133157
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
133158
|
-
"inheritedFrom": {
|
|
133159
|
-
"name": "HelixElement",
|
|
133160
|
-
"module": "src/helix-element/helix-element.ts"
|
|
133161
|
-
}
|
|
133162
134316
|
}
|
|
133163
134317
|
],
|
|
133164
134318
|
"events": [
|
|
@@ -134919,7 +136073,7 @@
|
|
|
134919
136073
|
},
|
|
134920
136074
|
"privacy": "private",
|
|
134921
136075
|
"default": "false",
|
|
134922
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
136076
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
134923
136077
|
"inheritedFrom": {
|
|
134924
136078
|
"name": "MixinField",
|
|
134925
136079
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -135359,6 +136513,50 @@
|
|
|
135359
136513
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
135360
136514
|
}
|
|
135361
136515
|
},
|
|
136516
|
+
{
|
|
136517
|
+
"kind": "field",
|
|
136518
|
+
"name": "updateRunning",
|
|
136519
|
+
"type": {
|
|
136520
|
+
"text": "boolean"
|
|
136521
|
+
},
|
|
136522
|
+
"privacy": "private",
|
|
136523
|
+
"default": "false",
|
|
136524
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
136525
|
+
"inheritedFrom": {
|
|
136526
|
+
"name": "HelixFormElement",
|
|
136527
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
136528
|
+
}
|
|
136529
|
+
},
|
|
136530
|
+
{
|
|
136531
|
+
"kind": "method",
|
|
136532
|
+
"name": "performUpdate",
|
|
136533
|
+
"privacy": "protected",
|
|
136534
|
+
"return": {
|
|
136535
|
+
"type": {
|
|
136536
|
+
"text": "void"
|
|
136537
|
+
}
|
|
136538
|
+
},
|
|
136539
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
136540
|
+
"inheritedFrom": {
|
|
136541
|
+
"name": "HelixElement",
|
|
136542
|
+
"module": "src/helix-element/helix-element.ts"
|
|
136543
|
+
}
|
|
136544
|
+
},
|
|
136545
|
+
{
|
|
136546
|
+
"kind": "method",
|
|
136547
|
+
"name": "runPendingUpdate",
|
|
136548
|
+
"privacy": "private",
|
|
136549
|
+
"return": {
|
|
136550
|
+
"type": {
|
|
136551
|
+
"text": "void"
|
|
136552
|
+
}
|
|
136553
|
+
},
|
|
136554
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
136555
|
+
"inheritedFrom": {
|
|
136556
|
+
"name": "HelixFormElement",
|
|
136557
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
136558
|
+
}
|
|
136559
|
+
},
|
|
135362
136560
|
{
|
|
135363
136561
|
"kind": "field",
|
|
135364
136562
|
"name": "willValidate",
|
|
@@ -135380,7 +136578,7 @@
|
|
|
135380
136578
|
"text": "boolean"
|
|
135381
136579
|
}
|
|
135382
136580
|
},
|
|
135383
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
136581
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
135384
136582
|
"inheritedFrom": {
|
|
135385
136583
|
"name": "HelixFormElement",
|
|
135386
136584
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -135389,6 +136587,20 @@
|
|
|
135389
136587
|
"text": "checkValidity() => boolean"
|
|
135390
136588
|
}
|
|
135391
136589
|
},
|
|
136590
|
+
{
|
|
136591
|
+
"kind": "field",
|
|
136592
|
+
"name": "checkInProgress",
|
|
136593
|
+
"type": {
|
|
136594
|
+
"text": "boolean"
|
|
136595
|
+
},
|
|
136596
|
+
"privacy": "private",
|
|
136597
|
+
"default": "false",
|
|
136598
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
136599
|
+
"inheritedFrom": {
|
|
136600
|
+
"name": "HelixFormElement",
|
|
136601
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
136602
|
+
}
|
|
136603
|
+
},
|
|
135392
136604
|
{
|
|
135393
136605
|
"kind": "method",
|
|
135394
136606
|
"name": "reportValidity",
|
|
@@ -135871,21 +137083,6 @@
|
|
|
135871
137083
|
"name": "HelixElement",
|
|
135872
137084
|
"module": "src/helix-element/helix-element.ts"
|
|
135873
137085
|
}
|
|
135874
|
-
},
|
|
135875
|
-
{
|
|
135876
|
-
"kind": "method",
|
|
135877
|
-
"name": "performUpdate",
|
|
135878
|
-
"privacy": "protected",
|
|
135879
|
-
"return": {
|
|
135880
|
-
"type": {
|
|
135881
|
-
"text": "void"
|
|
135882
|
-
}
|
|
135883
|
-
},
|
|
135884
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
135885
|
-
"inheritedFrom": {
|
|
135886
|
-
"name": "HelixElement",
|
|
135887
|
-
"module": "src/helix-element/helix-element.ts"
|
|
135888
|
-
}
|
|
135889
137086
|
}
|
|
135890
137087
|
],
|
|
135891
137088
|
"events": [
|
|
@@ -140232,7 +141429,7 @@
|
|
|
140232
141429
|
},
|
|
140233
141430
|
"privacy": "private",
|
|
140234
141431
|
"default": "false",
|
|
140235
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
141432
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
140236
141433
|
"inheritedFrom": {
|
|
140237
141434
|
"name": "MixinField",
|
|
140238
141435
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -140672,6 +141869,50 @@
|
|
|
140672
141869
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
140673
141870
|
}
|
|
140674
141871
|
},
|
|
141872
|
+
{
|
|
141873
|
+
"kind": "field",
|
|
141874
|
+
"name": "updateRunning",
|
|
141875
|
+
"type": {
|
|
141876
|
+
"text": "boolean"
|
|
141877
|
+
},
|
|
141878
|
+
"privacy": "private",
|
|
141879
|
+
"default": "false",
|
|
141880
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
141881
|
+
"inheritedFrom": {
|
|
141882
|
+
"name": "HelixFormElement",
|
|
141883
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
141884
|
+
}
|
|
141885
|
+
},
|
|
141886
|
+
{
|
|
141887
|
+
"kind": "method",
|
|
141888
|
+
"name": "performUpdate",
|
|
141889
|
+
"privacy": "protected",
|
|
141890
|
+
"return": {
|
|
141891
|
+
"type": {
|
|
141892
|
+
"text": "void"
|
|
141893
|
+
}
|
|
141894
|
+
},
|
|
141895
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
141896
|
+
"inheritedFrom": {
|
|
141897
|
+
"name": "HelixElement",
|
|
141898
|
+
"module": "src/helix-element/helix-element.ts"
|
|
141899
|
+
}
|
|
141900
|
+
},
|
|
141901
|
+
{
|
|
141902
|
+
"kind": "method",
|
|
141903
|
+
"name": "runPendingUpdate",
|
|
141904
|
+
"privacy": "private",
|
|
141905
|
+
"return": {
|
|
141906
|
+
"type": {
|
|
141907
|
+
"text": "void"
|
|
141908
|
+
}
|
|
141909
|
+
},
|
|
141910
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
141911
|
+
"inheritedFrom": {
|
|
141912
|
+
"name": "HelixFormElement",
|
|
141913
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
141914
|
+
}
|
|
141915
|
+
},
|
|
140675
141916
|
{
|
|
140676
141917
|
"kind": "field",
|
|
140677
141918
|
"name": "willValidate",
|
|
@@ -140693,7 +141934,7 @@
|
|
|
140693
141934
|
"text": "boolean"
|
|
140694
141935
|
}
|
|
140695
141936
|
},
|
|
140696
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
141937
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
140697
141938
|
"inheritedFrom": {
|
|
140698
141939
|
"name": "HelixFormElement",
|
|
140699
141940
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -140702,6 +141943,20 @@
|
|
|
140702
141943
|
"text": "checkValidity() => boolean"
|
|
140703
141944
|
}
|
|
140704
141945
|
},
|
|
141946
|
+
{
|
|
141947
|
+
"kind": "field",
|
|
141948
|
+
"name": "checkInProgress",
|
|
141949
|
+
"type": {
|
|
141950
|
+
"text": "boolean"
|
|
141951
|
+
},
|
|
141952
|
+
"privacy": "private",
|
|
141953
|
+
"default": "false",
|
|
141954
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
141955
|
+
"inheritedFrom": {
|
|
141956
|
+
"name": "HelixFormElement",
|
|
141957
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
141958
|
+
}
|
|
141959
|
+
},
|
|
140705
141960
|
{
|
|
140706
141961
|
"kind": "method",
|
|
140707
141962
|
"name": "reportValidity",
|
|
@@ -141158,21 +142413,6 @@
|
|
|
141158
142413
|
"name": "HelixElement",
|
|
141159
142414
|
"module": "src/helix-element/helix-element.ts"
|
|
141160
142415
|
}
|
|
141161
|
-
},
|
|
141162
|
-
{
|
|
141163
|
-
"kind": "method",
|
|
141164
|
-
"name": "performUpdate",
|
|
141165
|
-
"privacy": "protected",
|
|
141166
|
-
"return": {
|
|
141167
|
-
"type": {
|
|
141168
|
-
"text": "void"
|
|
141169
|
-
}
|
|
141170
|
-
},
|
|
141171
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
141172
|
-
"inheritedFrom": {
|
|
141173
|
-
"name": "HelixElement",
|
|
141174
|
-
"module": "src/helix-element/helix-element.ts"
|
|
141175
|
-
}
|
|
141176
142416
|
}
|
|
141177
142417
|
],
|
|
141178
142418
|
"events": [
|
|
@@ -143743,7 +144983,7 @@
|
|
|
143743
144983
|
},
|
|
143744
144984
|
"privacy": "private",
|
|
143745
144985
|
"default": "false",
|
|
143746
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
144986
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
143747
144987
|
"inheritedFrom": {
|
|
143748
144988
|
"name": "MixinField",
|
|
143749
144989
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -144183,6 +145423,50 @@
|
|
|
144183
145423
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
144184
145424
|
}
|
|
144185
145425
|
},
|
|
145426
|
+
{
|
|
145427
|
+
"kind": "field",
|
|
145428
|
+
"name": "updateRunning",
|
|
145429
|
+
"type": {
|
|
145430
|
+
"text": "boolean"
|
|
145431
|
+
},
|
|
145432
|
+
"privacy": "private",
|
|
145433
|
+
"default": "false",
|
|
145434
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
145435
|
+
"inheritedFrom": {
|
|
145436
|
+
"name": "HelixFormElement",
|
|
145437
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
145438
|
+
}
|
|
145439
|
+
},
|
|
145440
|
+
{
|
|
145441
|
+
"kind": "method",
|
|
145442
|
+
"name": "performUpdate",
|
|
145443
|
+
"privacy": "protected",
|
|
145444
|
+
"return": {
|
|
145445
|
+
"type": {
|
|
145446
|
+
"text": "void"
|
|
145447
|
+
}
|
|
145448
|
+
},
|
|
145449
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
145450
|
+
"inheritedFrom": {
|
|
145451
|
+
"name": "HelixElement",
|
|
145452
|
+
"module": "src/helix-element/helix-element.ts"
|
|
145453
|
+
}
|
|
145454
|
+
},
|
|
145455
|
+
{
|
|
145456
|
+
"kind": "method",
|
|
145457
|
+
"name": "runPendingUpdate",
|
|
145458
|
+
"privacy": "private",
|
|
145459
|
+
"return": {
|
|
145460
|
+
"type": {
|
|
145461
|
+
"text": "void"
|
|
145462
|
+
}
|
|
145463
|
+
},
|
|
145464
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
145465
|
+
"inheritedFrom": {
|
|
145466
|
+
"name": "HelixFormElement",
|
|
145467
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
145468
|
+
}
|
|
145469
|
+
},
|
|
144186
145470
|
{
|
|
144187
145471
|
"kind": "field",
|
|
144188
145472
|
"name": "willValidate",
|
|
@@ -144204,7 +145488,7 @@
|
|
|
144204
145488
|
"text": "boolean"
|
|
144205
145489
|
}
|
|
144206
145490
|
},
|
|
144207
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
145491
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
144208
145492
|
"inheritedFrom": {
|
|
144209
145493
|
"name": "HelixFormElement",
|
|
144210
145494
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -144213,6 +145497,20 @@
|
|
|
144213
145497
|
"text": "checkValidity() => boolean"
|
|
144214
145498
|
}
|
|
144215
145499
|
},
|
|
145500
|
+
{
|
|
145501
|
+
"kind": "field",
|
|
145502
|
+
"name": "checkInProgress",
|
|
145503
|
+
"type": {
|
|
145504
|
+
"text": "boolean"
|
|
145505
|
+
},
|
|
145506
|
+
"privacy": "private",
|
|
145507
|
+
"default": "false",
|
|
145508
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
145509
|
+
"inheritedFrom": {
|
|
145510
|
+
"name": "HelixFormElement",
|
|
145511
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
145512
|
+
}
|
|
145513
|
+
},
|
|
144216
145514
|
{
|
|
144217
145515
|
"kind": "method",
|
|
144218
145516
|
"name": "reportValidity",
|
|
@@ -144695,21 +145993,6 @@
|
|
|
144695
145993
|
"name": "HelixElement",
|
|
144696
145994
|
"module": "src/helix-element/helix-element.ts"
|
|
144697
145995
|
}
|
|
144698
|
-
},
|
|
144699
|
-
{
|
|
144700
|
-
"kind": "method",
|
|
144701
|
-
"name": "performUpdate",
|
|
144702
|
-
"privacy": "protected",
|
|
144703
|
-
"return": {
|
|
144704
|
-
"type": {
|
|
144705
|
-
"text": "void"
|
|
144706
|
-
}
|
|
144707
|
-
},
|
|
144708
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
144709
|
-
"inheritedFrom": {
|
|
144710
|
-
"name": "HelixElement",
|
|
144711
|
-
"module": "src/helix-element/helix-element.ts"
|
|
144712
|
-
}
|
|
144713
145996
|
}
|
|
144714
145997
|
],
|
|
144715
145998
|
"events": [
|
|
@@ -153325,7 +154608,7 @@
|
|
|
153325
154608
|
},
|
|
153326
154609
|
"privacy": "private",
|
|
153327
154610
|
"default": "false",
|
|
153328
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
154611
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
153329
154612
|
"inheritedFrom": {
|
|
153330
154613
|
"name": "MixinField",
|
|
153331
154614
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -153765,6 +155048,50 @@
|
|
|
153765
155048
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
153766
155049
|
}
|
|
153767
155050
|
},
|
|
155051
|
+
{
|
|
155052
|
+
"kind": "field",
|
|
155053
|
+
"name": "updateRunning",
|
|
155054
|
+
"type": {
|
|
155055
|
+
"text": "boolean"
|
|
155056
|
+
},
|
|
155057
|
+
"privacy": "private",
|
|
155058
|
+
"default": "false",
|
|
155059
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
155060
|
+
"inheritedFrom": {
|
|
155061
|
+
"name": "HelixFormElement",
|
|
155062
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
155063
|
+
}
|
|
155064
|
+
},
|
|
155065
|
+
{
|
|
155066
|
+
"kind": "method",
|
|
155067
|
+
"name": "performUpdate",
|
|
155068
|
+
"privacy": "protected",
|
|
155069
|
+
"return": {
|
|
155070
|
+
"type": {
|
|
155071
|
+
"text": "void"
|
|
155072
|
+
}
|
|
155073
|
+
},
|
|
155074
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
155075
|
+
"inheritedFrom": {
|
|
155076
|
+
"name": "HelixElement",
|
|
155077
|
+
"module": "src/helix-element/helix-element.ts"
|
|
155078
|
+
}
|
|
155079
|
+
},
|
|
155080
|
+
{
|
|
155081
|
+
"kind": "method",
|
|
155082
|
+
"name": "runPendingUpdate",
|
|
155083
|
+
"privacy": "private",
|
|
155084
|
+
"return": {
|
|
155085
|
+
"type": {
|
|
155086
|
+
"text": "void"
|
|
155087
|
+
}
|
|
155088
|
+
},
|
|
155089
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
155090
|
+
"inheritedFrom": {
|
|
155091
|
+
"name": "HelixFormElement",
|
|
155092
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
155093
|
+
}
|
|
155094
|
+
},
|
|
153768
155095
|
{
|
|
153769
155096
|
"kind": "field",
|
|
153770
155097
|
"name": "willValidate",
|
|
@@ -153786,7 +155113,7 @@
|
|
|
153786
155113
|
"text": "boolean"
|
|
153787
155114
|
}
|
|
153788
155115
|
},
|
|
153789
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
155116
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
153790
155117
|
"inheritedFrom": {
|
|
153791
155118
|
"name": "HelixFormElement",
|
|
153792
155119
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -153795,6 +155122,20 @@
|
|
|
153795
155122
|
"text": "checkValidity() => boolean"
|
|
153796
155123
|
}
|
|
153797
155124
|
},
|
|
155125
|
+
{
|
|
155126
|
+
"kind": "field",
|
|
155127
|
+
"name": "checkInProgress",
|
|
155128
|
+
"type": {
|
|
155129
|
+
"text": "boolean"
|
|
155130
|
+
},
|
|
155131
|
+
"privacy": "private",
|
|
155132
|
+
"default": "false",
|
|
155133
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
155134
|
+
"inheritedFrom": {
|
|
155135
|
+
"name": "HelixFormElement",
|
|
155136
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
155137
|
+
}
|
|
155138
|
+
},
|
|
153798
155139
|
{
|
|
153799
155140
|
"kind": "method",
|
|
153800
155141
|
"name": "reportValidity",
|
|
@@ -154277,21 +155618,6 @@
|
|
|
154277
155618
|
"name": "HelixElement",
|
|
154278
155619
|
"module": "src/helix-element/helix-element.ts"
|
|
154279
155620
|
}
|
|
154280
|
-
},
|
|
154281
|
-
{
|
|
154282
|
-
"kind": "method",
|
|
154283
|
-
"name": "performUpdate",
|
|
154284
|
-
"privacy": "protected",
|
|
154285
|
-
"return": {
|
|
154286
|
-
"type": {
|
|
154287
|
-
"text": "void"
|
|
154288
|
-
}
|
|
154289
|
-
},
|
|
154290
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
154291
|
-
"inheritedFrom": {
|
|
154292
|
-
"name": "HelixElement",
|
|
154293
|
-
"module": "src/helix-element/helix-element.ts"
|
|
154294
|
-
}
|
|
154295
155621
|
}
|
|
154296
155622
|
],
|
|
154297
155623
|
"events": [
|
|
@@ -156374,7 +157700,7 @@
|
|
|
156374
157700
|
"declarations": [
|
|
156375
157701
|
{
|
|
156376
157702
|
"kind": "class",
|
|
156377
|
-
"description": "Lays out the rows on a CSS grid, so every column lines up across rows and\neach row stays a real element that can be styled, hidden, or made\ninteractive. A `<table>` layout aligns columns but limits almost everything\nelse.\n\nA grid of elements has no table structure for assistive technology, so the\nroles are set explicitly: `table`, `row`, `cell`, `columnheader`, and\n`rowheader` for a `header` cell in a row of values. Rows are\n`display: contents`, so their cells become items of the one grid.\n\n**Sorting.** A column with `sortable` and a `field` draws its heading as a\nbutton that sorts the rows by the text of its cells, numbers by their value.\nYour markup is not reordered: the table draws the rows in the sorted order.\n\n1. Each press cycles the column through ascending, descending, and the\n order the rows were written in, which keeps a server's own ranking\n reachable.\n2. `helix-sort` asks first, with `field:direction`, or empty for the written\n order. Refuse it to keep the order, or to sort the rows yourself and set\n `sort`.\n3. `helix-sorted` follows once the order stands, and `sort` holds it.\n4. The heading carries `aria-sort`, and a screen reader hears `sorted-label`\n (\"Sorted by Name, ascending\") or `unsorted-label` from a polite region.\n\nTab reaches each sort button, and Enter or Space presses it.\n\nThe `heading` slot names the table: slot a heading or a line of text into\nit, and the table is named by its words. An `aria-label` or `aria-labelledby` on the\nhost wins over it.\n\n**Selecting.** `selectable` adds a column of checkboxes.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, and `selected` holds the chosen keys, comma separated, the same\n shape `DataTable` uses. `default-selected` is where it starts.\n2. A row's checkbox is named by `select-row-label` (\"Select {row}\") with the\n words of the row's first cell. The checkbox in the heading selects every\n row, and shows a dash while only some are chosen.\n3. `helix-select` asks first, with every key the change would leave.\n Refuse it to keep the selection. `helix-selected` follows once it stands.\n4. A chosen row takes `:state(selected)`, and a screen reader hears\n `selected-label` (\"2 selected\") from a polite region.\n\nTab reaches each checkbox, and Space ticks it. To act on one row, put a\nlink or a button in a cell, or give the row an `href`.\n\n`selection-mode=\"single\"` selects one row at a time: ticking a row lets go\nof the one before, the heading holds no checkbox, and Shift and Control with\nA take in nothing more. `selection-behavior=\"replace\"` makes a press on a\nrow, anywhere but its own controls, select it alone, as a file list does,\nand in a `grid` table the arrow keys carry the selection with them. Control\nor Command with a press adds or takes out the row, and with an arrow moves\nwithout selecting. Shift with a press takes in the rows from the one last\nchosen.\n\n**Nesting rows.** A row with `parent` sits under the row of that key, as\na file sits in a folder. The table then draws a column of disclosure\nbuttons, under a heading named by `expand-column-label`: a row with rows\nunder it has a button named by `expand-row-label` (\"Expand {row}\") that\nsays with `aria-expanded` whether it is open, and the rows under a shut row\nare not drawn. `expanded` holds the open rows' keys, comma separated, and\n`default-expanded` is where it starts. A press asks with\n`helix-before-toggle` and tells with `helix-toggle`, both from the row, so\nyou can refuse it or load the rows on the way. A sort orders the rows\nunder each row among themselves, and in a `grid` table the table is a\n`treegrid` whose rows say their depth.\n\n**Moving rows.** `reorderable` adds a column of grips before the checkboxes,\nunder a heading named by `row-grips-label`.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, as for selecting. Give rows a `value` when they move, so a key\n stays with its row.\n2. A grip is a button named by `move-row-label` (\"Move {row}\") with the\n words of the row's first cell. Drag it to move its row, and the page\n scrolls near an edge. Or press it with Space, Enter, or a click to pick\n the row up, move it with Up, Down, Home, and End, and press it again to\n drop it. A click on another row drops it there, and Escape puts it back.\n3. `helix-before-reorder` asks first, and `helix-reorder` follows with\n `keys`, every row's key in the new order. **You move the rows**: the\n table moves no element of yours, and focus goes back to the moved row's\n grip once you have.\n4. Each step is said in the table's live region, in words you can change:\n `picked-up-label`, `moved-label`, `dropped-label`, and `canceled-label`.\n The grips do nothing while a sort is set.\n\n**A grid.** `grid` makes the table one tab stop that the arrow keys move\nthrough cell by cell, the headings included, as React Aria's table is. The\ntable is then a `grid` and each value a `gridcell`, and the table gives\nevery cell a `tabindex` so focus can rest on it: set `grid` only where the\ncells may carry one.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the headings included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the table. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter on a cell of a row with `href` | Follows the row's link. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Space on a row, Enter or Space on its checkbox cell | Selects the row, in a `selectable` table. |\n| Enter or Space on a disclosure cell | Shows or hides the rows under the row, in a table whose rows nest. |\n| Right on a disclosure cell | Shows the rows under a shut row, and otherwise moves one cell along the row. Left does, on a right-to-left page. |\n| Left on a disclosure cell | Hides the rows under an open row, and moves to the row this one sits under from any other. |\n| Enter or Space on a grip cell | Picks the row up, or drops it, in a `reorderable` table. Up, Down, Home, and End move a row picked up, and Escape puts it back. |\n| Down, Up, Page Down, Page Up under `selection-behavior=\"replace\"` | Selects the row it moves to alone. Control or Command with the key moves without selecting. |\n| Shift with Down or Up | Selects the rows it moves across, in a `selectable` table. |\n| Shift with Space | Selects every row from the one last chosen, in a `selectable` table. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| A letter or a word | Moves to the next row whose first cell starts with what you typed. |\n| Tab | Leaves the table. |\n\n**Loading more.** `load-more` sends `helix-load-more` once the end of the\ntable comes within a screen of view, in the box that scrolls it or the\npage, once for each
|
|
157703
|
+
"description": "Lays out the rows on a CSS grid, so every column lines up across rows and\neach row stays a real element that can be styled, hidden, or made\ninteractive. A `<table>` layout aligns columns but limits almost everything\nelse.\n\nA grid of elements has no table structure for assistive technology, so the\nroles are set explicitly: `table`, `row`, `cell`, `columnheader`, and\n`rowheader` for a `header` cell in a row of values. Rows are\n`display: contents`, so their cells become items of the one grid.\n\n**Sorting.** A column with `sortable` and a `field` draws its heading as a\nbutton that sorts the rows by the text of its cells, numbers by their value.\nYour markup is not reordered: the table draws the rows in the sorted order.\n\n1. Each press cycles the column through ascending, descending, and the\n order the rows were written in, which keeps a server's own ranking\n reachable.\n2. `helix-sort` asks first, with `field:direction`, or empty for the written\n order. Refuse it to keep the order, or to sort the rows yourself and set\n `sort`.\n3. `helix-sorted` follows once the order stands, and `sort` holds it.\n4. The heading carries `aria-sort`, and a screen reader hears `sorted-label`\n (\"Sorted by Name, ascending\") or `unsorted-label` from a polite region.\n\nTab reaches each sort button, and Enter or Space presses it.\n\nThe `heading` slot names the table: slot a heading or a line of text into\nit, and the table is named by its words. An `aria-label` or `aria-labelledby` on the\nhost wins over it.\nA table with no name is reported once in a development build.\n\n**Selecting.** `selectable` adds a column of checkboxes.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, and `selected` holds the chosen keys, comma separated, the same\n shape `DataTable` uses. `default-selected` is where it starts.\n2. A row's checkbox is named by `select-row-label` (\"Select {row}\") with the\n words of the row's first cell. The checkbox in the heading selects every\n row, and shows a dash while only some are chosen.\n3. `helix-select` asks first, with every key the change would leave.\n Refuse it to keep the selection. `helix-selected` follows once it stands.\n4. A chosen row takes `:state(selected)`, and a screen reader hears\n `selected-label` (\"2 selected\") from a polite region.\n\nTab reaches each checkbox, and Space ticks it. To act on one row, put a\nlink or a button in a cell, or give the row an `href`.\n\n`selection-mode=\"single\"` selects one row at a time: ticking a row lets go\nof the one before, the heading holds no checkbox, and Shift and Control with\nA take in nothing more. `selection-behavior=\"replace\"` makes a press on a\nrow, anywhere but its own controls, select it alone, as a file list does,\nand in a `grid` table the arrow keys carry the selection with them. Control\nor Command with a press adds or takes out the row, and with an arrow moves\nwithout selecting. Shift with a press takes in the rows from the one last\nchosen.\n\n**Nesting rows.** A row with `parent` sits under the row of that key, as\na file sits in a folder. The table then draws a column of disclosure\nbuttons, under a heading named by `expand-column-label`: a row with rows\nunder it has a button named by `expand-row-label` (\"Expand {row}\") that\nsays with `aria-expanded` whether it is open, and the rows under a shut row\nare not drawn. `expanded` holds the open rows' keys, comma separated, and\n`default-expanded` is where it starts. A press asks with\n`helix-before-toggle` and tells with `helix-toggle`, both from the row, so\nyou can refuse it or load the rows on the way. A sort orders the rows\nunder each row among themselves, and in a `grid` table the table is a\n`treegrid` whose rows say their depth.\n\n**Moving rows.** `reorderable` adds a column of grips before the checkboxes,\nunder a heading named by `row-grips-label`.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, as for selecting. Give rows a `value` when they move, so a key\n stays with its row.\n2. A grip is a button named by `move-row-label` (\"Move {row}\") with the\n words of the row's first cell. Drag it to move its row, and the page\n scrolls near an edge. Or press it with Space, Enter, or a click to pick\n the row up, move it with Up, Down, Home, and End, and press it again to\n drop it. A click on another row drops it there, and Escape puts it back.\n3. `helix-before-reorder` asks first, and `helix-reorder` follows with\n `keys`, every row's key in the new order. **You move the rows**: the\n table moves no element of yours, and focus goes back to the moved row's\n grip once you have.\n4. Each step is said in the table's live region, in words you can change:\n `picked-up-label`, `moved-label`, `dropped-label`, and `canceled-label`.\n The grips do nothing while a sort is set.\n\n**A grid.** `grid` makes the table one tab stop that the arrow keys move\nthrough cell by cell, the headings included, as React Aria's table is. The\ntable is then a `grid` and each value a `gridcell`, and the table gives\nevery cell a `tabindex` so focus can rest on it: set `grid` only where the\ncells may carry one.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the headings included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the table. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter on a cell of a row with `href` | Follows the row's link. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Space on a row, Enter or Space on its checkbox cell | Selects the row, in a `selectable` table. |\n| Enter or Space on a disclosure cell | Shows or hides the rows under the row, in a table whose rows nest. |\n| Right on a disclosure cell | Shows the rows under a shut row, and otherwise moves one cell along the row. Left does, on a right-to-left page. |\n| Left on a disclosure cell | Hides the rows under an open row, and moves to the row this one sits under from any other. |\n| Enter or Space on a grip cell | Picks the row up, or drops it, in a `reorderable` table. Up, Down, Home, and End move a row picked up, and Escape puts it back. |\n| Down, Up, Page Down, Page Up under `selection-behavior=\"replace\"` | Selects the row it moves to alone. Control or Command with the key moves without selecting. |\n| Shift with Down or Up | Selects the rows it moves across, in a `selectable` table. |\n| Shift with Space | Selects every row from the one last chosen, in a `selectable` table. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| A letter or a word | Moves to the next row whose first cell starts with what you typed. |\n| Tab | Leaves the table. |\n\n**Long tables.** `windowed` draws only the rows in view, as Data Table's\ndoes, and the box of the table scrolls under headings that stick. The\ntable still says how many rows it has with `aria-rowcount`, and each row\nits place with `aria-rowindex`. The keys reach every row, drawn or not, and\nthe row holding focus stays drawn when it scrolls away. Nested rows,\nsorting, and selecting work as they do in a table that draws every row.\n\n**Loading more.** `load-more` sends `helix-load-more` once the end of the\ntable comes within a screen of view, in the box that scrolls it or the\npage, or in the table's own box when it is `windowed`, once for each\nnumber of rows: add rows and it can send it again. Set\n`loading` while you fetch, and the table asks for nothing until it clears.\n\nWhen the rows did not load, set `error-text`, such as \"The orders did not\nload\", and put a button that tries again in the `error` slot. The line shows\nafter the rows in place of the empty and loading lines, the live region says\nit, and the table takes the `error` state. Clear it once you try again.\n\nThe CSS custom properties listed for this component are written by it and\nread by the stylesheet that draws it. Do not set them. Each holds a number\nthe component computes and CSS cannot, so the stylesheet can draw the table\nwithout measuring anything.",
|
|
156378
157704
|
"name": "HelixHeadlessTable",
|
|
156379
157705
|
"cssProperties": [
|
|
156380
157706
|
{
|
|
@@ -156383,6 +157709,14 @@
|
|
|
156383
157709
|
}
|
|
156384
157710
|
],
|
|
156385
157711
|
"cssParts": [
|
|
157712
|
+
{
|
|
157713
|
+
"description": "The space that stands in for the rows below the window. Only while `windowed`.",
|
|
157714
|
+
"name": "after"
|
|
157715
|
+
},
|
|
157716
|
+
{
|
|
157717
|
+
"description": "The space that stands in for the rows above the window. Only while `windowed`.",
|
|
157718
|
+
"name": "before"
|
|
157719
|
+
},
|
|
156386
157720
|
{
|
|
156387
157721
|
"description": "The checkbox in the heading that selects every row, in a `selectable` table.",
|
|
156388
157722
|
"name": "checkbox"
|
|
@@ -156894,6 +158228,17 @@
|
|
|
156894
158228
|
"words": true
|
|
156895
158229
|
}
|
|
156896
158230
|
},
|
|
158231
|
+
{
|
|
158232
|
+
"kind": "field",
|
|
158233
|
+
"name": "windowed",
|
|
158234
|
+
"type": {
|
|
158235
|
+
"text": "boolean"
|
|
158236
|
+
},
|
|
158237
|
+
"default": "false",
|
|
158238
|
+
"description": "Draws only the rows in view, with empty space in place of the rest, as\nData Table's `windowed` does. The table's box then scrolls, at the\nheight `--table-block-size` gives it in the styled tier, and the\nheadings stick to its top.\n\nOff by default. Windowing costs a scroll listener, a measurement per row\ndrawn, and a height on the table, and a table of twenty rows should pay\nnone of them.",
|
|
158239
|
+
"attribute": "windowed",
|
|
158240
|
+
"reflects": true
|
|
158241
|
+
},
|
|
156897
158242
|
{
|
|
156898
158243
|
"kind": "field",
|
|
156899
158244
|
"name": "sortState",
|
|
@@ -156931,6 +158276,40 @@
|
|
|
156931
158276
|
"description": "Whether any row sits under another, which makes the table a tree.",
|
|
156932
158277
|
"readonly": true
|
|
156933
158278
|
},
|
|
158279
|
+
{
|
|
158280
|
+
"kind": "field",
|
|
158281
|
+
"name": "memo",
|
|
158282
|
+
"type": {
|
|
158283
|
+
"text": "{ arranged?: Element[]; keyed?: { key: string; row: Row }[]; nests?: boolean }"
|
|
158284
|
+
},
|
|
158285
|
+
"privacy": "private",
|
|
158286
|
+
"default": "{}",
|
|
158287
|
+
"description": "What the table read from its rows, kept until anything asks for an\nupdate or the turn ends.\n\n**Read once rather than on every question.** A render, the assignment\nand the keyboard each asked for the rows in order dozens of times, and\neach answer walked every row: in Chromium a windowed table of 3,000 rows\ntook 89 milliseconds to move its window, 42 of them reading the keys."
|
|
158288
|
+
},
|
|
158289
|
+
{
|
|
158290
|
+
"kind": "method",
|
|
158291
|
+
"name": "remember",
|
|
158292
|
+
"privacy": "private",
|
|
158293
|
+
"return": {
|
|
158294
|
+
"type": {
|
|
158295
|
+
"text": "NonNullable<HelixHeadlessTable['memo'][K]>"
|
|
158296
|
+
}
|
|
158297
|
+
},
|
|
158298
|
+
"parameters": [
|
|
158299
|
+
{
|
|
158300
|
+
"name": "key",
|
|
158301
|
+
"type": {
|
|
158302
|
+
"text": "K"
|
|
158303
|
+
}
|
|
158304
|
+
},
|
|
158305
|
+
{
|
|
158306
|
+
"name": "compute",
|
|
158307
|
+
"type": {
|
|
158308
|
+
"text": "() => NonNullable<HelixHeadlessTable['memo'][K]>"
|
|
158309
|
+
}
|
|
158310
|
+
}
|
|
158311
|
+
]
|
|
158312
|
+
},
|
|
156934
158313
|
{
|
|
156935
158314
|
"kind": "field",
|
|
156936
158315
|
"name": "open",
|
|
@@ -156983,9 +158362,119 @@
|
|
|
156983
158362
|
"name": "gridKeys",
|
|
156984
158363
|
"privacy": "private",
|
|
156985
158364
|
"readonly": true,
|
|
156986
|
-
"default": "new TableGridController(this, { activate: (place, event) => this.activate(place, event), arrive: (to, control) => { if (this.replaces && !control) { this.chooseOnly(to) } }, columns: () => this.tableColumns.filter((column) => column.shown), disclose: (at, forward) => this.disclose(at, forward), lead: () => this.lead, on: () => this.grid, part: (name) => this.partNamed(name), rows: () => (this.childrenKnown ? this.arrangedRows : []), rowWords: () => this.arrangedRows.map((row) => textOf(row.children[0])), selectAll: () => this.selectable && !this.single && this.requestSelected(new Set([...this.chosen, ...this.enabledKeys])), selectRange: (to, from) => this.selectRange(to, from), })",
|
|
158365
|
+
"default": "new TableGridController(this, { activate: (place, event) => this.activate(place, event), arrive: (to, control) => { if (this.replaces && !control) { this.chooseOnly(to) } }, columns: () => this.tableColumns.filter((column) => column.shown), disclose: (at, forward) => this.disclose(at, forward), drawn: () => (this.windowed ? new Set(this.drawnRows) : undefined), lead: () => this.lead, on: () => this.grid, part: (name) => this.partNamed(name), reveal: (row) => this.revealRow(row), rows: () => (this.childrenKnown ? this.arrangedRows : []), rowWords: () => this.arrangedRows.map((row) => textOf(row.children[0])), selectAll: () => this.selectable && !this.single && this.requestSelected(new Set([...this.chosen, ...this.enabledKeys])), selectRange: (to, from) => this.selectRange(to, from), })",
|
|
156987
158366
|
"description": "The keyboard of a `grid` table, in `grid-controller.ts`."
|
|
156988
158367
|
},
|
|
158368
|
+
{
|
|
158369
|
+
"kind": "field",
|
|
158370
|
+
"name": "virtualize",
|
|
158371
|
+
"privacy": "private",
|
|
158372
|
+
"readonly": true,
|
|
158373
|
+
"default": "new VirtualizeController(this, { container: () => (this.windowed ? this.partNamed('table') : null), count: () => this.arrangedCount, estimate: () => ESTIMATE, measured: () => this.windowed, rows: () => (this.windowed ? this.measuredRows() : []), })",
|
|
158374
|
+
"description": "The slice of a long table that is drawn, under `windowed`. The rows are\nthe page's elements, so the window is which of them the body slot is\ngiven: a row it is not given is not laid out and not in the\naccessibility tree."
|
|
158375
|
+
},
|
|
158376
|
+
{
|
|
158377
|
+
"kind": "field",
|
|
158378
|
+
"name": "arrangedCount",
|
|
158379
|
+
"type": {
|
|
158380
|
+
"text": "number"
|
|
158381
|
+
},
|
|
158382
|
+
"privacy": "private",
|
|
158383
|
+
"default": "0",
|
|
158384
|
+
"description": "How many rows are drawn in order, read when the rows are assigned."
|
|
158385
|
+
},
|
|
158386
|
+
{
|
|
158387
|
+
"kind": "field",
|
|
158388
|
+
"name": "hasRows",
|
|
158389
|
+
"type": {
|
|
158390
|
+
"text": "boolean"
|
|
158391
|
+
},
|
|
158392
|
+
"privacy": "protected",
|
|
158393
|
+
"readonly": true,
|
|
158394
|
+
"description": "A `windowed` table has rows while it holds any, drawn or not.",
|
|
158395
|
+
"inheritedFrom": {
|
|
158396
|
+
"name": "MixinCollection",
|
|
158397
|
+
"module": "src/mixins/mixin-collection/mixin-collection.ts"
|
|
158398
|
+
}
|
|
158399
|
+
},
|
|
158400
|
+
{
|
|
158401
|
+
"kind": "field",
|
|
158402
|
+
"name": "drawnRows",
|
|
158403
|
+
"type": {
|
|
158404
|
+
"text": "Element[]"
|
|
158405
|
+
},
|
|
158406
|
+
"privacy": "private",
|
|
158407
|
+
"default": "[]",
|
|
158408
|
+
"description": "The rows the body slot was last given, under `windowed`."
|
|
158409
|
+
},
|
|
158410
|
+
{
|
|
158411
|
+
"kind": "method",
|
|
158412
|
+
"name": "measuredRows",
|
|
158413
|
+
"privacy": "private",
|
|
158414
|
+
"return": {
|
|
158415
|
+
"type": {
|
|
158416
|
+
"text": "{ element: HTMLElement; index: number }[]"
|
|
158417
|
+
}
|
|
158418
|
+
},
|
|
158419
|
+
"description": "The rows drawn now, each by its first cell, with its place among the\nrows. A row is `display: contents` and has no box, and a cell is a grid\nitem stretched to its row, as Data Table measures its rows."
|
|
158420
|
+
},
|
|
158421
|
+
{
|
|
158422
|
+
"kind": "method",
|
|
158423
|
+
"name": "keptRow",
|
|
158424
|
+
"privacy": "private",
|
|
158425
|
+
"return": {
|
|
158426
|
+
"type": {
|
|
158427
|
+
"text": "number | undefined"
|
|
158428
|
+
}
|
|
158429
|
+
},
|
|
158430
|
+
"parameters": [
|
|
158431
|
+
{
|
|
158432
|
+
"name": "rows",
|
|
158433
|
+
"type": {
|
|
158434
|
+
"text": "Element[]"
|
|
158435
|
+
}
|
|
158436
|
+
}
|
|
158437
|
+
],
|
|
158438
|
+
"description": "The row outside the window that stays drawn: the grid's stop, or the row holding focus."
|
|
158439
|
+
},
|
|
158440
|
+
{
|
|
158441
|
+
"kind": "method",
|
|
158442
|
+
"name": "windowOf",
|
|
158443
|
+
"privacy": "private",
|
|
158444
|
+
"return": {
|
|
158445
|
+
"type": {
|
|
158446
|
+
"text": "Element[]"
|
|
158447
|
+
}
|
|
158448
|
+
},
|
|
158449
|
+
"parameters": [
|
|
158450
|
+
{
|
|
158451
|
+
"name": "rows",
|
|
158452
|
+
"type": {
|
|
158453
|
+
"text": "Element[]"
|
|
158454
|
+
}
|
|
158455
|
+
}
|
|
158456
|
+
],
|
|
158457
|
+
"description": "The rows to draw under `windowed`: the window, and the row kept for\nfocus beside it on its side."
|
|
158458
|
+
},
|
|
158459
|
+
{
|
|
158460
|
+
"kind": "method",
|
|
158461
|
+
"name": "revealRow",
|
|
158462
|
+
"privacy": "private",
|
|
158463
|
+
"return": {
|
|
158464
|
+
"type": {
|
|
158465
|
+
"text": "void"
|
|
158466
|
+
}
|
|
158467
|
+
},
|
|
158468
|
+
"parameters": [
|
|
158469
|
+
{
|
|
158470
|
+
"name": "row",
|
|
158471
|
+
"type": {
|
|
158472
|
+
"text": "number"
|
|
158473
|
+
}
|
|
158474
|
+
}
|
|
158475
|
+
],
|
|
158476
|
+
"description": "Scrolls drawn row `row` into view below the headings, and moves the\nwindow to it, before a key focuses it."
|
|
158477
|
+
},
|
|
156989
158478
|
{
|
|
156990
158479
|
"kind": "field",
|
|
156991
158480
|
"name": "reorder",
|
|
@@ -157092,6 +158581,17 @@
|
|
|
157092
158581
|
"description": "The rows in the order they are drawn: sorted by `sort`, and as written\nwhere there is no sort.\n\n**Drawn in order by assignment.** A manually assigned slot draws its nodes\nin the order they were assigned, so the rows move on screen and in the\naccessibility tree while the consumer's markup stays as it was written,\nwhich is what a framework holding those rows needs.",
|
|
157093
158582
|
"readonly": true
|
|
157094
158583
|
},
|
|
158584
|
+
{
|
|
158585
|
+
"kind": "method",
|
|
158586
|
+
"name": "arrange",
|
|
158587
|
+
"privacy": "private",
|
|
158588
|
+
"return": {
|
|
158589
|
+
"type": {
|
|
158590
|
+
"text": "Element[]"
|
|
158591
|
+
}
|
|
158592
|
+
},
|
|
158593
|
+
"description": "The rows in the order they are drawn, worked out again."
|
|
158594
|
+
},
|
|
157095
158595
|
{
|
|
157096
158596
|
"kind": "method",
|
|
157097
158597
|
"name": "nested",
|
|
@@ -157663,6 +159163,13 @@
|
|
|
157663
159163
|
},
|
|
157664
159164
|
"description": "Starts or stops watching the end of the table, against the box that\nscrolls it, or the page, with a screen of room below it, so the next rows\nare asked for before a reader reaches the last. List does the same."
|
|
157665
159165
|
},
|
|
159166
|
+
{
|
|
159167
|
+
"kind": "field",
|
|
159168
|
+
"name": "nearEnd",
|
|
159169
|
+
"privacy": "private",
|
|
159170
|
+
"readonly": true,
|
|
159171
|
+
"description": "Asks for more once a reader of a `windowed` table is within a screen of its end."
|
|
159172
|
+
},
|
|
157666
159173
|
{
|
|
157667
159174
|
"kind": "field",
|
|
157668
159175
|
"name": "endInView",
|
|
@@ -157817,19 +159324,6 @@
|
|
|
157817
159324
|
"module": "src/mixins/mixin-collection/mixin-collection.ts"
|
|
157818
159325
|
}
|
|
157819
159326
|
},
|
|
157820
|
-
{
|
|
157821
|
-
"kind": "field",
|
|
157822
|
-
"name": "hasRows",
|
|
157823
|
-
"type": {
|
|
157824
|
-
"text": "boolean"
|
|
157825
|
-
},
|
|
157826
|
-
"privacy": "protected",
|
|
157827
|
-
"readonly": true,
|
|
157828
|
-
"inheritedFrom": {
|
|
157829
|
-
"name": "MixinCollection",
|
|
157830
|
-
"module": "src/mixins/mixin-collection/mixin-collection.ts"
|
|
157831
|
-
}
|
|
157832
|
-
},
|
|
157833
159327
|
{
|
|
157834
159328
|
"kind": "method",
|
|
157835
159329
|
"name": "renderStatus",
|
|
@@ -158596,6 +160090,15 @@
|
|
|
158596
160090
|
"description": "What screen readers hear when the table stops being sorted.",
|
|
158597
160091
|
"fieldName": "unsortedLabel"
|
|
158598
160092
|
},
|
|
160093
|
+
{
|
|
160094
|
+
"name": "windowed",
|
|
160095
|
+
"type": {
|
|
160096
|
+
"text": "boolean"
|
|
160097
|
+
},
|
|
160098
|
+
"default": "false",
|
|
160099
|
+
"description": "Draws only the rows in view, with empty space in place of the rest, as\nData Table's `windowed` does. The table's box then scrolls, at the\nheight `--table-block-size` gives it in the styled tier, and the\nheadings stick to its top.\n\nOff by default. Windowing costs a scroll listener, a measurement per row\ndrawn, and a height on the table, and a table of twenty rows should pay\nnone of them.",
|
|
160100
|
+
"fieldName": "windowed"
|
|
160101
|
+
},
|
|
158599
160102
|
{
|
|
158600
160103
|
"name": "empty-text",
|
|
158601
160104
|
"type": {
|
|
@@ -158887,6 +160390,17 @@
|
|
|
158887
160390
|
"default": "undefined",
|
|
158888
160391
|
"description": "The table's rules this row holds, so the next ones replace them rather than pile up."
|
|
158889
160392
|
},
|
|
160393
|
+
{
|
|
160394
|
+
"kind": "method",
|
|
160395
|
+
"name": "nameByHeader",
|
|
160396
|
+
"privacy": "private",
|
|
160397
|
+
"return": {
|
|
160398
|
+
"type": {
|
|
160399
|
+
"text": "void"
|
|
160400
|
+
}
|
|
160401
|
+
},
|
|
160402
|
+
"description": "Names the row by its header cell, the cell with `header` among cells of\nvalues, or by its first cell where it has none, as React Aria's rows are\nnamed.\n\n**Named from its contents, a row read out its checkbox's name too**, \"Select\n412 412 main Passed\" in a `selectable` table, since the checkbox is a cell of\nthe row's own. Not on a server, which has no cells to point at, and not\nwhere a page named the row itself."
|
|
160403
|
+
},
|
|
158890
160404
|
{
|
|
158891
160405
|
"kind": "field",
|
|
158892
160406
|
"name": "handleClick",
|
|
@@ -164511,7 +166025,7 @@
|
|
|
164511
166025
|
},
|
|
164512
166026
|
"privacy": "private",
|
|
164513
166027
|
"default": "false",
|
|
164514
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
166028
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
164515
166029
|
"inheritedFrom": {
|
|
164516
166030
|
"name": "MixinField",
|
|
164517
166031
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -164951,6 +166465,50 @@
|
|
|
164951
166465
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
164952
166466
|
}
|
|
164953
166467
|
},
|
|
166468
|
+
{
|
|
166469
|
+
"kind": "field",
|
|
166470
|
+
"name": "updateRunning",
|
|
166471
|
+
"type": {
|
|
166472
|
+
"text": "boolean"
|
|
166473
|
+
},
|
|
166474
|
+
"privacy": "private",
|
|
166475
|
+
"default": "false",
|
|
166476
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
166477
|
+
"inheritedFrom": {
|
|
166478
|
+
"name": "HelixFormElement",
|
|
166479
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
166480
|
+
}
|
|
166481
|
+
},
|
|
166482
|
+
{
|
|
166483
|
+
"kind": "method",
|
|
166484
|
+
"name": "performUpdate",
|
|
166485
|
+
"privacy": "protected",
|
|
166486
|
+
"return": {
|
|
166487
|
+
"type": {
|
|
166488
|
+
"text": "void"
|
|
166489
|
+
}
|
|
166490
|
+
},
|
|
166491
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
166492
|
+
"inheritedFrom": {
|
|
166493
|
+
"name": "HelixElement",
|
|
166494
|
+
"module": "src/helix-element/helix-element.ts"
|
|
166495
|
+
}
|
|
166496
|
+
},
|
|
166497
|
+
{
|
|
166498
|
+
"kind": "method",
|
|
166499
|
+
"name": "runPendingUpdate",
|
|
166500
|
+
"privacy": "private",
|
|
166501
|
+
"return": {
|
|
166502
|
+
"type": {
|
|
166503
|
+
"text": "void"
|
|
166504
|
+
}
|
|
166505
|
+
},
|
|
166506
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
166507
|
+
"inheritedFrom": {
|
|
166508
|
+
"name": "HelixFormElement",
|
|
166509
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
166510
|
+
}
|
|
166511
|
+
},
|
|
164954
166512
|
{
|
|
164955
166513
|
"kind": "field",
|
|
164956
166514
|
"name": "willValidate",
|
|
@@ -164972,7 +166530,7 @@
|
|
|
164972
166530
|
"text": "boolean"
|
|
164973
166531
|
}
|
|
164974
166532
|
},
|
|
164975
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
166533
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
164976
166534
|
"inheritedFrom": {
|
|
164977
166535
|
"name": "HelixFormElement",
|
|
164978
166536
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -164981,6 +166539,20 @@
|
|
|
164981
166539
|
"text": "checkValidity() => boolean"
|
|
164982
166540
|
}
|
|
164983
166541
|
},
|
|
166542
|
+
{
|
|
166543
|
+
"kind": "field",
|
|
166544
|
+
"name": "checkInProgress",
|
|
166545
|
+
"type": {
|
|
166546
|
+
"text": "boolean"
|
|
166547
|
+
},
|
|
166548
|
+
"privacy": "private",
|
|
166549
|
+
"default": "false",
|
|
166550
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
166551
|
+
"inheritedFrom": {
|
|
166552
|
+
"name": "HelixFormElement",
|
|
166553
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
166554
|
+
}
|
|
166555
|
+
},
|
|
164984
166556
|
{
|
|
164985
166557
|
"kind": "method",
|
|
164986
166558
|
"name": "reportValidity",
|
|
@@ -165437,21 +167009,6 @@
|
|
|
165437
167009
|
"name": "HelixElement",
|
|
165438
167010
|
"module": "src/helix-element/helix-element.ts"
|
|
165439
167011
|
}
|
|
165440
|
-
},
|
|
165441
|
-
{
|
|
165442
|
-
"kind": "method",
|
|
165443
|
-
"name": "performUpdate",
|
|
165444
|
-
"privacy": "protected",
|
|
165445
|
-
"return": {
|
|
165446
|
-
"type": {
|
|
165447
|
-
"text": "void"
|
|
165448
|
-
}
|
|
165449
|
-
},
|
|
165450
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
165451
|
-
"inheritedFrom": {
|
|
165452
|
-
"name": "HelixElement",
|
|
165453
|
-
"module": "src/helix-element/helix-element.ts"
|
|
165454
|
-
}
|
|
165455
167012
|
}
|
|
165456
167013
|
],
|
|
165457
167014
|
"events": [
|
|
@@ -165830,7 +167387,7 @@
|
|
|
165830
167387
|
"declarations": [
|
|
165831
167388
|
{
|
|
165832
167389
|
"kind": "class",
|
|
165833
|
-
"description": "The list is a `TimePicker`, which you can also use on its own, for example in\na settings pane. This element adds the field, the overlay, and the form\nassociation, the same arrangement Date Input has with `DatePicker` and Color\nInput has with `ColorPicker`.\n\nYou can type a time or pick one. The list offers times at a step, and the\nfield lets you enter any time, such as `09:07`.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`, because that is what the form\nsubmits, what `min` and `max` compare against, and what sorts correctly as a\nstring. While idle, the field shows the time in the user's locale format.\nOnce the caret is in the field, it shows the value itself. You can type\n`14:30`, or a time as you write one, such as `2:30 PM`, `2.30pm`, or\n`14h30`, and the field reads it as you leave it, with AM and PM in the\nlocale's words.\n\nTyping sends `input` on each keystroke and `change` when you leave the\nfield. The trigger and ArrowDown open the list, and so does a press into the\nfield; Tab into the field opens nothing. The text field is a `combobox`\nwith `aria-haspopup=\"dialog\"`, `aria-expanded`, and `aria-controls`, since\nDown opens the list from it. In the list, the arrow keys, typed digits and PageUp and PageDown\nmove through the times, and Enter, Space or a click chooses one and closes\nthe panel. With `variant=\"wheels\"` each wheel moves the time as you turn it,\nthe panel stays open, and Enter or Escape closes it.\n\nWith `segmented`, the field is a row of segments in place of the text: an\nhour, a minute, and AM or PM where the clock has them, each set with digits\nor the arrow keys. Alt+Down opens the list from a segment. A `range` is two\nrows with a dash between them, the start and the end, and `multiple` keeps\nthe text.\n\nText that is not a time gives the form an empty value, as a native time\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the list on the chosen time. |\n| Alt with Down | Opens the list, from the text field or a segment. |\n| Enter | In the text field, takes the typed time and submits the form, as a native field does. In the list, chooses the highlighted time. |\n| Escape | Closes the list and puts focus back in the field. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: two hours, or fifteen minutes or seconds. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| A letter on the half of the day | Picks the half whose name starts with it, such as A for AM. |\n| Backspace, Delete on a segment |
|
|
167390
|
+
"description": "The list is a `TimePicker`, which you can also use on its own, for example in\na settings pane. This element adds the field, the overlay, and the form\nassociation, the same arrangement Date Input has with `DatePicker` and Color\nInput has with `ColorPicker`.\n\nYou can type a time or pick one. The list offers times at a step, and the\nfield lets you enter any time, such as `09:07`.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`, because that is what the form\nsubmits, what `min` and `max` compare against, and what sorts correctly as a\nstring. While idle, the field shows the time in the user's locale format.\nOnce the caret is in the field, it shows the value itself. You can type\n`14:30`, or a time as you write one, such as `2:30 PM`, `2.30pm`, or\n`14h30`, and the field reads it as you leave it, with AM and PM in the\nlocale's words.\n\nTyping sends `input` on each keystroke and `change` when you leave the\nfield. The trigger and ArrowDown open the list, and so does a press into the\nfield; Tab into the field opens nothing. The text field is a `combobox`\nwith `aria-haspopup=\"dialog\"`, `aria-expanded`, and `aria-controls`, since\nDown opens the list from it. In the list, the arrow keys, typed digits and PageUp and PageDown\nmove through the times, and Enter, Space or a click chooses one and closes\nthe panel. With `variant=\"wheels\"` each wheel moves the time as you turn it,\nthe panel stays open, and Enter or Escape closes it.\n\nWith `segmented`, the field is a row of segments in place of the text: an\nhour, a minute, and AM or PM where the clock has them, each set with digits\nor the arrow keys. Alt+Down opens the list from a segment. A `range` is two\nrows with a dash between them, the start and the end, and `multiple` keeps\nthe text.\n\nText that is not a time gives the form an empty value, as a native time\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the list on the chosen time. |\n| Alt with Down | Opens the list, from the text field or a segment. |\n| Enter | In the text field, takes the typed time and submits the form, as a native field does. In the list, chooses the highlighted time. |\n| Escape | Closes the list and puts focus back in the field. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: two hours, or fifteen minutes or seconds. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| A letter on the half of the day | Picks the half whose name starts with it, such as A for AM. |\n| Backspace, Delete on a segment | Take off its last digit, or move to the segment before where it is empty. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the list, the keys are `TimePicker`'s.",
|
|
165834
167391
|
"name": "HelixHeadlessTimeInput",
|
|
165835
167392
|
"cssParts": [
|
|
165836
167393
|
{
|
|
@@ -165985,6 +167542,10 @@
|
|
|
165985
167542
|
"description": "The filter field.",
|
|
165986
167543
|
"name": "picker-list-search-field"
|
|
165987
167544
|
},
|
|
167545
|
+
{
|
|
167546
|
+
"description": "The picker's button that chooses the current time, which Time Input does not draw.",
|
|
167547
|
+
"name": "picker-now"
|
|
167548
|
+
},
|
|
165988
167549
|
{
|
|
165989
167550
|
"description": "One time in the picker. Carries `data-between` inside a range.",
|
|
165990
167551
|
"name": "picker-option"
|
|
@@ -167169,6 +168730,29 @@
|
|
|
167169
168730
|
"module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
|
|
167170
168731
|
}
|
|
167171
168732
|
},
|
|
168733
|
+
{
|
|
168734
|
+
"kind": "method",
|
|
168735
|
+
"name": "erase",
|
|
168736
|
+
"privacy": "private",
|
|
168737
|
+
"return": {
|
|
168738
|
+
"type": {
|
|
168739
|
+
"text": "void"
|
|
168740
|
+
}
|
|
168741
|
+
},
|
|
168742
|
+
"parameters": [
|
|
168743
|
+
{
|
|
168744
|
+
"name": "element",
|
|
168745
|
+
"type": {
|
|
168746
|
+
"text": "HTMLElement"
|
|
168747
|
+
}
|
|
168748
|
+
}
|
|
168749
|
+
],
|
|
168750
|
+
"description": "Takes the last digit off the segment, or moves to the segment before it\nwhere this one is already empty, as React Aria's segments do. A reader\nclearing a date from its end holds Backspace and it empties right to\nleft.",
|
|
168751
|
+
"inheritedFrom": {
|
|
168752
|
+
"name": "MixinSegmentedField",
|
|
168753
|
+
"module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
|
|
168754
|
+
}
|
|
168755
|
+
},
|
|
167172
168756
|
{
|
|
167173
168757
|
"kind": "field",
|
|
167174
168758
|
"name": "composing",
|
|
@@ -168316,7 +169900,7 @@
|
|
|
168316
169900
|
},
|
|
168317
169901
|
"privacy": "private",
|
|
168318
169902
|
"default": "false",
|
|
168319
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
169903
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
168320
169904
|
"inheritedFrom": {
|
|
168321
169905
|
"name": "MixinField",
|
|
168322
169906
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -168756,6 +170340,50 @@
|
|
|
168756
170340
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
168757
170341
|
}
|
|
168758
170342
|
},
|
|
170343
|
+
{
|
|
170344
|
+
"kind": "field",
|
|
170345
|
+
"name": "updateRunning",
|
|
170346
|
+
"type": {
|
|
170347
|
+
"text": "boolean"
|
|
170348
|
+
},
|
|
170349
|
+
"privacy": "private",
|
|
170350
|
+
"default": "false",
|
|
170351
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
170352
|
+
"inheritedFrom": {
|
|
170353
|
+
"name": "HelixFormElement",
|
|
170354
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
170355
|
+
}
|
|
170356
|
+
},
|
|
170357
|
+
{
|
|
170358
|
+
"kind": "method",
|
|
170359
|
+
"name": "performUpdate",
|
|
170360
|
+
"privacy": "protected",
|
|
170361
|
+
"return": {
|
|
170362
|
+
"type": {
|
|
170363
|
+
"text": "void"
|
|
170364
|
+
}
|
|
170365
|
+
},
|
|
170366
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
170367
|
+
"inheritedFrom": {
|
|
170368
|
+
"name": "HelixElement",
|
|
170369
|
+
"module": "src/helix-element/helix-element.ts"
|
|
170370
|
+
}
|
|
170371
|
+
},
|
|
170372
|
+
{
|
|
170373
|
+
"kind": "method",
|
|
170374
|
+
"name": "runPendingUpdate",
|
|
170375
|
+
"privacy": "private",
|
|
170376
|
+
"return": {
|
|
170377
|
+
"type": {
|
|
170378
|
+
"text": "void"
|
|
170379
|
+
}
|
|
170380
|
+
},
|
|
170381
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
170382
|
+
"inheritedFrom": {
|
|
170383
|
+
"name": "HelixFormElement",
|
|
170384
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
170385
|
+
}
|
|
170386
|
+
},
|
|
168759
170387
|
{
|
|
168760
170388
|
"kind": "field",
|
|
168761
170389
|
"name": "willValidate",
|
|
@@ -168777,7 +170405,7 @@
|
|
|
168777
170405
|
"text": "boolean"
|
|
168778
170406
|
}
|
|
168779
170407
|
},
|
|
168780
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
170408
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
168781
170409
|
"inheritedFrom": {
|
|
168782
170410
|
"name": "HelixFormElement",
|
|
168783
170411
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -168786,6 +170414,20 @@
|
|
|
168786
170414
|
"text": "checkValidity() => boolean"
|
|
168787
170415
|
}
|
|
168788
170416
|
},
|
|
170417
|
+
{
|
|
170418
|
+
"kind": "field",
|
|
170419
|
+
"name": "checkInProgress",
|
|
170420
|
+
"type": {
|
|
170421
|
+
"text": "boolean"
|
|
170422
|
+
},
|
|
170423
|
+
"privacy": "private",
|
|
170424
|
+
"default": "false",
|
|
170425
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
170426
|
+
"inheritedFrom": {
|
|
170427
|
+
"name": "HelixFormElement",
|
|
170428
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
170429
|
+
}
|
|
170430
|
+
},
|
|
168789
170431
|
{
|
|
168790
170432
|
"kind": "method",
|
|
168791
170433
|
"name": "reportValidity",
|
|
@@ -169242,21 +170884,6 @@
|
|
|
169242
170884
|
"name": "HelixElement",
|
|
169243
170885
|
"module": "src/helix-element/helix-element.ts"
|
|
169244
170886
|
}
|
|
169245
|
-
},
|
|
169246
|
-
{
|
|
169247
|
-
"kind": "method",
|
|
169248
|
-
"name": "performUpdate",
|
|
169249
|
-
"privacy": "protected",
|
|
169250
|
-
"return": {
|
|
169251
|
-
"type": {
|
|
169252
|
-
"text": "void"
|
|
169253
|
-
}
|
|
169254
|
-
},
|
|
169255
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
169256
|
-
"inheritedFrom": {
|
|
169257
|
-
"name": "HelixElement",
|
|
169258
|
-
"module": "src/helix-element/helix-element.ts"
|
|
169259
|
-
}
|
|
169260
170887
|
}
|
|
169261
170888
|
],
|
|
169262
170889
|
"events": [
|
|
@@ -169957,7 +171584,7 @@
|
|
|
169957
171584
|
"declarations": [
|
|
169958
171585
|
{
|
|
169959
171586
|
"kind": "class",
|
|
169960
|
-
"description": "Shows the times at each `step` as a `Listbox`, which provides the keyboard\nbehavior, typeahead, scrolling into view, and announcements for a set of\noptions. `variant=\"wheels\"` shows a column each for the hour, the minute, and\nthe meridiem, and one for the second with `seconds`. Left and Right move\nbetween the wheels, and Tab does too.\n\n`hour-cycle` writes every time on a twelve or a twenty-four hour clock\nwhatever the locale, and `seconds` holds times to the second.\n\nThe step keeps the list usable. At the default of 15 minutes a day is 96\nrows, which people can scroll or type into. At 1 minute it is 1,440. Use the\nlist for the times your product offers, and Time Input for any time, the same\nway Date Input separates typing a date from picking one on the calendar.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`. A form submits that shape,\n`min` and `max` compare against it, and it sorts as a string. Each row's text\nfollows the person's own conventions, from `Intl`.\n\nThe chosen row is marked in the served markup. The listbox gets the answer as\n`.value`, and Lit SSR serializes no property binding, so without more the 96\nserved rows would carry no mark until the listbox upgrades and runs `place`.\nEach option also gets `selected`, an attribute binding that does serialize,\nand `place` then writes the same answer from the same value. This is the same\n`selected` you write on `Option` elsewhere in Helix, and Date Picker marks\nits choice in markup for the same reason. The list and the wheels both do\nthis, because each wheel is also a listbox.\n\n**Keyboard.** The list is one tab stop, and each wheel is one.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous time, or in a wheel to the next or the previous hour, minute, second, or half of the day. |\n| Home, End | Moves to the first or the last time, or the first or the last in a wheel. |\n| Page Down, Page Up | Moves by as many times as the list shows at once. |\n| Digits | Moves to the next time that starts with what you typed, such as `9` for 9:00. |\n| Enter, Space | Chooses the highlighted time. Moving chooses too, except under `manual` or with a `mode`. With a `mode`, Space adds or removes the time. |\n| Right, Left | In the wheels, moves to the next or the previous wheel, mirrored right to left. |\n| Tab | Moves to the next wheel, then out of the picker. |\n\n**ARIA.** The list is a `listbox` named by `label`, a slotted label, the\nhost's `aria-label` or its `aria-labelledby`. A development build warns\nwhere all four are empty. The list is described by the hint, or by the\nmessage in `feedback` in its place, and carries `aria-multiselectable` with\na `mode`. It carries `aria-invalid` while `feedback` says what is wrong,\nwhile it holds a time outside `min` and `max` or one the picker does not\noffer, and, for a `required` picker with no time, once the reader has\nchosen one or a form has refused the picker. The wheels\nare a `group` with that name, holding one `listbox` per wheel, named \"Hour\",\n\"Minute\", \"Second\" and \"AM/PM\" in the page's language, and each described\nthe same way.",
|
|
171587
|
+
"description": "Shows the times at each `step` as a `Listbox`, which provides the keyboard\nbehavior, typeahead, scrolling into view, and announcements for a set of\noptions. `variant=\"wheels\"` shows a column each for the hour, the minute, and\nthe meridiem, and one for the second with `seconds`. Left and Right move\nbetween the wheels, and Tab does too.\n\n`hour-cycle` writes every time on a twelve or a twenty-four hour clock\nwhatever the locale, and `seconds` holds times to the second. `show-now`\ndraws a button that chooses the current time, on the step and inside the\nbounds.\n\nThe step keeps the list usable. At the default of 15 minutes a day is 96\nrows, which people can scroll or type into. At 1 minute it is 1,440. Use the\nlist for the times your product offers, and Time Input for any time, the same\nway Date Input separates typing a date from picking one on the calendar.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`. A form submits that shape,\n`min` and `max` compare against it, and it sorts as a string. Each row's text\nfollows the person's own conventions, from `Intl`.\n\nThe chosen row is marked in the served markup. The listbox gets the answer as\n`.value`, and Lit SSR serializes no property binding, so without more the 96\nserved rows would carry no mark until the listbox upgrades and runs `place`.\nEach option also gets `selected`, an attribute binding that does serialize,\nand `place` then writes the same answer from the same value. This is the same\n`selected` you write on `Option` elsewhere in Helix, and Date Picker marks\nits choice in markup for the same reason. The list and the wheels both do\nthis, because each wheel is also a listbox.\n\n**Keyboard.** The list is one tab stop, and each wheel is one.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous time, or in a wheel to the next or the previous hour, minute, second, or half of the day. |\n| Home, End | Moves to the first or the last time, or the first or the last in a wheel. |\n| Page Down, Page Up | Moves by as many times as the list shows at once. |\n| Digits | Moves to the next time that starts with what you typed, such as `9` for 9:00. |\n| Enter, Space | Chooses the highlighted time. Moving chooses too, except under `manual` or with a `mode`. With a `mode`, Space adds or removes the time. |\n| Right, Left | In the wheels, moves to the next or the previous wheel, mirrored right to left. |\n| Tab | Moves to the next wheel, then out of the picker. |\n\n**ARIA.** The list is a `listbox` named by `label`, a slotted label, the\nhost's `aria-label` or its `aria-labelledby`. A development build warns\nwhere all four are empty. The list is described by the hint, or by the\nmessage in `feedback` in its place, and carries `aria-multiselectable` with\na `mode`. It carries `aria-invalid` while `feedback` says what is wrong,\nwhile it holds a time outside `min` and `max` or one the picker does not\noffer, and, for a `required` picker with no time, once the reader has\nchosen one or a form has refused the picker. The wheels\nare a `group` with that name, holding one `listbox` per wheel, named \"Hour\",\n\"Minute\", \"Second\" and \"AM/PM\" in the page's language, and each described\nthe same way.",
|
|
169961
171588
|
"name": "HelixHeadlessTimePicker",
|
|
169962
171589
|
"cssParts": [
|
|
169963
171590
|
{
|
|
@@ -170080,6 +171707,10 @@
|
|
|
170080
171707
|
"description": "The filter field.",
|
|
170081
171708
|
"name": "list-search-field"
|
|
170082
171709
|
},
|
|
171710
|
+
{
|
|
171711
|
+
"description": "The button that chooses the current time, drawn with `show-now`.",
|
|
171712
|
+
"name": "now"
|
|
171713
|
+
},
|
|
170083
171714
|
{
|
|
170084
171715
|
"description": "One time in the list. It carries `data-between` inside a range, and inside the run to the time under the pointer while a range waits for its second end.",
|
|
170085
171716
|
"name": "option"
|
|
@@ -170293,6 +171924,19 @@
|
|
|
170293
171924
|
"attribute": "mode",
|
|
170294
171925
|
"reflects": true
|
|
170295
171926
|
},
|
|
171927
|
+
{
|
|
171928
|
+
"kind": "field",
|
|
171929
|
+
"name": "nowLabel",
|
|
171930
|
+
"type": {
|
|
171931
|
+
"text": "string"
|
|
171932
|
+
},
|
|
171933
|
+
"default": "'Now'",
|
|
171934
|
+
"description": "The words on the button that chooses the current time, drawn with\n`show-now`.",
|
|
171935
|
+
"attribute": "now-label",
|
|
171936
|
+
"helix": {
|
|
171937
|
+
"words": true
|
|
171938
|
+
}
|
|
171939
|
+
},
|
|
170296
171940
|
{
|
|
170297
171941
|
"kind": "field",
|
|
170298
171942
|
"name": "rangeOverflowMessage",
|
|
@@ -170484,6 +172128,72 @@
|
|
|
170484
172128
|
"readonly": true,
|
|
170485
172129
|
"description": "Takes what the list announced and constrains it to what the mode allows.\n\nThe listbox is put in `multiple` for both modes, because that is what marks\nmore than one row and toggles on press. A range then differs only in what is\nkept: two, and a third pick starts again from that third one. Working out\nwhich is newest by difference rather than by position, since a toggle can\nremove as easily as add and the announced list is a set rather than a\nsequence."
|
|
170486
172130
|
},
|
|
172131
|
+
{
|
|
172132
|
+
"kind": "method",
|
|
172133
|
+
"name": "choose",
|
|
172134
|
+
"privacy": "private",
|
|
172135
|
+
"return": {
|
|
172136
|
+
"type": {
|
|
172137
|
+
"text": "boolean"
|
|
172138
|
+
}
|
|
172139
|
+
},
|
|
172140
|
+
"parameters": [
|
|
172141
|
+
{
|
|
172142
|
+
"name": "announced",
|
|
172143
|
+
"type": {
|
|
172144
|
+
"text": "string"
|
|
172145
|
+
}
|
|
172146
|
+
}
|
|
172147
|
+
],
|
|
172148
|
+
"description": "Requests the times a pick announced, kept to what the mode allows, and\nreturns whether the value changed."
|
|
172149
|
+
},
|
|
172150
|
+
{
|
|
172151
|
+
"kind": "method",
|
|
172152
|
+
"name": "selectNow",
|
|
172153
|
+
"return": {
|
|
172154
|
+
"type": {
|
|
172155
|
+
"text": "boolean"
|
|
172156
|
+
}
|
|
172157
|
+
},
|
|
172158
|
+
"description": "Chooses the current time, as a press on the `show-now` button does, and\nreturns whether the value changed.\n\nThe time is read off the reader's clock and moved to the nearest time on\noffer that is not barred, so it falls on the `step` and inside `min` and\n`max`. It is requested as a pick is, so `helix-before-change` can cancel\nit. With a `mode` the time joins the times held, and a range that holds\ntwo starts over from it, as a third pick does.",
|
|
172159
|
+
"type": {
|
|
172160
|
+
"text": "selectNow() => boolean"
|
|
172161
|
+
}
|
|
172162
|
+
},
|
|
172163
|
+
{
|
|
172164
|
+
"kind": "method",
|
|
172165
|
+
"name": "highlightNearest",
|
|
172166
|
+
"privacy": "private",
|
|
172167
|
+
"return": {
|
|
172168
|
+
"type": {
|
|
172169
|
+
"text": "void"
|
|
172170
|
+
}
|
|
172171
|
+
},
|
|
172172
|
+
"description": "Puts the list's highlight on the offered time nearest one held between two\nsteps, so the arrows move from there.\n\nNo row holds `14:07` at a step of 15, so the list had nothing to move\nfrom: Down went to the top of the list, and in a list that chooses as it\nmoves, the value became 00:00. Down now goes to 14:15."
|
|
172173
|
+
},
|
|
172174
|
+
{
|
|
172175
|
+
"kind": "field",
|
|
172176
|
+
"name": "handleListFocus",
|
|
172177
|
+
"privacy": "private",
|
|
172178
|
+
"readonly": true
|
|
172179
|
+
},
|
|
172180
|
+
{
|
|
172181
|
+
"kind": "field",
|
|
172182
|
+
"name": "handleNow",
|
|
172183
|
+
"privacy": "private",
|
|
172184
|
+
"readonly": true
|
|
172185
|
+
},
|
|
172186
|
+
{
|
|
172187
|
+
"kind": "method",
|
|
172188
|
+
"name": "renderNow",
|
|
172189
|
+
"privacy": "private",
|
|
172190
|
+
"return": {
|
|
172191
|
+
"type": {
|
|
172192
|
+
"text": "TemplateResult | typeof nothing"
|
|
172193
|
+
}
|
|
172194
|
+
},
|
|
172195
|
+
"description": "The button that chooses the current time, drawn with `show-now`."
|
|
172196
|
+
},
|
|
170487
172197
|
{
|
|
170488
172198
|
"kind": "field",
|
|
170489
172199
|
"name": "previewed",
|
|
@@ -170651,6 +172361,16 @@
|
|
|
170651
172361
|
"description": "Whether times carry their seconds.\n\nThe value becomes `HH:mm:ss`, each time is written with its seconds, the\nwheels take a column of seconds, and `step` counts seconds, the unit\n`<input type=\"time\">` counts in. A list at a step of one second is 86,400\nrows, so give `seconds` a `step` and bounds that keep it a list, or use\nthe wheels.",
|
|
170652
172362
|
"attribute": "seconds"
|
|
170653
172363
|
},
|
|
172364
|
+
{
|
|
172365
|
+
"kind": "field",
|
|
172366
|
+
"name": "showNow",
|
|
172367
|
+
"type": {
|
|
172368
|
+
"text": "boolean"
|
|
172369
|
+
},
|
|
172370
|
+
"default": "false",
|
|
172371
|
+
"description": "Draws a button under the times that chooses the current time, as\n`selectNow()` does.\n\nFor a form about something happening now, such as a shift starting or a\ndose taken, where the reader would otherwise scroll to the time on the\nclock. The button is a tab stop after the times, and its words are\n`now-label`.",
|
|
172372
|
+
"attribute": "show-now"
|
|
172373
|
+
},
|
|
170654
172374
|
{
|
|
170655
172375
|
"kind": "field",
|
|
170656
172376
|
"name": "step",
|
|
@@ -171462,6 +173182,50 @@
|
|
|
171462
173182
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
171463
173183
|
}
|
|
171464
173184
|
},
|
|
173185
|
+
{
|
|
173186
|
+
"kind": "field",
|
|
173187
|
+
"name": "updateRunning",
|
|
173188
|
+
"type": {
|
|
173189
|
+
"text": "boolean"
|
|
173190
|
+
},
|
|
173191
|
+
"privacy": "private",
|
|
173192
|
+
"default": "false",
|
|
173193
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
173194
|
+
"inheritedFrom": {
|
|
173195
|
+
"name": "HelixFormElement",
|
|
173196
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
173197
|
+
}
|
|
173198
|
+
},
|
|
173199
|
+
{
|
|
173200
|
+
"kind": "method",
|
|
173201
|
+
"name": "performUpdate",
|
|
173202
|
+
"privacy": "protected",
|
|
173203
|
+
"return": {
|
|
173204
|
+
"type": {
|
|
173205
|
+
"text": "void"
|
|
173206
|
+
}
|
|
173207
|
+
},
|
|
173208
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
173209
|
+
"inheritedFrom": {
|
|
173210
|
+
"name": "HelixElement",
|
|
173211
|
+
"module": "src/helix-element/helix-element.ts"
|
|
173212
|
+
}
|
|
173213
|
+
},
|
|
173214
|
+
{
|
|
173215
|
+
"kind": "method",
|
|
173216
|
+
"name": "runPendingUpdate",
|
|
173217
|
+
"privacy": "private",
|
|
173218
|
+
"return": {
|
|
173219
|
+
"type": {
|
|
173220
|
+
"text": "void"
|
|
173221
|
+
}
|
|
173222
|
+
},
|
|
173223
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
173224
|
+
"inheritedFrom": {
|
|
173225
|
+
"name": "HelixFormElement",
|
|
173226
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
173227
|
+
}
|
|
173228
|
+
},
|
|
171465
173229
|
{
|
|
171466
173230
|
"kind": "field",
|
|
171467
173231
|
"name": "willValidate",
|
|
@@ -171483,7 +173247,7 @@
|
|
|
171483
173247
|
"text": "boolean"
|
|
171484
173248
|
}
|
|
171485
173249
|
},
|
|
171486
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
173250
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
171487
173251
|
"inheritedFrom": {
|
|
171488
173252
|
"name": "HelixFormElement",
|
|
171489
173253
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -171492,6 +173256,20 @@
|
|
|
171492
173256
|
"text": "checkValidity() => boolean"
|
|
171493
173257
|
}
|
|
171494
173258
|
},
|
|
173259
|
+
{
|
|
173260
|
+
"kind": "field",
|
|
173261
|
+
"name": "checkInProgress",
|
|
173262
|
+
"type": {
|
|
173263
|
+
"text": "boolean"
|
|
173264
|
+
},
|
|
173265
|
+
"privacy": "private",
|
|
173266
|
+
"default": "false",
|
|
173267
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
173268
|
+
"inheritedFrom": {
|
|
173269
|
+
"name": "HelixFormElement",
|
|
173270
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
173271
|
+
}
|
|
173272
|
+
},
|
|
171495
173273
|
{
|
|
171496
173274
|
"kind": "method",
|
|
171497
173275
|
"name": "reportValidity",
|
|
@@ -171948,21 +173726,6 @@
|
|
|
171948
173726
|
"name": "HelixElement",
|
|
171949
173727
|
"module": "src/helix-element/helix-element.ts"
|
|
171950
173728
|
}
|
|
171951
|
-
},
|
|
171952
|
-
{
|
|
171953
|
-
"kind": "method",
|
|
171954
|
-
"name": "performUpdate",
|
|
171955
|
-
"privacy": "protected",
|
|
171956
|
-
"return": {
|
|
171957
|
-
"type": {
|
|
171958
|
-
"text": "void"
|
|
171959
|
-
}
|
|
171960
|
-
},
|
|
171961
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
171962
|
-
"inheritedFrom": {
|
|
171963
|
-
"name": "HelixElement",
|
|
171964
|
-
"module": "src/helix-element/helix-element.ts"
|
|
171965
|
-
}
|
|
171966
173729
|
}
|
|
171967
173730
|
],
|
|
171968
173731
|
"events": [
|
|
@@ -172113,6 +173876,15 @@
|
|
|
172113
173876
|
"description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end with everything between\nthem shown as part of the answer, `multiple` holds any number, and both are\ncarried as one comma-separated value: the same shape `DatePicker` uses,\nbecause it is the same question asked of a different unit.\n\n**A range is two picks, and a third starts over.** That is the calendar's\nbehavior and a reader who has met one has met both. The alternative, a\nseparate \"from\" and \"to\" control, is two answers to what a product asks as\none, and it makes the between part impossible to show.\n\n**Neither works on wheels and the variant falls back.** A range on\nwheels is two sets of wheels, which is two controls; a multiple is a set,\nand a wheel has exactly one value by construction. Rather than draw\nsomething that cannot say what it holds, `wheels` renders as a list\nwhenever a mode is set.",
|
|
172114
173877
|
"fieldName": "mode"
|
|
172115
173878
|
},
|
|
173879
|
+
{
|
|
173880
|
+
"name": "now-label",
|
|
173881
|
+
"type": {
|
|
173882
|
+
"text": "string"
|
|
173883
|
+
},
|
|
173884
|
+
"default": "'Now'",
|
|
173885
|
+
"description": "The words on the button that chooses the current time, drawn with\n`show-now`.",
|
|
173886
|
+
"fieldName": "nowLabel"
|
|
173887
|
+
},
|
|
172116
173888
|
{
|
|
172117
173889
|
"name": "range-overflow-message",
|
|
172118
173890
|
"type": {
|
|
@@ -172166,6 +173938,15 @@
|
|
|
172166
173938
|
"description": "Whether times carry their seconds.\n\nThe value becomes `HH:mm:ss`, each time is written with its seconds, the\nwheels take a column of seconds, and `step` counts seconds, the unit\n`<input type=\"time\">` counts in. A list at a step of one second is 86,400\nrows, so give `seconds` a `step` and bounds that keep it a list, or use\nthe wheels.",
|
|
172167
173939
|
"fieldName": "seconds"
|
|
172168
173940
|
},
|
|
173941
|
+
{
|
|
173942
|
+
"name": "show-now",
|
|
173943
|
+
"type": {
|
|
173944
|
+
"text": "boolean"
|
|
173945
|
+
},
|
|
173946
|
+
"default": "false",
|
|
173947
|
+
"description": "Draws a button under the times that chooses the current time, as\n`selectNow()` does.\n\nFor a form about something happening now, such as a shift starting or a\ndose taken, where the reader would otherwise scroll to the time on the\nclock. The button is a tab stop after the times, and its words are\n`now-label`.",
|
|
173948
|
+
"fieldName": "showNow"
|
|
173949
|
+
},
|
|
172169
173950
|
{
|
|
172170
173951
|
"name": "step",
|
|
172171
173952
|
"type": {
|
|
@@ -176638,7 +178419,7 @@
|
|
|
176638
178419
|
},
|
|
176639
178420
|
"privacy": "private",
|
|
176640
178421
|
"default": "false",
|
|
176641
|
-
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
178422
|
+
"description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`.",
|
|
176642
178423
|
"inheritedFrom": {
|
|
176643
178424
|
"name": "MixinField",
|
|
176644
178425
|
"module": "src/mixins/mixin-field/mixin-field.ts"
|
|
@@ -177078,6 +178859,50 @@
|
|
|
177078
178859
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
177079
178860
|
}
|
|
177080
178861
|
},
|
|
178862
|
+
{
|
|
178863
|
+
"kind": "field",
|
|
178864
|
+
"name": "updateRunning",
|
|
178865
|
+
"type": {
|
|
178866
|
+
"text": "boolean"
|
|
178867
|
+
},
|
|
178868
|
+
"privacy": "private",
|
|
178869
|
+
"default": "false",
|
|
178870
|
+
"description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
|
|
178871
|
+
"inheritedFrom": {
|
|
178872
|
+
"name": "HelixFormElement",
|
|
178873
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
178874
|
+
}
|
|
178875
|
+
},
|
|
178876
|
+
{
|
|
178877
|
+
"kind": "method",
|
|
178878
|
+
"name": "performUpdate",
|
|
178879
|
+
"privacy": "protected",
|
|
178880
|
+
"return": {
|
|
178881
|
+
"type": {
|
|
178882
|
+
"text": "void"
|
|
178883
|
+
}
|
|
178884
|
+
},
|
|
178885
|
+
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
178886
|
+
"inheritedFrom": {
|
|
178887
|
+
"name": "HelixElement",
|
|
178888
|
+
"module": "src/helix-element/helix-element.ts"
|
|
178889
|
+
}
|
|
178890
|
+
},
|
|
178891
|
+
{
|
|
178892
|
+
"kind": "method",
|
|
178893
|
+
"name": "runPendingUpdate",
|
|
178894
|
+
"privacy": "private",
|
|
178895
|
+
"return": {
|
|
178896
|
+
"type": {
|
|
178897
|
+
"text": "void"
|
|
178898
|
+
}
|
|
178899
|
+
},
|
|
178900
|
+
"description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.",
|
|
178901
|
+
"inheritedFrom": {
|
|
178902
|
+
"name": "HelixFormElement",
|
|
178903
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
178904
|
+
}
|
|
178905
|
+
},
|
|
177081
178906
|
{
|
|
177082
178907
|
"kind": "field",
|
|
177083
178908
|
"name": "willValidate",
|
|
@@ -177099,7 +178924,7 @@
|
|
|
177099
178924
|
"text": "boolean"
|
|
177100
178925
|
}
|
|
177101
178926
|
},
|
|
177102
|
-
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot.",
|
|
178927
|
+
"description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
|
|
177103
178928
|
"inheritedFrom": {
|
|
177104
178929
|
"name": "HelixFormElement",
|
|
177105
178930
|
"module": "src/helix-form-element/helix-form-element.ts"
|
|
@@ -177108,6 +178933,20 @@
|
|
|
177108
178933
|
"text": "checkValidity() => boolean"
|
|
177109
178934
|
}
|
|
177110
178935
|
},
|
|
178936
|
+
{
|
|
178937
|
+
"kind": "field",
|
|
178938
|
+
"name": "checkInProgress",
|
|
178939
|
+
"type": {
|
|
178940
|
+
"text": "boolean"
|
|
178941
|
+
},
|
|
178942
|
+
"privacy": "private",
|
|
178943
|
+
"default": "false",
|
|
178944
|
+
"description": "Whether `checkValidity()` is running, set only for the `invalid` it fires.",
|
|
178945
|
+
"inheritedFrom": {
|
|
178946
|
+
"name": "HelixFormElement",
|
|
178947
|
+
"module": "src/helix-form-element/helix-form-element.ts"
|
|
178948
|
+
}
|
|
178949
|
+
},
|
|
177111
178950
|
{
|
|
177112
178951
|
"kind": "method",
|
|
177113
178952
|
"name": "reportValidity",
|
|
@@ -177576,21 +179415,6 @@
|
|
|
177576
179415
|
"name": "HelixElement",
|
|
177577
179416
|
"module": "src/helix-element/helix-element.ts"
|
|
177578
179417
|
}
|
|
177579
|
-
},
|
|
177580
|
-
{
|
|
177581
|
-
"kind": "method",
|
|
177582
|
-
"name": "performUpdate",
|
|
177583
|
-
"privacy": "protected",
|
|
177584
|
-
"return": {
|
|
177585
|
-
"type": {
|
|
177586
|
-
"text": "void"
|
|
177587
|
-
}
|
|
177588
|
-
},
|
|
177589
|
-
"description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
|
|
177590
|
-
"inheritedFrom": {
|
|
177591
|
-
"name": "HelixElement",
|
|
177592
|
-
"module": "src/helix-element/helix-element.ts"
|
|
177593
|
-
}
|
|
177594
179418
|
}
|
|
177595
179419
|
],
|
|
177596
179420
|
"events": [
|
|
@@ -192618,7 +194442,7 @@
|
|
|
192618
194442
|
"declarations": [
|
|
192619
194443
|
{
|
|
192620
194444
|
"kind": "class",
|
|
192621
|
-
"description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. `min-column-width` lays out as many\ncolumns as fit the box instead, as React Aria's grid layout does with its\nsmallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns\nof a grid, by a number of pixels the list counts in each row's place.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Escape | Lets go of every chosen item, in a list with `selection-mode`. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. When the row holding the tab stop scrolls away, the\nstop moves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. Escape lets go of every chosen item, and keeps the\nkey from the dialog or menu around the list while there was something to\nlet go of. `value` holds the chosen items' keys, separated by commas, in\nthe order of the set: `key-field` names each item's key, and a string or a\nnumber item is its own key. A change asks with `helix-before-change` and\ntells with `change`. Each row is an `option` marked `aria-selected`, so a\nrow's own links and buttons are not reached there: keep those to a list\nwithout `selection-mode`.\n\n`selection-behavior=\"replace\"` selects the item pressed alone, as a file\nlist does, and the arrow keys carry the selection with them. Control or\nCommand with a press or with Space adds or takes out one item, and with an\narrow moves without selecting.\n\n**Disabled items.** `disabled-keys` names items by their keys, separated by\ncommas. Their rows carry `aria-disabled`, the keys and typing pass over\nthem, and a press, Space, or Control with A does not select them.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\nThe list takes the `empty` state while it has read its items and holds none,\nand the `loading` state while `loading` is set, so your stylesheet can\nchange the box around it for either. A list with no name is reported once\nin a development build. Name it with `label` or `aria-label`.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
|
|
194445
|
+
"description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. `min-column-width` lays out as many\ncolumns as fit the box instead, as React Aria's grid layout does with its\nsmallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns\nof a grid, by a number of pixels the list counts in each row's place.\n\n**Across.** `orientation=\"horizontal\"` lays the items out along a line and\nscrolls it sideways, as a strip of cards does, windowed the same way:\n`estimate` is then an item's width, and the box needs an inline size.\n\n**Sections.** `section-field` names the field of each item that says which\nsection it is in, and the list draws a header before each section's items,\nas React Aria's list box sections do. Each section is an element with the\n`group` role, named by its header, which is its first child and carries\n`data-header`, so your stylesheet styles it, such as with `position:\nsticky`. A section starts wherever the field changes, so give the items in\norder. The window counts the headers with the items, and a section the\nwindow starts inside is drawn with its header. `renderSection` draws a\nheader of your own.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. In a list that runs across, moves to the next or the previous item the same way, and Down and Up are left to the row. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Escape | Lets go of every chosen item, in a list with `selection-mode`. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. When the row holding the tab stop scrolls away, the\nstop moves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. Escape lets go of every chosen item, and keeps the\nkey from the dialog or menu around the list while there was something to\nlet go of. `value` holds the chosen items' keys, separated by commas, in\nthe order of the set: `key-field` names each item's key, and a string or a\nnumber item is its own key. A change asks with `helix-before-change` and\ntells with `change`. Each row is an `option` marked `aria-selected`, so a\nrow's own links and buttons are not reached there: keep those to a list\nwithout `selection-mode`.\n\n`selection-behavior=\"replace\"` selects the item pressed alone, as a file\nlist does, and the arrow keys carry the selection with them. Control or\nCommand with a press or with Space adds or takes out one item, and with an\narrow moves without selecting.\n\n**Disabled items.** `disabled-keys` names items by their keys, separated by\ncommas. Their rows carry `aria-disabled`, the keys and typing pass over\nthem, and a press, Space, or Control with A does not select them.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\nThe list takes the `empty` state while it has read its items and holds none,\nand the `loading` state while `loading` is set, so your stylesheet can\nchange the box around it for either. A list with no name is reported once\nin a development build. Name it with `label` or `aria-label`.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
|
|
192622
194446
|
"name": "HelixHeadlessVirtualList",
|
|
192623
194447
|
"cssParts": [
|
|
192624
194448
|
{
|
|
@@ -192798,6 +194622,16 @@
|
|
|
192798
194622
|
"description": "The narrowest a column of a grid may be, in pixels. Set, the list lays\nout as many columns as fit the box at that width, at least one, and\nfollows the box as it resizes, which `columns` then does not decide.",
|
|
192799
194623
|
"attribute": "min-column-width"
|
|
192800
194624
|
},
|
|
194625
|
+
{
|
|
194626
|
+
"kind": "field",
|
|
194627
|
+
"name": "orientation",
|
|
194628
|
+
"type": {
|
|
194629
|
+
"text": "'horizontal' | 'vertical'"
|
|
194630
|
+
},
|
|
194631
|
+
"default": "'vertical'",
|
|
194632
|
+
"description": "Which way the list runs. `horizontal` lays the items out along a line\nand scrolls it sideways: Left and Right move between items, the other\nway round on a right-to-left page, and `estimate` is an item's width. A\ngrid always runs down.",
|
|
194633
|
+
"attribute": "orientation"
|
|
194634
|
+
},
|
|
192801
194635
|
{
|
|
192802
194636
|
"kind": "field",
|
|
192803
194637
|
"name": "renderItem",
|
|
@@ -192806,6 +194640,24 @@
|
|
|
192806
194640
|
},
|
|
192807
194641
|
"description": "Draws one item into its row, given the item and its index. Set it as a\nproperty.\n\nIt returns what Lit renders: a template from `html`, a string, or a DOM\nnode. The list wraps each result in a `<div>` that carries the row's role\nand place in the set. Where it is unset, the row `<template>` is used."
|
|
192808
194642
|
},
|
|
194643
|
+
{
|
|
194644
|
+
"kind": "field",
|
|
194645
|
+
"name": "renderSection",
|
|
194646
|
+
"type": {
|
|
194647
|
+
"text": "VirtualListSectionRenderer | undefined"
|
|
194648
|
+
},
|
|
194649
|
+
"description": "Draws each section's header, given its name and its place among the\nsections, for a list given `section-field`. Set it as a property. Where\nit is unset, the header is the name as text."
|
|
194650
|
+
},
|
|
194651
|
+
{
|
|
194652
|
+
"kind": "field",
|
|
194653
|
+
"name": "sectionField",
|
|
194654
|
+
"type": {
|
|
194655
|
+
"text": "string"
|
|
194656
|
+
},
|
|
194657
|
+
"default": "''",
|
|
194658
|
+
"description": "The field of each item that names its section, as a key or a path of\nkeys. Set, the items are drawn in sections: a header, then the items, in\nan element with the `group` role that the header names. A section starts\nwherever the field changes, so give the items in order. A list of one\ncolumn only.",
|
|
194659
|
+
"attribute": "section-field"
|
|
194660
|
+
},
|
|
192809
194661
|
{
|
|
192810
194662
|
"kind": "field",
|
|
192811
194663
|
"name": "selectionBehavior",
|
|
@@ -192978,7 +194830,7 @@
|
|
|
192978
194830
|
"name": "virtualize",
|
|
192979
194831
|
"privacy": "private",
|
|
192980
194832
|
"readonly": true,
|
|
192981
|
-
"default": "new VirtualizeController(this, { container: () => this.partNamed('viewport'), count: () => Math.ceil(this.data.length / this.across), estimate: () => this.estimate, gap: () => this.space, measured: () => this.measured, rows: () => this.lines(), })"
|
|
194833
|
+
"default": "new VirtualizeController(this, { container: () => this.partNamed('viewport'), count: () => this.sections ? this.data.length + this.sections.starts.length : Math.ceil(this.data.length / this.across), estimate: () => this.estimate, gap: () => this.space, horizontal: () => this.horizontal, measured: () => this.measured, rows: () => this.lines(), })"
|
|
192982
194834
|
},
|
|
192983
194835
|
{
|
|
192984
194836
|
"kind": "field",
|
|
@@ -193068,6 +194920,54 @@
|
|
|
193068
194920
|
],
|
|
193069
194921
|
"description": "The items a span of lines holds."
|
|
193070
194922
|
},
|
|
194923
|
+
{
|
|
194924
|
+
"kind": "method",
|
|
194925
|
+
"name": "lineOf",
|
|
194926
|
+
"privacy": "private",
|
|
194927
|
+
"return": {
|
|
194928
|
+
"type": {
|
|
194929
|
+
"text": "number"
|
|
194930
|
+
}
|
|
194931
|
+
},
|
|
194932
|
+
"parameters": [
|
|
194933
|
+
{
|
|
194934
|
+
"name": "at",
|
|
194935
|
+
"type": {
|
|
194936
|
+
"text": "number"
|
|
194937
|
+
}
|
|
194938
|
+
}
|
|
194939
|
+
],
|
|
194940
|
+
"description": "The line item `at` is on: its entry in a list with sections."
|
|
194941
|
+
},
|
|
194942
|
+
{
|
|
194943
|
+
"kind": "field",
|
|
194944
|
+
"name": "horizontal",
|
|
194945
|
+
"type": {
|
|
194946
|
+
"text": "boolean"
|
|
194947
|
+
},
|
|
194948
|
+
"privacy": "private",
|
|
194949
|
+
"description": "Whether the list runs across, which a grid never does.",
|
|
194950
|
+
"readonly": true
|
|
194951
|
+
},
|
|
194952
|
+
{
|
|
194953
|
+
"kind": "field",
|
|
194954
|
+
"name": "sectionsRead",
|
|
194955
|
+
"type": {
|
|
194956
|
+
"text": "{ data: readonly unknown[]; field: string; sections: Sections } | undefined"
|
|
194957
|
+
},
|
|
194958
|
+
"privacy": "private",
|
|
194959
|
+
"description": "The sections and the items they were read from, kept until either changes."
|
|
194960
|
+
},
|
|
194961
|
+
{
|
|
194962
|
+
"kind": "field",
|
|
194963
|
+
"name": "sections",
|
|
194964
|
+
"type": {
|
|
194965
|
+
"text": "Sections | undefined"
|
|
194966
|
+
},
|
|
194967
|
+
"privacy": "private",
|
|
194968
|
+
"description": "The sections `section-field` divides the items into, in a list of one column.",
|
|
194969
|
+
"readonly": true
|
|
194970
|
+
},
|
|
193071
194971
|
{
|
|
193072
194972
|
"kind": "method",
|
|
193073
194973
|
"name": "scrollToIndex",
|
|
@@ -193265,6 +195165,25 @@
|
|
|
193265
195165
|
],
|
|
193266
195166
|
"description": "The item a row element drew, for an element that is one of the rows."
|
|
193267
195167
|
},
|
|
195168
|
+
{
|
|
195169
|
+
"kind": "method",
|
|
195170
|
+
"name": "isRow",
|
|
195171
|
+
"privacy": "private",
|
|
195172
|
+
"return": {
|
|
195173
|
+
"type": {
|
|
195174
|
+
"text": "node is HTMLElement"
|
|
195175
|
+
}
|
|
195176
|
+
},
|
|
195177
|
+
"parameters": [
|
|
195178
|
+
{
|
|
195179
|
+
"name": "node",
|
|
195180
|
+
"type": {
|
|
195181
|
+
"text": "unknown"
|
|
195182
|
+
}
|
|
195183
|
+
}
|
|
195184
|
+
],
|
|
195185
|
+
"description": "Whether a node is one of the rows: a child, or a child of a section."
|
|
195186
|
+
},
|
|
193268
195187
|
{
|
|
193269
195188
|
"kind": "method",
|
|
193270
195189
|
"name": "rowFor",
|
|
@@ -193590,6 +195509,68 @@
|
|
|
193590
195509
|
},
|
|
193591
195510
|
"description": "Puts the windowed rows into the light DOM, and takes the rest out.\n\n**A row that stays in the window keeps its element.** Clearing and\ncloning every row on every move replaced the node a reader had focused,\nso a link in a row lost focus to the body on any scroll, even with its row\nstill on screen. Rows are keyed by item: the ones leaving go, the ones\narriving are drawn in their place, and the ones staying are not moved.\n\n**The row holding focus is drawn outside the window too**, beside it on the\nside it belongs, and the spacer on that side gives up its room.\n\n**One row holds the tab stop**, the one the reader last focused while it is\ndrawn, and the first row on screen once it is not. Its own links and\nbuttons are in the tab order, and those of every other row wait."
|
|
193592
195511
|
},
|
|
195512
|
+
{
|
|
195513
|
+
"kind": "field",
|
|
195514
|
+
"name": "placedSections",
|
|
195515
|
+
"type": {
|
|
195516
|
+
"text": "Sections | undefined"
|
|
195517
|
+
},
|
|
195518
|
+
"privacy": "private",
|
|
195519
|
+
"description": "The sections the rows were last placed in."
|
|
195520
|
+
},
|
|
195521
|
+
{
|
|
195522
|
+
"kind": "field",
|
|
195523
|
+
"name": "headedBy",
|
|
195524
|
+
"type": {
|
|
195525
|
+
"text": "VirtualListSectionRenderer | undefined"
|
|
195526
|
+
},
|
|
195527
|
+
"privacy": "private",
|
|
195528
|
+
"description": "The function the drawn headers were drawn by, so a new one draws them again."
|
|
195529
|
+
},
|
|
195530
|
+
{
|
|
195531
|
+
"kind": "field",
|
|
195532
|
+
"name": "sectionId",
|
|
195533
|
+
"privacy": "private",
|
|
195534
|
+
"readonly": true,
|
|
195535
|
+
"description": "Ties each header's id to this list."
|
|
195536
|
+
},
|
|
195537
|
+
{
|
|
195538
|
+
"kind": "method",
|
|
195539
|
+
"name": "groups",
|
|
195540
|
+
"privacy": "private",
|
|
195541
|
+
"return": {
|
|
195542
|
+
"type": {
|
|
195543
|
+
"text": "Map<number, HTMLElement>"
|
|
195544
|
+
}
|
|
195545
|
+
},
|
|
195546
|
+
"parameters": [
|
|
195547
|
+
{
|
|
195548
|
+
"name": "sections",
|
|
195549
|
+
"type": {
|
|
195550
|
+
"text": "Sections | undefined"
|
|
195551
|
+
}
|
|
195552
|
+
},
|
|
195553
|
+
{
|
|
195554
|
+
"name": "wanted",
|
|
195555
|
+
"type": {
|
|
195556
|
+
"text": "readonly number[]"
|
|
195557
|
+
}
|
|
195558
|
+
},
|
|
195559
|
+
{
|
|
195560
|
+
"name": "regroup",
|
|
195561
|
+
"type": {
|
|
195562
|
+
"text": "boolean"
|
|
195563
|
+
}
|
|
195564
|
+
},
|
|
195565
|
+
{
|
|
195566
|
+
"name": "refill",
|
|
195567
|
+
"type": {
|
|
195568
|
+
"text": "boolean"
|
|
195569
|
+
}
|
|
195570
|
+
}
|
|
195571
|
+
],
|
|
195572
|
+
"description": "The section elements a pass draws rows into, by section, for the\nsections of the wanted items: each a `group` named by its header, which\nis its first child. The ones no wanted item is in leave, and all of them\ndo when the sections change."
|
|
195573
|
+
},
|
|
193593
195574
|
{
|
|
193594
195575
|
"kind": "method",
|
|
193595
195576
|
"name": "spacerSizes",
|
|
@@ -193599,7 +195580,7 @@
|
|
|
193599
195580
|
"text": "{ after: number; before: number }"
|
|
193600
195581
|
}
|
|
193601
195582
|
},
|
|
193602
|
-
"description": "The spacers'
|
|
195583
|
+
"description": "The spacers' sizes: the window's, with the line kept for focus taking its\nown room, and so do the headers drawn with their sections from outside it."
|
|
193603
195584
|
},
|
|
193604
195585
|
{
|
|
193605
195586
|
"kind": "field",
|
|
@@ -194084,6 +196065,24 @@
|
|
|
194084
196065
|
"description": "The narrowest a column of a grid may be, in pixels. Set, the list lays\nout as many columns as fit the box at that width, at least one, and\nfollows the box as it resizes, which `columns` then does not decide.",
|
|
194085
196066
|
"fieldName": "minColumnWidth"
|
|
194086
196067
|
},
|
|
196068
|
+
{
|
|
196069
|
+
"name": "orientation",
|
|
196070
|
+
"type": {
|
|
196071
|
+
"text": "'horizontal' | 'vertical'"
|
|
196072
|
+
},
|
|
196073
|
+
"default": "'vertical'",
|
|
196074
|
+
"description": "Which way the list runs. `horizontal` lays the items out along a line\nand scrolls it sideways: Left and Right move between items, the other\nway round on a right-to-left page, and `estimate` is an item's width. A\ngrid always runs down.",
|
|
196075
|
+
"fieldName": "orientation"
|
|
196076
|
+
},
|
|
196077
|
+
{
|
|
196078
|
+
"name": "section-field",
|
|
196079
|
+
"type": {
|
|
196080
|
+
"text": "string"
|
|
196081
|
+
},
|
|
196082
|
+
"default": "''",
|
|
196083
|
+
"description": "The field of each item that names its section, as a key or a path of\nkeys. Set, the items are drawn in sections: a header, then the items, in\nan element with the `group` role that the header names. A section starts\nwherever the field changes, so give the items in order. A list of one\ncolumn only.",
|
|
196084
|
+
"fieldName": "sectionField"
|
|
196085
|
+
},
|
|
194087
196086
|
{
|
|
194088
196087
|
"name": "selection-behavior",
|
|
194089
196088
|
"type": {
|
|
@@ -194125,6 +196124,10 @@
|
|
|
194125
196124
|
"description": "While the list has read its items and holds none.",
|
|
194126
196125
|
"name": "empty"
|
|
194127
196126
|
},
|
|
196127
|
+
{
|
|
196128
|
+
"description": "While the list runs across, with `orientation=\"horizontal\"`.",
|
|
196129
|
+
"name": "horizontal"
|
|
196130
|
+
},
|
|
194128
196131
|
{
|
|
194129
196132
|
"description": "While `loading` is set.",
|
|
194130
196133
|
"name": "loading"
|
|
@@ -194183,10 +196186,184 @@
|
|
|
194183
196186
|
}
|
|
194184
196187
|
}
|
|
194185
196188
|
]
|
|
196189
|
+
},
|
|
196190
|
+
{
|
|
196191
|
+
"kind": "javascript-module",
|
|
196192
|
+
"path": "src/virtual-list/sections.ts",
|
|
196193
|
+
"declarations": [
|
|
196194
|
+
{
|
|
196195
|
+
"kind": "function",
|
|
196196
|
+
"name": "sectionsOf",
|
|
196197
|
+
"return": {
|
|
196198
|
+
"type": {
|
|
196199
|
+
"text": "Sections"
|
|
196200
|
+
}
|
|
196201
|
+
},
|
|
196202
|
+
"parameters": [
|
|
196203
|
+
{
|
|
196204
|
+
"name": "items",
|
|
196205
|
+
"type": {
|
|
196206
|
+
"text": "readonly unknown[]"
|
|
196207
|
+
}
|
|
196208
|
+
},
|
|
196209
|
+
{
|
|
196210
|
+
"name": "field",
|
|
196211
|
+
"type": {
|
|
196212
|
+
"text": "string"
|
|
196213
|
+
}
|
|
196214
|
+
}
|
|
196215
|
+
],
|
|
196216
|
+
"description": "The sections `field` divides the items into."
|
|
196217
|
+
},
|
|
196218
|
+
{
|
|
196219
|
+
"kind": "function",
|
|
196220
|
+
"name": "sectionAt",
|
|
196221
|
+
"return": {
|
|
196222
|
+
"type": {
|
|
196223
|
+
"text": "number"
|
|
196224
|
+
}
|
|
196225
|
+
},
|
|
196226
|
+
"parameters": [
|
|
196227
|
+
{
|
|
196228
|
+
"name": "{ starts }",
|
|
196229
|
+
"type": {
|
|
196230
|
+
"text": "Sections"
|
|
196231
|
+
}
|
|
196232
|
+
},
|
|
196233
|
+
{
|
|
196234
|
+
"name": "item",
|
|
196235
|
+
"type": {
|
|
196236
|
+
"text": "number"
|
|
196237
|
+
}
|
|
196238
|
+
}
|
|
196239
|
+
],
|
|
196240
|
+
"description": "The section item `item` is in."
|
|
196241
|
+
},
|
|
196242
|
+
{
|
|
196243
|
+
"kind": "function",
|
|
196244
|
+
"name": "entryOf",
|
|
196245
|
+
"return": {
|
|
196246
|
+
"type": {
|
|
196247
|
+
"text": "number"
|
|
196248
|
+
}
|
|
196249
|
+
},
|
|
196250
|
+
"parameters": [
|
|
196251
|
+
{
|
|
196252
|
+
"name": "sections",
|
|
196253
|
+
"type": {
|
|
196254
|
+
"text": "Sections"
|
|
196255
|
+
}
|
|
196256
|
+
},
|
|
196257
|
+
{
|
|
196258
|
+
"name": "item",
|
|
196259
|
+
"type": {
|
|
196260
|
+
"text": "number"
|
|
196261
|
+
}
|
|
196262
|
+
}
|
|
196263
|
+
],
|
|
196264
|
+
"description": "The entry item `item` is."
|
|
196265
|
+
},
|
|
196266
|
+
{
|
|
196267
|
+
"kind": "function",
|
|
196268
|
+
"name": "headOf",
|
|
196269
|
+
"return": {
|
|
196270
|
+
"type": {
|
|
196271
|
+
"text": "number"
|
|
196272
|
+
}
|
|
196273
|
+
},
|
|
196274
|
+
"parameters": [
|
|
196275
|
+
{
|
|
196276
|
+
"name": "{ starts }",
|
|
196277
|
+
"type": {
|
|
196278
|
+
"text": "Sections"
|
|
196279
|
+
}
|
|
196280
|
+
},
|
|
196281
|
+
{
|
|
196282
|
+
"name": "section",
|
|
196283
|
+
"type": {
|
|
196284
|
+
"text": "number"
|
|
196285
|
+
}
|
|
196286
|
+
}
|
|
196287
|
+
],
|
|
196288
|
+
"description": "The entry of section `section`'s header."
|
|
196289
|
+
},
|
|
196290
|
+
{
|
|
196291
|
+
"kind": "function",
|
|
196292
|
+
"name": "itemsIn",
|
|
196293
|
+
"return": {
|
|
196294
|
+
"type": {
|
|
196295
|
+
"text": "{ first: number; last: number }"
|
|
196296
|
+
}
|
|
196297
|
+
},
|
|
196298
|
+
"parameters": [
|
|
196299
|
+
{
|
|
196300
|
+
"name": "sections",
|
|
196301
|
+
"type": {
|
|
196302
|
+
"text": "Sections"
|
|
196303
|
+
}
|
|
196304
|
+
},
|
|
196305
|
+
{
|
|
196306
|
+
"name": "entries",
|
|
196307
|
+
"type": {
|
|
196308
|
+
"text": "{ first: number; last: number }"
|
|
196309
|
+
}
|
|
196310
|
+
},
|
|
196311
|
+
{
|
|
196312
|
+
"name": "count",
|
|
196313
|
+
"type": {
|
|
196314
|
+
"text": "number"
|
|
196315
|
+
}
|
|
196316
|
+
}
|
|
196317
|
+
],
|
|
196318
|
+
"description": "The items a span of entries holds: what a window of entries draws, or what\na reader sees. A header at either end holds no item, so the span starts at\nits section's first item."
|
|
196319
|
+
}
|
|
196320
|
+
],
|
|
196321
|
+
"exports": [
|
|
196322
|
+
{
|
|
196323
|
+
"kind": "js",
|
|
196324
|
+
"name": "sectionsOf",
|
|
196325
|
+
"declaration": {
|
|
196326
|
+
"name": "sectionsOf",
|
|
196327
|
+
"module": "src/virtual-list/sections.ts"
|
|
196328
|
+
}
|
|
196329
|
+
},
|
|
196330
|
+
{
|
|
196331
|
+
"kind": "js",
|
|
196332
|
+
"name": "sectionAt",
|
|
196333
|
+
"declaration": {
|
|
196334
|
+
"name": "sectionAt",
|
|
196335
|
+
"module": "src/virtual-list/sections.ts"
|
|
196336
|
+
}
|
|
196337
|
+
},
|
|
196338
|
+
{
|
|
196339
|
+
"kind": "js",
|
|
196340
|
+
"name": "entryOf",
|
|
196341
|
+
"declaration": {
|
|
196342
|
+
"name": "entryOf",
|
|
196343
|
+
"module": "src/virtual-list/sections.ts"
|
|
196344
|
+
}
|
|
196345
|
+
},
|
|
196346
|
+
{
|
|
196347
|
+
"kind": "js",
|
|
196348
|
+
"name": "headOf",
|
|
196349
|
+
"declaration": {
|
|
196350
|
+
"name": "headOf",
|
|
196351
|
+
"module": "src/virtual-list/sections.ts"
|
|
196352
|
+
}
|
|
196353
|
+
},
|
|
196354
|
+
{
|
|
196355
|
+
"kind": "js",
|
|
196356
|
+
"name": "itemsIn",
|
|
196357
|
+
"declaration": {
|
|
196358
|
+
"name": "itemsIn",
|
|
196359
|
+
"module": "src/virtual-list/sections.ts"
|
|
196360
|
+
}
|
|
196361
|
+
}
|
|
196362
|
+
]
|
|
194186
196363
|
}
|
|
194187
196364
|
],
|
|
194188
196365
|
"helix": {
|
|
194189
196366
|
"package": "@fusion.dev/helix-headless",
|
|
194190
|
-
"version": "0.
|
|
196367
|
+
"version": "0.167.0"
|
|
194191
196368
|
}
|
|
194192
196369
|
}
|