@fusion.dev/helix-headless 0.12.3 → 0.13.1

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.
@@ -15231,6 +15231,14 @@
15231
15231
  "name": "helix-create",
15232
15232
  "reactProp": "onhelix-create"
15233
15233
  },
15234
+ {
15235
+ "type": {
15236
+ "text": "HelixFilterEvent"
15237
+ },
15238
+ "description": "Fired as the reader types, carrying the text the list is being narrowed to. Cancelable: refusing it leaves the list whole, and is how a consumer takes the filtering for themselves.",
15239
+ "name": "helix-filter",
15240
+ "reactProp": "onhelix-filter"
15241
+ },
15234
15242
  {
15235
15243
  "name": "input",
15236
15244
  "type": {
@@ -26469,262 +26477,1497 @@
26469
26477
  },
26470
26478
  {
26471
26479
  "kind": "javascript-module",
26472
- "path": "src/format-date/index.ts",
26480
+ "path": "src/filter-input/index.ts",
26473
26481
  "declarations": [],
26474
26482
  "exports": [
26475
26483
  {
26476
26484
  "kind": "js",
26477
- "name": "HelixHeadlessFormatDate",
26485
+ "name": "*",
26478
26486
  "declaration": {
26479
- "name": "HelixHeadlessFormatDate",
26480
- "module": "./root/format-date-root.js"
26487
+ "name": "*",
26488
+ "module": "src/filter-input/root/filter-input-root.js"
26481
26489
  }
26482
26490
  }
26483
26491
  ]
26484
26492
  },
26485
26493
  {
26486
26494
  "kind": "javascript-module",
26487
- "path": "src/format-date/root/format-date-root.ts",
26495
+ "path": "src/filter-input/root/filter-input-root.ts",
26488
26496
  "declarations": [
26489
26497
  {
26490
26498
  "kind": "class",
26491
- "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\".",
26492
- "name": "HelixHeadlessFormatDate",
26499
+ "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.",
26500
+ "name": "HelixHeadlessFilterInput",
26493
26501
  "cssParts": [
26494
26502
  {
26495
- "description": "The `<time>` element carrying the reading.",
26496
- "name": "time"
26503
+ "description": "The button that empties the field.",
26504
+ "name": "clear"
26505
+ },
26506
+ {
26507
+ "description": "The input itself.",
26508
+ "name": "control"
26509
+ },
26510
+ {
26511
+ "description": "What is wrong with it.",
26512
+ "name": "feedback"
26513
+ },
26514
+ {
26515
+ "description": "The box holding everything.",
26516
+ "name": "field"
26517
+ },
26518
+ {
26519
+ "description": "Help under the field, while nothing is wrong.",
26520
+ "name": "hint"
26521
+ },
26522
+ {
26523
+ "description": "The question, over the field.",
26524
+ "name": "label"
26525
+ },
26526
+ {
26527
+ "description": "How many tokens did not fit.",
26528
+ "name": "rest"
26529
+ },
26530
+ {
26531
+ "description": "The row the tokens sit in.",
26532
+ "name": "tags"
26533
+ }
26534
+ ],
26535
+ "slots": [
26536
+ {
26537
+ "description": "After the text, for a count or a control.",
26538
+ "name": "end"
26539
+ },
26540
+ {
26541
+ "description": "Before the text, for a search icon.",
26542
+ "name": "start"
26543
+ },
26544
+ {
26545
+ "description": "What is already narrowing the results, as `Tag`s.",
26546
+ "name": "tags"
26497
26547
  }
26498
26548
  ],
26499
26549
  "members": [
26500
26550
  {
26501
26551
  "kind": "field",
26502
- "name": "date",
26503
- "type": {
26504
- "text": "string"
26505
- },
26506
- "default": "''",
26507
- "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.",
26508
- "attribute": "date"
26552
+ "name": "aria",
26553
+ "privacy": "protected",
26554
+ "readonly": true,
26555
+ "default": "new AriaForwardController(this, { target: () => this.renderRoot?.querySelector<HTMLElement>('[part=\"control\"]') ?? null, })"
26509
26556
  },
26510
26557
  {
26511
26558
  "kind": "field",
26512
- "name": "day",
26559
+ "name": "announcesInput",
26513
26560
  "type": {
26514
- "text": "'numeric' | '2-digit' | undefined"
26561
+ "text": "boolean"
26515
26562
  },
26516
- "description": "How the day of the month is written, where a date is shown.",
26517
- "attribute": "day"
26563
+ "privacy": "protected",
26564
+ "readonly": true,
26565
+ "default": "true",
26566
+ "description": "Typed, so every keystroke is announced. See `announcesInput`.",
26567
+ "inheritedFrom": {
26568
+ "name": "MixinControllerValue",
26569
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26570
+ }
26518
26571
  },
26519
26572
  {
26520
26573
  "kind": "field",
26521
- "name": "elapsed",
26574
+ "name": "clearable",
26522
26575
  "type": {
26523
26576
  "text": "boolean"
26524
26577
  },
26525
26578
  "default": "false",
26526
- "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.",
26527
- "attribute": "elapsed",
26528
- "reflects": true
26579
+ "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.",
26580
+ "attribute": "clearable"
26529
26581
  },
26530
26582
  {
26531
26583
  "kind": "field",
26532
- "name": "hour",
26584
+ "name": "clearLabel",
26533
26585
  "type": {
26534
- "text": "'numeric' | '2-digit' | undefined"
26586
+ "text": "string"
26535
26587
  },
26536
- "description": "How the hour is written, where a time of day is shown.",
26537
- "attribute": "hour"
26588
+ "default": "'Clear'",
26589
+ "description": "What the clear button is called, since an icon has no name of its own.",
26590
+ "attribute": "clear-label"
26538
26591
  },
26539
26592
  {
26540
26593
  "kind": "field",
26541
- "name": "locale",
26594
+ "name": "placeholder",
26542
26595
  "type": {
26543
26596
  "text": "string"
26544
26597
  },
26545
26598
  "default": "''",
26546
- "description": "Locale for the reading.\n\nEmpty is the runtime's own.",
26547
- "attribute": "locale"
26548
- },
26549
- {
26550
- "kind": "field",
26551
- "name": "minute",
26552
- "type": {
26553
- "text": "'numeric' | '2-digit' | undefined"
26554
- },
26555
- "description": "How the minute is written, where a time of day is shown.",
26556
- "attribute": "minute"
26557
- },
26558
- {
26559
- "kind": "field",
26560
- "name": "month",
26561
- "type": {
26562
- "text": "'numeric' | '2-digit' | 'long' | 'short' | 'narrow' | undefined"
26563
- },
26564
- "description": "How the month is written, where a date is shown.",
26565
- "attribute": "month"
26599
+ "description": "Shown while the field is empty.\n\nNot a label: it goes when typing starts.",
26600
+ "attribute": "placeholder"
26566
26601
  },
26567
26602
  {
26568
26603
  "kind": "field",
26569
- "name": "second",
26604
+ "name": "over",
26570
26605
  "type": {
26571
- "text": "'numeric' | '2-digit' | undefined"
26606
+ "text": "number"
26572
26607
  },
26573
- "description": "How the second is written, where a time of day is shown.",
26574
- "attribute": "second"
26608
+ "privacy": "private",
26609
+ "default": "0",
26610
+ "description": "How many tokens did not fit, which is what the row's count renders."
26575
26611
  },
26576
26612
  {
26577
26613
  "kind": "field",
26578
- "name": "timeZone",
26614
+ "name": "releaseCaret",
26579
26615
  "type": {
26580
- "text": "string | undefined"
26616
+ "text": "(() => void) | undefined"
26581
26617
  },
26582
- "description": "The time zone to read the timestamp in.\n\nEmpty is the runtime's own.",
26583
- "attribute": "time-zone"
26618
+ "privacy": "private",
26619
+ "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`."
26584
26620
  },
26585
26621
  {
26586
26622
  "kind": "field",
26587
- "name": "timeZoneName",
26623
+ "name": "shadowRootOptions",
26588
26624
  "type": {
26589
- "text": "'long' | 'short' | undefined"
26625
+ "text": "ShadowRootInit"
26590
26626
  },
26591
- "description": "Whether to name the time zone, and how.",
26592
- "attribute": "time-zone-name"
26627
+ "static": true,
26628
+ "default": "{ ...HelixFormElement.shadowRootOptions, delegatesFocus: true, }",
26629
+ "description": "Focus is delegated to the input, so the host is never the focus target."
26593
26630
  },
26594
26631
  {
26595
26632
  "kind": "field",
26596
- "name": "weekday",
26633
+ "name": "control",
26597
26634
  "type": {
26598
- "text": "'long' | 'short' | 'narrow' | undefined"
26635
+ "text": "HTMLInputElement | null"
26599
26636
  },
26600
- "description": "How the weekday is written, where one is shown.",
26601
- "attribute": "weekday"
26637
+ "privacy": "private",
26638
+ "readonly": true
26602
26639
  },
26603
26640
  {
26604
26641
  "kind": "field",
26605
- "name": "year",
26642
+ "name": "tokens",
26606
26643
  "type": {
26607
- "text": "'numeric' | '2-digit' | undefined"
26644
+ "text": "HTMLSlotElement | null"
26608
26645
  },
26609
- "description": "How the year is written, where a date is shown.",
26610
- "attribute": "year"
26646
+ "privacy": "private",
26647
+ "readonly": true
26611
26648
  },
26612
26649
  {
26613
26650
  "kind": "field",
26614
- "name": "clock",
26651
+ "name": "showsClear",
26615
26652
  "type": {
26616
- "text": "number | undefined"
26653
+ "text": "boolean"
26617
26654
  },
26618
26655
  "privacy": "private",
26619
- "default": "undefined",
26620
- "description": "The clock this element last drew against.\n\nA state field and not a read of `Date.now()` inside `render`, which would\nmake the template a function of something Lit cannot see change: the element\nwould draw the right text once and never notice it had gone stale."
26656
+ "description": "Whether there is a clear button on screen right now.",
26657
+ "readonly": true
26621
26658
  },
26622
26659
  {
26623
26660
  "kind": "field",
26624
- "name": "written",
26625
- "type": {
26626
- "text": "string"
26627
- },
26661
+ "name": "handleInput",
26628
26662
  "privacy": "private",
26629
- "default": "''",
26630
- "description": "The date read out of the light DOM, where no attribute carried one."
26663
+ "readonly": true,
26664
+ "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."
26631
26665
  },
26632
26666
  {
26633
26667
  "kind": "field",
26634
- "name": "stopTicking",
26635
- "type": {
26636
- "text": "(() => void) | undefined"
26637
- },
26668
+ "name": "handleChange",
26638
26669
  "privacy": "private",
26639
- "default": "undefined"
26670
+ "readonly": true,
26671
+ "description": "Relayed, because `change` does not cross a shadow boundary on its own."
26640
26672
  },
26641
26673
  {
26642
26674
  "kind": "field",
26643
- "name": "watching",
26644
- "type": {
26645
- "text": "MutationObserver | undefined"
26646
- },
26675
+ "name": "handleClear",
26647
26676
  "privacy": "private",
26648
- "default": "undefined"
26677
+ "readonly": true,
26678
+ "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."
26649
26679
  },
26650
26680
  {
26651
26681
  "kind": "field",
26652
- "name": "moment",
26653
- "type": {
26654
- "text": "Date | undefined"
26655
- },
26682
+ "name": "handleKeydown",
26656
26683
  "privacy": "private",
26657
- "description": "The timestamp, or nothing where there is not one to read.",
26658
26684
  "readonly": true
26659
26685
  },
26660
26686
  {
26661
26687
  "kind": "field",
26662
- "name": "options",
26663
- "type": {
26664
- "text": "Absolute"
26665
- },
26688
+ "name": "handleTokens",
26666
26689
  "privacy": "private",
26667
- "description": "Every `Intl.DateTimeFormat` option a consumer set, and none they did not.",
26668
- "readonly": true
26690
+ "readonly": true,
26691
+ "description": "The row again, whenever what is in it changes."
26669
26692
  },
26670
26693
  {
26671
26694
  "kind": "method",
26672
- "name": "read",
26673
- "privacy": "private",
26695
+ "name": "removeLastToken",
26696
+ "privacy": "protected",
26674
26697
  "return": {
26675
26698
  "type": {
26676
26699
  "text": "void"
26677
26700
  }
26678
26701
  },
26679
- "description": "The light DOM's own text, which is the other way to write the value."
26680
- },
26681
- {
26682
- "kind": "method",
26683
- "name": "watch",
26684
- "privacy": "private",
26685
- "return": {
26686
- "type": {
26687
- "text": "void"
26688
- }
26702
+ "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.",
26703
+ "inheritedFrom": {
26704
+ "name": "MixinTokens",
26705
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26689
26706
  }
26690
26707
  },
26691
26708
  {
26692
26709
  "kind": "method",
26693
- "name": "tick",
26694
- "privacy": "private",
26710
+ "name": "focus",
26695
26711
  "return": {
26696
26712
  "type": {
26697
26713
  "text": "void"
26698
26714
  }
26699
26715
  },
26700
- "description": "Schedules the next reading, and only the next one.\n\nThe formatter says when its own answer expires, so this asks for exactly\nthat moment rather than polling: an item minutes old wakes once a minute, an\nitem hours old once an hour, and an item showing a date never, which is the\ndifference between a feed that costs nothing to leave open and one that\ndoes."
26716
+ "parameters": [
26717
+ {
26718
+ "name": "options",
26719
+ "optional": true,
26720
+ "type": {
26721
+ "text": "FocusOptions"
26722
+ }
26723
+ }
26724
+ ],
26725
+ "description": "Puts the caret in the field, the way a label pointing at one would.",
26726
+ "type": {
26727
+ "text": "focus(options?: FocusOptions) => void"
26728
+ }
26701
26729
  },
26702
26730
  {
26703
26731
  "kind": "field",
26704
- "name": "tier",
26732
+ "name": "maxTags",
26705
26733
  "type": {
26706
- "text": "string"
26734
+ "text": "number"
26707
26735
  },
26708
- "static": true,
26709
- "default": "'helix-headless-'",
26710
- "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.",
26736
+ "default": "0",
26737
+ "description": "How many tokens to show before the rest become a count.",
26738
+ "attribute": "max-tags",
26711
26739
  "inheritedFrom": {
26712
- "name": "HelixElement",
26713
- "module": "src/helix-element/helix-element.ts"
26740
+ "name": "MixinTokens",
26741
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26714
26742
  }
26715
26743
  },
26716
26744
  {
26717
26745
  "kind": "method",
26718
- "name": "tag",
26746
+ "name": "renderTokenRow",
26719
26747
  "privacy": "protected",
26720
26748
  "return": {
26721
26749
  "type": {
26722
- "text": "StaticValue"
26750
+ "text": "TemplateResult | typeof nothing"
26723
26751
  }
26724
26752
  },
26725
26753
  "parameters": [
26726
26754
  {
26727
- "name": "name",
26755
+ "name": "content",
26756
+ "type": {
26757
+ "text": "unknown"
26758
+ }
26759
+ },
26760
+ {
26761
+ "name": "over",
26762
+ "type": {
26763
+ "text": "number"
26764
+ }
26765
+ }
26766
+ ],
26767
+ "inheritedFrom": {
26768
+ "name": "MixinTokens",
26769
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26770
+ }
26771
+ },
26772
+ {
26773
+ "kind": "method",
26774
+ "name": "hideOverflow",
26775
+ "privacy": "protected",
26776
+ "return": {
26777
+ "type": {
26778
+ "text": "number"
26779
+ }
26780
+ },
26781
+ "parameters": [
26782
+ {
26783
+ "name": "slot",
26784
+ "type": {
26785
+ "text": "HTMLSlotElement | null | undefined"
26786
+ }
26787
+ }
26788
+ ],
26789
+ "inheritedFrom": {
26790
+ "name": "MixinTokens",
26791
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26792
+ }
26793
+ },
26794
+ {
26795
+ "kind": "method",
26796
+ "name": "tokenKeydown",
26797
+ "privacy": "protected",
26798
+ "return": {
26799
+ "type": {
26800
+ "text": "boolean"
26801
+ }
26802
+ },
26803
+ "parameters": [
26804
+ {
26805
+ "name": "event",
26806
+ "type": {
26807
+ "text": "KeyboardEvent"
26808
+ }
26809
+ },
26810
+ {
26811
+ "name": "typed",
26812
+ "type": {
26813
+ "text": "string"
26814
+ }
26815
+ }
26816
+ ],
26817
+ "inheritedFrom": {
26818
+ "name": "MixinTokens",
26819
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
26820
+ }
26821
+ },
26822
+ {
26823
+ "kind": "field",
26824
+ "name": "defaultValue",
26825
+ "type": {
26826
+ "text": "string"
26827
+ },
26828
+ "default": "''",
26829
+ "description": "The value the markup declared, which is where a reset returns to.",
26830
+ "attribute": "default-value",
26831
+ "inheritedFrom": {
26832
+ "name": "MixinControllerValue",
26833
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26834
+ }
26835
+ },
26836
+ {
26837
+ "kind": "field",
26838
+ "name": "value",
26839
+ "type": {
26840
+ "text": "string"
26841
+ },
26842
+ "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.",
26843
+ "attribute": "value",
26844
+ "inheritedFrom": {
26845
+ "name": "MixinControllerValue",
26846
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26847
+ }
26848
+ },
26849
+ {
26850
+ "kind": "field",
26851
+ "name": "valueState",
26852
+ "type": {
26853
+ "text": "string | undefined"
26854
+ },
26855
+ "privacy": "private",
26856
+ "default": "undefined",
26857
+ "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.",
26858
+ "inheritedFrom": {
26859
+ "name": "MixinControllerValue",
26860
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26861
+ }
26862
+ },
26863
+ {
26864
+ "kind": "method",
26865
+ "name": "announceNatively",
26866
+ "privacy": "private",
26867
+ "return": {
26868
+ "type": {
26869
+ "text": "void"
26870
+ }
26871
+ },
26872
+ "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.",
26873
+ "inheritedFrom": {
26874
+ "name": "MixinControllerValue",
26875
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26876
+ }
26877
+ },
26878
+ {
26879
+ "kind": "method",
26880
+ "name": "requestValue",
26881
+ "return": {
26882
+ "type": {
26883
+ "text": "boolean"
26884
+ }
26885
+ },
26886
+ "parameters": [
26887
+ {
26888
+ "name": "next",
26889
+ "type": {
26890
+ "text": "string"
26891
+ }
26892
+ }
26893
+ ],
26894
+ "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.",
26895
+ "inheritedFrom": {
26896
+ "name": "MixinControllerValue",
26897
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26898
+ },
26899
+ "type": {
26900
+ "text": "requestValue(next: string) => boolean"
26901
+ }
26902
+ },
26903
+ {
26904
+ "kind": "method",
26905
+ "name": "formResetCallback",
26906
+ "return": {
26907
+ "type": {
26908
+ "text": "void"
26909
+ }
26910
+ },
26911
+ "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.",
26912
+ "inheritedFrom": {
26913
+ "name": "MixinControllerValue",
26914
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26915
+ },
26916
+ "type": {
26917
+ "text": "formResetCallback() => void"
26918
+ }
26919
+ },
26920
+ {
26921
+ "kind": "method",
26922
+ "name": "formStateRestoreCallback",
26923
+ "return": {
26924
+ "type": {
26925
+ "text": "void"
26926
+ }
26927
+ },
26928
+ "parameters": [
26929
+ {
26930
+ "name": "state",
26931
+ "type": {
26932
+ "text": "string | null"
26933
+ }
26934
+ }
26935
+ ],
26936
+ "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.",
26937
+ "inheritedFrom": {
26938
+ "name": "MixinControllerValue",
26939
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
26940
+ },
26941
+ "type": {
26942
+ "text": "formStateRestoreCallback(state: string | null) => void"
26943
+ }
26944
+ },
26945
+ {
26946
+ "kind": "field",
26947
+ "name": "feedback",
26948
+ "type": {
26949
+ "text": "string"
26950
+ },
26951
+ "default": "''",
26952
+ "description": "What is wrong, in the reader's words rather than the browser's.",
26953
+ "attribute": "feedback",
26954
+ "inheritedFrom": {
26955
+ "name": "MixinField",
26956
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26957
+ }
26958
+ },
26959
+ {
26960
+ "kind": "field",
26961
+ "name": "hint",
26962
+ "type": {
26963
+ "text": "string"
26964
+ },
26965
+ "default": "''",
26966
+ "description": "Help under the control, shown while there is nothing wrong.",
26967
+ "attribute": "hint",
26968
+ "inheritedFrom": {
26969
+ "name": "MixinField",
26970
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26971
+ }
26972
+ },
26973
+ {
26974
+ "kind": "field",
26975
+ "name": "label",
26976
+ "type": {
26977
+ "text": "string"
26978
+ },
26979
+ "default": "''",
26980
+ "description": "The accessible name, and the fallback for the `label` slot.",
26981
+ "attribute": "label",
26982
+ "inheritedFrom": {
26983
+ "name": "MixinField",
26984
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26985
+ }
26986
+ },
26987
+ {
26988
+ "kind": "field",
26989
+ "name": "required",
26990
+ "type": {
26991
+ "text": "boolean"
26992
+ },
26993
+ "default": "false",
26994
+ "description": "Whether the form refuses to submit without it.",
26995
+ "attribute": "required",
26996
+ "reflects": true,
26997
+ "inheritedFrom": {
26998
+ "name": "MixinField",
26999
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27000
+ }
27001
+ },
27002
+ {
27003
+ "kind": "field",
27004
+ "name": "touched",
27005
+ "type": {
27006
+ "text": "boolean"
27007
+ },
27008
+ "privacy": "private",
27009
+ "default": "false",
27010
+ "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`.",
27011
+ "inheritedFrom": {
27012
+ "name": "MixinField",
27013
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27014
+ }
27015
+ },
27016
+ {
27017
+ "kind": "field",
27018
+ "name": "validates",
27019
+ "type": {
27020
+ "text": "boolean"
27021
+ },
27022
+ "privacy": "private",
27023
+ "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.",
27024
+ "readonly": true,
27025
+ "inheritedFrom": {
27026
+ "name": "MixinField",
27027
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27028
+ }
27029
+ },
27030
+ {
27031
+ "kind": "method",
27032
+ "name": "renderGroupLabel",
27033
+ "privacy": "protected",
27034
+ "return": {
27035
+ "type": {
27036
+ "text": "TemplateResult | typeof nothing"
27037
+ }
27038
+ },
27039
+ "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.",
27040
+ "inheritedFrom": {
27041
+ "name": "MixinField",
27042
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27043
+ }
27044
+ },
27045
+ {
27046
+ "kind": "method",
27047
+ "name": "renderLabel",
27048
+ "privacy": "protected",
27049
+ "return": {
27050
+ "type": {
27051
+ "text": "TemplateResult | typeof nothing"
27052
+ }
27053
+ },
27054
+ "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\".",
27055
+ "inheritedFrom": {
27056
+ "name": "MixinField",
27057
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27058
+ }
27059
+ },
27060
+ {
27061
+ "kind": "method",
27062
+ "name": "renderHint",
27063
+ "privacy": "protected",
27064
+ "return": {
27065
+ "type": {
27066
+ "text": "TemplateResult | typeof nothing"
27067
+ }
27068
+ },
27069
+ "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.",
27070
+ "inheritedFrom": {
27071
+ "name": "MixinField",
27072
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27073
+ }
27074
+ },
27075
+ {
27076
+ "kind": "method",
27077
+ "name": "renderFeedback",
27078
+ "privacy": "protected",
27079
+ "return": {
27080
+ "type": {
27081
+ "text": "TemplateResult | typeof nothing"
27082
+ }
27083
+ },
27084
+ "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.",
27085
+ "inheritedFrom": {
27086
+ "name": "MixinField",
27087
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27088
+ }
27089
+ },
27090
+ {
27091
+ "kind": "method",
27092
+ "name": "linkHost",
27093
+ "privacy": "protected",
27094
+ "return": {
27095
+ "type": {
27096
+ "text": "void"
27097
+ }
27098
+ },
27099
+ "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.",
27100
+ "inheritedFrom": {
27101
+ "name": "MixinField",
27102
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27103
+ }
27104
+ },
27105
+ {
27106
+ "kind": "field",
27107
+ "name": "shownFeedback",
27108
+ "type": {
27109
+ "text": "string"
27110
+ },
27111
+ "privacy": "private",
27112
+ "default": "''",
27113
+ "description": "What the last render put on screen, so a change can be noticed.",
27114
+ "inheritedFrom": {
27115
+ "name": "MixinField",
27116
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27117
+ }
27118
+ },
27119
+ {
27120
+ "kind": "method",
27121
+ "name": "refreshFeedback",
27122
+ "privacy": "protected",
27123
+ "return": {
27124
+ "type": {
27125
+ "text": "void"
27126
+ }
27127
+ },
27128
+ "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.",
27129
+ "inheritedFrom": {
27130
+ "name": "MixinField",
27131
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27132
+ }
27133
+ },
27134
+ {
27135
+ "kind": "method",
27136
+ "name": "reportRequired",
27137
+ "privacy": "protected",
27138
+ "return": {
27139
+ "type": {
27140
+ "text": "void"
27141
+ }
27142
+ },
27143
+ "parameters": [
27144
+ {
27145
+ "name": "empty",
27146
+ "type": {
27147
+ "text": "boolean"
27148
+ }
27149
+ },
27150
+ {
27151
+ "name": "message",
27152
+ "type": {
27153
+ "text": "string"
27154
+ }
27155
+ },
27156
+ {
27157
+ "name": "anchor",
27158
+ "type": {
27159
+ "text": "string"
27160
+ }
27161
+ }
27162
+ ],
27163
+ "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.",
27164
+ "inheritedFrom": {
27165
+ "name": "MixinField",
27166
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27167
+ }
27168
+ },
27169
+ {
27170
+ "kind": "field",
27171
+ "name": "formAssociated",
27172
+ "type": {
27173
+ "text": "boolean"
27174
+ },
27175
+ "static": true,
27176
+ "readonly": true,
27177
+ "default": "true",
27178
+ "description": "Opts the element into form ownership, labels, and submission.",
27179
+ "inheritedFrom": {
27180
+ "name": "HelixFormElement",
27181
+ "module": "src/helix-form-element/helix-form-element.ts"
27182
+ }
27183
+ },
27184
+ {
27185
+ "kind": "field",
27186
+ "name": "disabled",
27187
+ "type": {
27188
+ "text": "boolean"
27189
+ },
27190
+ "default": "false",
27191
+ "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.",
27192
+ "attribute": "disabled",
27193
+ "reflects": true,
27194
+ "inheritedFrom": {
27195
+ "name": "HelixFormElement",
27196
+ "module": "src/helix-form-element/helix-form-element.ts"
27197
+ }
27198
+ },
27199
+ {
27200
+ "kind": "field",
27201
+ "name": "formDisabled",
27202
+ "type": {
27203
+ "text": "boolean"
27204
+ },
27205
+ "privacy": "protected",
27206
+ "default": "false",
27207
+ "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.",
27208
+ "inheritedFrom": {
27209
+ "name": "HelixFormElement",
27210
+ "module": "src/helix-form-element/helix-form-element.ts"
27211
+ }
27212
+ },
27213
+ {
27214
+ "kind": "method",
27215
+ "name": "formDisabledCallback",
27216
+ "return": {
27217
+ "type": {
27218
+ "text": "void"
27219
+ }
27220
+ },
27221
+ "parameters": [
27222
+ {
27223
+ "name": "disabled",
27224
+ "type": {
27225
+ "text": "boolean"
27226
+ }
27227
+ }
27228
+ ],
27229
+ "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.",
27230
+ "inheritedFrom": {
27231
+ "name": "HelixFormElement",
27232
+ "module": "src/helix-form-element/helix-form-element.ts"
27233
+ },
27234
+ "type": {
27235
+ "text": "formDisabledCallback(disabled: boolean) => void"
27236
+ }
27237
+ },
27238
+ {
27239
+ "kind": "field",
27240
+ "name": "name",
27241
+ "type": {
27242
+ "text": "string"
27243
+ },
27244
+ "default": "''",
27245
+ "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.",
27246
+ "attribute": "name",
27247
+ "reflects": true,
27248
+ "inheritedFrom": {
27249
+ "name": "HelixFormElement",
27250
+ "module": "src/helix-form-element/helix-form-element.ts"
27251
+ }
27252
+ },
27253
+ {
27254
+ "kind": "field",
27255
+ "name": "form",
27256
+ "type": {
27257
+ "text": "HTMLFormElement | null"
27258
+ },
27259
+ "description": "The form this control belongs to, if any.",
27260
+ "readonly": true,
27261
+ "helix": {
27262
+ "references": [
27263
+ {
27264
+ "label": "form-associated custom elements",
27265
+ "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
27266
+ }
27267
+ ]
27268
+ },
27269
+ "inheritedFrom": {
27270
+ "name": "HelixFormElement",
27271
+ "module": "src/helix-form-element/helix-form-element.ts"
27272
+ }
27273
+ },
27274
+ {
27275
+ "kind": "field",
27276
+ "name": "labels",
27277
+ "type": {
27278
+ "text": "NodeList"
27279
+ },
27280
+ "description": "Labels associated with this control.",
27281
+ "readonly": true,
27282
+ "helix": {
27283
+ "references": [
27284
+ {
27285
+ "label": "form-associated custom elements",
27286
+ "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
27287
+ }
27288
+ ]
27289
+ },
27290
+ "inheritedFrom": {
27291
+ "name": "HelixFormElement",
27292
+ "module": "src/helix-form-element/helix-form-element.ts"
27293
+ }
27294
+ },
27295
+ {
27296
+ "kind": "field",
27297
+ "name": "tier",
27298
+ "type": {
27299
+ "text": "string"
27300
+ },
27301
+ "static": true,
27302
+ "default": "'helix-headless-'",
27303
+ "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.",
27304
+ "inheritedFrom": {
27305
+ "name": "HelixElement",
27306
+ "module": "src/helix-element/helix-element.ts"
27307
+ }
27308
+ },
27309
+ {
27310
+ "kind": "method",
27311
+ "name": "tag",
27312
+ "privacy": "protected",
27313
+ "return": {
27314
+ "type": {
27315
+ "text": "StaticValue"
27316
+ }
27317
+ },
27318
+ "parameters": [
27319
+ {
27320
+ "name": "name",
27321
+ "type": {
27322
+ "text": "string"
27323
+ }
27324
+ }
27325
+ ],
27326
+ "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.",
27327
+ "inheritedFrom": {
27328
+ "name": "HelixElement",
27329
+ "module": "src/helix-element/helix-element.ts"
27330
+ }
27331
+ },
27332
+ {
27333
+ "kind": "field",
27334
+ "name": "internals",
27335
+ "type": {
27336
+ "text": "ElementInternals"
27337
+ },
27338
+ "privacy": "protected",
27339
+ "readonly": true,
27340
+ "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.",
27341
+ "inheritedFrom": {
27342
+ "name": "HelixElement",
27343
+ "module": "src/helix-element/helix-element.ts"
27344
+ }
27345
+ },
27346
+ {
27347
+ "kind": "method",
27348
+ "name": "toggleState",
27349
+ "privacy": "protected",
27350
+ "return": {
27351
+ "type": {
27352
+ "text": "void"
27353
+ }
27354
+ },
27355
+ "parameters": [
27356
+ {
27357
+ "name": "name",
27358
+ "type": {
27359
+ "text": "string"
27360
+ }
27361
+ },
27362
+ {
27363
+ "name": "on",
27364
+ "type": {
27365
+ "text": "boolean"
27366
+ }
27367
+ }
27368
+ ],
27369
+ "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.",
27370
+ "inheritedFrom": {
27371
+ "name": "HelixElement",
27372
+ "module": "src/helix-element/helix-element.ts"
27373
+ }
27374
+ },
27375
+ {
27376
+ "kind": "field",
27377
+ "name": "whenSettled",
27378
+ "type": {
27379
+ "text": "Promise<void>"
27380
+ },
27381
+ "readonly": true,
27382
+ "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.",
27383
+ "default": "new Promise<void>((resolve) => { this.resolveSettled = resolve })",
27384
+ "inheritedFrom": {
27385
+ "name": "HelixElement",
27386
+ "module": "src/helix-element/helix-element.ts"
27387
+ }
27388
+ },
27389
+ {
27390
+ "kind": "field",
27391
+ "name": "resolveSettled",
27392
+ "type": {
27393
+ "text": "() => void"
27394
+ },
27395
+ "privacy": "private",
27396
+ "description": "Resolves `whenSettled`, once, from the frame that records the state.",
27397
+ "inheritedFrom": {
27398
+ "name": "HelixElement",
27399
+ "module": "src/helix-element/helix-element.ts"
27400
+ }
27401
+ },
27402
+ {
27403
+ "kind": "field",
27404
+ "name": "stopInner",
27405
+ "privacy": "protected",
27406
+ "readonly": true,
27407
+ "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.",
27408
+ "inheritedFrom": {
27409
+ "name": "HelixElement",
27410
+ "module": "src/helix-element/helix-element.ts"
27411
+ }
27412
+ },
27413
+ {
27414
+ "kind": "method",
27415
+ "name": "relayNativeEvent",
27416
+ "privacy": "protected",
27417
+ "return": {
27418
+ "type": {
27419
+ "text": "void"
27420
+ }
27421
+ },
27422
+ "parameters": [
27423
+ {
27424
+ "name": "event",
27425
+ "type": {
27426
+ "text": "Event"
27427
+ }
27428
+ },
27429
+ {
27430
+ "name": "init",
27431
+ "optional": true,
27432
+ "type": {
27433
+ "text": "EventInit"
27434
+ }
27435
+ }
27436
+ ],
27437
+ "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.",
27438
+ "inheritedFrom": {
27439
+ "name": "HelixElement",
27440
+ "module": "src/helix-element/helix-element.ts"
27441
+ }
27442
+ },
27443
+ {
27444
+ "kind": "method",
27445
+ "name": "finalizeStyles",
27446
+ "privacy": "protected",
27447
+ "static": true,
27448
+ "return": {
27449
+ "type": {
27450
+ "text": "CSSResultOrNative[]"
27451
+ }
27452
+ },
27453
+ "parameters": [
27454
+ {
27455
+ "name": "styles",
27456
+ "optional": true,
27457
+ "type": {
27458
+ "text": "CSSResultOrNative | CSSResultOrNative[]"
27459
+ }
27460
+ }
27461
+ ],
27462
+ "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it.",
27463
+ "inheritedFrom": {
27464
+ "name": "HelixElement",
27465
+ "module": "src/helix-element/helix-element.ts"
27466
+ }
27467
+ }
27468
+ ],
27469
+ "events": [
27470
+ {
27471
+ "name": "change",
27472
+ "type": {
27473
+ "text": "Event"
27474
+ },
27475
+ "description": "Relayed from the input once the reader has finished.",
27476
+ "inheritedFrom": {
27477
+ "name": "MixinControllerValue",
27478
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27479
+ },
27480
+ "reactProp": "onchange"
27481
+ },
27482
+ {
27483
+ "type": {
27484
+ "text": "HelixBeforeChangeEvent"
27485
+ },
27486
+ "description": "Fired as the text changes, and cancelable.",
27487
+ "name": "helix-before-change",
27488
+ "reactProp": "onhelix-before-change"
27489
+ },
27490
+ {
27491
+ "name": "input",
27492
+ "type": {
27493
+ "text": "Event"
27494
+ },
27495
+ "description": "Announced once the text has moved.",
27496
+ "inheritedFrom": {
27497
+ "name": "MixinControllerValue",
27498
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27499
+ },
27500
+ "reactProp": "oninput"
27501
+ }
27502
+ ],
27503
+ "attributes": [
27504
+ {
27505
+ "name": "clearable",
27506
+ "type": {
27507
+ "text": "boolean"
27508
+ },
27509
+ "default": "false",
27510
+ "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.",
27511
+ "fieldName": "clearable"
27512
+ },
27513
+ {
27514
+ "name": "clear-label",
27515
+ "type": {
27516
+ "text": "string"
27517
+ },
27518
+ "default": "'Clear'",
27519
+ "description": "What the clear button is called, since an icon has no name of its own.",
27520
+ "fieldName": "clearLabel"
27521
+ },
27522
+ {
27523
+ "name": "placeholder",
27524
+ "type": {
27525
+ "text": "string"
27526
+ },
27527
+ "default": "''",
27528
+ "description": "Shown while the field is empty.\n\nNot a label: it goes when typing starts.",
27529
+ "fieldName": "placeholder"
27530
+ },
27531
+ {
27532
+ "name": "max-tags",
27533
+ "type": {
27534
+ "text": "number"
27535
+ },
27536
+ "default": "0",
27537
+ "description": "How many tokens to show before the rest become a count.",
27538
+ "fieldName": "maxTags",
27539
+ "inheritedFrom": {
27540
+ "name": "MixinTokens",
27541
+ "module": "src/mixins/mixin-tokens/mixin-tokens.ts"
27542
+ }
27543
+ },
27544
+ {
27545
+ "name": "default-value",
27546
+ "type": {
27547
+ "text": "string"
27548
+ },
27549
+ "default": "''",
27550
+ "description": "The value the markup declared, which is where a reset returns to.",
27551
+ "fieldName": "defaultValue",
27552
+ "inheritedFrom": {
27553
+ "name": "MixinControllerValue",
27554
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27555
+ }
27556
+ },
27557
+ {
27558
+ "name": "value",
27559
+ "type": {
27560
+ "text": "string"
27561
+ },
27562
+ "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.",
27563
+ "fieldName": "value",
27564
+ "inheritedFrom": {
27565
+ "name": "MixinControllerValue",
27566
+ "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
27567
+ }
27568
+ },
27569
+ {
27570
+ "name": "feedback",
27571
+ "type": {
27572
+ "text": "string"
27573
+ },
27574
+ "default": "''",
27575
+ "description": "What is wrong, in the reader's words rather than the browser's.",
27576
+ "fieldName": "feedback",
27577
+ "inheritedFrom": {
27578
+ "name": "MixinField",
27579
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27580
+ }
27581
+ },
27582
+ {
27583
+ "name": "hint",
27584
+ "type": {
27585
+ "text": "string"
27586
+ },
27587
+ "default": "''",
27588
+ "description": "Help under the control, shown while there is nothing wrong.",
27589
+ "fieldName": "hint",
27590
+ "inheritedFrom": {
27591
+ "name": "MixinField",
27592
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27593
+ }
27594
+ },
27595
+ {
27596
+ "name": "label",
27597
+ "type": {
27598
+ "text": "string"
27599
+ },
27600
+ "default": "''",
27601
+ "description": "The accessible name, and the fallback for the `label` slot.",
27602
+ "fieldName": "label",
27603
+ "inheritedFrom": {
27604
+ "name": "MixinField",
27605
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27606
+ }
27607
+ },
27608
+ {
27609
+ "name": "required",
27610
+ "type": {
27611
+ "text": "boolean"
27612
+ },
27613
+ "default": "false",
27614
+ "description": "Whether the form refuses to submit without it.",
27615
+ "fieldName": "required",
27616
+ "inheritedFrom": {
27617
+ "name": "MixinField",
27618
+ "module": "src/mixins/mixin-field/mixin-field.ts"
27619
+ }
27620
+ },
27621
+ {
27622
+ "name": "disabled",
27623
+ "type": {
27624
+ "text": "boolean"
27625
+ },
27626
+ "default": "false",
27627
+ "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.",
27628
+ "fieldName": "disabled",
27629
+ "inheritedFrom": {
27630
+ "name": "HelixFormElement",
27631
+ "module": "src/helix-form-element/helix-form-element.ts"
27632
+ }
27633
+ },
27634
+ {
27635
+ "name": "name",
27636
+ "type": {
27637
+ "text": "string"
27638
+ },
27639
+ "default": "''",
27640
+ "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.",
27641
+ "fieldName": "name",
27642
+ "inheritedFrom": {
27643
+ "name": "HelixFormElement",
27644
+ "module": "src/helix-form-element/helix-form-element.ts"
27645
+ }
27646
+ }
27647
+ ],
27648
+ "mixins": [
27649
+ {
27650
+ "name": "MixinTokens",
27651
+ "package": "@fusion.dev/helix-core"
27652
+ },
27653
+ {
27654
+ "name": "MixinControllerValue",
27655
+ "package": "@fusion.dev/helix-core"
27656
+ },
27657
+ {
27658
+ "name": "MixinField",
27659
+ "package": "@fusion.dev/helix-core"
27660
+ }
27661
+ ],
27662
+ "superclass": {
27663
+ "name": "HelixFormElement",
27664
+ "package": "@fusion.dev/helix-core"
27665
+ },
27666
+ "summary": "A field that narrows something else, beside what is already narrowing it.",
27667
+ "helix": {
27668
+ "category": "forms",
27669
+ "since": "0.1.0",
27670
+ "status": "experimental",
27671
+ "documentation": "https://helix.fusion.dev/components/filter-input",
27672
+ "aliases": [
27673
+ "SearchField",
27674
+ "FacetInput",
27675
+ "TokenInput"
27676
+ ],
27677
+ "tier": "headless",
27678
+ "group": "BaseFilterInput",
27679
+ "part": "Root",
27680
+ "examples": [
27681
+ {
27682
+ "description": "The same filter field on the headless tier, with every rule written by hand.",
27683
+ "slug": "preview"
27684
+ }
27685
+ ],
27686
+ "source": "helix/headless/src/filter-input"
27687
+ },
27688
+ "tagName": "helix-headless-filter-input",
27689
+ "customElement": true,
27690
+ "modulePath": "src/filter-input/root/filter-input-root.ts",
27691
+ "definitionPath": "src/filter-input/root/filter-input-root.ts"
27692
+ }
27693
+ ],
27694
+ "exports": [
27695
+ {
27696
+ "kind": "js",
27697
+ "name": "HelixHeadlessFilterInput",
27698
+ "declaration": {
27699
+ "name": "HelixHeadlessFilterInput",
27700
+ "module": "src/filter-input/root/filter-input-root.ts"
27701
+ }
27702
+ },
27703
+ {
27704
+ "kind": "custom-element-definition",
27705
+ "name": "helix-headless-filter-input",
27706
+ "declaration": {
27707
+ "name": "HelixHeadlessFilterInput",
27708
+ "module": "src/filter-input/root/filter-input-root.ts"
27709
+ }
27710
+ }
27711
+ ]
27712
+ },
27713
+ {
27714
+ "kind": "javascript-module",
27715
+ "path": "src/format-date/index.ts",
27716
+ "declarations": [],
27717
+ "exports": [
27718
+ {
27719
+ "kind": "js",
27720
+ "name": "HelixHeadlessFormatDate",
27721
+ "declaration": {
27722
+ "name": "HelixHeadlessFormatDate",
27723
+ "module": "./root/format-date-root.js"
27724
+ }
27725
+ }
27726
+ ]
27727
+ },
27728
+ {
27729
+ "kind": "javascript-module",
27730
+ "path": "src/format-date/root/format-date-root.ts",
27731
+ "declarations": [
27732
+ {
27733
+ "kind": "class",
27734
+ "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\".",
27735
+ "name": "HelixHeadlessFormatDate",
27736
+ "cssParts": [
27737
+ {
27738
+ "description": "The `<time>` element carrying the reading.",
27739
+ "name": "time"
27740
+ }
27741
+ ],
27742
+ "members": [
27743
+ {
27744
+ "kind": "field",
27745
+ "name": "date",
27746
+ "type": {
27747
+ "text": "string"
27748
+ },
27749
+ "default": "''",
27750
+ "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.",
27751
+ "attribute": "date"
27752
+ },
27753
+ {
27754
+ "kind": "field",
27755
+ "name": "day",
27756
+ "type": {
27757
+ "text": "'numeric' | '2-digit' | undefined"
27758
+ },
27759
+ "description": "How the day of the month is written, where a date is shown.",
27760
+ "attribute": "day"
27761
+ },
27762
+ {
27763
+ "kind": "field",
27764
+ "name": "elapsed",
27765
+ "type": {
27766
+ "text": "boolean"
27767
+ },
27768
+ "default": "false",
27769
+ "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.",
27770
+ "attribute": "elapsed",
27771
+ "reflects": true
27772
+ },
27773
+ {
27774
+ "kind": "field",
27775
+ "name": "hour",
27776
+ "type": {
27777
+ "text": "'numeric' | '2-digit' | undefined"
27778
+ },
27779
+ "description": "How the hour is written, where a time of day is shown.",
27780
+ "attribute": "hour"
27781
+ },
27782
+ {
27783
+ "kind": "field",
27784
+ "name": "locale",
27785
+ "type": {
27786
+ "text": "string"
27787
+ },
27788
+ "default": "''",
27789
+ "description": "Locale for the reading.\n\nEmpty is the runtime's own.",
27790
+ "attribute": "locale"
27791
+ },
27792
+ {
27793
+ "kind": "field",
27794
+ "name": "minute",
27795
+ "type": {
27796
+ "text": "'numeric' | '2-digit' | undefined"
27797
+ },
27798
+ "description": "How the minute is written, where a time of day is shown.",
27799
+ "attribute": "minute"
27800
+ },
27801
+ {
27802
+ "kind": "field",
27803
+ "name": "month",
27804
+ "type": {
27805
+ "text": "'numeric' | '2-digit' | 'long' | 'short' | 'narrow' | undefined"
27806
+ },
27807
+ "description": "How the month is written, where a date is shown.",
27808
+ "attribute": "month"
27809
+ },
27810
+ {
27811
+ "kind": "field",
27812
+ "name": "second",
27813
+ "type": {
27814
+ "text": "'numeric' | '2-digit' | undefined"
27815
+ },
27816
+ "description": "How the second is written, where a time of day is shown.",
27817
+ "attribute": "second"
27818
+ },
27819
+ {
27820
+ "kind": "field",
27821
+ "name": "timeZone",
27822
+ "type": {
27823
+ "text": "string | undefined"
27824
+ },
27825
+ "description": "The time zone to read the timestamp in.\n\nEmpty is the runtime's own.",
27826
+ "attribute": "time-zone"
27827
+ },
27828
+ {
27829
+ "kind": "field",
27830
+ "name": "timeZoneName",
27831
+ "type": {
27832
+ "text": "'long' | 'short' | undefined"
27833
+ },
27834
+ "description": "Whether to name the time zone, and how.",
27835
+ "attribute": "time-zone-name"
27836
+ },
27837
+ {
27838
+ "kind": "field",
27839
+ "name": "weekday",
27840
+ "type": {
27841
+ "text": "'long' | 'short' | 'narrow' | undefined"
27842
+ },
27843
+ "description": "How the weekday is written, where one is shown.",
27844
+ "attribute": "weekday"
27845
+ },
27846
+ {
27847
+ "kind": "field",
27848
+ "name": "year",
27849
+ "type": {
27850
+ "text": "'numeric' | '2-digit' | undefined"
27851
+ },
27852
+ "description": "How the year is written, where a date is shown.",
27853
+ "attribute": "year"
27854
+ },
27855
+ {
27856
+ "kind": "field",
27857
+ "name": "clock",
27858
+ "type": {
27859
+ "text": "number | undefined"
27860
+ },
27861
+ "privacy": "private",
27862
+ "default": "undefined",
27863
+ "description": "The clock this element last drew against.\n\nA state field and not a read of `Date.now()` inside `render`, which would\nmake the template a function of something Lit cannot see change: the element\nwould draw the right text once and never notice it had gone stale."
27864
+ },
27865
+ {
27866
+ "kind": "field",
27867
+ "name": "written",
27868
+ "type": {
27869
+ "text": "string"
27870
+ },
27871
+ "privacy": "private",
27872
+ "default": "''",
27873
+ "description": "The date read out of the light DOM, where no attribute carried one."
27874
+ },
27875
+ {
27876
+ "kind": "field",
27877
+ "name": "stopTicking",
27878
+ "type": {
27879
+ "text": "(() => void) | undefined"
27880
+ },
27881
+ "privacy": "private",
27882
+ "default": "undefined"
27883
+ },
27884
+ {
27885
+ "kind": "field",
27886
+ "name": "watching",
27887
+ "type": {
27888
+ "text": "MutationObserver | undefined"
27889
+ },
27890
+ "privacy": "private",
27891
+ "default": "undefined"
27892
+ },
27893
+ {
27894
+ "kind": "field",
27895
+ "name": "moment",
27896
+ "type": {
27897
+ "text": "Date | undefined"
27898
+ },
27899
+ "privacy": "private",
27900
+ "description": "The timestamp, or nothing where there is not one to read.",
27901
+ "readonly": true
27902
+ },
27903
+ {
27904
+ "kind": "field",
27905
+ "name": "options",
27906
+ "type": {
27907
+ "text": "Absolute"
27908
+ },
27909
+ "privacy": "private",
27910
+ "description": "Every `Intl.DateTimeFormat` option a consumer set, and none they did not.",
27911
+ "readonly": true
27912
+ },
27913
+ {
27914
+ "kind": "method",
27915
+ "name": "read",
27916
+ "privacy": "private",
27917
+ "return": {
27918
+ "type": {
27919
+ "text": "void"
27920
+ }
27921
+ },
27922
+ "description": "The light DOM's own text, which is the other way to write the value."
27923
+ },
27924
+ {
27925
+ "kind": "method",
27926
+ "name": "watch",
27927
+ "privacy": "private",
27928
+ "return": {
27929
+ "type": {
27930
+ "text": "void"
27931
+ }
27932
+ }
27933
+ },
27934
+ {
27935
+ "kind": "method",
27936
+ "name": "tick",
27937
+ "privacy": "private",
27938
+ "return": {
27939
+ "type": {
27940
+ "text": "void"
27941
+ }
27942
+ },
27943
+ "description": "Schedules the next reading, and only the next one.\n\nThe formatter says when its own answer expires, so this asks for exactly\nthat moment rather than polling: an item minutes old wakes once a minute, an\nitem hours old once an hour, and an item showing a date never, which is the\ndifference between a feed that costs nothing to leave open and one that\ndoes."
27944
+ },
27945
+ {
27946
+ "kind": "field",
27947
+ "name": "tier",
27948
+ "type": {
27949
+ "text": "string"
27950
+ },
27951
+ "static": true,
27952
+ "default": "'helix-headless-'",
27953
+ "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.",
27954
+ "inheritedFrom": {
27955
+ "name": "HelixElement",
27956
+ "module": "src/helix-element/helix-element.ts"
27957
+ }
27958
+ },
27959
+ {
27960
+ "kind": "method",
27961
+ "name": "tag",
27962
+ "privacy": "protected",
27963
+ "return": {
27964
+ "type": {
27965
+ "text": "StaticValue"
27966
+ }
27967
+ },
27968
+ "parameters": [
27969
+ {
27970
+ "name": "name",
26728
27971
  "type": {
26729
27972
  "text": "string"
26730
27973
  }
@@ -30080,6 +31323,14 @@
30080
31323
  "module": "src/file-input/index.js"
30081
31324
  }
30082
31325
  },
31326
+ {
31327
+ "kind": "js",
31328
+ "name": "*",
31329
+ "declaration": {
31330
+ "name": "*",
31331
+ "module": "src/filter-input/index.js"
31332
+ }
31333
+ },
30083
31334
  {
30084
31335
  "kind": "js",
30085
31336
  "name": "*",