@fusion.dev/helix-headless 0.146.0 → 0.148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +9287 -1084
- package/dist/accordion/item/accordion-item.d.ts +43 -21
- package/dist/accordion/item/accordion-item.js +37 -11
- package/dist/accordion/root/accordion-root.d.ts +8 -2
- package/dist/accordion/root/accordion-root.js +6 -8
- package/dist/announcement/root/announcement-root.d.ts +66 -6
- package/dist/announcement/root/announcement-root.js +144 -13
- package/dist/area-chart/root/area-chart-root.d.ts +18 -1
- package/dist/area-chart/root/area-chart-root.js +14 -7
- package/dist/avatar/root/avatar-root.d.ts +31 -1
- package/dist/avatar/root/avatar-root.js +11 -1
- package/dist/badge/count.d.ts +14 -0
- package/dist/badge/count.js +20 -0
- package/dist/badge/root/badge-root.d.ts +57 -6
- package/dist/badge/root/badge-root.js +77 -8
- package/dist/bar-chart/root/bar-chart-root.js +11 -20
- package/dist/bar-chart/stack.d.ts +10 -0
- package/dist/bar-chart/stack.js +8 -0
- package/dist/blockquote/root/blockquote-root.d.ts +66 -8
- package/dist/blockquote/root/blockquote-root.js +85 -8
- package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +14 -0
- package/dist/breadcrumbs/breadcrumb/breadcrumb.js +12 -2
- package/dist/breadcrumbs/root/breadcrumbs-root.js +2 -2
- package/dist/button/root/button-root.d.ts +24 -38
- package/dist/button/root/button-root.js +6 -37
- package/dist/button/submitter.d.ts +27 -0
- package/dist/button/submitter.js +25 -0
- package/dist/button-group/arrows.d.ts +14 -0
- package/dist/button-group/arrows.js +10 -0
- package/dist/button-group/root/button-group-root.d.ts +141 -3
- package/dist/button-group/root/button-group-root.js +142 -2
- package/dist/canvas/edge-pan.d.ts +61 -0
- package/dist/canvas/edge-pan.js +63 -0
- package/dist/canvas/node/canvas-node.d.ts +12 -2
- package/dist/canvas/node/canvas-node.js +6 -2
- package/dist/canvas/root/canvas-document.d.ts +10 -0
- package/dist/canvas/root/canvas-document.js +1 -0
- package/dist/canvas/root/canvas-root.d.ts +107 -5
- package/dist/canvas/root/canvas-root.js +140 -36
- package/dist/canvas/snap.d.ts +42 -0
- package/dist/canvas/snap.js +32 -0
- package/dist/card/root/card-root.d.ts +12 -1
- package/dist/card/root/card-root.js +11 -4
- package/dist/carousel/root/carousel-root.d.ts +4 -3
- package/dist/carousel/root/carousel-root.js +2 -6
- package/dist/chat/root/chat-root.d.ts +28 -4
- package/dist/chat/root/chat-root.js +12 -7
- package/dist/checkbox/root/checkbox-root.js +5 -7
- package/dist/checkbox-group/root/checkbox-group-root.d.ts +13 -0
- package/dist/checkbox-group/root/checkbox-group-root.js +16 -7
- package/dist/checkbox-group/select-all.d.ts +9 -4
- package/dist/checkbox-group/select-all.js +1 -1
- package/dist/code-block/root/code-block-root.d.ts +41 -18
- package/dist/code-block/root/code-block-root.js +21 -6
- package/dist/color-input/root/color-input-root.d.ts +11 -0
- package/dist/color-input/root/color-input-root.js +12 -5
- package/dist/color-picker/channels.js +1 -2
- package/dist/color-picker/root/color-picker-root.d.ts +32 -24
- package/dist/color-picker/root/color-picker-root.js +99 -55
- package/dist/color-picker/wheel.d.ts +28 -0
- package/dist/color-picker/wheel.js +15 -0
- package/dist/combobox/root/combobox-root.d.ts +83 -11
- package/dist/combobox/root/combobox-root.js +81 -18
- package/dist/command/root/command-root.d.ts +7 -4
- package/dist/command/root/command-root.js +2 -19
- package/dist/copy-button/root/copy-button-root.d.ts +16 -1
- package/dist/copy-button/root/copy-button-root.js +7 -2
- package/dist/data-table/keys.d.ts +0 -18
- package/dist/data-table/keys.js +1 -11
- package/dist/data-table/root/data-table-root.js +29 -50
- package/dist/date-input/root/date-input-root.d.ts +8 -1
- package/dist/date-input/root/date-input-root.js +8 -5
- package/dist/date-picker/root/date-picker-root.d.ts +14 -9
- package/dist/date-picker/root/date-picker-root.js +21 -16
- package/dist/description-list/item/description-list-item.d.ts +22 -4
- package/dist/description-list/item/description-list-item.js +14 -4
- package/dist/divider/root/divider-root.d.ts +45 -16
- package/dist/divider/root/divider-root.js +28 -4
- package/dist/donut-chart/root/donut-chart-root.js +13 -6
- package/dist/donut-chart/slice-label.d.ts +35 -0
- package/dist/donut-chart/slice-label.js +11 -0
- package/dist/drawer/root/drawer-root.d.ts +4 -2
- package/dist/drawer/root/drawer-root.js +15 -3
- package/dist/drilldown/item/drilldown-item.d.ts +21 -1
- package/dist/drilldown/item/drilldown-item.js +38 -4
- package/dist/drilldown/root/drilldown-root.js +3 -2
- package/dist/element-events.generated.js +5 -1
- package/dist/empty/root/empty-root.d.ts +46 -2
- package/dist/empty/root/empty-root.js +50 -5
- package/dist/file-input/root/file-input-root.d.ts +34 -6
- package/dist/file-input/root/file-input-root.js +55 -21
- package/dist/file-input/status.d.ts +24 -0
- package/dist/file-input/status.js +11 -0
- package/dist/filter-input/chip/filter-chip.d.ts +23 -0
- package/dist/filter-input/chip/filter-chip.js +10 -2
- package/dist/filter-input/root/filter-input-root.d.ts +8 -0
- package/dist/filter-input/root/filter-input-root.js +17 -27
- package/dist/format-date/fields.d.ts +20 -0
- package/dist/format-date/fields.js +14 -0
- package/dist/format-date/options.d.ts +5 -5
- package/dist/format-date/options.js +10 -39
- package/dist/format-date/root/format-date-root.d.ts +53 -4
- package/dist/format-date/root/format-date-root.js +38 -50
- package/dist/graph/root/graph-root.d.ts +23 -5
- package/dist/graph/root/graph-root.js +17 -20
- package/dist/heatmap/root/buckets.d.ts +21 -0
- package/dist/heatmap/root/buckets.js +34 -0
- package/dist/heatmap/root/heatmap-root.d.ts +76 -3
- package/dist/heatmap/root/heatmap-root.js +105 -20
- package/dist/icon/index.d.ts +1 -1
- package/dist/icon/index.js +1 -1
- package/dist/icon/registry.d.ts +26 -1
- package/dist/icon/registry.js +12 -1
- package/dist/icon/root/icon-root.d.ts +13 -0
- package/dist/icon/root/icon-root.js +23 -2
- package/dist/icon/root/index.d.ts +1 -1
- package/dist/icon/root/index.js +1 -1
- package/dist/image/root/image-root.d.ts +20 -0
- package/dist/image/root/image-root.js +6 -1
- package/dist/input/root/input-root.d.ts +23 -2
- package/dist/input/root/input-root.js +12 -8
- package/dist/kbd/root/kbd-root.d.ts +20 -3
- package/dist/kbd/root/kbd-root.js +23 -50
- package/dist/legend/hidden-series.d.ts +10 -2
- package/dist/legend/hidden-series.js +5 -2
- package/dist/legend/root/legend-root.d.ts +25 -7
- package/dist/legend/root/legend-root.js +25 -26
- package/dist/lightbox/root/lightbox-root.d.ts +50 -5
- package/dist/lightbox/root/lightbox-root.js +76 -8
- package/dist/lightbox/zoom.d.ts +2 -0
- package/dist/lightbox/zoom.js +5 -3
- package/dist/line-chart/root/line-chart-root.d.ts +16 -0
- package/dist/line-chart/root/line-chart-root.js +10 -2
- package/dist/list/root/list-root.d.ts +10 -2
- package/dist/list/root/list-root.js +31 -24
- package/dist/list/selection.d.ts +17 -0
- package/dist/list/selection.js +16 -0
- package/dist/listbox/root/listbox-root.d.ts +125 -26
- package/dist/listbox/root/listbox-root.js +156 -166
- package/dist/map/marker/map-marker.d.ts +2 -1
- package/dist/map/root/map-root.d.ts +40 -2
- package/dist/map/root/map-root.js +64 -23
- package/dist/megamenu/hand-over.d.ts +75 -0
- package/dist/megamenu/hand-over.js +67 -0
- package/dist/megamenu/root/megamenu-root.d.ts +38 -14
- package/dist/megamenu/root/megamenu-root.js +29 -50
- package/dist/menu/item/menu-item.js +4 -4
- package/dist/menu/root/menu-root.d.ts +5 -2
- package/dist/meter/root/meter-root.d.ts +42 -0
- package/dist/meter/root/meter-root.js +33 -7
- package/dist/navigation/root/navigation-root.js +5 -8
- package/dist/notifications/group/notification-group.d.ts +8 -1
- package/dist/notifications/group/notification-group.js +12 -6
- package/dist/notifications/notification/notification.d.ts +12 -1
- package/dist/notifications/notification/notification.js +3 -1
- package/dist/notifications/root/notifications-root.d.ts +48 -3
- package/dist/notifications/root/notifications-root.js +36 -6
- package/dist/number-input/grain.d.ts +28 -0
- package/dist/number-input/grain.js +14 -0
- package/dist/number-input/root/number-input-root.d.ts +17 -1
- package/dist/number-input/root/number-input-root.js +29 -18
- package/dist/object-inspector/root/object-inspector-root.d.ts +17 -6
- package/dist/object-inspector/root/object-inspector-root.js +31 -20
- package/dist/option/index.d.ts +1 -0
- package/dist/option/index.js +1 -0
- package/dist/option/separator/option-separator.d.ts +30 -0
- package/dist/option/separator/option-separator.js +21 -0
- package/dist/outline/root/outline-root.d.ts +12 -0
- package/dist/outline/root/outline-root.js +5 -19
- package/dist/pagination/size/pagination-size.d.ts +6 -0
- package/dist/pagination/size/pagination-size.js +5 -3
- package/dist/pin-input/code.d.ts +51 -1
- package/dist/pin-input/code.js +37 -0
- package/dist/pin-input/root/pin-input-root.d.ts +98 -121
- package/dist/pin-input/root/pin-input-root.js +151 -156
- package/dist/popover/hide-outside.js +2 -9
- package/dist/popover/root/popover-root.d.ts +7 -1
- package/dist/popover/root/popover-root.js +9 -1
- package/dist/progress/root/progress-root.d.ts +27 -0
- package/dist/progress/root/progress-root.js +25 -7
- package/dist/qr-code/export.d.ts +19 -0
- package/dist/qr-code/export.js +14 -0
- package/dist/qr-code/name.d.ts +11 -0
- package/dist/qr-code/name.js +7 -0
- package/dist/qr-code/root/qr-code-root.d.ts +31 -9
- package/dist/qr-code/root/qr-code-root.js +29 -17
- package/dist/radio/group/radio-group.d.ts +15 -0
- package/dist/radio/root/radio-root.js +2 -2
- package/dist/rating/root/rating-root.d.ts +22 -9
- package/dist/rating/root/rating-root.js +15 -39
- package/dist/scatter-chart/measures.d.ts +22 -0
- package/dist/scatter-chart/measures.js +11 -0
- package/dist/scatter-chart/root/scatter-chart-root.d.ts +26 -0
- package/dist/scatter-chart/root/scatter-chart-root.js +21 -7
- package/dist/scroll-area/scrollbar.d.ts +0 -8
- package/dist/scroll-area/scrollbar.js +1 -1
- package/dist/select/align.d.ts +47 -0
- package/dist/select/align.js +7 -0
- package/dist/select/root/select-root.d.ts +115 -11
- package/dist/select/root/select-root.js +104 -20
- package/dist/slider/root/slider-root.d.ts +18 -1
- package/dist/slider/root/slider-root.js +22 -0
- package/dist/sparkline/readings.d.ts +30 -12
- package/dist/sparkline/readings.js +32 -15
- package/dist/sparkline/root/sparkline-root.d.ts +46 -3
- package/dist/sparkline/root/sparkline-root.js +60 -21
- package/dist/speed-dial/group/speed-dial-group.d.ts +48 -0
- package/dist/speed-dial/group/speed-dial-group.js +43 -0
- package/dist/speed-dial/index.d.ts +1 -0
- package/dist/speed-dial/index.js +1 -0
- package/dist/speed-dial/item/speed-dial-item.d.ts +27 -2
- package/dist/speed-dial/item/speed-dial-item.js +43 -5
- package/dist/speed-dial/long-press.d.ts +50 -0
- package/dist/speed-dial/long-press.js +48 -0
- package/dist/speed-dial/root/speed-dial-root.d.ts +86 -1
- package/dist/speed-dial/root/speed-dial-root.js +123 -6
- package/dist/splitter/root/splitter-root.d.ts +9 -2
- package/dist/splitter/root/splitter-root.js +18 -3
- package/dist/steps/root/steps-root.d.ts +8 -1
- package/dist/steps/root/steps-root.js +6 -1
- package/dist/steps/step/step.d.ts +1 -0
- package/dist/steps/step/step.js +1 -1
- package/dist/table/cell/table-cell.d.ts +8 -1
- package/dist/table/cell/table-cell.js +6 -2
- package/dist/table/column/table-column.d.ts +6 -0
- package/dist/table/column/table-column.js +5 -1
- package/dist/table/grid-controller.d.ts +117 -0
- package/dist/table/grid-controller.js +293 -0
- package/dist/table/root/table-root.d.ts +47 -3
- package/dist/table/root/table-root.js +93 -29
- package/dist/table/row/table-row.d.ts +36 -0
- package/dist/table/row/table-row.js +52 -2
- package/dist/tabs/root/tabs-root.d.ts +5 -3
- package/dist/tag/group/tag-group.d.ts +16 -4
- package/dist/tag/group/tag-group.js +23 -20
- package/dist/textarea/root/textarea-root.d.ts +14 -2
- package/dist/textarea/root/textarea-root.js +6 -7
- package/dist/time-input/root/time-input-root.d.ts +5 -1
- package/dist/time-input/root/time-input-root.js +10 -7
- package/dist/time-picker/root/time-picker-root.d.ts +12 -14
- package/dist/time-picker/root/time-picker-root.js +18 -23
- package/dist/toast/item/toast-item.d.ts +9 -6
- package/dist/toast/item/toast-item.js +1 -1
- package/dist/toast/root/toast-root.d.ts +40 -4
- package/dist/toast/root/toast-root.js +68 -16
- package/dist/toast/words.d.ts +12 -0
- package/dist/toast/words.js +25 -0
- package/dist/toggle/group/toggle-group.d.ts +29 -5
- package/dist/toggle/group/toggle-group.js +26 -43
- package/dist/toggle/root/toggle-root.js +2 -4
- package/dist/toolbar/root/toolbar-root.d.ts +52 -5
- package/dist/toolbar/root/toolbar-root.js +88 -13
- package/dist/tooltip/root/tooltip-root.d.ts +7 -1
- package/dist/tooltip/root/tooltip-root.js +10 -2
- package/dist/tour/root/tour-root.d.ts +15 -0
- package/dist/tour/root/tour-root.js +20 -1
- package/dist/tour/stop/tour-stop.d.ts +3 -0
- package/dist/tour/stop/tour-stop.js +3 -3
- package/dist/tree/root/tree-root.js +2 -2
- package/dist/trend/figure.d.ts +16 -0
- package/dist/trend/figure.js +8 -0
- package/dist/trend/root/trend-root.d.ts +41 -2
- package/dist/trend/root/trend-root.js +29 -3
- package/dist/video/root/extra-controls.d.ts +12 -0
- package/dist/video/root/extra-controls.js +6 -2
- package/dist/video/root/video-root.d.ts +16 -1
- package/dist/video/root/video-root.js +15 -1
- package/dist/video-playlist/root/video-playlist-root.d.ts +11 -1
- package/dist/video-playlist/root/video-playlist-root.js +3 -0
- package/dist/virtual-list/fill.d.ts +11 -0
- package/dist/virtual-list/fill.js +9 -0
- package/dist/virtual-list/keys.d.ts +16 -7
- package/dist/virtual-list/keys.js +17 -6
- package/dist/virtual-list/plan.d.ts +17 -1
- package/dist/virtual-list/plan.js +13 -2
- package/dist/virtual-list/root/virtual-list-root.d.ts +25 -3
- package/dist/virtual-list/root/virtual-list-root.js +53 -41
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +4934 -954
- package/types/svelte.d.ts +2 -0
- package/types/vue.d.ts +946 -253
- package/dist/color-picker/swatches.d.ts +0 -12
- package/dist/color-picker/swatches.js +0 -26
- package/dist/rating/steps.d.ts +0 -7
- package/dist/rating/steps.js +0 -9
- package/dist/tooltip/focus-target.d.ts +0 -6
- package/dist/tooltip/focus-target.js +0 -9
package/types/vue.d.ts
CHANGED
|
@@ -56,6 +56,7 @@ import type {
|
|
|
56
56
|
HelixHeadlessDrilldownItem,
|
|
57
57
|
HelixHeadlessDrilldown,
|
|
58
58
|
HelixHeadlessEmpty,
|
|
59
|
+
FileStatus,
|
|
59
60
|
HelixHeadlessFileInput,
|
|
60
61
|
HelixHeadlessFilterChip,
|
|
61
62
|
HelixHeadlessFilterField,
|
|
@@ -105,10 +106,13 @@ import type {
|
|
|
105
106
|
HelixHeadlessOptionGroup,
|
|
106
107
|
optionsAmong,
|
|
107
108
|
HelixHeadlessOption,
|
|
109
|
+
HelixHeadlessOptionSeparator,
|
|
108
110
|
HelixHeadlessOutline,
|
|
109
111
|
HelixHeadlessPagination,
|
|
110
112
|
HelixHeadlessPaginationSize,
|
|
111
113
|
HelixHeadlessPaginationSummary,
|
|
114
|
+
PinCase,
|
|
115
|
+
PinType,
|
|
112
116
|
HelixHeadlessPinInput,
|
|
113
117
|
HelixHeadlessPopover,
|
|
114
118
|
HelixHeadlessProgress,
|
|
@@ -125,6 +129,7 @@ import type {
|
|
|
125
129
|
HelixHeadlessSkipLink,
|
|
126
130
|
HelixHeadlessSlider,
|
|
127
131
|
HelixHeadlessSparkline,
|
|
132
|
+
HelixHeadlessSpeedDialGroup,
|
|
128
133
|
HelixHeadlessSpeedDialItem,
|
|
129
134
|
HelixHeadlessSpeedDial,
|
|
130
135
|
HelixHeadlessSplitter,
|
|
@@ -170,6 +175,7 @@ import type {
|
|
|
170
175
|
ToggleEvent,
|
|
171
176
|
HelixDismissEvent,
|
|
172
177
|
HelixScrolledEvent,
|
|
178
|
+
HelixBeforeChangeEvent,
|
|
173
179
|
HelixPressEvent,
|
|
174
180
|
HelixBeforeMoveEvent,
|
|
175
181
|
HelixBeforeReconnectEvent,
|
|
@@ -190,7 +196,6 @@ import type {
|
|
|
190
196
|
HelixBeforePinEvent,
|
|
191
197
|
HelixHistoryEvent,
|
|
192
198
|
HelixPinEvent,
|
|
193
|
-
HelixBeforeChangeEvent,
|
|
194
199
|
HelixBeforeToggleEvent,
|
|
195
200
|
HelixCopyEvent,
|
|
196
201
|
HelixSampleEndEvent,
|
|
@@ -229,6 +234,7 @@ import type {
|
|
|
229
234
|
HelixMapTiltEvent,
|
|
230
235
|
HelixMapZoomEvent,
|
|
231
236
|
HelixToggleEvent,
|
|
237
|
+
HelixBandEvent,
|
|
232
238
|
HelixReadEvent,
|
|
233
239
|
HelixCompleteEvent,
|
|
234
240
|
HelixPreviewEvent,
|
|
@@ -333,18 +339,16 @@ too. */
|
|
|
333
339
|
/** Whether find in page searches the section while it is closed, and opens it
|
|
334
340
|
on a match.
|
|
335
341
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
accordion's own `hidden-until-found` turns it on for every section. */
|
|
342
|
+
Unset takes the accordion's `hidden-until-found`, which is on. Write
|
|
343
|
+
`hidden-until-found="false"` to keep find in page out of this section: a
|
|
344
|
+
closed section is then `hidden` and `inert`. */
|
|
340
345
|
"hidden-until-found"?: (HelixHeadlessAccordionItem["hiddenUntilFound"]) | undefined;
|
|
341
346
|
/** Whether find in page searches the section while it is closed, and opens it
|
|
342
347
|
on a match.
|
|
343
348
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
accordion's own `hidden-until-found` turns it on for every section. */
|
|
349
|
+
Unset takes the accordion's `hidden-until-found`, which is on. Write
|
|
350
|
+
`hidden-until-found="false"` to keep find in page out of this section: a
|
|
351
|
+
closed section is then `hidden` and `inert`. */
|
|
348
352
|
hiddenUntilFound?: (HelixHeadlessAccordionItem["hiddenUntilFound"]) | undefined;
|
|
349
353
|
/** A group name. Opening an item closes the other items with the same name,
|
|
350
354
|
as `<details name>` does.
|
|
@@ -403,12 +407,18 @@ Unset is 3. An item's own `heading-level` wins over this. */
|
|
|
403
407
|
Unset is 3. An item's own `heading-level` wins over this. */
|
|
404
408
|
headingLevel?: (HelixHeadlessAccordion["headingLevel"]) | undefined;
|
|
405
409
|
/** Whether find in page searches every closed section, and opens the one it
|
|
406
|
-
matches in.
|
|
407
|
-
|
|
410
|
+
matches in.
|
|
411
|
+
|
|
412
|
+
On by default, as in React Aria's disclosure. Write
|
|
413
|
+
`hidden-until-found="false"` to turn it off for every section; an item's
|
|
414
|
+
own `hidden-until-found` wins for that item. */
|
|
408
415
|
"hidden-until-found"?: (HelixHeadlessAccordion["hiddenUntilFound"]) | undefined;
|
|
409
416
|
/** Whether find in page searches every closed section, and opens the one it
|
|
410
|
-
matches in.
|
|
411
|
-
|
|
417
|
+
matches in.
|
|
418
|
+
|
|
419
|
+
On by default, as in React Aria's disclosure. Write
|
|
420
|
+
`hidden-until-found="false"` to turn it off for every section; an item's
|
|
421
|
+
own `hidden-until-found` wins for that item. */
|
|
412
422
|
hiddenUntilFound?: (HelixHeadlessAccordion["hiddenUntilFound"]) | undefined;
|
|
413
423
|
/** How many sections may be open at once.
|
|
414
424
|
|
|
@@ -444,6 +454,22 @@ export type HelixHeadlessAnnouncementVueProps = {
|
|
|
444
454
|
Read once when the announcement is first rendered, as `Toast` reads its
|
|
445
455
|
own. The clock stops while the pointer or focus is on the announcement. */
|
|
446
456
|
duration?: (HelixHeadlessAnnouncement["duration"]) | undefined;
|
|
457
|
+
/** The key that moves focus to the announcement's first control, and back
|
|
458
|
+
to where it was, written as keys joined by `+`, such as `F6` or `Alt+A`.
|
|
459
|
+
|
|
460
|
+
F6 by default, the key React Aria's regions answer to. Empty turns it
|
|
461
|
+
off. With several announcements, the first one in the page takes focus. */
|
|
462
|
+
hotkey?: (HelixHeadlessAnnouncement["hotkey"]) | undefined;
|
|
463
|
+
/** The name of the announcement's region, which screen readers list among
|
|
464
|
+
the page's landmarks. Translate it with the rest of your interface.
|
|
465
|
+
|
|
466
|
+
Empty leaves the announcement no region. */
|
|
467
|
+
label?: (HelixHeadlessAnnouncement["label"]) | undefined;
|
|
468
|
+
/** Whether the announcement waits its turn behind the queued announcements
|
|
469
|
+
before it in the same parent, showing when the last of them is removed.
|
|
470
|
+
|
|
471
|
+
Off by default, so every announcement on a page shows at once. */
|
|
472
|
+
queued?: (HelixHeadlessAnnouncement["queued"]) | undefined;
|
|
447
473
|
/** The band's color.
|
|
448
474
|
|
|
449
475
|
Paint only: unlike `Callout`, no value here draws a mark, changes the label,
|
|
@@ -561,6 +587,13 @@ The same three values `LineChart` takes, with the same fallback: a bare
|
|
|
561
587
|
rather than under them, because the bands are opaque and a rule under one is
|
|
562
588
|
a rule nobody sees. */
|
|
563
589
|
gridlines?: (HelixHeadlessAreaChart["gridlines"]) | undefined;
|
|
590
|
+
/** Draws every band from zero, in front of the next, so a band's height is
|
|
591
|
+
its own part's amount and not its place in a stack.
|
|
592
|
+
|
|
593
|
+
Absent stacks the parts, so the top edge is the total. Set, the first
|
|
594
|
+
column is in front and the scale fits the largest part. Reflected, because
|
|
595
|
+
the styled tier lets the bands behind show through the ones in front. */
|
|
596
|
+
overlap?: (HelixHeadlessAreaChart["overlap"]) | undefined;
|
|
564
597
|
/** Draws each reading as a hundred percent, so each band shows its share of
|
|
565
598
|
the total.
|
|
566
599
|
|
|
@@ -672,6 +705,19 @@ replaces them when it arrives, so a slow connection shows who it is
|
|
|
672
705
|
without a cached picture flashing initials first. Radix's `delayMs` is the
|
|
673
706
|
same idea. */
|
|
674
707
|
fallbackDelay?: (HelixHeadlessAvatar["fallbackDelay"]) | undefined;
|
|
708
|
+
/** The letters shown where no picture loaded, such as `GH`, in place of the
|
|
709
|
+
ones taken from `name`.
|
|
710
|
+
|
|
711
|
+
For a name whose initials are not its first and last letters, or an
|
|
712
|
+
entity with a short mark of its own. Absent, the first letters of the
|
|
713
|
+
first and last words of `name` are shown. */
|
|
714
|
+
initials?: (HelixHeadlessAvatar["initials"]) | undefined;
|
|
715
|
+
/** When the browser fetches the picture: `lazy` waits until it is near the
|
|
716
|
+
screen, as an `<img loading="lazy">` does, and `eager` fetches it at once.
|
|
717
|
+
|
|
718
|
+
Absent is the browser's own default, which is `eager`. `lazy` suits a long
|
|
719
|
+
list of people, most of them off screen. */
|
|
720
|
+
loading?: (HelixHeadlessAvatar["loading"]) | undefined;
|
|
675
721
|
/** Name of the person or entity.
|
|
676
722
|
|
|
677
723
|
Used for the label and the initials. */
|
|
@@ -701,12 +747,28 @@ export type HelixHeadlessAvatarVueEvents = {
|
|
|
701
747
|
};
|
|
702
748
|
|
|
703
749
|
export type HelixHeadlessBadgeVueProps = {
|
|
750
|
+
/** `Intl.NumberFormat` options a count is written with, such as
|
|
751
|
+
`{"notation":"compact"}` for `1.2K`, written as JSON in the attribute.
|
|
752
|
+
|
|
753
|
+
Absent, a count is shown as it was given. Text that is not a number is
|
|
754
|
+
shown as it is either way. */
|
|
755
|
+
"format-options"?: (HelixHeadlessBadge["formatOptions"]) | undefined;
|
|
756
|
+
/** `Intl.NumberFormat` options a count is written with, such as
|
|
757
|
+
`{"notation":"compact"}` for `1.2K`, written as JSON in the attribute.
|
|
758
|
+
|
|
759
|
+
Absent, a count is shown as it was given. Text that is not a number is
|
|
760
|
+
shown as it is either way. */
|
|
761
|
+
formatOptions?: (HelixHeadlessBadge["formatOptions"]) | undefined;
|
|
704
762
|
/** The badge's name, read by screen readers.
|
|
705
763
|
|
|
706
764
|
Required for a dot, which has no text to read. `{count}` is replaced with
|
|
707
765
|
what the badge shows, so `label="{count} unread"` reads "8 unread" and
|
|
708
766
|
stays current as `value` changes, with no label of yours to keep in step. */
|
|
709
767
|
label?: (HelixHeadlessBadge["label"]) | undefined;
|
|
768
|
+
/** The locale a count is written in under `format-options`, such as `de`.
|
|
769
|
+
|
|
770
|
+
Absent uses the runtime's own. */
|
|
771
|
+
locale?: (HelixHeadlessBadge["locale"]) | undefined;
|
|
710
772
|
/** The largest number the badge shows.
|
|
711
773
|
|
|
712
774
|
Past it the indicator reads `{max}+`. */
|
|
@@ -870,8 +932,19 @@ legend hid is not counted. */
|
|
|
870
932
|
export type HelixHeadlessBarChartVueEvents = {};
|
|
871
933
|
|
|
872
934
|
export type HelixHeadlessBlockquoteVueProps = {
|
|
873
|
-
/**
|
|
935
|
+
/** Who said it, and where, as words, such as "Maria Lopez, operations
|
|
936
|
+
manager". The `attribution` slot replaces them, for markup such as a link.
|
|
937
|
+
|
|
938
|
+
Words are served with the figure they name, where a server cannot see a
|
|
939
|
+
slotted attribution. */
|
|
940
|
+
attribution?: (HelixHeadlessBlockquote["attribution"]) | undefined;
|
|
941
|
+
/** The URL of the source the passage came from. Who said it goes in
|
|
942
|
+
`attribution`: a `cite` with words in it warns once, with the runtime kind
|
|
943
|
+
`cite-not-url`. */
|
|
874
944
|
cite?: (HelixHeadlessBlockquote["cite"]) | undefined;
|
|
945
|
+
/** Whether to draw an opening quotation mark before the passage, in the
|
|
946
|
+
element's language. Leave the marks out of the text. */
|
|
947
|
+
marks?: (HelixHeadlessBlockquote["marks"]) | undefined;
|
|
875
948
|
};
|
|
876
949
|
|
|
877
950
|
export type HelixHeadlessBlockquoteVueEvents = {};
|
|
@@ -935,6 +1008,15 @@ attribute would put the whole path into the markup twice. */
|
|
|
935
1008
|
|
|
936
1009
|
export type HelixHeadlessBreadcrumbsVueEvents = {};
|
|
937
1010
|
|
|
1011
|
+
/** `HelixHeadlessButtonGroup` component event */
|
|
1012
|
+
export type HelixHeadlessButtonGroupElementEvent<E = Event> = TypedEvent<
|
|
1013
|
+
HelixHeadlessButtonGroup,
|
|
1014
|
+
E
|
|
1015
|
+
>;
|
|
1016
|
+
/** `helix-before-change` event type */
|
|
1017
|
+
export type HelixHeadlessButtonGroupHelixBeforeChangeElementEvent =
|
|
1018
|
+
HelixHeadlessButtonGroupElementEvent<HelixBeforeChangeEvent>;
|
|
1019
|
+
|
|
938
1020
|
export type HelixHeadlessButtonGroupVueProps = {
|
|
939
1021
|
/** The group's name, read by screen readers.
|
|
940
1022
|
|
|
@@ -959,9 +1041,32 @@ buttons sharing edges as one shape, and a wrapped row carries the corners of
|
|
|
959
1041
|
a first row into a second. Stacked, the same three keep one shape and one
|
|
960
1042
|
column. */
|
|
961
1043
|
orientation?: (HelixHeadlessButtonGroup["orientation"]) | undefined;
|
|
1044
|
+
/** Whether the buttons stay pressed: `single` keeps one pressed at a time and
|
|
1045
|
+
`multiple` any number. Unset, they are action buttons, each its own tab
|
|
1046
|
+
stop, as before.
|
|
1047
|
+
|
|
1048
|
+
Optional, so the attribute is absent until a consumer writes it. */
|
|
1049
|
+
"selection-mode"?: (HelixHeadlessButtonGroup["selectionMode"]) | undefined;
|
|
1050
|
+
/** Whether the buttons stay pressed: `single` keeps one pressed at a time and
|
|
1051
|
+
`multiple` any number. Unset, they are action buttons, each its own tab
|
|
1052
|
+
stop, as before.
|
|
1053
|
+
|
|
1054
|
+
Optional, so the attribute is absent until a consumer writes it. */
|
|
1055
|
+
selectionMode?: (HelixHeadlessButtonGroup["selectionMode"]) | undefined;
|
|
1056
|
+
/** The values of the pressed buttons, comma separated, in a selection mode.
|
|
1057
|
+
A button's own `value` names it, so a value holds no comma.
|
|
1058
|
+
|
|
1059
|
+
The attribute is the seed, and a press changes the property, which does
|
|
1060
|
+
not reflect, as a native control's `value` does not. */
|
|
1061
|
+
value?: (HelixHeadlessButtonGroup["value"]) | undefined;
|
|
962
1062
|
};
|
|
963
1063
|
|
|
964
|
-
export type HelixHeadlessButtonGroupVueEvents = {
|
|
1064
|
+
export type HelixHeadlessButtonGroupVueEvents = {
|
|
1065
|
+
/** Fired after a press changes `value`, in a selection mode. */
|
|
1066
|
+
change: HelixHeadlessButtonGroupElementEvent;
|
|
1067
|
+
/** Fired before a press changes `value`, with the value it would leave in `detail.value`. Cancelable: call `preventDefault()` to keep the buttons as they are. */
|
|
1068
|
+
"helix-before-change": HelixHeadlessButtonGroupHelixBeforeChangeElementEvent;
|
|
1069
|
+
};
|
|
965
1070
|
|
|
966
1071
|
/** `HelixHeadlessButton` component event */
|
|
967
1072
|
export type HelixHeadlessButtonElementEvent<E = Event> = TypedEvent<
|
|
@@ -995,33 +1100,23 @@ is the platform's `commandfor`. */
|
|
|
995
1100
|
commandFor?: (HelixHeadlessButton["commandFor"]) | undefined;
|
|
996
1101
|
/** Where this button's submission goes, overriding the form's own.
|
|
997
1102
|
|
|
998
|
-
**The five `form*` overrides
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
The whole submit algorithm runs synchronously inside `requestSubmit()`, so
|
|
1007
|
-
the window is one call and a `finally` closes it whether or not a listener
|
|
1008
|
-
refused. What a `submit` handler observes during that window is the form a
|
|
1009
|
-
native submitter would have given it, which is the point. */
|
|
1103
|
+
**The five `form*` overrides ride on a native submit button that stands in
|
|
1104
|
+
for this one**, because `requestSubmit(submitter)` refuses the inner
|
|
1105
|
+
`<button>` twice over: it is `type="button"`, and it sits in this shadow
|
|
1106
|
+
root, so its form owner is not the consumer's form. The stand-in is a
|
|
1107
|
+
hidden `<button type="submit">` in the form for the one synchronous call,
|
|
1108
|
+
so the platform applies the overrides to that submission alone and leaves
|
|
1109
|
+
the form as it was. See `submitAs`. */
|
|
1010
1110
|
formaction?: (HelixHeadlessButton["formAction"]) | undefined;
|
|
1011
1111
|
/** Where this button's submission goes, overriding the form's own.
|
|
1012
1112
|
|
|
1013
|
-
**The five `form*` overrides
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
The whole submit algorithm runs synchronously inside `requestSubmit()`, so
|
|
1022
|
-
the window is one call and a `finally` closes it whether or not a listener
|
|
1023
|
-
refused. What a `submit` handler observes during that window is the form a
|
|
1024
|
-
native submitter would have given it, which is the point. */
|
|
1113
|
+
**The five `form*` overrides ride on a native submit button that stands in
|
|
1114
|
+
for this one**, because `requestSubmit(submitter)` refuses the inner
|
|
1115
|
+
`<button>` twice over: it is `type="button"`, and it sits in this shadow
|
|
1116
|
+
root, so its form owner is not the consumer's form. The stand-in is a
|
|
1117
|
+
hidden `<button type="submit">` in the form for the one synchronous call,
|
|
1118
|
+
so the platform applies the overrides to that submission alone and leaves
|
|
1119
|
+
the form as it was. See `submitAs`. */
|
|
1025
1120
|
formAction?: (HelixHeadlessButton["formAction"]) | undefined;
|
|
1026
1121
|
/** How the submission is encoded, overriding the form's own. */
|
|
1027
1122
|
formenctype?: (HelixHeadlessButton["formEnctype"]) | undefined;
|
|
@@ -1067,13 +1162,10 @@ a press, so focus stays where the reader left it. */
|
|
|
1067
1162
|
/** The value this button submits under its own `name`, as a native submit
|
|
1068
1163
|
button does.
|
|
1069
1164
|
|
|
1070
|
-
**
|
|
1165
|
+
**Sent with exactly the submission this button starts and not otherwise.**
|
|
1071
1166
|
A native submit button contributes `name=value` only when it is the one
|
|
1072
|
-
that submitted, and every other button on the form contributes nothing
|
|
1073
|
-
|
|
1074
|
-
every submission whoever started it, which is a different feature wearing
|
|
1075
|
-
the same name, so `submit` below sets it, submits, and clears it inside one
|
|
1076
|
-
synchronous call.
|
|
1167
|
+
that submitted, and every other button on the form contributes nothing,
|
|
1168
|
+
which is what the native button standing in for this one at submit does.
|
|
1077
1169
|
|
|
1078
1170
|
`CopyButton` has a `value` of its own meaning the text to put on the
|
|
1079
1171
|
clipboard, which is not this and is why it is declared there rather than
|
|
@@ -1458,6 +1550,20 @@ as the list.
|
|
|
1458
1550
|
The list is joined the way the page's language joins one, "Second and
|
|
1459
1551
|
Third", rather than with a comma this component chose. */
|
|
1460
1552
|
leadsToLabel?: (HelixHeadlessCanvas["leadsToLabel"]) | undefined;
|
|
1553
|
+
/** What screen readers hear after a key moves a card, with `{name}` for the
|
|
1554
|
+
card and `{x}` and `{y}` for where it now is, in the document's units.
|
|
1555
|
+
|
|
1556
|
+
**A move a reader cannot see has to be said.** Shift with an arrow moved
|
|
1557
|
+
the card and said nothing, so a reader moving one by keys could not tell
|
|
1558
|
+
whether it had moved, or how far. */
|
|
1559
|
+
"moved-label"?: (HelixHeadlessCanvas["movedLabel"]) | undefined;
|
|
1560
|
+
/** What screen readers hear after a key moves a card, with `{name}` for the
|
|
1561
|
+
card and `{x}` and `{y}` for where it now is, in the document's units.
|
|
1562
|
+
|
|
1563
|
+
**A move a reader cannot see has to be said.** Shift with an arrow moved
|
|
1564
|
+
the card and said nothing, so a reader moving one by keys could not tell
|
|
1565
|
+
whether it had moved, or how far. */
|
|
1566
|
+
movedLabel?: (HelixHeadlessCanvas["movedLabel"]) | undefined;
|
|
1461
1567
|
/** The order the arrow keys and screen readers move through the cards:
|
|
1462
1568
|
`spatial` or `edges`.
|
|
1463
1569
|
|
|
@@ -1498,6 +1604,14 @@ walk the cards. */
|
|
|
1498
1604
|
/** The text announced when a connection's end is picked up, with `{from}` and
|
|
1499
1605
|
`{to}`. */
|
|
1500
1606
|
reconnectingLabel?: (HelixHeadlessCanvas["reconnectingLabel"]) | undefined;
|
|
1607
|
+
/** What screen readers hear after a key resizes a card, with `{name}` for the
|
|
1608
|
+
card and `{width}` and `{height}` for its new size, in the document's
|
|
1609
|
+
units. */
|
|
1610
|
+
"resized-label"?: (HelixHeadlessCanvas["resizedLabel"]) | undefined;
|
|
1611
|
+
/** What screen readers hear after a key resizes a card, with `{name}` for the
|
|
1612
|
+
card and `{width}` and `{height}` for its new size, in the document's
|
|
1613
|
+
units. */
|
|
1614
|
+
resizedLabel?: (HelixHeadlessCanvas["resizedLabel"]) | undefined;
|
|
1501
1615
|
/** The names of the selected cards and connections, comma separated. Empty
|
|
1502
1616
|
when nothing is selected.
|
|
1503
1617
|
|
|
@@ -1518,6 +1632,43 @@ on its board across cards and connections both, and may not hold a comma.
|
|
|
1518
1632
|
|
|
1519
1633
|
Written to select from outside, and read to act on the selection. */
|
|
1520
1634
|
selected?: (HelixHeadlessCanvas["selected"]) | undefined;
|
|
1635
|
+
/** What a selected card or connection adds to what screen readers hear on
|
|
1636
|
+
it, before its tone and its connections. Empty adds nothing.
|
|
1637
|
+
|
|
1638
|
+
A card is an article and a connection a button, and neither has a selected
|
|
1639
|
+
state for `aria-selected` to carry, so the state is said in words. */
|
|
1640
|
+
"selected-label"?: (HelixHeadlessCanvas["selectedLabel"]) | undefined;
|
|
1641
|
+
/** What a selected card or connection adds to what screen readers hear on
|
|
1642
|
+
it, before its tone and its connections. Empty adds nothing.
|
|
1643
|
+
|
|
1644
|
+
A card is an article and a connection a button, and neither has a selected
|
|
1645
|
+
state for `aria-selected` to carry, so the state is said in words. */
|
|
1646
|
+
selectedLabel?: (HelixHeadlessCanvas["selectedLabel"]) | undefined;
|
|
1647
|
+
/** What screen readers hear after the selection grows or shrinks, with
|
|
1648
|
+
`{count}` for how many cards and connections are selected: by Space, a
|
|
1649
|
+
click with Shift, Command or Control, Command or Control with A, a box
|
|
1650
|
+
drawn across the board, or Escape.
|
|
1651
|
+
|
|
1652
|
+
A selection of one made by arriving on a card or clicking it is not said,
|
|
1653
|
+
since the card is. */
|
|
1654
|
+
"selection-label"?: (HelixHeadlessCanvas["selectionLabel"]) | undefined;
|
|
1655
|
+
/** What screen readers hear after the selection grows or shrinks, with
|
|
1656
|
+
`{count}` for how many cards and connections are selected: by Space, a
|
|
1657
|
+
click with Shift, Command or Control, Command or Control with A, a box
|
|
1658
|
+
drawn across the board, or Escape.
|
|
1659
|
+
|
|
1660
|
+
A selection of one made by arriving on a card or clicking it is not said,
|
|
1661
|
+
since the card is. */
|
|
1662
|
+
selectionLabel?: (HelixHeadlessCanvas["selectionLabel"]) | undefined;
|
|
1663
|
+
/** Snaps the cards a reader moves or resizes to a multiple of this many of the
|
|
1664
|
+
document's units, such as `32` to land on the lines `grid` draws.
|
|
1665
|
+
|
|
1666
|
+
**A drag lets go on the nearest line and a key goes to the next one.**
|
|
1667
|
+
Shift with an arrow moves a card to the next line that way, rather than
|
|
1668
|
+
by its step of 16, and Alt with an arrow moves its bottom right corner
|
|
1669
|
+
the same way. A group moves with what it carries, so a card inside one
|
|
1670
|
+
keeps its place in it. Absent, cards land where they are let go. */
|
|
1671
|
+
snap?: (HelixHeadlessCanvas["snap"]) | undefined;
|
|
1521
1672
|
/** The text announced when a connection is stopped before it is requested. */
|
|
1522
1673
|
"stopped-label"?: (HelixHeadlessCanvas["stoppedLabel"]) | undefined;
|
|
1523
1674
|
/** The text announced when a connection is stopped before it is requested. */
|
|
@@ -1540,6 +1691,12 @@ red is "blocked" on one board and "urgent" on the next. A reader who can
|
|
|
1540
1691
|
see the board is told by the color; this is how a reader who cannot is
|
|
1541
1692
|
told the same. A tone left out is not read. */
|
|
1542
1693
|
toneLabels?: (HelixHeadlessCanvas["toneLabels"]) | undefined;
|
|
1694
|
+
/** What screen readers hear after a zoom button or key, with `{zoom}` for the
|
|
1695
|
+
zoom as a percentage, written the way the page's language writes one. */
|
|
1696
|
+
"zoomed-label"?: (HelixHeadlessCanvas["zoomedLabel"]) | undefined;
|
|
1697
|
+
/** What screen readers hear after a zoom button or key, with `{zoom}` for the
|
|
1698
|
+
zoom as a percentage, written the way the page's language writes one. */
|
|
1699
|
+
zoomedLabel?: (HelixHeadlessCanvas["zoomedLabel"]) | undefined;
|
|
1543
1700
|
/** The hint shown when a surface waiting to be pressed is scrolled or
|
|
1544
1701
|
swiped over, with `gestures="activate"`. Absent is the family's own. */
|
|
1545
1702
|
"activate-hint-label"?: (HelixHeadlessCanvas["activateHintLabel"]) | undefined;
|
|
@@ -2239,6 +2396,22 @@ export type HelixHeadlessChatHelixSendElementEvent =
|
|
|
2239
2396
|
HelixHeadlessChatElementEvent<HelixSendEvent>;
|
|
2240
2397
|
|
|
2241
2398
|
export type HelixHeadlessChatVueProps = {
|
|
2399
|
+
/** Declarations for the turns from `turns` by each author, keyed by `author`,
|
|
2400
|
+
as JSON in the attribute: `{"ada": "--chat-message-background-color: …"}`.
|
|
2401
|
+
|
|
2402
|
+
The message drawn for each turn by that author takes them as its `style`,
|
|
2403
|
+
so the custom properties a message reads, its fill, text color, radius and
|
|
2404
|
+
padding, change for that author alone. A turn by an author with no entry
|
|
2405
|
+
takes none, and looks as it did. JSON that does not parse is no entries. */
|
|
2406
|
+
"author-styles"?: (HelixHeadlessChat["authorStyles"]) | undefined;
|
|
2407
|
+
/** Declarations for the turns from `turns` by each author, keyed by `author`,
|
|
2408
|
+
as JSON in the attribute: `{"ada": "--chat-message-background-color: …"}`.
|
|
2409
|
+
|
|
2410
|
+
The message drawn for each turn by that author takes them as its `style`,
|
|
2411
|
+
so the custom properties a message reads, its fill, text color, radius and
|
|
2412
|
+
padding, change for that author alone. A turn by an author with no entry
|
|
2413
|
+
takes none, and looks as it did. JSON that does not parse is no entries. */
|
|
2414
|
+
authorStyles?: (HelixHeadlessChat["authorStyles"]) | undefined;
|
|
2242
2415
|
/** Whether the transcript opens pinned to the bottom, when `pinned` is not
|
|
2243
2416
|
set.
|
|
2244
2417
|
|
|
@@ -2615,11 +2788,19 @@ block lays out. Not for a diff, whose files each scroll on their own. */
|
|
|
2615
2788
|
"expand-label"?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
|
|
2616
2789
|
/** The expand button's words while the cap hides lines. */
|
|
2617
2790
|
expandLabel?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
|
|
2618
|
-
/** The block's name, usually a file name
|
|
2791
|
+
/** The block's name, usually a file name, drawn in the header.
|
|
2619
2792
|
|
|
2620
|
-
|
|
2621
|
-
|
|
2793
|
+
Absent, the block is named by `language` where there is one. In a diff,
|
|
2794
|
+
each file is named from the patch, and this names a patch that carries no
|
|
2795
|
+
name of its own. */
|
|
2622
2796
|
label?: (HelixHeadlessCodeBlock["label"]) | undefined;
|
|
2797
|
+
/** The language the code is written in, such as `ts` or `css`, handed to
|
|
2798
|
+
`highlight` as its second argument.
|
|
2799
|
+
|
|
2800
|
+
A block with no `label` is named by it, in the header and on the copy
|
|
2801
|
+
button, as a docs site names a snippet by its language. Absent hands
|
|
2802
|
+
`highlight` an empty string and names nothing. */
|
|
2803
|
+
language?: (HelixHeadlessCodeBlock["language"]) | undefined;
|
|
2623
2804
|
/** Whether the lines are numbered in a gutter beside the code.
|
|
2624
2805
|
|
|
2625
2806
|
The numbers are hidden from the accessibility tree and are not part of a
|
|
@@ -2683,15 +2864,24 @@ than defaulted, so the host carries no attribute the consumer did not write. */
|
|
|
2683
2864
|
/** Turns the code into highlighted markup, which the block draws in place of
|
|
2684
2865
|
the plain text.
|
|
2685
2866
|
|
|
2686
|
-
Called with the code as written and
|
|
2687
|
-
Shiki's `codeToHtml` or Prism's `highlight`.
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2867
|
+
Called with the code as written and the block's `language`, and returning
|
|
2868
|
+
HTML, such as the output of Shiki's `codeToHtml` or Prism's `highlight`.
|
|
2869
|
+
One function serves every block on a page, each block saying its own
|
|
2870
|
+
language:
|
|
2871
|
+
|
|
2872
|
+
```js
|
|
2873
|
+
for (const block of document.querySelectorAll('helix-code-block')) {
|
|
2874
|
+
block.highlight = (code, lang) => codeToHtml(code, { lang, theme: 'github-light' })
|
|
2875
|
+
}
|
|
2876
|
+
```
|
|
2877
|
+
|
|
2878
|
+
**The markup is drawn as given**, so it has to escape the code it was
|
|
2879
|
+
handed, which those highlighters do. A `<pre>` and `<code>` around the
|
|
2880
|
+
whole of it, which Shiki writes, are taken off, so the lines sit level
|
|
2881
|
+
with the gutter's numbers and the block keeps one tab stop. The code stays
|
|
2882
|
+
in the slot, so the copy button copies it as written and a reader without
|
|
2883
|
+
the script still has it. Not called on a server, which has no code to
|
|
2884
|
+
read, nor for a diff. */
|
|
2695
2885
|
highlight?: (HelixHeadlessCodeBlock["highlight"]) | undefined;
|
|
2696
2886
|
};
|
|
2697
2887
|
|
|
@@ -2797,6 +2987,9 @@ The trade is real and is the reason this is not the default: a swatch cannot
|
|
|
2797
2987
|
be read or pasted into without opening the panel, which is worse for a form
|
|
2798
2988
|
where the color is the answer rather than a setting. */
|
|
2799
2989
|
variant?: (HelixHeadlessColorInput["variant"]) | undefined;
|
|
2990
|
+
/** Draws the panel's hue as a wheel around the square, in place of the hue
|
|
2991
|
+
ramp. See Color Picker's `wheel`. */
|
|
2992
|
+
wheel?: (HelixHeadlessColorInput["wheel"]) | undefined;
|
|
2800
2993
|
/** The message shown when the field holds text the picker cannot read as a
|
|
2801
2994
|
date, a time, or a color.
|
|
2802
2995
|
|
|
@@ -3025,13 +3218,6 @@ the color. */
|
|
|
3025
3218
|
"eyedropper-label"?: (HelixHeadlessColorPicker["eyedropperLabel"]) | undefined;
|
|
3026
3219
|
/** What the eyedropper is called. */
|
|
3027
3220
|
eyedropperLabel?: (HelixHeadlessColorPicker["eyedropperLabel"]) | undefined;
|
|
3028
|
-
/** A message under the picker, such as what is wrong with the color.
|
|
3029
|
-
|
|
3030
|
-
While set, the picker is invalid and does not submit, as a field's
|
|
3031
|
-
`feedback` is, and the square and the value text are described by it.
|
|
3032
|
-
Color Input shows its own message here, so a reader in the open panel
|
|
3033
|
-
still sees it. */
|
|
3034
|
-
feedback?: (HelixHeadlessColorPicker["feedback"]) | undefined;
|
|
3035
3221
|
/** The syntax the value is written in: `hex`, `rgb`, or `hsl`.
|
|
3036
3222
|
|
|
3037
3223
|
Only what is written. Everything is read whatever this says, so a picker on
|
|
@@ -3049,14 +3235,6 @@ Only what is written. Everything is read whatever this says, so a picker on
|
|
|
3049
3235
|
"hue-label"?: (HelixHeadlessColorPicker["hueLabel"]) | undefined;
|
|
3050
3236
|
/** What the hue channel is called. */
|
|
3051
3237
|
hueLabel?: (HelixHeadlessColorPicker["hueLabel"]) | undefined;
|
|
3052
|
-
/** Whether the current selection fails validation.
|
|
3053
|
-
|
|
3054
|
-
A flag rather than a message, the split Date Picker also draws. A flat
|
|
3055
|
-
picker has no room of its own for a sentence: the field that wraps one owns
|
|
3056
|
-
the label, the hint and the feedback, and a second message inside the panel
|
|
3057
|
-
would be the same error said twice. What is left for the picker is the one
|
|
3058
|
-
thing the field cannot draw from outside, the mark on the answer itself. */
|
|
3059
|
-
invalid?: (HelixHeadlessColorPicker["invalid"]) | undefined;
|
|
3060
3238
|
/** What the lightness channel's field is called, in `channel-fields` with
|
|
3061
3239
|
hsl. */
|
|
3062
3240
|
"lightness-label"?: (HelixHeadlessColorPicker["lightnessLabel"]) | undefined;
|
|
@@ -3210,6 +3388,27 @@ speaks it. Absent is the control's own sentence, in English. */
|
|
|
3210
3388
|
named for the validity flag it reports, so a form in another language
|
|
3211
3389
|
speaks it. Absent is the control's own sentence, in English. */
|
|
3212
3390
|
valueMissingMessage?: (HelixHeadlessColorPicker["valueMissingMessage"]) | undefined;
|
|
3391
|
+
/** Draws the hue as a wheel around the square, in place of the hue ramp, as
|
|
3392
|
+
React Aria's ColorWheel sits round its ColorArea.
|
|
3393
|
+
|
|
3394
|
+
The ring is one stop, a slider a reader turns with the arrow keys, Home
|
|
3395
|
+
and End, the same way round in either writing direction, and a press or a
|
|
3396
|
+
drag on it takes the hue in that direction. Off, the picker keeps its
|
|
3397
|
+
ramp. */
|
|
3398
|
+
wheel?: (HelixHeadlessColorPicker["wheel"]) | undefined;
|
|
3399
|
+
/** A message under the picker, such as what is wrong with the answer.
|
|
3400
|
+
|
|
3401
|
+
While set, the picker is invalid and does not submit, as a field's
|
|
3402
|
+
`feedback` is, it is marked invalid to a reader and to CSS, and the
|
|
3403
|
+
controls a reader answers with are described by it. */
|
|
3404
|
+
feedback?: (HelixHeadlessColorPicker["feedback"]) | undefined;
|
|
3405
|
+
/** Whether the answer fails validation, marked on the controls a reader
|
|
3406
|
+
answers with and as `:state(invalid)`.
|
|
3407
|
+
|
|
3408
|
+
A flag a field that wraps the picker sets, since that field owns the
|
|
3409
|
+
label, the hint and the message; on its own, `feedback` both marks the
|
|
3410
|
+
picker and says why. */
|
|
3411
|
+
invalid?: (HelixHeadlessColorPicker["invalid"]) | undefined;
|
|
3213
3412
|
/** The value the control starts with. A form reset returns it to this value,
|
|
3214
3413
|
and to the `value` attribute where this one is not written, as a native
|
|
3215
3414
|
control resets to the `value` it declares. */
|
|
@@ -3314,12 +3513,19 @@ leaves the field or presses Enter with nothing highlighted, and text that
|
|
|
3314
3513
|
names an option takes that option. Unlike `creatable`, no event asks
|
|
3315
3514
|
first and no option is expected to be added: the value is the text. */
|
|
3316
3515
|
allowsCustomValue?: (HelixHeadlessCombobox["allowsCustomValue"]) | undefined;
|
|
3317
|
-
/** What the browser may autofill
|
|
3516
|
+
/** What the browser may autofill, as a platform token such as `country`.
|
|
3318
3517
|
|
|
3319
3518
|
**Defaults to `off`, which is not the platform's default and is the
|
|
3320
3519
|
point.** The field filters a list rather than collecting a value, so a
|
|
3321
3520
|
browser offering to fill it with a saved address is competing for the same
|
|
3322
|
-
keystrokes as the listbox. A consumer who wants autofill can still ask.
|
|
3521
|
+
keystrokes as the listbox. A consumer who wants autofill can still ask.
|
|
3522
|
+
|
|
3523
|
+
Set, a combobox whose answer is one of its options keeps a hidden native
|
|
3524
|
+
`<select>` with the same options for the browser to fill, as React Aria's
|
|
3525
|
+
combobox and Select do, and the option the browser picks, by its value or
|
|
3526
|
+
its words, becomes the value. The text field itself stays `off`, so the
|
|
3527
|
+
browser fills the answer and not the filter. With `allows-custom-value`
|
|
3528
|
+
the token goes on the text field, whose words are the answer. */
|
|
3323
3529
|
autocomplete?: (HelixHeadlessCombobox["autocomplete"]) | undefined;
|
|
3324
3530
|
/** Whether the user can add a value that is not in the list.
|
|
3325
3531
|
|
|
@@ -3358,12 +3564,14 @@ every keystroke. See Listbox's `filter-delay`. */
|
|
|
3358
3564
|
/** The list's name, read by screen readers. The list has no visible name. */
|
|
3359
3565
|
listLabel?: (HelixHeadlessCombobox["listLabel"]) | undefined;
|
|
3360
3566
|
/** What the list says when its options could not be loaded, such as after a
|
|
3361
|
-
request to a server fails. Empty
|
|
3362
|
-
|
|
3567
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
3568
|
+
removing the attribute clears it. Passed to the list, which shows it
|
|
3569
|
+
under any options there are and tells screen readers. */
|
|
3363
3570
|
"load-error"?: (HelixHeadlessCombobox["loadError"]) | undefined;
|
|
3364
3571
|
/** What the list says when its options could not be loaded, such as after a
|
|
3365
|
-
request to a server fails. Empty
|
|
3366
|
-
|
|
3572
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
3573
|
+
removing the attribute clears it. Passed to the list, which shows it
|
|
3574
|
+
under any options there are and tells screen readers. */
|
|
3367
3575
|
loadError?: (HelixHeadlessCombobox["loadError"]) | undefined;
|
|
3368
3576
|
/** Whether the options are still loading.
|
|
3369
3577
|
|
|
@@ -3446,6 +3654,12 @@ two. */
|
|
|
3446
3654
|
options. `{count}` is the count, and `Intl.PluralRules` picks between the
|
|
3447
3655
|
two. */
|
|
3448
3656
|
resultsLabel?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
|
|
3657
|
+
/** What VoiceOver hears for a chosen option, as the highlight reaches it and
|
|
3658
|
+
once it is chosen, on Apple devices. `{name}` is the option's words. */
|
|
3659
|
+
"selected-label"?: (HelixHeadlessCombobox["selectedLabel"]) | undefined;
|
|
3660
|
+
/** What VoiceOver hears for a chosen option, as the highlight reaches it and
|
|
3661
|
+
once it is chosen, on Apple devices. `{name}` is the option's words. */
|
|
3662
|
+
selectedLabel?: (HelixHeadlessCombobox["selectedLabel"]) | undefined;
|
|
3449
3663
|
/** Whether the field completes the word as the user types.
|
|
3450
3664
|
|
|
3451
3665
|
`suggest` rather than `autocomplete`, which is a real HTML attribute this
|
|
@@ -3624,7 +3838,9 @@ so a palette filtered on a server sends one `helix-filter` for a word.
|
|
|
3624
3838
|
so a palette filtered on a server sends one `helix-filter` for a word.
|
|
3625
3839
|
`0` filters on every keystroke. See Listbox's `filter-delay`. */
|
|
3626
3840
|
filterDelay?: (HelixHeadlessCommand["filterDelay"]) | undefined;
|
|
3627
|
-
/** The key that opens the palette, written as `mod+k`, `shift+p`, or `k
|
|
3841
|
+
/** The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,
|
|
3842
|
+
in Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,
|
|
3843
|
+
`alt` and `shift` the keys they name.
|
|
3628
3844
|
|
|
3629
3845
|
Empty turns it off, for a consumer who opens the palette from a button or
|
|
3630
3846
|
from their own shortcut handler. There is no list of defaults to fight
|
|
@@ -3633,12 +3849,14 @@ with: one key, said once. */
|
|
|
3633
3849
|
/** Accessible name for the overlay, which has no visible heading. */
|
|
3634
3850
|
label?: (HelixHeadlessCommand["label"]) | undefined;
|
|
3635
3851
|
/** What the list says when its commands could not be loaded, such as after a
|
|
3636
|
-
request to a server fails. Empty
|
|
3637
|
-
|
|
3852
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
3853
|
+
removing the attribute clears it. Passed to the list, which shows it
|
|
3854
|
+
under any commands there are and tells screen readers. */
|
|
3638
3855
|
"load-error"?: (HelixHeadlessCommand["loadError"]) | undefined;
|
|
3639
3856
|
/** What the list says when its commands could not be loaded, such as after a
|
|
3640
|
-
request to a server fails. Empty
|
|
3641
|
-
|
|
3857
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
3858
|
+
removing the attribute clears it. Passed to the list, which shows it
|
|
3859
|
+
under any commands there are and tells screen readers. */
|
|
3642
3860
|
loadError?: (HelixHeadlessCommand["loadError"]) | undefined;
|
|
3643
3861
|
/** Whether the commands are still loading, for a palette that asks a server
|
|
3644
3862
|
for them as the user types.
|
|
@@ -4299,7 +4517,11 @@ Saturday.
|
|
|
4299
4517
|
Absent follows `locale`, where the engine knows the week of that language,
|
|
4300
4518
|
and is Sunday otherwise. */
|
|
4301
4519
|
firstDayOfWeek?: (HelixHeadlessDateInput["firstDayOfWeek"]) | undefined;
|
|
4302
|
-
/** The language tag for the
|
|
4520
|
+
/** The language tag for the field's order and words, and for the names of
|
|
4521
|
+
months and days in the calendar.
|
|
4522
|
+
|
|
4523
|
+
Absent is the page's: the `lang` of the nearest element with one, as
|
|
4524
|
+
Shoelace and Web Awesome read it, then the runtime's own. */
|
|
4303
4525
|
locale?: (HelixHeadlessDateInput["locale"]) | undefined;
|
|
4304
4526
|
/** The latest date that can be chosen, as `YYYY-MM-DD`. */
|
|
4305
4527
|
max?: (HelixHeadlessDateInput["max"]) | undefined;
|
|
@@ -4665,13 +4887,12 @@ Absent follows `locale`, where the engine knows the week of that language
|
|
|
4665
4887
|
Absent follows `locale`, where the engine knows the week of that language
|
|
4666
4888
|
(Firefox does not), and is Sunday otherwise. */
|
|
4667
4889
|
firstDayOfWeek?: (HelixHeadlessDatePicker["firstDayOfWeek"]) | undefined;
|
|
4668
|
-
/** Whether the current selection fails validation. */
|
|
4669
|
-
invalid?: (HelixHeadlessDatePicker["invalid"]) | undefined;
|
|
4670
4890
|
/** Accessible name for the grid. */
|
|
4671
4891
|
label?: (HelixHeadlessDatePicker["label"]) | undefined;
|
|
4672
|
-
/** Locale for month and day names.
|
|
4892
|
+
/** Locale for month and day names, and the day a week starts on.
|
|
4673
4893
|
|
|
4674
|
-
Absent
|
|
4894
|
+
Absent is the page's: the `lang` of the nearest element with one, as
|
|
4895
|
+
Shoelace and Web Awesome read it, then the runtime's own. */
|
|
4675
4896
|
locale?: (HelixHeadlessDatePicker["locale"]) | undefined;
|
|
4676
4897
|
/** Latest selectable date, as `YYYY-MM-DD`. */
|
|
4677
4898
|
max?: (HelixHeadlessDatePicker["max"]) | undefined;
|
|
@@ -4821,6 +5042,19 @@ filled in as the year on show. */
|
|
|
4821
5042
|
/** The name of the heading where it shows a page of years, with `{heading}`
|
|
4822
5043
|
filled in as the year on show. */
|
|
4823
5044
|
yearViewLabel?: (HelixHeadlessDatePicker["yearViewLabel"]) | undefined;
|
|
5045
|
+
/** A message under the picker, such as what is wrong with the answer.
|
|
5046
|
+
|
|
5047
|
+
While set, the picker is invalid and does not submit, as a field's
|
|
5048
|
+
`feedback` is, it is marked invalid to a reader and to CSS, and the
|
|
5049
|
+
controls a reader answers with are described by it. */
|
|
5050
|
+
feedback?: (HelixHeadlessDatePicker["feedback"]) | undefined;
|
|
5051
|
+
/** Whether the answer fails validation, marked on the controls a reader
|
|
5052
|
+
answers with and as `:state(invalid)`.
|
|
5053
|
+
|
|
5054
|
+
A flag a field that wraps the picker sets, since that field owns the
|
|
5055
|
+
label, the hint and the message; on its own, `feedback` both marks the
|
|
5056
|
+
picker and says why. */
|
|
5057
|
+
invalid?: (HelixHeadlessDatePicker["invalid"]) | undefined;
|
|
4824
5058
|
/** The value the control starts with. A form reset returns it to this value,
|
|
4825
5059
|
and to the `value` attribute where this one is not written, as a native
|
|
4826
5060
|
control resets to the `value` it declares. */
|
|
@@ -4914,6 +5148,10 @@ The fallback of the `label` slot, so slotted content replaces it rather than
|
|
|
4914
5148
|
appearing beside it. The value itself is the default slot: it is the half
|
|
4915
5149
|
that varies and is often more than text. */
|
|
4916
5150
|
label?: (HelixHeadlessDescriptionListItem["label"]) | undefined;
|
|
5151
|
+
/** Says the values are several `<dd>` elements of your own, so the item
|
|
5152
|
+
draws no `<dd>` of its own around them, on the server too. Without it the
|
|
5153
|
+
item finds them once it runs, and the served markup wraps them until then. */
|
|
5154
|
+
several?: (HelixHeadlessDescriptionListItem["several"]) | undefined;
|
|
4917
5155
|
};
|
|
4918
5156
|
|
|
4919
5157
|
export type HelixHeadlessDescriptionListItemVueEvents = {};
|
|
@@ -5054,20 +5292,23 @@ export type HelixHeadlessDialogVueEvents = {
|
|
|
5054
5292
|
};
|
|
5055
5293
|
|
|
5056
5294
|
export type HelixHeadlessDividerVueProps = {
|
|
5057
|
-
/** Whether screen readers announce the line as a separator
|
|
5058
|
-
|
|
5059
|
-
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
5063
|
-
|
|
5064
|
-
An opt-in, not a `decorative` opt-out, because a boolean attribute cannot
|
|
5065
|
-
be turned off: `decorative="false"` parses as `true`, which would put the
|
|
5066
|
-
quiet default out of reach from HTML and leave it settable only as a
|
|
5067
|
-
property. An opt-in is absent by default, which every reflected property
|
|
5068
|
-
here has to be. */
|
|
5295
|
+
/** Whether screen readers announce the line as a separator, which they now do
|
|
5296
|
+
by default.
|
|
5297
|
+
|
|
5298
|
+
It dates from when the line was decorative by default. It is still read,
|
|
5299
|
+
and it wins over `decorative`, so a divider written with it stays a
|
|
5300
|
+
separator. */
|
|
5069
5301
|
announced?: (HelixHeadlessDivider["announced"]) | undefined;
|
|
5070
|
-
/**
|
|
5302
|
+
/** Takes the line out of the accessibility tree, for a rule that separates
|
|
5303
|
+
nothing: one under a heading, or between the facts of a byline.
|
|
5304
|
+
|
|
5305
|
+
Absent, the line is a separator, as `<hr>` is. Radix Separator's opt-out
|
|
5306
|
+
has the same name. It turns the role off because a boolean attribute that
|
|
5307
|
+
is on by default cannot be turned off from HTML. */
|
|
5308
|
+
decorative?: (HelixHeadlessDivider["decorative"]) | undefined;
|
|
5309
|
+
/** The direction the line runs: `horizontal` or `vertical`.
|
|
5310
|
+
|
|
5311
|
+
Unset is horizontal, or across the toolbar the divider sits in. */
|
|
5071
5312
|
orientation?: (HelixHeadlessDivider["orientation"]) | undefined;
|
|
5072
5313
|
};
|
|
5073
5314
|
|
|
@@ -5387,6 +5628,21 @@ export type HelixHeadlessDrilldownVueEvents = {
|
|
|
5387
5628
|
};
|
|
5388
5629
|
|
|
5389
5630
|
export type HelixHeadlessEmptyVueProps = {
|
|
5631
|
+
/** The heading as words, such as "No results", drawn as a heading when
|
|
5632
|
+
nothing is slotted into `heading`.
|
|
5633
|
+
|
|
5634
|
+
Absent draws none, and the `heading` slot is the only heading. */
|
|
5635
|
+
heading?: (HelixHeadlessEmpty["heading"]) | undefined;
|
|
5636
|
+
/** The level of the heading `heading` draws, from 1 to 6.
|
|
5637
|
+
|
|
5638
|
+
Absent is 3, the level of a heading inside a page's section. Set it to fit
|
|
5639
|
+
the outline the empty view sits in. A slotted heading keeps its own. */
|
|
5640
|
+
"heading-level"?: (HelixHeadlessEmpty["headingLevel"] | `${number}`) | undefined;
|
|
5641
|
+
/** The level of the heading `heading` draws, from 1 to 6.
|
|
5642
|
+
|
|
5643
|
+
Absent is 3, the level of a heading inside a page's section. Set it to fit
|
|
5644
|
+
the outline the empty view sits in. A slotted heading keeps its own. */
|
|
5645
|
+
headingLevel?: (HelixHeadlessEmpty["headingLevel"]) | undefined;
|
|
5390
5646
|
/** Whether the state is announced when it appears.
|
|
5391
5647
|
|
|
5392
5648
|
On by default: an empty view almost always replaces something that was
|
|
@@ -5448,6 +5704,12 @@ refused. */
|
|
|
5448
5704
|
maxFileSize?: (HelixHeadlessFileInput["maxFileSize"]) | undefined;
|
|
5449
5705
|
/** Whether more than one file can be chosen. */
|
|
5450
5706
|
multiple?: (HelixHeadlessFileInput["multiple"]) | undefined;
|
|
5707
|
+
/** The name of a file's progress bar, read by screen readers, with `{name}`
|
|
5708
|
+
filled in. A label with no `{name}` has it added after it. */
|
|
5709
|
+
"progress-label"?: (HelixHeadlessFileInput["progressLabel"]) | undefined;
|
|
5710
|
+
/** The name of a file's progress bar, read by screen readers, with `{name}`
|
|
5711
|
+
filled in. A label with no `{name}` has it added after it. */
|
|
5712
|
+
progressLabel?: (HelixHeadlessFileInput["progressLabel"]) | undefined;
|
|
5451
5713
|
/** What a reader hears when files are refused, with `{count}` and `{names}`
|
|
5452
5714
|
filled in. */
|
|
5453
5715
|
"rejected-text"?: (HelixHeadlessFileInput["rejectedText"]) | undefined;
|
|
@@ -5947,6 +6209,25 @@ few characters and a date is not. */
|
|
|
5947
6209
|
elapsed?: (HelixHeadlessFormatDate["elapsed"]) | undefined;
|
|
5948
6210
|
/** How the era is written, such as AD, where a date is shown. */
|
|
5949
6211
|
era?: (HelixHeadlessFormatDate["era"]) | undefined;
|
|
6212
|
+
/** Draws each field of a date in a part of its own: `weekday`, `day`,
|
|
6213
|
+
`month`, `year`, `era`, `hour`, `minute`, `second`, `day-period` and
|
|
6214
|
+
`time-zone-name`, so `::part(year)` can set the year apart.
|
|
6215
|
+
|
|
6216
|
+
Off by default, which draws the date as one run of text, as Shoelace and
|
|
6217
|
+
Web Awesome do. An `elapsed` or `relative` reading is one phrase either
|
|
6218
|
+
way. */
|
|
6219
|
+
fields?: (HelixHeadlessFormatDate["fields"]) | undefined;
|
|
6220
|
+
/** Draws an `elapsed` or `relative` reading once and leaves it, where it
|
|
6221
|
+
would otherwise move on as it goes stale.
|
|
6222
|
+
|
|
6223
|
+
For a reading that describes a moment the page itself is about, such as
|
|
6224
|
+
"3 hours ago" in a report generated then, or a list a reader compares
|
|
6225
|
+
line by line while it should not change under them. The reading is taken
|
|
6226
|
+
when the element draws, and again whenever `date` or another option
|
|
6227
|
+
changes. Turned off, the reading catches up and moves on again.
|
|
6228
|
+
`sl-relative-time` and `wa-relative-time` keep still unless `sync` is
|
|
6229
|
+
set; this keeps moving unless `frozen` is. */
|
|
6230
|
+
frozen?: (HelixHeadlessFormatDate["frozen"]) | undefined;
|
|
5950
6231
|
/** How the hour is written, where a time of day is shown. */
|
|
5951
6232
|
hour?: (HelixHeadlessFormatDate["hour"]) | undefined;
|
|
5952
6233
|
/** The clock a time of day is written on: `h12` or `h11` for twelve hours,
|
|
@@ -5963,7 +6244,8 @@ reader the same clock whatever their language. */
|
|
|
5963
6244
|
hourCycle?: (HelixHeadlessFormatDate["hourCycle"]) | undefined;
|
|
5964
6245
|
/** The locale to format the timestamp in.
|
|
5965
6246
|
|
|
5966
|
-
|
|
6247
|
+
Absent is the page's: the `lang` of the nearest element with one, as
|
|
6248
|
+
Shoelace and Web Awesome read it, then the runtime's own. */
|
|
5967
6249
|
locale?: (HelixHeadlessFormatDate["locale"]) | undefined;
|
|
5968
6250
|
/** How the minute is written, where a time of day is shown. */
|
|
5969
6251
|
minute?: (HelixHeadlessFormatDate["minute"]) | undefined;
|
|
@@ -6315,6 +6597,9 @@ export type HelixHeadlessHeatmapElementEvent<E = Event> = TypedEvent<
|
|
|
6315
6597
|
HelixHeadlessHeatmap,
|
|
6316
6598
|
E
|
|
6317
6599
|
>;
|
|
6600
|
+
/** `helix-before-change` event type */
|
|
6601
|
+
export type HelixHeadlessHeatmapHelixBeforeChangeElementEvent =
|
|
6602
|
+
HelixHeadlessHeatmapElementEvent<HelixBeforeChangeEvent>;
|
|
6318
6603
|
/** `helix-resize` event type */
|
|
6319
6604
|
export type HelixHeadlessHeatmapHelixResizeElementEvent =
|
|
6320
6605
|
HelixHeadlessHeatmapElementEvent<HelixResizeEvent>;
|
|
@@ -6381,6 +6666,28 @@ calendar heatmap does: a week is a column, so the strip reads along the
|
|
|
6381
6666
|
line in weeks, from the right on a right-to-left page, and top to bottom in
|
|
6382
6667
|
days. */
|
|
6383
6668
|
rows?: (HelixHeadlessHeatmap["rows"]) | undefined;
|
|
6669
|
+
/** What the readout adds for a selected cell, under `selection-mode`, after
|
|
6670
|
+
where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
|
|
6671
|
+
nothing. */
|
|
6672
|
+
"selected-label"?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
|
|
6673
|
+
/** What the readout adds for a selected cell, under `selection-mode`, after
|
|
6674
|
+
where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
|
|
6675
|
+
nothing. */
|
|
6676
|
+
selectedLabel?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
|
|
6677
|
+
/** What the `selection` part says after the selection changes, with `{count}` for
|
|
6678
|
+
how many cells are selected. */
|
|
6679
|
+
"selection-label"?: (HelixHeadlessHeatmap["selectionLabel"]) | undefined;
|
|
6680
|
+
/** What the `selection` part says after the selection changes, with `{count}` for
|
|
6681
|
+
how many cells are selected. */
|
|
6682
|
+
selectionLabel?: (HelixHeadlessHeatmap["selectionLabel"]) | undefined;
|
|
6683
|
+
/** How many cells a reader can select: `single` or `multiple`.
|
|
6684
|
+
|
|
6685
|
+
Absent selects nothing, and a press or Space does what it did. */
|
|
6686
|
+
"selection-mode"?: (HelixHeadlessHeatmap["selectionMode"]) | undefined;
|
|
6687
|
+
/** How many cells a reader can select: `single` or `multiple`.
|
|
6688
|
+
|
|
6689
|
+
Absent selects nothing, and a press or Space does what it did. */
|
|
6690
|
+
selectionMode?: (HelixHeadlessHeatmap["selectionMode"]) | undefined;
|
|
6384
6691
|
/** Lower bounds for the tone buckets, in the order the tones are given.
|
|
6385
6692
|
|
|
6386
6693
|
`thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
|
|
@@ -6403,6 +6710,12 @@ no order in it. */
|
|
|
6403
6710
|
"total-label"?: (HelixHeadlessHeatmap["totalLabel"]) | undefined;
|
|
6404
6711
|
/** The word the `overview` puts before the total of the readings drawn. */
|
|
6405
6712
|
totalLabel?: (HelixHeadlessHeatmap["totalLabel"]) | undefined;
|
|
6713
|
+
/** The selected cells, by the names their rows have in the table, such as
|
|
6714
|
+
`2026-06-11`, separated by commas.
|
|
6715
|
+
|
|
6716
|
+
Set it to start with cells selected. Written by a press or a key under
|
|
6717
|
+
`selection-mode`. */
|
|
6718
|
+
value?: (HelixHeadlessHeatmap["value"]) | undefined;
|
|
6406
6719
|
/** The id of the table to read.
|
|
6407
6720
|
|
|
6408
6721
|
Names a table in the same tree, so a chart inside another component's
|
|
@@ -6442,6 +6755,10 @@ legend hid is not counted. */
|
|
|
6442
6755
|
};
|
|
6443
6756
|
|
|
6444
6757
|
export type HelixHeadlessHeatmapVueEvents = {
|
|
6758
|
+
/** Fired once a press or a key has changed which cells are selected. */
|
|
6759
|
+
change: HelixHeadlessHeatmapElementEvent;
|
|
6760
|
+
/** Fired before a press or a key changes which cells are selected, with the `value` it would leave. Cancelable. */
|
|
6761
|
+
"helix-before-change": HelixHeadlessHeatmapHelixBeforeChangeElementEvent;
|
|
6445
6762
|
/** Fired when the number of cells drawn changes, with the new number. */
|
|
6446
6763
|
"helix-resize": HelixHeadlessHeatmapHelixResizeElementEvent;
|
|
6447
6764
|
};
|
|
@@ -6478,33 +6795,23 @@ is the platform's `commandfor`. */
|
|
|
6478
6795
|
commandFor?: (HelixHeadlessIconButton["commandFor"]) | undefined;
|
|
6479
6796
|
/** Where this button's submission goes, overriding the form's own.
|
|
6480
6797
|
|
|
6481
|
-
**The five `form*` overrides
|
|
6482
|
-
|
|
6483
|
-
|
|
6484
|
-
|
|
6485
|
-
|
|
6486
|
-
|
|
6487
|
-
|
|
6488
|
-
|
|
6489
|
-
The whole submit algorithm runs synchronously inside `requestSubmit()`, so
|
|
6490
|
-
the window is one call and a `finally` closes it whether or not a listener
|
|
6491
|
-
refused. What a `submit` handler observes during that window is the form a
|
|
6492
|
-
native submitter would have given it, which is the point. */
|
|
6798
|
+
**The five `form*` overrides ride on a native submit button that stands in
|
|
6799
|
+
for this one**, because `requestSubmit(submitter)` refuses the inner
|
|
6800
|
+
`<button>` twice over: it is `type="button"`, and it sits in this shadow
|
|
6801
|
+
root, so its form owner is not the consumer's form. The stand-in is a
|
|
6802
|
+
hidden `<button type="submit">` in the form for the one synchronous call,
|
|
6803
|
+
so the platform applies the overrides to that submission alone and leaves
|
|
6804
|
+
the form as it was. See `submitAs`. */
|
|
6493
6805
|
formaction?: (HelixHeadlessIconButton["formAction"]) | undefined;
|
|
6494
6806
|
/** Where this button's submission goes, overriding the form's own.
|
|
6495
6807
|
|
|
6496
|
-
**The five `form*` overrides
|
|
6497
|
-
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
The whole submit algorithm runs synchronously inside `requestSubmit()`, so
|
|
6505
|
-
the window is one call and a `finally` closes it whether or not a listener
|
|
6506
|
-
refused. What a `submit` handler observes during that window is the form a
|
|
6507
|
-
native submitter would have given it, which is the point. */
|
|
6808
|
+
**The five `form*` overrides ride on a native submit button that stands in
|
|
6809
|
+
for this one**, because `requestSubmit(submitter)` refuses the inner
|
|
6810
|
+
`<button>` twice over: it is `type="button"`, and it sits in this shadow
|
|
6811
|
+
root, so its form owner is not the consumer's form. The stand-in is a
|
|
6812
|
+
hidden `<button type="submit">` in the form for the one synchronous call,
|
|
6813
|
+
so the platform applies the overrides to that submission alone and leaves
|
|
6814
|
+
the form as it was. See `submitAs`. */
|
|
6508
6815
|
formAction?: (HelixHeadlessIconButton["formAction"]) | undefined;
|
|
6509
6816
|
/** How the submission is encoded, overriding the form's own. */
|
|
6510
6817
|
formenctype?: (HelixHeadlessIconButton["formEnctype"]) | undefined;
|
|
@@ -6550,13 +6857,10 @@ a press, so focus stays where the reader left it. */
|
|
|
6550
6857
|
/** The value this button submits under its own `name`, as a native submit
|
|
6551
6858
|
button does.
|
|
6552
6859
|
|
|
6553
|
-
**
|
|
6860
|
+
**Sent with exactly the submission this button starts and not otherwise.**
|
|
6554
6861
|
A native submit button contributes `name=value` only when it is the one
|
|
6555
|
-
that submitted, and every other button on the form contributes nothing
|
|
6556
|
-
|
|
6557
|
-
every submission whoever started it, which is a different feature wearing
|
|
6558
|
-
the same name, so `submit` below sets it, submits, and clears it inside one
|
|
6559
|
-
synchronous call.
|
|
6862
|
+
that submitted, and every other button on the form contributes nothing,
|
|
6863
|
+
which is what the native button standing in for this one at submit does.
|
|
6560
6864
|
|
|
6561
6865
|
`CopyButton` has a `value` of its own meaning the text to put on the
|
|
6562
6866
|
clipboard, which is not this and is why it is declared there rather than
|
|
@@ -6789,7 +7093,12 @@ the *first* update mirrors to a custom state instead, which is what
|
|
|
6789
7093
|
`:state(open)` and `:state(checked)` are.
|
|
6790
7094
|
|
|
6791
7095
|
`loading` writes nothing, because it is where every image starts and the
|
|
6792
|
-
resting state of a mirror is the attribute's absence.
|
|
7096
|
+
resting state of a mirror is the attribute's absence.
|
|
7097
|
+
|
|
7098
|
+
**Kept beside the custom states, and what the styled tier draws from.** An
|
|
7099
|
+
engine without `CustomStateSet`, Safari before 17.4 and Firefox before
|
|
7100
|
+
126, records no state, and a picture faded in by `:state(loaded)` alone
|
|
7101
|
+
would stay transparent there for good. A sheet of your own can read either. */
|
|
6793
7102
|
status?: (HelixHeadlessImage["status"]) | undefined;
|
|
6794
7103
|
};
|
|
6795
7104
|
|
|
@@ -7037,6 +7346,13 @@ export type HelixHeadlessKbdHelixShortcutElementEvent =
|
|
|
7037
7346
|
HelixHeadlessKbdElementEvent<HelixShortcutEvent>;
|
|
7038
7347
|
|
|
7039
7348
|
export type HelixHeadlessKbdVueProps = {
|
|
7349
|
+
/** What the chord does to the control `for` names once it is pressed:
|
|
7350
|
+
`focus` moves focus to the control and `click` presses it.
|
|
7351
|
+
|
|
7352
|
+
Unset, the chord sends `helix-shortcut` and does nothing else, for a page
|
|
7353
|
+
that acts on the event itself. It acts only where `within` listens, after
|
|
7354
|
+
`helix-shortcut`, and not when a listener cancels that event. */
|
|
7355
|
+
activate?: (HelixHeadlessKbd["activate"]) | undefined;
|
|
7040
7356
|
/** Draws a chord under `keys` as one key per key, each a `key` part with a
|
|
7041
7357
|
`separator` part between two where the platform writes a `+`, as GitHub
|
|
7042
7358
|
and most docs draw `Ctrl` `K`.
|
|
@@ -7141,14 +7457,18 @@ shadow root reads a table in that root rather than one in the document.
|
|
|
7141
7457
|
|
|
7142
7458
|
Set it to start with series hidden. Every chart reading the same table
|
|
7143
7459
|
draws without them. Commas only, because a column's heading may hold a
|
|
7144
|
-
space. For a ring the names are the rows.
|
|
7460
|
+
space. For a ring the names are the rows. An array of names set on the
|
|
7461
|
+
property works too, as React sets `hiddenSeries={['Direct']}`; a toggle
|
|
7462
|
+
writes the list back as a string. */
|
|
7145
7463
|
"hidden-series"?: (HelixHeadlessLegend["hiddenSeries"]) | undefined;
|
|
7146
7464
|
/** The series hidden on the table, by name, separated by commas: what
|
|
7147
7465
|
`toggles` hides and shows.
|
|
7148
7466
|
|
|
7149
7467
|
Set it to start with series hidden. Every chart reading the same table
|
|
7150
7468
|
draws without them. Commas only, because a column's heading may hold a
|
|
7151
|
-
space. For a ring the names are the rows.
|
|
7469
|
+
space. For a ring the names are the rows. An array of names set on the
|
|
7470
|
+
property works too, as React sets `hiddenSeries={['Direct']}`; a toggle
|
|
7471
|
+
writes the list back as a string. */
|
|
7152
7472
|
hiddenSeries?: (HelixHeadlessLegend["hiddenSeries"]) | undefined;
|
|
7153
7473
|
/** The name of the list, which a screen reader announces before its entries.
|
|
7154
7474
|
|
|
@@ -7207,12 +7527,14 @@ export type HelixHeadlessLightboxToggleElementEvent =
|
|
|
7207
7527
|
HelixHeadlessLightboxElementEvent<ToggleEvent>;
|
|
7208
7528
|
|
|
7209
7529
|
export type HelixHeadlessLightboxVueProps = {
|
|
7210
|
-
/** Draws the viewer's own previous, next and close controls over the picture
|
|
7530
|
+
/** Draws the viewer's own previous, next and close controls over the picture,
|
|
7531
|
+
and zoom-out and zoom-in controls where `max-zoom` allows zooming.
|
|
7211
7532
|
|
|
7212
7533
|
Off by default, for a viewer whose chrome you compose in the `header` and
|
|
7213
7534
|
`footer` slots. The controls hide with the rest of the chrome while the
|
|
7214
|
-
reader is idle,
|
|
7215
|
-
either end of a set that does not `loop
|
|
7535
|
+
reader is idle, the previous and next ones say they are unavailable at
|
|
7536
|
+
either end of a set that does not `loop`, and the zoom ones at either end
|
|
7537
|
+
of the scale. */
|
|
7216
7538
|
controls?: (HelixHeadlessLightbox["controls"]) | undefined;
|
|
7217
7539
|
/** Draws the place of the shown item in the set over the picture, in the
|
|
7218
7540
|
words of `status-label`, such as "2 of 5". It hides with the controls while
|
|
@@ -7285,6 +7607,20 @@ Announced rather than only drawn, because the picture changing under a
|
|
|
7285
7607
|
reader who cannot see it is otherwise silent. A consumer who has their own
|
|
7286
7608
|
counter in the chrome can empty this and say it themselves. */
|
|
7287
7609
|
statusLabel?: (HelixHeadlessLightbox["statusLabel"]) | undefined;
|
|
7610
|
+
/** The zoom-in control's accessible name. */
|
|
7611
|
+
"zoom-in-label"?: (HelixHeadlessLightbox["zoomInLabel"]) | undefined;
|
|
7612
|
+
/** The zoom-in control's accessible name. */
|
|
7613
|
+
zoomInLabel?: (HelixHeadlessLightbox["zoomInLabel"]) | undefined;
|
|
7614
|
+
/** The zoom-out control's accessible name. */
|
|
7615
|
+
"zoom-out-label"?: (HelixHeadlessLightbox["zoomOutLabel"]) | undefined;
|
|
7616
|
+
/** The zoom-out control's accessible name. */
|
|
7617
|
+
zoomOutLabel?: (HelixHeadlessLightbox["zoomOutLabel"]) | undefined;
|
|
7618
|
+
/** What the live region says once a reader has stopped zooming, with the
|
|
7619
|
+
scale as a whole `{percent}` filled in. Empty it to say nothing. */
|
|
7620
|
+
"zoom-status-label"?: (HelixHeadlessLightbox["zoomStatusLabel"]) | undefined;
|
|
7621
|
+
/** What the live region says once a reader has stopped zooming, with the
|
|
7622
|
+
scale as a whole `{percent}` filled in. Empty it to say nothing. */
|
|
7623
|
+
zoomStatusLabel?: (HelixHeadlessLightbox["zoomStatusLabel"]) | undefined;
|
|
7288
7624
|
/** The `value` of the current item.
|
|
7289
7625
|
|
|
7290
7626
|
Not `option.active`, which is the option the keyboard is on: that is a
|
|
@@ -7369,6 +7705,13 @@ sum can pass under the curve fitted through the sum beneath it, so a
|
|
|
7369
7705
|
smoothed stack can draw a part as less than nothing. There is no such edge
|
|
7370
7706
|
here, which is what lets a line take the reading aid. */
|
|
7371
7707
|
curve?: (HelixHeadlessLineChart["curve"]) | undefined;
|
|
7708
|
+
/** The series drawn as a dashed line, by their headings, separated by
|
|
7709
|
+
commas: `dashed="Forecast, Target"`.
|
|
7710
|
+
|
|
7711
|
+
For a series that is not a reading, such as a forecast or a goal, drawn
|
|
7712
|
+
beside the ones that are. Each takes a `line-dashed` part beside `line`,
|
|
7713
|
+
which a stylesheet draws dashed. Absent, every line is solid. */
|
|
7714
|
+
dashed?: (HelixHeadlessLineChart["dashed"]) | undefined;
|
|
7372
7715
|
/** Which rules are drawn across the plot, if any.
|
|
7373
7716
|
|
|
7374
7717
|
Absent draws none, which is the honest default rather than a timid one: a
|
|
@@ -7631,12 +7974,16 @@ export type HelixHeadlessListboxHelixLoadMoreElementEvent =
|
|
|
7631
7974
|
HelixHeadlessListboxElementEvent<HelixLoadMoreEvent>;
|
|
7632
7975
|
|
|
7633
7976
|
export type HelixHeadlessListboxVueProps = {
|
|
7634
|
-
/** What
|
|
7977
|
+
/** What a browser's autofill may choose, as a platform token such as
|
|
7978
|
+
`country` or `cc-exp-month`, as a native `<select>` takes it.
|
|
7635
7979
|
|
|
7636
|
-
|
|
7637
|
-
|
|
7638
|
-
|
|
7639
|
-
|
|
7980
|
+
Set, the list draws a hidden native `<select>` with the same options for
|
|
7981
|
+
the browser to fill, as React Aria's `HiddenSelect` does, and a fill
|
|
7982
|
+
chooses the option. `off`, the default, draws none.
|
|
7983
|
+
|
|
7984
|
+
**The filter field is never filled.** It narrows the list rather than
|
|
7985
|
+
collecting a value, so a browser offering it a saved address competes
|
|
7986
|
+
with the reader for the same keystrokes: it is always `off`. */
|
|
7640
7987
|
autocomplete?: (HelixHeadlessListbox["autocomplete"]) | undefined;
|
|
7641
7988
|
/** The filter text the list starts with, when `filter` is not set. */
|
|
7642
7989
|
"default-filter"?: (HelixHeadlessListbox["defaultFilter"]) | undefined;
|
|
@@ -7690,14 +8037,27 @@ act on the list the reader expects. */
|
|
|
7690
8037
|
"filter-label"?: (HelixHeadlessListbox["filterLabel"]) | undefined;
|
|
7691
8038
|
/** Placeholder text for the filter field. */
|
|
7692
8039
|
filterLabel?: (HelixHeadlessListbox["filterLabel"]) | undefined;
|
|
8040
|
+
/** How the options are laid out, which the arrow keys follow: `stack`, one
|
|
8041
|
+
under another, or `grid`, in rows and columns, as React Aria's `ListBox`
|
|
8042
|
+
lays out cards or photos. With `grid`, Up and Down move within a column,
|
|
8043
|
+
and Left and Right along the list, mirrored right to left.
|
|
8044
|
+
|
|
8045
|
+
The columns are the stylesheet's: the styled tier draws them at
|
|
8046
|
+
`--listbox-column-min-inline-size` or wider, and a headless list lays out
|
|
8047
|
+
`::part(items)` as it likes, since the keys read where each option is
|
|
8048
|
+
drawn. A list of `items` stays a stack. Left out, the list is a stack,
|
|
8049
|
+
and the host carries no attribute for it. */
|
|
8050
|
+
layout?: (HelixHeadlessListbox["layout"]) | undefined;
|
|
7693
8051
|
/** What the list says when its options could not be loaded, such as after a
|
|
7694
|
-
request to a server fails. Empty is no error
|
|
8052
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
8053
|
+
removing the attribute clears it.
|
|
7695
8054
|
|
|
7696
8055
|
Set, it shows under any options there are, in place of `empty-text` and
|
|
7697
8056
|
`loading-text`, and a screen reader hears it. Clear it when you ask again. */
|
|
7698
8057
|
"load-error"?: (HelixHeadlessListbox["loadError"]) | undefined;
|
|
7699
8058
|
/** What the list says when its options could not be loaded, such as after a
|
|
7700
|
-
request to a server fails. Empty is no error
|
|
8059
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
8060
|
+
removing the attribute clears it.
|
|
7701
8061
|
|
|
7702
8062
|
Set, it shows under any options there are, in place of `empty-text` and
|
|
7703
8063
|
`loading-text`, and a screen reader hears it. Clear it when you ask again. */
|
|
@@ -7741,6 +8101,12 @@ options. `{count}` is the count.
|
|
|
7741
8101
|
pair: a language with more forms than two picks the one for its `one` and
|
|
7742
8102
|
writes the rest here. */
|
|
7743
8103
|
resultsLabel?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
|
|
8104
|
+
/** What VoiceOver hears as the highlight reaches a chosen option from the
|
|
8105
|
+
filter field, on Apple devices. `{name}` is the option's words. */
|
|
8106
|
+
"selected-label"?: (HelixHeadlessListbox["selectedLabel"]) | undefined;
|
|
8107
|
+
/** What VoiceOver hears as the highlight reaches a chosen option from the
|
|
8108
|
+
filter field, on Apple devices. `{name}` is the option's words. */
|
|
8109
|
+
selectedLabel?: (HelixHeadlessListbox["selectedLabel"]) | undefined;
|
|
7744
8110
|
/** Whether the rows are still loading.
|
|
7745
8111
|
|
|
7746
8112
|
Reflected, because a stylesheet needs it: the rows that are already there
|
|
@@ -7822,6 +8188,23 @@ imperatively later, and nothing is hydrating by then.
|
|
|
7822
8188
|
|
|
7823
8189
|
Here rather than on each control. */
|
|
7824
8190
|
name?: (HelixHeadlessListbox["name"]) | undefined;
|
|
8191
|
+
/** The options as data, for a list too long to draw whole: each a value,
|
|
8192
|
+
which is also its words, or a record with a `value`, a `label` and
|
|
8193
|
+
`disabled`. Set, the list draws only the options in sight, and the ones
|
|
8194
|
+
you write as children are not read.
|
|
8195
|
+
|
|
8196
|
+
**Every option is still reachable.** The keyboard, the typeahead, the
|
|
8197
|
+
filter and the value work over the whole set, and the option the keyboard
|
|
8198
|
+
is on is drawn wherever it is, so a screen reader is told about it. Each
|
|
8199
|
+
drawn option says its place in the set (`aria-posinset`, `aria-setsize`).
|
|
8200
|
+
React Aria virtualizes a `ListBox` with its `Virtualizer`; this is core's
|
|
8201
|
+
`VirtualizeController`.
|
|
8202
|
+
|
|
8203
|
+
**The list needs a height to scroll in**: the styled tier's
|
|
8204
|
+
`--listbox-max-block-size`, or a `max-block-size` on `::part(items)` in the
|
|
8205
|
+
headless tier. Import the Option family as well, whose elements are drawn.
|
|
8206
|
+
A server sends the list empty, and the options are drawn once it hydrates. */
|
|
8207
|
+
items?: (HelixHeadlessListbox["items"]) | undefined;
|
|
7825
8208
|
/** Which option is chosen, as an index, or `-1` where none is.
|
|
7826
8209
|
|
|
7827
8210
|
`<select>`'s own pair, and this control is what stands in for one. The
|
|
@@ -8903,6 +9286,15 @@ slot replaces it. */
|
|
|
8903
9286
|
|
|
8904
9287
|
export type HelixHeadlessMenuSectionVueEvents = {};
|
|
8905
9288
|
|
|
9289
|
+
/** `HelixHeadlessMeter` component event */
|
|
9290
|
+
export type HelixHeadlessMeterElementEvent<E = Event> = TypedEvent<
|
|
9291
|
+
HelixHeadlessMeter,
|
|
9292
|
+
E
|
|
9293
|
+
>;
|
|
9294
|
+
/** `helix-band` event type */
|
|
9295
|
+
export type HelixHeadlessMeterHelixBandElementEvent =
|
|
9296
|
+
HelixHeadlessMeterElementEvent<HelixBandEvent>;
|
|
9297
|
+
|
|
8906
9298
|
export type HelixHeadlessMeterVueProps = {
|
|
8907
9299
|
/** Sets the band directly, for a rule that `low`, `high`, and `optimum` cannot
|
|
8908
9300
|
express.
|
|
@@ -8932,6 +9324,16 @@ stylesheet outside as `indicator-good`, `-fair` or `-poor` among the fill's
|
|
|
8932
9324
|
part names, so reflecting here would write an attribute onto the host for
|
|
8933
9325
|
no reader. */
|
|
8934
9326
|
band?: (HelixHeadlessMeter["band"]) | undefined;
|
|
9327
|
+
/** The words each band is said with under `live`, by its name, written as
|
|
9328
|
+
JSON in the attribute: `band-labels='{"poor":"Almost full"}'`.
|
|
9329
|
+
|
|
9330
|
+
A band left out keeps its default: "Good", "Fair" or "Poor". */
|
|
9331
|
+
"band-labels"?: (HelixHeadlessMeter["bandLabels"]) | undefined;
|
|
9332
|
+
/** The words each band is said with under `live`, by its name, written as
|
|
9333
|
+
JSON in the attribute: `band-labels='{"poor":"Almost full"}'`.
|
|
9334
|
+
|
|
9335
|
+
A band left out keeps its default: "Good", "Fair" or "Poor". */
|
|
9336
|
+
bandLabels?: (HelixHeadlessMeter["bandLabels"]) | undefined;
|
|
8935
9337
|
/** `Intl.NumberFormat` options the reading is written with, as React Aria's
|
|
8936
9338
|
Meter and ProgressBar take them: a unit, a currency, or a number of
|
|
8937
9339
|
decimals. Written as JSON in the attribute.
|
|
@@ -8967,6 +9369,13 @@ Absent leaves the range unbanded. */
|
|
|
8967
9369
|
A visible label in the `label` slot names it instead, with the words it
|
|
8968
9370
|
shows, so the name and the label cannot disagree. */
|
|
8969
9371
|
label?: (HelixHeadlessMeter["label"]) | undefined;
|
|
9372
|
+
/** Says the reading in a polite `live` region each time it moves into
|
|
9373
|
+
another band, with the band's word, such as "92%, Poor".
|
|
9374
|
+
|
|
9375
|
+
For a meter whose value changes while it is on screen. Off by default,
|
|
9376
|
+
because a meter that reads a fixed level has nothing new to say. A meter
|
|
9377
|
+
with no bands says nothing. */
|
|
9378
|
+
live?: (HelixHeadlessMeter["live"]) | undefined;
|
|
8970
9379
|
/** The locale the percentage is written in, such as `fr` for `72 %`.
|
|
8971
9380
|
|
|
8972
9381
|
Absent uses the runtime's own. */
|
|
@@ -9032,7 +9441,10 @@ fair summary of a task and a poor one of a quantity. */
|
|
|
9032
9441
|
valueText?: (HelixHeadlessMeter["valueText"]) | undefined;
|
|
9033
9442
|
};
|
|
9034
9443
|
|
|
9035
|
-
export type HelixHeadlessMeterVueEvents = {
|
|
9444
|
+
export type HelixHeadlessMeterVueEvents = {
|
|
9445
|
+
/** Fired when the reading moves into another band, with the band it is in now, or `''` where it is in none. Not sent on the first render, since a meter that arrives in a band has not moved. */
|
|
9446
|
+
"helix-band": HelixHeadlessMeterHelixBandElementEvent;
|
|
9447
|
+
};
|
|
9036
9448
|
|
|
9037
9449
|
export type HelixHeadlessNavigationVueProps = {
|
|
9038
9450
|
/** Whether the arrow keys move focus between the destinations.
|
|
@@ -9211,6 +9623,20 @@ export type HelixHeadlessNotificationsHelixReadElementEvent =
|
|
|
9211
9623
|
export type HelixHeadlessNotificationsVueProps = {
|
|
9212
9624
|
/** The feed's name, read by screen readers. */
|
|
9213
9625
|
label?: (HelixHeadlessNotifications["label"]) | undefined;
|
|
9626
|
+
/** What the feed says when a page of it could not be loaded, such as after a
|
|
9627
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
9628
|
+
removing the attribute clears it.
|
|
9629
|
+
|
|
9630
|
+
Set, it shows under the rows there are, in place of `empty-text` and
|
|
9631
|
+
`loading-text`, and a screen reader hears it. Clear it when you ask again. */
|
|
9632
|
+
"load-error"?: (HelixHeadlessNotifications["loadError"]) | undefined;
|
|
9633
|
+
/** What the feed says when a page of it could not be loaded, such as after a
|
|
9634
|
+
request to a server fails. Empty, null or no attribute is no error, so
|
|
9635
|
+
removing the attribute clears it.
|
|
9636
|
+
|
|
9637
|
+
Set, it shows under the rows there are, in place of `empty-text` and
|
|
9638
|
+
`loading-text`, and a screen reader hears it. Clear it when you ask again. */
|
|
9639
|
+
loadError?: (HelixHeadlessNotifications["loadError"]) | undefined;
|
|
9214
9640
|
/** Whether to draw a button after the list that asks for the next page, by
|
|
9215
9641
|
sending `helix-load-more`. Take it off once there is nothing more. */
|
|
9216
9642
|
"load-more"?: (HelixHeadlessNotifications["loadMore"]) | undefined;
|
|
@@ -9374,7 +9800,13 @@ than states: a duration, a weight, a count they are looking for rather than
|
|
|
9374
9800
|
one they already know. */
|
|
9375
9801
|
scrub?: (HelixHeadlessNumberInput["scrub"]) | undefined;
|
|
9376
9802
|
/** How far one step moves. A value off the step grid, counted from `min`, is
|
|
9377
|
-
invalid, as it is in a native number field.
|
|
9803
|
+
invalid, as it is in a native number field.
|
|
9804
|
+
|
|
9805
|
+
Unset, a step moves by one, or by one percent under a percent format, and
|
|
9806
|
+
a typed number is rounded to the smallest amount `format-options` shows
|
|
9807
|
+
rather than to whole steps, as React Aria's NumberField does: a field
|
|
9808
|
+
showing dollars keeps the cents typed into it. Without `format-options`
|
|
9809
|
+
the grid is whole numbers, as in a native number field. */
|
|
9378
9810
|
step?: (HelixHeadlessNumberInput["step"]) | undefined;
|
|
9379
9811
|
/** The message the browser shows when the number is off the step grid, with
|
|
9380
9812
|
`{below}` and `{above}` filled in with the nearest valid values. */
|
|
@@ -9841,6 +10273,10 @@ export type HelixHeadlessOptionVueEvents = {
|
|
|
9841
10273
|
"helix-select": HelixHeadlessOptionHelixSelectElementEvent;
|
|
9842
10274
|
};
|
|
9843
10275
|
|
|
10276
|
+
export type HelixHeadlessOptionSeparatorVueProps = {};
|
|
10277
|
+
|
|
10278
|
+
export type HelixHeadlessOptionSeparatorVueEvents = {};
|
|
10279
|
+
|
|
9844
10280
|
/** `HelixHeadlessOutline` component event */
|
|
9845
10281
|
export type HelixHeadlessOutlineElementEvent<E = Event> = TypedEvent<
|
|
9846
10282
|
HelixHeadlessOutline,
|
|
@@ -10169,12 +10605,9 @@ export type HelixHeadlessPinInputHelixCompleteElementEvent =
|
|
|
10169
10605
|
HelixHeadlessPinInputElementEvent<HelixCompleteEvent>;
|
|
10170
10606
|
|
|
10171
10607
|
export type HelixHeadlessPinInputVueProps = {
|
|
10172
|
-
/** The autofill hint for the browser
|
|
10173
|
-
|
|
10174
|
-
|
|
10175
|
-
that lets a phone offer the code out of a message. Later cells stay `off`
|
|
10176
|
-
for the reason in the class comment above, that six cells each offering
|
|
10177
|
-
the same code is one offer made six times. */
|
|
10608
|
+
/** The autofill hint for the browser. `one-time-code` is why this defaults to
|
|
10609
|
+
anything at all: it is the token that lets a phone offer the code out of a
|
|
10610
|
+
message. */
|
|
10178
10611
|
autocomplete?: (HelixHeadlessPinInput["autocomplete"]) | undefined;
|
|
10179
10612
|
/** Whether the form is submitted once the last box is filled, as Web
|
|
10180
10613
|
Awesome's `autosubmit` and Radix's `autoSubmit`. Only for a code the field
|
|
@@ -10184,9 +10617,9 @@ took: a refused last character submits nothing. */
|
|
|
10184
10617
|
to keep them as typed. Web Awesome's OTP input takes the same `case`, for
|
|
10185
10618
|
a code a service reads in one case. */
|
|
10186
10619
|
case?: (HelixHeadlessPinInput["case"]) | undefined;
|
|
10187
|
-
/**
|
|
10620
|
+
/** The name each box once had, with `{index}` and `{length}` filled in. */
|
|
10188
10621
|
"cell-label"?: (HelixHeadlessPinInput["cellLabel"]) | undefined;
|
|
10189
|
-
/**
|
|
10622
|
+
/** The name each box once had, with `{index}` and `{length}` filled in. */
|
|
10190
10623
|
cellLabel?: (HelixHeadlessPinInput["cellLabel"]) | undefined;
|
|
10191
10624
|
/** Separators drawn between the boxes: `#` or `*` for a box and anything
|
|
10192
10625
|
else as it is written, so `###-###` draws a dash after the third. The
|
|
@@ -10194,21 +10627,22 @@ separators are hidden from screen readers and are not part of the value. */
|
|
|
10194
10627
|
format?: (HelixHeadlessPinInput["format"]) | undefined;
|
|
10195
10628
|
/** How many characters the code has. */
|
|
10196
10629
|
length?: (HelixHeadlessPinInput["length"]) | undefined;
|
|
10197
|
-
/** Whether the characters are hidden, the way a password is.
|
|
10630
|
+
/** Whether the characters are hidden, the way a password is. The field is a
|
|
10631
|
+
password field, and each filled box draws `mask-character`. */
|
|
10198
10632
|
mask?: (HelixHeadlessPinInput["mask"]) | undefined;
|
|
10199
|
-
/** What
|
|
10200
|
-
|
|
10201
|
-
|
|
10202
|
-
|
|
10203
|
-
|
|
10204
|
-
|
|
10205
|
-
|
|
10206
|
-
|
|
10207
|
-
|
|
10633
|
+
/** What a filled box draws under `mask`, in place of its character, as Web
|
|
10634
|
+
Awesome's `--mask-char`. */
|
|
10635
|
+
"mask-character"?: (HelixHeadlessPinInput["maskCharacter"]) | undefined;
|
|
10636
|
+
/** What a filled box draws under `mask`, in place of its character, as Web
|
|
10637
|
+
Awesome's `--mask-char`. */
|
|
10638
|
+
maskCharacter?: (HelixHeadlessPinInput["maskCharacter"]) | undefined;
|
|
10639
|
+
/** What an empty box shows, usually a single dot. It is not shown in the box
|
|
10640
|
+
the caret is in. Empty by default, because a row of boxes already reads as
|
|
10641
|
+
a row of boxes. */
|
|
10208
10642
|
placeholder?: (HelixHeadlessPinInput["placeholder"]) | undefined;
|
|
10209
|
-
/** Whether the
|
|
10643
|
+
/** Whether the field blocks input. A read-only code still submits its value. */
|
|
10210
10644
|
readonly?: (HelixHeadlessPinInput["readOnly"]) | undefined;
|
|
10211
|
-
/** Whether the
|
|
10645
|
+
/** Whether the field blocks input. A read-only code still submits its value. */
|
|
10212
10646
|
readOnly?: (HelixHeadlessPinInput["readOnly"]) | undefined;
|
|
10213
10647
|
/** The message shown when the code is started and not finished, with
|
|
10214
10648
|
`{length}` filled in. When it is unset, an English default is shown. */
|
|
@@ -10233,8 +10667,7 @@ marked letters wants `text`, which judges nothing.
|
|
|
10233
10667
|
|
|
10234
10668
|
**Not reflected**: nothing selects on it, so reflecting only writes
|
|
10235
10669
|
`type="numeric"` onto every `<helix-headless-pin-input>` ever rendered, an
|
|
10236
|
-
attribute no consumer's markup had. The
|
|
10237
|
-
"reflect only what CSS selects on". The real inputs take it as a binding,
|
|
10670
|
+
attribute no consumer's markup had. The field takes it as `inputmode`,
|
|
10238
10671
|
which is what makes the keyboard follow. */
|
|
10239
10672
|
type?: (HelixHeadlessPinInput["type"]) | undefined;
|
|
10240
10673
|
/** The value the control starts with. A form reset returns it to this value,
|
|
@@ -10383,7 +10816,28 @@ export type HelixHeadlessPopoverVueEvents = {
|
|
|
10383
10816
|
toggle: HelixHeadlessPopoverToggleElementEvent;
|
|
10384
10817
|
};
|
|
10385
10818
|
|
|
10819
|
+
/** `HelixHeadlessProgress` component event */
|
|
10820
|
+
export type HelixHeadlessProgressElementEvent<E = Event> = TypedEvent<
|
|
10821
|
+
HelixHeadlessProgress,
|
|
10822
|
+
E
|
|
10823
|
+
>;
|
|
10824
|
+
/** `helix-complete` event type */
|
|
10825
|
+
export type HelixHeadlessProgressHelixCompleteElementEvent =
|
|
10826
|
+
HelixHeadlessProgressElementEvent<HelixCompleteEvent>;
|
|
10827
|
+
|
|
10386
10828
|
export type HelixHeadlessProgressVueProps = {
|
|
10829
|
+
/** The words a screen reader hears when the value reaches `max`, such as
|
|
10830
|
+
"Upload complete".
|
|
10831
|
+
|
|
10832
|
+
Said once, politely, as the work finishes. Empty says nothing, for a bar
|
|
10833
|
+
whose page announces the result itself. */
|
|
10834
|
+
"complete-label"?: (HelixHeadlessProgress["completeLabel"]) | undefined;
|
|
10835
|
+
/** The words a screen reader hears when the value reaches `max`, such as
|
|
10836
|
+
"Upload complete".
|
|
10837
|
+
|
|
10838
|
+
Said once, politely, as the work finishes. Empty says nothing, for a bar
|
|
10839
|
+
whose page announces the result itself. */
|
|
10840
|
+
completeLabel?: (HelixHeadlessProgress["completeLabel"]) | undefined;
|
|
10387
10841
|
/** `Intl.NumberFormat` options the reading is written with, as React Aria's
|
|
10388
10842
|
Meter and ProgressBar take them: a unit, a currency, or a number of
|
|
10389
10843
|
decimals. Written as JSON in the attribute.
|
|
@@ -10494,7 +10948,10 @@ report progress. */
|
|
|
10494
10948
|
valueText?: (HelixHeadlessProgress["valueText"]) | undefined;
|
|
10495
10949
|
};
|
|
10496
10950
|
|
|
10497
|
-
export type HelixHeadlessProgressVueEvents = {
|
|
10951
|
+
export type HelixHeadlessProgressVueEvents = {
|
|
10952
|
+
/** The value reached `max` from below. Its `value` is `max`. Not sent for a bar that starts full. */
|
|
10953
|
+
"helix-complete": HelixHeadlessProgressHelixCompleteElementEvent;
|
|
10954
|
+
};
|
|
10498
10955
|
|
|
10499
10956
|
/** `HelixHeadlessQrCode` component event */
|
|
10500
10957
|
export type HelixHeadlessQrCodeElementEvent<E = Event> = TypedEvent<
|
|
@@ -10503,6 +10960,12 @@ export type HelixHeadlessQrCodeElementEvent<E = Event> = TypedEvent<
|
|
|
10503
10960
|
>;
|
|
10504
10961
|
|
|
10505
10962
|
export type HelixHeadlessQrCodeVueProps = {
|
|
10963
|
+
/** The words a code with no `label` is named by, followed by its value where
|
|
10964
|
+
the value is a web address. */
|
|
10965
|
+
"code-label"?: (HelixHeadlessQrCode["codeLabel"]) | undefined;
|
|
10966
|
+
/** The words a code with no `label` is named by, followed by its value where
|
|
10967
|
+
the value is a web address. */
|
|
10968
|
+
codeLabel?: (HelixHeadlessQrCode["codeLabel"]) | undefined;
|
|
10506
10969
|
/** The error correction level, which sets how much of the code can be lost
|
|
10507
10970
|
and still scan.
|
|
10508
10971
|
|
|
@@ -10512,10 +10975,13 @@ chosen automatically when the slot is filled: it is the level that makes
|
|
|
10512
10975
|
covering safe, and a consumer who fills the slot has said what they want
|
|
10513
10976
|
without having to know that. */
|
|
10514
10977
|
correction?: (HelixHeadlessQrCode["correction"]) | undefined;
|
|
10515
|
-
/** The image's accessible name
|
|
10978
|
+
/** The image's accessible name: what the code is for, such as "Open the
|
|
10979
|
+
menu".
|
|
10516
10980
|
|
|
10517
|
-
|
|
10518
|
-
|
|
10981
|
+
Absent names it by `code-label` and, for a web address, the address,
|
|
10982
|
+
which is what a reader who cannot scan it needs. Any other value is left
|
|
10983
|
+
out of the name, since it may hold a secret, such as an authenticator's
|
|
10984
|
+
key or a network's password. */
|
|
10519
10985
|
label?: (HelixHeadlessQrCode["label"]) | undefined;
|
|
10520
10986
|
/** How the modules are drawn.
|
|
10521
10987
|
|
|
@@ -10985,6 +11451,20 @@ is read along. */
|
|
|
10985
11451
|
"points-label"?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
|
|
10986
11452
|
/** The word the summary uses for a row when it counts them. */
|
|
10987
11453
|
pointsLabel?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
|
|
11454
|
+
/** The heading of a column whose numbers size the points, such as
|
|
11455
|
+
`Population`, which makes the chart a bubble chart.
|
|
11456
|
+
|
|
11457
|
+
That column is then a measure and no series: it draws no points of its
|
|
11458
|
+
own, and each point's area follows its row's number in it. Absent, every
|
|
11459
|
+
point is one size. */
|
|
11460
|
+
"size-by"?: (HelixHeadlessScatterChart["sizeBy"]) | undefined;
|
|
11461
|
+
/** The heading of a column whose numbers size the points, such as
|
|
11462
|
+
`Population`, which makes the chart a bubble chart.
|
|
11463
|
+
|
|
11464
|
+
That column is then a measure and no series: it draws no points of its
|
|
11465
|
+
own, and each point's area follows its row's number in it. Absent, every
|
|
11466
|
+
point is one size. */
|
|
11467
|
+
sizeBy?: (HelixHeadlessScatterChart["sizeBy"]) | undefined;
|
|
10988
11468
|
/** Draws each series' line of best fit across the plot, by least squares, in
|
|
10989
11469
|
the series' color: the regression line a reader would otherwise draw by
|
|
10990
11470
|
eye.
|
|
@@ -11100,6 +11580,14 @@ export type HelixHeadlessSelectToggleElementEvent =
|
|
|
11100
11580
|
HelixHeadlessSelectElementEvent<ToggleEvent>;
|
|
11101
11581
|
|
|
11102
11582
|
export type HelixHeadlessSelectVueProps = {
|
|
11583
|
+
/** What a browser's autofill may fill in, as a platform token such as
|
|
11584
|
+
`country` or `cc-exp-month`, as on a native `<select>`.
|
|
11585
|
+
|
|
11586
|
+
Set, the select keeps a hidden native `<select>` with the same options for
|
|
11587
|
+
the browser to fill, as React Aria's `HiddenSelect` does, and takes the
|
|
11588
|
+
option the browser picks, by its value or its words, as the value. Empty
|
|
11589
|
+
draws no hidden select, and a browser fills nothing. */
|
|
11590
|
+
autocomplete?: (HelixHeadlessSelect["autocomplete"]) | undefined;
|
|
11103
11591
|
/** The text shown when no options match the filter. */
|
|
11104
11592
|
"empty-text"?: (HelixHeadlessSelect["emptyText"]) | undefined;
|
|
11105
11593
|
/** The text shown when no options match the filter. */
|
|
@@ -11109,6 +11597,24 @@ export type HelixHeadlessSelectVueProps = {
|
|
|
11109
11597
|
Passed to the listbox rather than acted on here, because the listbox owns
|
|
11110
11598
|
the filtering, the empty state and the keyboard. */
|
|
11111
11599
|
filterable?: (HelixHeadlessSelect["filterable"]) | undefined;
|
|
11600
|
+
/** The open list's name where nothing names the Select, read by screen
|
|
11601
|
+
readers. The list has no visible name.
|
|
11602
|
+
|
|
11603
|
+
A Select named by `label`, `aria-label`, `aria-labelledby` or a `<label>`
|
|
11604
|
+
gives its list that name, and this is not used. Unnamed, the Select is
|
|
11605
|
+
reported once by the missing-name warning, and its list is not reported a
|
|
11606
|
+
second time for a name the page never wrote: the list is this element's,
|
|
11607
|
+
and so is the fallback. Combobox calls its list the same. */
|
|
11608
|
+
"list-label"?: (HelixHeadlessSelect["listLabel"]) | undefined;
|
|
11609
|
+
/** The open list's name where nothing names the Select, read by screen
|
|
11610
|
+
readers. The list has no visible name.
|
|
11611
|
+
|
|
11612
|
+
A Select named by `label`, `aria-label`, `aria-labelledby` or a `<label>`
|
|
11613
|
+
gives its list that name, and this is not used. Unnamed, the Select is
|
|
11614
|
+
reported once by the missing-name warning, and its list is not reported a
|
|
11615
|
+
second time for a name the page never wrote: the list is this element's,
|
|
11616
|
+
and so is the fallback. Combobox calls its list the same. */
|
|
11617
|
+
listLabel?: (HelixHeadlessSelect["listLabel"]) | undefined;
|
|
11112
11618
|
/** Whether the options are still loading.
|
|
11113
11619
|
|
|
11114
11620
|
Passed straight to the list, which is where the rows are and so where the
|
|
@@ -11123,6 +11629,16 @@ consumer wiring the same flag twice. */
|
|
|
11123
11629
|
multiple?: (HelixHeadlessSelect["multiple"]) | undefined;
|
|
11124
11630
|
/** Shown on the trigger while nothing is chosen. */
|
|
11125
11631
|
placeholder?: (HelixHeadlessSelect["placeholder"]) | undefined;
|
|
11632
|
+
/** Where the list opens: `floating`, under the trigger and above it where
|
|
11633
|
+
there is no room, or `item-aligned`, over the trigger with the chosen
|
|
11634
|
+
option where the trigger is, as a native select does on macOS and Radix
|
|
11635
|
+
Select does by default.
|
|
11636
|
+
|
|
11637
|
+
Over the trigger, a reader's eye stays on the answer as the list opens
|
|
11638
|
+
round it, and a short move reaches the options either side. Near an edge
|
|
11639
|
+
of the screen the list moves to stay on it, so the option may sit beside
|
|
11640
|
+
the trigger rather than on it. It follows the page as it scrolls. */
|
|
11641
|
+
position?: (HelixHeadlessSelect["position"]) | undefined;
|
|
11126
11642
|
/** Whether the element starts open. Ignored once `open` is written. */
|
|
11127
11643
|
"default-open"?: (HelixHeadlessSelect["defaultOpen"]) | undefined;
|
|
11128
11644
|
/** Whether the element starts open. Ignored once `open` is written. */
|
|
@@ -11211,6 +11727,16 @@ imperatively later, and nothing is hydrating by then.
|
|
|
11211
11727
|
|
|
11212
11728
|
Here rather than on each control. */
|
|
11213
11729
|
name?: (HelixHeadlessSelect["name"]) | undefined;
|
|
11730
|
+
/** Whether the trigger holds its group's tab stop.
|
|
11731
|
+
|
|
11732
|
+
A toolbar keeps one tab stop across its controls, and writing `tabindex`
|
|
11733
|
+
onto this element would change markup the consumer rendered, which a React
|
|
11734
|
+
consumer's hydration reports. A toolbar sets this property instead, and
|
|
11735
|
+
the stop moves on the trigger inside the shadow root, as Button's does.
|
|
11736
|
+
|
|
11737
|
+
No attribute, because it is coordination between elements rather than
|
|
11738
|
+
anything a consumer sets. */
|
|
11739
|
+
focusable?: (HelixHeadlessSelect["focusable"]) | undefined;
|
|
11214
11740
|
/** What the trigger shows for the chosen options: a function given them, in
|
|
11215
11741
|
the order they appear, that returns text, an element or a Lit template.
|
|
11216
11742
|
|
|
@@ -11391,6 +11917,11 @@ filled in. Write it in the page's language, such as `{start} bis {end}`. */
|
|
|
11391
11917
|
showValue?: (HelixHeadlessSlider["showValue"]) | undefined;
|
|
11392
11918
|
/** How far one press of an arrow key moves the thumb. */
|
|
11393
11919
|
step?: (HelixHeadlessSlider["step"]) | undefined;
|
|
11920
|
+
/** Whether each thumb shows its value in a bubble beside it, as Web
|
|
11921
|
+
Awesome's `with-tooltip`. The styled slider shows the bubbles while the
|
|
11922
|
+
slider is under the pointer or holds focus. They repeat what each thumb
|
|
11923
|
+
already reports, so a screen reader skips them. */
|
|
11924
|
+
tooltip?: (HelixHeadlessSlider["tooltip"]) | undefined;
|
|
11394
11925
|
/** What a screen reader says for a thumb's value, with `{value}` filled in,
|
|
11395
11926
|
such as `{value} degrees`. Empty announces the number alone. */
|
|
11396
11927
|
"value-text"?: (HelixHeadlessSlider["valueText"]) | undefined;
|
|
@@ -11539,6 +12070,20 @@ separated by spaces.
|
|
|
11539
12070
|
Absent marks none, and the drawing is what it was. Each mark is a part,
|
|
11540
12071
|
placed at its reading, for a stylesheet to draw. */
|
|
11541
12072
|
marks?: (HelixHeadlessSparkline["marks"]) | undefined;
|
|
12073
|
+
/** What the readings come to, said after the name: `{first}` and `{last}`
|
|
12074
|
+
for the first and the last reading, `{high}` and `{low}` for the highest
|
|
12075
|
+
and the lowest, each written as the readout writes it.
|
|
12076
|
+
|
|
12077
|
+
Set it to the words of the page's language, or to nothing to say no
|
|
12078
|
+
more than the name. Said only where the sparkline is named. */
|
|
12079
|
+
"overview-label"?: (HelixHeadlessSparkline["overviewLabel"]) | undefined;
|
|
12080
|
+
/** What the readings come to, said after the name: `{first}` and `{last}`
|
|
12081
|
+
for the first and the last reading, `{high}` and `{low}` for the highest
|
|
12082
|
+
and the lowest, each written as the readout writes it.
|
|
12083
|
+
|
|
12084
|
+
Set it to the words of the page's language, or to nothing to say no
|
|
12085
|
+
more than the name. Said only where the sparkline is named. */
|
|
12086
|
+
overviewLabel?: (HelixHeadlessSparkline["overviewLabel"]) | undefined;
|
|
11542
12087
|
/** What the readings are drawn as.
|
|
11543
12088
|
|
|
11544
12089
|
Absent is `area`, a line with the region beneath it washed. `line` is the
|
|
@@ -11581,6 +12126,12 @@ it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
|
11581
12126
|
Set it to the words of the page's language, such as `{position} von
|
|
11582
12127
|
{count}`, or to nothing to say no position. */
|
|
11583
12128
|
positionLabel?: (HelixHeadlessSparkline["positionLabel"]) | undefined;
|
|
12129
|
+
/** Two values a band is drawn between, behind the line, separated by a
|
|
12130
|
+
space: `range="60 100"` marks a normal range.
|
|
12131
|
+
|
|
12132
|
+
The scale stretches to hold the band where the readings do not reach it.
|
|
12133
|
+
Absent draws none. */
|
|
12134
|
+
range?: (HelixHeadlessSparkline["range"]) | undefined;
|
|
11584
12135
|
/** The numbers, separated by whitespace or by commas.
|
|
11585
12136
|
|
|
11586
12137
|
An array assigned to the property works too, which is what React 19 does
|
|
@@ -11592,6 +12143,13 @@ not. */
|
|
|
11592
12143
|
|
|
11593
12144
|
export type HelixHeadlessSparklineVueEvents = {};
|
|
11594
12145
|
|
|
12146
|
+
export type HelixHeadlessSpeedDialGroupVueProps = {
|
|
12147
|
+
/** The group's name, drawn above its actions and read by screen readers. */
|
|
12148
|
+
label?: (HelixHeadlessSpeedDialGroup["label"]) | undefined;
|
|
12149
|
+
};
|
|
12150
|
+
|
|
12151
|
+
export type HelixHeadlessSpeedDialGroupVueEvents = {};
|
|
12152
|
+
|
|
11595
12153
|
/** `HelixHeadlessSpeedDialItem` component event */
|
|
11596
12154
|
export type HelixHeadlessSpeedDialItemElementEvent<E = Event> = TypedEvent<
|
|
11597
12155
|
HelixHeadlessSpeedDialItem,
|
|
@@ -11604,6 +12162,10 @@ export type HelixHeadlessSpeedDialItemHelixSelectElementEvent =
|
|
|
11604
12162
|
export type HelixHeadlessSpeedDialItemVueProps = {
|
|
11605
12163
|
/** Whether the action is disabled, so it cannot be chosen. */
|
|
11606
12164
|
disabled?: (HelixHeadlessSpeedDialItem["disabled"]) | undefined;
|
|
12165
|
+
/** The action's keyboard shortcut as a chord, such as `mod+s`, carried as
|
|
12166
|
+
`aria-keyshortcuts` and drawn after the name. `mod` is Command on an Apple
|
|
12167
|
+
keyboard and Control elsewhere. Showing a shortcut does not bind it. */
|
|
12168
|
+
shortcut?: (HelixHeadlessSpeedDialItem["shortcut"]) | undefined;
|
|
11607
12169
|
/** The action's value, sent in `helix-select` when the action is chosen. */
|
|
11608
12170
|
value?: (HelixHeadlessSpeedDialItem["value"]) | undefined;
|
|
11609
12171
|
};
|
|
@@ -11634,8 +12196,32 @@ export type HelixHeadlessSpeedDialToggleElementEvent =
|
|
|
11634
12196
|
export type HelixHeadlessSpeedDialVueProps = {
|
|
11635
12197
|
/** Accessible name for the trigger and the set of actions it opens. */
|
|
11636
12198
|
label?: (HelixHeadlessSpeedDial["label"]) | undefined;
|
|
12199
|
+
/** The description the trigger gives under `open-on="long-press"`, saying how
|
|
12200
|
+
its actions are reached.
|
|
12201
|
+
|
|
12202
|
+
A slotted trigger is described by the dial, which carries the words as
|
|
12203
|
+
its own label for that: a Helix button's inner control at once, and a
|
|
12204
|
+
plain element of yours once a reader reaches it, after hydration, unless
|
|
12205
|
+
you described or labeled it yourself. */
|
|
12206
|
+
"long-press-label"?: (HelixHeadlessSpeedDial["longPressLabel"]) | undefined;
|
|
12207
|
+
/** The description the trigger gives under `open-on="long-press"`, saying how
|
|
12208
|
+
its actions are reached.
|
|
12209
|
+
|
|
12210
|
+
A slotted trigger is described by the dial, which carries the words as
|
|
12211
|
+
its own label for that: a Helix button's inner control at once, and a
|
|
12212
|
+
plain element of yours once a reader reaches it, after hydration, unless
|
|
12213
|
+
you described or labeled it yourself. */
|
|
12214
|
+
longPressLabel?: (HelixHeadlessSpeedDial["longPressLabel"]) | undefined;
|
|
11637
12215
|
/** Space between the trigger and the actions, in pixels. */
|
|
11638
12216
|
offset?: (HelixHeadlessSpeedDial["offset"]) | undefined;
|
|
12217
|
+
/** What opens the dial. `click` opens it on a press of the trigger. Under
|
|
12218
|
+
`long-press`, a press is the trigger's own action, and the dial opens on a
|
|
12219
|
+
press held for half a second, or on Alt+Down or Alt+Up. */
|
|
12220
|
+
"open-on"?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
|
|
12221
|
+
/** What opens the dial. `click` opens it on a press of the trigger. Under
|
|
12222
|
+
`long-press`, a press is the trigger's own action, and the dial opens on a
|
|
12223
|
+
press held for half a second, or on Alt+Down or Alt+Up. */
|
|
12224
|
+
openOn?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
|
|
11639
12225
|
/** The direction the actions open in. They move to another side if that side
|
|
11640
12226
|
does not fit.
|
|
11641
12227
|
|
|
@@ -11821,6 +12407,8 @@ export type HelixHeadlessSplitterVueEvents = {
|
|
|
11821
12407
|
"helix-collapse": HelixHeadlessSplitterHelixCollapseElementEvent;
|
|
11822
12408
|
/** Fired after the divider settles somewhere new, with the new position. */
|
|
11823
12409
|
"helix-resized": HelixHeadlessSplitterHelixResizedElementEvent;
|
|
12410
|
+
/** Fired each time the divider moves, as a range input does: on each step of a drag, and before `helix-resized` for a key, a double click or a corner. Read `position` for where it is now. */
|
|
12411
|
+
input: HelixHeadlessSplitterElementEvent;
|
|
11824
12412
|
};
|
|
11825
12413
|
|
|
11826
12414
|
export type HelixHeadlessStatGroupVueProps = {
|
|
@@ -11897,6 +12485,12 @@ in both. Of those four combinations three are ones nobody should pick, and
|
|
|
11897
12485
|
a property whose job is mostly to be left alone is a property that mostly
|
|
11898
12486
|
catches people out. */
|
|
11899
12487
|
orientation?: (HelixHeadlessSteps["orientation"]) | undefined;
|
|
12488
|
+
/** What the `progress` part says to a screen reader, with `{percent}` filled
|
|
12489
|
+
in with `progress`. */
|
|
12490
|
+
"progress-label"?: (HelixHeadlessSteps["progressLabel"]) | undefined;
|
|
12491
|
+
/** What the `progress` part says to a screen reader, with `{percent}` filled
|
|
12492
|
+
in with `progress`. */
|
|
12493
|
+
progressLabel?: (HelixHeadlessSteps["progressLabel"]) | undefined;
|
|
11900
12494
|
/** What each step is marked with.
|
|
11901
12495
|
|
|
11902
12496
|
Absent is the state itself: a check where a stage is done, a target where
|
|
@@ -12365,6 +12959,14 @@ is set. */
|
|
|
12365
12959
|
"descending-label"?: (HelixHeadlessTable["descendingLabel"]) | undefined;
|
|
12366
12960
|
/** The word for a descending sort, in `sorted-label`. */
|
|
12367
12961
|
descendingLabel?: (HelixHeadlessTable["descendingLabel"]) | undefined;
|
|
12962
|
+
/** Makes the table a grid: one tab stop, and the arrow keys, Home, End and the
|
|
12963
|
+
Page keys move focus between its cells, the headings included. Enter moves
|
|
12964
|
+
into a cell's controls, and Tab leaves the table.
|
|
12965
|
+
|
|
12966
|
+
Off by default, where the table is a static `table` and Tab reaches each
|
|
12967
|
+
link and control in it. On, the table writes a `tabindex` onto each of its
|
|
12968
|
+
cells, which is the one way a cell of your markup can take focus. */
|
|
12969
|
+
grid?: (HelixHeadlessTable["grid"]) | undefined;
|
|
12368
12970
|
/** Accessible name for the table.
|
|
12369
12971
|
|
|
12370
12972
|
An `aria-label` or `aria-labelledby` on the host names the table too, and
|
|
@@ -12441,6 +13043,13 @@ export type HelixHeadlessTableVueEvents = {
|
|
|
12441
13043
|
};
|
|
12442
13044
|
|
|
12443
13045
|
export type HelixHeadlessTableRowVueProps = {
|
|
13046
|
+
/** The URL a press on the row follows, which makes the whole row a link.
|
|
13047
|
+
Empty, the default, leaves presses to the row's cells. */
|
|
13048
|
+
href?: (HelixHeadlessTableRow["href"]) | undefined;
|
|
13049
|
+
/** The `rel` of the row's link. You set it yourself, as on an anchor. */
|
|
13050
|
+
rel?: (HelixHeadlessTableRow["rel"]) | undefined;
|
|
13051
|
+
/** Where the row's link opens, such as `_blank`. */
|
|
13052
|
+
target?: (HelixHeadlessTableRow["target"]) | undefined;
|
|
12444
13053
|
/** The key the table's `selected` lists this row by. Left empty, the row is
|
|
12445
13054
|
known by its place among the rows as written. */
|
|
12446
13055
|
value?: (HelixHeadlessTableRow["value"]) | undefined;
|
|
@@ -12600,6 +13209,12 @@ export type HelixHeadlessTagGroupHelixDismissElementEvent =
|
|
|
12600
13209
|
HelixHeadlessTagGroupElementEvent<HelixDismissEvent>;
|
|
12601
13210
|
|
|
12602
13211
|
export type HelixHeadlessTagGroupVueProps = {
|
|
13212
|
+
/** The words the group shows and says once its last tag is removed, where
|
|
13213
|
+
nothing is in the `empty` slot. */
|
|
13214
|
+
"empty-label"?: (HelixHeadlessTagGroup["emptyLabel"]) | undefined;
|
|
13215
|
+
/** The words the group shows and says once its last tag is removed, where
|
|
13216
|
+
nothing is in the `empty` slot. */
|
|
13217
|
+
emptyLabel?: (HelixHeadlessTagGroup["emptyLabel"]) | undefined;
|
|
12603
13218
|
/** The name of the set, such as "Filters", which a screen reader announces
|
|
12604
13219
|
before its tags. */
|
|
12605
13220
|
label?: (HelixHeadlessTagGroup["label"]) | undefined;
|
|
@@ -12926,7 +13541,8 @@ Handed to the list. The value is `HH:mm` on twenty-four hours either way. */
|
|
|
12926
13541
|
hourCycle?: (HelixHeadlessTimeInput["hourCycle"]) | undefined;
|
|
12927
13542
|
/** Language tag the times are written in.
|
|
12928
13543
|
|
|
12929
|
-
Absent
|
|
13544
|
+
Absent is the page's: the `lang` of the nearest element with one, as
|
|
13545
|
+
Shoelace and Web Awesome read it, then the runtime's own. */
|
|
12930
13546
|
locale?: (HelixHeadlessTimeInput["locale"]) | undefined;
|
|
12931
13547
|
/** Latest time that can be chosen, as `HH:mm`. */
|
|
12932
13548
|
max?: (HelixHeadlessTimeInput["max"]) | undefined;
|
|
@@ -13275,21 +13891,14 @@ English, "Stunde" in German. */
|
|
|
13275
13891
|
Absent is the locale's own word, from `Intl.DisplayNames`: "Hour" in
|
|
13276
13892
|
English, "Stunde" in German. */
|
|
13277
13893
|
hourLabel?: (HelixHeadlessTimePicker["hourLabel"]) | undefined;
|
|
13278
|
-
/** Whether the current selection fails validation.
|
|
13279
|
-
|
|
13280
|
-
A flag rather than a message, the same split Date Picker draws. A flat
|
|
13281
|
-
picker has no room of its own for a sentence: the field that wraps one owns
|
|
13282
|
-
the label, the hint and the feedback, and a second message inside the panel
|
|
13283
|
-
would be the same error said twice. What is left for the picker is the one
|
|
13284
|
-
thing the field cannot draw from outside, the mark on the answer itself. */
|
|
13285
|
-
invalid?: (HelixHeadlessTimePicker["invalid"]) | undefined;
|
|
13286
13894
|
/** Accessible name for the list, which has no visible one of its own.
|
|
13287
13895
|
|
|
13288
13896
|
An `aria-label` or `aria-labelledby` on the host names the list instead. */
|
|
13289
13897
|
label?: (HelixHeadlessTimePicker["label"]) | undefined;
|
|
13290
|
-
/** Language tag the times are written in.
|
|
13898
|
+
/** Language tag the times and the wheels' names are written in.
|
|
13291
13899
|
|
|
13292
|
-
Absent
|
|
13900
|
+
Absent is the page's: the `lang` of the nearest element with one, as
|
|
13901
|
+
Shoelace and Web Awesome read it, then the runtime's own. */
|
|
13293
13902
|
locale?: (HelixHeadlessTimePicker["locale"]) | undefined;
|
|
13294
13903
|
/** Stops the arrow keys in the list from choosing each time they move to.
|
|
13295
13904
|
Enter, Space or a click chooses.
|
|
@@ -13442,6 +14051,19 @@ not touch, and React reads that as a hydration mismatch. The absent
|
|
|
13442
14051
|
attribute *is* the list, which the stylesheet reads as the base rule, so
|
|
13443
14052
|
only the departure has to be named. */
|
|
13444
14053
|
variant?: (HelixHeadlessTimePicker["variant"]) | undefined;
|
|
14054
|
+
/** A message under the picker, such as what is wrong with the answer.
|
|
14055
|
+
|
|
14056
|
+
While set, the picker is invalid and does not submit, as a field's
|
|
14057
|
+
`feedback` is, it is marked invalid to a reader and to CSS, and the
|
|
14058
|
+
controls a reader answers with are described by it. */
|
|
14059
|
+
feedback?: (HelixHeadlessTimePicker["feedback"]) | undefined;
|
|
14060
|
+
/** Whether the answer fails validation, marked on the controls a reader
|
|
14061
|
+
answers with and as `:state(invalid)`.
|
|
14062
|
+
|
|
14063
|
+
A flag a field that wraps the picker sets, since that field owns the
|
|
14064
|
+
label, the hint and the message; on its own, `feedback` both marks the
|
|
14065
|
+
picker and says why. */
|
|
14066
|
+
invalid?: (HelixHeadlessTimePicker["invalid"]) | undefined;
|
|
13445
14067
|
/** The value the control starts with. A form reset returns it to this value,
|
|
13446
14068
|
and to the `value` attribute where this one is not written, as a native
|
|
13447
14069
|
control resets to the `value` it declares. */
|
|
@@ -14440,6 +15062,30 @@ export type HelixHeadlessTrendVueProps = {
|
|
|
14440
15062
|
"down-label"?: (HelixHeadlessTrend["downLabel"]) | undefined;
|
|
14441
15063
|
/** The word read out for a move down. */
|
|
14442
15064
|
downLabel?: (HelixHeadlessTrend["downLabel"]) | undefined;
|
|
15065
|
+
/** `Intl.NumberFormat` options `value` is written with, as React Aria's
|
|
15066
|
+
NumberField takes them: a percent, a currency, a unit or a number of
|
|
15067
|
+
decimals. Written as JSON in the attribute.
|
|
15068
|
+
|
|
15069
|
+
```html
|
|
15070
|
+
<helix-trend value="-0.084" format-options='{"style":"percent","maximumFractionDigits":1}'></helix-trend>
|
|
15071
|
+
```
|
|
15072
|
+
|
|
15073
|
+
The example says "Down 8.4%". The size is written without a sign, since
|
|
15074
|
+
the arrow and the word say which way; set `signDisplay` for one. Absent
|
|
15075
|
+
writes the number as the locale writes any number. */
|
|
15076
|
+
"format-options"?: (HelixHeadlessTrend["formatOptions"]) | undefined;
|
|
15077
|
+
/** `Intl.NumberFormat` options `value` is written with, as React Aria's
|
|
15078
|
+
NumberField takes them: a percent, a currency, a unit or a number of
|
|
15079
|
+
decimals. Written as JSON in the attribute.
|
|
15080
|
+
|
|
15081
|
+
```html
|
|
15082
|
+
<helix-trend value="-0.084" format-options='{"style":"percent","maximumFractionDigits":1}'></helix-trend>
|
|
15083
|
+
```
|
|
15084
|
+
|
|
15085
|
+
The example says "Down 8.4%". The size is written without a sign, since
|
|
15086
|
+
the arrow and the word say which way; set `signDisplay` for one. Absent
|
|
15087
|
+
writes the number as the locale writes any number. */
|
|
15088
|
+
formatOptions?: (HelixHeadlessTrend["formatOptions"]) | undefined;
|
|
14443
15089
|
/** Which movement counts as an improvement for this metric.
|
|
14444
15090
|
|
|
14445
15091
|
Absent states the movement without judging it, which is the honest default:
|
|
@@ -14447,6 +15093,11 @@ revenue up is good news and latency up is bad news, and only the consumer
|
|
|
14447
15093
|
knows which one this is. Set it once per metric and it holds while the
|
|
14448
15094
|
movement changes underneath. */
|
|
14449
15095
|
good?: (HelixHeadlessTrend["good"]) | undefined;
|
|
15096
|
+
/** The locale `value` is written in, such as `de` for `1.234,5`.
|
|
15097
|
+
|
|
15098
|
+
Absent uses the runtime's own. Set it on a page rendered on a server, so
|
|
15099
|
+
the server and the browser write the figure alike. */
|
|
15100
|
+
locale?: (HelixHeadlessTrend["locale"]) | undefined;
|
|
14450
15101
|
/** Which way the measurement moved.
|
|
14451
15102
|
|
|
14452
15103
|
Absent is neutral, so a trend with nothing to report draws a bar rather
|
|
@@ -14465,6 +15116,14 @@ three. */
|
|
|
14465
15116
|
"up-label"?: (HelixHeadlessTrend["upLabel"]) | undefined;
|
|
14466
15117
|
/** The word read out for a move up. */
|
|
14467
15118
|
upLabel?: (HelixHeadlessTrend["upLabel"]) | undefined;
|
|
15119
|
+
/** The change as a signed number, such as `0.12` or `-8`, which sets the
|
|
15120
|
+
movement by its sign and is written as the metric.
|
|
15121
|
+
|
|
15122
|
+
Above zero is up, below is down, and zero is neutral; `movement` wins when
|
|
15123
|
+
both are written. The size is written in the `value` part with
|
|
15124
|
+
`format-options` and `locale`, in place of a slotted metric. Absent leaves
|
|
15125
|
+
the movement to `movement` and the metric to the slot. */
|
|
15126
|
+
value?: (HelixHeadlessTrend["value"]) | undefined;
|
|
14468
15127
|
/** The word read out after the direction when the move is a setback. */
|
|
14469
15128
|
"worse-label"?: (HelixHeadlessTrend["worseLabel"]) | undefined;
|
|
14470
15129
|
/** The word read out after the direction when the move is a setback. */
|
|
@@ -14587,7 +15246,7 @@ Ignored once `active` is written. */
|
|
|
14587
15246
|
};
|
|
14588
15247
|
|
|
14589
15248
|
export type HelixHeadlessVideoPlaylistVueEvents = {
|
|
14590
|
-
/** The current entry changed. The playlist already holds the new entry when this is sent, and `detail.previous` is the entry it left. */
|
|
15249
|
+
/** The current entry changed. The playlist already holds the new entry when this is sent, and `detail.previous` is the entry it left. `currentEntry` is the entry itself, with its `src`, `poster` and name. */
|
|
14591
15250
|
"helix-activate": HelixHeadlessVideoPlaylistHelixActivateElementEvent;
|
|
14592
15251
|
/** The current entry is about to change. Cancelable: cancel it to keep the current entry. */
|
|
14593
15252
|
"helix-before-activate": HelixHeadlessVideoPlaylistHelixBeforeActivateElementEvent;
|
|
@@ -14697,7 +15356,11 @@ assumed: it is absent on iPhone and behind a flag in Firefox, and a button
|
|
|
14697
15356
|
that cannot work is worse than one that is not there.
|
|
14698
15357
|
|
|
14699
15358
|
The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
|
|
14700
|
-
`previous` and `next`.
|
|
15359
|
+
`previous` and `next`. `full` stands for `rewind`, `forward`, `speed`,
|
|
15360
|
+
`pip` and `remote` in that order, the controls that act on the video by
|
|
15361
|
+
themselves, as Web Awesome's `full` preset does, and a name it already
|
|
15362
|
+
holds is drawn once. `extra-controls="full"` is the whole bar, and
|
|
15363
|
+
`overflow-controls="full"` puts all of it behind one button.
|
|
14701
15364
|
|
|
14702
15365
|
**`previous` and `next` do nothing to the video, and are offered anyway.**
|
|
14703
15366
|
They announce `helix-previous` and `helix-next` and stop there, so what
|
|
@@ -14727,7 +15390,11 @@ assumed: it is absent on iPhone and behind a flag in Firefox, and a button
|
|
|
14727
15390
|
that cannot work is worse than one that is not there.
|
|
14728
15391
|
|
|
14729
15392
|
The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
|
|
14730
|
-
`previous` and `next`.
|
|
15393
|
+
`previous` and `next`. `full` stands for `rewind`, `forward`, `speed`,
|
|
15394
|
+
`pip` and `remote` in that order, the controls that act on the video by
|
|
15395
|
+
themselves, as Web Awesome's `full` preset does, and a name it already
|
|
15396
|
+
holds is drawn once. `extra-controls="full"` is the whole bar, and
|
|
15397
|
+
`overflow-controls="full"` puts all of it behind one button.
|
|
14731
15398
|
|
|
14732
15399
|
**`previous` and `next` do nothing to the video, and are offered anyway.**
|
|
14733
15400
|
They announce `helix-previous` and `helix-next` and stop there, so what
|
|
@@ -15038,6 +15705,10 @@ export type HelixHeadlessVirtualListHelixRangeChangeElementEvent =
|
|
|
15038
15705
|
HelixHeadlessVirtualListElementEvent<HelixRangeChangeEvent>;
|
|
15039
15706
|
|
|
15040
15707
|
export type HelixHeadlessVirtualListVueProps = {
|
|
15708
|
+
/** How many items a line holds. One, the default, is a list; more lays the
|
|
15709
|
+
items out as a grid of that many equal columns, windowed a line at a
|
|
15710
|
+
time, with Left and Right moving along a line. */
|
|
15711
|
+
columns?: (HelixHeadlessVirtualList["columns"]) | undefined;
|
|
15041
15712
|
/** The height of one row, in pixels, used to find the row at a scroll offset.
|
|
15042
15713
|
|
|
15043
15714
|
An estimate rather than a measurement while `measured` is off, which is
|
|
@@ -15136,6 +15807,8 @@ export type CustomCssProperties = {
|
|
|
15136
15807
|
"--bar-chart-secondary"?: (string) | undefined;
|
|
15137
15808
|
/** The gradient for a bar, named per bar so the styled tier can use it as the `fill`. It is always drawn, and used only when `wash="gradient"` is set. */
|
|
15138
15809
|
"--chart-bar-wash"?: (string) | undefined;
|
|
15810
|
+
/** Written on the control inside each toggle button of a group with `selection-mode`: `1` while it is pressed and `0` while it is not. Read it in a `::part(button)` rule to draw the pressed look. */
|
|
15811
|
+
"--button-group-pressed"?: (string) | undefined;
|
|
15139
15812
|
/** Space between slides. Your stylesheet sets it, and the component uses it to measure the run. */
|
|
15140
15813
|
"--carousel-gap"?: (string) | undefined;
|
|
15141
15814
|
/** The size of one pane. Your stylesheet sets it, and the component uses it to measure the run. */
|
|
@@ -15224,6 +15897,10 @@ export type CustomCssProperties = {
|
|
|
15224
15897
|
"--megamenu-surface-inline-size"?: (string) | undefined;
|
|
15225
15898
|
/** Where the panel starts, measured from the bar above it. */
|
|
15226
15899
|
"--megamenu-top"?: (string) | undefined;
|
|
15900
|
+
/** The trigger's width, written on the panel while it is open, as in `min-inline-size: var(--floating-anchor-inline-size)`. Read it; a value set here is written over. */
|
|
15901
|
+
"--floating-anchor-inline-size"?: (string) | undefined;
|
|
15902
|
+
/** The room between the panel and the edge of the screen it opens toward, written on the panel while it is open. Read it; a value set here is written over. */
|
|
15903
|
+
"--floating-available-block-size"?: (string) | undefined;
|
|
15227
15904
|
/** Where a bound sits on the arc, as a length along it. */
|
|
15228
15905
|
"--meter-along"?: (string) | undefined;
|
|
15229
15906
|
/** Where a bound sits on a linear track, as a percentage. */
|
|
@@ -15244,6 +15921,8 @@ export type CustomCssProperties = {
|
|
|
15244
15921
|
"--rating-step"?: (string) | undefined;
|
|
15245
15922
|
/** The number of steps in the whole row: `max` divided by `step`. */
|
|
15246
15923
|
"--rating-steps"?: (string) | undefined;
|
|
15924
|
+
/** How large a point is drawn under `size-by`, from 0 to 1, by area. The component writes it, and the stylesheet that sizes the point reads it. */
|
|
15925
|
+
"--chart-point-weight"?: (string) | undefined;
|
|
15247
15926
|
/** A point's horizontal position, as a percentage. The component writes it. */
|
|
15248
15927
|
"--chart-point-x"?: (string) | undefined;
|
|
15249
15928
|
/** A point's vertical position, as a percentage from the top. The component writes it. */
|
|
@@ -15254,6 +15933,8 @@ export type CustomCssProperties = {
|
|
|
15254
15933
|
"--scroll-area-scroll-fraction"?: (string) | undefined;
|
|
15255
15934
|
/** The share of the track the thumb covers, from 0 to 1, which is how much of the content is in view. Written on each `scrollbar` part. */
|
|
15256
15935
|
"--scroll-area-thumb-fraction"?: (string) | undefined;
|
|
15936
|
+
/** Where a bubble's thumb is, as a fraction of the track, 0 to 1. Set on each `tooltip` part. */
|
|
15937
|
+
"--slider-at"?: (string) | undefined;
|
|
15257
15938
|
/** The value as a fraction of the range, 0 to 1. */
|
|
15258
15939
|
"--slider-fraction"?: (string) | undefined;
|
|
15259
15940
|
/** Where the filled span starts, as a fraction of the track, 0 to 1: a range's lower thumb, or a single thumb's `origin`. */
|
|
@@ -15298,19 +15979,19 @@ export type CustomCssProperties = {
|
|
|
15298
15979
|
// Note: Some tooling expects this augmentation under "@vue/runtime-core", while
|
|
15299
15980
|
// other docs/examples use "vue". We emit both for compatibility.
|
|
15300
15981
|
export interface WcToolkitVueGlobalComponents {
|
|
15301
|
-
/** Holds its own open state. Used alone, outside an accordion, it works as a disclosure. The trigger sits inside a heading, so a screen reader lists the section with the page's headings. The level is the item's 'heading-level', then the accordion's, then 3. Content stays mounted when the item is closed, so it can animate and its text is present in server-rendered HTML.
|
|
15982
|
+
/** Holds its own open state. Used alone, outside an accordion, it works as a disclosure. The trigger sits inside a heading, so a screen reader lists the section with the page's headings. The level is the item's 'heading-level', then the accordion's, then 3. Content stays mounted when the item is closed, so it can animate and its text is present in server-rendered HTML. The browser's find in page searches a closed section, and a match opens it, with 'helix-before-open' first, as React Aria's disclosure does. Closed content is 'hidden="until-found"', which hides it with no stylesheet loaded and keeps it out of the tab order and the accessibility tree. A section that closes keeps its content drawn until the content part's animations and transitions end, so a sheet that animates the section closed shows the content shrinking rather than an empty box. Set 'hidden-until-found="false"' and a closed section is 'hidden' and 'inert' instead, and find in page skips it. While it is open, the content part carries the content's height as '--accordion-content-height', as Radix's accordion does, for a stylesheet that animates the section open with keyframes of its own. */
|
|
15302
15983
|
"helix-headless-accordion-item": DefineCustomElement<
|
|
15303
15984
|
HelixHeadlessAccordionItem,
|
|
15304
15985
|
HelixHeadlessAccordionItemVueProps,
|
|
15305
15986
|
HelixHeadlessAccordionItemVueEvents
|
|
15306
15987
|
>;
|
|
15307
|
-
/** Holds the mode. Each item coordinates itself: when you click an item, it finds the nearest accordion, reads the mode, and closes the other items. The accordion does not listen for items opening. 'helix-before-open' does not bubble and is not composed, because overlays nest and an inner overlay's events must stay separate from the outer one's. Items are found when they are clicked, so there is no registry to keep up to date. An item added after render coordinates on its first click. Items are matched with 'instanceof HelixHeadlessAccordionItem', so the headless tier does not depend on the styled tier's tag names. Keys, on a trigger: Up and Down Arrow move to the previous and the next trigger, and so do Left and Right, wrapping at the ends; Home and End go to the first and the last. Enter and Space open and close the section. Disabled sections are passed over. Each trigger is a button with 'aria-expanded' and 'aria-controls', inside a heading, level 3 unless 'heading-level' says otherwise, so the sections are in a screen reader's list of headings. An open section is a region named by its trigger. Set the level that fits the page's outline. */
|
|
15988
|
+
/** Holds the mode. Each item coordinates itself: when you click an item, it finds the nearest accordion, reads the mode, and closes the other items. The accordion does not listen for items opening. 'helix-before-open' does not bubble and is not composed, because overlays nest and an inner overlay's events must stay separate from the outer one's. Items are found when they are clicked, so there is no registry to keep up to date. An item added after render coordinates on its first click. Items are matched with 'instanceof HelixHeadlessAccordionItem', so the headless tier does not depend on the styled tier's tag names. Keys, on a trigger: Up and Down Arrow move to the previous and the next trigger, and so do Left and Right, wrapping at the ends; Home and End go to the first and the last. Enter and Space open and close the section. Disabled sections are passed over. Each trigger is a button with 'aria-expanded' and 'aria-controls', inside a heading, level 3 unless 'heading-level' says otherwise, so the sections are in a screen reader's list of headings. An open section is a region named by its trigger. Set the level that fits the page's outline. Find in page searches the closed sections too, and opens the one it matches in. 'hidden-until-found="false"' turns that off. */
|
|
15308
15989
|
"helix-headless-accordion": DefineCustomElement<
|
|
15309
15990
|
HelixHeadlessAccordion,
|
|
15310
15991
|
HelixHeadlessAccordionVueProps,
|
|
15311
15992
|
HelixHeadlessAccordionVueEvents
|
|
15312
15993
|
>;
|
|
15313
|
-
/** An announcement is a banner above the page header with news about the whole site or session, such as a trial ending, a degraded service, or a change of terms. For a passage inside a document, use 'Callout', which stays where it is placed and cannot be dismissed. The announcement is always a polite live region, whatever its 'tone'. 'role="alert"' is assertive and interrupts a screen reader, so an announcement served with the page would interrupt on every page load. The live region is its own part. When the announcement appears after the page has loaded, the message is written into the region one frame later, so screen readers read it reliably, and the region is emptied seven seconds later. While the region holds the copy, the message itself is hidden from screen readers, so it is in the page once. When the announcement is in the served HTML, the region stays empty and nothing is read out. The dismiss button fires 'helix-dismiss', and the announcement stays in the document, so remove it in your listener. The event is cancelable, and 'dismiss()' returns 'false' when a listener calls 'preventDefault()'. When your listener removes an announcement whose dismiss button has focus, focus moves to the dismiss button of the announcement beside it. With no other announcement beside it, move focus yourself, for example to the page's main heading. Set 'duration' to dismiss it after a time. The clock stops while the pointer or focus is on the announcement, and continues from what was left, so a reader partway through is not cut off. When the time runs out it sends 'helix-dismiss', as the button does. */
|
|
15994
|
+
/** An announcement is a banner above the page header with news about the whole site or session, such as a trial ending, a degraded service, or a change of terms. For a passage inside a document, use 'Callout', which stays where it is placed and cannot be dismissed. The announcement is always a polite live region, whatever its 'tone'. 'role="alert"' is assertive and interrupts a screen reader, so an announcement served with the page would interrupt on every page load. The live region is its own part. When the announcement appears after the page has loaded, the message is written into the region one frame later, so screen readers read it reliably, and the region is emptied seven seconds later. While the region holds the copy, the message itself is hidden from screen readers, so it is in the page once. When the announcement is in the served HTML, the region stays empty and nothing is read out. The dismiss button fires 'helix-dismiss', and the announcement stays in the document, so remove it in your listener. The event is cancelable, and 'dismiss()' returns 'false' when a listener calls 'preventDefault()'. When your listener removes an announcement whose dismiss button has focus, focus moves to the dismiss button of the announcement beside it. With no other announcement beside it, move focus yourself, for example to the page's main heading. **The announcement is a landmark region**, named by 'label', "Announcement" unless you set it, so a screen reader lists it among the page's regions. 'hotkey', F6 unless you set it, moves focus to the announcement's first control, an action or the dismiss button, and pressed there moves focus back to where it was, as React Aria's toast region does. An announcement with no control leaves the key to the browser. When an announcement that the key moved focus into is removed with focus still inside, focus goes back to where it was before the key. **Set 'queued' to show several announcements one at a time.** A queued announcement waits while a queued announcement before it in the same parent is still there, and shows when that one is removed: its message is then read out, and its 'duration' starts. While it waits it renders nothing, is no region, and carries ':state(waiting)'. A server cannot see the announcements beside it, so a served page shows every one until the script runs. Set 'duration' to dismiss it after a time. The clock stops while the pointer or focus is on the announcement, and continues from what was left, so a reader partway through is not cut off. It stops while the page is hidden too, in another tab or a minimized window, so the message is not spent where nobody can see it. While the clock is stopped the announcement carries ':state(paused)'. When the time runs out it sends 'helix-dismiss', as the button does. */
|
|
15314
15995
|
"helix-headless-announcement": DefineCustomElement<
|
|
15315
15996
|
HelixHeadlessAnnouncement,
|
|
15316
15997
|
HelixHeadlessAnnouncementVueProps,
|
|
@@ -15322,7 +16003,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15322
16003
|
HelixHeadlessAppHeaderVueProps,
|
|
15323
16004
|
HelixHeadlessAppHeaderVueEvents
|
|
15324
16005
|
>;
|
|
15325
|
-
/** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. The drawing is hidden from screen readers. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. */
|
|
16006
|
+
/** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. 'overlap' draws every band from zero, one in front of another, so each part's own amount is its height: the first column is in front. Use it to compare the parts with each other; the scale then fits the largest part rather than the total. The drawing is hidden from screen readers. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. */
|
|
15326
16007
|
"helix-headless-area-chart": DefineCustomElement<
|
|
15327
16008
|
HelixHeadlessAreaChart,
|
|
15328
16009
|
HelixHeadlessAreaChartVueProps,
|
|
@@ -15334,13 +16015,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15334
16015
|
HelixHeadlessAvatarGroupVueProps,
|
|
15335
16016
|
HelixHeadlessAvatarGroupVueEvents
|
|
15336
16017
|
>;
|
|
15337
|
-
/** Shows 'src' until it fails to load. Without an image, or after a failure, the default slot is shown, and its own fallback is the initials. The host carries the accessible name, taken from 'name'. The '<img>' has an empty 'alt' and the initials are hidden from assistive technology, so the name is announced once. Set 'aria-label' on the host to override 'name' when a person's name does not describe what the avatar stands for. 'load' and 'error' are re-dispatched from the host, because they are not composed and would otherwise stop at the shadow boundary. */
|
|
16018
|
+
/** Shows 'src' until it fails to load. Without an image, or after a failure, the default slot is shown, and its own fallback is the initials. The host carries the accessible name, taken from 'name'. The '<img>' has an empty 'alt' and the initials are hidden from assistive technology, so the name is announced once. Set 'aria-label' on the host to override 'name' when a person's name does not describe what the avatar stands for. 'load' and 'error' are re-dispatched from the host, because they are not composed and would otherwise stop at the shadow boundary. 'status' says which of the two happened, for a listener that arrives after it, and the 'loading', 'loaded' and 'error' custom states say the same to a stylesheet. **On a server the avatar sends the picture's place**, an '<img>' that the browser fetches while it reads the page. The initials stand in only on the client: at once where the picture failed before the page hydrated, and after 'fallback-delay' where it is still on its way. 'load' or 'error' for a picture that settled before hydration is sent a task after the avatar hydrates, so a page's own scripts are listening by then. */
|
|
15338
16019
|
"helix-headless-avatar": DefineCustomElement<
|
|
15339
16020
|
HelixHeadlessAvatar,
|
|
15340
16021
|
HelixHeadlessAvatarVueProps,
|
|
15341
16022
|
HelixHeadlessAvatarVueEvents
|
|
15342
16023
|
>;
|
|
15343
|
-
/** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **A badge wrapped around a control
|
|
16024
|
+
/** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. 'format-options' writes a count with 'Intl.NumberFormat', in 'locale': 'format-options='{"notation":"compact"}'' shows 1,200 as '1.2K'. Absent, the count is shown as it was given. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **A badge wrapped around a control describes it.** The control is the first element in the badge that takes focus, and its description is the badge's words, so focusing '<helix-badge value="8" label="{count} unread"><button>Inbox </button></helix-badge>' announces "Inbox, button, 8 unread", current as the count changes. A control that already has a description keeps its own. The count is also a status of its own, read when it changes. **Put the badge inside the control to have its count read with the control's name**, as Web Awesome and Shoelace do: '<button>Inbox <helix-badge value="8" label="8 unread"></helix-badge></button>' is the button "Inbox 8 unread", and stays current as the count changes. The styled tier's 'placement="inline"' draws the mark in the line for that case. */
|
|
15344
16025
|
"helix-headless-badge": DefineCustomElement<
|
|
15345
16026
|
HelixHeadlessBadge,
|
|
15346
16027
|
HelixHeadlessBadgeVueProps,
|
|
@@ -15352,7 +16033,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15352
16033
|
HelixHeadlessBarChartVueProps,
|
|
15353
16034
|
HelixHeadlessBarChartVueEvents
|
|
15354
16035
|
>;
|
|
15355
|
-
/** Renders a
|
|
16036
|
+
/** Renders a figure holding the '<blockquote>' and a caption for the attribution, the structure the HTML spec describes. The attribution sits outside the quotation because it is about the quotation, and it names the figure, so a screen reader reads the source as the figure's caption. **The figure is a '<div role="figure">'**, so the headless tier draws no space around the quotation. A '<figure>' takes a 40px indent and a line of space above and below from the browser's own sheet, which every page had to reset. The '<blockquote>' keeps its own margins, as a bare one does. A screen reader meets the same figure, named by its caption. **A figure only while there is an attribution.** With nothing in the caption the figure has no name and nothing to say, so the role and its name are dropped and a reader meets the quotation alone. A server cannot see what is slotted, so it serves the figure, and the client drops it after hydration; an 'attribution' written as words is served exactly. **Quotation marks follow the language**, under 'marks'. The opening mark is the one the browser sets for a '<q>' in the element's language, „ under 'lang="de"' and « under 'lang="fr"', and a 'Quote' inside the passage takes the inner marks. The mark is drawn, not read: a screen reader hears the passage. A passage under 'marks' that starts with a mark typed into the text would show two, and warns once, with the runtime kind 'typed-marks'. **'cite' is the source's URL**, which the browser keeps and does not show. Words in it, such as the author's name, warn once, with the runtime kind 'cite-not-url'. For a quotation inside a sentence, use 'Quote'. */
|
|
15356
16037
|
"helix-headless-blockquote": DefineCustomElement<
|
|
15357
16038
|
HelixHeadlessBlockquote,
|
|
15358
16039
|
HelixHeadlessBlockquoteVueProps,
|
|
@@ -15370,13 +16051,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15370
16051
|
HelixHeadlessBreadcrumbsVueProps,
|
|
15371
16052
|
HelixHeadlessBreadcrumbsVueEvents
|
|
15372
16053
|
>;
|
|
15373
|
-
/** Sets 'role="group"' on the host through internals, and 'label' names the group. Without a name, a screen reader announces the buttons as separate controls, and a development build warns once with the kind 'missing-name'. The group does not manage focus, so each button keeps its own tab stop. For one tab stop with arrow keys between
|
|
16054
|
+
/** Sets 'role="group"' on the host through internals, and 'label' names the group. Without a name, a screen reader announces the buttons as separate controls, and a development build warns once with the kind 'missing-name'. The group does not manage focus, so each button keeps its own tab stop. For one tab stop with arrow keys between a mix of controls, the APG toolbar pattern, use Toolbar. Buttons are slotted, so they stay your own elements and keep their own appearance and size. **Buttons that stay pressed.** With 'selection-mode', each button with a 'value' is a toggle button: a press presses or releases it, and it says so with 'aria-pressed'. 'single' keeps one pressed at a time, and a press on the pressed one releases it. 'multiple' lets any number be pressed. 'value' is the pressed values, comma separated. A press sends a cancelable 'helix-before-change' with the value it would leave, then 'change'. The pressed state is written on the control inside each button's shadow root, so the markup you rendered is never changed and a framework hydrating it sees what its server sent. That is also why only Helix buttons are toggles: a native '<button>' or a button without a 'value' stays a plain action button in the group, and a native one without its own 'aria-pressed' warns once, with the runtime kind 'untold-toggle'. The inner control also carries '--button-group-pressed', '1' or '0', for a '::part(button)' rule of yours. Use Toggle Group instead for a choice that belongs in a form, or one where the arrow keys choose as they move: it is a 'radiogroup' of options with a form value, 'required' and validation. A Button Group in a selection mode is a set of actions that stay on, such as bold and italic, or a view that a press switches, and it submits nothing. **Keyboard.** In a selection mode the group is one tab stop: the button focus was last on, then the first pressed one, then the first one. | Key | What it does | |---|---| | Right, Down | Moves to the next button, from the last back to the first. | | Left, Up | Moves to the button before, from the first round to the last. | | Home, End | Moves to the first or the last button. | | Space, Enter | Presses or releases the focused button. | Left and Right swap on a right-to-left page, and a disabled button is passed over. In a selection mode the group is a 'toolbar', with 'aria-orientation' under 'orientation="vertical"'. Inside a toolbar it stays a named 'group', and the toolbar's own arrow keys walk its buttons, so a reader meets one toolbar. */
|
|
15374
16055
|
"helix-headless-button-group": DefineCustomElement<
|
|
15375
16056
|
HelixHeadlessButtonGroup,
|
|
15376
16057
|
HelixHeadlessButtonGroupVueProps,
|
|
15377
16058
|
HelixHeadlessButtonGroupVueEvents
|
|
15378
16059
|
>;
|
|
15379
|
-
/** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button calls 'requestSubmit()'
|
|
16060
|
+
/** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button puts a hidden native submit button carrying its 'name', 'value' and 'form*' overrides into the form, calls 'requestSubmit()' with it, which runs validation, unlike 'submit()', and takes it out again, as Shoelace and Web Awesome do. A 'submit' listener reads that button as 'event.submitter', so 'event.submitter.value' and 'new FormData(form, event.submitter)' tell two submit buttons apart. As the first submit button in its form, it is the form's default button: Enter in a text field of the form presses it, as it presses a native one. Set 'pending' while the action a press started is still running. The button keeps focus and refuses presses, and a reader on it hears 'pending-label'. Every press that acts sends 'helix-press' with what pressed it in 'detail.pointerType': 'mouse', 'pen', 'touch', 'keyboard', or 'virtual' for a screen reader's press or a script's 'click()', as React Aria's 'onPress' does. It is sent once the press has done its own work, before 'click' reaches listeners on the element, and never for a disabled or pending button. **Keyboard.** Enter and Space press the button, as on a native one. */
|
|
15380
16061
|
"helix-headless-button": DefineCustomElement<
|
|
15381
16062
|
HelixHeadlessButton,
|
|
15382
16063
|
HelixHeadlessButtonVueProps,
|
|
@@ -15400,13 +16081,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15400
16081
|
HelixHeadlessCanvasNodeVueProps,
|
|
15401
16082
|
HelixHeadlessCanvasNodeVueEvents
|
|
15402
16083
|
>;
|
|
15403
|
-
/** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - Shift with an arrow key moves the card. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
|
|
16084
|
+
/** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Set 'snap' to a length in the document's units, such as '32', and a card that is moved or resized lands on a multiple of it. Carrying a card, a corner, a connection, or the selection box near the edge of the board moves the board under it, so a card can be taken to a place off screen in one drag. A connection let go within 20 pixels of a card arrives at it. A double click on the empty board zooms in about that point, and Shift with a double click zooms out. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - Shift with an arrow key moves the card: by 16 units, or to the next multiple of 'snap' where it is set. Alt with an arrow key resizes it from its bottom right corner the same way. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. - What a key changes that a reader cannot see is said: where a card moved to, its new size, how many cards are selected, and the zoom. A selected card or connection says so when a reader arrives on it. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. So a finger connects two cards with three taps: the card, one of its points, and the card to connect to. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
|
|
15404
16085
|
"helix-headless-canvas": DefineCustomElement<
|
|
15405
16086
|
HelixHeadlessCanvas,
|
|
15406
16087
|
HelixHeadlessCanvasVueProps,
|
|
15407
16088
|
HelixHeadlessCanvasVueEvents
|
|
15408
16089
|
>;
|
|
15409
|
-
/** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'label', as a Stat Group is named, or with 'aria-label' or 'aria-labelledby'. These are the only names that work with server rendering, because reading a title from the light DOM needs a DOM, and the server has none. 'label' is set through 'ElementInternals', so it writes no attribute onto the card. **A named card is a group**, so a reader entering it hears its name; an unnamed one has no role, since a group with no name only adds "group" to what a reader says. Each region's slot is a part of the same name, 'body' for the main content, as Web Awesome's card names its regions. A slot draws no box, so a part passes inherited properties to what is slotted, and a page wanting a box there gives it one with 'display'. 'header-actions' and 'footer-actions' hold controls at the end of the header's and the footer's line, as Web Awesome's card does. While one holds something, its line is a 'header-row' or 'footer-row' part; otherwise there is no wrapper and every region is a bare slot. A server cannot see slotted content, so served actions sit on their own line until the script runs. */
|
|
16090
|
+
/** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'label', as a Stat Group is named, or with 'aria-label' or 'aria-labelledby'. These are the only names that work with server rendering, because reading a title from the light DOM needs a DOM, and the server has none. 'label' is set through 'ElementInternals', so it writes no attribute onto the card. **A named card is a group**, so a reader entering it hears its name; an unnamed one has no role, since a group with no name only adds "group" to what a reader says. Each region's slot is a part of the same name, 'body' for the main content, as Web Awesome's card names its regions. A slot draws no box, so a part passes inherited properties to what is slotted, and a page wanting a box there gives it one with 'display'. 'header-actions' and 'footer-actions' hold controls at the end of the header's and the footer's line, as Web Awesome's card does. While one holds something, its line is a 'header-row' or 'footer-row' part; otherwise there is no wrapper and every region is a bare slot. A server cannot see slotted content, so served actions sit on their own line until the script runs. **The card says which regions it holds**, as ':state(has-media)', ':state(has-header)' and ':state(has-footer)', so a sheet can draw a card with a header differently, as Web Awesome's 'with-header' does, with no attribute written onto the card. Read in the browser, so a served card carries none until the script runs. */
|
|
15410
16091
|
"helix-headless-card": DefineCustomElement<
|
|
15411
16092
|
HelixHeadlessCard,
|
|
15412
16093
|
HelixHeadlessCardVueProps,
|
|
@@ -15430,7 +16111,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15430
16111
|
HelixHeadlessChatMessageVueProps,
|
|
15431
16112
|
HelixHeadlessChatMessageVueEvents
|
|
15432
16113
|
>;
|
|
15433
|
-
/** Chat has no positioning, no backdrop, and no trigger, so you can put it in any container, such as a page, a sidebar, a modal, or a floating panel. The transcript stays pinned to the bottom, including while a streamed answer grows, until the user scrolls more than 'threshold' away from it. With 'history' set to 'more', reaching the top fires 'helix-history'. Set 'loading' while you fetch, then prepend the older turns. The turn the user was reading stays in place on screen. The log is 'aria-live="off"'. A separate status region announces each new turn once, when it has finished arriving. It skips the user's own turns unless they failed to send, turns loaded as history, and the turns already there when the transcript opened. Pass the turns as children or as 'turns' data. Do not use both. Children render from the server and suit most conversations. 'turns' draws a long transcript one window at a time, so the log needs a block size of its own. **A conversation is built from three elements.** The chat holds the transcript, a 'Chat.Message' stands for each turn, and a 'Chat.Composer' sits in the 'composer' slot. When the user sends, 'helix-send' reaches the chat: add their turn with 'author="me"' and 'state="sending"', then set 'state' to 'sent' or 'failed' when your server answers. Add the reply as a turn with 'state="streaming"', write its text as it arrives, and set 'state' to 'sent' when it is complete. While the user types, the composer sends 'helix-typing', which you can pass on to the other side. When the other side types, set 'typing' to their name: the status band draws three dots and "Ada is typing" ('typing-label'), which a screen reader hears, and clearing it takes them away. Anything slotted into 'status' is drawn first. A screen reader names each turn by its author and its time, such as "You, 2 minutes ago". Set 'me-label' and 'message-label' to say it in your language, and give each turn by 'them' an 'author-label'. A turn with neither an author label nor a time is named by 'turn-label', "Message". A turn from 'turns' is drawn in the chat's shadow root, so style it through the forwarded 'message-*' parts. A turn by 'me' also gets each part with '-mine' added, and the turn's state adds 'message-meta-failed', 'message-content-sending', and 'message-content-streaming'. To style each participant differently,
|
|
16114
|
+
/** Chat has no positioning, no backdrop, and no trigger, so you can put it in any container, such as a page, a sidebar, a modal, or a floating panel. The transcript stays pinned to the bottom, including while a streamed answer grows, until the user scrolls more than 'threshold' away from it. With 'history' set to 'more', reaching the top fires 'helix-history'. Set 'loading' while you fetch, then prepend the older turns. The turn the user was reading stays in place on screen. The log is 'aria-live="off"'. A separate status region announces each new turn once, when it has finished arriving. It skips the user's own turns unless they failed to send, turns loaded as history, and the turns already there when the transcript opened. Pass the turns as children or as 'turns' data. Do not use both. Children render from the server and suit most conversations. 'turns' draws a long transcript one window at a time, so the log needs a block size of its own. **A conversation is built from three elements.** The chat holds the transcript, a 'Chat.Message' stands for each turn, and a 'Chat.Composer' sits in the 'composer' slot. When the user sends, 'helix-send' reaches the chat: add their turn with 'author="me"' and 'state="sending"', then set 'state' to 'sent' or 'failed' when your server answers. Add the reply as a turn with 'state="streaming"', write its text as it arrives, and set 'state' to 'sent' when it is complete. While the user types, the composer sends 'helix-typing', which you can pass on to the other side. When the other side types, set 'typing' to their name: the status band draws three dots and "Ada is typing" ('typing-label'), which a screen reader hears, and clearing it takes them away. Anything slotted into 'status' is drawn first. A screen reader names each turn by its author and its time, such as "You, 2 minutes ago". Set 'me-label' and 'message-label' to say it in your language, and give each turn by 'them' an 'author-label'. A turn with neither an author label nor a time is named by 'turn-label', "Message". A turn from 'turns' is drawn in the chat's shadow root, so style it through the forwarded 'message-*' parts. A turn by 'me' also gets each part with '-mine' added, and the turn's state adds 'message-meta-failed', 'message-content-sending', and 'message-content-streaming'. To style each participant differently, give 'author-styles' the declarations for each author, such as '{"ada": "--chat-message-background-color: …"}': the message drawn for each of their turns takes them as its 'style', so the message's custom properties change for that author alone. Turns passed as children are styled by their 'author', such as 'helix-chat-message[author="ada"]'. */
|
|
15434
16115
|
"helix-headless-chat": DefineCustomElement<
|
|
15435
16116
|
HelixHeadlessChat,
|
|
15436
16117
|
HelixHeadlessChatVueProps,
|
|
@@ -15448,7 +16129,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15448
16129
|
HelixHeadlessCheckboxVueProps,
|
|
15449
16130
|
HelixHeadlessCheckboxVueEvents
|
|
15450
16131
|
>;
|
|
15451
|
-
/** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'line-numbers' to number the lines in a gutter beside the code, hidden from the accessibility tree and left out of a copy. Set 'highlight' to a function that turns the code into highlighted markup, such as one wrapping Shiki or Prism, and the block draws what it returns; the code stays in the slot, so the copy button and the page's own text are the code as written. Set 'expandable' on a block whose height is capped, such as by '--code-block-max-block-size', and a button under it shows every line and then fewer again, as a docs site's long example does. The button is drawn only while the cap hides something, says whether the block is expanded, and the block carries ':state(expanded)' while it is. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
|
|
16132
|
+
/** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'line-numbers' to number the lines in a gutter beside the code, hidden from the accessibility tree and left out of a copy. Set 'highlight' to a function that turns the code into highlighted markup, such as one wrapping Shiki or Prism, and the block draws what it returns; it is handed the block's 'language', so one function serves every block. The code stays in the slot, so the copy button and the page's own text are the code as written. Set 'expandable' on a block whose height is capped, such as by '--code-block-max-block-size', and a button under it shows every line and then fewer again, as a docs site's long example does. The button is drawn only while the cap hides something, says whether the block is expanded with 'aria-expanded', names the block it opens with 'aria-controls', and the block carries ':state(expanded)' while it is. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
|
|
15452
16133
|
"helix-headless-code-block": DefineCustomElement<
|
|
15453
16134
|
HelixHeadlessCodeBlock,
|
|
15454
16135
|
HelixHeadlessCodeBlockVueProps,
|
|
@@ -15472,7 +16153,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15472
16153
|
HelixHeadlessColorPickerVueProps,
|
|
15473
16154
|
HelixHeadlessColorPickerVueEvents
|
|
15474
16155
|
>;
|
|
15475
|
-
/** The list is a 'Listbox', which handles filtering, the empty state, the highlight, 'aria-activedescendant', and scrolling an option into view. This element handles the field, the panel, and the communication between them. The typed text and the value are separate. The text is a filter: it narrows the list and is then discarded. The value is the option you choose, and the field then shows that option's text. The filter clears on close, so a reopened combobox starts from the whole list. Focus stays in the text field. The arrow keys move through the list with the listbox's public 'navigate' method.
|
|
16156
|
+
/** The list is a 'Listbox', which handles filtering, the empty state, the highlight, 'aria-activedescendant', and scrolling an option into view. This element handles the field, the panel, and the communication between them. The typed text and the value are separate. The text is a filter: it narrows the list and is then discarded. The value is the option you choose, and the field then shows that option's text. The filter clears on close, so a reopened combobox starts from the whole list. Focus stays in the text field. The arrow keys move through the list with the listbox's public 'navigate' method. As typing narrows the list, a screen reader hears how many options are left, such as "3 results". Emptying the field and leaving it clears a single choice. **Keyboard.** | Key | What it does | |---|---| | Down, Up | On a closed field, opens the list on the chosen option, or the first or the last. In the open list, moves the highlight, round from the last option to the first. | | Page Down, Page Up | In the open list, moves the highlight by as many options as the list shows at once. | | Enter | Chooses the highlighted option. With nothing left in the list, creates what was typed with 'creatable', or takes it with 'allows-custom-value'. On a closed field, submits the form. | | Escape | Closes the list and puts the chosen words back. On a closed field, a second Escape clears a single choice. | | Tab | Closes the list and moves on. | | Backspace | With 'multiple', on an empty field, removes the last tag. | | Space, Home, End, letters | Edit the text. | **ARIA.** The input is the 'combobox', named by the label, with 'aria-expanded', 'aria-controls' naming the list, 'aria-autocomplete' ('both' with 'suggest', 'list' otherwise) and 'aria-activedescendant' on the highlighted option. The list is the listbox 'Listbox' describes. On Apple devices, where VoiceOver does not read the option the field points to, the field says it in a live region as the highlight moves, says how many options there are as the list opens, and says a choice once it is made, as React Aria's combobox does there. Set 'autocomplete' to let a browser's autofill choose an option. With 'multiple', each chosen option is a tag in the field with its own remove control. The panel stays open and the filter clears after each choice, so the next choice starts from the whole list. With 'creatable', the combobox offers a create row and fires 'helix-create'. It does not add the option. The options are your light DOM, and your framework would re-render over an element the combobox inserted, so add the option in your event handler. */
|
|
15476
16157
|
"helix-headless-combobox": DefineCustomElement<
|
|
15477
16158
|
HelixHeadlessCombobox,
|
|
15478
16159
|
HelixHeadlessComboboxVueProps,
|
|
@@ -15484,7 +16165,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15484
16165
|
HelixHeadlessCommandVueProps,
|
|
15485
16166
|
HelixHeadlessCommandVueEvents
|
|
15486
16167
|
>;
|
|
15487
|
-
/** Copies text to the clipboard and confirms the copy. The platform gives no feedback for a clipboard write, so without a confirmation a press that copies looks the same as one that fails. The confirmation and the event wait for the write to finish. The browser can refuse a clipboard write, for example on an insecure origin, in a document that is not focused, or after a gesture that does not qualify. A refused write, or nothing to copy, names the button with 'error-label' for the same moment a copy shows 'copied-label', draws a cross, and sends 'helix-copy-error'. 'from' copies from another element on the page: its text, an attribute written 'id[attribute]', or a property written 'id.property', read at the press. It takes the place of 'value'. It replaces Button's render and its press, so it never submits a form or sends a command: 'type', 'command', 'commandfor' and the 'form*' overrides have no effect, and the 'start' and 'end' slots and the 'text' part are not rendered. An 'aria-label' on the element names it before a copy, in place of 'label'. */
|
|
16168
|
+
/** Copies text to the clipboard and confirms the copy. The platform gives no feedback for a clipboard write, so without a confirmation a press that copies looks the same as one that fails. The confirmation and the event wait for the write to finish. The browser can refuse a clipboard write, for example on an insecure origin, in a document that is not focused, or after a gesture that does not qualify. A refused write, or nothing to copy, names the button with 'error-label' for the same moment a copy shows 'copied-label', draws a cross, and sends 'helix-copy-error'. 'from' copies from another element on the page: its text, an attribute written 'id[attribute]', or a property written 'id.property', read at the press. It takes the place of 'value'. It replaces Button's render and its press, so it never submits a form or sends a command: 'type', 'command', 'commandfor' and the 'form*' overrides have no effect, and the 'start' and 'end' slots and the 'text' part are not rendered. An 'aria-label' on the element names it before a copy, in place of 'label'. **Keyboard.** Enter and Space copy, as they press a native button. The button is named 'label', or the host's 'aria-label', and its name changes to 'copied-label' or 'error-label' for the moment after a press, which is what a screen reader on it hears. The tooltip shows the same words. */
|
|
15488
16169
|
"helix-headless-copy-button": DefineCustomElement<
|
|
15489
16170
|
HelixHeadlessCopyButton,
|
|
15490
16171
|
HelixHeadlessCopyButtonVueProps,
|
|
@@ -15508,7 +16189,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15508
16189
|
HelixHeadlessDatePickerVueProps,
|
|
15509
16190
|
HelixHeadlessDatePickerVueEvents
|
|
15510
16191
|
>;
|
|
15511
|
-
/** Each pair is its own element: the label is the '<dt>' and the value its '<dd>', and a screen reader hears them together however the list lays them out. The value is the default slot, because it varies and is often more than text, such as a tag, an avatar, or a link. The label is almost always text, so it is also a property. **For a label with several values, write each value as a '<dd>'**, such as the authors of a paper. The item then puts your '<dd>' elements after its '<dt>' in place of its own, so a screen reader hears one term and each of its descriptions, as in a native '<dl>'. A server cannot see your elements, so the served item wraps them in its own '<dd>' until it runs. */
|
|
16192
|
+
/** Each pair is its own element: the label is the '<dt>' and the value its '<dd>', and a screen reader hears them together however the list lays them out. The value is the default slot, because it varies and is often more than text, such as a tag, an avatar, or a link. The label is almost always text, so it is also a property. **For a label with several values, write each value as a '<dd>'**, such as the authors of a paper. The item then puts your '<dd>' elements after its '<dt>' in place of its own, so a screen reader hears one term and each of its descriptions, as in a native '<dl>'. A server cannot see your elements, so set 'several' as well, and the served item leaves them unwrapped too. Without it, the served item wraps them in its own '<dd>' until it runs. **Controls that act on the value**, such as a copy button, go in the 'actions' slot, drawn after the value inside its '<dd>', as Radix Themes' data list puts an icon button beside a value. A screen reader hears them as part of the description they act on. With several values, put each control inside the '<dd>' it acts on. */
|
|
15512
16193
|
"helix-headless-description-list-item": DefineCustomElement<
|
|
15513
16194
|
HelixHeadlessDescriptionListItem,
|
|
15514
16195
|
HelixHeadlessDescriptionListItemVueProps,
|
|
@@ -15526,7 +16207,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15526
16207
|
HelixHeadlessDialogVueProps,
|
|
15527
16208
|
HelixHeadlessDialogVueEvents
|
|
15528
16209
|
>;
|
|
15529
|
-
/** The separator role is on the rule inside the shadow root. A role does not need to cross the shadow boundary the way an IDREF does, so it can sit on the rendered element. The semantics are then in the server-rendered markup, with no attribute written by script after the element connects.
|
|
16210
|
+
/** The separator role is on the rule inside the shadow root. A role does not need to cross the shadow boundary the way an IDREF does, so it can sit on the rendered element. The semantics are then in the server-rendered markup, with no attribute written by script after the element connects. **The line is a separator**, as '<hr>' is, and as Radix Separator, React Aria Separator, and Web Awesome's divider are. It is named by any content set into it, so a screen reader says "Or, separator" where you wrote "Or" on the line. Set 'decorative' on a rule that separates nothing, such as one under a heading or between the facts of a byline, and it leaves the accessibility tree. Use 'orientation="vertical"' between items on one line. A vertical divider stretches to fit its flex parent and sets no height of its own. **Inside a toolbar it runs across the toolbar** without being told: vertical in a horizontal toolbar and horizontal in a vertical one, with 'aria-orientation' to match, as React Aria's separator does inside a toolbar. Inside means a child of Toolbar or of the page's own 'role="toolbar"'. An 'orientation' you write still wins. A server cannot see the toolbar, so the turn arrives with hydration, inside the shadow root. */
|
|
15530
16211
|
"helix-headless-divider": DefineCustomElement<
|
|
15531
16212
|
HelixHeadlessDivider,
|
|
15532
16213
|
HelixHeadlessDividerVueProps,
|
|
@@ -15538,13 +16219,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15538
16219
|
HelixHeadlessDonutChartVueProps,
|
|
15539
16220
|
HelixHeadlessDonutChartVueEvents
|
|
15540
16221
|
>;
|
|
15541
|
-
/** Uses 'MixinControllerOpen', so 'open', 'defaultOpen', and the 'helix-before-open' and 'helix-before-close' events work the same way as on an accordion item. The drawer is modal by default, which means four things: - focus is trapped inside - Escape and a press outside close it - the page behind is covered - the page behind does not scroll A drawer with 'modal="false"' leaves the page usable and still closes on Escape, in a browser without 'closedby' as well. **A touch or a pen swipes it away**, toward the edge it came from, resolved against the writing direction. A swipe past halfway, or a quick one, closes it through the same request as every other way out. 'snap-points' lists the fractions of the panel a reader can leave on screen, such as '0.5 1' for a sheet that rests half open: it opens at the smallest, and a swipe settles at the nearest. While a swipe moves the panel, the distance is written on it as '--drawer-swipe-x' and '--drawer-swipe-y'. 'swipe="false"' turns swiping off. 'snap' is the snap point the panel rests at, and ':state(snapped)' is on the host while that is less than the whole panel. 'snapTo()' moves it to another. **Focus moving to a control past the window's edge opens the panel to its largest snap point**, so a reader moving through a half open sheet with 'Tab' never lands on a control they cannot see. Set 'dismissible' to draw a close control in the corner, labeled by 'dismiss-label', as 'Dialog' draws one. The panel's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. Content stays mounted when the drawer is closed, so it is in the server markup and can animate. A closed '<dialog>' is already out of the tab order and the accessibility tree, so the drawer does not write 'inert'. The 'role', 'aria-modal', and the scrim also come from the '<dialog>' element. 'drawer-root.ssr.spec.ts' checks that the panel has no hand-written 'inert' or 'role'. Open the drawer declaratively with the platform's invoker attributes: '''html <helix-headless-button commandfor="nav" command="--toggle">Menu</helix-headless-button> <helix-headless-drawer id="nav">…</helix-headless-drawer> ''' */
|
|
16222
|
+
/** Uses 'MixinControllerOpen', so 'open', 'defaultOpen', and the 'helix-before-open' and 'helix-before-close' events work the same way as on an accordion item. The drawer is modal by default, which means four things: - focus is trapped inside: 'Tab' from the last control goes to the first, and 'Shift+Tab' from the first to the last, as in 'Dialog' - Escape and a press outside close it - the page behind is covered - the page behind does not scroll A drawer with 'modal="false"' leaves the page usable and still closes on Escape, in a browser without 'closedby' as well. **A touch or a pen swipes it away**, toward the edge it came from, resolved against the writing direction. A swipe past halfway, or a quick one, closes it through the same request as every other way out. 'snap-points' lists the fractions of the panel a reader can leave on screen, such as '0.5 1' for a sheet that rests half open: it opens at the smallest, and a swipe settles at the nearest. While a swipe moves the panel, the distance is written on it as '--drawer-swipe-x' and '--drawer-swipe-y'. 'swipe="false"' turns swiping off. 'snap' is the snap point the panel rests at, and ':state(snapped)' is on the host while that is less than the whole panel. 'snapTo()' moves it to another. **Focus moving to a control past the window's edge opens the panel to its largest snap point**, so a reader moving through a half open sheet with 'Tab' never lands on a control they cannot see. Set 'dismissible' to draw a close control in the corner, labeled by 'dismiss-label', as 'Dialog' draws one. The panel's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. Content stays mounted when the drawer is closed, so it is in the server markup and can animate. A closed '<dialog>' is already out of the tab order and the accessibility tree, so the drawer does not write 'inert'. The 'role', 'aria-modal', and the scrim also come from the '<dialog>' element. 'drawer-root.ssr.spec.ts' checks that the panel has no hand-written 'inert' or 'role'. Open the drawer declaratively with the platform's invoker attributes: '''html <helix-headless-button commandfor="nav" command="--toggle">Menu</helix-headless-button> <helix-headless-drawer id="nav">…</helix-headless-drawer> ''' */
|
|
15542
16223
|
"helix-headless-drawer": DefineCustomElement<
|
|
15543
16224
|
HelixHeadlessDrawer,
|
|
15544
16225
|
HelixHeadlessDrawerVueProps,
|
|
15545
16226
|
HelixHeadlessDrawerVueEvents
|
|
15546
16227
|
>;
|
|
15547
|
-
/** A row that opens a page contains that page: the page's rows are this row's own children, assigned to the 'page' slot. There are no ids to wire, and moving a row moves its page with it. What the item renders depends on the stack: - On the page that is showing, it renders its row. - When its own page is showing, it renders only that page's rows. Its row belongs to the page above. - Otherwise it renders nothing. The rows stay in the light DOM untouched, so there is no state to keep. Choosing a row dispatches an event, and the stack decides whether that drills in or runs a command. A row that opens a page shows a caret after its text and sets 'aria-haspopup', the same way 'Menu' marks a row with a submenu. The server render leaves both out, because the server cannot see the children. */
|
|
16228
|
+
/** A row that opens a page contains that page: the page's rows are this row's own children, assigned to the 'page' slot. There are no ids to wire, and moving a row moves its page with it. What the item renders depends on the stack: - On the page that is showing, it renders its row. - When its own page is showing, it renders only that page's rows. Its row belongs to the page above. - When a page further down its own is showing, it renders its page's slot alone, so the rows below reach the page. - Otherwise it renders nothing. The rows stay in the light DOM untouched, so there is no state to keep. Choosing a row dispatches an event, and the stack decides whether that drills in or runs a command. A row that opens a page shows a caret after its text and sets 'aria-haspopup', the same way 'Menu' marks a row with a submenu. The server render leaves both out, because the server cannot see the children. The row is named by its label alone. Words in 'description', a line under the label, and in 'end' describe it instead, through 'aria-describedby', as 'Menu.Item' does: a reader hears "Theme", then "Dark". */
|
|
15548
16229
|
"helix-headless-drilldown-item": DefineCustomElement<
|
|
15549
16230
|
HelixHeadlessDrilldownItem,
|
|
15550
16231
|
HelixHeadlessDrilldownItemVueProps,
|
|
@@ -15556,7 +16237,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15556
16237
|
HelixHeadlessDrilldownVueProps,
|
|
15557
16238
|
HelixHeadlessDrilldownVueEvents
|
|
15558
16239
|
>;
|
|
15559
|
-
/** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. */
|
|
16240
|
+
/** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. **Or give the heading as words.** 'heading' draws them in a 'heading' part that is a heading at 'heading-level', 3 where it is not set, so a page rendering from data or on a server gets a heading a reader finds in the outline without writing the element. A heading slotted in replaces it. **Whatever is slotted into 'heading' is read as a heading.** An element that is no heading, such as a '<span>' or a '<p>', is set inside the 'heading' part at 'heading-level', so a screen reader still finds it in the outline. A heading element, or an element holding one, keeps its own level. A server cannot see the slotted element, so a served '<span>' becomes a heading once the script runs. */
|
|
15560
16241
|
"helix-headless-empty": DefineCustomElement<
|
|
15561
16242
|
HelixHeadlessEmpty,
|
|
15562
16243
|
HelixHeadlessEmptyVueProps,
|
|
@@ -15568,7 +16249,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15568
16249
|
HelixHeadlessFileInputVueProps,
|
|
15569
16250
|
HelixHeadlessFileInputVueEvents
|
|
15570
16251
|
>;
|
|
15571
|
-
/** Shows one filter declared by a 'FilterField': the field, the operator, and the values, with a control to remove the filter. The operator is shown only when it is not the field's default: ''' Disposition refunded, chargeback default operator, hidden Disposition is not refunded chosen operator, shown Created after 1 Aug a scalar field has no default ''' Omit 'operator-label' for the field's default operator and pass it for every other operator. The code that builds the chip has the field, and the field defines its default. The chip shows a filter and does not apply it. Dismissing fires 'helix-dismiss' as a request, as on 'Tag' and 'Announcement'. The chip is your element in your list, so you remove it, which keeps your model and the document in step. Call 'preventDefault()' on 'helix-dismiss' to cancel the dismissal, which is also how you take control of the interaction for one press. 'requestChange' documents the pattern. To let the user change the operator, slot a menu trigger into 'operator'. With the text fallback, the operator is a label. The chip does not interpret operators: their meaning belongs to your domain, as 'FilterOperator' explains. */
|
|
16252
|
+
/** Shows one filter declared by a 'FilterField': the field, the operator, and the values, with a control to remove the filter. The operator is shown only when it is not the field's default: ''' Disposition refunded, chargeback default operator, hidden Disposition is not refunded chosen operator, shown Created after 1 Aug a scalar field has no default ''' Omit 'operator-label' for the field's default operator and pass it for every other operator. The code that builds the chip has the field, and the field defines its default. The chip shows a filter and does not apply it. Dismissing fires 'helix-dismiss' as a request, as on 'Tag' and 'Announcement'. The chip is your element in your list, so you remove it, which keeps your model and the document in step. Call 'preventDefault()' on 'helix-dismiss' to cancel the dismissal, which is also how you take control of the interaction for one press. 'requestChange' documents the pattern. **Keyboard.** The remove button is a tab stop of its own, and Enter or Space on it asks to remove the filter. In a 'FilterInput', Backspace in the empty field asks to remove the last chip. The remove button is named 'dismiss-label' followed by the chip's words, such as "Remove filter Status is not open", so a row of chips says which filter each button removes. Write '{label}' in 'dismiss-label' to put the words elsewhere. To let the user change the operator, slot a menu trigger into 'operator'. With the text fallback, the operator is a label. The chip does not interpret operators: their meaning belongs to your domain, as 'FilterOperator' explains. */
|
|
15572
16253
|
"helix-headless-filter-chip": DefineCustomElement<
|
|
15573
16254
|
HelixHeadlessFilterChip,
|
|
15574
16255
|
HelixHeadlessFilterChipVueProps,
|
|
@@ -15598,7 +16279,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15598
16279
|
HelixHeadlessFilterInputVueProps,
|
|
15599
16280
|
HelixHeadlessFilterInputVueEvents
|
|
15600
16281
|
>;
|
|
15601
|
-
/** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **'relative' shows the same reading in words**, such as "3 hours ago" at 'long', "3 hr. ago" at 'short' and "3h ago" at 'narrow', the styles 'sl-relative-time' offers. 'numeric="always"' says "1 day ago" where the default says "yesterday". **'date-style' and 'time-style' take each locale's own pattern**, such as "Tuesday, August 4, 2026" at 'full', and stand in for the separate fields, which 'Intl' refuses beside them. 'hour-cycle' sets a twelve or twenty-four hour clock either way. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. */
|
|
16282
|
+
/** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **'relative' shows the same reading in words**, such as "3 hours ago" at 'long', "3 hr. ago" at 'short' and "3h ago" at 'narrow', the styles 'sl-relative-time' offers. 'numeric="always"' says "1 day ago" where the default says "yesterday". **'date-style' and 'time-style' take each locale's own pattern**, such as "Tuesday, August 4, 2026" at 'full', and stand in for the separate fields, which 'Intl' refuses beside them. 'hour-cycle' sets a twelve or twenty-four hour clock either way. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. 'frozen' draws the reading once and leaves it. **'fields' draws each field of a date as a part of its own**, such as 'day', 'month' and 'year', so a stylesheet can set the year in a lighter ink or the weekday in capitals with '::part()'. The text between the fields is the locale's own and has no part. An 'elapsed' or 'relative' reading is one phrase, with no parts inside it. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. */
|
|
15602
16283
|
"helix-headless-format-date": DefineCustomElement<
|
|
15603
16284
|
HelixHeadlessFormatDate,
|
|
15604
16285
|
HelixHeadlessFormatDateVueProps,
|
|
@@ -15610,7 +16291,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15610
16291
|
HelixHeadlessGraphVueProps,
|
|
15611
16292
|
HelixHeadlessGraphVueEvents
|
|
15612
16293
|
>;
|
|
15613
|
-
/** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. PageUp and PageDown move four columns, which is four weeks with 'rows="7"'. **The strip describes itself.** The 'overview' part says the busiest reading and the total of the readings drawn, "Busiest: 11 Jun 12; Total 84", and the strip is described by it, as every chart is by its summary. Hide it visually. The 'summary' slot is still yours, for words of your own. */
|
|
16294
|
+
/** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. PageUp and PageDown move a month, to the same day, where each row's header carries its date as a '<time datetime>', and four columns otherwise, which is four weeks with 'rows="7"'. **The strip describes itself.** The 'overview' part says the busiest reading and the total of the readings drawn, "Busiest: 11 Jun, 12; Total 84", and the strip is described by it, as every chart is by its summary. Hide it visually. The 'summary' slot is still yours, for words of your own. **'selection-mode' lets a reader select cells**: 'single' one at a time and 'multiple' any number. Space, Enter or a press selects the cell the keys or the pointer rest on, or lets it go, and under 'multiple' Shift with an arrow, Home, End, PageUp or PageDown takes in every cell from the last one pressed to where the key went. 'value' holds the selected days, by the names their rows have in the table, separated by commas. A change asks with 'helix-before-change' and tells with 'change', and the 'selection' part says how many are selected, in 'selection-label'. */
|
|
15614
16295
|
"helix-headless-heatmap": DefineCustomElement<
|
|
15615
16296
|
HelixHeadlessHeatmap,
|
|
15616
16297
|
HelixHeadlessHeatmapVueProps,
|
|
@@ -15622,31 +16303,31 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15622
16303
|
HelixHeadlessIconButtonVueProps,
|
|
15623
16304
|
HelixHeadlessIconButtonVueEvents
|
|
15624
16305
|
>;
|
|
15625
|
-
/** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers the whole set, so any name in it draws. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. A name with no match renders nothing, and the element fires 'error', so a typo in a name can be heard. It waits until the page has loaded and painted first, so a library a later module registers is not taken for a typo. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. */
|
|
16306
|
+
/** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers the whole set, so any name in it draws. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. A name with no match renders nothing, and the element fires 'error', so a typo in a name can be heard. It waits until the page has loaded and painted first, so a library a later module registers is not taken for a typo. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. **A decorative icon that is all a control holds is reported.** In a development build, a button or a link whose only content is an icon with no 'label', and which has no name of its own, warns 'missing-name' once, through the runtime channel every Helix warning uses. */
|
|
15626
16307
|
"helix-headless-icon": DefineCustomElement<
|
|
15627
16308
|
HelixHeadlessIcon,
|
|
15628
16309
|
HelixHeadlessIconVueProps,
|
|
15629
16310
|
HelixHeadlessIconVueEvents
|
|
15630
16311
|
>;
|
|
15631
|
-
/** Image handles the part CSS cannot: when the picture has loaded, or that it failed. 'aspect-ratio' in your stylesheet reserves the box. The element tracks three states and relays the two events that move between them, and leaves the box to the stylesheet. The 'placeholder' slot is empty by default, so the headless tier does not depend on 'Skeleton', which it does not ship. The placeholder is hidden from screen readers, the picture having a name of its own. The fallback is read once the picture fails, after the picture's 'alt', so a reader hears that it did not load, as a sighted reader sees. */
|
|
16312
|
+
/** Image handles the part CSS cannot: when the picture has loaded, or that it failed. 'aspect-ratio' in your stylesheet reserves the box. The element tracks three states and relays the two events that move between them, and leaves the box to the stylesheet. The 'placeholder' slot is empty by default, so the headless tier does not depend on 'Skeleton', which it does not ship. The placeholder is hidden from screen readers, the picture having a name of its own. The fallback is read once the picture fails, after the picture's 'alt', so a reader hears that it did not load, as a sighted reader sees. **An image with no 'alt' says so.** At its first render it reports a 'missing-alt' warning, printed in the console and counted by '@fusion.dev/helix-diagnostics', which names the fix: describe the picture in 'alt', or write 'alt=""' for one that is decoration. An image hidden with 'aria-hidden="true"' needs neither and is not reported. A sheet of yours reads the state as ':state(loading)', ':state(loaded)', ':state(error)', and ':state(waiting)', the last while 'placeholder-delay' holds the placeholder back. It can also read 'data-status' on the host once the picture has loaded or failed. */
|
|
15632
16313
|
"helix-headless-image": DefineCustomElement<
|
|
15633
16314
|
HelixHeadlessImage,
|
|
15634
16315
|
HelixHeadlessImageVueProps,
|
|
15635
16316
|
HelixHeadlessImageVueEvents
|
|
15636
16317
|
>;
|
|
15637
|
-
/** Renders a real '<input>', so the caret, selection, autofill, spellcheck, password managers, and a phone's on-screen keyboard all work natively. The field is in the server markup, so it works before any script loads. An input inside a shadow root does not submit with a form outside it, so the host is form-associated and reports its value through 'ElementInternals'. That also carries validity and handles a form reset. 'value' and 'defaultValue' work like 'checked' and 'defaultChecked'. 'value' is what is in the field now, and 'defaultValue' is the value from the markup, which a reset restores. Validity comes from the browser. 'type' and 'required' are set on the real input, and its 'validity' is copied to the host. 'validate' adds your own rule, run on every change once the browser finds nothing wrong, as React Aria's TextField 'validate' does. What it returns is the message the field shows once the user has edited it, and the message a submit raises. */
|
|
16318
|
+
/** Renders a real '<input>', so the caret, selection, autofill, spellcheck, password managers, and a phone's on-screen keyboard all work natively. The field is in the server markup, so it works before any script loads. An input inside a shadow root does not submit with a form outside it, so the host is form-associated and reports its value through 'ElementInternals'. That also carries validity and handles a form reset. 'value' and 'defaultValue' work like 'checked' and 'defaultChecked'. 'value' is what is in the field now, and 'defaultValue' is the value from the markup, which a reset restores. Validity comes from the browser. 'type' and 'required' are set on the real input, and its 'validity' is copied to the host. 'validate' adds your own rule, run on every change once the browser finds nothing wrong, as React Aria's TextField 'validate' does. What it returns is the message the field shows once the user has edited it, and the message a submit raises. **Keyboard.** The field's own keys are the platform's. Enter submits the form through its default button, as in a native field. The clear button under 'clearable' and the reveal button under 'reveal' are tab stops of their own after the field, so a keyboard reaches them. The inner input is named by 'label', or by a host 'aria-label', 'aria-labelledby' or '<label for>', and is described by the hint and the message, with 'aria-invalid' while a message shows. The clear button is named 'clear-label', and the reveal button 'reveal-label' with 'aria-pressed' while the password shows. */
|
|
15638
16319
|
"helix-headless-input": DefineCustomElement<
|
|
15639
16320
|
HelixHeadlessInput,
|
|
15640
16321
|
HelixHeadlessInputVueProps,
|
|
15641
16322
|
HelixHeadlessInputVueEvents
|
|
15642
16323
|
>;
|
|
15643
|
-
/** Renders a '<kbd>' element. Each element holds one key, except when you use 'keys'. For a sequence or a chord, write one element per key and put the separator between them as text, such as "then" or "plus". 'keys' renders the right glyphs for the platform. Given 'mod', it renders '⌘K' on Apple devices and 'Ctrl+K' everywhere else. A '⌘K' typed into a template is wrong for anyone on Windows. The element binds the shortcut only when 'within' is set. By default it draws the key and listens for nothing. **'for' names the control the shortcut works**, and the key writes its chord onto that control's 'aria-keyshortcuts', in the platform's words ('Meta+K' on an Apple keyboard, 'Control+K' elsewhere), so a screen reader announces the shortcut with the control. A chord the page wrote there itself is left alone, and the key takes back only what it added. 'caps' draws a chord as a key per key: each is a 'key' part and the '+' between two a 'separator' part, so a sheet can draw a cap for each. 'key-labels' renames any key, on every platform, such as 'key-labels='{"mod":"Command"}''. */
|
|
16324
|
+
/** Renders a '<kbd>' element. Each element holds one key, except when you use 'keys'. For a sequence or a chord, write one element per key and put the separator between them as text, such as "then" or "plus". 'keys' renders the right glyphs for the platform. Given 'mod', it renders '⌘K' on Apple devices and 'Ctrl+K' everywhere else. A '⌘K' typed into a template is wrong for anyone on Windows. The element binds the shortcut only when 'within' is set. By default it draws the key and listens for nothing. **'for' names the control the shortcut works**, and the key writes its chord onto that control's 'aria-keyshortcuts', in the platform's words ('Meta+K' on an Apple keyboard, 'Control+K' elsewhere), so a screen reader announces the shortcut with the control. A chord the page wrote there itself is left alone, and the key takes back only what it added. 'caps' draws a chord as a key per key: each is a 'key' part and the '+' between two a 'separator' part, so a sheet can draw a cap for each. 'key-labels' renames any key, on every platform, such as 'key-labels='{"mod":"Command"}''. On an Apple keyboard a word joins the next key with a hyphen, as in 'Command-K'. **'activate' makes the shortcut work the control 'for' names**, with no script: 'activate="focus"' moves focus to it, as '/' does to a search field, and 'activate="click"' presses it. It acts once 'helix-shortcut' has gone out and no listener canceled it, and only where 'within' listens. */
|
|
15644
16325
|
"helix-headless-kbd": DefineCustomElement<
|
|
15645
16326
|
HelixHeadlessKbd,
|
|
15646
16327
|
HelixHeadlessKbdVueProps,
|
|
15647
16328
|
HelixHeadlessKbdVueEvents
|
|
15648
16329
|
>;
|
|
15649
|
-
/** Renders a legend as a list, separate from any chart, so any chart can use one. Set 'for' to the table the chart reads, and the legend takes its entries from that table, so the two always match. 'entries' sets how the table is read: - 'series': one entry per data column, named by the header row. Use it for a line or bar chart. - 'categories': one entry per body row. Use it for a donut, whose slices are the rows and which has no axis to name them on. - 'measures': drops the first data column. Use it for a scatter. The table is resolved on the client. There is no server pass. **'toggles' makes each entry a button that hides its series.** Every chart reading the same table draws without a hidden series and fits its scale to the rest, and the series keeps its color. The button says whether its series is shown with 'aria-pressed'. The buttons are one tab stop: the arrow keys move between them, Home and End go to the first and the last, and a typed letter goes to the next name starting with it. 'hidden-series' holds the hidden names, so a page can start with some hidden or read which are. Two legends on one table show the same hidden series: the list written last wins, and the other legend takes it for its own entries. */
|
|
16330
|
+
/** Renders a legend as a list, separate from any chart, so any chart can use one. Set 'for' to the table the chart reads, and the legend takes its entries from that table, so the two always match. 'entries' sets how the table is read: - 'series': one entry per data column, named by the header row. Use it for a line or bar chart. - 'categories': one entry per body row. Use it for a donut, whose slices are the rows and which has no axis to name them on. - 'measures': drops the first data column. Use it for a scatter. The table is resolved on the client. There is no server pass. **'toggles' makes each entry a button that hides its series.** Every chart reading the same table draws without a hidden series and fits its scale to the rest, and the series keeps its color. The button says whether its series is shown with 'aria-pressed'. The buttons are a 'toolbar', named as the list is, and one tab stop: the arrow keys move between them, Home and End go to the first and the last, and a typed letter goes to the next name starting with it. 'hidden-series' holds the hidden names, so a page can start with some hidden or read which are. Two legends on one table show the same hidden series: the list written last wins, and the other legend takes it for its own entries. */
|
|
15650
16331
|
"helix-headless-legend": DefineCustomElement<
|
|
15651
16332
|
HelixHeadlessLegend,
|
|
15652
16333
|
HelixHeadlessLegendVueProps,
|
|
@@ -15658,13 +16339,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15658
16339
|
HelixHeadlessLightboxItemVueProps,
|
|
15659
16340
|
HelixHeadlessLightboxItemVueEvents
|
|
15660
16341
|
>;
|
|
15661
|
-
/** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. Set 'controls' for the viewer's own previous, next and close controls, named by 'previous-label', 'next-label' and 'dismiss-label', whose glyphs you can replace in the 'previous-icon', 'next-icon' and 'dismiss-icon' slots. Without it, compose the chrome yourself in the 'header' and 'footer' slots, with buttons that send '--previous', '--next' and '--close'. **Set 'max-zoom' to let a reader zoom into the shown item**, such as '3'. Two fingers pinch it, a double click or a double tap zooms all the way in about the point pressed and back out, and once zoomed one pointer drags it about. '+' and '-' zoom in and out from the keyboard, and '0' puts it back. The scale and the offset are on the 'viewport' part as '--lightbox-zoom', '--lightbox-pan-x' and '--lightbox-pan-y', written only while zoomed, and a swipe moves to the next item only while the item is at its own size. Each item is a slide: a 'group' with the role description in 'slide-role-label', named by its 'label' or by 'slide-label'. A touch or a pen swiped across the picture shows the next or the previous item, the way the line of text runs. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
|
|
16342
|
+
/** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. Set 'controls' for the viewer's own previous, next and close controls, named by 'previous-label', 'next-label' and 'dismiss-label', whose glyphs you can replace in the 'previous-icon', 'next-icon' and 'dismiss-icon' slots. Without it, compose the chrome yourself in the 'header' and 'footer' slots, with buttons that send '--previous', '--next' and '--close'. **Set 'max-zoom' to let a reader zoom into the shown item**, such as '3'. Two fingers pinch it, a double click or a double tap zooms all the way in about the point pressed and back out, and once zoomed one pointer drags it about. '+' and '-' zoom in and out from the keyboard, and '0' puts it back. The scale and the offset are on the 'viewport' part as '--lightbox-zoom', '--lightbox-pan-x' and '--lightbox-pan-y', written only while zoomed, and a swipe moves to the next item only while the item is at its own size. With 'controls', the viewer also draws zoom-out and zoom-in controls, for a pointer with no wheel and no second finger. Once a reader stops zooming, the live region says the new scale in the words of 'zoom-status-label', such as "Zoomed to 150%". Each item is a slide: a 'group' with the role description in 'slide-role-label', named by its 'label' or by 'slide-label'. A touch or a pen swiped across the picture shows the next or the previous item, the way the line of text runs. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
|
|
15662
16343
|
"helix-headless-lightbox": DefineCustomElement<
|
|
15663
16344
|
HelixHeadlessLightbox,
|
|
15664
16345
|
HelixHeadlessLightboxVueProps,
|
|
15665
16346
|
HelixHeadlessLightboxVueEvents
|
|
15666
16347
|
>;
|
|
15667
|
-
/** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. The table is the accessible representation, and the drawing is hidden from screen readers, who get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. */
|
|
16348
|
+
/** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'dashed' names the series drawn as a dashed line, such as a forecast or a target beside the readings: 'dashed="Forecast"'. Each takes a 'line-dashed' part beside 'line'. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. The table is the accessible representation, and the drawing is hidden from screen readers, who get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. */
|
|
15668
16349
|
"helix-headless-line-chart": DefineCustomElement<
|
|
15669
16350
|
HelixHeadlessLineChart,
|
|
15670
16351
|
HelixHeadlessLineChartVueProps,
|
|
@@ -15676,13 +16357,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15676
16357
|
HelixHeadlessListItemVueProps,
|
|
15677
16358
|
HelixHeadlessListItemVueEvents
|
|
15678
16359
|
>;
|
|
15679
|
-
/** Sets 'role="list"' on the host, so a screen reader counts the rows and announces each one's position, such as "1 of 7". **'selection-mode' makes the list interactive**, in the way of a grid list: a grid of rows that is one tab stop. 'single' selects one row at a time and 'multiple' any number, and 'value' holds the selected rows' values, separated by commas. A change asks with 'helix-before-change' and tells with 'change'. 'none' selects nothing, so a press acts on the row. A 'disabled' row is passed over. Each row is named by its label and described by its description, so the words of the controls in 'end' are not read as part of its name. 'selection-behavior' says what a press does to the rows already selected. 'toggle', the default, adds or takes out the row. 'replace' selects the row alone, as a file list does, and the arrow keys carry the selection with them. Control or Command with a press then adds or takes out one row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. Under 'replace', selects it. | | Home, End | Moves to the first or the last row. Under 'replace', selects it. | | A letter or a word | Moves to the next row whose words start with what you typed. | | Left, Right | Moves between the row and the controls in its 'end' slot. | | Space | Selects the row, or lets it go. | | Shift with Down, Up, Home, End or Space | Selects every row from the last one pressed, in 'multiple'. | | Control or Command with Down, Up, Home or
|
|
16360
|
+
/** Sets 'role="list"' on the host, so a screen reader counts the rows and announces each one's position, such as "1 of 7". **'selection-mode' makes the list interactive**, in the way of a grid list: a grid of rows that is one tab stop. 'single' selects one row at a time and 'multiple' any number, and 'value' holds the selected rows' values, separated by commas. A change asks with 'helix-before-change' and tells with 'change'. 'none' selects nothing, so a press acts on the row. A 'disabled' row is passed over. Each row is named by its label and described by its description, so the words of the controls in 'end' are not read as part of its name. 'selection-behavior' says what a press does to the rows already selected. 'toggle', the default, adds or takes out the row. 'replace' selects the row alone, as a file list does, and the arrow keys carry the selection with them. Control or Command with a press then adds or takes out one row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. Under 'replace', selects it. | | Home, End | Moves to the first or the last row. Under 'replace', selects it. | | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under 'replace', selects the row it lands on. | | A letter or a word | Moves to the next row whose words start with what you typed. | | Left, Right | Moves between the row and the controls in its 'end' slot. | | Space | Selects the row, or lets it go. | | Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in 'multiple'. | | Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under 'replace'. | | Control or Command with A | Selects every row, in 'multiple'. | | Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. | | Enter | Acts on the row: follows its link, or sends 'helix-action' from it. | A press with Shift selects every row from the last one pressed, and a press with Control or Command adds or takes out one row under 'replace'. **Leave 'selection-mode' unset for a list a reader reads**, and set it for one a reader chooses from or acts on. The rows of an interactive list are grid rows, which hold controls as a list box option cannot. Give a control in 'end' 'tabindex="-1"' to leave it to the arrow keys and out of the tab order. 'start' and 'reversed' number an ordered list as '<ol>' does. The list writes where the numbers start and which way they run as '--list-first' and '--list-step' on its slot, which the styled tier counts from. Reversed with no 'start' counts down from the number of rows, which a server cannot know, so served markup counts from one until the list runs. */
|
|
15680
16361
|
"helix-headless-list": DefineCustomElement<
|
|
15681
16362
|
HelixHeadlessList,
|
|
15682
16363
|
HelixHeadlessListVueProps,
|
|
15683
16364
|
HelixHeadlessListVueEvents
|
|
15684
16365
|
>;
|
|
15685
|
-
/** The listbox is the control, and options are its items. A Select is a listbox with a trigger in front of it, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. They differ only in what opens the list and what filters it. With 'multiple' set, 'value' is a comma-separated string, like 'Checkbox.Group''s, because 'MixinControllerValue' holds a string. The form receives one entry per selected option, as a native '<select multiple>' sends it, so your server does not split on commas. Selected and active are separate. The selected option is the value. The active option is where the keyboard is: the arrow keys move it, and 'aria-activedescendant' points to it while focus stays on the list. The
|
|
16366
|
+
/** The listbox is the control, and options are its items. A Select is a listbox with a trigger in front of it, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. They differ only in what opens the list and what filters it. With 'multiple' set, 'value' is a comma-separated string, like 'Checkbox.Group''s, because 'MixinControllerValue' holds a string. The form receives one entry per selected option, as a native '<select multiple>' sends it, so your server does not split on commas. Selected and active are separate. The selected option is the value. The active option is where the keyboard is: the arrow keys move it, and 'aria-activedescendant' points to it while focus stays on the list. **Keyboard.** The list is one tab stop, or its filter field is where there is one. In a single-choice list the highlight is the choice unless 'manual' is set; then Enter, Space or a click chooses. | Key | What it does | |---|---| | Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With 'layout="grid"', to the option below or above, stopping at the edge. | | Right, Left | With 'layout="grid"', moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. | | Home, End | Moves to the first or the last option. In a filter field, moves the caret. | | Page Down, Page Up | Moves by as many options as the list shows at once. | | A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. | | Enter | Chooses the highlighted option, or follows it where it is a link. | | Space | Chooses the highlighted option, or with 'multiple' toggles it. In a filter field, types a space. | | Shift with Down or Up | With 'multiple', adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. | | Shift with Space | With 'multiple', adds every option from the one last chosen to the highlighted one. In a filter field, types a space. | | Shift with Home or End | With 'multiple', adds every option from the highlight to that end. In a filter field, hold Control as well. | | Control or Command with A | With 'multiple', chooses every option, or none where all are chosen. In a filter field, selects the text. | | Escape | In a filter field, clears the filter. | **ARIA.** The 'items' part is the 'listbox', named by the label and described by the hint and the message, with 'aria-multiselectable' under 'multiple', 'aria-required', 'aria-invalid', and 'aria-busy' while loading. Each option is an 'option' with 'aria-selected'. The list, or its filter field, points 'aria-activedescendant' at the highlighted option; the field is 'aria-autocomplete="list"' and controls the list. An option with 'href' is a link: Enter or a press follows it and selects nothing, and moving onto it with the arrows does not follow it. As a filter narrows the list, a screen reader hears how many options are left, such as "3 results", from 'result-label' and 'results-label'. A filter that leaves none says 'empty-text'. */
|
|
15686
16367
|
"helix-headless-listbox": DefineCustomElement<
|
|
15687
16368
|
HelixHeadlessListbox,
|
|
15688
16369
|
HelixHeadlessListboxVueProps,
|
|
@@ -15718,7 +16399,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15718
16399
|
HelixHeadlessMapLandcoverVueProps,
|
|
15719
16400
|
HelixHeadlessMapLandcoverVueEvents
|
|
15720
16401
|
>;
|
|
15721
|
-
/** A button placed at a latitude and longitude. 'connectMap' positions it on the map and moves it as the map moves. Its name shows beside it on hover and focus. Pressing a marker sends 'helix-activate' from the frame with the marker's 'name', or its 'label' if it has no name. All the markers in a map share one tab stop. The arrow keys move between them in the order they are written. */
|
|
16402
|
+
/** A button placed at a latitude and longitude. 'connectMap' positions it on the map and moves it as the map moves. Its name shows beside it on hover and focus. Pressing a marker sends 'helix-activate' from the frame with the marker's 'name', or its 'label' if it has no name. All the markers in a map share one tab stop. The arrow keys move between them in the order they are written. Taking away the marker that has focus moves focus to the next one, or to the one before where it was the last. */
|
|
15722
16403
|
"helix-headless-map-marker": DefineCustomElement<
|
|
15723
16404
|
HelixHeadlessMapMarker,
|
|
15724
16405
|
HelixHeadlessMapMarkerVueProps,
|
|
@@ -15760,7 +16441,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15760
16441
|
HelixHeadlessMapTerrainVueProps,
|
|
15761
16442
|
HelixHeadlessMapTerrainVueEvents
|
|
15762
16443
|
>;
|
|
15763
|
-
/** A disclosure: a button that shows and hides a region of your own links. It does not use 'role="menu"' or 'menuitem', which are for application commands. Those roles take over the arrow keys, announce "menu" to someone looking for navigation, and put every link inside a role that is not a link. As a disclosure, middle clicks, modified clicks, and the status bar keep working. Use 'Menu' for a row of commands. It renders no links. A router renders its own anchors and cannot render them inside this shadow root, so the panel is a slot for the lists and headings you write. It opens on hover by default, and a press always opens it too. 'open-on' sets which. Hover is the default because in a navigation bar people expect to move along the row and see each section. When one panel opens in place of another, each says which way the reader moved, as Radix's 'data-motion' does. Moving toward the end of the bar, the one opening is ':state(from-end)' and the one closing is ':state(to-start)'; moving back, they are ':state(from-start)' and ':state(to-end)'. A stylesheet slides them on that. Start and end follow the reading direction, so on a right-to-left page the end is on the left. A panel that opens or closes on its own carries none of the four. A press on another megamenu's trigger hands over the same way as hovering it. While a panel is open its surface carries its own size, as '--megamenu-surface-inline-size' and '--megamenu-surface-block-size', and a panel that took over from another also carries that one's size, as '--megamenu-from-inline-size' and '--megamenu-from-block-size'. Radix's navigation menu publishes the same pair from its shared viewport, so a stylesheet can grow or shrink one panel into the next.
|
|
16444
|
+
/** A disclosure: a button that shows and hides a region of your own links. It does not use 'role="menu"' or 'menuitem', which are for application commands. Those roles take over the arrow keys, announce "menu" to someone looking for navigation, and put every link inside a role that is not a link. As a disclosure, middle clicks, modified clicks, and the status bar keep working. Use 'Menu' for a row of commands. It renders no links. A router renders its own anchors and cannot render them inside this shadow root, so the panel is a slot for the lists and headings you write. It opens on hover by default, and a press always opens it too. 'open-on' sets which. Hover is the default because in a navigation bar people expect to move along the row and see each section. When one panel opens in place of another, each says which way the reader moved, as Radix's 'data-motion' does. Moving toward the end of the bar, the one opening is ':state(from-end)' and the one closing is ':state(to-start)'; moving back, they are ':state(from-start)' and ':state(to-end)'. A stylesheet slides them on that. Start and end follow the reading direction, so on a right-to-left page the end is on the left. A panel that opens or closes on its own carries none of the four. A press on another megamenu's trigger hands over the same way as hovering it. While a panel is open its surface carries its own size, as '--megamenu-surface-inline-size' and '--megamenu-surface-block-size', and a panel that took over from another also carries that one's size, as '--megamenu-from-inline-size' and '--megamenu-from-block-size'. Radix's navigation menu publishes the same pair from its shared viewport, so a stylesheet can grow or shrink one panel into the next. The panel's default slot is the 'columns' part and draws no box, so a sheet can give the columns one of their own. While a panel is open, an 'indicator' slot is rendered beside its trigger, as Radix's indicator marks the open one: slot a mark of your own, such as a bar or an arrow pointing at the panel, and it shows only while the panel is open. The styled tier rests it on the trigger's bottom edge. Left and Right Arrow move between the triggers of the megamenus beside this one, and Home and End go to the first and the last, as Radix's navigation menu does. In a 'Navigation', which holds them in a slot, the arrows are the navigation's, and move between its destinations under its 'arrows'. Down Arrow on the trigger of an open panel moves focus to the panel's first link, Escape closes the panel and returns focus to its trigger, and Tab moves through the panel's links and closes it on the way out. The trigger says 'aria-expanded', and the panel is a group named by 'label'. */
|
|
15764
16445
|
"helix-headless-megamenu": DefineCustomElement<
|
|
15765
16446
|
HelixHeadlessMegamenu,
|
|
15766
16447
|
HelixHeadlessMegamenuVueProps,
|
|
@@ -15772,7 +16453,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15772
16453
|
HelixHeadlessMenuItemVueProps,
|
|
15773
16454
|
HelixHeadlessMenuItemVueEvents
|
|
15774
16455
|
>;
|
|
15775
|
-
/** The trigger is slotted and stays your own element, as with the tooltip. The menu renders its surface in the top layer with the popover API, so an ancestor with 'overflow: hidden' does not clip it and it needs no 'z-index'. Slot a 'helix-button' or 'helix-icon-button' as the trigger, and the menu tells it that it opens a menu and whether the menu is open. A plain '<button>' can only be told by writing attributes onto your markup, which the menu does not do, so give it 'aria-haspopup="menu"' and set its 'aria-expanded' from the 'toggle' event. Submenus drill down. A submenu replaces the panel's content, and a back row returns to the previous page. One panel avoids the diagonal pointer path that side-by-side panels need, stays inside a narrow window, and works on touch screens, which have no hover. The root holds which page is open, because only one page shows at a time. It sets this on items as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. Group rows under a heading with 'Menu.Section', which is a 'group' named by its heading. Between runs of rows, a '<helix-divider
|
|
16456
|
+
/** The trigger is slotted and stays your own element, as with the tooltip. The menu renders its surface in the top layer with the popover API, so an ancestor with 'overflow: hidden' does not clip it and it needs no 'z-index'. Slot a 'helix-button' or 'helix-icon-button' as the trigger, and the menu tells it that it opens a menu and whether the menu is open. A plain '<button>' can only be told by writing attributes onto your markup, which the menu does not do, so give it 'aria-haspopup="menu"' and set its 'aria-expanded' from the 'toggle' event. Submenus drill down. A submenu replaces the panel's content, and a back row returns to the previous page. One panel avoids the diagonal pointer path that side-by-side panels need, stays inside a narrow window, and works on touch screens, which have no hover. The root holds which page is open, because only one page shows at a time. It sets this on items as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. Group rows under a heading with 'Menu.Section', which is a 'group' named by its heading. Between runs of rows, a '<helix-divider>' is a separator a screen reader announces. Keys: Enter, Space or Down Arrow on the trigger opens the menu on its first row, and Up Arrow on its last. In the menu, Up and Down Arrow move between rows, Home and End go to the first and the last, a typed letter moves to the next row whose name starts with it, Enter and Space choose, Right Arrow opens a row's submenu and Left Arrow goes back, the two swapping on a right-to-left page, and Escape closes the menu and returns focus to the trigger. Tab closes it and moves on. While it is open, the surface carries the trigger's width as '--floating-anchor-inline-size' and the room left below it as '--floating-available-block-size', as Radix's dropdown menu publishes its trigger's width, for a menu as wide as its trigger: 'helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }'. With 'context', the trigger is an area and the menu is its context menu: a right-click, a long press, Shift+F10 or the menu key over the area opens it at the pointer, or at the area's corner from the keyboard, as Radix's context menu does. A press on the area does not open it, and closing it returns focus to where it was. */
|
|
15776
16457
|
"helix-headless-menu": DefineCustomElement<
|
|
15777
16458
|
HelixHeadlessMenu,
|
|
15778
16459
|
HelixHeadlessMenuVueProps,
|
|
@@ -15784,7 +16465,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15784
16465
|
HelixHeadlessMenuSectionVueProps,
|
|
15785
16466
|
HelixHeadlessMenuSectionVueEvents
|
|
15786
16467
|
>;
|
|
15787
|
-
/** A meter shows a level within a range. Use 'Progress' to show how far along a task is. A progress bar starts empty and ends full, and full is always the good end. For a meter, which end is good depends on what is measured. There is no 'indeterminate', because a meter always has a value. **Set 'low', 'high', and 'optimum'**, as defined in the HTML specification. 'low' and 'high' divide the range into a low band, a middle band, and a high band. 'optimum' sets the preferred band. The band next to it is fair, and the band two away is poor. */
|
|
16468
|
+
/** A meter shows a level within a range. Use 'Progress' to show how far along a task is. A progress bar starts empty and ends full, and full is always the good end. For a meter, which end is good depends on what is measured. There is no 'indeterminate', because a meter always has a value. **Set 'low', 'high', and 'optimum'**, as defined in the HTML specification. 'low' and 'high' divide the range into a low band, a middle band, and a high band. 'optimum' sets the preferred band. The band next to it is fair, and the band two away is poor. The band is a custom state on the meter, 'good', 'fair' or 'poor', beside 'over' and 'under' for a value past an end, so a page styles the meter around the fill as well as the fill. **'live' says the reading when it moves into another band**, such as "92%, Poor", in a polite region, for a meter whose value changes while a reader is on the page: a disk filling or a battery draining. The band's word comes from 'band-labels'. */
|
|
15788
16469
|
"helix-headless-meter": DefineCustomElement<
|
|
15789
16470
|
HelixHeadlessMeter,
|
|
15790
16471
|
HelixHeadlessMeterVueProps,
|
|
@@ -15808,7 +16489,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15808
16489
|
HelixHeadlessNotificationVueProps,
|
|
15809
16490
|
HelixHeadlessNotificationVueEvents
|
|
15810
16491
|
>;
|
|
15811
|
-
/** Notifications are slotted children. Each one is your own markup, with an avatar, a link, or a button in it. Feeds usually hold tens of items, so writing them out lets an item hold anything. The list does not virtualize. Windowing needs the list to own the data, and here you own it, so N notifications are N elements. For a feed of thousands, use a data table with a custom cell. Read state is reported to you. Marking read goes from the root to the item and from the item to you, so a canceled 'helix-read' changes nothing, and if you own 'read', nothing changes until you set it. 'unread' is derived from the items and written to an attribute, so a stylesheet and a badge can both use it without counting. **The feed is one 'Tab' stop for its rows.** Each row takes focus itself and is read by its label. 'ArrowDown' and 'ArrowUp' move to the next and the previous row, 'Home' and 'End' to the first and the last, and 'PageDown' and 'PageUp' move a row on or back from anywhere inside one, as in the APG feed pattern. The controls inside a row stay in the 'Tab' order. Set 'total' when the feed holds one page of a longer list, and each row says its place in the whole of it. **'load-more' adds a button after the list** that sends 'helix-load-more', for a feed that holds one page of a longer list. Append the next page, set 'loading' while it is on its way, and take 'load-more' off once there is nothing more. While the feed is loading the button stays, so focus stays on it, and it is 'aria-disabled' and sends nothing. */
|
|
16492
|
+
/** Notifications are slotted children. Each one is your own markup, with an avatar, a link, or a button in it. Feeds usually hold tens of items, so writing them out lets an item hold anything. The list does not virtualize. Windowing needs the list to own the data, and here you own it, so N notifications are N elements. For a feed of thousands, use a data table with a custom cell. Read state is reported to you. Marking read goes from the root to the item and from the item to you, so a canceled 'helix-read' changes nothing, and if you own 'read', nothing changes until you set it. 'unread' is derived from the items and written to an attribute, so a stylesheet and a badge can both use it without counting. **The feed is one 'Tab' stop for its rows.** Each row takes focus itself and is read by its label. 'ArrowDown' and 'ArrowUp' move to the next and the previous row, 'Home' and 'End' to the first and the last, and 'PageDown' and 'PageUp' move a row on or back from anywhere inside one, as in the APG feed pattern. The controls inside a row stay in the 'Tab' order. Set 'total' when the feed holds one page of a longer list, and each row says its place in the whole of it. **'load-more' adds a button after the list** that sends 'helix-load-more', for a feed that holds one page of a longer list. Append the next page, set 'loading' while it is on its way, and take 'load-more' off once there is nothing more. While the feed is loading the button stays, so focus stays on it, and it is 'aria-disabled' and sends nothing. **'load-error' says a page could not be fetched**, such as "Could not load notifications": it shows under the rows there are, in the 'error' part, in place of the empty and loading lines, and a screen reader hears it. Clear it when you ask again. */
|
|
15812
16493
|
"helix-headless-notifications": DefineCustomElement<
|
|
15813
16494
|
HelixHeadlessNotifications,
|
|
15814
16495
|
HelixHeadlessNotificationsVueProps,
|
|
@@ -15820,7 +16501,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15820
16501
|
HelixHeadlessNumberInputVueProps,
|
|
15821
16502
|
HelixHeadlessNumberInputVueEvents
|
|
15822
16503
|
>;
|
|
15823
|
-
/** Object Inspector shows a structured value, such as an API response, a config, or a raw record, as a read-only tree with each entry's type visible. Pass the object to 'value', or name a '<script type="application/json">' by id with 'for', the same source 'VirtualList' and the charts read. JSON text works with server rendering and with React hydration, which skips object properties. 'value' wins when both are set. **Keyboard.** The tree is one tab stop, and focus moves from row to row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. | | Right | Opens a closed branch, or moves into an open one. Left on a right-to-left page. | | Left | Closes an open branch, or moves to the parent. Right on a right-to-left page. | | Home, End | Moves to the first or the last row. | | Enter, Space | Opens or closes a branch. | | '*' | Opens every branch beside the active row. | | A letter or a word | Moves to the next row whose key starts with what you typed. | | Command+C, Control+C | Copies the active row, where no text is selected. | The tree is a 'treegrid', as React Aria's Tree is: each entry is a 'row' with one cell, and carries its real level, position, and set size, including in a windowed tree. Nothing in it is chosen, so no row carries 'aria-selected', and a focused row is not announced as selected. A reader opening or closing a branch sends 'helix-before-open' or 'helix-before-close', which you can cancel, and then 'toggle' with 'newState' and 'oldState', as '<details>' does. The branch is the active row, and 'expanded' holds every open branch. '*' asks once for all the branches it opens. A script writing 'expanded' or 'active' sends nothing. 'active' is the active row's path, written the way a JSON Pointer writes it: the empty string for the root and '/meta/tags/0' for an entry under it. Moving to another row sends 'helix-before-activate', which you can cancel, and then 'helix-activate', both with the path. Writing 'active' moves there and opens the branches around it, and sends nothing. 'expanded' holds the open branches by path, and writing it opens those and closes the rest. A row that closes around the active one hands it to the nearest open branch. 'filter' narrows the tree to the entries whose key or value holds the text, ignoring case, and the branches that lead to them, which it opens. A matched branch keeps everything under it. Each matched row carries 'row-match', and a screen reader hears how many entries matched from 'result-label' and 'results-label'. 'filterable' adds a field that sets it: typing sends 'helix-filter', which you can cancel, and then 'helix-filtered', and Down moves from the field to the tree. A new 'value' keeps the branches a reader opened or closed, and the active row, where the new value still has them. A branch the old value did not have opens to 'default-depth'. The copy button copies the active row, a branch as JSON and a string as its text. So do Command+C and Control+C while the tree has focus and no text is selected. The button sits beside the tree, because assistive technology cannot reliably reach a button inside a tree item. 'windowed' draws only the rows in view, for values with thousands of entries. The box needs a height for windowing to work. The styled tier sets one, and in the headless tier you set it yourself. */
|
|
16504
|
+
/** Object Inspector shows a structured value, such as an API response, a config, or a raw record, as a read-only tree with each entry's type visible. Pass the object to 'value', or name a '<script type="application/json">' by id with 'for', the same source 'VirtualList' and the charts read. JSON text works with server rendering and with React hydration, which skips object properties. 'value' wins when both are set. **Keyboard.** The tree is one tab stop, and focus moves from row to row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. | | Right | Opens a closed branch, or moves into an open one. Left on a right-to-left page. | | Left | Closes an open branch, or moves to the parent. Right on a right-to-left page. | | Home, End | Moves to the first or the last row. | | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. | | Enter, Space | Opens or closes a branch. | | '*' | Opens every branch beside the active row. | | A letter or a word | Moves to the next row whose key starts with what you typed. | | Command+C, Control+C | Copies the active row, where no text is selected. | The tree is a 'treegrid', as React Aria's Tree is: each entry is a 'row' with one cell, and carries its real level, position, and set size, including in a windowed tree. Nothing in it is chosen, so no row carries 'aria-selected', and a focused row is not announced as selected. A reader opening or closing a branch sends 'helix-before-open' or 'helix-before-close', which you can cancel, and then 'toggle' with 'newState' and 'oldState', as '<details>' does. The branch is the active row, and 'expanded' holds every open branch. '*' asks once for all the branches it opens. A script writing 'expanded' or 'active' sends nothing. 'active' is the active row's path, written the way a JSON Pointer writes it: the empty string for the root and '/meta/tags/0' for an entry under it. Moving to another row sends 'helix-before-activate', which you can cancel, and then 'helix-activate', both with the path. Writing 'active' moves there and opens the branches around it, and sends nothing. 'expanded' holds the open branches by path, and writing it opens those and closes the rest. A row that closes around the active one hands it to the nearest open branch. 'filter' narrows the tree to the entries whose key or value holds the text, ignoring case, and the branches that lead to them, which it opens. A matched branch keeps everything under it. Each matched row carries 'row-match', and a screen reader hears how many entries matched from 'result-label' and 'results-label'. 'filterable' adds a field that sets it: typing sends 'helix-filter', which you can cancel, and then 'helix-filtered', and Down moves from the field to the tree. A new 'value' keeps the branches a reader opened or closed, and the active row, where the new value still has them. A branch the old value did not have opens to 'default-depth'. The copy button copies the active row, a branch as JSON and a string as its text. So do Command+C and Control+C while the tree has focus and no text is selected. The button sits beside the tree, because assistive technology cannot reliably reach a button inside a tree item. 'windowed' draws only the rows in view, for values with thousands of entries. The box needs a height for windowing to work. The styled tier sets one, and in the headless tier you set it yourself. */
|
|
15824
16505
|
"helix-headless-object-inspector": DefineCustomElement<
|
|
15825
16506
|
HelixHeadlessObjectInspector,
|
|
15826
16507
|
HelixHeadlessObjectInspectorVueProps,
|
|
@@ -15838,7 +16519,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15838
16519
|
HelixHeadlessOptionVueProps,
|
|
15839
16520
|
HelixHeadlessOptionVueEvents
|
|
15840
16521
|
>;
|
|
15841
|
-
/**
|
|
16522
|
+
/** Sets one run of options apart from the next where a heading would say too much, as React Aria's ListBox takes a 'Separator': actions apart from choices in a command palette, say, or the options a reader uses most apart from the rest. It has 'role="separator"', so a screen reader can say where one run ends, and it is no stop: the arrow keys move from the option before it to the one after. The list hides it while a filter is narrowing the options, since a rule between two runs of which only some options are left separates nothing. */
|
|
16523
|
+
"helix-headless-option-separator": DefineCustomElement<
|
|
16524
|
+
HelixHeadlessOptionSeparator,
|
|
16525
|
+
HelixHeadlessOptionSeparatorVueProps,
|
|
16526
|
+
HelixHeadlessOptionSeparatorVueEvents
|
|
16527
|
+
>;
|
|
16528
|
+
/** Outline is a table of contents for a document. 'Navigation' does the same job for a site. The links are your own anchors. A router renders its own '<a>' and cannot render one inside the outline's shadow root, and the hrefs are fragments on the same page. Write the anchors flat, with 'data-level' for their depth, or nested in lists, '<ul><li><a>'. A screen reader hears the levels either way: the outline puts a flat run into lists inside list items of its own, nested by 'data-level', and leaves the links where they are. A link without 'data-level' is at the top level. A heading slotted into 'heading' names the navigation, in place of 'label'. In a contents rail with a scrollbar of its own, 'follow' keeps the link of the section in view showing as the reader scrolls the page. **Keyboard.** The links are your anchors, in the tab order as you wrote them, so the outline adds no keys of its own: Tab moves through the links and Enter follows one. Following a link moves focus to its section, so the next Tab goes on from the heading, also with 'behavior' set. **What a screen reader hears.** A navigation landmark named by 'label', "On this page", or by the slotted heading. The links are lists, nested by level, so a reader hears how many links a level holds and where each one is. The link to the section in view carries 'aria-current="location"', read as "current location", and it moves as the page scrolls without announcing, which would interrupt the reading it follows. The current section is decided by the headings' positions. An 'IntersectionObserver' with a band near the top fails both ways: when headings are far apart, none is in the band and no section is marked, and when they are close together, several are in the band at once. */
|
|
15842
16529
|
"helix-headless-outline": DefineCustomElement<
|
|
15843
16530
|
HelixHeadlessOutline,
|
|
15844
16531
|
HelixHeadlessOutlineVueProps,
|
|
@@ -15850,7 +16537,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15850
16537
|
HelixHeadlessPaginationVueProps,
|
|
15851
16538
|
HelixHeadlessPaginationVueEvents
|
|
15852
16539
|
>;
|
|
15853
|
-
/** A separate element that you place beside 'Pagination', like 'Pagination.Summary', so you choose the direction and order of your footer. It uses 'Select', so it matches a table's filter dropdowns in the same footer, both open and closed. The caret is 'Select''s, so it follows 'currentColor', and the label is a real '<label for>' pointing at the trigger's id. The label sits on the same row as the select. 'Select''s host is a column, and an outer-tree rule overrides a ':host' rule, so the row layout needs no property on 'Select' and nothing added to your markup. An empty 'sizes' renders nothing and does not fall back to the built-in list. 'Pagination' does the same with a single page, and both report it through 'ElementInternals.states'. 'value' is the current size, and 'default-value' is the size from the markup. Changing it dispatches 'helix-before-change', and then 'input' and 'change' once the size has moved, as a native '<select>' sends them together. Re-querying and returning to page one is up to you, because only you know whether the current position should be kept. It takes part in a form. Give it a 'name' and the size in force is submitted under that name, so a 'GET' form carries it in the address beside the page. A form reset returns it to 'default-value', and 'disabled', or a disabled '<fieldset>' around it, turns the select off. */
|
|
16540
|
+
/** A separate element that you place beside 'Pagination', like 'Pagination.Summary', so you choose the direction and order of your footer. It uses 'Select', so it matches a table's filter dropdowns in the same footer, both open and closed. The caret is 'Select''s, so it follows 'currentColor', and the label is a real '<label for>' pointing at the trigger's id. A '<label for>' pointing at this element, or its own 'aria-label' or 'aria-labelledby', names the select in place of 'label', so a reader hears the page's words for it, and the select draws no label of its own beside the page's. The label sits on the same row as the select. 'Select''s host is a column, and an outer-tree rule overrides a ':host' rule, so the row layout needs no property on 'Select' and nothing added to your markup. An empty 'sizes' renders nothing and does not fall back to the built-in list. 'Pagination' does the same with a single page, and both report it through 'ElementInternals.states'. 'value' is the current size, and 'default-value' is the size from the markup. Changing it dispatches 'helix-before-change', and then 'input' and 'change' once the size has moved, as a native '<select>' sends them together. Re-querying and returning to page one is up to you, because only you know whether the current position should be kept. It takes part in a form. Give it a 'name' and the size in force is submitted under that name, so a 'GET' form carries it in the address beside the page. A form reset returns it to 'default-value', and 'disabled', or a disabled '<fieldset>' around it, turns the select off. */
|
|
15854
16541
|
"helix-headless-pagination-size": DefineCustomElement<
|
|
15855
16542
|
HelixHeadlessPaginationSize,
|
|
15856
16543
|
HelixHeadlessPaginationSizeVueProps,
|
|
@@ -15862,7 +16549,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15862
16549
|
HelixHeadlessPaginationSummaryVueProps,
|
|
15863
16550
|
HelixHeadlessPaginationSummaryVueEvents
|
|
15864
16551
|
>;
|
|
15865
|
-
/**
|
|
16552
|
+
/** One real '<input>' holds the code, and the boxes are drawn from it, as Web Awesome's OTP input does. A screen reader meets one field, named by the label, and the code never sits in a row of separate fields. The boxes are hidden from it. The caret is drawn in the box it is in, and the box is marked with 'cell-active' while the field has focus. A filled box selects its character, so typing replaces it and moves on. Input longer than one character is treated as a paste. This covers pasting, a browser autofilling an SMS code, and a password manager. A six-character code pasted into an empty field fills from the first box. The code is one value to a form. The field is in a shadow root and submits nothing. The host is form-associated and submits the code, which also carries validity and responds to a form reset. The field carries 'autocomplete="one-time-code"', which lets a phone offer the code from a message. 'autosubmit' submits the form once the last box is filled, through the form's default button where there is one. 'format' draws separators between the boxes, such as the dash in '###-###', as text a screen reader skips. 'mask' makes the field a password field and draws 'mask-character' in each filled box, so the code is never drawn as text. The row of boxes always runs left to right, with 'dir="ltr"', including in Arabic and Hebrew. The first box is the leftmost, a paste fills to the right, and the right arrow moves to the next box. The label, hint, and feedback follow the page's direction. **Keyboard.** The field is one tab stop. | Key | What it does | |---|---| | A character | Fills the box and moves to the next one. A longer run is read as a paste. | | Left, Right | Moves to the box before or after. | | Home, End | Moves to the first box, or to the box after the last character. | | Backspace | Removes the character in the box, or in an empty box the one before it, and moves there. | | Delete | Removes the character in the box and pulls the rest of the code back. | | Enter | Submits the form. | The field is a text field, or a password field under 'mask', named by the label and described by the hint and the message, with 'aria-invalid' while a message shows and 'aria-required' under 'required'. 'helix-complete' is a 'HelixCompleteEvent' sent once the last box is filled. */
|
|
15866
16553
|
"helix-headless-pin-input": DefineCustomElement<
|
|
15867
16554
|
HelixHeadlessPinInput,
|
|
15868
16555
|
HelixHeadlessPinInputVueProps,
|
|
@@ -15874,13 +16561,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15874
16561
|
HelixHeadlessPopoverVueProps,
|
|
15875
16562
|
HelixHeadlessPopoverVueEvents
|
|
15876
16563
|
>;
|
|
15877
|
-
/** Determinate by default. Set 'indeterminate' for a task whose total is not known yet. Use 'Loader' for a short wait or one with no place of its own on the page. The indeterminate bar runs a segment across the track and does not fill, so it shows that work is happening without claiming a proportion. 'aria-valuenow' is omitted in that state, which is the platform's signal for the same thing. The fill is a fraction of the track, written as a custom property. */
|
|
16564
|
+
/** Determinate by default. Set 'indeterminate' for a task whose total is not known yet. Use 'Loader' for a short wait or one with no place of its own on the page. The indeterminate bar runs a segment across the track and does not fill, so it shows that work is happening without claiming a proportion. 'aria-valuenow' is omitted in that state, which is the platform's signal for the same thing. The fill is a fraction of the track, written as a custom property. **Reaching 'max' is said and sent.** When the value arrives at 'max' from below, the bar says 'complete-label', "Complete" by default, in a polite 'live' region and sends 'helix-complete', so a reader hears that the work is done and a page can move on. A bar that starts full says nothing, and an empty 'complete-label' keeps it quiet. The 'complete' custom state is set while the bar is full. */
|
|
15878
16565
|
"helix-headless-progress": DefineCustomElement<
|
|
15879
16566
|
HelixHeadlessProgress,
|
|
15880
16567
|
HelixHeadlessProgressVueProps,
|
|
15881
16568
|
HelixHeadlessProgressVueEvents
|
|
15882
16569
|
>;
|
|
15883
|
-
/** The code is drawn as one '<path>'. Runs of adjacent dark modules are joined, so a row of eight is one horizontal move. A code of useful length has about a thousand modules, and an element for each would be a thousand nodes for one image. The element has 'role="img"' and an accessible name. Set
|
|
16570
|
+
/** The code is drawn as one '<path>'. Runs of adjacent dark modules are joined, so a row of eight is one horizontal move. A code of useful length has about a thousand modules, and an element for each would be a thousand nodes for one image. The element has 'role="img"' and an accessible name. Set 'label' to what the code is for, such as "Open the menu". With no 'label', a code is named by 'code-label', "QR code", followed by its value where the value is a web address, which a URL read aloud makes a destination. Any other value is never read out: a code that sets up an authenticator or joins a network carries a secret in it. The quiet zone of four modules is required by the specification, and a scanner rejects a code cropped to its edge. It is drawn inside the 'viewBox', so it stays at any size, including a size set in CSS. 'correction' sets how much of the code can be lost. At 'H' a code can lose thirty percent and still scan, so a mark in the center slot is safe. At 'L' the same mark makes the code unscannable. The default is 'M', and 'H' when the 'logo' slot is filled. A code that holds a logo at a 'correction' below 'H' warns once with the kind 'unscannable-logo'. A higher level holds fewer characters, so a value that fits at 'M' can be too long once a logo raises the level to 'H'. A value too long for the level draws no code: the element fires 'error', carries ':state(overflow)', and shows what is in the 'fallback' slot, such as the link written out. 'toSvg()', 'toPng()' and 'download()' give the drawn code as a file of its own, in the colors it is drawn in, with a slotted image or SVG logo where it sits, for a page that offers it to save or print, as Zag's download trigger does. 'download()' saves an SVG for a name ending in '.svg', and a PNG for any other. */
|
|
15884
16571
|
"helix-headless-qr-code": DefineCustomElement<
|
|
15885
16572
|
HelixHeadlessQrCode,
|
|
15886
16573
|
HelixHeadlessQrCodeVueProps,
|
|
@@ -15892,7 +16579,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15892
16579
|
HelixHeadlessQuoteVueProps,
|
|
15893
16580
|
HelixHeadlessQuoteVueEvents
|
|
15894
16581
|
>;
|
|
15895
|
-
/** The group is the form control, and the radios are its options. A set of radios submits one answer, so the group owns the 'name', the 'value', and the validity. A radio outside a group is not a control. Checkboxes work the other way: each checkbox submits its own answer. 'MixinField' applies to the group for the same reason. The label, the hint, and the message describe the question, and the question belongs to the set. Selection moves up and state moves down. A radio dispatches an event when it is chosen, the group determines whether the choice stands, and the group writes 'selected' onto every radio. The group is the one source of which radio is on. 'value' is the current answer. 'defaultValue' is what the markup declared: the value until something is chosen, and where a reset returns. The two work like 'checked' and 'defaultChecked'. A choice sends its events in this order: 'helix-select' from the radio, then, a microtask later and only if nobody refused it, 'helix-before-change' from the group, and once the value has moved, 'input' and 'change'. The microtask is what lets a listener you add to the group after it connected refuse the 'helix-select'. A native radio sends 'input' and 'change' in the same task as the click. */
|
|
16582
|
+
/** The group is the form control, and the radios are its options. A set of radios submits one answer, so the group owns the 'name', the 'value', and the validity. A radio outside a group is not a control. Checkboxes work the other way: each checkbox submits its own answer. 'MixinField' applies to the group for the same reason. The label, the hint, and the message describe the question, and the question belongs to the set. Selection moves up and state moves down. A radio dispatches an event when it is chosen, the group determines whether the choice stands, and the group writes 'selected' onto every radio. The group is the one source of which radio is on. 'value' is the current answer. 'defaultValue' is what the markup declared: the value until something is chosen, and where a reset returns. The two work like 'checked' and 'defaultChecked'. A choice sends its events in this order: 'helix-select' from the radio, then, a microtask later and only if nobody refused it, 'helix-before-change' from the group, and once the value has moved, 'input' and 'change'. The microtask is what lets a listener you add to the group after it connected refuse the 'helix-select'. A native radio sends 'input' and 'change' in the same task as the click. **Keyboard.** The group is one tab stop: the chosen radio, or the first that can be chosen. | Key | What it does | |---|---| | Right, Down | Chooses the next radio, from the last back to the first. | | Left, Up | Chooses the radio before, from the first round to the last. | | Home, End | Chooses the first or the last radio. | | Space, Enter | Chooses the focused radio. | Left and Right swap on a right-to-left page, and a disabled radio is passed over. Under 'readonly' the arrows move focus and choose nothing. The group is a 'radiogroup' named by 'label', and each radio is a 'role="radio"' button with 'aria-checked'. */
|
|
15896
16583
|
"helix-headless-radio-group": DefineCustomElement<
|
|
15897
16584
|
HelixHeadlessRadioGroup,
|
|
15898
16585
|
HelixHeadlessRadioGroupVueProps,
|
|
@@ -15904,13 +16591,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15904
16591
|
HelixHeadlessRadioVueProps,
|
|
15905
16592
|
HelixHeadlessRadioVueEvents
|
|
15906
16593
|
>;
|
|
15907
|
-
/** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. With 'clearable', pressing the chosen score again, or Backspace or Delete on the marks, takes the rating back to unrated and sends 'helix-clear'. */
|
|
16594
|
+
/** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. With 'clearable', pressing the chosen score again, or Backspace or Delete on the marks, takes the rating back to unrated and sends 'helix-clear'. **Keyboard.** The marks are one tab stop, on the chosen score or the first. | Key | What it does | |---|---| | Right, Down | Chooses the next score up, and stops at the highest. | | Left, Up | Chooses the next score down, and stops at the lowest. | | Home, End | Chooses the lowest or the highest score. | | Space, Enter | Chooses the focused score, or clears it under 'clearable' when it is already chosen. | | Backspace, Delete | Clears the rating, under 'clearable'. | Left and Right swap on a right-to-left page. The marks are a 'radiogroup' named by 'label', and each score is a 'radio' named by 'option-label', such as "3 out of 5". A read-only rating is one 'img' named by its score. */
|
|
15908
16595
|
"helix-headless-rating": DefineCustomElement<
|
|
15909
16596
|
HelixHeadlessRating,
|
|
15910
16597
|
HelixHeadlessRatingVueProps,
|
|
15911
16598
|
HelixHeadlessRatingVueEvents
|
|
15912
16599
|
>;
|
|
15913
|
-
/** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. 'trend' draws each series' line of best fit, by least squares, across the plot in the series' color. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is hidden from screen readers. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from row to row in the table's order, Home and End go to the first and the last, and the up and down arrows move among the series of a row. The tooltip sits on that point, the 'live' part says the row in words, and Escape puts the tooltip away. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. */
|
|
16600
|
+
/** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. 'trend' draws each series' line of best fit, by least squares, across the plot in the series' color. **'size-by' names a third measure, drawn as each point's size**, as a bubble chart does: 'size-by="Population"' takes that column out of the series and gives each point an area in proportion to its row's number there. The tooltip and the table still say the number. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is hidden from screen readers. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from row to row in the table's order, Home and End go to the first and the last, and the up and down arrows move among the series of a row. The tooltip sits on that point, the 'live' part says the row in words, and Escape puts the tooltip away. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. */
|
|
15914
16601
|
"helix-headless-scatter-chart": DefineCustomElement<
|
|
15915
16602
|
HelixHeadlessScatterChart,
|
|
15916
16603
|
HelixHeadlessScatterChartVueProps,
|
|
@@ -15922,7 +16609,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15922
16609
|
HelixHeadlessScrollAreaVueProps,
|
|
15923
16610
|
HelixHeadlessScrollAreaVueEvents
|
|
15924
16611
|
>;
|
|
15925
|
-
/** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language.
|
|
16612
|
+
/** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. **Keyboard.** On the closed trigger: | Key | What it does | |---|---| | Down, Enter, Space | Opens the list on the chosen option, or the first. | | Up | Opens the list on the chosen option, or the last. | | Home, End | Opens the list on the first or the last option. | | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. | | A letter or a word | Chooses the option whose words start with what you typed, as a native '<select>' does. With 'multiple', opens the list on it. | In the open list, which is a 'Listbox': | Key | What it does | |---|---| | Down, Up, Home, End, Page Down, Page Up | Moves the highlight. | | A letter or a word | Moves the highlight to the next option whose words start with what you typed. | | Enter, Space | Chooses the highlighted option and closes the list. With 'multiple', toggles it and leaves the list open. | | Escape | Closes the list and puts focus back on the trigger. | | Tab | Closes the list and moves on. | A choice made on the closed trigger is said aloud on Apple devices, where VoiceOver does not read the trigger's new name. **ARIA.** The trigger is a 'button' with 'aria-haspopup="listbox"' and 'aria-expanded', named by the label and then the chosen words, as a native '<select>' is. The list is the listbox 'Listbox' describes, named by the label, or by 'list-label' where there is none. Set 'autocomplete' to let a browser's autofill choose, as a native '<select>' with the same attribute would. */
|
|
15926
16613
|
"helix-headless-select": DefineCustomElement<
|
|
15927
16614
|
HelixHeadlessSelect,
|
|
15928
16615
|
HelixHeadlessSelectVueProps,
|
|
@@ -15946,25 +16633,31 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15946
16633
|
HelixHeadlessSliderVueProps,
|
|
15947
16634
|
HelixHeadlessSliderVueEvents
|
|
15948
16635
|
>;
|
|
15949
|
-
/** Takes its numbers from the 'values' attribute. The other charts read a table, but a table behind a small trend line would be read aloud row by row. Set 'values' to the data and 'label' to the one sentence a screen reader announces. Use 'for' when a sparkline has a real table behind it. 'for' wins when both are set. Without a 'label' the sparkline is decorative and 'aria-hidden', for example beside a stat that already says "Sessions, 1,102". With a 'label' it is named by that sentence and read by key, as every chart is: the drawing takes focus, the arrow keys walk the readings, Home and End go to the first and the last, Escape puts the reading away, and the 'live' part says each reading with where it stands, such as "Mon: 12 (3 of 7)". A pointer resting on the drawing shows the reading under it: the 'cursor' part marks it and the 'readout' part writes it. 'marks' adds a mark on the highest and the lowest reading. A blank cell in a 'for' table is a gap in the line. Place it beside a 'Stat', because a change beside a figure is a second fact, as 'Stat''s own spec says. 'Trend' is composed the same way. The component writes the properties listed below, and the stylesheet that draws the sparkline reads them. Do not set them yourself. They carry numbers the component computes and CSS cannot, so a stylesheet can draw the sparkline without measuring anything. */
|
|
16636
|
+
/** Takes its numbers from the 'values' attribute. The other charts read a table, but a table behind a small trend line would be read aloud row by row. Set 'values' to the data and 'label' to the one sentence a screen reader announces. Use 'for' when a sparkline has a real table behind it. 'for' wins when both are set. Without a 'label' the sparkline is decorative and 'aria-hidden', for example beside a stat that already says "Sessions, 1,102". With a 'label' it is named by that sentence and read by key, as every chart is: the drawing takes focus, the arrow keys walk the readings, Home and End go to the first and the last, Escape puts the reading away, and the 'live' part says each reading with where it stands, such as "Mon: 12 (3 of 7)". **A named sparkline describes itself.** Beside its name, a screen reader hears what the readings come to, the first and the last, the highest and the lowest, in 'overview-label': "From 12 to 20, highest 30, lowest 8". An 'aria-label' on the element names it as 'label' does. A pointer resting on the drawing shows the reading under it: the 'cursor' part marks it and the 'readout' part writes it. 'marks' adds a mark on the highest and the lowest reading, and 'range' draws a band between two values, such as a normal range. A blank cell in a 'for' table is a gap in the line, and a reading alone between two blanks is a 'lone' mark. Place it beside a 'Stat', because a change beside a figure is a second fact, as 'Stat''s own spec says. 'Trend' is composed the same way. The component writes the properties listed below, and the stylesheet that draws the sparkline reads them. Do not set them yourself. They carry numbers the component computes and CSS cannot, so a stylesheet can draw the sparkline without measuring anything. */
|
|
15950
16637
|
"helix-headless-sparkline": DefineCustomElement<
|
|
15951
16638
|
HelixHeadlessSparkline,
|
|
15952
16639
|
HelixHeadlessSparklineVueProps,
|
|
15953
16640
|
HelixHeadlessSparklineVueEvents
|
|
15954
16641
|
>;
|
|
15955
|
-
/**
|
|
16642
|
+
/** A 'group' of the dial's menu, named by its label, as React Aria's menu sections and Menu's groups are: a reader hears the name on entering the set, and the arrow keys walk through every group's actions in order, from the last action of one group to the first of the next. Put actions straight into the group, and the group straight into the dial. Anything else slotted here is drawn and is not an action. */
|
|
16643
|
+
"helix-headless-speed-dial-group": DefineCustomElement<
|
|
16644
|
+
HelixHeadlessSpeedDialGroup,
|
|
16645
|
+
HelixHeadlessSpeedDialGroupVueProps,
|
|
16646
|
+
HelixHeadlessSpeedDialGroupVueEvents
|
|
16647
|
+
>;
|
|
16648
|
+
/** Each item is a command, so it has the 'menuitem' role. A megamenu holds destinations, so it is a disclosure of links. A speed dial holds actions, which is what 'role="menu"' is for. The name is text rendered beside the icon, and it is the accessible name. A 'title' on an icon shows only on hover. Visible text is read, searched, and translated like other text. 'shortcut' gives the action's keyboard shortcut as a chord, such as 'mod+s', the grammar Menu's rows use. The action carries it as 'aria-keyshortcuts' and draws it after the name in the platform's glyphs or words, '⌘S' on an Apple keyboard and 'Ctrl+S' elsewhere, as Menu draws its rows' shortcuts. Put a 'Kbd' in the 'shortcut' slot to draw it as keys instead; the dial imports no 'Kbd' of its own. Showing a shortcut does not bind it. */
|
|
15956
16649
|
"helix-headless-speed-dial-item": DefineCustomElement<
|
|
15957
16650
|
HelixHeadlessSpeedDialItem,
|
|
15958
16651
|
HelixHeadlessSpeedDialItemVueProps,
|
|
15959
16652
|
HelixHeadlessSpeedDialItemVueEvents
|
|
15960
16653
|
>;
|
|
15961
|
-
/** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. */
|
|
16654
|
+
/** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. **Keyboard.** On the trigger, Enter, Space or a press opens the dial on its first action. With the dial open: | Key | What it does | |---|---| | Down, Right | Moves to the next action, from the last back to the first. | | Up, Left | Moves to the action before, from the first round to the last. | | Home, End | Moves to the first or the last action. | | A letter | Moves to the next action whose name starts with it. | | Enter, Space | Chooses the action, and the dial closes. | | Escape | Closes the dial and puts focus back on the trigger. | | Tab | Closes the dial and moves on. | **Groups.** Put actions in 'Speed Dial.Group', named by its 'label', to set them apart as Menu's sections do: each is a 'group' of the menu, and the arrow keys walk through every group's actions in order. **A trigger with its own action.** With 'open-on="long-press"', a press on the trigger is the trigger's own, such as composing a message, and holding it for half a second opens the dial, as React Aria's menu trigger does with 'trigger="longPress"'. Alt+Down or Alt+Up opens it from the keyboard, and the trigger says so in its description, 'long-press-label', the drawn one and a slotted one alike. A press that has opened the dial does not also do the trigger's action. */
|
|
15962
16655
|
"helix-headless-speed-dial": DefineCustomElement<
|
|
15963
16656
|
HelixHeadlessSpeedDial,
|
|
15964
16657
|
HelixHeadlessSpeedDialVueProps,
|
|
15965
16658
|
HelixHeadlessSpeedDialVueEvents
|
|
15966
16659
|
>;
|
|
15967
|
-
/** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. */
|
|
16660
|
+
/** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', with 'aria-valuetext' saying the start pane's share as a percentage in the reader's locale, and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. */
|
|
15968
16661
|
"helix-headless-splitter": DefineCustomElement<
|
|
15969
16662
|
HelixHeadlessSplitter,
|
|
15970
16663
|
HelixHeadlessSplitterVueProps,
|
|
@@ -15982,7 +16675,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
15982
16675
|
HelixHeadlessStatVueProps,
|
|
15983
16676
|
HelixHeadlessStatVueEvents
|
|
15984
16677
|
>;
|
|
15985
|
-
/** 'active' sets where the user is, and 'complete' stays on each step. Returning to stage one of three leaves stages one and two finished, so the root sets 'current' on the steps and never changes 'complete'. 'active' is optional. Without it, each step keeps its own 'current', so the sequence is correct in the server's markup, where the root cannot count its slotted children. 'linear' keeps a reader from passing a stage they have not finished, as Ark UI's linear steps do: a stage ahead is out of reach, and its button disabled, until every stage before it is 'complete' or 'optional'. Going back is always allowed. 'next()' and 'previous()' move one stage either way, under the same rules, for your own buttons. To check a stage before a reader moves on from it, set 'validate' to a function that answers whether the stage is valid, as Ark UI's 'isStepValid' does. Moving forward asks it about the stage the reader is on, and where it answers 'false' the reader stays and the stage is ':state(invalid)' until it answers 'true'. An 'optional' stage is not asked. 'helix-before-activate' is still sent for every move, for a check of your own. 'progress' is how far through the sequence is, from 0 to 100: the share of its stages that are 'complete'. The 'progress' part carries it as a 'progressbar' and as '--steps-progress', and is hidden until a stylesheet gives it a 'display', so a bar of your own costs nothing until you draw it. The sequence is ':state(complete)' once every stage is. The sequence is a list named by 'label', and each step a list item. The current stage's button says 'aria-current="step"', and a finished stage's button is described by its 'complete-label'. */
|
|
16678
|
+
/** 'active' sets where the user is, and 'complete' stays on each step. Returning to stage one of three leaves stages one and two finished, so the root sets 'current' on the steps and never changes 'complete'. 'active' is optional. Without it, each step keeps its own 'current', so the sequence is correct in the server's markup, where the root cannot count its slotted children. 'linear' keeps a reader from passing a stage they have not finished, as Ark UI's linear steps do: a stage ahead is out of reach, and its button disabled, until every stage before it is 'complete' or 'optional'. Going back is always allowed. 'next()' and 'previous()' move one stage either way, under the same rules, for your own buttons. To check a stage before a reader moves on from it, set 'validate' to a function that answers whether the stage is valid, as Ark UI's 'isStepValid' does. Moving forward asks it about the stage the reader is on, and where it answers 'false' the reader stays and the stage is ':state(invalid)' until it answers 'true'. An 'optional' stage is not asked. 'helix-before-activate' is still sent for every move, for a check of your own. 'progress' is how far through the sequence is, from 0 to 100: the share of its stages that are 'complete'. The 'progress' part carries it as a 'progressbar' and as '--steps-progress', and is hidden until a stylesheet gives it a 'display', so a bar of your own costs nothing until you draw it. A screen reader hears it as 'progress-label' says, "33% complete" unless set, as Ark UI's steps write it. The sequence is ':state(complete)' once every stage is. The sequence is a list named by 'label', and each step a list item. The current stage's button says 'aria-current="step"', and a finished stage's button is described by its 'complete-label'. */
|
|
15986
16679
|
"helix-headless-steps": DefineCustomElement<
|
|
15987
16680
|
HelixHeadlessSteps,
|
|
15988
16681
|
HelixHeadlessStepsVueProps,
|
|
@@ -16000,7 +16693,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16000
16693
|
HelixHeadlessSwitchVueProps,
|
|
16001
16694
|
HelixHeadlessSwitchVueEvents
|
|
16002
16695
|
>;
|
|
16003
|
-
/** Sets its own role, because a grid of elements has no table structure for assistive technology otherwise. 'header' makes the cell a header, so a screen reader announces it with the values it heads: - In a row that holds a cell without 'header', it is a 'rowheader' and names its row, for example "web-app" in a row of a service's values. - In a row of 'header' cells alone, it is a 'columnheader', which is what a table with no 'TableColumn' heads its columns with. The role is on the host so the cell stays a child of its row in the flat tree, which keeps the table structure intact. */
|
|
16696
|
+
/** Sets its own role, because a grid of elements has no table structure for assistive technology otherwise. 'header' makes the cell a header, so a screen reader announces it with the values it heads: - In a row that holds a cell without 'header', it is a 'rowheader' and names its row, for example "web-app" in a row of a service's values. - In a row of 'header' cells alone, it is a 'columnheader', which is what a table with no 'TableColumn' heads its columns with. The role is on the host so the cell stays a child of its row in the flat tree, which keeps the table structure intact. In a 'grid' table a value is a 'gridcell', and the table gives the cell a 'tabindex' so focus can rest on it. */
|
|
16004
16697
|
"helix-headless-table-cell": DefineCustomElement<
|
|
16005
16698
|
HelixHeadlessTableCell,
|
|
16006
16699
|
HelixHeadlessTableCellVueProps,
|
|
@@ -16012,13 +16705,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16012
16705
|
HelixHeadlessTableColumnVueProps,
|
|
16013
16706
|
HelixHeadlessTableColumnVueEvents
|
|
16014
16707
|
>;
|
|
16015
|
-
/** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. The 'heading' slot names the table: slot a heading or a line of text into it, and the table is named by its words. An 'aria-label' or 'aria-labelledby' on the host wins over it. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it.
|
|
16708
|
+
/** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. The 'heading' slot names the table: slot a heading or a line of text into it, and the table is named by its words. An 'aria-label' or 'aria-labelledby' on the host wins over it. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it. To act on one row, put a link or a button in a cell, or give the row an 'href'. **A grid.** 'grid' makes the table one tab stop that the arrow keys move through cell by cell, the headings included, as React Aria's table is. The table is then a 'grid' and each value a 'gridcell', and the table gives every cell a 'tabindex' so focus can rest on it: set 'grid' only where the cells may carry one. For typeahead and range selection, use 'DataTable'. | Key | What it does | |---|---| | Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. | | Down, Up | Moves one row, the headings included. | | Home, End | Moves to the first or the last cell of the row. | | Control with Home or End | Moves to the first or the last cell of the table. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. | | Enter on a cell of a row with 'href' | Follows the row's link. | | Enter, Space on a sortable heading | Sorts by the column. | | Space on a row, Enter or Space on its checkbox cell | Selects the row, in a 'selectable' table. | | Control or Command with A | Selects every row, in a 'selectable' table. | | Tab | Leaves the table. | The CSS custom properties listed for this component are written by it and read by the stylesheet that draws it. Do not set them. Each holds a number the component computes and CSS cannot, so the stylesheet can draw the table without measuring anything. */
|
|
16016
16709
|
"helix-headless-table": DefineCustomElement<
|
|
16017
16710
|
HelixHeadlessTable,
|
|
16018
16711
|
HelixHeadlessTableVueProps,
|
|
16019
16712
|
HelixHeadlessTableVueEvents
|
|
16020
16713
|
>;
|
|
16021
|
-
/** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. In a 'selectable' table the row draws a checkbox cell before its own cells, and 'value' is the key the table's 'selected' lists it by. */
|
|
16714
|
+
/** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. In a 'selectable' table the row draws a checkbox cell before its own cells, and 'value' is the key the table's 'selected' lists it by. **'href' makes the whole row a link**, as a row action does in React Aria's table: a press anywhere on the row follows it, except on a link or a control of the row's own, and Control, Command or Shift open it the way they open a link. A drag that selects text follows nothing. A row in a table is not a stop of its own, so put the same link in a cell, usually the row header, which is what the keyboard and a screen reader reach. In a 'grid' table, Enter on any cell of the row follows it as well. */
|
|
16022
16715
|
"helix-headless-table-row": DefineCustomElement<
|
|
16023
16716
|
HelixHeadlessTableRow,
|
|
16024
16717
|
HelixHeadlessTableRowVueProps,
|
|
@@ -16030,7 +16723,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16030
16723
|
HelixHeadlessTabPanelVueProps,
|
|
16031
16724
|
HelixHeadlessTabPanelVueEvents
|
|
16032
16725
|
>;
|
|
16033
|
-
/** Selection works through an event, the same as in the accordion and the tree. A tab dispatches 'helix-select', and the root pairs it with the panel of the same value. Nothing registers with anything, so tabs added later work with no extra setup. The tab list is a single tab stop, and the arrow keys move between tabs through 'KeyboardNavigationController', the same as in the radio and toggle groups. Selection follows focus, which suits a small set where showing a panel is cheap. Set 'manual' when showing a panel is expensive, so focus can move without selecting. 'orientation="vertical"' sets the tabs in a column beside the panels, and the tab list says 'aria-orientation="vertical"'. The arrow keys of both axes move between tabs either way. A tab with an 'href' is a link, for tabs that are pages of a site. Pressing it follows the link,
|
|
16726
|
+
/** Selection works through an event, the same as in the accordion and the tree. A tab dispatches 'helix-select', and the root pairs it with the panel of the same value. Nothing registers with anything, so tabs added later work with no extra setup. The tab list is a single tab stop, and the arrow keys move between tabs through 'KeyboardNavigationController', the same as in the radio and toggle groups. Selection follows focus, which suits a small set where showing a panel is cheap. Set 'manual' when showing a panel is expensive, so focus can move without selecting. 'orientation="vertical"' sets the tabs in a column beside the panels, and the tab list says 'aria-orientation="vertical"'. The arrow keys of both axes move between tabs either way. A tab with an 'href' is a link, for tabs that are pages of a site. Pressing it follows the link. Where any tab is a link, the arrow keys move focus without choosing on every tab of the list, as under 'manual', so arrowing past a tab never leaves the page and the list answers the keys one way. Mark the tab of the page you are on with 'selected', or set 'active' to its value. Each tab says which panel it controls through 'aria-controls', set as an element reference to the panel's host, where the engine has reflection. Keys, on the tab list: Left and Right Arrow move between tabs, and so do Up and Down; Home and End go to the first and the last. The horizontal arrows follow the reading direction, so on a right-to-left page Left moves on. Disabled tabs are passed over. Tab leaves the list for the selected panel, which is a tab stop only while it holds nothing focusable. The 'indicator' part moves to the selected tab and carries its place and size, so a mark of your own can be drawn there: style the part, or slot an element into 'indicator', which sits inside the part and reads the same properties. */
|
|
16034
16727
|
"helix-headless-tabs": DefineCustomElement<
|
|
16035
16728
|
HelixHeadlessTabs,
|
|
16036
16729
|
HelixHeadlessTabsVueProps,
|
|
@@ -16042,7 +16735,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16042
16735
|
HelixHeadlessTabVueProps,
|
|
16043
16736
|
HelixHeadlessTabVueEvents
|
|
16044
16737
|
>;
|
|
16045
|
-
/** A part of 'Tag' that holds tags as one control: a grid of rows, one tab stop for the whole set. The arrow keys move between tags, Home and End go to the first and the last, and a typed letter goes to the next tag starting with it. Delete or Backspace removes the focused tag where it is 'dismissible', by sending its 'helix-dismiss': remove it from your list in the handler, and focus moves to the next tag, or the previous one after the last. 'selection-mode' lets a reader select tags, with Space, Enter or a press: 'single' selects one at a time and 'multiple' any number. 'value' holds the selected tags' values, separated by commas, and a change asks with 'helix-before-change' and tells with 'change'. Enter on a tag with an 'href' follows its link. A 'disabled' tag is passed over. A selected tag that is removed leaves 'value', which then sends 'change'. Name the set with 'label'. Each tag is named by its words alone, without its remove button. **Removing the last tag keeps focus in the group.** With no tags left the set is a 'group', and focus moves to its 'empty' part, which holds the 'empty' slot: put words there such as "No filters" for a reader to hear. */
|
|
16738
|
+
/** A part of 'Tag' that holds tags as one control: a grid of rows, one tab stop for the whole set. The arrow keys move between tags, Home and End go to the first and the last, and a typed letter goes to the next tag starting with it. Delete or Backspace removes the focused tag where it is 'dismissible', by sending its 'helix-dismiss': remove it from your list in the handler, and focus moves to the next tag, or the previous one after the last. 'selection-mode' lets a reader select tags, with Space, Enter or a press: 'single' selects one at a time and 'multiple' any number. 'value' holds the selected tags' values, separated by commas, and a change asks with 'helix-before-change' and tells with 'change'. Enter on a tag with an 'href' follows its link. A 'disabled' tag is passed over. A selected tag that is removed leaves 'value', which then sends 'change'. Name the set with 'label'. Each tag is named by its words alone, without its remove button. 'value' takes an array of values on the property as well, as React sets 'value={['Apple']}'; a press writes it back as a string. **Removing the last tag keeps focus in the group.** With no tags left the set is a 'group', and focus moves to its 'empty' part, which holds the 'empty' slot: put words there such as "No filters" for a reader to hear. With nothing slotted it says 'empty-label', "No tags". */
|
|
16046
16739
|
"helix-headless-tag-group": DefineCustomElement<
|
|
16047
16740
|
HelixHeadlessTagGroup,
|
|
16048
16741
|
HelixHeadlessTagGroupVueProps,
|
|
@@ -16054,7 +16747,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16054
16747
|
HelixHeadlessTagVueProps,
|
|
16055
16748
|
HelixHeadlessTagVueEvents
|
|
16056
16749
|
>;
|
|
16057
|
-
/** Renders a '<textarea>', so the caret, selection, spellcheck, resize handle, and phone keyboard come from the platform. It is in the server markup, so the field works before any script loads. It is a separate element from 'Input' because Enter inserts a line break here. In a single-line field, Enter submits the form. 'rows' sets the starting height, and 'auto-grow' makes the field grow with its content. You can use both: 'rows' sets where an empty field begins. 'max-rows' stops the growth at that many lines, and the field scrolls past them. 'clearable' draws a button that empties the field while it holds text, and sends 'helix-clear', as 'Input' does. 'validate' adds your own rule, run on every change once the browser finds nothing wrong, as React Aria's TextField 'validate' does. */
|
|
16750
|
+
/** Renders a '<textarea>', so the caret, selection, spellcheck, resize handle, and phone keyboard come from the platform. It is in the server markup, so the field works before any script loads. It is a separate element from 'Input' because Enter inserts a line break here. In a single-line field, Enter submits the form. 'rows' sets the starting height, and 'auto-grow' makes the field grow with its content. You can use both: 'rows' sets where an empty field begins. 'max-rows' stops the growth at that many lines, and the field scrolls past them. 'clearable' draws a button that empties the field while it holds text, and sends 'helix-clear', as 'Input' does. 'validate' adds your own rule, run on every change once the browser finds nothing wrong, as React Aria's TextField 'validate' does. **Keyboard.** The field's own keys are the platform's, and Enter starts a new line. The clear button under 'clearable' is a tab stop of its own after the field. The inner textarea is named by 'label', or by a host 'aria-label', 'aria-labelledby' or '<label for>', and is described by the hint and the message, with 'aria-invalid' while a message shows. The clear button is named 'clear-label'. */
|
|
16058
16751
|
"helix-headless-textarea": DefineCustomElement<
|
|
16059
16752
|
HelixHeadlessTextarea,
|
|
16060
16753
|
HelixHeadlessTextareaVueProps,
|
|
@@ -16090,19 +16783,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16090
16783
|
HelixHeadlessTimelineVueProps,
|
|
16091
16784
|
HelixHeadlessTimelineVueEvents
|
|
16092
16785
|
>;
|
|
16093
|
-
/** Each message is an element because it has a timeout, a tone, a dismiss control, and a lifetime that pauses. **Each item runs its own timer.** A timer held by the region would restart with each new message, and the last of three messages would stay for nine seconds. **Each message is an 'alertdialog' named by its words**, which is how a reader who moves into the stack hears which message they are on. Give it a 'heading' and a 'description', and the heading names it and the description describes it, for a message with a title and a line of detail.
|
|
16786
|
+
/** Each message is an element because it has a timeout, a tone, a dismiss control, and a lifetime that pauses. **Each item runs its own timer.** A timer held by the region would restart with each new message, and the last of three messages would stay for nine seconds. It pauses while the pointer or focus is on the message, and while the page is hidden, so a message is not spent in a background tab. **Each message is an 'alertdialog' named by its words**, which is how a reader who moves into the stack hears which message they are on. Give it a 'heading' and a 'description', and the heading names it and the description describes it, for a message with a title and a line of detail. The region says each message once as it arrives, a 'danger' one assertively, so a message is never a live region of its own. A touch or a pen swipes a message toward the end of the line, and past halfway, or quickly, dismisses it through the same 'helix-dismiss' as its control. While it moves, the distance is on the 'item' part as '--toast-swipe-x'. **Messages are inverted by default.** The item flips 'color-scheme', so a new message stands out from the page without using a color that carries meaning. */
|
|
16094
16787
|
"helix-headless-toast-item": DefineCustomElement<
|
|
16095
16788
|
HelixHeadlessToastItem,
|
|
16096
16789
|
HelixHeadlessToastItemVueProps,
|
|
16097
16790
|
HelixHeadlessToastItemVueEvents
|
|
16098
16791
|
>;
|
|
16099
|
-
/** The region and its items are one family because a live region must be in the document before a message is added to it. Assistive technology often does not announce a region that arrives already holding its message. 'Radio.Group' is part of its family for the same reason. **The region is a landmark named by 'label', and
|
|
16792
|
+
/** The region and its items are one family because a live region must be in the document before a message is added to it. Assistive technology often does not announce a region that arrives already holding its message. 'Radio.Group' is part of its family for the same reason. **The region is a landmark named by 'label', and it says each message once as it arrives**: a 'danger' message assertively, and every other one politely. It says the word for the tone, the heading, the description and the text, and not the actions, through two live regions of its own, the 'live' parts, which it empties again a moment later. The stack itself is not a live region, so a message is never said twice, and changing the words of a message already showing says nothing. Each message is an 'alertdialog' named by its words, so a reader who moves into the stack hears which message they are on. **'hotkey' takes focus to the stack and back**, F8 unless you set it, and 'label' says which key: '{hotkey}' in it is filled in, so the default name is "Notifications (F8)". Pressed while focus is in the stack, it gives focus back to where it was. **The region never creates or removes items.** You render items and remove them. An item requests closing with a cancelable 'helix-dismiss' event. A dismissed item hides itself and stays in the DOM, so your framework's state and the DOM stay in sync. It hides on its own unless you set 'open', which makes the state yours. **'add()' shows a message from script**, for a page with no framework state to render them from: it appends a message of the region's own tier and removes it once it has been dismissed and has finished leaving. Messages you render yourself stay yours, and the region never removes them. A touch or a pen swipes a message away toward the end of the line. **The stack is in the top layer.** The 'region' part is a 'popover="manual"' shown while a message is showing, and shown again above a modal dialog that opened after it. Position the 'region' part, which is the box in the top layer. While a modal 'Dialog', 'Drawer' or 'Lightbox' is open, the browser makes everything outside it inert, the stack included, so a message stays visible and its actions cannot be pressed. Where the browser has 'ariaNotify', a message that arrives then is announced through it. For a message with an action, render a second region inside the dialog. When a message with focus inside it is dismissed, focus moves to the next message, then the one before it, then back to where it was before it entered the stack. */
|
|
16100
16793
|
"helix-headless-toast": DefineCustomElement<
|
|
16101
16794
|
HelixHeadlessToast,
|
|
16102
16795
|
HelixHeadlessToastVueProps,
|
|
16103
16796
|
HelixHeadlessToastVueEvents
|
|
16104
16797
|
>;
|
|
16105
|
-
/** The indicator is one element that moves to the selected item. A single moving object is easier to follow than a fill that swaps, and it shows where the selection came from. Its size and position are measured from the selected item and written to the indicator as custom properties, because labels have different lengths. Measurement happens on the client, so the server renders the indicator hidden and it fades in once measured. 'selection-mode="multiple"' makes the group a toolbar of buttons that each say whether they are pressed with 'aria-pressed', as React Aria's ToggleButtonGroup and Radix's ToggleGroup do. A press presses or releases one item, the arrow keys move focus without pressing, and 'value' is the pressed values, comma separated, which 'values' also gives as a list. Use 'values' where an item's value holds a comma. The form receives one entry per pressed value, and a page the browser brings back presses the same items again. The indicator stays hidden, and each pressed item is marked with ':state(pressed)'. Inside a toolbar it is a named group of that toolbar's controls instead, so a reader meets one toolbar. 'orientation="vertical"' runs the items down a column, says so to the accessibility tree, and the up and down arrows move between them. */
|
|
16798
|
+
/** The indicator is one element that moves to the selected item. A single moving object is easier to follow than a fill that swaps, and it shows where the selection came from. Its size and position are measured from the selected item and written to the indicator as custom properties, because labels have different lengths. Measurement happens on the client, so the server renders the indicator hidden and it fades in once measured. 'selection-mode="multiple"' makes the group a toolbar of buttons that each say whether they are pressed with 'aria-pressed', as React Aria's ToggleButtonGroup and Radix's ToggleGroup do. A press presses or releases one item, the arrow keys move focus without pressing, and 'value' is the pressed values, comma separated, which 'values' also gives as a list. Use 'values' where an item's value holds a comma. The form receives one entry per pressed value, and a page the browser brings back presses the same items again. The indicator stays hidden, and each pressed item is marked with ':state(pressed)'. Inside a toolbar it is a named group of that toolbar's controls instead, so a reader meets one toolbar. 'orientation="vertical"' runs the items down a column, says so to the accessibility tree, and the up and down arrows move between them. **Keyboard.** The group is one tab stop: the chosen item, or the first that can be chosen, as in a radio group, and in a multiple group the item focus was last on. | Key | What it does | |---|---| | Right, Down | Moves to the next item, from the last back to the first. In a single group, chooses it. | | Left, Up | Moves to the item before, from the first round to the last. In a single group, chooses it. | | Home, End | Moves to the first or the last item. In a single group, chooses it. | | Space, Enter | Chooses the focused item, or presses or releases it in a multiple group. | Left and Right swap on a right-to-left page, and a disabled item is passed over. A single group is a 'radiogroup' of items with 'role="radio"' and 'aria-checked'. A multiple group is a 'toolbar' of buttons with 'aria-pressed', or a 'group' inside a toolbar. The group is named by 'label' and carries 'aria-orientation' under 'orientation'. */
|
|
16106
16799
|
"helix-headless-toggle-group": DefineCustomElement<
|
|
16107
16800
|
HelixHeadlessToggleGroup,
|
|
16108
16801
|
HelixHeadlessToggleGroupVueProps,
|
|
@@ -16114,19 +16807,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16114
16807
|
HelixHeadlessToggleVueProps,
|
|
16115
16808
|
HelixHeadlessToggleVueEvents
|
|
16116
16809
|
>;
|
|
16117
|
-
/** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. A nested composite, such as a toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. */
|
|
16810
|
+
/** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. A Divider in the toolbar is a separator across the toolbar's axis, as React Aria's is: vertical in a horizontal toolbar and horizontal in a vertical one, without an 'orientation' of its own. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. **Keyboard.** Tab enters the toolbar on the control that last had focus, the first control at the start, and the next Tab leaves it. | Key | What it does | |---|---| | Right | Moves to the next control in a horizontal toolbar, from the last back to the first. | | Left | Moves to the control before in a horizontal toolbar, from the first round to the last. | | Down, Up | The same in a vertical toolbar. | | Home, End | Moves to the first or the last control. | Left and Right swap on a right-to-left page, where the first control is on the right. The arrows across the toolbar's axis are left to the control that has focus, so a radio-style toggle group or a select answers them itself. The toolbar is 'role="toolbar"' with 'aria-orientation', named by 'label'. The stop moves through a control's own 'focusable' property where it has one, as Button, Select and Toggle Group do. A control without one has 'tabindex' written on the element that takes focus: a native element itself, or the control inside a custom element's open shadow root, so the host keeps the markup you rendered. Only a custom element whose shadow root is closed takes it on the host. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
|
|
16118
16811
|
"helix-headless-toolbar": DefineCustomElement<
|
|
16119
16812
|
HelixHeadlessToolbar,
|
|
16120
16813
|
HelixHeadlessToolbarVueProps,
|
|
16121
16814
|
HelixHeadlessToolbarVueEvents
|
|
16122
16815
|
>;
|
|
16123
|
-
/** The trigger is slotted and stays your own element. The bubble renders in the top layer through the popover API, so an ancestor with 'overflow: hidden' does not clip it and no 'z-index' is needed. 'FloatingController' positions it and flips it to another side when the preferred side does not fit. **The tooltip describes its trigger itself, in both forms.** Wrap the trigger, or place the tooltip beside it and name the trigger with 'for': '''html <helix-headless-button id="save">Save</helix-headless-button> <helix-headless-tooltip for="save" content="Save your work"></helix-headless-tooltip> ''' The link is an element reference on the control that takes focus, and it is never written into your markup before a reader has acted. A trigger that is a Helix component is described at once, inside its own shadow root. A plain element in your markup is described when a reader first points at it or focuses it, which is after any hydration, and only where you have written no 'aria-describedby' or 'aria-labelledby' of your own. Write 'aria-describedby' pointing at the tooltip yourself to have the link in the server's markup. Where the browser has no element references, write it yourself; the tooltip warns once on first open if nothing links the two. The tooltip shows on hover and on focus. It hides on pointer leave, on blur, on Escape, and when the trigger is activated. The pointer can move from the trigger onto the bubble and the bubble stays, unless you set 'hoverable="false"'. 'delay' is how long the pointer rests before it shows, and 'delay-out' how long it stays once the pointer leaves. Once one tooltip is showing, moving to another trigger shows its tooltip with no 'delay', and the first one hides. The same holds for 'skip-delay' milliseconds after a tooltip hides, 300 unless you set it. 'show-on="focus"' shows the tooltip on keyboard focus only, for a hint a pointer does not need. */
|
|
16816
|
+
/** The trigger is slotted and stays your own element. The bubble renders in the top layer through the popover API, so an ancestor with 'overflow: hidden' does not clip it and no 'z-index' is needed. 'FloatingController' positions it and flips it to another side when the preferred side does not fit. **The tooltip describes its trigger itself, in both forms.** Wrap the trigger, or place the tooltip beside it and name the trigger with 'for': '''html <helix-headless-button id="save">Save</helix-headless-button> <helix-headless-tooltip for="save" content="Save your work"></helix-headless-tooltip> ''' The link is an element reference on the control that takes focus, and it is never written into your markup before a reader has acted. A trigger that is a Helix component is described at once, inside its own shadow root. A plain element in your markup is described when a reader first points at it or focuses it, which is after any hydration, and only where you have written no 'aria-describedby' or 'aria-labelledby' of your own. Write 'aria-describedby' pointing at the tooltip yourself to have the link in the server's markup. Where the browser has no element references, write it yourself; the tooltip warns once on first open if nothing links the two. In the 'for' form the tooltip itself is out of the accessibility tree while its bubble is down, so a reader walking the page meets its words once, as the trigger's description. The tooltip shows on hover and on focus. It hides on pointer leave, on blur, on Escape, and when the trigger is activated. The pointer can move from the trigger onto the bubble and the bubble stays, unless you set 'hoverable="false"'. 'delay' is how long the pointer rests before it shows, and 'delay-out' how long it stays once the pointer leaves. Once one tooltip is showing, moving to another trigger shows its tooltip with no 'delay', and the first one hides. The same holds for 'skip-delay' milliseconds after a tooltip hides, 300 unless you set it. 'show-on="focus"' shows the tooltip on keyboard focus only, for a hint a pointer does not need. */
|
|
16124
16817
|
"helix-headless-tooltip": DefineCustomElement<
|
|
16125
16818
|
HelixHeadlessTooltip,
|
|
16126
16819
|
HelixHeadlessTooltipVueProps,
|
|
16127
16820
|
HelixHeadlessTooltipVueEvents
|
|
16128
16821
|
>;
|
|
16129
|
-
/** The root holds the order of the stops: which stop is current, what Next and Back do, and when the tour is finished. Each stop holds its target, and you write all the text. **The spotlight is a shadow.** The scrim is a box the size of the current target with a very large 'box-shadow' spread, and the shadow paints the darkness. A 'clip-path' on a full-screen scrim breaks as soon as an element between the scrim and the viewport is transformed. The root measures the target's position in the browser. Nothing is measured on the server, because a tour starts only on request. 'open', 'default-open', 'helix-before-open', 'helix-before-close' and 'toggle' work as they do on 'Dialog'. Setting 'open' starts the run, and 'skip()' and 'requestOpen(false)' end it early. The box the light falls on is on the 'spotlight' part as '--tour-spotlight-x', '--tour-spotlight-y', '--tour-spotlight-width' and '--tour-spotlight-height', for a sheet that draws its own light, such as a ring around the target. Each stop is told its place in the run, from 'progress-label', such as "2 of 5". It describes the stop's panel, so a screen reader says it at every stop, and 'progress' draws it in the panel as well. A dialog or a floating stop, which has nothing to light, is shown over the 'backdrop' part. At a 'wait' stop the run waits for that stop's target to be on the page, and moves on by itself. **Focus follows the run.** Opening moves focus to the first stop's panel, and moving on from a control in a stop moves it to the next one. Ending the tour puts focus back on the element that had it when the tour opened, unless you have moved it somewhere else on the page. A stop does not trap focus, so you can still 'Tab' out to the element it describes. */
|
|
16822
|
+
/** The root holds the order of the stops: which stop is current, what Next and Back do, and when the tour is finished. Each stop holds its target, and you write all the text. **The spotlight is a shadow.** The scrim is a box the size of the current target with a very large 'box-shadow' spread, and the shadow paints the darkness. A 'clip-path' on a full-screen scrim breaks as soon as an element between the scrim and the viewport is transformed. The root measures the target's position in the browser. Nothing is measured on the server, because a tour starts only on request. 'open', 'default-open', 'helix-before-open', 'helix-before-close' and 'toggle' work as they do on 'Dialog'. Setting 'open' starts the run, and 'skip()' and 'requestOpen(false)' end it early. The box the light falls on is on the 'spotlight' part as '--tour-spotlight-x', '--tour-spotlight-y', '--tour-spotlight-width' and '--tour-spotlight-height', for a sheet that draws its own light, such as a ring around the target. Each stop is told its place in the run, from 'progress-label', such as "2 of 5". It describes the stop's panel, so a screen reader says it at every stop, and 'progress' draws it in the panel as well. A dialog or a floating stop, which has nothing to light, is shown over the 'backdrop' part. At a 'wait' stop the run waits for that stop's target to be on the page, and moves on by itself. **Focus follows the run.** Opening moves focus to the first stop's panel, and moving on from a control in a stop moves it to the next one. Ending the tour puts focus back on the element that had it when the tour opened, unless you have moved it somewhere else on the page. A stop does not trap focus, so you can still 'Tab' out to the element it describes. **The arrow keys move between stops** while focus is in one: the arrow that points the way the line runs goes on, and the other goes back, so on a right-to-left page 'ArrowLeft' goes on. Neither finishes the tour at the last stop, and a text field in a stop keeps its own arrows. 'Escape' skips the tour. */
|
|
16130
16823
|
"helix-headless-tour": DefineCustomElement<
|
|
16131
16824
|
HelixHeadlessTour,
|
|
16132
16825
|
HelixHeadlessTourVueProps,
|
|
@@ -16150,7 +16843,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16150
16843
|
HelixHeadlessTreeVueProps,
|
|
16151
16844
|
HelixHeadlessTreeVueEvents
|
|
16152
16845
|
>;
|
|
16153
|
-
/** A trend has three parts: a 'movement' of up, down, or neutral, the metric that moved, and a label for the period it moved over. The arrow shows the movement and its color shows whether the change is good. Movement and judgment are separate properties because they are separate facts. 'good' is unset by default, so a trend with no judgment is gray. For churn, latency, error rate, cost, and bounce rate, up is bad. Set the metric's polarity once with 'good', and the component picks the color from the movement. The judgment is also a custom state, 'better' or 'worse', for a sheet of your own. The movement is also written as a word, so a screen reader reads it. The styled tier hides 'part="direction"' visually and keeps it in the accessibility tree. The words are properties, 'up-label' through 'worse-label', so a page in another language can set its own. The arrow and any glyph slotted in its place are hidden from screen readers. Slot one glyph per movement into 'up-icon', 'down-icon' and 'neutral-icon', and the trend shows the one that matches; a glyph in 'icon' stands in for all three. Inside a 'Stat', put the trend in the stat's 'trend' slot so it is read with the figure it qualifies. The metric and the label are bare slots. An element that assigned its own slot on connect would add an attribute to its host after upgrade, which the React server markup did not have. */
|
|
16846
|
+
/** A trend has three parts: a 'movement' of up, down, or neutral, the metric that moved, and a label for the period it moved over. The arrow shows the movement and its color shows whether the change is good. Movement and judgment are separate properties because they are separate facts. 'good' is unset by default, so a trend with no judgment is gray. For churn, latency, error rate, cost, and bounce rate, up is bad. Set the metric's polarity once with 'good', and the component picks the color from the movement. The judgment is also a custom state, 'better' or 'worse', for a sheet of your own. The movement is also written as a word, so a screen reader reads it. The styled tier hides 'part="direction"' visually and keeps it in the accessibility tree. The words are properties, 'up-label' through 'worse-label', so a page in another language can set its own. The arrow and any glyph slotted in its place are hidden from screen readers. **Or give the change as a number.** 'value' is the signed change, such as '0.12' or '-8': its sign is the movement, and its size is written as the metric with 'Intl.NumberFormat', in 'locale' and with 'format-options', such as '{"style":"percent"}' for '12%'. 'movement' still wins when it is written. Without 'value' the metric is what the page slots. Slot one glyph per movement into 'up-icon', 'down-icon' and 'neutral-icon', and the trend shows the one that matches; a glyph in 'icon' stands in for all three. Inside a 'Stat', put the trend in the stat's 'trend' slot so it is read with the figure it qualifies. The metric and the label are bare slots. An element that assigned its own slot on connect would add an attribute to its host after upgrade, which the React server markup did not have. */
|
|
16154
16847
|
"helix-headless-trend": DefineCustomElement<
|
|
16155
16848
|
HelixHeadlessTrend,
|
|
16156
16849
|
HelixHeadlessTrendVueProps,
|
|
@@ -16180,7 +16873,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
16180
16873
|
HelixHeadlessVideoVueProps,
|
|
16181
16874
|
HelixHeadlessVideoVueEvents
|
|
16182
16875
|
>;
|
|
16183
|
-
/** The items arrive as data, in one of two ways: - 'items' takes an array. A framework sets it as a property, and React hydration keeps it. - 'for' names a '<script type="application/json">' that holds an array, which a server sends as markup. Each item is drawn into a row in one of two ways: - 'renderItem' is a function from an item and its index to the row's content: a Lit template, a string, or a DOM node. - A '<template>' child defines one row. 'data-field="name"' fills an element with the item's 'name' as text, and 'data-field-href="url"' writes the item's 'url' into 'href', the same for any attribute. A field may be a path of keys, such as 'author.name'. Rows are your markup in the light DOM, so your stylesheet styles them. **Keyboard.** The list is one tab stop. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous item. | | Home, End | Moves to the first or the last item. | | Page Down, Page Up | Moves by the number of items on screen. | | A letter or a word | Moves to the next item whose text starts with what you typed. | | Tab | Moves into the focused row's own links and buttons, then out of the list. | An item that is not drawn is scrolled into view and focused, so a keyboard reaches the whole set. When the row holding the tab stop scrolls away, the stop moves to the first row on screen. Typing matches each item's 'text-field', which is the first 'data-field' of the row template by default, or the item itself when it is a string or a number. Each row says its place in the whole set with 'aria-posinset' and 'aria-setsize', so a screen reader says "4,000 of 10,000". The row holding focus stays drawn when it scrolls out. **Selecting.** 'selection-mode' makes the list a list box a reader chooses from: 'single' selects one item and 'multiple' any number. Space or a press selects an item, Shift with Space,
|
|
16876
|
+
/** The items arrive as data, in one of two ways: - 'items' takes an array. A framework sets it as a property, and React hydration keeps it. - 'for' names a '<script type="application/json">' that holds an array, which a server sends as markup. Each item is drawn into a row in one of two ways: - 'renderItem' is a function from an item and its index to the row's content: a Lit template, a string, or a DOM node. - A '<template>' child defines one row. 'data-field="name"' fills an element with the item's 'name' as text, and 'data-field-href="url"' writes the item's 'url' into 'href', the same for any attribute. A field may be a path of keys, such as 'author.name'. Rows are your markup in the light DOM, so your stylesheet styles them. **A grid.** 'columns' lays the items out that many to a line, as a grid of equal columns, and windows the set a line at a time, as React Aria's grid layout does. Each item draws one element, a cell of the grid, and 'estimate' is the height of a line. Space the items with padding inside each one, which the list measures with the line. **Keyboard.** The list is one tab stop. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. | | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. | | Home, End | Moves to the first or the last item. | | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. | | A letter or a word | Moves to the next item whose text starts with what you typed. | | Tab | Moves into the focused row's own links and buttons, then out of the list. | An item that is not drawn is scrolled into view and focused, so a keyboard reaches the whole set. When the row holding the tab stop scrolls away, the stop moves to the first row on screen. Typing matches each item's 'text-field', which is the first 'data-field' of the row template by default, or the item itself when it is a string or a number. Each row says its place in the whole set with 'aria-posinset' and 'aria-setsize', so a screen reader says "4,000 of 10,000". The row holding focus stays drawn when it scrolls out. **Selecting.** 'selection-mode' makes the list a list box a reader chooses from: 'single' selects one item and 'multiple' any number. Space or a press selects an item, Shift with Space, an arrow, Home, End or a press takes in the items from the last one chosen, and Control or Command with A selects them all, in 'multiple'. 'value' holds the chosen items' keys, separated by commas, in the order of the set: 'key-field' names each item's key, and a string or a number item is its own key. A change asks with 'helix-before-change' and tells with 'change'. Each row is an 'option' marked 'aria-selected', so a row's own links and buttons are not reached there: keep those to a list without 'selection-mode'. **Loading more.** 'helix-range-change' fires as the items on screen change, and 'range' holds them. 'helix-load-more' fires once a reader is within one screen of the end, once for each length of the set: add to 'items' and it can fire again. While you fetch, set 'loading': the list is busy, and a row after the last item says "Loading more" ('loading-label', or your own content in the 'loading' slot). 'scrollToIndex' takes a reader to an item. **Row height.** Rows are placed by 'estimate' until they are drawn. Then the list reads the drawn rows' height once and places every row by it, so a wrong estimate still reaches the last item. Set 'measured' for rows of different heights. The list follows its source. A new 'items' array, an edit to the script's text, or a script replaced under the same id draws the new rows. A row that stays in view keeps its element as the list scrolls. The viewport scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root, so 'scrollTop' works with no stylesheet. You still need to set a block size. */
|
|
16184
16877
|
"helix-headless-virtual-list": DefineCustomElement<
|
|
16185
16878
|
HelixHeadlessVirtualList,
|
|
16186
16879
|
HelixHeadlessVirtualListVueProps,
|