@fusion.dev/helix-headless 0.159.0 → 0.160.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.
@@ -35778,6 +35778,20 @@
35778
35778
  "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
35779
35779
  }
35780
35780
  },
35781
+ {
35782
+ "kind": "field",
35783
+ "name": "touched",
35784
+ "type": {
35785
+ "text": "boolean"
35786
+ },
35787
+ "privacy": "private",
35788
+ "default": "false",
35789
+ "description": "Whether the reader has committed an answer, or a form has refused the\npicker. A reset forgets it.",
35790
+ "inheritedFrom": {
35791
+ "name": "MixinPickerFeedback",
35792
+ "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
35793
+ }
35794
+ },
35781
35795
  {
35782
35796
  "kind": "field",
35783
35797
  "name": "marked",
@@ -35785,13 +35799,44 @@
35785
35799
  "text": "boolean"
35786
35800
  },
35787
35801
  "privacy": "protected",
35788
- "description": "Whether a reader is told the answer is wrong: `invalid`, or `feedback`.",
35802
+ "description": "Whether a reader is told the answer is wrong: `invalid`, `feedback`, a\nheld answer the picker refuses, or a missing answer once the reader has\ncommitted one or a form has refused the picker.\n\n**A refused answer is marked at once, and a missing one waits**, as\nChromium's tree does for native controls: a time input holding a time\npast its `max` reports invalid on load, and an empty required text field\ndoes not, since the reader already hears that it is required. Measured\nbefore this on Time Picker: `value=\"13:00\" max=\"12:00\"` reported\n`rangeOverflow` while the list said nothing and `:state(invalid)` was off.",
35803
+ "readonly": true,
35804
+ "inheritedFrom": {
35805
+ "name": "MixinPickerFeedback",
35806
+ "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
35807
+ }
35808
+ },
35809
+ {
35810
+ "kind": "field",
35811
+ "name": "failure",
35812
+ "type": {
35813
+ "text": "'missing' | 'refused' | undefined"
35814
+ },
35815
+ "privacy": "protected",
35816
+ "description": "What the picker's own validation finds: `missing`, `refused`, or\nnothing, which is what a picker that does not answer it reports.",
35789
35817
  "readonly": true,
35790
35818
  "inheritedFrom": {
35791
35819
  "name": "MixinPickerFeedback",
35792
35820
  "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
35793
35821
  }
35794
35822
  },
35823
+ {
35824
+ "kind": "method",
35825
+ "name": "formResetCallback",
35826
+ "return": {
35827
+ "type": {
35828
+ "text": "void"
35829
+ }
35830
+ },
35831
+ "description": "Returns the control to its `defaultValue`, or to its `value` attribute\nwhere there is no `default-value`.\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.",
35832
+ "inheritedFrom": {
35833
+ "name": "HelixFormElement",
35834
+ "module": "src/helix-form-element/helix-form-element.ts"
35835
+ },
35836
+ "type": {
35837
+ "text": "formResetCallback() => void"
35838
+ }
35839
+ },
35795
35840
  {
35796
35841
  "kind": "method",
35797
35842
  "name": "renderPickerFeedback",
@@ -35877,23 +35922,6 @@
35877
35922
  "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
35878
35923
  }
35879
35924
  },
35880
- {
35881
- "kind": "method",
35882
- "name": "formResetCallback",
35883
- "return": {
35884
- "type": {
35885
- "text": "void"
35886
- }
35887
- },
35888
- "description": "Returns the control to its `defaultValue`, or to its `value` attribute\nwhere there is no `default-value`.\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.",
35889
- "inheritedFrom": {
35890
- "name": "HelixFormElement",
35891
- "module": "src/helix-form-element/helix-form-element.ts"
35892
- },
35893
- "type": {
35894
- "text": "formResetCallback() => void"
35895
- }
35896
- },
35897
35925
  {
35898
35926
  "kind": "method",
35899
35927
  "name": "formStateRestoreCallback",
@@ -47830,9 +47858,13 @@
47830
47858
  "declarations": [
47831
47859
  {
47832
47860
  "kind": "class",
47833
- "description": "The calendar is `DatePicker`, which handles months, ranges, disabled days,\nthe first day of the week, and the grid's keyboard behavior. The date input\nadds the field, the overlay, and the connection between them.\n\nYou can type a date as well as pick one. The native `<input type=\"date\">`\ngives a picker and locale formatting but allows almost no styling, so the\nfield is a text field. Typing sends `input` on each keystroke and `change`\nwhen you leave the field, as a text field does. A date picked from the\ncalendar sends both.\n\nThe trigger and ArrowDown open the calendar with focus on the selected day,\nTab moves between the calendar's controls without leaving it, and Escape\ncloses it and returns focus to the field. A press into the field opens the\ncalendar too. Tab into the field opens nothing, and Tab out of the field\ncloses the calendar.\n\nWith `segmented`, the field is a row of segments in place of the text: a\nmonth, a day and a year in the order the locale writes them, each set with\ndigits or the arrow keys. Alt+Down opens the calendar from a segment.\n\nText that is not a date gives the form an empty value, as a native date\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the calendar with focus on the chosen day. |\n| Alt with Down | Opens the calendar, from the text field or a segment. |\n| Enter | In the text field, takes the typed date and submits the form, as a native field does. |\n| Escape | Closes the calendar and puts focus back in the field. |\n| Tab | In the open calendar, moves between its controls. Out of the field, closes it. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: a week of days, two months, or five years. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| Backspace, Delete on a segment | Empty the segment. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the calendar, the keys are `DatePicker`'s: the arrows move by a day or a\nweek, Page Up and Page Down by a month, with Shift by a year, and Home and\nEnd to the start and the end of the week.",
47861
+ "description": "The calendar is `DatePicker`, which handles months, ranges, disabled days,\nthe first day of the week, and the grid's keyboard behavior. The date input\nadds the field, the overlay, and the connection between them.\n\nYou can type a date as well as pick one. The native `<input type=\"date\">`\ngives a picker and locale formatting but allows almost no styling, so the\nfield is a text field. Typing sends `input` on each keystroke and `change`\nwhen you leave the field, as a text field does. A date picked from the\ncalendar sends both. The field reads ISO, `2026-08-04`, and a date written\nin the order, the digits, and the month names of `locale`, `8/4/2026` or\n`Aug 4, 2026` in `en-US` and `4.8.2026` in `de-DE`, which becomes the value\nas you leave the field.\n\nThe trigger and ArrowDown open the calendar with focus on the selected day,\nTab moves between the calendar's controls without leaving it, and Escape\ncloses it and returns focus to the field. A press into the field opens the\ncalendar too. Tab into the field opens nothing, and Tab out of the field\ncloses the calendar. The text field is a `combobox` with\n`aria-haspopup=\"dialog\"`, `aria-expanded`, and `aria-controls`, as in the\nAPG date picker combobox, since Down opens the calendar from it.\n\nWith `segmented`, the field is a row of segments in place of the text: a\nmonth, a day and a year in the order the locale writes them, each set with\ndigits or the arrow keys. Alt+Down opens the calendar from a segment. A\n`range` is two rows with a dash between them, the start and the end, as\nReact Aria's DateRangePicker draws them, and `multiple` keeps the text.\n\nText that is not a date gives the form an empty value, as a native date\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the calendar with focus on the chosen day. |\n| Alt with Down | Opens the calendar, from the text field or a segment. |\n| Enter | In the text field, takes the typed date and submits the form, as a native field does. |\n| Escape | Closes the calendar and puts focus back in the field. |\n| Tab | In the open calendar, moves between its controls. Out of the field, closes it. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: a week of days, two months, or five years. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| Backspace, Delete on a segment | Empty the segment. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the calendar, the keys are `DatePicker`'s: the arrows move by a day or a\nweek, Page Up and Page Down by a month, with Shift by a year, and Home and\nEnd to the start and the end of the week.",
47834
47862
  "name": "HelixHeadlessDateInput",
47835
47863
  "cssParts": [
47864
+ {
47865
+ "description": "The button that empties the field, under `clearable`, while it holds a date.",
47866
+ "name": "clear"
47867
+ },
47836
47868
  {
47837
47869
  "description": "The text input.",
47838
47870
  "name": "control"
@@ -47997,6 +48029,10 @@
47997
48029
  "description": "The icon on the previous month control.",
47998
48030
  "name": "picker-previous-mark"
47999
48031
  },
48032
+ {
48033
+ "description": "The chosen date or range in words, which screen readers hear when it changes. Drawn for screen readers only.",
48034
+ "name": "picker-selection"
48035
+ },
48000
48036
  {
48001
48037
  "description": "One row of days.",
48002
48038
  "name": "picker-week"
@@ -48005,6 +48041,10 @@
48005
48041
  "description": "A column header naming a day of the week.",
48006
48042
  "name": "picker-weekday"
48007
48043
  },
48044
+ {
48045
+ "description": "The dash between a range's two rows of segments, in `segmented`, beside `literal`.",
48046
+ "name": "range-separator"
48047
+ },
48008
48048
  {
48009
48049
  "description": "The count of dates beyond the ones shown. It is a `<button>` with `expandable` and a `<span>` without it.",
48010
48050
  "name": "rest"
@@ -48039,6 +48079,10 @@
48039
48079
  }
48040
48080
  ],
48041
48081
  "slots": [
48082
+ {
48083
+ "description": "Replaces the cross on the clear button, under `clearable`.",
48084
+ "name": "clear-icon"
48085
+ },
48042
48086
  {
48043
48087
  "description": "Content after the date, before the trigger, such as a clear button.",
48044
48088
  "name": "end"
@@ -48109,16 +48153,16 @@
48109
48153
  "text": "string"
48110
48154
  },
48111
48155
  "default": "''",
48112
- "description": "What the browser may autofill here, as one of the platform's own tokens.\n\nEmpty leaves the attribute off, which is the browser's default and is what\nlets autofill work at all: hardcoding `off` here means a birthday or a\npostal code can never be filled in for a reader.",
48156
+ "description": "What the browser may autofill here, as one of the platform's own tokens,\nsuch as `bday`.\n\nEmpty leaves the attribute off, which is the browser's default and is what\nlets autofill work at all: hardcoding `off` here means a birthday or a\npostal code can never be filled in for a reader. With `segmented`, a\nhidden native date input carries it, since no browser fills the segments.",
48113
48157
  "attribute": "autocomplete"
48114
48158
  },
48115
48159
  {
48116
48160
  "kind": "field",
48117
48161
  "name": "calendar",
48118
48162
  "type": {
48119
- "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | undefined"
48163
+ "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'chinese' | 'coptic' | 'dangi' | 'ethioaa' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic' | 'islamic-civil' | 'islamic-rgsa' | 'islamic-tbla' | 'islamic-umalqura' | 'persian' | undefined"
48120
48164
  },
48121
- "description": "The calendar the written date and the calendar's days are in: `gregory`,\n`buddhist`, `japanese`, `roc`, or `iso8601`.\n\nAbsent is the locale's own where it is one of the five, and `gregory` for\nevery other, as Date Picker's `calendar` is. The value is `YYYY-MM-DD` in\nevery calendar, and a focused field is ISO in every calendar. In\n`segmented`, the segments are the Gregorian day, month, and year, in the\norder the locale writes them, or ISO order for `iso8601`.",
48165
+ "description": "The calendar the written date, the segments, and the calendar's days are\nin: `gregory`, `buddhist`, `japanese`, `roc`, or `iso8601`, or a calendar\nwith months of its own that Date Picker's `calendar` names, such as\n`persian`, `hebrew`, `islamic-umalqura`, `ethiopic`, or `chinese`.\n\nAbsent is the locale's own where its months are the Gregorian months, and\n`gregory` for every other, as Date Picker's `calendar` is. The value is\n`YYYY-MM-DD` in every calendar, and a focused text field is ISO in every\ncalendar. In `segmented`, the segments are the day, month, and year as\nthe calendar counts them, in the order the locale writes them: Mehr 14,\n1405 is month 7 and day 14 of 1405 under `persian`. Under the five with\nGregorian months they are the Gregorian day, month, and year, or ISO order\nfor `iso8601`.",
48122
48166
  "attribute": "calendar"
48123
48167
  },
48124
48168
  {
@@ -48134,6 +48178,29 @@
48134
48178
  "words": true
48135
48179
  }
48136
48180
  },
48181
+ {
48182
+ "kind": "field",
48183
+ "name": "clearable",
48184
+ "type": {
48185
+ "text": "boolean"
48186
+ },
48187
+ "default": "false",
48188
+ "description": "Whether the field shows a button that empties it, as Input's `clearable`\ndoes. Shown only while the field holds something to clear and is neither\ndisabled nor read-only.",
48189
+ "attribute": "clearable"
48190
+ },
48191
+ {
48192
+ "kind": "field",
48193
+ "name": "clearLabel",
48194
+ "type": {
48195
+ "text": "string"
48196
+ },
48197
+ "default": "'Clear'",
48198
+ "description": "The accessible name of the clear button, which shows only an icon.",
48199
+ "attribute": "clear-label",
48200
+ "helix": {
48201
+ "words": true
48202
+ }
48203
+ },
48137
48204
  {
48138
48205
  "kind": "field",
48139
48206
  "name": "announcesInput",
@@ -48156,7 +48223,7 @@
48156
48223
  "text": "'full' | 'iso' | 'long' | 'medium' | 'short'"
48157
48224
  },
48158
48225
  "default": "'long'",
48159
- "description": "How a date is written in the field: `short` through `full`, or ISO.\n\n**The field renders when it is idle and holds the value when it is being\nedited.** A written date is a rendering, and a document being edited must\nnot be a rendering of something else: `Intl.DateTimeFormat` formats and does\nnot parse, so `4 August 2026` cannot be typed back, and writing a parser per\nlocale is how a field ends up rejecting what it just displayed.\n\nThe way out is not to choose between the two but to separate them in time.\nIdle, the field shows `4 August 2026`, which is what a date is for reading.\nFocused, it shows `2026-08-04`, which is what a date is for typing, and it\ngoes back on the way out. Nothing parses a rendering, and nothing is\nread-only, which is what an earlier version of this settled for.\n\nA range is the exception that needs no swap: the dash between its two dates\nis a separator this element understands, so that much reads back either way.\n\n`iso` turns the rendering off, for a field whose reader is entering data\nrather than reading it, or where the ISO form is itself the point.\n\nThe value is always `YYYY-MM-DD` regardless, because that is what a form\nsubmits and what `min` and `max` compare against.",
48226
+ "description": "How a date is written in the field: `short` through `full`, or ISO.\n\n**The field renders when it is idle and holds the value when it is being\nedited.** A written date is a rendering, and a document being edited must\nnot be a rendering of something else: `Intl.DateTimeFormat` formats and does\nnot parse, so a rendering such as `Tuesday, August 4, 2026` is no text to\nedit. The field does read a date typed in the locale's order and digits as\nyou leave it, which covers what a reader types.\n\nThe way out is not to choose between the two but to separate them in time.\nIdle, the field shows `4 August 2026`, which is what a date is for reading.\nFocused, it shows `2026-08-04`, which is what a date is for typing, and it\ngoes back on the way out. Nothing parses a rendering, and nothing is\nread-only, which is what an earlier version of this settled for.\n\nA range is the exception that needs no swap: the dash between its two dates\nis a separator this element understands, so that much reads back either way.\n\n`iso` turns the rendering off, for a field whose reader is entering data\nrather than reading it, or where the ISO form is itself the point.\n\nThe value is always `YYYY-MM-DD` regardless, because that is what a form\nsubmits and what `min` and `max` compare against.",
48160
48227
  "attribute": "date-style"
48161
48228
  },
48162
48229
  {
@@ -48472,6 +48539,19 @@
48472
48539
  "words": true
48473
48540
  }
48474
48541
  },
48542
+ {
48543
+ "kind": "field",
48544
+ "name": "selectionLabel",
48545
+ "type": {
48546
+ "text": "string"
48547
+ },
48548
+ "default": "'{kind, select, date {Selected date: {start}} start {Range starts {start}. Choose the day it ends.} range {Selected range: {start} to {end}} other {{count, plural, one {# date selected} other {# dates selected}}}}'",
48549
+ "description": "What a screen reader hears about the dates chosen in the calendar, with\n`{kind}`, `{start}`, `{end}` and `{count}` filled in as Date Picker's\n`selection-label` says.",
48550
+ "attribute": "selection-label",
48551
+ "helix": {
48552
+ "words": true
48553
+ }
48554
+ },
48475
48555
  {
48476
48556
  "kind": "field",
48477
48557
  "name": "step",
@@ -48495,6 +48575,16 @@
48495
48575
  "words": true
48496
48576
  }
48497
48577
  },
48578
+ {
48579
+ "kind": "field",
48580
+ "name": "timeZone",
48581
+ "type": {
48582
+ "text": "string"
48583
+ },
48584
+ "default": "''",
48585
+ "description": "The time zone today is read in, such as `America/New_York`, handed to the\ncalendar: the day marked today, and the month an empty field opens on.\nEmpty is the reader's own. Dates are plain `YYYY-MM-DD` and carry no zone.",
48586
+ "attribute": "time-zone"
48587
+ },
48498
48588
  {
48499
48589
  "kind": "field",
48500
48590
  "name": "triggerLabel",
@@ -48525,7 +48615,21 @@
48525
48615
  "text": "boolean"
48526
48616
  },
48527
48617
  "privacy": "protected",
48528
- "description": "Segments hold one date, so `range` and `multiple` keep the line of text,\nwhose separators and tags are how those modes write several.",
48618
+ "description": "A row of segments holds one date, and `range` takes two rows with a dash\nbetween them, as React Aria's range fields do. `multiple` keeps the line\nof text, whose tags are how it writes several.",
48619
+ "readonly": true,
48620
+ "inheritedFrom": {
48621
+ "name": "MixinSegmentedField",
48622
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
48623
+ }
48624
+ },
48625
+ {
48626
+ "kind": "field",
48627
+ "name": "segmentGroups",
48628
+ "type": {
48629
+ "text": "number"
48630
+ },
48631
+ "privacy": "protected",
48632
+ "description": "How many rows of segments the value takes: two for a range, one otherwise.",
48529
48633
  "readonly": true,
48530
48634
  "inheritedFrom": {
48531
48635
  "name": "MixinSegmentedField",
@@ -48553,7 +48657,21 @@
48553
48657
  "text": "string"
48554
48658
  },
48555
48659
  "privacy": "protected",
48556
- "description": "The segments are the Gregorian day, month and year, which is what they\nhold, in ISO order where the calendar is `iso8601`. A year shown as 2569\nor Reiwa 8 would be a year the segment does not hold.",
48660
+ "description": "The segments are the Gregorian day, month and year, which is what they\nhold, in ISO order where the calendar is `iso8601`. A year shown as 2569\nor Reiwa 8 would be a year the segment does not hold. Under a calendar\nwith months of its own they hold that calendar's parts, so they are laid\nout and named in it.",
48661
+ "readonly": true,
48662
+ "inheritedFrom": {
48663
+ "name": "MixinSegmentedField",
48664
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
48665
+ }
48666
+ },
48667
+ {
48668
+ "kind": "field",
48669
+ "name": "segmentSystem",
48670
+ "type": {
48671
+ "text": "MonthSystem | undefined"
48672
+ },
48673
+ "privacy": "protected",
48674
+ "description": "The calendar the segments count in, where it has months of its own.",
48557
48675
  "readonly": true,
48558
48676
  "inheritedFrom": {
48559
48677
  "name": "MixinSegmentedField",
@@ -48610,6 +48728,32 @@
48610
48728
  "readonly": true,
48611
48729
  "description": "Relayed under this element's name, so a consumer hears one control."
48612
48730
  },
48731
+ {
48732
+ "kind": "method",
48733
+ "name": "read",
48734
+ "privacy": "private",
48735
+ "return": {
48736
+ "type": {
48737
+ "text": "string"
48738
+ }
48739
+ },
48740
+ "parameters": [
48741
+ {
48742
+ "name": "text",
48743
+ "type": {
48744
+ "text": "string"
48745
+ }
48746
+ }
48747
+ ],
48748
+ "description": "A date as the reader wrote it, as `YYYY-MM-DD`: ISO as it is, and the\norder, the digits, and the month names of the field's locale and calendar\nread back, so `8/4/2026` in `en-US` is August 4, 2026. Empty where it is\nno date."
48749
+ },
48750
+ {
48751
+ "kind": "field",
48752
+ "name": "handleTextCommit",
48753
+ "privacy": "private",
48754
+ "readonly": true,
48755
+ "description": "The text the reader leaves, read in the field's locale: a date written as\nthe locale writes one becomes the value, as ISO, when the field commits.\nNot on each key, where `8/4/202` is a date in the year 202 and taking it\nwould move the caret mid-year."
48756
+ },
48613
48757
  {
48614
48758
  "kind": "field",
48615
48759
  "name": "handleDraftKey",
@@ -48692,6 +48836,19 @@
48692
48836
  "words": true
48693
48837
  }
48694
48838
  },
48839
+ {
48840
+ "kind": "field",
48841
+ "name": "unreadableMessage",
48842
+ "type": {
48843
+ "text": "string"
48844
+ },
48845
+ "default": "'{mode, select, single {Enter a date as YYYY-MM-DD.} other {Enter dates as YYYY-MM-DD, separated by commas.}}'",
48846
+ "description": "The message for text that is no date, where `bad-input-message` is not\nset. `{mode}` is `single`, `range`, or `multiple`.",
48847
+ "attribute": "unreadable-message",
48848
+ "helix": {
48849
+ "words": true
48850
+ }
48851
+ },
48695
48852
  {
48696
48853
  "kind": "field",
48697
48854
  "name": "yearViewLabel",
@@ -48771,6 +48928,51 @@
48771
48928
  },
48772
48929
  "description": "The mark on the button that opens the calendar, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding.\n\n**A named import rather than `<helix-headless-icon>`**, which loses on\nthree counts. `Icon` indexes the whole icon map at runtime,\n`icons[this.name]`, and no bundler can shake a runtime lookup, so every\nconsumer of any component that renders one ships all 50kB of path data; a\nnamed import ships one path. The import is checked when the package\ncompiles, where a `name` string is checked only by a later name lookup. And\n`Icon` is not registered on the headless tier at all, which registers\n`helix-headless-icon`, so a headless consumer gets an inert unknown element\nand no mark whatsoever."
48773
48930
  },
48931
+ {
48932
+ "kind": "method",
48933
+ "name": "renderAutofill",
48934
+ "privacy": "private",
48935
+ "return": {
48936
+ "type": {
48937
+ "text": "TemplateResult | typeof nothing"
48938
+ }
48939
+ },
48940
+ "description": "A native date input a browser's autofill can fill, where the field shows\nsegments: a row of spans that no browser fills. React Aria's\n`HiddenDateInput` is the same answer for its segmented field.\n\nDrawn and never seen, a pixel and see-through, as Select's hidden select\nis, since Safari skips a field that is `display: none`. `aria-hidden` and\nout of the tab order, and in this shadow root, so the form still takes\nthe value once, from the host. A fill is taken as a pick, with `input`\nand `change` from the host."
48941
+ },
48942
+ {
48943
+ "kind": "field",
48944
+ "name": "handleAutofill",
48945
+ "privacy": "private",
48946
+ "readonly": true
48947
+ },
48948
+ {
48949
+ "kind": "field",
48950
+ "name": "showsClear",
48951
+ "type": {
48952
+ "text": "boolean"
48953
+ },
48954
+ "privacy": "private",
48955
+ "description": "Whether there is a clear button on screen right now.",
48956
+ "readonly": true
48957
+ },
48958
+ {
48959
+ "kind": "field",
48960
+ "name": "handleClear",
48961
+ "privacy": "private",
48962
+ "readonly": true,
48963
+ "description": "Empties the field, through `requestValue` so a consumer who owns the\nvalue decides, then says `change` and `helix-clear` and puts focus back\nin the field, the button having gone."
48964
+ },
48965
+ {
48966
+ "kind": "method",
48967
+ "name": "renderClearIcon",
48968
+ "privacy": "protected",
48969
+ "return": {
48970
+ "type": {
48971
+ "text": "TemplateResult"
48972
+ }
48973
+ },
48974
+ "description": "The cross on the clear button, behind a seam a tier can move."
48975
+ },
48774
48976
  {
48775
48977
  "kind": "method",
48776
48978
  "name": "renderControl",
@@ -48849,6 +49051,40 @@
48849
49051
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
48850
49052
  }
48851
49053
  },
49054
+ {
49055
+ "kind": "field",
49056
+ "name": "rangeEndLabel",
49057
+ "type": {
49058
+ "text": "string"
49059
+ },
49060
+ "default": "'End'",
49061
+ "description": "What a screen reader hears before the segments of a range's second date\nor time, after each segment's own name.",
49062
+ "attribute": "range-end-label",
49063
+ "helix": {
49064
+ "words": true
49065
+ },
49066
+ "inheritedFrom": {
49067
+ "name": "MixinSegmentedField",
49068
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
49069
+ }
49070
+ },
49071
+ {
49072
+ "kind": "field",
49073
+ "name": "rangeStartLabel",
49074
+ "type": {
49075
+ "text": "string"
49076
+ },
49077
+ "default": "'Start'",
49078
+ "description": "What a screen reader hears before the segments of a range's first date\nor time, after each segment's own name: \"month, Start, Stay\".",
49079
+ "attribute": "range-start-label",
49080
+ "helix": {
49081
+ "words": true
49082
+ },
49083
+ "inheritedFrom": {
49084
+ "name": "MixinSegmentedField",
49085
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
49086
+ }
49087
+ },
48852
49088
  {
48853
49089
  "kind": "field",
48854
49090
  "name": "segmented",
@@ -48867,11 +49103,11 @@
48867
49103
  "kind": "field",
48868
49104
  "name": "parts",
48869
49105
  "type": {
48870
- "text": "Segments"
49106
+ "text": "Segments[]"
48871
49107
  },
48872
49108
  "privacy": "private",
48873
- "default": "{}",
48874
- "description": "The parts set so far, which may be fewer than a whole value.",
49109
+ "default": "[{}]",
49110
+ "description": "The parts set so far in each row, which may be fewer than a whole\nvalue: one row, or two for a range.",
48875
49111
  "inheritedFrom": {
48876
49112
  "name": "MixinSegmentedField",
48877
49113
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
@@ -48930,6 +49166,35 @@
48930
49166
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
48931
49167
  }
48932
49168
  },
49169
+ {
49170
+ "kind": "field",
49171
+ "name": "opener",
49172
+ "type": {
49173
+ "text": "HTMLElement | undefined"
49174
+ },
49175
+ "privacy": "private",
49176
+ "default": "undefined",
49177
+ "description": "The segment Alt+Down opened the picker from, which focus goes back to.",
49178
+ "inheritedFrom": {
49179
+ "name": "MixinSegmentedField",
49180
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
49181
+ }
49182
+ },
49183
+ {
49184
+ "kind": "method",
49185
+ "name": "returnFocus",
49186
+ "privacy": "protected",
49187
+ "return": {
49188
+ "type": {
49189
+ "text": "void"
49190
+ }
49191
+ },
49192
+ "description": "Puts focus back on the segment the picker was opened from, as the\ntrigger takes it back to the field. Measured before this: Escape after\nAlt+Down on AM/PM put focus on the hour.",
49193
+ "inheritedFrom": {
49194
+ "name": "MixinPickerField",
49195
+ "module": "src/mixins/mixin-picker-field/mixin-picker-field.ts"
49196
+ }
49197
+ },
48933
49198
  {
48934
49199
  "kind": "field",
48935
49200
  "name": "segmentsShown",
@@ -48944,6 +49209,52 @@
48944
49209
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
48945
49210
  }
48946
49211
  },
49212
+ {
49213
+ "kind": "method",
49214
+ "name": "joined",
49215
+ "privacy": "private",
49216
+ "return": {
49217
+ "type": {
49218
+ "text": "string"
49219
+ }
49220
+ },
49221
+ "parameters": [
49222
+ {
49223
+ "name": "rows",
49224
+ "type": {
49225
+ "text": "readonly Segments[]"
49226
+ }
49227
+ }
49228
+ ],
49229
+ "description": "The value the rows add up to: each row's, joined by commas, or empty while any row is not whole.",
49230
+ "inheritedFrom": {
49231
+ "name": "MixinSegmentedField",
49232
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
49233
+ }
49234
+ },
49235
+ {
49236
+ "kind": "method",
49237
+ "name": "rowsOf",
49238
+ "privacy": "private",
49239
+ "return": {
49240
+ "type": {
49241
+ "text": "Segments[]"
49242
+ }
49243
+ },
49244
+ "parameters": [
49245
+ {
49246
+ "name": "value",
49247
+ "type": {
49248
+ "text": "string"
49249
+ }
49250
+ }
49251
+ ],
49252
+ "description": "The rows a value names, one per row, empty where it names none.",
49253
+ "inheritedFrom": {
49254
+ "name": "MixinSegmentedField",
49255
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
49256
+ }
49257
+ },
48947
49258
  {
48948
49259
  "kind": "field",
48949
49260
  "name": "segmentOptions",
@@ -49023,6 +49334,12 @@
49023
49334
  }
49024
49335
  },
49025
49336
  "parameters": [
49337
+ {
49338
+ "name": "row",
49339
+ "type": {
49340
+ "text": "number"
49341
+ }
49342
+ },
49026
49343
  {
49027
49344
  "name": "next",
49028
49345
  "type": {
@@ -49460,21 +49777,6 @@
49460
49777
  "module": "src/mixins/mixin-picker-field/mixin-picker-field.ts"
49461
49778
  }
49462
49779
  },
49463
- {
49464
- "kind": "method",
49465
- "name": "returnFocus",
49466
- "privacy": "protected",
49467
- "return": {
49468
- "type": {
49469
- "text": "void"
49470
- }
49471
- },
49472
- "description": "Puts the caret back in the field without the field reopening the panel.\n\nThe anchor rather than the text, which is the trigger where there is no\ntext: Color Input's swatch dropped focus to the body on Escape.",
49473
- "inheritedFrom": {
49474
- "name": "MixinPickerField",
49475
- "module": "src/mixins/mixin-picker-field/mixin-picker-field.ts"
49476
- }
49477
- },
49478
49780
  {
49479
49781
  "kind": "method",
49480
49782
  "name": "focus",
@@ -51133,6 +51435,14 @@
51133
51435
  "name": "helix-before-open",
51134
51436
  "reactProp": "onhelix-before-open"
51135
51437
  },
51438
+ {
51439
+ "type": {
51440
+ "text": "HelixClearEvent"
51441
+ },
51442
+ "description": "Fired after the clear button has emptied the field, after `input` and `change`.",
51443
+ "name": "helix-clear",
51444
+ "reactProp": "onhelix-clear"
51445
+ },
51136
51446
  {
51137
51447
  "type": {
51138
51448
  "text": "Event"
@@ -51161,15 +51471,15 @@
51161
51471
  "text": "string"
51162
51472
  },
51163
51473
  "default": "''",
51164
- "description": "What the browser may autofill here, as one of the platform's own tokens.\n\nEmpty leaves the attribute off, which is the browser's default and is what\nlets autofill work at all: hardcoding `off` here means a birthday or a\npostal code can never be filled in for a reader.",
51474
+ "description": "What the browser may autofill here, as one of the platform's own tokens,\nsuch as `bday`.\n\nEmpty leaves the attribute off, which is the browser's default and is what\nlets autofill work at all: hardcoding `off` here means a birthday or a\npostal code can never be filled in for a reader. With `segmented`, a\nhidden native date input carries it, since no browser fills the segments.",
51165
51475
  "fieldName": "autocomplete"
51166
51476
  },
51167
51477
  {
51168
51478
  "name": "calendar",
51169
51479
  "type": {
51170
- "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | undefined"
51480
+ "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'chinese' | 'coptic' | 'dangi' | 'ethioaa' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic' | 'islamic-civil' | 'islamic-rgsa' | 'islamic-tbla' | 'islamic-umalqura' | 'persian' | undefined"
51171
51481
  },
51172
- "description": "The calendar the written date and the calendar's days are in: `gregory`,\n`buddhist`, `japanese`, `roc`, or `iso8601`.\n\nAbsent is the locale's own where it is one of the five, and `gregory` for\nevery other, as Date Picker's `calendar` is. The value is `YYYY-MM-DD` in\nevery calendar, and a focused field is ISO in every calendar. In\n`segmented`, the segments are the Gregorian day, month, and year, in the\norder the locale writes them, or ISO order for `iso8601`.",
51482
+ "description": "The calendar the written date, the segments, and the calendar's days are\nin: `gregory`, `buddhist`, `japanese`, `roc`, or `iso8601`, or a calendar\nwith months of its own that Date Picker's `calendar` names, such as\n`persian`, `hebrew`, `islamic-umalqura`, `ethiopic`, or `chinese`.\n\nAbsent is the locale's own where its months are the Gregorian months, and\n`gregory` for every other, as Date Picker's `calendar` is. The value is\n`YYYY-MM-DD` in every calendar, and a focused text field is ISO in every\ncalendar. In `segmented`, the segments are the day, month, and year as\nthe calendar counts them, in the order the locale writes them: Mehr 14,\n1405 is month 7 and day 14 of 1405 under `persian`. Under the five with\nGregorian months they are the Gregorian day, month, and year, or ISO order\nfor `iso8601`.",
51173
51483
  "fieldName": "calendar"
51174
51484
  },
51175
51485
  {
@@ -51181,13 +51491,31 @@
51181
51491
  "description": "The name of the calendar's grid of days, read by screen readers.",
51182
51492
  "fieldName": "calendarLabel"
51183
51493
  },
51494
+ {
51495
+ "name": "clearable",
51496
+ "type": {
51497
+ "text": "boolean"
51498
+ },
51499
+ "default": "false",
51500
+ "description": "Whether the field shows a button that empties it, as Input's `clearable`\ndoes. Shown only while the field holds something to clear and is neither\ndisabled nor read-only.",
51501
+ "fieldName": "clearable"
51502
+ },
51503
+ {
51504
+ "name": "clear-label",
51505
+ "type": {
51506
+ "text": "string"
51507
+ },
51508
+ "default": "'Clear'",
51509
+ "description": "The accessible name of the clear button, which shows only an icon.",
51510
+ "fieldName": "clearLabel"
51511
+ },
51184
51512
  {
51185
51513
  "name": "date-style",
51186
51514
  "type": {
51187
51515
  "text": "'full' | 'iso' | 'long' | 'medium' | 'short'"
51188
51516
  },
51189
51517
  "default": "'long'",
51190
- "description": "How a date is written in the field: `short` through `full`, or ISO.\n\n**The field renders when it is idle and holds the value when it is being\nedited.** A written date is a rendering, and a document being edited must\nnot be a rendering of something else: `Intl.DateTimeFormat` formats and does\nnot parse, so `4 August 2026` cannot be typed back, and writing a parser per\nlocale is how a field ends up rejecting what it just displayed.\n\nThe way out is not to choose between the two but to separate them in time.\nIdle, the field shows `4 August 2026`, which is what a date is for reading.\nFocused, it shows `2026-08-04`, which is what a date is for typing, and it\ngoes back on the way out. Nothing parses a rendering, and nothing is\nread-only, which is what an earlier version of this settled for.\n\nA range is the exception that needs no swap: the dash between its two dates\nis a separator this element understands, so that much reads back either way.\n\n`iso` turns the rendering off, for a field whose reader is entering data\nrather than reading it, or where the ISO form is itself the point.\n\nThe value is always `YYYY-MM-DD` regardless, because that is what a form\nsubmits and what `min` and `max` compare against.",
51518
+ "description": "How a date is written in the field: `short` through `full`, or ISO.\n\n**The field renders when it is idle and holds the value when it is being\nedited.** A written date is a rendering, and a document being edited must\nnot be a rendering of something else: `Intl.DateTimeFormat` formats and does\nnot parse, so a rendering such as `Tuesday, August 4, 2026` is no text to\nedit. The field does read a date typed in the locale's order and digits as\nyou leave it, which covers what a reader types.\n\nThe way out is not to choose between the two but to separate them in time.\nIdle, the field shows `4 August 2026`, which is what a date is for reading.\nFocused, it shows `2026-08-04`, which is what a date is for typing, and it\ngoes back on the way out. Nothing parses a rendering, and nothing is\nread-only, which is what an earlier version of this settled for.\n\nA range is the exception that needs no swap: the dash between its two dates\nis a separator this element understands, so that much reads back either way.\n\n`iso` turns the rendering off, for a field whose reader is entering data\nrather than reading it, or where the ISO form is itself the point.\n\nThe value is always `YYYY-MM-DD` regardless, because that is what a form\nsubmits and what `min` and `max` compare against.",
51191
51519
  "fieldName": "dateStyle"
51192
51520
  },
51193
51521
  {
@@ -51376,6 +51704,15 @@
51376
51704
  "description": "The name of the button that removes one date. `{name}` is replaced with\nthe date.\n\n**The name goes in**, so a row of them is heard as which one each\nremoves rather than as \"Remove\" said once per date.",
51377
51705
  "fieldName": "removeLabel"
51378
51706
  },
51707
+ {
51708
+ "name": "selection-label",
51709
+ "type": {
51710
+ "text": "string"
51711
+ },
51712
+ "default": "'{kind, select, date {Selected date: {start}} start {Range starts {start}. Choose the day it ends.} range {Selected range: {start} to {end}} other {{count, plural, one {# date selected} other {# dates selected}}}}'",
51713
+ "description": "What a screen reader hears about the dates chosen in the calendar, with\n`{kind}`, `{start}`, `{end}` and `{count}` filled in as Date Picker's\n`selection-label` says.",
51714
+ "fieldName": "selectionLabel"
51715
+ },
51379
51716
  {
51380
51717
  "name": "step",
51381
51718
  "type": {
@@ -51394,6 +51731,15 @@
51394
51731
  "description": "The message shown when a date is not on `step`.",
51395
51732
  "fieldName": "stepMismatchMessage"
51396
51733
  },
51734
+ {
51735
+ "name": "time-zone",
51736
+ "type": {
51737
+ "text": "string"
51738
+ },
51739
+ "default": "''",
51740
+ "description": "The time zone today is read in, such as `America/New_York`, handed to the\ncalendar: the day marked today, and the month an empty field opens on.\nEmpty is the reader's own. Dates are plain `YYYY-MM-DD` and carry no zone.",
51741
+ "fieldName": "timeZone"
51742
+ },
51397
51743
  {
51398
51744
  "name": "trigger-label",
51399
51745
  "type": {
@@ -51412,6 +51758,15 @@
51412
51758
  "description": "The message shown when `disable-dates` or `disable-days` bars a date.",
51413
51759
  "fieldName": "unavailableMessage"
51414
51760
  },
51761
+ {
51762
+ "name": "unreadable-message",
51763
+ "type": {
51764
+ "text": "string"
51765
+ },
51766
+ "default": "'{mode, select, single {Enter a date as YYYY-MM-DD.} other {Enter dates as YYYY-MM-DD, separated by commas.}}'",
51767
+ "description": "The message for text that is no date, where `bad-input-message` is not\nset. `{mode}` is `single`, `range`, or `multiple`.",
51768
+ "fieldName": "unreadableMessage"
51769
+ },
51415
51770
  {
51416
51771
  "name": "year-view-label",
51417
51772
  "type": {
@@ -51460,6 +51815,32 @@
51460
51815
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
51461
51816
  }
51462
51817
  },
51818
+ {
51819
+ "name": "range-end-label",
51820
+ "type": {
51821
+ "text": "string"
51822
+ },
51823
+ "default": "'End'",
51824
+ "description": "What a screen reader hears before the segments of a range's second date\nor time, after each segment's own name.",
51825
+ "fieldName": "rangeEndLabel",
51826
+ "inheritedFrom": {
51827
+ "name": "MixinSegmentedField",
51828
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
51829
+ }
51830
+ },
51831
+ {
51832
+ "name": "range-start-label",
51833
+ "type": {
51834
+ "text": "string"
51835
+ },
51836
+ "default": "'Start'",
51837
+ "description": "What a screen reader hears before the segments of a range's first date\nor time, after each segment's own name: \"month, Start, Stay\".",
51838
+ "fieldName": "rangeStartLabel",
51839
+ "inheritedFrom": {
51840
+ "name": "MixinSegmentedField",
51841
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
51842
+ }
51843
+ },
51463
51844
  {
51464
51845
  "name": "segmented",
51465
51846
  "type": {
@@ -51718,6 +52099,10 @@
51718
52099
  }
51719
52100
  ],
51720
52101
  "cssStates": [
52102
+ {
52103
+ "description": "The field holds no date.",
52104
+ "name": "blank"
52105
+ },
51721
52106
  {
51722
52107
  "description": "The field has an error to show, from the browser's validation or from your `feedback`.",
51723
52108
  "name": "invalid"
@@ -51841,7 +52226,7 @@
51841
52226
  "declarations": [
51842
52227
  {
51843
52228
  "kind": "class",
51844
- "description": "A grid of days that follows the APG date grid pattern:\n\n- The grid is one tab stop. Only the focused cell is in the tab sequence.\n- Arrow keys move by day and by week.\n- `PageUp` and `PageDown` move by month.\n- `Home` and `End` move to the start and end of the week.\n\n**Dates are `YYYY-MM-DD` strings, and every calculation is in UTC**, because\na local-time `Date` shifts across a time zone or daylight-saving boundary.\n\n**The days are the Gregorian calendar's**, written in `calendar`: the\nlocale's own where its months are the Gregorian months, as `th-TH` writes\n2569 for 2026, and `gregory` where they are not, as for `fa-IR`.\n\n`month` sets which month the grid shows, separately from `value`, so paging\nselects nothing and you can control the view. When unset, it follows the\nfirst selected date, then the current month.\n\n`mode` sets how many dates are held. Unset holds one, `range` holds two and\nmarks the dates between them, and `multiple` toggles each date. All three\nread and write the same comma-separated `value`.\n\n`max-view` makes the heading a button that steps back to the months of the\nyear, and with `year` to a page of years, as Zag's date picker does. The\narrows, Home, End and the page keys move there, Enter or a press chooses, and\nEscape goes back to the days.\n\n`isDateUnavailable` and `dayContent` are properties for a script: a rule\nthat bars dates, and what each day shows in place of its number.\n\nThe month heading is a live region, so a screen reader hears the new month\nwhen Previous or Next is pressed. Neither moves past `min` or `max`, and the\nkeys stop at them too. A value outside the bounds, on a barred day, or off\n`step` reports `rangeUnderflow`, `rangeOverflow`, `badInput` or\n`stepMismatch`, so a form does not submit it.",
52229
+ "description": "A grid of days that follows the APG date grid pattern:\n\n- The grid is one tab stop. Only the focused cell is in the tab sequence.\n- Arrow keys move by day and by week.\n- `PageUp` and `PageDown` move by month.\n- `Home` and `End` move to the start and end of the week.\n\n**Dates are `YYYY-MM-DD` strings, and every calculation is in UTC**, because\na local-time `Date` shifts across a time zone or daylight-saving boundary.\n\n**The months are the ones `calendar` counts**: the Gregorian months for the\nlocale's own calendar where its months are the Gregorian months, as `th-TH`\nwrites 2569 for 2026, and `gregory` where they are not, as for `fa-IR`\nwith no `calendar`. Name a calendar with months of its own, such as\n`persian`, and every view counts its days, months, and years from `Intl`.\n\n`month` sets which month the grid shows, separately from `value`, so paging\nselects nothing and you can control the view. When unset, it follows the\nfirst selected date, then the current month.\n\n`mode` sets how many dates are held. Unset holds one, `range` holds two and\nmarks the dates between them, and `multiple` toggles each date. All three\nread and write the same comma-separated `value`. With a `mode`, the grid\ncarries `aria-multiselectable`. While a range holds one end, the grid draws\nthe range to the day under the pointer or the focus, marking those cells\n`data-range-preview`.\n\nThe chosen date, range, or count of dates is the grid's description, in a\nregion screen readers announce when it changes, as React Aria's calendars\ndo. `selection-label` words it.\n\n`max-view` makes the heading a button that steps back to the months of the\nyear, and with `year` to a page of years, as Zag's date picker does. The\narrows, Home, End and the page keys move there, Enter or a press chooses, and\nEscape goes back to the days.\n\n`isDateUnavailable` and `dayContent` are properties for a script: a rule\nthat bars dates, and what each day shows in place of its number.\n\nThe month heading is a live region, so a screen reader hears the new month\nwhen Previous or Next is pressed. Neither moves past `min` or `max`, and the\nkeys stop at them too. A value outside the bounds, on a barred day, or off\n`step` reports `rangeUnderflow`, `rangeOverflow`, `badInput` or\n`stepMismatch`, so a form does not submit it.",
51845
52230
  "name": "HelixHeadlessDatePicker",
51846
52231
  "cssProperties": [
51847
52232
  {
@@ -51855,7 +52240,7 @@
51855
52240
  "name": "cell"
51856
52241
  },
51857
52242
  {
51858
- "description": "The cell of a range's last day, beside `cell`.",
52243
+ "description": "The cell of a range's last day, beside `cell`, or of the day a waiting range is drawn to.",
51859
52244
  "name": "cell-range-end"
51860
52245
  },
51861
52246
  {
@@ -51958,6 +52343,10 @@
51958
52343
  "description": "The glyph on the previous month control, where none is slotted.",
51959
52344
  "name": "previous-mark"
51960
52345
  },
52346
+ {
52347
+ "description": "The chosen date or range in words, which screen readers hear when it changes. Drawn for screen readers only.",
52348
+ "name": "selection"
52349
+ },
51961
52350
  {
51962
52351
  "description": "One row of days.",
51963
52352
  "name": "week"
@@ -52013,9 +52402,9 @@
52013
52402
  "kind": "field",
52014
52403
  "name": "calendar",
52015
52404
  "type": {
52016
- "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'coptic' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic-civil' | 'islamic-umalqura' | 'persian' | undefined"
52405
+ "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'chinese' | 'coptic' | 'dangi' | 'ethioaa' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic' | 'islamic-civil' | 'islamic-rgsa' | 'islamic-tbla' | 'islamic-umalqura' | 'persian' | undefined"
52017
52406
  },
52018
- "description": "The calendar the heading, the days, and the months are written in.\n\n`gregory`, `buddhist`, `japanese`, `roc`, and `iso8601` are the five\nwhose months are the Gregorian months. Absent is the locale's own where\nit is one of the five, such as `buddhist` for `th-TH` or `japanese` for\n`ja-JP-u-ca-japanese`, and `gregory` for every other, such as `persian`\nfor `fa-IR`.\n\n`persian`, `hebrew`, `islamic-umalqura`, `islamic-civil`, `ethiopic`,\n`coptic`, and `indian` draw a calendar with months of its own, as React\nAria's calendars do: each grid is one of that calendar's months, the\nHebrew leap month and Ethiopia's five-day thirteenth month included, and\nPrevious, Next and the page keys move by those months. `month` and\n`helix-navigate` then name a month by its first day, `YYYY-MM-DD`. The\nheading stays text, as the months and years views are drawn in Gregorian\nmonths only. The value is `YYYY-MM-DD` in every calendar.",
52407
+ "description": "The calendar the heading, the days, and the months are written in.\n\n`gregory`, `buddhist`, `japanese`, `roc`, and `iso8601` are the five\nwhose months are the Gregorian months. Absent is the locale's own where\nit is one of the five, such as `buddhist` for `th-TH` or `japanese` for\n`ja-JP-u-ca-japanese`, and `gregory` for every other, such as `persian`\nfor `fa-IR`.\n\n`persian`, `hebrew`, `islamic`, `islamic-umalqura`, `islamic-civil`,\n`islamic-tbla`, `islamic-rgsa`, `ethiopic`, `ethioaa`, `coptic`,\n`indian`, `chinese`, and `dangi` draw a calendar with months of its own,\nas React Aria's calendars do: each grid is one of that calendar's months,\nthe Hebrew and Chinese leap months and Ethiopia's five-day thirteenth\nmonth included, and Previous, Next and the page keys move by those\nmonths. With `max-view`, the months view shows that calendar's year, of\ntwelve or thirteen months, and the years view its years. `month` and\n`helix-navigate` then name a month by its first day, `YYYY-MM-DD`. The\nvalue is `YYYY-MM-DD` in every calendar.",
52019
52408
  "attribute": "calendar"
52020
52409
  },
52021
52410
  {
@@ -52155,6 +52544,16 @@
52155
52544
  "default": "undefined",
52156
52545
  "description": "The month on show, whoever set it, and `undefined` until somebody has."
52157
52546
  },
52547
+ {
52548
+ "kind": "field",
52549
+ "name": "browsed",
52550
+ "type": {
52551
+ "text": "boolean"
52552
+ },
52553
+ "privacy": "private",
52554
+ "default": "false",
52555
+ "description": "Whether the month on show is one the reader paged to, which `showChosen` forgets."
52556
+ },
52158
52557
  {
52159
52558
  "kind": "field",
52160
52559
  "name": "month",
@@ -52338,6 +52737,61 @@
52338
52737
  "description": "The range's ends, when there are two and the mode asks for them.",
52339
52738
  "readonly": true
52340
52739
  },
52740
+ {
52741
+ "kind": "field",
52742
+ "name": "previewed",
52743
+ "type": {
52744
+ "text": "string"
52745
+ },
52746
+ "privacy": "private",
52747
+ "default": "''",
52748
+ "description": "The day a reader points at or moves to while a range holds one end, which\nthe grid draws the range to before it is chosen."
52749
+ },
52750
+ {
52751
+ "kind": "field",
52752
+ "name": "pending",
52753
+ "type": {
52754
+ "text": "boolean"
52755
+ },
52756
+ "privacy": "private",
52757
+ "description": "Whether a range holds its first end and waits for the second.",
52758
+ "readonly": true
52759
+ },
52760
+ {
52761
+ "kind": "field",
52762
+ "name": "drawnRange",
52763
+ "type": {
52764
+ "text": "{ ends: [string, string]; preview: boolean } | null"
52765
+ },
52766
+ "privacy": "private",
52767
+ "description": "The range the grid draws: the chosen one, or, while one end waits for\nthe other, the run to the day under the pointer or the focus.",
52768
+ "readonly": true
52769
+ },
52770
+ {
52771
+ "kind": "method",
52772
+ "name": "preview",
52773
+ "privacy": "private",
52774
+ "return": {
52775
+ "type": {
52776
+ "text": "void"
52777
+ }
52778
+ },
52779
+ "parameters": [
52780
+ {
52781
+ "name": "iso",
52782
+ "type": {
52783
+ "text": "string"
52784
+ }
52785
+ }
52786
+ ],
52787
+ "description": "Draws a waiting range to the day the pointer is on."
52788
+ },
52789
+ {
52790
+ "kind": "field",
52791
+ "name": "handleGridLeave",
52792
+ "privacy": "private",
52793
+ "readonly": true
52794
+ },
52341
52795
  {
52342
52796
  "kind": "method",
52343
52797
  "name": "isSelected",
@@ -52376,16 +52830,6 @@
52376
52830
  "description": "The months the calendar pages through: its own under a `calendar` with\nmonths of its own, and the Gregorian months otherwise.",
52377
52831
  "readonly": true
52378
52832
  },
52379
- {
52380
- "kind": "field",
52381
- "name": "ownMonths",
52382
- "type": {
52383
- "text": "boolean"
52384
- },
52385
- "privacy": "private",
52386
- "description": "Whether `calendar` names a calendar with months of its own.",
52387
- "readonly": true
52388
- },
52389
52833
  {
52390
52834
  "kind": "field",
52391
52835
  "name": "derivedMonth",
@@ -52732,6 +53176,19 @@
52732
53176
  "text": "focus(options?: FocusOptions) => void"
52733
53177
  }
52734
53178
  },
53179
+ {
53180
+ "kind": "method",
53181
+ "name": "showChosen",
53182
+ "return": {
53183
+ "type": {
53184
+ "text": "void"
53185
+ }
53186
+ },
53187
+ "description": "Shows the days again, on the month of the chosen date, with the tab stop\non that date, forgetting the month and the day the reader browsed to.\n\nDate Input calls it each time its panel opens, which is where the APG\ndate picker dialog puts focus. Measured before this: from August 4, two\npresses of Page Down, Escape, and Down again opened on October 4.\nA `month` you set stays until the reader pages away from it.",
53188
+ "type": {
53189
+ "text": "showChosen() => void"
53190
+ }
53191
+ },
52735
53192
  {
52736
53193
  "kind": "field",
52737
53194
  "name": "rangeUnderflowMessage",
@@ -52792,6 +53249,29 @@
52792
53249
  "attribute": "required",
52793
53250
  "reflects": true
52794
53251
  },
53252
+ {
53253
+ "kind": "field",
53254
+ "name": "selectionLabel",
53255
+ "type": {
53256
+ "text": "string"
53257
+ },
53258
+ "default": "'{kind, select, date {Selected date: {start}} start {Range starts {start}. Choose the day it ends.} range {Selected range: {start} to {end}} other {{count, plural, one {# date selected} other {# dates selected}}}}'",
53259
+ "description": "What a screen reader hears about the chosen dates: the grid's\ndescription, said again whenever the dates change. `{kind}` is `date`,\n`start` while a range holds one end, `range`, or `dates` for `multiple`.\n`{start}` and `{end}` are dates written in `locale`, and `{count}` is how\nmany dates are chosen.",
53260
+ "attribute": "selection-label",
53261
+ "helix": {
53262
+ "words": true
53263
+ }
53264
+ },
53265
+ {
53266
+ "kind": "field",
53267
+ "name": "selectionWords",
53268
+ "type": {
53269
+ "text": "string"
53270
+ },
53271
+ "privacy": "private",
53272
+ "description": "`selectionLabel` for the dates chosen now, or nothing while there are none.\n\nReact Aria's calendars describe the grid by the chosen date or range and\nannounce it when it changes. Measured before this: a range of seven days\nwas seven cells with `aria-selected` in a grid that said nothing of a\nrange, and choosing its end was heard as one more selected cell.",
53273
+ "readonly": true
53274
+ },
52795
53275
  {
52796
53276
  "kind": "field",
52797
53277
  "name": "step",
@@ -52923,6 +53403,30 @@
52923
53403
  },
52924
53404
  "description": "Reports \"required and empty\", or clears it.\n\nWritten out rather than taken from `MixinField`, which is where the seven\nform controls get this. That mixin brings a label, a hint and a feedback\nregion with it, and this is a grid rather than a field: it is composed\n*into* the field that has those, so taking the mixin would give one control\ntwo of each. What is shared is five lines, and the anchor is what the\nbrowser points its bubble at."
52925
53405
  },
53406
+ {
53407
+ "kind": "field",
53408
+ "name": "problem",
53409
+ "type": {
53410
+ "text": "[ValidityStateFlags, string] | undefined"
53411
+ },
53412
+ "privacy": "private",
53413
+ "description": "What is wrong with the answer, as validity flags and a message, or nothing.\n`reportRequired` hands it to the form, and `failure` to the mark.",
53414
+ "readonly": true
53415
+ },
53416
+ {
53417
+ "kind": "field",
53418
+ "name": "failure",
53419
+ "type": {
53420
+ "text": "'missing' | 'refused' | undefined"
53421
+ },
53422
+ "privacy": "protected",
53423
+ "description": "A missing date waits for the reader; a refused one is marked at once.",
53424
+ "readonly": true,
53425
+ "inheritedFrom": {
53426
+ "name": "MixinPickerFeedback",
53427
+ "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
53428
+ }
53429
+ },
52926
53430
  {
52927
53431
  "kind": "method",
52928
53432
  "name": "report",
@@ -53113,6 +53617,20 @@
53113
53617
  "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
53114
53618
  }
53115
53619
  },
53620
+ {
53621
+ "kind": "field",
53622
+ "name": "touched",
53623
+ "type": {
53624
+ "text": "boolean"
53625
+ },
53626
+ "privacy": "private",
53627
+ "default": "false",
53628
+ "description": "Whether the reader has committed an answer, or a form has refused the\npicker. A reset forgets it.",
53629
+ "inheritedFrom": {
53630
+ "name": "MixinPickerFeedback",
53631
+ "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
53632
+ }
53633
+ },
53116
53634
  {
53117
53635
  "kind": "field",
53118
53636
  "name": "marked",
@@ -53120,13 +53638,30 @@
53120
53638
  "text": "boolean"
53121
53639
  },
53122
53640
  "privacy": "protected",
53123
- "description": "Whether a reader is told the answer is wrong: `invalid`, or `feedback`.",
53641
+ "description": "Whether a reader is told the answer is wrong: `invalid`, `feedback`, a\nheld answer the picker refuses, or a missing answer once the reader has\ncommitted one or a form has refused the picker.\n\n**A refused answer is marked at once, and a missing one waits**, as\nChromium's tree does for native controls: a time input holding a time\npast its `max` reports invalid on load, and an empty required text field\ndoes not, since the reader already hears that it is required. Measured\nbefore this on Time Picker: `value=\"13:00\" max=\"12:00\"` reported\n`rangeOverflow` while the list said nothing and `:state(invalid)` was off.",
53124
53642
  "readonly": true,
53125
53643
  "inheritedFrom": {
53126
53644
  "name": "MixinPickerFeedback",
53127
53645
  "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
53128
53646
  }
53129
53647
  },
53648
+ {
53649
+ "kind": "method",
53650
+ "name": "formResetCallback",
53651
+ "return": {
53652
+ "type": {
53653
+ "text": "void"
53654
+ }
53655
+ },
53656
+ "description": "Returns the control to its `defaultValue`, or to its `value` attribute\nwhere there is no `default-value`.\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.",
53657
+ "inheritedFrom": {
53658
+ "name": "HelixFormElement",
53659
+ "module": "src/helix-form-element/helix-form-element.ts"
53660
+ },
53661
+ "type": {
53662
+ "text": "formResetCallback() => void"
53663
+ }
53664
+ },
53130
53665
  {
53131
53666
  "kind": "method",
53132
53667
  "name": "renderPickerFeedback",
@@ -53227,23 +53762,6 @@
53227
53762
  "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
53228
53763
  }
53229
53764
  },
53230
- {
53231
- "kind": "method",
53232
- "name": "formResetCallback",
53233
- "return": {
53234
- "type": {
53235
- "text": "void"
53236
- }
53237
- },
53238
- "description": "Returns the control to its `defaultValue`, or to its `value` attribute\nwhere there is no `default-value`.\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.",
53239
- "inheritedFrom": {
53240
- "name": "HelixFormElement",
53241
- "module": "src/helix-form-element/helix-form-element.ts"
53242
- },
53243
- "type": {
53244
- "text": "formResetCallback() => void"
53245
- }
53246
- },
53247
53765
  {
53248
53766
  "kind": "method",
53249
53767
  "name": "formStateRestoreCallback",
@@ -54077,9 +54595,9 @@
54077
54595
  {
54078
54596
  "name": "calendar",
54079
54597
  "type": {
54080
- "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'coptic' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic-civil' | 'islamic-umalqura' | 'persian' | undefined"
54598
+ "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'chinese' | 'coptic' | 'dangi' | 'ethioaa' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic' | 'islamic-civil' | 'islamic-rgsa' | 'islamic-tbla' | 'islamic-umalqura' | 'persian' | undefined"
54081
54599
  },
54082
- "description": "The calendar the heading, the days, and the months are written in.\n\n`gregory`, `buddhist`, `japanese`, `roc`, and `iso8601` are the five\nwhose months are the Gregorian months. Absent is the locale's own where\nit is one of the five, such as `buddhist` for `th-TH` or `japanese` for\n`ja-JP-u-ca-japanese`, and `gregory` for every other, such as `persian`\nfor `fa-IR`.\n\n`persian`, `hebrew`, `islamic-umalqura`, `islamic-civil`, `ethiopic`,\n`coptic`, and `indian` draw a calendar with months of its own, as React\nAria's calendars do: each grid is one of that calendar's months, the\nHebrew leap month and Ethiopia's five-day thirteenth month included, and\nPrevious, Next and the page keys move by those months. `month` and\n`helix-navigate` then name a month by its first day, `YYYY-MM-DD`. The\nheading stays text, as the months and years views are drawn in Gregorian\nmonths only. The value is `YYYY-MM-DD` in every calendar.",
54600
+ "description": "The calendar the heading, the days, and the months are written in.\n\n`gregory`, `buddhist`, `japanese`, `roc`, and `iso8601` are the five\nwhose months are the Gregorian months. Absent is the locale's own where\nit is one of the five, such as `buddhist` for `th-TH` or `japanese` for\n`ja-JP-u-ca-japanese`, and `gregory` for every other, such as `persian`\nfor `fa-IR`.\n\n`persian`, `hebrew`, `islamic`, `islamic-umalqura`, `islamic-civil`,\n`islamic-tbla`, `islamic-rgsa`, `ethiopic`, `ethioaa`, `coptic`,\n`indian`, `chinese`, and `dangi` draw a calendar with months of its own,\nas React Aria's calendars do: each grid is one of that calendar's months,\nthe Hebrew and Chinese leap months and Ethiopia's five-day thirteenth\nmonth included, and Previous, Next and the page keys move by those\nmonths. With `max-view`, the months view shows that calendar's year, of\ntwelve or thirteen months, and the years view its years. `month` and\n`helix-navigate` then name a month by its first day, `YYYY-MM-DD`. The\nvalue is `YYYY-MM-DD` in every calendar.",
54083
54601
  "fieldName": "calendar"
54084
54602
  },
54085
54603
  {
@@ -54285,6 +54803,15 @@
54285
54803
  "description": "Stops the form from submitting while no date is chosen.",
54286
54804
  "fieldName": "required"
54287
54805
  },
54806
+ {
54807
+ "name": "selection-label",
54808
+ "type": {
54809
+ "text": "string"
54810
+ },
54811
+ "default": "'{kind, select, date {Selected date: {start}} start {Range starts {start}. Choose the day it ends.} range {Selected range: {start} to {end}} other {{count, plural, one {# date selected} other {# dates selected}}}}'",
54812
+ "description": "What a screen reader hears about the chosen dates: the grid's\ndescription, said again whenever the dates change. `{kind}` is `date`,\n`start` while a range holds one end, `range`, or `dates` for `multiple`.\n`{start}` and `{end}` are dates written in `locale`, and `{count}` is how\nmany dates are chosen.",
54813
+ "fieldName": "selectionLabel"
54814
+ },
54288
54815
  {
54289
54816
  "name": "step",
54290
54817
  "type": {
@@ -54428,9 +54955,25 @@
54428
54955
  ],
54429
54956
  "cssStates": [
54430
54957
  {
54431
- "description": "While `invalid` is set or `feedback` says what is wrong.",
54958
+ "description": "While no date is chosen.",
54959
+ "name": "blank"
54960
+ },
54961
+ {
54962
+ "description": "While `invalid` is set, `feedback` says what is wrong, the picker holds a date outside `min` and `max` or one it bars, or it is `required`, holds no date, and the reader has answered once or a form has refused it.",
54432
54963
  "name": "invalid"
54433
54964
  },
54965
+ {
54966
+ "description": "While the months of a year are shown, where `max-view` is set.",
54967
+ "name": "month-view"
54968
+ },
54969
+ {
54970
+ "description": "While a `range` holds its first end and waits for the second.",
54971
+ "name": "range-pending"
54972
+ },
54973
+ {
54974
+ "description": "While a page of years is shown, where `max-view` is `year`.",
54975
+ "name": "year-view"
54976
+ },
54434
54977
  {
54435
54978
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
54436
54979
  "name": "settled",
@@ -70023,7 +70566,7 @@
70023
70566
  "type": {
70024
70567
  "text": "Record<string, (value: string) => TemplateResult>"
70025
70568
  },
70026
- "default": "{ day: (value) => html`<span part=\"day\">${value}</span>`, dayPeriod: (value) => html`<span part=\"day-period\">${value}</span>`, era: (value) => html`<span part=\"era\">${value}</span>`, hour: (value) => html`<span part=\"hour\">${value}</span>`, minute: (value) => html`<span part=\"minute\">${value}</span>`, month: (value) => html`<span part=\"month\">${value}</span>`, second: (value) => html`<span part=\"second\">${value}</span>`, timeZoneName: (value) => html`<span part=\"time-zone-name\">${value}</span>`, weekday: (value) => html`<span part=\"weekday\">${value}</span>`, year: (value) => html`<span part=\"year\">${value}</span>`, }",
70569
+ "default": "{ day: (value) => html`<span part=\"day\">${value}</span>`, dayPeriod: (value) => html`<span part=\"day-period\">${value}</span>`, era: (value) => html`<span part=\"era\">${value}</span>`, fractionalSecond: (value) => html`<span part=\"fractional-second\">${value}</span>`, hour: (value) => html`<span part=\"hour\">${value}</span>`, minute: (value) => html`<span part=\"minute\">${value}</span>`, month: (value) => html`<span part=\"month\">${value}</span>`, second: (value) => html`<span part=\"second\">${value}</span>`, timeZoneName: (value) => html`<span part=\"time-zone-name\">${value}</span>`, weekday: (value) => html`<span part=\"weekday\">${value}</span>`, year: (value) => html`<span part=\"year\">${value}</span>`, }",
70027
70570
  "description": "Each date field `Intl` names, drawn as a part of its own.\n\nKeyed by the `type` of `Intl.DateTimeFormat#formatToParts`. Written out one\ntemplate to a field rather than bound through one `part` binding, because a\npart is read from the source as a literal: a bound name is a part no\nstylesheet check can find. A type left out, the punctuation between the\nfields among them, is drawn as plain text."
70028
70571
  },
70029
70572
  {
@@ -70123,7 +70666,7 @@
70123
70666
  "declarations": [
70124
70667
  {
70125
70668
  "kind": "class",
70126
- "description": "Formats a date with `Intl` where it is shown, so you do not write the same\n`Intl` call and options in your own code.\n\n**`elapsed` shows compact relative time for a feed**, such as \"42m\", \"3h\", or\n\"1d\". After six days it shows a date. In en-US, `Intl.NumberFormat` narrow\nrenders both `minute` and `month` as `m`, so a compact \"3m\" could mean three\nminutes or three months. `elapsedTime` in `helix/core` does the measurement.\n\n**`relative` shows the same reading in words**, such as \"3 hours ago\" at\n`long`, \"3 hr. ago\" at `short` and \"3h ago\" at `narrow`, the styles\n`sl-relative-time` offers. `numeric=\"always\"` says \"1 day ago\" where the\ndefault says \"yesterday\".\n\n**`date-style` and `time-style` take each locale's own pattern**, such as\n\"Tuesday, August 4, 2026\" at `full`, and stand in for the separate fields,\nwhich `Intl` refuses beside them. `hour-cycle` sets a twelve or twenty-four\nhour clock either way.\n\n**The text refreshes on one timer shared by the page.** Each element\nschedules an update for when its current reading expires, and an element\nshowing a date schedules none, so a long feed left open costs almost nothing.\n`frozen` draws the reading once and leaves it.\n\n**`fields` draws each field of a date as a part of its own**, such as\n`day`, `month` and `year`, so a stylesheet can set the year in a lighter ink\nor the weekday in capitals with `::part()`. The text between the fields is\nthe locale's own and has no part. An `elapsed` or `relative` reading is one\nphrase, with no parts inside it.\n\n**The output is always `<time datetime>`**, so copy and paste and scripts\nparsing the page get the exact instant, whatever the visible text says. A\nscreen reader reads the text, so an `elapsed` reading is named in full, such\nas \"3 hours ago\", and carries the whole date as its title.\n\n**A date with no time, such as `2026-08-04`, is that day everywhere.** It is\nformatted in UTC unless `time-zone` says otherwise, as Date Input and Date\nPicker format their dates, so a reader west of UTC sees August 4 and not\nAugust 3.\n\n**A date is written in a calendar Date Picker draws**: the locale's own\nwhere its months are the Gregorian months, as `th-TH` writes 2569 for 2026,\nand `gregory` where they are not, as for `fa-IR`. `calendar` picks one of\nthe five.",
70669
+ "description": "Formats a date with `Intl` where it is shown, so you do not write the same\n`Intl` call and options in your own code.\n\n**`elapsed` shows compact relative time for a feed**, such as \"42m\", \"3h\", or\n\"1d\". After six days it shows a date. In en-US, `Intl.NumberFormat` narrow\nrenders both `minute` and `month` as `m`, so a compact \"3m\" could mean three\nminutes or three months. `elapsedTime` in `helix/core` does the measurement.\n\n**`relative` shows the same reading in words**, such as \"3 hours ago\" at\n`long`, \"3 hr. ago\" at `short` and \"3h ago\" at `narrow`, the styles\n`sl-relative-time` offers. `numeric=\"always\"` says \"1 day ago\" where the\ndefault says \"yesterday\".\n\n**`date-style` and `time-style` take each locale's own pattern**, such as\n\"Tuesday, August 4, 2026\" at `full`, and stand in for the separate fields,\nwhich `Intl` refuses beside them. `hour-cycle` sets a twelve or twenty-four\nhour clock either way.\n\n**The text refreshes on one timer shared by the page.** Each element\nschedules an update for when its current reading expires, and an element\nshowing a date schedules none, so a long feed left open costs almost nothing.\n`frozen` draws the reading once and leaves it.\n\n**`fields` draws each field of a date as a part of its own**, such as\n`day`, `month` and `year`, so a stylesheet can set the year in a lighter ink\nor the weekday in capitals with `::part()`. The text between the fields is\nthe locale's own and has no part. An `elapsed` or `relative` reading is one\nphrase, with no parts inside it.\n\n**The output is always `<time datetime>`**, so copy and paste and scripts\nparsing the page get the exact instant, whatever the visible text says. A\nscreen reader reads the text, so an `elapsed` reading is named in full, such\nas \"3 hours ago\", and carries the whole date as its title.\n\n**A date with no time, such as `2026-08-04`, is that day everywhere.** It is\nformatted in UTC unless `time-zone` says otherwise, as Date Input and Date\nPicker format their dates, so a reader west of UTC sees August 4 and not\nAugust 3.\n\n**A date is written in a calendar Date Picker draws**: the locale's own\nwhere its months are the Gregorian months, as `th-TH` writes 2569 for 2026,\nand `gregory` where they are not, as for `fa-IR`. `calendar` picks any of\nthem, `persian` and `hebrew` included.",
70127
70670
  "name": "HelixHeadlessFormatDate",
70128
70671
  "cssParts": [
70129
70672
  {
@@ -70138,6 +70681,10 @@
70138
70681
  "description": "The era, such as AD, with `fields` and `era`.",
70139
70682
  "name": "era"
70140
70683
  },
70684
+ {
70685
+ "description": "The fraction of a second, with `fields` and `fractional-second-digits`.",
70686
+ "name": "fractional-second"
70687
+ },
70141
70688
  {
70142
70689
  "description": "The hour, with `fields`.",
70143
70690
  "name": "hour"
@@ -70176,9 +70723,9 @@
70176
70723
  "kind": "field",
70177
70724
  "name": "calendar",
70178
70725
  "type": {
70179
- "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | undefined"
70726
+ "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'chinese' | 'coptic' | 'dangi' | 'ethioaa' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic' | 'islamic-civil' | 'islamic-rgsa' | 'islamic-tbla' | 'islamic-umalqura' | 'persian' | undefined"
70180
70727
  },
70181
- "description": "The calendar a date is written in: `gregory`, `buddhist`, `japanese`,\n`roc`, or `iso8601`, the calendars Date Picker and Date Input draw.\n\nAbsent is the locale's own where it is one of the five, such as\n`buddhist` for `th-TH`, and `gregory` for every other, such as `persian`\nfor `fa-IR`, so a date written here reads as the same date a Date Picker\nbeside it shows.",
70728
+ "description": "The calendar a date is written in: `gregory`, `buddhist`, `japanese`,\n`roc`, or `iso8601`, or a calendar with months of its own, such as\n`persian`, `hebrew`, `islamic-umalqura`, `ethiopic`, or `chinese`: every\ncalendar Date Picker and Date Input draw.\n\nAbsent is the locale's own where its months are the Gregorian months,\nsuch as `buddhist` for `th-TH`, and `gregory` for every other, such as\n`persian` for `fa-IR`, so a date written here reads as the same date a\nDate Picker beside it shows. Write `calendar=\"persian\"` for Mehr 14, 1405.",
70182
70729
  "attribute": "calendar"
70183
70730
  },
70184
70731
  {
@@ -70209,6 +70756,15 @@
70209
70756
  "description": "How the day of the month is written, where a date is shown.",
70210
70757
  "attribute": "day"
70211
70758
  },
70759
+ {
70760
+ "kind": "field",
70761
+ "name": "dayPeriod",
70762
+ "type": {
70763
+ "text": "'long' | 'narrow' | 'short' | undefined"
70764
+ },
70765
+ "description": "Writes the part of the day in words, such as \"in the morning\" or \"at\nnight\", in its `long`, `short`, or `narrow` form, where `hour` is on a\ntwelve-hour clock.",
70766
+ "attribute": "day-period"
70767
+ },
70212
70768
  {
70213
70769
  "kind": "field",
70214
70770
  "name": "elapsed",
@@ -70238,6 +70794,15 @@
70238
70794
  "description": "Draws each field of a date in a part of its own: `weekday`, `day`,\n`month`, `year`, `era`, `hour`, `minute`, `second`, `day-period` and\n`time-zone-name`, so `::part(year)` can set the year apart.\n\nOff by default, which draws the date as one run of text, as Shoelace and\nWeb Awesome do. An `elapsed` or `relative` reading is one phrase either\nway.",
70239
70795
  "attribute": "fields"
70240
70796
  },
70797
+ {
70798
+ "kind": "field",
70799
+ "name": "fractionalSecondDigits",
70800
+ "type": {
70801
+ "text": "1 | 2 | 3 | undefined"
70802
+ },
70803
+ "description": "How many digits of a fraction of a second to write after `second`: 1, 2,\nor 3, as in 09:41:07.250.",
70804
+ "attribute": "fractional-second-digits"
70805
+ },
70241
70806
  {
70242
70807
  "kind": "field",
70243
70808
  "name": "frozen",
@@ -70353,9 +70918,9 @@
70353
70918
  "kind": "field",
70354
70919
  "name": "timeZoneName",
70355
70920
  "type": {
70356
- "text": "'long' | 'short' | undefined"
70921
+ "text": "'long' | 'longGeneric' | 'longOffset' | 'short' | 'shortGeneric' | 'shortOffset' | undefined"
70357
70922
  },
70358
- "description": "Shows the name of the time zone, in its `long` or `short` form.",
70923
+ "description": "Shows the name of the time zone: `long` or `short`, as Pacific Daylight\nTime or PDT, `longOffset` or `shortOffset`, as GMT-07:00 or GMT-7, or\n`longGeneric` or `shortGeneric`, as Pacific Time or PT.",
70359
70924
  "attribute": "time-zone-name"
70360
70925
  },
70361
70926
  {
@@ -70832,9 +71397,9 @@
70832
71397
  {
70833
71398
  "name": "calendar",
70834
71399
  "type": {
70835
- "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | undefined"
71400
+ "text": "'buddhist' | 'gregory' | 'iso8601' | 'japanese' | 'roc' | 'chinese' | 'coptic' | 'dangi' | 'ethioaa' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic' | 'islamic-civil' | 'islamic-rgsa' | 'islamic-tbla' | 'islamic-umalqura' | 'persian' | undefined"
70836
71401
  },
70837
- "description": "The calendar a date is written in: `gregory`, `buddhist`, `japanese`,\n`roc`, or `iso8601`, the calendars Date Picker and Date Input draw.\n\nAbsent is the locale's own where it is one of the five, such as\n`buddhist` for `th-TH`, and `gregory` for every other, such as `persian`\nfor `fa-IR`, so a date written here reads as the same date a Date Picker\nbeside it shows.",
71402
+ "description": "The calendar a date is written in: `gregory`, `buddhist`, `japanese`,\n`roc`, or `iso8601`, or a calendar with months of its own, such as\n`persian`, `hebrew`, `islamic-umalqura`, `ethiopic`, or `chinese`: every\ncalendar Date Picker and Date Input draw.\n\nAbsent is the locale's own where its months are the Gregorian months,\nsuch as `buddhist` for `th-TH`, and `gregory` for every other, such as\n`persian` for `fa-IR`, so a date written here reads as the same date a\nDate Picker beside it shows. Write `calendar=\"persian\"` for Mehr 14, 1405.",
70838
71403
  "fieldName": "calendar"
70839
71404
  },
70840
71405
  {
@@ -70862,6 +71427,14 @@
70862
71427
  "description": "How the day of the month is written, where a date is shown.",
70863
71428
  "fieldName": "day"
70864
71429
  },
71430
+ {
71431
+ "name": "day-period",
71432
+ "type": {
71433
+ "text": "'long' | 'narrow' | 'short' | undefined"
71434
+ },
71435
+ "description": "Writes the part of the day in words, such as \"in the morning\" or \"at\nnight\", in its `long`, `short`, or `narrow` form, where `hour` is on a\ntwelve-hour clock.",
71436
+ "fieldName": "dayPeriod"
71437
+ },
70865
71438
  {
70866
71439
  "name": "elapsed",
70867
71440
  "type": {
@@ -70887,6 +71460,14 @@
70887
71460
  "description": "Draws each field of a date in a part of its own: `weekday`, `day`,\n`month`, `year`, `era`, `hour`, `minute`, `second`, `day-period` and\n`time-zone-name`, so `::part(year)` can set the year apart.\n\nOff by default, which draws the date as one run of text, as Shoelace and\nWeb Awesome do. An `elapsed` or `relative` reading is one phrase either\nway.",
70888
71461
  "fieldName": "fields"
70889
71462
  },
71463
+ {
71464
+ "name": "fractional-second-digits",
71465
+ "type": {
71466
+ "text": "1 | 2 | 3 | undefined"
71467
+ },
71468
+ "description": "How many digits of a fraction of a second to write after `second`: 1, 2,\nor 3, as in 09:41:07.250.",
71469
+ "fieldName": "fractionalSecondDigits"
71470
+ },
70890
71471
  {
70891
71472
  "name": "frozen",
70892
71473
  "type": {
@@ -70980,9 +71561,9 @@
70980
71561
  {
70981
71562
  "name": "time-zone-name",
70982
71563
  "type": {
70983
- "text": "'long' | 'short' | undefined"
71564
+ "text": "'long' | 'longGeneric' | 'longOffset' | 'short' | 'shortGeneric' | 'shortOffset' | undefined"
70984
71565
  },
70985
- "description": "Shows the name of the time zone, in its `long` or `short` form.",
71566
+ "description": "Shows the name of the time zone: `long` or `short`, as Pacific Daylight\nTime or PDT, `longOffset` or `shortOffset`, as GMT-07:00 or GMT-7, or\n`longGeneric` or `shortGeneric`, as Pacific Time or PT.",
70986
71567
  "fieldName": "timeZoneName"
70987
71568
  },
70988
71569
  {
@@ -111043,6 +111624,10 @@
111043
111624
  "description": "Format Date's `era`, forwarded for a time drawn as fields. An elapsed time draws none.",
111044
111625
  "name": "time-era"
111045
111626
  },
111627
+ {
111628
+ "description": "Format Date's `fractional-second`, forwarded for a time drawn as fields. An elapsed time draws none.",
111629
+ "name": "time-fractional-second"
111630
+ },
111046
111631
  {
111047
111632
  "description": "Format Date's `hour`, forwarded for a time drawn as fields. An elapsed time draws none.",
111048
111633
  "name": "time-hour"
@@ -139996,7 +140581,7 @@
139996
140581
  "declarations": [
139997
140582
  {
139998
140583
  "kind": "class",
139999
- "description": "Renders a native `<input type=\"range\">`, so the drag, the arrow keys, Home,\nEnd, the page keys, and the touch target come from the platform. A native\nrange has a hit area larger than its thumb, sized for a finger.\n\nThe value is a string, like every other form control's, and\n`MixinControllerValue` holds text. Use `valueAsNumber` for arithmetic.\n\nMarks are drawn by the component. The ticks of a `<datalist>` cannot be\nstyled, and Firefox does not render them for a range. Marks are decoration.\n`step` sets where the value can land, and the input enforces it whether or\nnot marks are drawn. `markers` is a count, so a slider from zero to a hundred\ndoes not draw a hundred and one marks by accident.\n\nA range with two thumbs is two inputs stacked on one track, because there is\nno native two-thumb range. Each thumb keeps its own value, and a named range\nsubmits one entry per thumb under its name, the lowest first. A range given\nmore than two values, such as `default-value=\"20,50,80\"`, has a thumb for\neach, as React Aria's slider takes any number of thumbs: each stops at its\nneighbors, and the ones between the first and the last are named by\n`thumb-label`.\n`min-steps-between-thumbs` keeps them that many steps apart, and the readout\njoins the two as `range-text` writes them.\n\n`origin` sets where a single thumb's fill starts: at `min`, at the middle of\nthe track, or at `max`. A balance or an offset from zero fills from the\nmiddle, as Zag's slider `origin` does. The fill's ends are published as\n`--slider-from` and `--slider-to`.\n\n`format-options` writes the value with `Intl.NumberFormat` in `locale`, as a\ncurrency, a percent or a unit, and `formatter` writes it with a function of\nyour own, such as words for a scale. Either one is what a screen reader\nhears, what the readout shows and what the marker labels say. `value-text`\nstill wraps it in a sentence, with the formatted value in its place.\n\n`required` comes with the field mixin and cannot fail. A range is never\nempty: the platform shows its midpoint when no value is set, and `willUpdate`\nseeds that midpoint into `defaultValue`, so the value matches the handle from\nthe first render. HTML does not apply `required` to a range either, so it is\nnot set on the input. It only adds the marker beside the label.\n\n**Keyboard.** Each thumb is one tab stop, and its keys are the native\nrange's.\n\n| Key | What it does |\n|---|---|\n| Right, Up | Moves the thumb up by `step`. |\n| Left, Down | Moves the thumb down by `step`. |\n| Page Up, Page Down | Moves the thumb by a larger step. |\n| Home, End | Moves the thumb to its lowest or highest value. |\n\nUnder `readonly` none of these move the thumb, and Tab still reaches it.\n\nEach thumb is an `<input type=\"range\">` with `aria-valuetext` where the value\nis formatted or worded. A range's thumbs say they stop at each other with\n`aria-valuemin` and `aria-valuemax`.",
140584
+ "description": "Renders a native `<input type=\"range\">`, so the drag, the arrow keys, Home,\nEnd, the page keys, and the touch target come from the platform. A native\nrange has a hit area larger than its thumb, sized for a finger.\n\nThe value is a string, like every other form control's, and\n`MixinControllerValue` holds text. Use `valueAsNumber` for arithmetic.\n\nMarks are drawn by the component. The ticks of a `<datalist>` cannot be\nstyled, and Firefox does not render them for a range. Marks are decoration.\n`step` sets where the value can land, and the input enforces it whether or\nnot marks are drawn. `markers` is a count, so a slider from zero to a hundred\ndoes not draw a hundred and one marks by accident.\n\nA range with two thumbs is two inputs stacked on one track, because there is\nno native two-thumb range. Each thumb keeps its own value, and a named range\nsubmits one entry per thumb under its name, the lowest first. A range given\nmore than two values, such as `default-value=\"20,50,80\"`, has a thumb for\neach, as React Aria's slider takes any number of thumbs: each stops at its\nneighbors, and the ones between the first and the last are named by\n`thumb-label`.\n`min-steps-between-thumbs` keeps them that many steps apart, and the readout\njoins the two as `range-text` writes them.\n\nA press on a range's track takes the nearest thumb to the point pressed,\nand moving the pointer drags it, as React Aria's and Web Awesome's sliders\ndo. The thumb takes focus, and `change` is sent as the press ends.\n\n`origin` sets where a single thumb's fill starts: at `min`, at the middle of\nthe track, or at `max`. A balance or an offset from zero fills from the\nmiddle, as Zag's slider `origin` does. The fill's ends are published as\n`--slider-from` and `--slider-to`.\n\n`format-options` writes the value with `Intl.NumberFormat` in `locale`, as a\ncurrency, a percent or a unit, and `formatter` writes it with a function of\nyour own, such as words for a scale. Either one is what a screen reader\nhears, what the readout shows and what the marker labels say. `value-text`\nstill wraps it in a sentence, with the formatted value in its place.\n\n`required` comes with the field mixin and cannot fail. A range is never\nempty: the platform shows its midpoint when no value is set, and `willUpdate`\nseeds that midpoint into `defaultValue`, so the value matches the handle from\nthe first render. HTML does not apply `required` to a range either, so it is\nnot set on the input. It only adds the marker beside the label.\n\n**Keyboard.** Each thumb is one tab stop, and its keys are the native\nrange's.\n\n| Key | What it does |\n|---|---|\n| Right, Up | Moves the thumb up by `step`. |\n| Left, Down | Moves the thumb down by `step`. |\n| Page Up, Page Down | Moves the thumb by `page-step`, or by the platform's larger step where it is not set. |\n| Home, End | Moves the thumb to its lowest or highest value. |\n\nUnder `readonly` none of these move the thumb, and Tab still reaches it.\n\nEach thumb is an `<input type=\"range\">` with `aria-valuetext` where the value\nis formatted or worded. A range's thumbs say they stop at each other with\n`aria-valuemin` and `aria-valuemax`.",
140000
140585
  "name": "HelixHeadlessSlider",
140001
140586
  "cssProperties": [
140002
140587
  {
@@ -140253,6 +140838,15 @@
140253
140838
  "attribute": "origin",
140254
140839
  "reflects": true
140255
140840
  },
140841
+ {
140842
+ "kind": "field",
140843
+ "name": "pageStep",
140844
+ "type": {
140845
+ "text": "number | undefined"
140846
+ },
140847
+ "description": "How far Page Up and Page Down move a thumb, in the slider's own units, as\nReact Aria's `pageSize` and Zag's `largeStep` do. Absent leaves the keys\nto the platform, which moves a tenth of the track.",
140848
+ "attribute": "page-step"
140849
+ },
140256
140850
  {
140257
140851
  "kind": "field",
140258
140852
  "name": "range",
@@ -140434,6 +141028,115 @@
140434
141028
  "privacy": "private",
140435
141029
  "readonly": true
140436
141030
  },
141031
+ {
141032
+ "kind": "field",
141033
+ "name": "dragging",
141034
+ "type": {
141035
+ "text": "boolean"
141036
+ },
141037
+ "privacy": "private",
141038
+ "default": "false",
141039
+ "description": "Whether a pointer is dragging a thumb, which `:state(dragging)` says."
141040
+ },
141041
+ {
141042
+ "kind": "field",
141043
+ "name": "endDrag",
141044
+ "privacy": "private",
141045
+ "readonly": true,
141046
+ "description": "Ends a drag when its pointer lifts, wherever it lifts."
141047
+ },
141048
+ {
141049
+ "kind": "method",
141050
+ "name": "startDrag",
141051
+ "privacy": "private",
141052
+ "return": {
141053
+ "type": {
141054
+ "text": "void"
141055
+ }
141056
+ }
141057
+ },
141058
+ {
141059
+ "kind": "method",
141060
+ "name": "thumbInset",
141061
+ "privacy": "private",
141062
+ "return": {
141063
+ "type": {
141064
+ "text": "number"
141065
+ }
141066
+ },
141067
+ "parameters": [
141068
+ {
141069
+ "name": "field",
141070
+ "type": {
141071
+ "text": "HTMLElement"
141072
+ }
141073
+ }
141074
+ ],
141075
+ "description": "Half a thumb, which is where the thumb's center stops short of each end\nof its input. Measured off the thumb's length as the stylesheet sets it,\nor a platform thumb's 16 pixels where none does."
141076
+ },
141077
+ {
141078
+ "kind": "method",
141079
+ "name": "valueAt",
141080
+ "privacy": "private",
141081
+ "return": {
141082
+ "type": {
141083
+ "text": "number"
141084
+ }
141085
+ },
141086
+ "parameters": [
141087
+ {
141088
+ "name": "event",
141089
+ "type": {
141090
+ "text": "PointerEvent"
141091
+ }
141092
+ },
141093
+ {
141094
+ "name": "input",
141095
+ "type": {
141096
+ "text": "HTMLElement"
141097
+ }
141098
+ },
141099
+ {
141100
+ "name": "inset",
141101
+ "type": {
141102
+ "text": "number"
141103
+ }
141104
+ }
141105
+ ],
141106
+ "description": "The value under a pointer, along a thumb's input, less `inset` at each\nend. Upward on a vertical track, and from the right on a right-to-left\npage."
141107
+ },
141108
+ {
141109
+ "kind": "method",
141110
+ "name": "moveThumb",
141111
+ "privacy": "private",
141112
+ "return": {
141113
+ "type": {
141114
+ "text": "boolean"
141115
+ }
141116
+ },
141117
+ "parameters": [
141118
+ {
141119
+ "name": "at",
141120
+ "type": {
141121
+ "text": "number"
141122
+ }
141123
+ },
141124
+ {
141125
+ "name": "wanted",
141126
+ "type": {
141127
+ "text": "number"
141128
+ }
141129
+ }
141130
+ ],
141131
+ "description": "Moves one of a range's thumbs, kept between its neighbors, and says whether it moved."
141132
+ },
141133
+ {
141134
+ "kind": "field",
141135
+ "name": "handlePress",
141136
+ "privacy": "private",
141137
+ "readonly": true,
141138
+ "description": "A press on the field: on a thumb, the start of the platform's own drag,\nand on a range's track, the nearest thumb taken to the point and dragged\nfrom there.\n\n**A range's inputs take presses on their thumbs only**, being stacked on\none track, so a press beside a thumb reached no input at all and did\nnothing. Measured before this: a press at 90 on a range holding 20 and 60\nleft it at 20 and 60. React Aria's and Web Awesome's sliders move the\nnearest thumb there."
141139
+ },
140437
141140
  {
140438
141141
  "kind": "field",
140439
141142
  "name": "handleChange",
@@ -140446,7 +141149,14 @@
140446
141149
  "name": "handleKeydown",
140447
141150
  "privacy": "private",
140448
141151
  "readonly": true,
140449
- "description": "Keeps a read-only thumb still under the keys that move it. Tab and every\nother key pass, so focus moves on."
141152
+ "description": "Keeps a read-only thumb still under the keys that move it, and moves a\nthumb by `page-step` under Page Up and Page Down. Tab and every other key\npass, so focus moves on."
141153
+ },
141154
+ {
141155
+ "kind": "field",
141156
+ "name": "handleFocusChange",
141157
+ "privacy": "private",
141158
+ "readonly": true,
141159
+ "description": "Says whether the keyboard brought focus to a thumb, as\n`:state(focus-visible)` on the host, where a stylesheet outside can reach\nthe whole control: a ring around the track, or the readout in bold."
140450
141160
  },
140451
141161
  {
140452
141162
  "kind": "method",
@@ -142061,6 +142771,14 @@
142061
142771
  "description": "Where a single thumb's fill starts: `start` at `min`, `center` at the\nmiddle of the track, or `end` at `max`. Absent is `start`. A range fills\nbetween its thumbs and ignores it.",
142062
142772
  "fieldName": "origin"
142063
142773
  },
142774
+ {
142775
+ "name": "page-step",
142776
+ "type": {
142777
+ "text": "number | undefined"
142778
+ },
142779
+ "description": "How far Page Up and Page Down move a thumb, in the slider's own units, as\nReact Aria's `pageSize` and Zag's `largeStep` do. Absent leaves the keys\nto the platform, which moves a tenth of the track.",
142780
+ "fieldName": "pageStep"
142781
+ },
142064
142782
  {
142065
142783
  "name": "range",
142066
142784
  "type": {
@@ -142263,6 +142981,14 @@
142263
142981
  }
142264
142982
  ],
142265
142983
  "cssStates": [
142984
+ {
142985
+ "description": "A thumb is being dragged, by its thumb or from a press on the track.",
142986
+ "name": "dragging"
142987
+ },
142988
+ {
142989
+ "description": "A thumb has focus that the keyboard brought, where the browser draws a focus ring.",
142990
+ "name": "focus-visible"
142991
+ },
142266
142992
  {
142267
142993
  "description": "The slider has an error to show, from the browser's validation or from your `feedback`.",
142268
142994
  "name": "invalid"
@@ -162438,9 +163164,13 @@
162438
163164
  "declarations": [
162439
163165
  {
162440
163166
  "kind": "class",
162441
- "description": "The list is a `TimePicker`, which you can also use on its own, for example in\na settings pane. This element adds the field, the overlay, and the form\nassociation, the same arrangement Date Input has with `DatePicker` and Color\nInput has with `ColorPicker`.\n\nYou can type a time or pick one. The list offers times at a step, and the\nfield lets you enter any time, such as `09:07`.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`, because that is what the form\nsubmits, what `min` and `max` compare against, and what sorts correctly as a\nstring. While idle, the field shows the time in the user's locale format.\nOnce the caret is in the field, it shows the value itself, because a\nformatted time such as `2:30 PM` cannot be typed back and `Intl` has no\nparser for it.\n\nTyping sends `input` on each keystroke and `change` when you leave the\nfield. The trigger and ArrowDown open the list, and so does a press into the\nfield; Tab into the field opens nothing. In the list, the arrow keys, typed digits and PageUp and PageDown\nmove through the times, and Enter, Space or a click chooses one and closes\nthe panel. With `variant=\"wheels\"` each wheel moves the time as you turn it,\nthe panel stays open, and Enter or Escape closes it.\n\nWith `segmented`, the field is a row of segments in place of the text: an\nhour, a minute, and AM or PM where the clock has them, each set with digits\nor the arrow keys. Alt+Down opens the list from a segment.\n\nText that is not a time gives the form an empty value, as a native time\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the list on the chosen time. |\n| Alt with Down | Opens the list, from the text field or a segment. |\n| Enter | In the text field, takes the typed time and submits the form, as a native field does. In the list, chooses the highlighted time. |\n| Escape | Closes the list and puts focus back in the field. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: two hours, or fifteen minutes or seconds. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| A letter on the half of the day | Picks the half whose name starts with it, such as A for AM. |\n| Backspace, Delete on a segment | Empty the segment. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the list, the keys are `TimePicker`'s.",
163167
+ "description": "The list is a `TimePicker`, which you can also use on its own, for example in\na settings pane. This element adds the field, the overlay, and the form\nassociation, the same arrangement Date Input has with `DatePicker` and Color\nInput has with `ColorPicker`.\n\nYou can type a time or pick one. The list offers times at a step, and the\nfield lets you enter any time, such as `09:07`.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`, because that is what the form\nsubmits, what `min` and `max` compare against, and what sorts correctly as a\nstring. While idle, the field shows the time in the user's locale format.\nOnce the caret is in the field, it shows the value itself. You can type\n`14:30`, or a time as you write one, such as `2:30 PM`, `2.30pm`, or\n`14h30`, and the field reads it as you leave it, with AM and PM in the\nlocale's words.\n\nTyping sends `input` on each keystroke and `change` when you leave the\nfield. The trigger and ArrowDown open the list, and so does a press into the\nfield; Tab into the field opens nothing. The text field is a `combobox`\nwith `aria-haspopup=\"dialog\"`, `aria-expanded`, and `aria-controls`, since\nDown opens the list from it. In the list, the arrow keys, typed digits and PageUp and PageDown\nmove through the times, and Enter, Space or a click chooses one and closes\nthe panel. With `variant=\"wheels\"` each wheel moves the time as you turn it,\nthe panel stays open, and Enter or Escape closes it.\n\nWith `segmented`, the field is a row of segments in place of the text: an\nhour, a minute, and AM or PM where the clock has them, each set with digits\nor the arrow keys. Alt+Down opens the list from a segment. A `range` is two\nrows with a dash between them, the start and the end, and `multiple` keeps\nthe text.\n\nText that is not a time gives the form an empty value, as a native time\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the list on the chosen time. |\n| Alt with Down | Opens the list, from the text field or a segment. |\n| Enter | In the text field, takes the typed time and submits the form, as a native field does. In the list, chooses the highlighted time. |\n| Escape | Closes the list and puts focus back in the field. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: two hours, or fifteen minutes or seconds. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| A letter on the half of the day | Picks the half whose name starts with it, such as A for AM. |\n| Backspace, Delete on a segment | Empty the segment. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the list, the keys are `TimePicker`'s.",
162442
163168
  "name": "HelixHeadlessTimeInput",
162443
163169
  "cssParts": [
163170
+ {
163171
+ "description": "The button that empties the field, under `clearable`, while it holds a time.",
163172
+ "name": "clear"
163173
+ },
162444
163174
  {
162445
163175
  "description": "The text input.",
162446
163176
  "name": "control"
@@ -162621,6 +163351,10 @@
162621
163351
  "description": "The label and the caption, as one column.",
162622
163352
  "name": "picker-option-text"
162623
163353
  },
163354
+ {
163355
+ "description": "The dash between a range's two rows of segments, in `segmented`, beside `literal`.",
163356
+ "name": "range-separator"
163357
+ },
162624
163358
  {
162625
163359
  "description": "The count of times held beyond the ones shown. A `<button>` with `expandable`, and a `<span>` without it.",
162626
163360
  "name": "rest"
@@ -162683,6 +163417,10 @@
162683
163417
  }
162684
163418
  ],
162685
163419
  "slots": [
163420
+ {
163421
+ "description": "Replaces the cross on the clear button, under `clearable`.",
163422
+ "name": "clear-icon"
163423
+ },
162686
163424
  {
162687
163425
  "description": "Content after the time, before the trigger, such as a clear button.",
162688
163426
  "name": "end"
@@ -162748,6 +163486,29 @@
162748
163486
  "description": "What the browser may autofill here, as one of the platform's own tokens.\n\nEmpty leaves the attribute off, which is the browser's default and is what\nlets autofill work at all.",
162749
163487
  "attribute": "autocomplete"
162750
163488
  },
163489
+ {
163490
+ "kind": "field",
163491
+ "name": "clearable",
163492
+ "type": {
163493
+ "text": "boolean"
163494
+ },
163495
+ "default": "false",
163496
+ "description": "Whether the field shows a button that empties it, as Input's `clearable`\ndoes. Shown only while the field holds something to clear and is neither\ndisabled nor read-only.",
163497
+ "attribute": "clearable"
163498
+ },
163499
+ {
163500
+ "kind": "field",
163501
+ "name": "clearLabel",
163502
+ "type": {
163503
+ "text": "string"
163504
+ },
163505
+ "default": "'Clear'",
163506
+ "description": "The accessible name of the clear button, which shows only an icon.",
163507
+ "attribute": "clear-label",
163508
+ "helix": {
163509
+ "words": true
163510
+ }
163511
+ },
162751
163512
  {
162752
163513
  "kind": "field",
162753
163514
  "name": "announcesInput",
@@ -162953,6 +163714,19 @@
162953
163714
  "words": true
162954
163715
  }
162955
163716
  },
163717
+ {
163718
+ "kind": "field",
163719
+ "name": "unreadableMessage",
163720
+ "type": {
163721
+ "text": "string"
163722
+ },
163723
+ "default": "'{mode, select, single {Enter a time as {shape}.} other {Enter times as {shape}, separated by commas.}}'",
163724
+ "description": "The message for text that is no time, where `bad-input-message` is not\nset. `{mode}` is `single`, `range`, or `multiple`, and `{shape}` is `HH:mm`, or `HH:mm:ss` with `seconds`.",
163725
+ "attribute": "unreadable-message",
163726
+ "helix": {
163727
+ "words": true
163728
+ }
163729
+ },
162956
163730
  {
162957
163731
  "kind": "field",
162958
163732
  "name": "held",
@@ -162970,7 +163744,21 @@
162970
163744
  "text": "boolean"
162971
163745
  },
162972
163746
  "privacy": "protected",
162973
- "description": "Segments hold one time, so `range` and `multiple` keep the line of text,\nwhose separators and tags are how those modes write several.",
163747
+ "description": "A row of segments holds one time, and `range` takes two rows with a dash\nbetween them, as React Aria's range fields do. `multiple` keeps the line\nof text, whose tags are how it writes several.",
163748
+ "readonly": true,
163749
+ "inheritedFrom": {
163750
+ "name": "MixinSegmentedField",
163751
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
163752
+ }
163753
+ },
163754
+ {
163755
+ "kind": "field",
163756
+ "name": "segmentGroups",
163757
+ "type": {
163758
+ "text": "number"
163759
+ },
163760
+ "privacy": "protected",
163761
+ "description": "How many rows of segments the value takes: two for a range, one otherwise.",
162974
163762
  "readonly": true,
162975
163763
  "inheritedFrom": {
162976
163764
  "name": "MixinSegmentedField",
@@ -163101,6 +163889,32 @@
163101
163889
  "description": "How many are held beyond the ones shown.",
163102
163890
  "readonly": true
163103
163891
  },
163892
+ {
163893
+ "kind": "method",
163894
+ "name": "read",
163895
+ "privacy": "private",
163896
+ "return": {
163897
+ "type": {
163898
+ "text": "string"
163899
+ }
163900
+ },
163901
+ "parameters": [
163902
+ {
163903
+ "name": "text",
163904
+ "type": {
163905
+ "text": "string"
163906
+ }
163907
+ }
163908
+ ],
163909
+ "description": "A time as the reader wrote it, as the value writes one: `HH:mm` as it\nis, and `2:30 PM`, `2.30pm`, `14h30`, or `1430` read back, with the half\nof the day in the locale's words. Empty where it is no time."
163910
+ },
163911
+ {
163912
+ "kind": "field",
163913
+ "name": "handleTextCommit",
163914
+ "privacy": "private",
163915
+ "readonly": true,
163916
+ "description": "The text the reader leaves, read: a time written as a reader writes one\nbecomes the value as the field commits. Not on each key, where `2:3` is\na time a moment before it is `2:30`."
163917
+ },
163104
163918
  {
163105
163919
  "kind": "field",
163106
163920
  "name": "handleDraftKey",
@@ -163224,6 +164038,34 @@
163224
164038
  },
163225
164039
  "description": "The mark on the button that opens the clock, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding.\n\n**A named import rather than `<helix-headless-icon>`**, on three counts.\n`Icon` indexes the whole icon map at runtime, `icons[this.name]`, and no\nbundler can shake a runtime lookup, so every consumer of any component that\nrenders one ships all 50kB of path data; a named import ships one path. The\nimport is checked when the package compiles, where a `name` string is\nchecked only by a later name lookup. And `Icon` is not registered on the\nheadless tier at all, which registers `helix-headless-icon`, so a headless\nconsumer gets an inert unknown element and no mark whatsoever."
163226
164040
  },
164041
+ {
164042
+ "kind": "field",
164043
+ "name": "showsClear",
164044
+ "type": {
164045
+ "text": "boolean"
164046
+ },
164047
+ "privacy": "private",
164048
+ "description": "Whether there is a clear button on screen right now.",
164049
+ "readonly": true
164050
+ },
164051
+ {
164052
+ "kind": "field",
164053
+ "name": "handleClear",
164054
+ "privacy": "private",
164055
+ "readonly": true,
164056
+ "description": "Empties the field, through `requestValue` so a consumer who owns the\nvalue decides, then says `change` and `helix-clear` and puts focus back\nin the field, the button having gone."
164057
+ },
164058
+ {
164059
+ "kind": "method",
164060
+ "name": "renderClearIcon",
164061
+ "privacy": "protected",
164062
+ "return": {
164063
+ "type": {
164064
+ "text": "TemplateResult"
164065
+ }
164066
+ },
164067
+ "description": "The cross on the clear button, behind a seam a tier can move."
164068
+ },
163227
164069
  {
163228
164070
  "kind": "method",
163229
164071
  "name": "renderControl",
@@ -163302,6 +164144,40 @@
163302
164144
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
163303
164145
  }
163304
164146
  },
164147
+ {
164148
+ "kind": "field",
164149
+ "name": "rangeEndLabel",
164150
+ "type": {
164151
+ "text": "string"
164152
+ },
164153
+ "default": "'End'",
164154
+ "description": "What a screen reader hears before the segments of a range's second date\nor time, after each segment's own name.",
164155
+ "attribute": "range-end-label",
164156
+ "helix": {
164157
+ "words": true
164158
+ },
164159
+ "inheritedFrom": {
164160
+ "name": "MixinSegmentedField",
164161
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
164162
+ }
164163
+ },
164164
+ {
164165
+ "kind": "field",
164166
+ "name": "rangeStartLabel",
164167
+ "type": {
164168
+ "text": "string"
164169
+ },
164170
+ "default": "'Start'",
164171
+ "description": "What a screen reader hears before the segments of a range's first date\nor time, after each segment's own name: \"month, Start, Stay\".",
164172
+ "attribute": "range-start-label",
164173
+ "helix": {
164174
+ "words": true
164175
+ },
164176
+ "inheritedFrom": {
164177
+ "name": "MixinSegmentedField",
164178
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
164179
+ }
164180
+ },
163305
164181
  {
163306
164182
  "kind": "field",
163307
164183
  "name": "segmented",
@@ -163320,11 +164196,11 @@
163320
164196
  "kind": "field",
163321
164197
  "name": "parts",
163322
164198
  "type": {
163323
- "text": "Segments"
164199
+ "text": "Segments[]"
163324
164200
  },
163325
164201
  "privacy": "private",
163326
- "default": "{}",
163327
- "description": "The parts set so far, which may be fewer than a whole value.",
164202
+ "default": "[{}]",
164203
+ "description": "The parts set so far in each row, which may be fewer than a whole\nvalue: one row, or two for a range.",
163328
164204
  "inheritedFrom": {
163329
164205
  "name": "MixinSegmentedField",
163330
164206
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
@@ -163383,6 +164259,35 @@
163383
164259
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
163384
164260
  }
163385
164261
  },
164262
+ {
164263
+ "kind": "field",
164264
+ "name": "opener",
164265
+ "type": {
164266
+ "text": "HTMLElement | undefined"
164267
+ },
164268
+ "privacy": "private",
164269
+ "default": "undefined",
164270
+ "description": "The segment Alt+Down opened the picker from, which focus goes back to.",
164271
+ "inheritedFrom": {
164272
+ "name": "MixinSegmentedField",
164273
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
164274
+ }
164275
+ },
164276
+ {
164277
+ "kind": "method",
164278
+ "name": "returnFocus",
164279
+ "privacy": "protected",
164280
+ "return": {
164281
+ "type": {
164282
+ "text": "void"
164283
+ }
164284
+ },
164285
+ "description": "Puts focus back on the segment the picker was opened from, as the\ntrigger takes it back to the field. Measured before this: Escape after\nAlt+Down on AM/PM put focus on the hour.",
164286
+ "inheritedFrom": {
164287
+ "name": "MixinPickerField",
164288
+ "module": "src/mixins/mixin-picker-field/mixin-picker-field.ts"
164289
+ }
164290
+ },
163386
164291
  {
163387
164292
  "kind": "field",
163388
164293
  "name": "segmentsShown",
@@ -163397,6 +164302,66 @@
163397
164302
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
163398
164303
  }
163399
164304
  },
164305
+ {
164306
+ "kind": "method",
164307
+ "name": "joined",
164308
+ "privacy": "private",
164309
+ "return": {
164310
+ "type": {
164311
+ "text": "string"
164312
+ }
164313
+ },
164314
+ "parameters": [
164315
+ {
164316
+ "name": "rows",
164317
+ "type": {
164318
+ "text": "readonly Segments[]"
164319
+ }
164320
+ }
164321
+ ],
164322
+ "description": "The value the rows add up to: each row's, joined by commas, or empty while any row is not whole.",
164323
+ "inheritedFrom": {
164324
+ "name": "MixinSegmentedField",
164325
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
164326
+ }
164327
+ },
164328
+ {
164329
+ "kind": "method",
164330
+ "name": "rowsOf",
164331
+ "privacy": "private",
164332
+ "return": {
164333
+ "type": {
164334
+ "text": "Segments[]"
164335
+ }
164336
+ },
164337
+ "parameters": [
164338
+ {
164339
+ "name": "value",
164340
+ "type": {
164341
+ "text": "string"
164342
+ }
164343
+ }
164344
+ ],
164345
+ "description": "The rows a value names, one per row, empty where it names none.",
164346
+ "inheritedFrom": {
164347
+ "name": "MixinSegmentedField",
164348
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
164349
+ }
164350
+ },
164351
+ {
164352
+ "kind": "field",
164353
+ "name": "segmentSystem",
164354
+ "type": {
164355
+ "text": "MonthSystem | undefined"
164356
+ },
164357
+ "privacy": "protected",
164358
+ "description": "The calendar a date's parts are counted in, or `undefined` for the Gregorian calendar.",
164359
+ "readonly": true,
164360
+ "inheritedFrom": {
164361
+ "name": "MixinSegmentedField",
164362
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
164363
+ }
164364
+ },
163400
164365
  {
163401
164366
  "kind": "field",
163402
164367
  "name": "layout",
@@ -163462,6 +164427,12 @@
163462
164427
  }
163463
164428
  },
163464
164429
  "parameters": [
164430
+ {
164431
+ "name": "row",
164432
+ "type": {
164433
+ "text": "number"
164434
+ }
164435
+ },
163465
164436
  {
163466
164437
  "name": "next",
163467
164438
  "type": {
@@ -163922,21 +164893,6 @@
163922
164893
  "module": "src/mixins/mixin-picker-field/mixin-picker-field.ts"
163923
164894
  }
163924
164895
  },
163925
- {
163926
- "kind": "method",
163927
- "name": "returnFocus",
163928
- "privacy": "protected",
163929
- "return": {
163930
- "type": {
163931
- "text": "void"
163932
- }
163933
- },
163934
- "description": "Puts the caret back in the field without the field reopening the panel.\n\nThe anchor rather than the text, which is the trigger where there is no\ntext: Color Input's swatch dropped focus to the body on Escape.",
163935
- "inheritedFrom": {
163936
- "name": "MixinPickerField",
163937
- "module": "src/mixins/mixin-picker-field/mixin-picker-field.ts"
163938
- }
163939
- },
163940
164896
  {
163941
164897
  "kind": "method",
163942
164898
  "name": "focus",
@@ -165595,6 +166551,14 @@
165595
166551
  "name": "helix-before-open",
165596
166552
  "reactProp": "onhelix-before-open"
165597
166553
  },
166554
+ {
166555
+ "type": {
166556
+ "text": "HelixClearEvent"
166557
+ },
166558
+ "description": "Fired after the clear button has emptied the field, after `input` and `change`.",
166559
+ "name": "helix-clear",
166560
+ "reactProp": "onhelix-clear"
166561
+ },
165598
166562
  {
165599
166563
  "type": {
165600
166564
  "text": "Event"
@@ -165626,6 +166590,24 @@
165626
166590
  "description": "What the browser may autofill here, as one of the platform's own tokens.\n\nEmpty leaves the attribute off, which is the browser's default and is what\nlets autofill work at all.",
165627
166591
  "fieldName": "autocomplete"
165628
166592
  },
166593
+ {
166594
+ "name": "clearable",
166595
+ "type": {
166596
+ "text": "boolean"
166597
+ },
166598
+ "default": "false",
166599
+ "description": "Whether the field shows a button that empties it, as Input's `clearable`\ndoes. Shown only while the field holds something to clear and is neither\ndisabled nor read-only.",
166600
+ "fieldName": "clearable"
166601
+ },
166602
+ {
166603
+ "name": "clear-label",
166604
+ "type": {
166605
+ "text": "string"
166606
+ },
166607
+ "default": "'Clear'",
166608
+ "description": "The accessible name of the clear button, which shows only an icon.",
166609
+ "fieldName": "clearLabel"
166610
+ },
165629
166611
  {
165630
166612
  "name": "disable-times",
165631
166613
  "type": {
@@ -165768,6 +166750,15 @@
165768
166750
  "description": "The message shown when `disable-times` bars a time.",
165769
166751
  "fieldName": "unavailableMessage"
165770
166752
  },
166753
+ {
166754
+ "name": "unreadable-message",
166755
+ "type": {
166756
+ "text": "string"
166757
+ },
166758
+ "default": "'{mode, select, single {Enter a time as {shape}.} other {Enter times as {shape}, separated by commas.}}'",
166759
+ "description": "The message for text that is no time, where `bad-input-message` is not\nset. `{mode}` is `single`, `range`, or `multiple`, and `{shape}` is `HH:mm`, or `HH:mm:ss` with `seconds`.",
166760
+ "fieldName": "unreadableMessage"
166761
+ },
165771
166762
  {
165772
166763
  "name": "variant",
165773
166764
  "type": {
@@ -165815,6 +166806,32 @@
165815
166806
  "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
165816
166807
  }
165817
166808
  },
166809
+ {
166810
+ "name": "range-end-label",
166811
+ "type": {
166812
+ "text": "string"
166813
+ },
166814
+ "default": "'End'",
166815
+ "description": "What a screen reader hears before the segments of a range's second date\nor time, after each segment's own name.",
166816
+ "fieldName": "rangeEndLabel",
166817
+ "inheritedFrom": {
166818
+ "name": "MixinSegmentedField",
166819
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
166820
+ }
166821
+ },
166822
+ {
166823
+ "name": "range-start-label",
166824
+ "type": {
166825
+ "text": "string"
166826
+ },
166827
+ "default": "'Start'",
166828
+ "description": "What a screen reader hears before the segments of a range's first date\nor time, after each segment's own name: \"month, Start, Stay\".",
166829
+ "fieldName": "rangeStartLabel",
166830
+ "inheritedFrom": {
166831
+ "name": "MixinSegmentedField",
166832
+ "module": "src/mixins/mixin-segmented-field/mixin-segmented-field.ts"
166833
+ }
166834
+ },
165818
166835
  {
165819
166836
  "name": "segmented",
165820
166837
  "type": {
@@ -166073,6 +167090,10 @@
166073
167090
  }
166074
167091
  ],
166075
167092
  "cssStates": [
167093
+ {
167094
+ "description": "The field holds no time.",
167095
+ "name": "blank"
167096
+ },
166076
167097
  {
166077
167098
  "description": "The control has an error to show, from the browser's validation or from your `feedback`.",
166078
167099
  "name": "invalid"
@@ -166195,7 +167216,7 @@
166195
167216
  "declarations": [
166196
167217
  {
166197
167218
  "kind": "class",
166198
- "description": "Shows the times at each `step` as a `Listbox`, which provides the keyboard\nbehavior, typeahead, scrolling into view, and announcements for a set of\noptions. `variant=\"wheels\"` shows a column each for the hour, the minute, and\nthe meridiem, and one for the second with `seconds`. Left and Right move\nbetween the wheels, and Tab does too.\n\n`hour-cycle` writes every time on a twelve or a twenty-four hour clock\nwhatever the locale, and `seconds` holds times to the second.\n\nThe step keeps the list usable. At the default of 15 minutes a day is 96\nrows, which people can scroll or type into. At 1 minute it is 1,440. Use the\nlist for the times your product offers, and Time Input for any time, the same\nway Date Input separates typing a date from picking one on the calendar.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`. A form submits that shape,\n`min` and `max` compare against it, and it sorts as a string. Each row's text\nfollows the person's own conventions, from `Intl`.\n\nThe chosen row is marked in the served markup. The listbox gets the answer as\n`.value`, and Lit SSR serializes no property binding, so without more the 96\nserved rows would carry no mark until the listbox upgrades and runs `place`.\nEach option also gets `selected`, an attribute binding that does serialize,\nand `place` then writes the same answer from the same value. This is the same\n`selected` you write on `Option` elsewhere in Helix, and Date Picker marks\nits choice in markup for the same reason. The list and the wheels both do\nthis, because each wheel is also a listbox.\n\n**Keyboard.** The list is one tab stop, and each wheel is one.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous time, or in a wheel to the next or the previous hour, minute, second, or half of the day. |\n| Home, End | Moves to the first or the last time, or the first or the last in a wheel. |\n| Page Down, Page Up | Moves by as many times as the list shows at once. |\n| Digits | Moves to the next time that starts with what you typed, such as `9` for 9:00. |\n| Enter, Space | Chooses the highlighted time. Moving chooses too, except under `manual` or with a `mode`. With a `mode`, Space adds or removes the time. |\n| Right, Left | In the wheels, moves to the next or the previous wheel, mirrored right to left. |\n| Tab | Moves to the next wheel, then out of the picker. |\n\n**ARIA.** The list is a `listbox` named by `label`, a slotted label, the\nhost's `aria-label` or its `aria-labelledby`. A development build warns\nwhere all four are empty. The list is described by the hint, or by the\nmessage in `feedback` in its place, and carries `aria-multiselectable` with\na `mode` and `aria-invalid` while `feedback` says what is wrong. The wheels\nare a `group` with that name, holding one `listbox` per wheel, named \"Hour\",\n\"Minute\", \"Second\" and \"AM/PM\" in the page's language, and each described\nthe same way.",
167219
+ "description": "Shows the times at each `step` as a `Listbox`, which provides the keyboard\nbehavior, typeahead, scrolling into view, and announcements for a set of\noptions. `variant=\"wheels\"` shows a column each for the hour, the minute, and\nthe meridiem, and one for the second with `seconds`. Left and Right move\nbetween the wheels, and Tab does too.\n\n`hour-cycle` writes every time on a twelve or a twenty-four hour clock\nwhatever the locale, and `seconds` holds times to the second.\n\nThe step keeps the list usable. At the default of 15 minutes a day is 96\nrows, which people can scroll or type into. At 1 minute it is 1,440. Use the\nlist for the times your product offers, and Time Input for any time, the same\nway Date Input separates typing a date from picking one on the calendar.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`. A form submits that shape,\n`min` and `max` compare against it, and it sorts as a string. Each row's text\nfollows the person's own conventions, from `Intl`.\n\nThe chosen row is marked in the served markup. The listbox gets the answer as\n`.value`, and Lit SSR serializes no property binding, so without more the 96\nserved rows would carry no mark until the listbox upgrades and runs `place`.\nEach option also gets `selected`, an attribute binding that does serialize,\nand `place` then writes the same answer from the same value. This is the same\n`selected` you write on `Option` elsewhere in Helix, and Date Picker marks\nits choice in markup for the same reason. The list and the wheels both do\nthis, because each wheel is also a listbox.\n\n**Keyboard.** The list is one tab stop, and each wheel is one.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous time, or in a wheel to the next or the previous hour, minute, second, or half of the day. |\n| Home, End | Moves to the first or the last time, or the first or the last in a wheel. |\n| Page Down, Page Up | Moves by as many times as the list shows at once. |\n| Digits | Moves to the next time that starts with what you typed, such as `9` for 9:00. |\n| Enter, Space | Chooses the highlighted time. Moving chooses too, except under `manual` or with a `mode`. With a `mode`, Space adds or removes the time. |\n| Right, Left | In the wheels, moves to the next or the previous wheel, mirrored right to left. |\n| Tab | Moves to the next wheel, then out of the picker. |\n\n**ARIA.** The list is a `listbox` named by `label`, a slotted label, the\nhost's `aria-label` or its `aria-labelledby`. A development build warns\nwhere all four are empty. The list is described by the hint, or by the\nmessage in `feedback` in its place, and carries `aria-multiselectable` with\na `mode`. It carries `aria-invalid` while `feedback` says what is wrong,\nwhile it holds a time outside `min` and `max` or one the picker does not\noffer, and, for a `required` picker with no time, once the reader has\nchosen one or a form has refused the picker. The wheels\nare a `group` with that name, holding one `listbox` per wheel, named \"Hour\",\n\"Minute\", \"Second\" and \"AM/PM\" in the page's language, and each described\nthe same way.",
166199
167220
  "name": "HelixHeadlessTimePicker",
166200
167221
  "cssParts": [
166201
167222
  {
@@ -166319,7 +167340,7 @@
166319
167340
  "name": "list-search-field"
166320
167341
  },
166321
167342
  {
166322
- "description": "One time in the list. It carries `data-between` inside a range.",
167343
+ "description": "One time in the list. It carries `data-between` inside a range, and inside the run to the time under the pointer while a range waits for its second end.",
166323
167344
  "name": "option"
166324
167345
  },
166325
167346
  {
@@ -166722,6 +167743,28 @@
166722
167743
  "readonly": true,
166723
167744
  "description": "Takes what the list announced and constrains it to what the mode allows.\n\nThe listbox is put in `multiple` for both modes, because that is what marks\nmore than one row and toggles on press. A range then differs only in what is\nkept: two, and a third pick starts again from that third one. Working out\nwhich is newest by difference rather than by position, since a toggle can\nremove as easily as add and the announced list is a set rather than a\nsequence."
166724
167745
  },
167746
+ {
167747
+ "kind": "field",
167748
+ "name": "previewed",
167749
+ "type": {
167750
+ "text": "string"
167751
+ },
167752
+ "privacy": "private",
167753
+ "default": "''",
167754
+ "description": "The time under the pointer while a range holds one end, which the list\nbands the range to before it is chosen, as Date Picker does."
167755
+ },
167756
+ {
167757
+ "kind": "field",
167758
+ "name": "handleListHover",
167759
+ "privacy": "private",
167760
+ "readonly": true
167761
+ },
167762
+ {
167763
+ "kind": "field",
167764
+ "name": "handleListLeave",
167765
+ "privacy": "private",
167766
+ "readonly": true
167767
+ },
166725
167768
  {
166726
167769
  "kind": "method",
166727
167770
  "name": "between",
@@ -166739,7 +167782,7 @@
166739
167782
  }
166740
167783
  }
166741
167784
  ],
166742
- "description": "Whether a time falls inside a range, which is what gets banded."
167785
+ "description": "Whether a time falls inside a range, which is what gets banded: the\nchosen range, or while one end waits, the run to the time under the\npointer."
166743
167786
  },
166744
167787
  {
166745
167788
  "kind": "field",
@@ -166956,6 +167999,30 @@
166956
167999
  },
166957
168000
  "description": "Reports \"required and empty\", or clears it.\n\nWritten out rather than taken from `MixinField`, which is where the seven\nform controls get this. That mixin brings a label, a hint and a feedback\nregion with it, and this is a grid rather than a field: it is composed\n*into* the field that has those, so taking the mixin would give one control\ntwo of each. What is shared is five lines, and the anchor is what the\nbrowser points its bubble at."
166958
168001
  },
168002
+ {
168003
+ "kind": "field",
168004
+ "name": "problem",
168005
+ "type": {
168006
+ "text": "[ValidityStateFlags, string] | undefined"
168007
+ },
168008
+ "privacy": "private",
168009
+ "description": "What is wrong with the answer, as validity flags and a message, or nothing.\n`reportRequired` hands it to the form, and `failure` to the mark.",
168010
+ "readonly": true
168011
+ },
168012
+ {
168013
+ "kind": "field",
168014
+ "name": "failure",
168015
+ "type": {
168016
+ "text": "'missing' | 'refused' | undefined"
168017
+ },
168018
+ "privacy": "protected",
168019
+ "description": "A missing time waits for the reader; a refused one is marked at once.",
168020
+ "readonly": true,
168021
+ "inheritedFrom": {
168022
+ "name": "MixinPickerFeedback",
168023
+ "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
168024
+ }
168025
+ },
166959
168026
  {
166960
168027
  "kind": "method",
166961
168028
  "name": "report",
@@ -167226,6 +168293,20 @@
167226
168293
  "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
167227
168294
  }
167228
168295
  },
168296
+ {
168297
+ "kind": "field",
168298
+ "name": "touched",
168299
+ "type": {
168300
+ "text": "boolean"
168301
+ },
168302
+ "privacy": "private",
168303
+ "default": "false",
168304
+ "description": "Whether the reader has committed an answer, or a form has refused the\npicker. A reset forgets it.",
168305
+ "inheritedFrom": {
168306
+ "name": "MixinPickerFeedback",
168307
+ "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
168308
+ }
168309
+ },
167229
168310
  {
167230
168311
  "kind": "field",
167231
168312
  "name": "marked",
@@ -167233,13 +168314,30 @@
167233
168314
  "text": "boolean"
167234
168315
  },
167235
168316
  "privacy": "protected",
167236
- "description": "Whether a reader is told the answer is wrong: `invalid`, or `feedback`.",
168317
+ "description": "Whether a reader is told the answer is wrong: `invalid`, `feedback`, a\nheld answer the picker refuses, or a missing answer once the reader has\ncommitted one or a form has refused the picker.\n\n**A refused answer is marked at once, and a missing one waits**, as\nChromium's tree does for native controls: a time input holding a time\npast its `max` reports invalid on load, and an empty required text field\ndoes not, since the reader already hears that it is required. Measured\nbefore this on Time Picker: `value=\"13:00\" max=\"12:00\"` reported\n`rangeOverflow` while the list said nothing and `:state(invalid)` was off.",
167237
168318
  "readonly": true,
167238
168319
  "inheritedFrom": {
167239
168320
  "name": "MixinPickerFeedback",
167240
168321
  "module": "src/mixins/mixin-picker-feedback/mixin-picker-feedback.ts"
167241
168322
  }
167242
168323
  },
168324
+ {
168325
+ "kind": "method",
168326
+ "name": "formResetCallback",
168327
+ "return": {
168328
+ "type": {
168329
+ "text": "void"
168330
+ }
168331
+ },
168332
+ "description": "Returns the control to its `defaultValue`, or to its `value` attribute\nwhere there is no `default-value`.\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.",
168333
+ "inheritedFrom": {
168334
+ "name": "HelixFormElement",
168335
+ "module": "src/helix-form-element/helix-form-element.ts"
168336
+ },
168337
+ "type": {
168338
+ "text": "formResetCallback() => void"
168339
+ }
168340
+ },
167243
168341
  {
167244
168342
  "kind": "method",
167245
168343
  "name": "renderPickerFeedback",
@@ -167340,23 +168438,6 @@
167340
168438
  "module": "src/mixins/mixin-controller-value/mixin-controller-value.ts"
167341
168439
  }
167342
168440
  },
167343
- {
167344
- "kind": "method",
167345
- "name": "formResetCallback",
167346
- "return": {
167347
- "type": {
167348
- "text": "void"
167349
- }
167350
- },
167351
- "description": "Returns the control to its `defaultValue`, or to its `value` attribute\nwhere there is no `default-value`.\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.",
167352
- "inheritedFrom": {
167353
- "name": "HelixFormElement",
167354
- "module": "src/helix-form-element/helix-form-element.ts"
167355
- },
167356
- "type": {
167357
- "text": "formResetCallback() => void"
167358
- }
167359
- },
167360
168441
  {
167361
168442
  "kind": "method",
167362
168443
  "name": "formStateRestoreCallback",
@@ -168472,9 +169553,13 @@
168472
169553
  "name": "blank"
168473
169554
  },
168474
169555
  {
168475
- "description": "While `invalid` is set or `feedback` says what is wrong.",
169556
+ "description": "While `invalid` is set, `feedback` says what is wrong, or the list carries `aria-invalid`.",
168476
169557
  "name": "invalid"
168477
169558
  },
169559
+ {
169560
+ "description": "While a `range` holds its first time and waits for the second.",
169561
+ "name": "range-pending"
169562
+ },
168478
169563
  {
168479
169564
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
168480
169565
  "name": "settled",
@@ -172045,7 +173130,7 @@
172045
173130
  "declarations": [
172046
173131
  {
172047
173132
  "kind": "class",
172048
- "description": "The indicator is one element that moves to the selected item. A single moving\nobject is easier to follow than a fill that swaps, and it shows where the\nselection came from.\n\nIts size and position are measured from the selected item and written to the\nindicator as custom properties, because labels have different lengths.\nMeasurement happens on the client, so the server renders the indicator hidden\nand it fades in once measured.\n\n`selection-mode=\"multiple\"` makes the group a toolbar of buttons that each\nsay whether they are pressed with `aria-pressed`, as React Aria's\nToggleButtonGroup and Radix's ToggleGroup do. A press presses or releases\none item, the arrow keys move focus without pressing, and `value` is the\npressed values, comma separated, which `values` also gives as a list. Use\n`values` where an item's value holds a comma. The form receives one entry\nper pressed value, and a page the browser brings back presses the same\nitems again. The indicator stays hidden, and each pressed item is marked\nwith `:state(pressed)`. Inside a toolbar it is a named group of that\ntoolbar's controls instead, so a reader meets one toolbar.\n\n`orientation=\"vertical\"` runs the items down a column, says so to the\naccessibility tree, and the up and down arrows move between them.\n\n**Keyboard.** The group is one tab stop: the chosen item, or the first that\ncan be chosen, as in a radio group, and in a multiple group the item focus\nwas last on.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Moves to the next item, from the last back to the first. In a single group, chooses it. |\n| Left, Up | Moves to the item before, from the first round to the last. In a single group, chooses it. |\n| Home, End | Moves to the first or the last item. In a single group, chooses it. |\n| Space, Enter | Chooses the focused item, or presses or releases it in a multiple group. |\n\nLeft and Right swap on a right-to-left page, and a disabled item is passed\nover. A single group is a `radiogroup` of items with `role=\"radio\"` and\n`aria-checked`. A multiple group is a `toolbar` of buttons with\n`aria-pressed`, or a `group` inside a toolbar. The group is named by\n`label` and carries `aria-orientation` under `orientation`.",
173133
+ "description": "The indicator is one element that moves to the selected item. A single moving\nobject is easier to follow than a fill that swaps, and it shows where the\nselection came from.\n\nIts size and position are measured from the selected item and written to the\nindicator as custom properties, because labels have different lengths.\nMeasurement happens on the client, so the server renders the indicator hidden\nand it fades in once measured.\n\n`selection-mode=\"multiple\"` makes the group a toolbar of buttons that each\nsay whether they are pressed with `aria-pressed`, as React Aria's\nToggleButtonGroup and Radix's ToggleGroup do. A press presses or releases\none item, the arrow keys move focus without pressing, and `value` is the\npressed values, comma separated, which `values` also gives as a list. Use\n`values` where an item's value holds a comma. The form receives one entry\nper pressed value, and a page the browser brings back presses the same\nitems again. The indicator stays hidden, and each pressed item is marked\nwith `:state(pressed)`. Inside a toolbar it is a named group of that\ntoolbar's controls instead, so a reader meets one toolbar.\n\n`orientation=\"vertical\"` runs the items down a column, says so to the\naccessibility tree, and the up and down arrows move between them.\n\n**Keyboard.** The group is one tab stop: the chosen item, or the first that\ncan be chosen, as in a radio group, and in a multiple group the item focus\nwas last on.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Moves to the next item, from the last back to the first. In a single group, chooses it. |\n| Left, Up | Moves to the item before, from the first round to the last. In a single group, chooses it. |\n| Home, End | Moves to the first or the last item. In a single group, chooses it. |\n| Space, Enter | Chooses the focused item, or presses or releases it in a multiple group. With `allow-empty-selection`, takes back the chosen item. |\n\nLeft and Right swap on a right-to-left page, and a disabled item is passed\nover. A single group is a `radiogroup` of items with `role=\"radio\"` and\n`aria-checked`. A multiple group is a `toolbar` of buttons with\n`aria-pressed`, or a `group` inside a toolbar. The group is named by\n`label` and carries `aria-orientation` under `orientation`.",
172049
173134
  "name": "HelixHeadlessToggleGroup",
172050
173135
  "cssParts": [
172051
173136
  {
@@ -172111,6 +173196,14 @@
172111
173196
  },
172112
173197
  "description": "Takes the markup's own answer where nothing has set a value.\n\n**The case a server renders**, and `Tabs` records the same fault from the\nother side. This element cannot choose on the server, having no children to\ncount, so a consumer whose first paint is right wrote `selected` on the\nitem: that serves `aria-checked=\"true\"`, and `sync` then cleared it one\nframe later, because `value` is `''` and nothing matches it. The shipped\n`disabled` example is exactly that markup, and drew both of its groups with\nnothing chosen.\n\n**Onto `defaultValue`, never onto `value`**, which is the same call\n`Slider` makes about the midpoint it seeds: what the markup declared is a\nfact about the markup, so it is where a reset returns to rather than\nsomething the reader chose. It also makes the group report the answer it is\nshowing, which marking the item alone would not: a `required` group would\notherwise tell a reader a value is missing while they are looking at one.\n\nA written `value` still wins, a declared property being a seed and a\ncorrection, and a group with neither still marks nothing at all.\n\n**The property and never `defaultSelected`, which is the attribute.** React\nassigns a JSX prop as a property where the custom element has one, and\nwrites no attribute at all, so keying on the attribute answers for markup\nand not for JSX. Measured by the parity check on the shipped `disabled`\nexample, whose two syntaxes are the same tree: 192 pixels apart, the HTML\nmarking `List` and the TSX marking nothing. The attribute seeds the\nproperty at upgrade, so reading the property covers both.\n\nRead before `sync` writes to it, which is the only moment it still holds\nwhat the consumer declared: after that it holds this group's answer, and\n`value` is no longer empty, so this returns above.\n\n**Called from `willUpdate` and from the slot, never from `sync`**, which\nruns in `updated`: a reactive property set there schedules a second update,\nand Lit's development build warns about exactly that once per group. From\n`willUpdate` the first render already carries the value, which is the pass\nthat has to be right. `children` is undefined on the server, whose element\nshim carries attributes and no tree, and that is the same guard\n`MixinCollection` records for the same reason."
172113
173198
  },
173199
+ {
173200
+ "kind": "field",
173201
+ "name": "marked",
173202
+ "privacy": "private",
173203
+ "readonly": true,
173204
+ "default": "new WeakSet<HelixHeadlessToggle>()",
173205
+ "description": "The items whose `selected` this group has written, which `adopt` passes\nover: the mark is this group's answer, and the markup declared nothing.\n\nMeasured before this: in a group with no default, choosing List and then\nresetting the form left List chosen and submitted, because `adopt` read\nthe mark `sync` had put on it as a declaration and made it the default."
173206
+ },
172114
173207
  {
172115
173208
  "kind": "method",
172116
173209
  "name": "sync",
@@ -172169,6 +173262,16 @@
172169
173262
  "description": "Whether several items can be pressed at once.",
172170
173263
  "readonly": true
172171
173264
  },
173265
+ {
173266
+ "kind": "field",
173267
+ "name": "allowEmptySelection",
173268
+ "type": {
173269
+ "text": "boolean"
173270
+ },
173271
+ "default": "false",
173272
+ "description": "Whether a press on the chosen item, or Space or Enter on it, takes it\nback so nothing is chosen, as React Aria's `ToggleButtonGroup` and\nRadix's `ToggleGroup` do in a single group. Absent, a single group always\nkeeps its choice once it has one, as a radio group does. A multiple group\nreleases a pressed item either way.",
173273
+ "attribute": "allow-empty-selection"
173274
+ },
172172
173275
  {
172173
173276
  "kind": "field",
172174
173277
  "name": "focusable",
@@ -173645,6 +174748,15 @@
173645
174748
  }
173646
174749
  ],
173647
174750
  "attributes": [
174751
+ {
174752
+ "name": "allow-empty-selection",
174753
+ "type": {
174754
+ "text": "boolean"
174755
+ },
174756
+ "default": "false",
174757
+ "description": "Whether a press on the chosen item, or Space or Enter on it, takes it\nback so nothing is chosen, as React Aria's `ToggleButtonGroup` and\nRadix's `ToggleGroup` do in a single group. Absent, a single group always\nkeeps its choice once it has one, as a radio group does. A multiple group\nreleases a pressed item either way.",
174758
+ "fieldName": "allowEmptySelection"
174759
+ },
173648
174760
  {
173649
174761
  "name": "label-placement",
173650
174762
  "type": {
@@ -173899,7 +175011,7 @@
173899
175011
  "name": "HelixHeadlessToggle",
173900
175012
  "cssParts": [
173901
175013
  {
173902
- "description": "The radio button.",
175014
+ "description": "The button: a radio in a group where one is chosen, and a button with `aria-pressed` on its own or in a group where several can be.",
173903
175015
  "name": "item"
173904
175016
  }
173905
175017
  ],
@@ -174411,7 +175523,7 @@
174411
175523
  ],
174412
175524
  "cssStates": [
174413
175525
  {
174414
- "description": "The item is pressed, in a group where several can be.",
175526
+ "description": "The item is pressed, on its own or in a group where several can be.",
174415
175527
  "name": "pressed"
174416
175528
  },
174417
175529
  {
@@ -189523,6 +190635,6 @@
189523
190635
  ],
189524
190636
  "helix": {
189525
190637
  "package": "@fusion.dev/helix-headless",
189526
- "version": "0.159.0"
190638
+ "version": "0.160.0"
189527
190639
  }
189528
190640
  }