@fusion.dev/helix-headless 0.12.2 → 0.13.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.
@@ -14003,16 +14003,6 @@
14003
14003
  "description": "What the list says while they are on their way.",
14004
14004
  "attribute": "loading-text"
14005
14005
  },
14006
- {
14007
- "kind": "field",
14008
- "name": "maxTags",
14009
- "type": {
14010
- "text": "number"
14011
- },
14012
- "default": "0",
14013
- "description": "How many tags to draw before the rest become a count. `multiple` only.\n\n`0` is all of them, and is the default: a cap that guesses is worse than no\ncap, because the number that fits depends on the width of the field and the\nlength of what is in it, neither of which this element knows. What a cap is\ngenuinely for is a field in a row or a table cell, where a set of twelve\nchoices would push everything below it down a line at a time.\n\nThe remainder is counted rather than hidden. `+3` is a fact a reader can act\non, where a row that silently stops is a field that appears to have lost\nwhat was put in it. Date Input and Time Input carry the same property and\nthe same reasoning.",
14014
- "attribute": "max-tags"
14015
- },
14016
14006
  {
14017
14007
  "kind": "field",
14018
14008
  "name": "multiple",
@@ -14262,6 +14252,21 @@
14262
14252
  "readonly": true,
14263
14253
  "description": "Anywhere in the field opens the list, and puts the caret where typing goes.\n\nOn the field rather than on the `<input>`. The caret is a sibling of the\ninput and so is the tag strip, so a handler on the input alone leaves the\none part of the control that visibly says \"this opens\" doing nothing.\nAnything drawn inside the field is the field.\n\nA tag is the exception, because a tag is its own control: its dismiss\nremoves a choice, and opening the list on the way past would leave the\nreader looking at a panel they did not ask for. Read from the composed\npath, since the press lands on a button inside the tag's shadow root and\nthe event has retargeted by the time it arrives here.\n\nIt only ever opens. Closing is Escape, a choice, or leaving, which is what\nthe input already did and what a text field wants: a control that closed\nwhen you clicked into the middle of your own typing would be unusable."
14264
14254
  },
14255
+ {
14256
+ "kind": "method",
14257
+ "name": "removeLastToken",
14258
+ "privacy": "protected",
14259
+ "return": {
14260
+ "type": {
14261
+ "text": "void"
14262
+ }
14263
+ },
14264
+ "description": "The last chosen one goes, which is what Backspace on an empty field means.\n\n`MixinTokens` owns when this is asked for and this owns what it does: a\ntoken here is a chosen option, so it leaves by the same door a dismissed\ntag does.",
14265
+ "inheritedFrom": {
14266
+ "name": "MixinTokens",
14267
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
14268
+ }
14269
+ },
14265
14270
  {
14266
14271
  "kind": "field",
14267
14272
  "name": "handleDismiss",
@@ -14427,6 +14432,98 @@
14427
14432
  "text": "toggleOpen() => boolean"
14428
14433
  }
14429
14434
  },
14435
+ {
14436
+ "kind": "field",
14437
+ "name": "maxTags",
14438
+ "type": {
14439
+ "text": "number"
14440
+ },
14441
+ "default": "0",
14442
+ "description": "How many tokens to show before the rest become a count.",
14443
+ "attribute": "max-tags",
14444
+ "inheritedFrom": {
14445
+ "name": "MixinTokens",
14446
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
14447
+ }
14448
+ },
14449
+ {
14450
+ "kind": "method",
14451
+ "name": "renderTokenRow",
14452
+ "privacy": "protected",
14453
+ "return": {
14454
+ "type": {
14455
+ "text": "TemplateResult | typeof nothing"
14456
+ }
14457
+ },
14458
+ "parameters": [
14459
+ {
14460
+ "name": "content",
14461
+ "type": {
14462
+ "text": "unknown"
14463
+ }
14464
+ },
14465
+ {
14466
+ "name": "over",
14467
+ "type": {
14468
+ "text": "number"
14469
+ }
14470
+ }
14471
+ ],
14472
+ "inheritedFrom": {
14473
+ "name": "MixinTokens",
14474
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
14475
+ }
14476
+ },
14477
+ {
14478
+ "kind": "method",
14479
+ "name": "hideOverflow",
14480
+ "privacy": "protected",
14481
+ "return": {
14482
+ "type": {
14483
+ "text": "number"
14484
+ }
14485
+ },
14486
+ "parameters": [
14487
+ {
14488
+ "name": "slot",
14489
+ "type": {
14490
+ "text": "HTMLSlotElement | null | undefined"
14491
+ }
14492
+ }
14493
+ ],
14494
+ "inheritedFrom": {
14495
+ "name": "MixinTokens",
14496
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
14497
+ }
14498
+ },
14499
+ {
14500
+ "kind": "method",
14501
+ "name": "tokenKeydown",
14502
+ "privacy": "protected",
14503
+ "return": {
14504
+ "type": {
14505
+ "text": "boolean"
14506
+ }
14507
+ },
14508
+ "parameters": [
14509
+ {
14510
+ "name": "event",
14511
+ "type": {
14512
+ "text": "KeyboardEvent"
14513
+ }
14514
+ },
14515
+ {
14516
+ "name": "typed",
14517
+ "type": {
14518
+ "text": "string"
14519
+ }
14520
+ }
14521
+ ],
14522
+ "inheritedFrom": {
14523
+ "name": "MixinTokens",
14524
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
14525
+ }
14526
+ },
14430
14527
  {
14431
14528
  "kind": "field",
14432
14529
  "name": "defaultValue",
@@ -15219,15 +15316,6 @@
15219
15316
  "description": "What the list says while they are on their way.",
15220
15317
  "fieldName": "loadingText"
15221
15318
  },
15222
- {
15223
- "name": "max-tags",
15224
- "type": {
15225
- "text": "number"
15226
- },
15227
- "default": "0",
15228
- "description": "How many tags to draw before the rest become a count. `multiple` only.\n\n`0` is all of them, and is the default: a cap that guesses is worse than no\ncap, because the number that fits depends on the width of the field and the\nlength of what is in it, neither of which this element knows. What a cap is\ngenuinely for is a field in a row or a table cell, where a set of twelve\nchoices would push everything below it down a line at a time.\n\nThe remainder is counted rather than hidden. `+3` is a fact a reader can act\non, where a row that silently stops is a field that appears to have lost\nwhat was put in it. Date Input and Time Input carry the same property and\nthe same reasoning.",
15229
- "fieldName": "maxTags"
15230
- },
15231
15319
  {
15232
15320
  "name": "multiple",
15233
15321
  "type": {
@@ -15289,6 +15377,19 @@
15289
15377
  "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
15290
15378
  }
15291
15379
  },
15380
+ {
15381
+ "name": "max-tags",
15382
+ "type": {
15383
+ "text": "number"
15384
+ },
15385
+ "default": "0",
15386
+ "description": "How many tokens to show before the rest become a count.",
15387
+ "fieldName": "maxTags",
15388
+ "inheritedFrom": {
15389
+ "name": "MixinTokens",
15390
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
15391
+ }
15392
+ },
15292
15393
  {
15293
15394
  "name": "default-value",
15294
15395
  "type": {
@@ -15398,6 +15499,10 @@
15398
15499
  "name": "MixinControllerOpen",
15399
15500
  "package": "@fusion.dev/helix-core"
15400
15501
  },
15502
+ {
15503
+ "name": "MixinTokens",
15504
+ "package": "@fusion.dev/helix-core"
15505
+ },
15401
15506
  {
15402
15507
  "name": "MixinControllerValue",
15403
15508
  "package": "@fusion.dev/helix-core"
@@ -26364,138 +26469,1373 @@
26364
26469
  },
26365
26470
  {
26366
26471
  "kind": "javascript-module",
26367
- "path": "src/format-date/index.ts",
26472
+ "path": "src/filter-input/index.ts",
26368
26473
  "declarations": [],
26369
26474
  "exports": [
26370
26475
  {
26371
26476
  "kind": "js",
26372
- "name": "HelixHeadlessFormatDate",
26477
+ "name": "*",
26373
26478
  "declaration": {
26374
- "name": "HelixHeadlessFormatDate",
26375
- "module": "./root/format-date-root.js"
26479
+ "name": "*",
26480
+ "module": "src/filter-input/root/filter-input-root.js"
26376
26481
  }
26377
26482
  }
26378
26483
  ]
26379
26484
  },
26380
26485
  {
26381
26486
  "kind": "javascript-module",
26382
- "path": "src/format-date/root/format-date-root.ts",
26487
+ "path": "src/filter-input/root/filter-input-root.ts",
26383
26488
  "declarations": [
26384
26489
  {
26385
26490
  "kind": "class",
26386
- "description": "A date in a page is almost never wanted as an ISO string, and formatting one\nin the consumer's own code means every consumer ships a copy of the same\n`Intl` call and a different set of options. This is that call, as an element,\nso a date is written where it is shown.\n\n**`elapsed` is the mode a feed wants, and it stops being relative on\npurpose.** \"42m\", \"3h\", \"1d\" is what a row of activity reads as, and past a\nweek the compact form is a lie: `Intl.NumberFormat` narrow renders both\n`minute` and `month` as `m` in en-US, so \"3m\" is three minutes at the top of a\nfeed and three months further down it. Past six days this shows a date, which\nis shorter to read and impossible to misread. `elapsedTime` in `helix/core`\ncarries the measurement.\n\n**The reading refreshes itself, from one timer the page shares.** A relative\ntimestamp is correct for as long as its unit lasts and wrong afterwards, and a\npage left open is exactly where that shows. Each element asks to be woken when\nits own reading expires rather than polling, and an element showing a date\nasks for nothing at all: fifty rows and fifty intervals is fifty wakeups a\nsecond where one will do, and a feed of last month's notifications should cost\nnothing to leave open.\n\n**`<time datetime>` whatever the text says**, so a screen reader, a copy and\npaste, and anything parsing the page all get the real instant rather than\n\"yesterday\".",
26387
- "name": "HelixHeadlessFormatDate",
26491
+ "description": "**The tokens are the consumer's own elements, slotted.** What a filter narrows\nby belongs to the consumer's model rather than to this element: a facet with a\nprefix, a saved query, a range. So they are slotted rather than rendered from\na list of strings, and removing one is a request this element makes rather\nthan a change it applies. Combobox is the other way round, and that is the\ndifference between the two: its tokens are a view of a selection it owns,\ndrawn from options it was handed.\n\n**`value` is the text being typed, not the tokens**, which is what makes this\na field a consumer can listen to. Every keystroke announces `input` with the\ntext on the element, so a table narrows as the reader types. The tokens need\nno reporting back, being markup the consumer already holds.\n\nBackspace on an empty field asks the last token to go, through the same\n`helix-dismiss` its own remove control fires, so a consumer who handled the\npointer has already handled the keyboard.",
26492
+ "name": "HelixHeadlessFilterInput",
26388
26493
  "cssParts": [
26389
26494
  {
26390
- "description": "The `<time>` element carrying the reading.",
26391
- "name": "time"
26495
+ "description": "The button that empties the field.",
26496
+ "name": "clear"
26497
+ },
26498
+ {
26499
+ "description": "The input itself.",
26500
+ "name": "control"
26501
+ },
26502
+ {
26503
+ "description": "What is wrong with it.",
26504
+ "name": "feedback"
26505
+ },
26506
+ {
26507
+ "description": "The box holding everything.",
26508
+ "name": "field"
26509
+ },
26510
+ {
26511
+ "description": "Help under the field, while nothing is wrong.",
26512
+ "name": "hint"
26513
+ },
26514
+ {
26515
+ "description": "The question, over the field.",
26516
+ "name": "label"
26517
+ },
26518
+ {
26519
+ "description": "How many tokens did not fit.",
26520
+ "name": "rest"
26521
+ },
26522
+ {
26523
+ "description": "The row the tokens sit in.",
26524
+ "name": "tags"
26525
+ }
26526
+ ],
26527
+ "slots": [
26528
+ {
26529
+ "description": "After the text, for a count or a control.",
26530
+ "name": "end"
26531
+ },
26532
+ {
26533
+ "description": "Before the text, for a search icon.",
26534
+ "name": "start"
26535
+ },
26536
+ {
26537
+ "description": "What is already narrowing the results, as `Tag`s.",
26538
+ "name": "tags"
26392
26539
  }
26393
26540
  ],
26394
26541
  "members": [
26395
26542
  {
26396
26543
  "kind": "field",
26397
- "name": "date",
26398
- "type": {
26399
- "text": "string"
26400
- },
26401
- "default": "''",
26402
- "description": "The timestamp, as anything `Date` parses.\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-format-date elapsed>2026-08-27T01:00:00Z</helix-format-date>` is the\nspelling that reads best in markup, and it cannot be the only one: measured\nagainst Lit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see it.\nAn element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
26403
- "attribute": "date"
26544
+ "name": "aria",
26545
+ "privacy": "protected",
26546
+ "readonly": true,
26547
+ "default": "new AriaForwardController(this, { target: () => this.renderRoot?.querySelector<HTMLElement>('[part=\"control\"]') ?? null, })"
26404
26548
  },
26405
26549
  {
26406
26550
  "kind": "field",
26407
- "name": "day",
26551
+ "name": "announcesInput",
26408
26552
  "type": {
26409
- "text": "'numeric' | '2-digit' | undefined"
26553
+ "text": "boolean"
26410
26554
  },
26411
- "description": "How the day of the month is written, where a date is shown.",
26412
- "attribute": "day"
26555
+ "privacy": "protected",
26556
+ "readonly": true,
26557
+ "default": "true",
26558
+ "description": "Typed, so every keystroke is announced. See `announcesInput`.",
26559
+ "inheritedFrom": {
26560
+ "name": "MixinControllerValue",
26561
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26562
+ }
26413
26563
  },
26414
26564
  {
26415
26565
  "kind": "field",
26416
- "name": "elapsed",
26566
+ "name": "clearable",
26417
26567
  "type": {
26418
26568
  "text": "boolean"
26419
26569
  },
26420
26570
  "default": "false",
26421
- "description": "Show how long ago it was, compactly, instead of the date.\n\nReflected, because it is the one property that decides which of two readings\nthis is and a stylesheet has a reason to know: a compact reading is a fixed\nfew characters and a date is not.",
26422
- "attribute": "elapsed",
26423
- "reflects": true
26571
+ "description": "Whether the field offers a button that empties it.\n\nThe text only. The tokens are the consumer's markup and this element is not\nentitled to take them out of the document, which is the same reason\n`hideOverflow` marks the ones over the cap `hidden` rather than removing\nthem.",
26572
+ "attribute": "clearable"
26424
26573
  },
26425
26574
  {
26426
26575
  "kind": "field",
26427
- "name": "hour",
26576
+ "name": "clearLabel",
26428
26577
  "type": {
26429
- "text": "'numeric' | '2-digit' | undefined"
26578
+ "text": "string"
26430
26579
  },
26431
- "description": "How the hour is written, where a time of day is shown.",
26432
- "attribute": "hour"
26580
+ "default": "'Clear'",
26581
+ "description": "What the clear button is called, since an icon has no name of its own.",
26582
+ "attribute": "clear-label"
26433
26583
  },
26434
26584
  {
26435
26585
  "kind": "field",
26436
- "name": "locale",
26586
+ "name": "placeholder",
26437
26587
  "type": {
26438
26588
  "text": "string"
26439
26589
  },
26440
26590
  "default": "''",
26441
- "description": "Locale for the reading.\n\nEmpty is the runtime's own.",
26442
- "attribute": "locale"
26591
+ "description": "Shown while the field is empty.\n\nNot a label: it goes when typing starts.",
26592
+ "attribute": "placeholder"
26443
26593
  },
26444
26594
  {
26445
26595
  "kind": "field",
26446
- "name": "minute",
26596
+ "name": "over",
26447
26597
  "type": {
26448
- "text": "'numeric' | '2-digit' | undefined"
26598
+ "text": "number"
26449
26599
  },
26450
- "description": "How the minute is written, where a time of day is shown.",
26451
- "attribute": "minute"
26600
+ "privacy": "private",
26601
+ "default": "0",
26602
+ "description": "How many tokens did not fit, which is what the row's count renders."
26452
26603
  },
26453
26604
  {
26454
26605
  "kind": "field",
26455
- "name": "month",
26606
+ "name": "releaseCaret",
26456
26607
  "type": {
26457
- "text": "'numeric' | '2-digit' | 'long' | 'short' | 'narrow' | undefined"
26608
+ "text": "(() => void) | undefined"
26458
26609
  },
26459
- "description": "How the month is written, where a date is shown.",
26460
- "attribute": "month"
26610
+ "privacy": "private",
26611
+ "description": "The caret, held across a value the consumer wrote rather than the reader.\n\nSet in `willUpdate` and spent in `updated`, because Lit's `.value` binding\nlands between the two and takes the selection with it. See `holdCaret`."
26461
26612
  },
26462
26613
  {
26463
26614
  "kind": "field",
26464
- "name": "second",
26615
+ "name": "shadowRootOptions",
26465
26616
  "type": {
26466
- "text": "'numeric' | '2-digit' | undefined"
26617
+ "text": "ShadowRootInit"
26467
26618
  },
26468
- "description": "How the second is written, where a time of day is shown.",
26469
- "attribute": "second"
26619
+ "static": true,
26620
+ "default": "{ ...HelixFormElement.shadowRootOptions, delegatesFocus: true, }",
26621
+ "description": "Focus is delegated to the input, so the host is never the focus target."
26470
26622
  },
26471
26623
  {
26472
26624
  "kind": "field",
26473
- "name": "timeZone",
26625
+ "name": "control",
26474
26626
  "type": {
26475
- "text": "string | undefined"
26627
+ "text": "HTMLInputElement | null"
26476
26628
  },
26477
- "description": "The time zone to read the timestamp in.\n\nEmpty is the runtime's own.",
26478
- "attribute": "time-zone"
26629
+ "privacy": "private",
26630
+ "readonly": true
26479
26631
  },
26480
26632
  {
26481
26633
  "kind": "field",
26482
- "name": "timeZoneName",
26634
+ "name": "tokens",
26483
26635
  "type": {
26484
- "text": "'long' | 'short' | undefined"
26636
+ "text": "HTMLSlotElement | null"
26485
26637
  },
26486
- "description": "Whether to name the time zone, and how.",
26487
- "attribute": "time-zone-name"
26638
+ "privacy": "private",
26639
+ "readonly": true
26488
26640
  },
26489
26641
  {
26490
26642
  "kind": "field",
26491
- "name": "weekday",
26643
+ "name": "showsClear",
26492
26644
  "type": {
26493
- "text": "'long' | 'short' | 'narrow' | undefined"
26645
+ "text": "boolean"
26494
26646
  },
26495
- "description": "How the weekday is written, where one is shown.",
26496
- "attribute": "weekday"
26497
- },
26498
- {
26647
+ "privacy": "private",
26648
+ "description": "Whether there is a clear button on screen right now.",
26649
+ "readonly": true
26650
+ },
26651
+ {
26652
+ "kind": "field",
26653
+ "name": "handleInput",
26654
+ "privacy": "private",
26655
+ "readonly": true,
26656
+ "description": "Every keystroke, cancelable, and put back where it is refused.\n\nStopped for the reason `Input` gives: `input` is composed, so the inner\ncontrol's own would arrive beside the one the mixin announces and a consumer\nwould hear one keystroke twice, once carrying the value from before it."
26657
+ },
26658
+ {
26659
+ "kind": "field",
26660
+ "name": "handleChange",
26661
+ "privacy": "private",
26662
+ "readonly": true,
26663
+ "description": "Relayed, because `change` does not cross a shadow boundary on its own."
26664
+ },
26665
+ {
26666
+ "kind": "field",
26667
+ "name": "handleClear",
26668
+ "privacy": "private",
26669
+ "readonly": true,
26670
+ "description": "Empties the text and gives the caret back.\n\nFocus returns to the input rather than staying on a button that is about to\ndisappear, which would otherwise land on the body."
26671
+ },
26672
+ {
26673
+ "kind": "field",
26674
+ "name": "handleKeydown",
26675
+ "privacy": "private",
26676
+ "readonly": true
26677
+ },
26678
+ {
26679
+ "kind": "field",
26680
+ "name": "handleTokens",
26681
+ "privacy": "private",
26682
+ "readonly": true,
26683
+ "description": "The row again, whenever what is in it changes."
26684
+ },
26685
+ {
26686
+ "kind": "method",
26687
+ "name": "removeLastToken",
26688
+ "privacy": "protected",
26689
+ "return": {
26690
+ "type": {
26691
+ "text": "void"
26692
+ }
26693
+ },
26694
+ "description": "Asks the last token to go, rather than taking it.\n\n`dismiss()` is the tag's own, so this is the code path its remove control\nalready runs on a press: the consumer hears one `helix-dismiss`, cancels it\nor removes the element, and never learns which of the two asked. A slotted\nnode that is not a `Tag` has no such method and is left alone, because\nhiding a consumer's element on Backspace would be this element deciding\nsomething it was never given.",
26695
+ "inheritedFrom": {
26696
+ "name": "MixinTokens",
26697
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26698
+ }
26699
+ },
26700
+ {
26701
+ "kind": "method",
26702
+ "name": "focus",
26703
+ "return": {
26704
+ "type": {
26705
+ "text": "void"
26706
+ }
26707
+ },
26708
+ "parameters": [
26709
+ {
26710
+ "name": "options",
26711
+ "optional": true,
26712
+ "type": {
26713
+ "text": "FocusOptions"
26714
+ }
26715
+ }
26716
+ ],
26717
+ "description": "Puts the caret in the field, the way a label pointing at one would.",
26718
+ "type": {
26719
+ "text": "focus(options?: FocusOptions) => void"
26720
+ }
26721
+ },
26722
+ {
26723
+ "kind": "field",
26724
+ "name": "maxTags",
26725
+ "type": {
26726
+ "text": "number"
26727
+ },
26728
+ "default": "0",
26729
+ "description": "How many tokens to show before the rest become a count.",
26730
+ "attribute": "max-tags",
26731
+ "inheritedFrom": {
26732
+ "name": "MixinTokens",
26733
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26734
+ }
26735
+ },
26736
+ {
26737
+ "kind": "method",
26738
+ "name": "renderTokenRow",
26739
+ "privacy": "protected",
26740
+ "return": {
26741
+ "type": {
26742
+ "text": "TemplateResult | typeof nothing"
26743
+ }
26744
+ },
26745
+ "parameters": [
26746
+ {
26747
+ "name": "content",
26748
+ "type": {
26749
+ "text": "unknown"
26750
+ }
26751
+ },
26752
+ {
26753
+ "name": "over",
26754
+ "type": {
26755
+ "text": "number"
26756
+ }
26757
+ }
26758
+ ],
26759
+ "inheritedFrom": {
26760
+ "name": "MixinTokens",
26761
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26762
+ }
26763
+ },
26764
+ {
26765
+ "kind": "method",
26766
+ "name": "hideOverflow",
26767
+ "privacy": "protected",
26768
+ "return": {
26769
+ "type": {
26770
+ "text": "number"
26771
+ }
26772
+ },
26773
+ "parameters": [
26774
+ {
26775
+ "name": "slot",
26776
+ "type": {
26777
+ "text": "HTMLSlotElement | null | undefined"
26778
+ }
26779
+ }
26780
+ ],
26781
+ "inheritedFrom": {
26782
+ "name": "MixinTokens",
26783
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26784
+ }
26785
+ },
26786
+ {
26787
+ "kind": "method",
26788
+ "name": "tokenKeydown",
26789
+ "privacy": "protected",
26790
+ "return": {
26791
+ "type": {
26792
+ "text": "boolean"
26793
+ }
26794
+ },
26795
+ "parameters": [
26796
+ {
26797
+ "name": "event",
26798
+ "type": {
26799
+ "text": "KeyboardEvent"
26800
+ }
26801
+ },
26802
+ {
26803
+ "name": "typed",
26804
+ "type": {
26805
+ "text": "string"
26806
+ }
26807
+ }
26808
+ ],
26809
+ "inheritedFrom": {
26810
+ "name": "MixinTokens",
26811
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26812
+ }
26813
+ },
26814
+ {
26815
+ "kind": "field",
26816
+ "name": "defaultValue",
26817
+ "type": {
26818
+ "text": "string"
26819
+ },
26820
+ "default": "''",
26821
+ "description": "The value the markup declared, which is where a reset returns to.",
26822
+ "attribute": "default-value",
26823
+ "inheritedFrom": {
26824
+ "name": "MixinControllerValue",
26825
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26826
+ }
26827
+ },
26828
+ {
26829
+ "kind": "field",
26830
+ "name": "value",
26831
+ "type": {
26832
+ "text": "string"
26833
+ },
26834
+ "description": "What the control holds now, and what its form submits.\n\nOne property, not two, so `input.value` answers the question anyone\nasking it meant. Writing always applies; `<helix-input value=\"x\">` is the\nsame statement in markup, and `default-value` is how markup seeds a value\na reset should return to.",
26835
+ "attribute": "value",
26836
+ "inheritedFrom": {
26837
+ "name": "MixinControllerValue",
26838
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26839
+ }
26840
+ },
26841
+ {
26842
+ "kind": "field",
26843
+ "name": "valueState",
26844
+ "type": {
26845
+ "text": "string | undefined"
26846
+ },
26847
+ "privacy": "private",
26848
+ "default": "undefined",
26849
+ "description": "The state, whoever set it, and `undefined` until somebody has.\n\nOne field and not two. Writing always applies, the way a native control\ndoes when a script assigns to it.",
26850
+ "inheritedFrom": {
26851
+ "name": "MixinControllerValue",
26852
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26853
+ }
26854
+ },
26855
+ {
26856
+ "kind": "method",
26857
+ "name": "announceNatively",
26858
+ "privacy": "private",
26859
+ "return": {
26860
+ "type": {
26861
+ "text": "void"
26862
+ }
26863
+ },
26864
+ "description": "Announces the applied value under the platform's own name.\n\n**After `apply`, never before**, which is the whole reason this is\nseparate from the request event: a native handler reads\n`event.target.value`, and it has to be the value that was just applied.\n\n**Both, for a discrete control, because that is what the platform does.**\nA native `<select>` sends `input` and then `change` from one choice: the\nvalue moved, and the reader is also done. A continuous control announces\n`input` here and relays `change` from its inner control when the reader\nis done, so the pair keeps the platform's timings rather than reporting a\ncommit on every keystroke.",
26865
+ "inheritedFrom": {
26866
+ "name": "MixinControllerValue",
26867
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26868
+ }
26869
+ },
26870
+ {
26871
+ "kind": "method",
26872
+ "name": "requestValue",
26873
+ "return": {
26874
+ "type": {
26875
+ "text": "boolean"
26876
+ }
26877
+ },
26878
+ "parameters": [
26879
+ {
26880
+ "name": "next",
26881
+ "type": {
26882
+ "text": "string"
26883
+ }
26884
+ }
26885
+ ],
26886
+ "description": "Requests a new value, and reports whether the request stood.\n\nAnnounces before it acts, so `preventDefault()` on the `helix-before-change` is\na refusal and nothing moves. Nobody refusing means the control updates\nitself, whether or not a consumer declared `value`: a declared property\nis a seed and a correction, the way `<input value>` is, and a consumer\nwho wants the change for themselves refuses it and assigns their own.",
26887
+ "inheritedFrom": {
26888
+ "name": "MixinControllerValue",
26889
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26890
+ },
26891
+ "type": {
26892
+ "text": "requestValue(next: string) => boolean"
26893
+ }
26894
+ },
26895
+ {
26896
+ "kind": "method",
26897
+ "name": "formResetCallback",
26898
+ "return": {
26899
+ "type": {
26900
+ "text": "void"
26901
+ }
26902
+ },
26903
+ "description": "Returns the control to the value its markup declared.\n\nBoth halves are dropped, the consumer's and the control's, because a\nreset means the form is as it was served. Clearing only the internal one\nwould leave a control that had been written to stuck at that value.",
26904
+ "inheritedFrom": {
26905
+ "name": "MixinControllerValue",
26906
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26907
+ },
26908
+ "type": {
26909
+ "text": "formResetCallback() => void"
26910
+ }
26911
+ },
26912
+ {
26913
+ "kind": "method",
26914
+ "name": "formStateRestoreCallback",
26915
+ "return": {
26916
+ "type": {
26917
+ "text": "void"
26918
+ }
26919
+ },
26920
+ "parameters": [
26921
+ {
26922
+ "name": "state",
26923
+ "type": {
26924
+ "text": "string | null"
26925
+ }
26926
+ }
26927
+ ],
26928
+ "description": "Restores the value when the browser brings a form back.\n\nFalling back to `defaultValue` rather than to empty, because a restore\nwith no state is a form the browser has nothing recorded for, which is\nthe same situation as a fresh one.",
26929
+ "inheritedFrom": {
26930
+ "name": "MixinControllerValue",
26931
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26932
+ },
26933
+ "type": {
26934
+ "text": "formStateRestoreCallback(state: string | null) => void"
26935
+ }
26936
+ },
26937
+ {
26938
+ "kind": "field",
26939
+ "name": "feedback",
26940
+ "type": {
26941
+ "text": "string"
26942
+ },
26943
+ "default": "''",
26944
+ "description": "What is wrong, in the reader's words rather than the browser's.",
26945
+ "attribute": "feedback",
26946
+ "inheritedFrom": {
26947
+ "name": "MixinField",
26948
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26949
+ }
26950
+ },
26951
+ {
26952
+ "kind": "field",
26953
+ "name": "hint",
26954
+ "type": {
26955
+ "text": "string"
26956
+ },
26957
+ "default": "''",
26958
+ "description": "Help under the control, shown while there is nothing wrong.",
26959
+ "attribute": "hint",
26960
+ "inheritedFrom": {
26961
+ "name": "MixinField",
26962
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26963
+ }
26964
+ },
26965
+ {
26966
+ "kind": "field",
26967
+ "name": "label",
26968
+ "type": {
26969
+ "text": "string"
26970
+ },
26971
+ "default": "''",
26972
+ "description": "The accessible name, and the fallback for the `label` slot.",
26973
+ "attribute": "label",
26974
+ "inheritedFrom": {
26975
+ "name": "MixinField",
26976
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26977
+ }
26978
+ },
26979
+ {
26980
+ "kind": "field",
26981
+ "name": "required",
26982
+ "type": {
26983
+ "text": "boolean"
26984
+ },
26985
+ "default": "false",
26986
+ "description": "Whether the form refuses to submit without it.",
26987
+ "attribute": "required",
26988
+ "reflects": true,
26989
+ "inheritedFrom": {
26990
+ "name": "MixinField",
26991
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26992
+ }
26993
+ },
26994
+ {
26995
+ "kind": "field",
26996
+ "name": "touched",
26997
+ "type": {
26998
+ "text": "boolean"
26999
+ },
27000
+ "privacy": "private",
27001
+ "default": "false",
27002
+ "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`.",
27003
+ "inheritedFrom": {
27004
+ "name": "MixinField",
27005
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27006
+ }
27007
+ },
27008
+ {
27009
+ "kind": "field",
27010
+ "name": "validates",
27011
+ "type": {
27012
+ "text": "boolean"
27013
+ },
27014
+ "privacy": "private",
27015
+ "description": "Whether this element may be asked about its own validity at all.\n\nReading the static the platform itself reads to decide, rather than\nprobing: `validity` and `validationMessage` throw `NotSupportedError` on\nan element that is not form-associated, and a group whose members each\nsubmit themselves is not. Such a control still shows a message, it just\nhas to be given one.",
27016
+ "readonly": true,
27017
+ "inheritedFrom": {
27018
+ "name": "MixinField",
27019
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27020
+ }
27021
+ },
27022
+ {
27023
+ "kind": "method",
27024
+ "name": "renderGroupLabel",
27025
+ "privacy": "protected",
27026
+ "return": {
27027
+ "type": {
27028
+ "text": "TemplateResult | typeof nothing"
27029
+ }
27030
+ },
27031
+ "description": "A label over a set rather than beside a control.\n\nA plain element and not a `<label for>`, because a group is not a single\ncontrol and there is nothing for `for` to point at. What names the group\nis `linkHost`, pointing the host's internals at this element.",
27032
+ "inheritedFrom": {
27033
+ "name": "MixinField",
27034
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27035
+ }
27036
+ },
27037
+ {
27038
+ "kind": "method",
27039
+ "name": "renderLabel",
27040
+ "privacy": "protected",
27041
+ "return": {
27042
+ "type": {
27043
+ "text": "TemplateResult | typeof nothing"
27044
+ }
27045
+ },
27046
+ "description": "A label above the control, pointing at it.\n\nA real `<label for>`, so pressing the words focuses the field and the\nbrowser does the forwarding. It resolves because `for` looks within the\nsame tree, and the control it names is in this shadow root.\n\n**Nothing at all when there is no label**, which is the same rule the\nhint and the feedback follow: none of the three is always used, and an\nelement rendered empty is not free. It still generates a box, so it still\ntakes a row of the grid and a gap on either side of it, which is a field\nthat has moved down the page for a label nobody wrote. `nothing` leaves\ncomment markers rather than a node, so the gap has nothing to sit between.\n\n**`aria-label` names without showing**, and it is forwarded rather than\nleft where the consumer put it. A custom element has no way to delegate a\nlabel to the control inside it, so an `aria-label` on the host reaches\nnothing: measured, the inner input came back with no label and no name of\nits own while the attribute sat on the wrapper. What happens instead is\nthat the label is rendered and clipped, so the name arrives through the\nsame `<label for>` a visible one does.\n\nThe rule is that `label` means a label, `aria-label` means a name, and\nneither means an unnamed field a screen reader announces as \"edit text\".",
27047
+ "inheritedFrom": {
27048
+ "name": "MixinField",
27049
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27050
+ }
27051
+ },
27052
+ {
27053
+ "kind": "method",
27054
+ "name": "renderHint",
27055
+ "privacy": "protected",
27056
+ "return": {
27057
+ "type": {
27058
+ "text": "TemplateResult | typeof nothing"
27059
+ }
27060
+ },
27061
+ "description": "Help under the control, unless something has gone wrong.\n\nThe two share a place rather than stacking, so a field is one line of\nsmall text either way and nothing below it moves when the message\nchanges. What the reader needs at that moment is what is wrong, and a\nhint that survives the error it describes is a second line to read before\ngetting to the one that matters.",
27062
+ "inheritedFrom": {
27063
+ "name": "MixinField",
27064
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27065
+ }
27066
+ },
27067
+ {
27068
+ "kind": "method",
27069
+ "name": "renderFeedback",
27070
+ "privacy": "protected",
27071
+ "return": {
27072
+ "type": {
27073
+ "text": "TemplateResult | typeof nothing"
27074
+ }
27075
+ },
27076
+ "description": "The validation message, in the hint's place.\n\n`role=\"alert\"` rather than a live region on the whole field, so what is\nannounced is the message and not the label and help along with it.",
27077
+ "inheritedFrom": {
27078
+ "name": "MixinField",
27079
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27080
+ }
27081
+ },
27082
+ {
27083
+ "kind": "method",
27084
+ "name": "linkHost",
27085
+ "privacy": "protected",
27086
+ "return": {
27087
+ "type": {
27088
+ "text": "void"
27089
+ }
27090
+ },
27091
+ "description": "Points the host at its own label and description nodes, for a group.\n\nA control's `<input>` and its hint are both in the shadow root, so a\nplain `aria-describedby` resolves between them. A group's host is in the\nlight DOM and its hint is not, so the IDREF cannot reach and\n`element.ariaDescribedByElements` drops the reference outright. Only the\n`ElementInternals` form keeps it, measured in Chrome 148: two of two\nkept through internals, zero of one through the element.\n\nClient only, and deliberately, because element references need the nodes\nto exist and on the server they do not. The name is therefore also set as\na plain string by the component, which a server can write, and the\nreference here overrides it wherever a consumer slotted something richer\nthan a string. A group with only a property for a label reads the same\neither way.",
27092
+ "inheritedFrom": {
27093
+ "name": "MixinField",
27094
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27095
+ }
27096
+ },
27097
+ {
27098
+ "kind": "field",
27099
+ "name": "shownFeedback",
27100
+ "type": {
27101
+ "text": "string"
27102
+ },
27103
+ "privacy": "private",
27104
+ "default": "''",
27105
+ "description": "What the last render put on screen, so a change can be noticed.",
27106
+ "inheritedFrom": {
27107
+ "name": "MixinField",
27108
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27109
+ }
27110
+ },
27111
+ {
27112
+ "kind": "method",
27113
+ "name": "refreshFeedback",
27114
+ "privacy": "protected",
27115
+ "return": {
27116
+ "type": {
27117
+ "text": "void"
27118
+ }
27119
+ },
27120
+ "description": "Re-reads the platform's verdict, for a control that has just reported one.\n\nValidity changes through `ElementInternals` rather than through a\nproperty, so nothing schedules an update for it. Worse, the order is\nagainst us: this mixin sits above the control in the prototype chain, so\nits `updated` runs before the control's own, which is where `setValidity`\nis called. Reading the verdict here would always read the previous one,\nwhich is what left a corrected field still showing the error it had\nbefore. So the control says when it has reported, and this schedules the\none further update that needs. It converges because the second pass finds\nnothing changed.",
27121
+ "inheritedFrom": {
27122
+ "name": "MixinField",
27123
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27124
+ }
27125
+ },
27126
+ {
27127
+ "kind": "method",
27128
+ "name": "reportRequired",
27129
+ "privacy": "protected",
27130
+ "return": {
27131
+ "type": {
27132
+ "text": "void"
27133
+ }
27134
+ },
27135
+ "parameters": [
27136
+ {
27137
+ "name": "empty",
27138
+ "type": {
27139
+ "text": "boolean"
27140
+ }
27141
+ },
27142
+ {
27143
+ "name": "message",
27144
+ "type": {
27145
+ "text": "string"
27146
+ }
27147
+ },
27148
+ {
27149
+ "name": "anchor",
27150
+ "type": {
27151
+ "text": "string"
27152
+ }
27153
+ }
27154
+ ],
27155
+ "description": "Reports \"required and empty\" and refreshes the message, or clears both.\n\nTwo things differ between the controls that call this, so those are the\narguments: whether the control is empty, which only it can say, and the\nsentence to say about it, which is different for a box, a switch and a\nset. The anchor is looked up here because every one of them anchors on a\nrendered part and the browser needs somewhere to point the bubble.\n\nThe message is not derived from the control's kind, deliberately. \"Tick\nthis box\" and \"Choose one\" are not the same instruction and a lookup\ntable would be one more thing to keep in step with the components.",
27156
+ "inheritedFrom": {
27157
+ "name": "MixinField",
27158
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27159
+ }
27160
+ },
27161
+ {
27162
+ "kind": "field",
27163
+ "name": "formAssociated",
27164
+ "type": {
27165
+ "text": "boolean"
27166
+ },
27167
+ "static": true,
27168
+ "readonly": true,
27169
+ "default": "true",
27170
+ "description": "Opts the element into form ownership, labels, and submission.",
27171
+ "inheritedFrom": {
27172
+ "name": "HelixFormElement",
27173
+ "module": "src/helix-form-element/helix-form-element.ts"
27174
+ }
27175
+ },
27176
+ {
27177
+ "kind": "field",
27178
+ "name": "disabled",
27179
+ "type": {
27180
+ "text": "boolean"
27181
+ },
27182
+ "default": "false",
27183
+ "description": "Whether the control is non-interactive.\n\nReflected, because the styled tier selects on it, and mirrored to\n`aria-disabled` rather than removing the element from the accessibility\ntree, so a screen reader can still announce that the control exists.\n\nThe mirror itself is in `willUpdate` below, here rather than in each\ncontrol, because here is where `disabled` is.",
27184
+ "attribute": "disabled",
27185
+ "reflects": true,
27186
+ "inheritedFrom": {
27187
+ "name": "HelixFormElement",
27188
+ "module": "src/helix-form-element/helix-form-element.ts"
27189
+ }
27190
+ },
27191
+ {
27192
+ "kind": "field",
27193
+ "name": "formDisabled",
27194
+ "type": {
27195
+ "text": "boolean"
27196
+ },
27197
+ "privacy": "protected",
27198
+ "default": "false",
27199
+ "description": "Whether an ancestor `<fieldset disabled>` has switched this control off.\n\nThe platform tells a form-associated element through `formDisabledCallback`\nand nothing else does, so without this a control inside a disabled fieldset\nstays fully typeable and announces itself as enabled.\n\nThe submission half is already the platform's: measured, the fieldset's\ncontrols are absent from the form's entry list and the host matches\n`:disabled`, so the value never goes anywhere. What is missing without this\nis everything a reader can see or touch.\n\nState rather than the `disabled` property. Writing that would reflect an\nattribute the consumer's server markup does not have, which React reports\non hydration and does not patch up, and it would also silently overwrite\nwhat the consumer set.",
27200
+ "inheritedFrom": {
27201
+ "name": "HelixFormElement",
27202
+ "module": "src/helix-form-element/helix-form-element.ts"
27203
+ }
27204
+ },
27205
+ {
27206
+ "kind": "method",
27207
+ "name": "formDisabledCallback",
27208
+ "return": {
27209
+ "type": {
27210
+ "text": "void"
27211
+ }
27212
+ },
27213
+ "parameters": [
27214
+ {
27215
+ "name": "disabled",
27216
+ "type": {
27217
+ "text": "boolean"
27218
+ }
27219
+ }
27220
+ ],
27221
+ "description": "The platform's notice that an ancestor fieldset changed.\n\n**The argument is the effective state, and taking it whole is what latched\nevery control in the library.** The platform calls this for the element's\nown `disabled` as well as for a fieldset, and our own arrives here at the\nworst possible moment: reflecting `disabled` to the attribute happens\ninside Lit's `update()`, the UA fires this synchronously from that write,\nand a reactive write during an update is a change-in-update Lit does not\nre-render for. So `formDisabled` ran exactly one update behind forever.\n\nMeasured on Slider, logging what `render` saw:\n\n```\nset true disabled true formDisabled false isDisabled true\nset false disabled false formDisabled true isDisabled true <- stale\n(no third render)\n```\n\nThe host came out right every time, `disabled` false, `:disabled` not\nmatching, and the inner control kept the attribute, so a control disabled\nonce could never be re-enabled. It only shows when something re-enables,\nwhich is the same shape of bug `inheritDisabled` was written for.\n\nOur own half is already in `this.disabled` and `isDisabled` is an or, so\nthis records only what the fieldset adds. That also removes the write\nentirely on the own-disabled path rather than moving it.\n\nThe one case this cannot see is a control that is disabled itself *and*\ninside a disabled fieldset, whose own `disabled` is then removed: the\neffective state does not change, so the platform does not call again, and\nthe fieldset's hold is not recorded. There is no callback to learn it from\nand reading `:disabled` here would answer about the attribute we are in the\nmiddle of removing.",
27222
+ "inheritedFrom": {
27223
+ "name": "HelixFormElement",
27224
+ "module": "src/helix-form-element/helix-form-element.ts"
27225
+ },
27226
+ "type": {
27227
+ "text": "formDisabledCallback(disabled: boolean) => void"
27228
+ }
27229
+ },
27230
+ {
27231
+ "kind": "field",
27232
+ "name": "name",
27233
+ "type": {
27234
+ "text": "string"
27235
+ },
27236
+ "default": "''",
27237
+ "description": "Name submitted with the form.\n\n**Reflected, and it is the exception to \"reflect only what CSS selects\non\".** The platform builds a form's entry list from the `name` *content\nattribute*, not from the property, so a control named through the property\nsubmitted under no name at all and was silently dropped. Measured: two\ninputs in one form, one named by attribute and one by property, and the\nform carried a single entry.\n\nSafe for a React consumer, which is what the rule is protecting: React\nrenders a custom element's props as attributes on the server, so the name\nis already in the markup being hydrated and reflecting it writes what is\nthere. It is only a change to the markup when a consumer assigns it\nimperatively later, and nothing is hydrating by then.\n\nHere rather than on each control.",
27238
+ "attribute": "name",
27239
+ "reflects": true,
27240
+ "inheritedFrom": {
27241
+ "name": "HelixFormElement",
27242
+ "module": "src/helix-form-element/helix-form-element.ts"
27243
+ }
27244
+ },
27245
+ {
27246
+ "kind": "field",
27247
+ "name": "form",
27248
+ "type": {
27249
+ "text": "HTMLFormElement | null"
27250
+ },
27251
+ "description": "The form this control belongs to, if any.",
27252
+ "readonly": true,
27253
+ "helix": {
27254
+ "references": [
27255
+ {
27256
+ "label": "form-associated custom elements",
27257
+ "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
27258
+ }
27259
+ ]
27260
+ },
27261
+ "inheritedFrom": {
27262
+ "name": "HelixFormElement",
27263
+ "module": "src/helix-form-element/helix-form-element.ts"
27264
+ }
27265
+ },
27266
+ {
27267
+ "kind": "field",
27268
+ "name": "labels",
27269
+ "type": {
27270
+ "text": "NodeList"
27271
+ },
27272
+ "description": "Labels associated with this control.",
27273
+ "readonly": true,
27274
+ "helix": {
27275
+ "references": [
27276
+ {
27277
+ "label": "form-associated custom elements",
27278
+ "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
27279
+ }
27280
+ ]
27281
+ },
27282
+ "inheritedFrom": {
27283
+ "name": "HelixFormElement",
27284
+ "module": "src/helix-form-element/helix-form-element.ts"
27285
+ }
27286
+ },
27287
+ {
27288
+ "kind": "field",
27289
+ "name": "tier",
27290
+ "type": {
27291
+ "text": "string"
27292
+ },
27293
+ "static": true,
27294
+ "default": "'helix-headless-'",
27295
+ "description": "The prefix this tier registers its elements under.\n\n**A component that renders another renders its own tier's version of it**,\nso `helix-headless-pagination-size` composes `helix-headless-select` and\n`helix-pagination-size` composes `helix-select`. One template says\n`${this.tag('select')}` and each tier answers with its own name.\n\n**The public tag may not be the composed one, in either tier.** Using it\ncosts three things: the name means two different things depending on what a\nconsumer imported, the headless tier composes an element it does not ship,\nand the composition cannot be tested there at all, because there is no\n`helix-select` on that tier to test it against.\n\n**A prefix rather than an override per composition**, which was the first\nplan and does not compile. An override re-renders the fragment from the\nsubclass, and the fragment reads members the base keeps private:\n`PaginationSize` alone would have had to widen `options`, `current` and\n`handleChange` to `protected` so a subclass could say the same thing again.\nSixteen families of that is a lot of encapsulation spent on saying one\nword differently.",
27296
+ "inheritedFrom": {
27297
+ "name": "HelixElement",
27298
+ "module": "src/helix-element/helix-element.ts"
27299
+ }
27300
+ },
27301
+ {
27302
+ "kind": "method",
27303
+ "name": "tag",
27304
+ "privacy": "protected",
27305
+ "return": {
27306
+ "type": {
27307
+ "text": "StaticValue"
27308
+ }
27309
+ },
27310
+ "parameters": [
27311
+ {
27312
+ "name": "name",
27313
+ "type": {
27314
+ "text": "string"
27315
+ }
27316
+ }
27317
+ ],
27318
+ "description": "One composed tag, as a static value a template can interpolate.\n\n`unsafeStatic` is safe by construction: the name is a literal in our own\nsource and the prefix is one of two strings this class defines. Called per\nrender and not cached, which costs nothing, because `static-html` keys its\ntemplate cache on the joined string rather than on the object.",
27319
+ "inheritedFrom": {
27320
+ "name": "HelixElement",
27321
+ "module": "src/helix-element/helix-element.ts"
27322
+ }
27323
+ },
27324
+ {
27325
+ "kind": "field",
27326
+ "name": "internals",
27327
+ "type": {
27328
+ "text": "ElementInternals"
27329
+ },
27330
+ "privacy": "protected",
27331
+ "readonly": true,
27332
+ "description": "The element's semantics, set without touching the DOM.\n\n`ElementInternals` sets the implicit role, which an author's own `role`\nattribute still overrides, and it writes no attribute. Setting `role` on the\nhost directly would: that is an attribute the element gives itself after it\nupgrades, which a React consumer's server markup never had, and hydration\nreports it as a mismatch.\n\nAvailable during server rendering. Lit's shim implements `attachInternals`,\nso nothing here needs a guard.",
27333
+ "inheritedFrom": {
27334
+ "name": "HelixElement",
27335
+ "module": "src/helix-element/helix-element.ts"
27336
+ }
27337
+ },
27338
+ {
27339
+ "kind": "method",
27340
+ "name": "toggleState",
27341
+ "privacy": "protected",
27342
+ "return": {
27343
+ "type": {
27344
+ "text": "void"
27345
+ }
27346
+ },
27347
+ "parameters": [
27348
+ {
27349
+ "name": "name",
27350
+ "type": {
27351
+ "text": "string"
27352
+ }
27353
+ },
27354
+ {
27355
+ "name": "on",
27356
+ "type": {
27357
+ "text": "boolean"
27358
+ }
27359
+ }
27360
+ ],
27361
+ "description": "Records a boolean fact about this element as a custom state.\n\n**The host belongs to whoever rendered it, and a component's own\nbookkeeping may not be kept there.** An attribute written on the first\nupdate is markup a consumer's server never sent, so a React consumer\nhydrates a DOM that has gained attributes since and reports a mismatch it\nwill not patch up. A custom state is not in the DOM at all: it carries the\nfact to a stylesheet through `:state()` and leaves the markup alone, so the\nserver's output and the client's agree by construction.\n\n`SETTLED` carries the long version of that argument; `checked`, `open`,\n`invalid` and `has-label` are recorded the same way, each of them a state a\n`default-*` attribute resolves before React reaches the node.\n\n**Deferring the definitions is not a fix and could not be.** Importing them\nfrom an effect so the upgrades fall the other side of hydration works only\nwhile hydration is one pass: anything that splits it, a streamed segment or\na suspended boundary, puts an upgrade back inside the window. Timing cannot\nbe the guarantee when the fact is kept somewhere React reconciles.\n\nFeature-tested rather than assumed, the way `hostAria` tests element\nreferences. An engine without `CustomStateSet` records nothing and keeps\nwhatever the resting rule draws, which is the safe direction to fail.\n\n**The engines the test is for are browsers**: Safari below 17.4 and Firefox\nbelow 126, where the write is a `TypeError`, so a component bypassing this\nfails to render rather than rendering without whatever the state draws.\nLit's server shim sets `states`, so the guard passes there and records a\nstate nothing reads, which is harmless.",
27362
+ "inheritedFrom": {
27363
+ "name": "HelixElement",
27364
+ "module": "src/helix-element/helix-element.ts"
27365
+ }
27366
+ },
27367
+ {
27368
+ "kind": "field",
27369
+ "name": "whenSettled",
27370
+ "type": {
27371
+ "text": "Promise<void>"
27372
+ },
27373
+ "readonly": true,
27374
+ "description": "Resolves a frame after the first update, when transitions are switched on.\n\n**Named `whenSettled` because `settled` is taken four times over**, by\nImage, Splitter and both color controls, none of them about transitions. A\nbase class takes the name every subclass then cannot use.\n\n**The state it reports cannot be watched, which is why this exists.** A\ncustom state is deliberately not in the DOM, so there is no\n`MutationObserver` equivalent for `ElementInternals.states`. Await this\ninstead.\n\nSeparate from `updateComplete`, which resolves in the microtask checkpoint\nthe suppression is still active in. That is the distinction `readyToMove`\nin `@fusion.dev/helix-testing` is written around.\n\nIt never resolves where `requestAnimationFrame` never fires, which is a\nserver, a hidden tab, and happy-dom. Callers that must not hang race it\nagainst a timeout; `readyToMove` does exactly that.",
27375
+ "default": "new Promise<void>((resolve) => { this.resolveSettled = resolve })",
27376
+ "inheritedFrom": {
27377
+ "name": "HelixElement",
27378
+ "module": "src/helix-element/helix-element.ts"
27379
+ }
27380
+ },
27381
+ {
27382
+ "kind": "field",
27383
+ "name": "resolveSettled",
27384
+ "type": {
27385
+ "text": "() => void"
27386
+ },
27387
+ "privacy": "private",
27388
+ "description": "Resolves `whenSettled`, once, from the frame that records the state.",
27389
+ "inheritedFrom": {
27390
+ "name": "HelixElement",
27391
+ "module": "src/helix-element/helix-element.ts"
27392
+ }
27393
+ },
27394
+ {
27395
+ "kind": "field",
27396
+ "name": "stopInner",
27397
+ "privacy": "protected",
27398
+ "readonly": true,
27399
+ "description": "Stops an inner control's own announcement at this element's boundary.\n\n**A composed control is one control to a consumer, and the natives had no\nequivalent of the stop the prefixed events already get.** `<helix-select>`\nrenders a `<helix-listbox>`, and both announce: the listbox dispatches\n`input` and `change` from its own host, `input` is composed by\nspecification, and a consumer listening on the select therefore heard one\nchoice twice. Measured before this existed, on the styled tier, one choice\non the inner listbox: select `input` twice and `change` three times,\ncombobox, date input, time input and color input twice each. `Command` was\nthe only one that was right, because it happened to reach for\n`stopImmediatePropagation` for a different reason.\n\nBound on the child in the parent's template, so it runs while the event is\nstill at the child and before it can cross. The guard is for the case where\na component binds this on itself: an element must never stop its own\nannouncement, which is the one it exists to make.\n\nThis is the same job the `helix-before-*` handlers do with their own\n`stopPropagation`, and it is separate rather than folded into them because\na consumer may legitimately refuse a request without the notification ever\nhappening: the two travel at different times and one can be absent.",
27400
+ "inheritedFrom": {
27401
+ "name": "HelixElement",
27402
+ "module": "src/helix-element/helix-element.ts"
27403
+ }
27404
+ },
27405
+ {
27406
+ "kind": "method",
27407
+ "name": "relayNativeEvent",
27408
+ "privacy": "protected",
27409
+ "return": {
27410
+ "type": {
27411
+ "text": "void"
27412
+ }
27413
+ },
27414
+ "parameters": [
27415
+ {
27416
+ "name": "event",
27417
+ "type": {
27418
+ "text": "Event"
27419
+ }
27420
+ },
27421
+ {
27422
+ "name": "init",
27423
+ "optional": true,
27424
+ "type": {
27425
+ "text": "EventInit"
27426
+ }
27427
+ }
27428
+ ],
27429
+ "description": "Re-emits a native event from the host, under its own name.\n\nA native event fired by an inner `<input>` or `<textarea>` is not composed,\nso it stops at the shadow boundary and a consumer listening on\n`<helix-input>` hears nothing. Re-dispatching it from the host is what\nmakes the component behave like the control it wraps.\n\nThe relayed event keeps the native name deliberately. `change` is `change`,\nwhich is what a consumer already knows to listen for, and it is what\nreaches React: its synthetic system claims `onChange` and wires it to that\nname, so a prefixed one would never arrive.\n\n`composed` is not forced. It defaults to the original event's own value, so\na relayed `change` stops at the next shadow boundary exactly as a native\none would. Pass it explicitly only where escaping is the intent, and say so\nwhere you do.",
27430
+ "inheritedFrom": {
27431
+ "name": "HelixElement",
27432
+ "module": "src/helix-element/helix-element.ts"
27433
+ }
27434
+ },
27435
+ {
27436
+ "kind": "method",
27437
+ "name": "finalizeStyles",
27438
+ "privacy": "protected",
27439
+ "static": true,
27440
+ "return": {
27441
+ "type": {
27442
+ "text": "CSSResultOrNative[]"
27443
+ }
27444
+ },
27445
+ "parameters": [
27446
+ {
27447
+ "name": "styles",
27448
+ "optional": true,
27449
+ "type": {
27450
+ "text": "CSSResultOrNative | CSSResultOrNative[]"
27451
+ }
27452
+ }
27453
+ ],
27454
+ "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it.",
27455
+ "inheritedFrom": {
27456
+ "name": "HelixElement",
27457
+ "module": "src/helix-element/helix-element.ts"
27458
+ }
27459
+ }
27460
+ ],
27461
+ "events": [
27462
+ {
27463
+ "name": "change",
27464
+ "type": {
27465
+ "text": "Event"
27466
+ },
27467
+ "description": "Relayed from the input once the reader has finished.",
27468
+ "inheritedFrom": {
27469
+ "name": "MixinControllerValue",
27470
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27471
+ },
27472
+ "reactProp": "onchange"
27473
+ },
27474
+ {
27475
+ "type": {
27476
+ "text": "HelixBeforeChangeEvent"
27477
+ },
27478
+ "description": "Fired as the text changes, and cancelable.",
27479
+ "name": "helix-before-change",
27480
+ "reactProp": "onhelix-before-change"
27481
+ },
27482
+ {
27483
+ "name": "input",
27484
+ "type": {
27485
+ "text": "Event"
27486
+ },
27487
+ "description": "Announced once the text has moved.",
27488
+ "inheritedFrom": {
27489
+ "name": "MixinControllerValue",
27490
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27491
+ },
27492
+ "reactProp": "oninput"
27493
+ }
27494
+ ],
27495
+ "attributes": [
27496
+ {
27497
+ "name": "clearable",
27498
+ "type": {
27499
+ "text": "boolean"
27500
+ },
27501
+ "default": "false",
27502
+ "description": "Whether the field offers a button that empties it.\n\nThe text only. The tokens are the consumer's markup and this element is not\nentitled to take them out of the document, which is the same reason\n`hideOverflow` marks the ones over the cap `hidden` rather than removing\nthem.",
27503
+ "fieldName": "clearable"
27504
+ },
27505
+ {
27506
+ "name": "clear-label",
27507
+ "type": {
27508
+ "text": "string"
27509
+ },
27510
+ "default": "'Clear'",
27511
+ "description": "What the clear button is called, since an icon has no name of its own.",
27512
+ "fieldName": "clearLabel"
27513
+ },
27514
+ {
27515
+ "name": "placeholder",
27516
+ "type": {
27517
+ "text": "string"
27518
+ },
27519
+ "default": "''",
27520
+ "description": "Shown while the field is empty.\n\nNot a label: it goes when typing starts.",
27521
+ "fieldName": "placeholder"
27522
+ },
27523
+ {
27524
+ "name": "max-tags",
27525
+ "type": {
27526
+ "text": "number"
27527
+ },
27528
+ "default": "0",
27529
+ "description": "How many tokens to show before the rest become a count.",
27530
+ "fieldName": "maxTags",
27531
+ "inheritedFrom": {
27532
+ "name": "MixinTokens",
27533
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
27534
+ }
27535
+ },
27536
+ {
27537
+ "name": "default-value",
27538
+ "type": {
27539
+ "text": "string"
27540
+ },
27541
+ "default": "''",
27542
+ "description": "The value the markup declared, which is where a reset returns to.",
27543
+ "fieldName": "defaultValue",
27544
+ "inheritedFrom": {
27545
+ "name": "MixinControllerValue",
27546
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27547
+ }
27548
+ },
27549
+ {
27550
+ "name": "value",
27551
+ "type": {
27552
+ "text": "string"
27553
+ },
27554
+ "description": "What the control holds now, and what its form submits.\n\nOne property, not two, so `input.value` answers the question anyone\nasking it meant. Writing always applies; `<helix-input value=\"x\">` is the\nsame statement in markup, and `default-value` is how markup seeds a value\na reset should return to.",
27555
+ "fieldName": "value",
27556
+ "inheritedFrom": {
27557
+ "name": "MixinControllerValue",
27558
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27559
+ }
27560
+ },
27561
+ {
27562
+ "name": "feedback",
27563
+ "type": {
27564
+ "text": "string"
27565
+ },
27566
+ "default": "''",
27567
+ "description": "What is wrong, in the reader's words rather than the browser's.",
27568
+ "fieldName": "feedback",
27569
+ "inheritedFrom": {
27570
+ "name": "MixinField",
27571
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27572
+ }
27573
+ },
27574
+ {
27575
+ "name": "hint",
27576
+ "type": {
27577
+ "text": "string"
27578
+ },
27579
+ "default": "''",
27580
+ "description": "Help under the control, shown while there is nothing wrong.",
27581
+ "fieldName": "hint",
27582
+ "inheritedFrom": {
27583
+ "name": "MixinField",
27584
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27585
+ }
27586
+ },
27587
+ {
27588
+ "name": "label",
27589
+ "type": {
27590
+ "text": "string"
27591
+ },
27592
+ "default": "''",
27593
+ "description": "The accessible name, and the fallback for the `label` slot.",
27594
+ "fieldName": "label",
27595
+ "inheritedFrom": {
27596
+ "name": "MixinField",
27597
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27598
+ }
27599
+ },
27600
+ {
27601
+ "name": "required",
27602
+ "type": {
27603
+ "text": "boolean"
27604
+ },
27605
+ "default": "false",
27606
+ "description": "Whether the form refuses to submit without it.",
27607
+ "fieldName": "required",
27608
+ "inheritedFrom": {
27609
+ "name": "MixinField",
27610
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27611
+ }
27612
+ },
27613
+ {
27614
+ "name": "disabled",
27615
+ "type": {
27616
+ "text": "boolean"
27617
+ },
27618
+ "default": "false",
27619
+ "description": "Whether the control is non-interactive.\n\nReflected, because the styled tier selects on it, and mirrored to\n`aria-disabled` rather than removing the element from the accessibility\ntree, so a screen reader can still announce that the control exists.\n\nThe mirror itself is in `willUpdate` below, here rather than in each\ncontrol, because here is where `disabled` is.",
27620
+ "fieldName": "disabled",
27621
+ "inheritedFrom": {
27622
+ "name": "HelixFormElement",
27623
+ "module": "src/helix-form-element/helix-form-element.ts"
27624
+ }
27625
+ },
27626
+ {
27627
+ "name": "name",
27628
+ "type": {
27629
+ "text": "string"
27630
+ },
27631
+ "default": "''",
27632
+ "description": "Name submitted with the form.\n\n**Reflected, and it is the exception to \"reflect only what CSS selects\non\".** The platform builds a form's entry list from the `name` *content\nattribute*, not from the property, so a control named through the property\nsubmitted under no name at all and was silently dropped. Measured: two\ninputs in one form, one named by attribute and one by property, and the\nform carried a single entry.\n\nSafe for a React consumer, which is what the rule is protecting: React\nrenders a custom element's props as attributes on the server, so the name\nis already in the markup being hydrated and reflecting it writes what is\nthere. It is only a change to the markup when a consumer assigns it\nimperatively later, and nothing is hydrating by then.\n\nHere rather than on each control.",
27633
+ "fieldName": "name",
27634
+ "inheritedFrom": {
27635
+ "name": "HelixFormElement",
27636
+ "module": "src/helix-form-element/helix-form-element.ts"
27637
+ }
27638
+ }
27639
+ ],
27640
+ "mixins": [
27641
+ {
27642
+ "name": "MixinTokens",
27643
+ "package": "@fusion.dev/helix-core"
27644
+ },
27645
+ {
27646
+ "name": "MixinControllerValue",
27647
+ "package": "@fusion.dev/helix-core"
27648
+ },
27649
+ {
27650
+ "name": "MixinField",
27651
+ "package": "@fusion.dev/helix-core"
27652
+ }
27653
+ ],
27654
+ "superclass": {
27655
+ "name": "HelixFormElement",
27656
+ "package": "@fusion.dev/helix-core"
27657
+ },
27658
+ "summary": "A field that narrows something else, beside what is already narrowing it.",
27659
+ "helix": {
27660
+ "category": "forms",
27661
+ "since": "0.1.0",
27662
+ "status": "experimental",
27663
+ "documentation": "https://helix.fusion.dev/components/filter-input",
27664
+ "aliases": [
27665
+ "SearchField",
27666
+ "FacetInput",
27667
+ "TokenInput"
27668
+ ],
27669
+ "tier": "headless",
27670
+ "group": "BaseFilterInput",
27671
+ "part": "Root",
27672
+ "examples": [
27673
+ {
27674
+ "description": "The same filter field on the headless tier, with every rule written by hand.",
27675
+ "slug": "preview"
27676
+ }
27677
+ ],
27678
+ "source": "helix/headless/src/filter-input"
27679
+ },
27680
+ "tagName": "helix-headless-filter-input",
27681
+ "customElement": true,
27682
+ "modulePath": "src/filter-input/root/filter-input-root.ts",
27683
+ "definitionPath": "src/filter-input/root/filter-input-root.ts"
27684
+ }
27685
+ ],
27686
+ "exports": [
27687
+ {
27688
+ "kind": "js",
27689
+ "name": "HelixHeadlessFilterInput",
27690
+ "declaration": {
27691
+ "name": "HelixHeadlessFilterInput",
27692
+ "module": "src/filter-input/root/filter-input-root.ts"
27693
+ }
27694
+ },
27695
+ {
27696
+ "kind": "custom-element-definition",
27697
+ "name": "helix-headless-filter-input",
27698
+ "declaration": {
27699
+ "name": "HelixHeadlessFilterInput",
27700
+ "module": "src/filter-input/root/filter-input-root.ts"
27701
+ }
27702
+ }
27703
+ ]
27704
+ },
27705
+ {
27706
+ "kind": "javascript-module",
27707
+ "path": "src/format-date/index.ts",
27708
+ "declarations": [],
27709
+ "exports": [
27710
+ {
27711
+ "kind": "js",
27712
+ "name": "HelixHeadlessFormatDate",
27713
+ "declaration": {
27714
+ "name": "HelixHeadlessFormatDate",
27715
+ "module": "./root/format-date-root.js"
27716
+ }
27717
+ }
27718
+ ]
27719
+ },
27720
+ {
27721
+ "kind": "javascript-module",
27722
+ "path": "src/format-date/root/format-date-root.ts",
27723
+ "declarations": [
27724
+ {
27725
+ "kind": "class",
27726
+ "description": "A date in a page is almost never wanted as an ISO string, and formatting one\nin the consumer's own code means every consumer ships a copy of the same\n`Intl` call and a different set of options. This is that call, as an element,\nso a date is written where it is shown.\n\n**`elapsed` is the mode a feed wants, and it stops being relative on\npurpose.** \"42m\", \"3h\", \"1d\" is what a row of activity reads as, and past a\nweek the compact form is a lie: `Intl.NumberFormat` narrow renders both\n`minute` and `month` as `m` in en-US, so \"3m\" is three minutes at the top of a\nfeed and three months further down it. Past six days this shows a date, which\nis shorter to read and impossible to misread. `elapsedTime` in `helix/core`\ncarries the measurement.\n\n**The reading refreshes itself, from one timer the page shares.** A relative\ntimestamp is correct for as long as its unit lasts and wrong afterwards, and a\npage left open is exactly where that shows. Each element asks to be woken when\nits own reading expires rather than polling, and an element showing a date\nasks for nothing at all: fifty rows and fifty intervals is fifty wakeups a\nsecond where one will do, and a feed of last month's notifications should cost\nnothing to leave open.\n\n**`<time datetime>` whatever the text says**, so a screen reader, a copy and\npaste, and anything parsing the page all get the real instant rather than\n\"yesterday\".",
27727
+ "name": "HelixHeadlessFormatDate",
27728
+ "cssParts": [
27729
+ {
27730
+ "description": "The `<time>` element carrying the reading.",
27731
+ "name": "time"
27732
+ }
27733
+ ],
27734
+ "members": [
27735
+ {
27736
+ "kind": "field",
27737
+ "name": "date",
27738
+ "type": {
27739
+ "text": "string"
27740
+ },
27741
+ "default": "''",
27742
+ "description": "The timestamp, as anything `Date` parses.\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-format-date elapsed>2026-08-27T01:00:00Z</helix-format-date>` is the\nspelling that reads best in markup, and it cannot be the only one: measured\nagainst Lit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see it.\nAn element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
27743
+ "attribute": "date"
27744
+ },
27745
+ {
27746
+ "kind": "field",
27747
+ "name": "day",
27748
+ "type": {
27749
+ "text": "'numeric' | '2-digit' | undefined"
27750
+ },
27751
+ "description": "How the day of the month is written, where a date is shown.",
27752
+ "attribute": "day"
27753
+ },
27754
+ {
27755
+ "kind": "field",
27756
+ "name": "elapsed",
27757
+ "type": {
27758
+ "text": "boolean"
27759
+ },
27760
+ "default": "false",
27761
+ "description": "Show how long ago it was, compactly, instead of the date.\n\nReflected, because it is the one property that decides which of two readings\nthis is and a stylesheet has a reason to know: a compact reading is a fixed\nfew characters and a date is not.",
27762
+ "attribute": "elapsed",
27763
+ "reflects": true
27764
+ },
27765
+ {
27766
+ "kind": "field",
27767
+ "name": "hour",
27768
+ "type": {
27769
+ "text": "'numeric' | '2-digit' | undefined"
27770
+ },
27771
+ "description": "How the hour is written, where a time of day is shown.",
27772
+ "attribute": "hour"
27773
+ },
27774
+ {
27775
+ "kind": "field",
27776
+ "name": "locale",
27777
+ "type": {
27778
+ "text": "string"
27779
+ },
27780
+ "default": "''",
27781
+ "description": "Locale for the reading.\n\nEmpty is the runtime's own.",
27782
+ "attribute": "locale"
27783
+ },
27784
+ {
27785
+ "kind": "field",
27786
+ "name": "minute",
27787
+ "type": {
27788
+ "text": "'numeric' | '2-digit' | undefined"
27789
+ },
27790
+ "description": "How the minute is written, where a time of day is shown.",
27791
+ "attribute": "minute"
27792
+ },
27793
+ {
27794
+ "kind": "field",
27795
+ "name": "month",
27796
+ "type": {
27797
+ "text": "'numeric' | '2-digit' | 'long' | 'short' | 'narrow' | undefined"
27798
+ },
27799
+ "description": "How the month is written, where a date is shown.",
27800
+ "attribute": "month"
27801
+ },
27802
+ {
27803
+ "kind": "field",
27804
+ "name": "second",
27805
+ "type": {
27806
+ "text": "'numeric' | '2-digit' | undefined"
27807
+ },
27808
+ "description": "How the second is written, where a time of day is shown.",
27809
+ "attribute": "second"
27810
+ },
27811
+ {
27812
+ "kind": "field",
27813
+ "name": "timeZone",
27814
+ "type": {
27815
+ "text": "string | undefined"
27816
+ },
27817
+ "description": "The time zone to read the timestamp in.\n\nEmpty is the runtime's own.",
27818
+ "attribute": "time-zone"
27819
+ },
27820
+ {
27821
+ "kind": "field",
27822
+ "name": "timeZoneName",
27823
+ "type": {
27824
+ "text": "'long' | 'short' | undefined"
27825
+ },
27826
+ "description": "Whether to name the time zone, and how.",
27827
+ "attribute": "time-zone-name"
27828
+ },
27829
+ {
27830
+ "kind": "field",
27831
+ "name": "weekday",
27832
+ "type": {
27833
+ "text": "'long' | 'short' | 'narrow' | undefined"
27834
+ },
27835
+ "description": "How the weekday is written, where one is shown.",
27836
+ "attribute": "weekday"
27837
+ },
27838
+ {
26499
27839
  "kind": "field",
26500
27840
  "name": "year",
26501
27841
  "type": {
@@ -29975,6 +31315,14 @@
29975
31315
  "module": "src/file-input/index.js"
29976
31316
  }
29977
31317
  },
31318
+ {
31319
+ "kind": "js",
31320
+ "name": "*",
31321
+ "declaration": {
31322
+ "name": "*",
31323
+ "module": "src/filter-input/index.js"
31324
+ }
31325
+ },
29978
31326
  {
29979
31327
  "kind": "js",
29980
31328
  "name": "*",