@fusion.dev/helix-headless 0.144.0 → 0.146.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 +15195 -4240
- package/dist/accordion/item/accordion-item.d.ts +62 -12
- package/dist/accordion/item/accordion-item.js +41 -10
- package/dist/accordion/root/accordion-root.d.ts +14 -5
- package/dist/accordion/root/accordion-root.js +7 -1
- package/dist/announcement/root/announcement-root.d.ts +24 -3
- package/dist/announcement/root/announcement-root.js +39 -2
- package/dist/app-header/root/app-header-root.d.ts +12 -0
- package/dist/app-header/root/app-header-root.js +13 -1
- package/dist/app-header/sectioning.d.ts +9 -0
- package/dist/app-header/sectioning.js +27 -0
- package/dist/avatar/group/avatar-group.d.ts +20 -14
- package/dist/avatar/group/avatar-group.js +17 -19
- package/dist/badge/root/badge-root.d.ts +3 -1
- package/dist/badge/root/badge-root.js +2 -2
- package/dist/bar-chart/root/bar-chart-root.d.ts +18 -1
- package/dist/bar-chart/root/bar-chart-root.js +52 -15
- package/dist/bar-chart/stack.d.ts +15 -0
- package/dist/bar-chart/stack.js +19 -0
- package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +57 -1
- package/dist/breadcrumbs/root/breadcrumbs-root.js +73 -3
- package/dist/button/root/button-root.d.ts +26 -0
- package/dist/button/root/button-root.js +38 -18
- package/dist/button-group/root/button-group-root.d.ts +2 -1
- package/dist/button-group/root/button-group-root.js +5 -1
- package/dist/canvas/node/canvas-node.d.ts +4 -3
- package/dist/canvas/node/canvas-node.js +3 -2
- package/dist/canvas/root/canvas-root.d.ts +38 -3
- package/dist/canvas/root/canvas-root.js +123 -42
- package/dist/card/root/card-root.d.ts +24 -3
- package/dist/card/root/card-root.js +20 -8
- package/dist/carousel/root/carousel-root.d.ts +133 -4
- package/dist/carousel/root/carousel-root.js +174 -24
- package/dist/carousel/stops.d.ts +20 -0
- package/dist/carousel/stops.js +30 -0
- package/dist/chat/composer/chat-composer.d.ts +38 -6
- package/dist/chat/composer/chat-composer.js +42 -9
- package/dist/chat/message/chat-message.d.ts +32 -1
- package/dist/chat/message/chat-message.js +27 -10
- package/dist/chat/naming.d.ts +26 -0
- package/dist/chat/naming.js +14 -0
- package/dist/chat/root/chat-root.d.ts +58 -0
- package/dist/chat/root/chat-root.js +43 -3
- package/dist/checkbox/root/checkbox-root.d.ts +20 -0
- package/dist/checkbox/root/checkbox-root.js +14 -1
- package/dist/checkbox-group/root/checkbox-group-root.d.ts +8 -2
- package/dist/checkbox-group/root/checkbox-group-root.js +12 -10
- package/dist/checkbox-group/select-all.d.ts +27 -0
- package/dist/checkbox-group/select-all.js +12 -0
- package/dist/code-block/highlight.d.ts +15 -0
- package/dist/code-block/highlight.js +4 -0
- package/dist/code-block/root/code-block-root.d.ts +57 -2
- package/dist/code-block/root/code-block-root.js +63 -8
- package/dist/color-input/root/color-input-root.d.ts +3 -0
- package/dist/color-input/root/color-input-root.js +6 -3
- package/dist/color-picker/root/color-picker-root.d.ts +33 -4
- package/dist/color-picker/root/color-picker-root.js +80 -21
- package/dist/color-picker/swatches.d.ts +12 -0
- package/dist/color-picker/swatches.js +26 -0
- package/dist/combobox/root/combobox-root.d.ts +43 -0
- package/dist/combobox/root/combobox-root.js +79 -15
- package/dist/command/root/command-root.d.ts +16 -1
- package/dist/command/root/command-root.js +22 -4
- package/dist/copy-button/root/copy-button-root.d.ts +26 -1
- package/dist/copy-button/root/copy-button-root.js +12 -5
- package/dist/data-table/index.d.ts +1 -1
- package/dist/data-table/index.js +1 -1
- package/dist/data-table/keys.d.ts +24 -0
- package/dist/data-table/keys.js +24 -0
- package/dist/data-table/root/data-table-root.d.ts +170 -13
- package/dist/data-table/root/data-table-root.js +294 -52
- package/dist/data-table/tree.d.ts +55 -0
- package/dist/data-table/tree.js +54 -0
- package/dist/date-input/root/date-input-root.d.ts +3 -1
- package/dist/date-input/root/date-input-root.js +18 -7
- package/dist/date-picker/root/date-picker-root.js +12 -6
- package/dist/description-list/item/description-list-item.d.ts +17 -2
- package/dist/description-list/item/description-list-item.js +15 -2
- package/dist/description-list/root/description-list-root.d.ts +27 -1
- package/dist/description-list/root/description-list-root.js +26 -1
- package/dist/dialog/description.js +15 -1
- package/dist/dialog/root/dialog-root.d.ts +8 -2
- package/dist/dialog/root/dialog-root.js +16 -1
- package/dist/divider/root/divider-root.d.ts +3 -0
- package/dist/divider/root/divider-root.js +2 -1
- package/dist/donut-chart/root/donut-chart-root.d.ts +31 -0
- package/dist/donut-chart/root/donut-chart-root.js +48 -1
- package/dist/drawer/reveal.d.ts +8 -0
- package/dist/drawer/reveal.js +1 -0
- package/dist/drawer/root/drawer-root.d.ts +59 -0
- package/dist/drawer/root/drawer-root.js +63 -4
- package/dist/drilldown/item/drilldown-item.d.ts +11 -6
- package/dist/drilldown/item/drilldown-item.js +8 -5
- package/dist/drilldown/root/drilldown-root.d.ts +29 -0
- package/dist/drilldown/root/drilldown-root.js +28 -5
- package/dist/element-events.generated.js +83 -12
- package/dist/empty/root/empty-root.d.ts +3 -1
- package/dist/empty/root/empty-root.js +3 -2
- package/dist/file-input/root/file-input-root.d.ts +69 -6
- package/dist/file-input/root/file-input-root.js +82 -19
- package/dist/file-input/screen.d.ts +2 -1
- package/dist/filter-input/menu/filter-menu.d.ts +5 -0
- package/dist/filter-input/menu/filter-menu.js +16 -4
- package/dist/filter-input/root/filter-input-root.d.ts +30 -6
- package/dist/filter-input/root/filter-input-root.js +1 -1
- package/dist/filter-input/suggest.d.ts +28 -3
- package/dist/filter-input/suggest.js +18 -8
- package/dist/format-date/root/format-date-root.d.ts +9 -16
- package/dist/format-date/root/format-date-root.js +10 -27
- package/dist/heatmap/root/heatmap-root.d.ts +24 -13
- package/dist/heatmap/root/heatmap-root.js +34 -12
- package/dist/icon/root/icon-root.d.ts +12 -1
- package/dist/icon/root/icon-root.js +21 -10
- package/dist/icon/settle.d.ts +7 -0
- package/dist/icon/settle.js +10 -0
- package/dist/icon-button/root/icon-button-root.d.ts +2 -0
- package/dist/image/root/image-root.d.ts +5 -1
- package/dist/image/root/image-root.js +10 -2
- package/dist/input/root/input-root.d.ts +13 -3
- package/dist/input/root/input-root.js +12 -3
- package/dist/kbd/root/kbd-root.d.ts +35 -1
- package/dist/kbd/root/kbd-root.js +23 -4
- package/dist/legend/root/legend-root.d.ts +55 -8
- package/dist/legend/root/legend-root.js +55 -13
- package/dist/lightbox/root/lightbox-root.d.ts +49 -6
- package/dist/lightbox/root/lightbox-root.js +86 -19
- package/dist/lightbox/zoom-controller.d.ts +59 -0
- package/dist/lightbox/zoom-controller.js +128 -0
- package/dist/lightbox/zoom.d.ts +22 -0
- package/dist/lightbox/zoom.js +16 -0
- package/dist/line-chart/root/line-chart-root.d.ts +22 -1
- package/dist/line-chart/root/line-chart-root.js +21 -1
- package/dist/list/item/list-item.d.ts +70 -1
- package/dist/list/item/list-item.js +77 -6
- package/dist/list/numbering.d.ts +14 -0
- package/dist/list/numbering.js +8 -0
- package/dist/list/root/list-root.d.ts +155 -9
- package/dist/list/root/list-root.js +246 -4
- package/dist/list/selection.d.ts +49 -0
- package/dist/list/selection.js +30 -0
- package/dist/listbox/root/listbox-root.d.ts +37 -1
- package/dist/listbox/root/listbox-root.js +49 -4
- package/dist/loader/busy.d.ts +10 -0
- package/dist/loader/busy.js +11 -0
- package/dist/loader/root/loader-root.d.ts +9 -2
- package/dist/loader/root/loader-root.js +23 -3
- package/dist/map/root/map-root.d.ts +6 -2
- package/dist/map/root/map-root.js +5 -2
- package/dist/megamenu/root/megamenu-root.d.ts +62 -0
- package/dist/megamenu/root/megamenu-root.js +90 -5
- package/dist/menu/index.d.ts +1 -0
- package/dist/menu/index.js +1 -0
- package/dist/menu/item/menu-item.d.ts +87 -11
- package/dist/menu/item/menu-item.js +78 -22
- package/dist/menu/root/menu-root.d.ts +39 -1
- package/dist/menu/root/menu-root.js +65 -8
- package/dist/menu/section/menu-section.d.ts +55 -0
- package/dist/menu/section/menu-section.js +60 -0
- package/dist/meter/root/meter-root.d.ts +20 -1
- package/dist/meter/root/meter-root.js +11 -15
- package/dist/navigation/root/navigation-root.d.ts +18 -2
- package/dist/navigation/root/navigation-root.js +29 -3
- package/dist/notifications/root/notifications-root.d.ts +25 -0
- package/dist/notifications/root/notifications-root.js +33 -5
- package/dist/number-input/root/number-input-root.d.ts +17 -8
- package/dist/number-input/root/number-input-root.js +2 -7
- package/dist/object-inspector/root/object-inspector-root.d.ts +161 -32
- package/dist/object-inspector/root/object-inspector-root.js +264 -123
- package/dist/object-inspector/rows.d.ts +75 -0
- package/dist/object-inspector/rows.js +119 -0
- package/dist/option/root/option-root.d.ts +5 -3
- package/dist/outline/levels.d.ts +31 -0
- package/dist/outline/levels.js +23 -0
- package/dist/outline/root/outline-root.d.ts +86 -3
- package/dist/outline/root/outline-root.js +95 -12
- package/dist/pagination/size/pagination-size.d.ts +12 -2
- package/dist/pagination/size/pagination-size.js +20 -5
- package/dist/pin-input/code.d.ts +10 -0
- package/dist/pin-input/code.js +13 -0
- package/dist/pin-input/root/pin-input-root.d.ts +25 -1
- package/dist/pin-input/root/pin-input-root.js +10 -11
- package/dist/popover/hide-outside.d.ts +14 -0
- package/dist/popover/hide-outside.js +41 -0
- package/dist/popover/root/popover-root.d.ts +57 -7
- package/dist/popover/root/popover-root.js +58 -3
- package/dist/progress/root/progress-root.d.ts +20 -0
- package/dist/progress/root/progress-root.js +15 -15
- package/dist/qr-code/export.d.ts +26 -1
- package/dist/qr-code/export.js +14 -0
- package/dist/qr-code/root/qr-code-root.d.ts +19 -5
- package/dist/qr-code/root/qr-code-root.js +58 -9
- package/dist/quote/marks.d.ts +8 -0
- package/dist/quote/marks.js +5 -0
- package/dist/quote/root/quote-root.d.ts +14 -2
- package/dist/quote/root/quote-root.js +23 -1
- package/dist/radio/group/radio-group.d.ts +4 -10
- package/dist/radio/group/radio-group.js +5 -10
- package/dist/radio/root/radio-root.d.ts +6 -2
- package/dist/radio/root/radio-root.js +6 -1
- package/dist/rating/root/rating-root.d.ts +10 -5
- package/dist/rating/root/rating-root.js +32 -8
- package/dist/rating/steps.d.ts +7 -0
- package/dist/rating/steps.js +9 -0
- package/dist/scatter-chart/fit.d.ts +15 -0
- package/dist/scatter-chart/fit.js +35 -0
- package/dist/scatter-chart/root/scatter-chart-root.d.ts +21 -1
- package/dist/scatter-chart/root/scatter-chart-root.js +30 -17
- package/dist/scroll-area/root/scroll-area-root.d.ts +84 -0
- package/dist/scroll-area/root/scroll-area-root.js +106 -7
- package/dist/scroll-area/scrollbar-controller.d.ts +111 -0
- package/dist/scroll-area/scrollbar-controller.js +172 -0
- package/dist/scroll-area/scrollbar.d.ts +92 -0
- package/dist/scroll-area/scrollbar.js +33 -0
- package/dist/select/root/select-root.d.ts +15 -0
- package/dist/select/root/select-root.js +18 -6
- package/dist/skeleton/root/skeleton-root.d.ts +3 -0
- package/dist/skeleton/root/skeleton-root.js +4 -2
- package/dist/skip-link/root/skip-link-root.js +2 -2
- package/dist/slider/root/slider-root.d.ts +41 -4
- package/dist/slider/root/slider-root.js +23 -3
- package/dist/sparkline/readings.d.ts +18 -0
- package/dist/sparkline/readings.js +19 -0
- package/dist/sparkline/root/sparkline-root.d.ts +78 -7
- package/dist/sparkline/root/sparkline-root.js +118 -23
- package/dist/speed-dial/root/speed-dial-root.js +2 -2
- package/dist/splitter/root/splitter-root.d.ts +20 -12
- package/dist/splitter/root/splitter-root.js +226 -203
- package/dist/splitter/snap.d.ts +9 -0
- package/dist/splitter/snap.js +12 -0
- package/dist/stat/root/stat-root.d.ts +14 -5
- package/dist/stat/root/stat-root.js +21 -5
- package/dist/steps/reach.d.ts +20 -0
- package/dist/steps/reach.js +15 -0
- package/dist/steps/root/steps-root.d.ts +76 -0
- package/dist/steps/root/steps-root.js +93 -1
- package/dist/steps/step/step.d.ts +45 -2
- package/dist/steps/step/step.js +33 -6
- package/dist/switch/root/switch-root.d.ts +10 -0
- package/dist/table/column/table-column.d.ts +11 -10
- package/dist/table/column/table-column.js +8 -19
- package/dist/table/root/table-root.d.ts +126 -4
- package/dist/table/root/table-root.js +156 -6
- package/dist/table/row/table-row.d.ts +47 -1
- package/dist/table/row/table-row.js +39 -2
- package/dist/tabs/panel/tab-panel.d.ts +22 -5
- package/dist/tabs/panel/tab-panel.js +34 -6
- package/dist/tabs/root/tabs-root.d.ts +37 -1
- package/dist/tabs/root/tabs-root.js +22 -4
- package/dist/tabs/tab/tab.d.ts +41 -4
- package/dist/tabs/tab/tab.js +49 -3
- package/dist/tag/group/tag-group.d.ts +31 -4
- package/dist/tag/group/tag-group.js +46 -7
- package/dist/tag/root/tag-root.js +9 -2
- package/dist/textarea/root/textarea-root.d.ts +28 -1
- package/dist/textarea/root/textarea-root.js +40 -1
- package/dist/time-input/root/time-input-root.d.ts +5 -1
- package/dist/time-input/root/time-input-root.js +16 -8
- package/dist/time-picker/root/time-picker-root.d.ts +18 -4
- package/dist/time-picker/root/time-picker-root.js +7 -10
- package/dist/time-picker/wheel-name.d.ts +9 -0
- package/dist/time-picker/wheel-name.js +15 -0
- package/dist/timeline/group/timeline-group.d.ts +46 -0
- package/dist/timeline/group/timeline-group.js +37 -0
- package/dist/timeline/index.d.ts +1 -0
- package/dist/timeline/index.js +1 -0
- package/dist/timeline/root/timeline-root.d.ts +10 -3
- package/dist/toast/item/toast-item.d.ts +24 -18
- package/dist/toast/item/toast-item.js +36 -40
- package/dist/toast/root/toast-root.d.ts +6 -0
- package/dist/toast/root/toast-root.js +16 -1
- package/dist/toggle/group/toggle-group.d.ts +24 -3
- package/dist/toggle/group/toggle-group.js +34 -5
- package/dist/toolbar/root/toolbar-root.d.ts +13 -0
- package/dist/toolbar/root/toolbar-root.js +15 -5
- package/dist/tooltip/root/tooltip-root.d.ts +13 -2
- package/dist/tooltip/root/tooltip-root.js +9 -1
- package/dist/tour/back.d.ts +10 -0
- package/dist/tour/back.js +8 -0
- package/dist/tour/root/tour-root.d.ts +30 -2
- package/dist/tour/root/tour-root.js +34 -8
- package/dist/tree/item/tree-item.d.ts +61 -4
- package/dist/tree/item/tree-item.js +92 -20
- package/dist/tree/root/tree-root.d.ts +58 -0
- package/dist/tree/root/tree-root.js +80 -16
- package/dist/tree/selection.d.ts +24 -0
- package/dist/tree/selection.js +13 -0
- package/dist/trend/root/trend-root.d.ts +43 -18
- package/dist/trend/root/trend-root.js +31 -6
- package/dist/video/media-events.d.ts +44 -0
- package/dist/video/media-events.js +35 -0
- package/dist/video/root/video-root.d.ts +117 -18
- package/dist/video/root/video-root.js +93 -47
- package/dist/video-playlist/menu/video-playlist-menu.d.ts +5 -0
- package/dist/video-playlist/menu/video-playlist-menu.js +3 -1
- package/dist/video-playlist/order.d.ts +41 -0
- package/dist/video-playlist/order.js +34 -0
- package/dist/video-playlist/root/video-playlist-root.d.ts +77 -3
- package/dist/video-playlist/root/video-playlist-root.js +60 -16
- package/dist/virtual-list/controls.d.ts +4 -0
- package/dist/virtual-list/controls.js +30 -0
- package/dist/virtual-list/fill.d.ts +22 -0
- package/dist/virtual-list/fill.js +23 -0
- package/dist/virtual-list/keys.d.ts +15 -0
- package/dist/virtual-list/keys.js +24 -0
- package/dist/virtual-list/plan.d.ts +49 -0
- package/dist/virtual-list/plan.js +16 -0
- package/dist/virtual-list/root/virtual-list-root.d.ts +259 -26
- package/dist/virtual-list/root/virtual-list-root.js +333 -49
- package/lint.json +1 -1
- package/package.json +8 -8
- package/types/jsx.d.ts +8113 -1394
- package/types/svelte.d.ts +2 -0
- package/types/vue.d.ts +1678 -353
- package/dist/data-table/root/order.d.ts +0 -141
- package/dist/data-table/root/order.js +0 -76
- package/dist/listbox/range.d.ts +0 -17
- package/dist/listbox/range.js +0 -5
- package/dist/tag/selection.d.ts +0 -10
- package/dist/tag/selection.js +0 -12
package/types/vue.d.ts
CHANGED
|
@@ -94,6 +94,7 @@ import type {
|
|
|
94
94
|
HelixHeadlessMegamenu,
|
|
95
95
|
HelixHeadlessMenuItem,
|
|
96
96
|
HelixHeadlessMenu,
|
|
97
|
+
HelixHeadlessMenuSection,
|
|
97
98
|
HelixHeadlessMeter,
|
|
98
99
|
HelixHeadlessNavigation,
|
|
99
100
|
HelixHeadlessNotificationGroup,
|
|
@@ -133,7 +134,6 @@ import type {
|
|
|
133
134
|
HelixHeadlessStep,
|
|
134
135
|
HelixHeadlessSwitch,
|
|
135
136
|
HelixHeadlessTableCell,
|
|
136
|
-
at,
|
|
137
137
|
edgeOf,
|
|
138
138
|
HelixHeadlessTableColumn,
|
|
139
139
|
HelixHeadlessTable,
|
|
@@ -146,6 +146,7 @@ import type {
|
|
|
146
146
|
HelixHeadlessTextarea,
|
|
147
147
|
HelixHeadlessTimeInput,
|
|
148
148
|
HelixHeadlessTimePicker,
|
|
149
|
+
HelixHeadlessTimelineGroup,
|
|
149
150
|
HelixHeadlessTimelineItem,
|
|
150
151
|
HelixHeadlessTimeline,
|
|
151
152
|
HelixHeadlessToastItem,
|
|
@@ -169,6 +170,7 @@ import type {
|
|
|
169
170
|
ToggleEvent,
|
|
170
171
|
HelixDismissEvent,
|
|
171
172
|
HelixScrolledEvent,
|
|
173
|
+
HelixPressEvent,
|
|
172
174
|
HelixBeforeMoveEvent,
|
|
173
175
|
HelixBeforeReconnectEvent,
|
|
174
176
|
HelixBeforeRelabelEvent,
|
|
@@ -184,6 +186,7 @@ import type {
|
|
|
184
186
|
HelixSelectEvent,
|
|
185
187
|
HelixActivateEvent,
|
|
186
188
|
HelixSendEvent,
|
|
189
|
+
HelixTypingEvent,
|
|
187
190
|
HelixBeforePinEvent,
|
|
188
191
|
HelixHistoryEvent,
|
|
189
192
|
HelixPinEvent,
|
|
@@ -194,6 +197,9 @@ import type {
|
|
|
194
197
|
HelixSampleStartEvent,
|
|
195
198
|
HelixCreateEvent,
|
|
196
199
|
HelixFilterEvent,
|
|
200
|
+
HelixLoadMoreEvent,
|
|
201
|
+
HelixCopyErrorEvent,
|
|
202
|
+
HelixExpandEvent,
|
|
197
203
|
HelixFilteredEvent,
|
|
198
204
|
HelixNavigateEvent,
|
|
199
205
|
HelixReorderEvent,
|
|
@@ -212,7 +218,9 @@ import type {
|
|
|
212
218
|
HelixGraphSignalEvent,
|
|
213
219
|
HelixGraphZoomEvent,
|
|
214
220
|
HelixResizeEvent,
|
|
221
|
+
HelixClearEvent,
|
|
215
222
|
HelixShortcutEvent,
|
|
223
|
+
HelixActionEvent,
|
|
216
224
|
HelixMapPartChangeEvent,
|
|
217
225
|
HelixMapClusterEvent,
|
|
218
226
|
HelixMapPanEvent,
|
|
@@ -220,15 +228,21 @@ import type {
|
|
|
220
228
|
HelixMapRotateEvent,
|
|
221
229
|
HelixMapTiltEvent,
|
|
222
230
|
HelixMapZoomEvent,
|
|
231
|
+
HelixToggleEvent,
|
|
223
232
|
HelixReadEvent,
|
|
224
233
|
HelixCompleteEvent,
|
|
234
|
+
HelixPreviewEvent,
|
|
225
235
|
HelixBeforeCollapseEvent,
|
|
226
236
|
HelixBeforeResizeEvent,
|
|
227
237
|
HelixCollapseEvent,
|
|
228
238
|
HelixResizedEvent,
|
|
229
239
|
HelixTourAskEvent,
|
|
240
|
+
HelixTourStatusEvent,
|
|
241
|
+
HelixLoadEvent,
|
|
242
|
+
HelixEndEvent,
|
|
230
243
|
HelixNextEvent,
|
|
231
244
|
HelixPreviousEvent,
|
|
245
|
+
HelixRangeChangeEvent,
|
|
232
246
|
} from "@fusion.dev/helix-headless";
|
|
233
247
|
import type { HTMLAttributes, PublicProps, EmitFn, EmitsToProps } from "vue";
|
|
234
248
|
|
|
@@ -316,6 +330,22 @@ too. */
|
|
|
316
330
|
Unset takes the accordion's `heading-level`, and 3 where that is unset
|
|
317
331
|
too. */
|
|
318
332
|
headingLevel?: (HelixHeadlessAccordionItem["headingLevel"]) | undefined;
|
|
333
|
+
/** Whether find in page searches the section while it is closed, and opens it
|
|
334
|
+
on a match.
|
|
335
|
+
|
|
336
|
+
Off by default. A closed section is then `hidden="until-found"`, which
|
|
337
|
+
hides through `content-visibility`, so a stylesheet that animates the
|
|
338
|
+
section closed shows an empty box for the length of that animation. The
|
|
339
|
+
accordion's own `hidden-until-found` turns it on for every section. */
|
|
340
|
+
"hidden-until-found"?: (HelixHeadlessAccordionItem["hiddenUntilFound"]) | undefined;
|
|
341
|
+
/** Whether find in page searches the section while it is closed, and opens it
|
|
342
|
+
on a match.
|
|
343
|
+
|
|
344
|
+
Off by default. A closed section is then `hidden="until-found"`, which
|
|
345
|
+
hides through `content-visibility`, so a stylesheet that animates the
|
|
346
|
+
section closed shows an empty box for the length of that animation. The
|
|
347
|
+
accordion's own `hidden-until-found` turns it on for every section. */
|
|
348
|
+
hiddenUntilFound?: (HelixHeadlessAccordionItem["hiddenUntilFound"]) | undefined;
|
|
319
349
|
/** A group name. Opening an item closes the other items with the same name,
|
|
320
350
|
as `<details name>` does.
|
|
321
351
|
|
|
@@ -372,6 +402,14 @@ Unset is 3. An item's own `heading-level` wins over this. */
|
|
|
372
402
|
|
|
373
403
|
Unset is 3. An item's own `heading-level` wins over this. */
|
|
374
404
|
headingLevel?: (HelixHeadlessAccordion["headingLevel"]) | undefined;
|
|
405
|
+
/** Whether find in page searches every closed section, and opens the one it
|
|
406
|
+
matches in. Each item's own `hidden-until-found` turns it on for that item
|
|
407
|
+
alone. */
|
|
408
|
+
"hidden-until-found"?: (HelixHeadlessAccordion["hiddenUntilFound"]) | undefined;
|
|
409
|
+
/** Whether find in page searches every closed section, and opens the one it
|
|
410
|
+
matches in. Each item's own `hidden-until-found` turns it on for that item
|
|
411
|
+
alone. */
|
|
412
|
+
hiddenUntilFound?: (HelixHeadlessAccordion["hiddenUntilFound"]) | undefined;
|
|
375
413
|
/** How many sections may be open at once.
|
|
376
414
|
|
|
377
415
|
Absent is `multiple`, so nothing closes unexpectedly and the default costs
|
|
@@ -400,6 +438,12 @@ export type HelixHeadlessAnnouncementHelixDismissElementEvent =
|
|
|
400
438
|
HelixHeadlessAnnouncementElementEvent<HelixDismissEvent>;
|
|
401
439
|
|
|
402
440
|
export type HelixHeadlessAnnouncementVueProps = {
|
|
441
|
+
/** How long the announcement stays, in milliseconds, before it sends
|
|
442
|
+
`helix-dismiss`. When it is not set, it stays until it is dismissed.
|
|
443
|
+
|
|
444
|
+
Read once when the announcement is first rendered, as `Toast` reads its
|
|
445
|
+
own. The clock stops while the pointer or focus is on the announcement. */
|
|
446
|
+
duration?: (HelixHeadlessAnnouncement["duration"]) | undefined;
|
|
403
447
|
/** The band's color.
|
|
404
448
|
|
|
405
449
|
Paint only: unlike `Callout`, no value here draws a mark, changes the label,
|
|
@@ -440,7 +484,7 @@ would catch. */
|
|
|
440
484
|
};
|
|
441
485
|
|
|
442
486
|
export type HelixHeadlessAnnouncementVueEvents = {
|
|
443
|
-
/** The dismiss button was pressed. The announcement does not remove itself, so remove it in response. Cancelable. */
|
|
487
|
+
/** The dismiss button was pressed, or `duration` ran out. The announcement does not remove itself, so remove it in response. Cancelable. */
|
|
444
488
|
"helix-dismiss": HelixHeadlessAnnouncementHelixDismissElementEvent;
|
|
445
489
|
};
|
|
446
490
|
|
|
@@ -547,6 +591,22 @@ percentages and its totals, such as `de` for `1.240` and `32 %`.
|
|
|
547
591
|
Absent uses the runtime's own. The table's cells are shown as the table
|
|
548
592
|
writes them, whatever this says. */
|
|
549
593
|
locale?: (HelixHeadlessAreaChart["locale"]) | undefined;
|
|
594
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
595
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
596
|
+
`locale`.
|
|
597
|
+
|
|
598
|
+
Set it to the words of the page's language, such as `{position} von
|
|
599
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
600
|
+
legend hid is not counted. */
|
|
601
|
+
"position-label"?: (HelixHeadlessAreaChart["positionLabel"]) | undefined;
|
|
602
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
603
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
604
|
+
`locale`.
|
|
605
|
+
|
|
606
|
+
Set it to the words of the page's language, such as `{position} von
|
|
607
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
608
|
+
legend hid is not counted. */
|
|
609
|
+
positionLabel?: (HelixHeadlessAreaChart["positionLabel"]) | undefined;
|
|
550
610
|
};
|
|
551
611
|
|
|
552
612
|
export type HelixHeadlessAreaChartVueEvents = {};
|
|
@@ -571,15 +631,17 @@ everyone, assigning a matching property rather than an attribute.
|
|
|
571
631
|
takes no default**: `max = 0` would stamp `max="0"` onto every host that
|
|
572
632
|
never asked for a limit, including on the server. */
|
|
573
633
|
max?: (HelixHeadlessAvatarGroup["max"]) | undefined;
|
|
574
|
-
/** What a screen reader is told the count is, with `{count}` for the number
|
|
634
|
+
/** What a screen reader is told the count is, with `{count}` for the number
|
|
635
|
+
and `{names}` for the people it stands for, by each avatar's `name`.
|
|
575
636
|
|
|
576
637
|
The count shows "+3", which reads as "plus three" and says nothing about
|
|
577
|
-
what was counted. */
|
|
638
|
+
what was counted, nor who. */
|
|
578
639
|
"overflow-label"?: (HelixHeadlessAvatarGroup["overflowLabel"]) | undefined;
|
|
579
|
-
/** What a screen reader is told the count is, with `{count}` for the number
|
|
640
|
+
/** What a screen reader is told the count is, with `{count}` for the number
|
|
641
|
+
and `{names}` for the people it stands for, by each avatar's `name`.
|
|
580
642
|
|
|
581
643
|
The count shows "+3", which reads as "plus three" and says nothing about
|
|
582
|
-
what was counted. */
|
|
644
|
+
what was counted, nor who. */
|
|
583
645
|
overflowLabel?: (HelixHeadlessAvatarGroup["overflowLabel"]) | undefined;
|
|
584
646
|
};
|
|
585
647
|
|
|
@@ -641,7 +703,9 @@ export type HelixHeadlessAvatarVueEvents = {
|
|
|
641
703
|
export type HelixHeadlessBadgeVueProps = {
|
|
642
704
|
/** The badge's name, read by screen readers.
|
|
643
705
|
|
|
644
|
-
Required for a dot, which has no text to read.
|
|
706
|
+
Required for a dot, which has no text to read. `{count}` is replaced with
|
|
707
|
+
what the badge shows, so `label="{count} unread"` reads "8 unread" and
|
|
708
|
+
stays current as `value` changes, with no label of yours to keep in step. */
|
|
645
709
|
label?: (HelixHeadlessBadge["label"]) | undefined;
|
|
646
710
|
/** The largest number the badge shows.
|
|
647
711
|
|
|
@@ -756,6 +820,15 @@ scales at once is a rule that means nothing. The tooltip is unaffected: it
|
|
|
756
820
|
has always shown every column's own number, which is the reader's way out
|
|
757
821
|
of any scale question the picture raises. */
|
|
758
822
|
secondary?: (HelixHeadlessBarChart["secondary"]) | undefined;
|
|
823
|
+
/** Stacks a category's columns into one, each series standing on the ones
|
|
824
|
+
before it, so the column's height is the category's total.
|
|
825
|
+
|
|
826
|
+
Absent stands them side by side, as it always did. A negative reading
|
|
827
|
+
hangs below zero on the negatives before it, so neither direction hides
|
|
828
|
+
the other. The scale fits the stacks. A series
|
|
829
|
+
in `lines` is still a line, measured on its own reading; columns on the
|
|
830
|
+
second scale stack among themselves. */
|
|
831
|
+
stacked?: (HelixHeadlessBarChart["stacked"]) | undefined;
|
|
759
832
|
/** The id of the table to read.
|
|
760
833
|
|
|
761
834
|
Names a table in the same tree, so a chart inside another component's
|
|
@@ -776,6 +849,22 @@ percentages and its totals, such as `de` for `1.240` and `32 %`.
|
|
|
776
849
|
Absent uses the runtime's own. The table's cells are shown as the table
|
|
777
850
|
writes them, whatever this says. */
|
|
778
851
|
locale?: (HelixHeadlessBarChart["locale"]) | undefined;
|
|
852
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
853
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
854
|
+
`locale`.
|
|
855
|
+
|
|
856
|
+
Set it to the words of the page's language, such as `{position} von
|
|
857
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
858
|
+
legend hid is not counted. */
|
|
859
|
+
"position-label"?: (HelixHeadlessBarChart["positionLabel"]) | undefined;
|
|
860
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
861
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
862
|
+
`locale`.
|
|
863
|
+
|
|
864
|
+
Set it to the words of the page's language, such as `{position} von
|
|
865
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
866
|
+
legend hid is not counted. */
|
|
867
|
+
positionLabel?: (HelixHeadlessBarChart["positionLabel"]) | undefined;
|
|
779
868
|
};
|
|
780
869
|
|
|
781
870
|
export type HelixHeadlessBarChartVueEvents = {};
|
|
@@ -819,9 +908,29 @@ The consumer's decision. */
|
|
|
819
908
|
export type HelixHeadlessBreadcrumbVueEvents = {};
|
|
820
909
|
|
|
821
910
|
export type HelixHeadlessBreadcrumbsVueProps = {
|
|
911
|
+
/** The name of the button that shows a folded trail's hidden crumbs. `{count}`
|
|
912
|
+
is replaced by how many it shows. Translate it with the page. */
|
|
913
|
+
"expand-label"?: (HelixHeadlessBreadcrumbs["expandLabel"]) | undefined;
|
|
914
|
+
/** The name of the button that shows a folded trail's hidden crumbs. `{count}`
|
|
915
|
+
is replaced by how many it shows. Translate it with the page. */
|
|
916
|
+
expandLabel?: (HelixHeadlessBreadcrumbs["expandLabel"]) | undefined;
|
|
822
917
|
/** The landmark's name, read by screen readers. An `aria-label` on the host
|
|
823
918
|
wins over it. */
|
|
824
919
|
label?: (HelixHeadlessBreadcrumbs["label"]) | undefined;
|
|
920
|
+
/** The most crumbs a trail drawn from `items` shows before it folds its middle
|
|
921
|
+
into one, counting the first and the last. Unset, it never folds. At least
|
|
922
|
+
2, so the first crumb and the current page always show. */
|
|
923
|
+
"max-items"?: (HelixHeadlessBreadcrumbs["maxItems"] | `${number}`) | undefined;
|
|
924
|
+
/** The most crumbs a trail drawn from `items` shows before it folds its middle
|
|
925
|
+
into one, counting the first and the last. Unset, it never folds. At least
|
|
926
|
+
2, so the first crumb and the current page always show. */
|
|
927
|
+
maxItems?: (HelixHeadlessBreadcrumbs["maxItems"]) | undefined;
|
|
928
|
+
/** The trail as data, drawn as crumbs before any you slot. The last item is the
|
|
929
|
+
current page.
|
|
930
|
+
|
|
931
|
+
React Aria's `items`. A property only: a trail is built by script, and an
|
|
932
|
+
attribute would put the whole path into the markup twice. */
|
|
933
|
+
items?: (HelixHeadlessBreadcrumbs["items"]) | undefined;
|
|
825
934
|
};
|
|
826
935
|
|
|
827
936
|
export type HelixHeadlessBreadcrumbsVueEvents = {};
|
|
@@ -854,6 +963,15 @@ column. */
|
|
|
854
963
|
|
|
855
964
|
export type HelixHeadlessButtonGroupVueEvents = {};
|
|
856
965
|
|
|
966
|
+
/** `HelixHeadlessButton` component event */
|
|
967
|
+
export type HelixHeadlessButtonElementEvent<E = Event> = TypedEvent<
|
|
968
|
+
HelixHeadlessButton,
|
|
969
|
+
E
|
|
970
|
+
>;
|
|
971
|
+
/** `helix-press` event type */
|
|
972
|
+
export type HelixHeadlessButtonHelixPressElementEvent =
|
|
973
|
+
HelixHeadlessButtonElementEvent<HelixPressEvent>;
|
|
974
|
+
|
|
857
975
|
export type HelixHeadlessButtonVueProps = {
|
|
858
976
|
/** What to send when the button is activated, and what to send it to.
|
|
859
977
|
|
|
@@ -1041,7 +1159,10 @@ invoker without an id in the same tree needs. */
|
|
|
1041
1159
|
commandForElement?: (HelixHeadlessButton["commandForElement"]) | undefined;
|
|
1042
1160
|
};
|
|
1043
1161
|
|
|
1044
|
-
export type HelixHeadlessButtonVueEvents = {
|
|
1162
|
+
export type HelixHeadlessButtonVueEvents = {
|
|
1163
|
+
/** Fired when a press acts, with `detail.pointerType` saying what pressed the button. */
|
|
1164
|
+
"helix-press": HelixHeadlessButtonHelixPressElementEvent;
|
|
1165
|
+
};
|
|
1045
1166
|
|
|
1046
1167
|
/** `HelixHeadlessCallout` component event */
|
|
1047
1168
|
export type HelixHeadlessCalloutElementEvent<E = Event> = TypedEvent<
|
|
@@ -1181,9 +1302,10 @@ format does too, and moves them with it. Its `label` is drawn above it. */
|
|
|
1181
1302
|
/** The card's name as text. A group shows it, and another card's connections
|
|
1182
1303
|
read it out.
|
|
1183
1304
|
|
|
1184
|
-
A group needs one because it has no text of its own
|
|
1185
|
-
|
|
1186
|
-
|
|
1305
|
+
A group needs one because it has no text of its own. A card is named by
|
|
1306
|
+
it where it is set, and by its content where it is not, so a screen reader
|
|
1307
|
+
moving between cards hears each one's name. Set it on a card holding a
|
|
1308
|
+
picture or a figure, which has no words short enough to name it. */
|
|
1187
1309
|
label?: (HelixHeadlessCanvasNode["label"]) | undefined;
|
|
1188
1310
|
/** The name that connections and events use for this card, unique on its
|
|
1189
1311
|
board.
|
|
@@ -1633,6 +1755,12 @@ export type HelixHeadlessCanvasVueEvents = {
|
|
|
1633
1755
|
};
|
|
1634
1756
|
|
|
1635
1757
|
export type HelixHeadlessCardVueProps = {
|
|
1758
|
+
/** The card's accessible name, which makes it a named group.
|
|
1759
|
+
|
|
1760
|
+
The name `Stat.Group` and the other named regions take, set through
|
|
1761
|
+
`ElementInternals`. `aria-label` and `aria-labelledby` written on the card
|
|
1762
|
+
name it too, and win over this, as an author's attribute does. */
|
|
1763
|
+
label?: (HelixHeadlessCard["label"]) | undefined;
|
|
1636
1764
|
/** Places the media after the content. By default it comes before.
|
|
1637
1765
|
|
|
1638
1766
|
**A figure that concludes a card is the same region as one that opens it**,
|
|
@@ -1743,6 +1871,18 @@ read out in English. */
|
|
|
1743
1871
|
label?: (HelixHeadlessCarousel["label"]) | undefined;
|
|
1744
1872
|
/** Whether moving past either end wraps to the other. */
|
|
1745
1873
|
loop?: (HelixHeadlessCarousel["loop"]) | undefined;
|
|
1874
|
+
/** Whether a mouse can drag the track from slide to slide.
|
|
1875
|
+
|
|
1876
|
+
Off unless asked for, because a press on a slide is then the start of a
|
|
1877
|
+
drag, and text in a slide can no longer be selected with the mouse. A drag
|
|
1878
|
+
of a few pixels or less is still a press. */
|
|
1879
|
+
"mouse-drag"?: (HelixHeadlessCarousel["mouseDrag"]) | undefined;
|
|
1880
|
+
/** Whether a mouse can drag the track from slide to slide.
|
|
1881
|
+
|
|
1882
|
+
Off unless asked for, because a press on a slide is then the start of a
|
|
1883
|
+
drag, and text in a slide can no longer be selected with the mouse. A drag
|
|
1884
|
+
of a few pixels or less is still a press. */
|
|
1885
|
+
mouseDrag?: (HelixHeadlessCarousel["mouseDrag"]) | undefined;
|
|
1746
1886
|
/** The name of the control that moves to the next slide. */
|
|
1747
1887
|
"next-label"?: (HelixHeadlessCarousel["nextLabel"]) | undefined;
|
|
1748
1888
|
/** The name of the control that moves to the next slide. */
|
|
@@ -1884,6 +2024,14 @@ case is the absent attribute, and the styles read it that way. */
|
|
|
1884
2024
|
"previous-label"?: (HelixHeadlessCarousel["previousLabel"]) | undefined;
|
|
1885
2025
|
/** The name of the control that moves to the previous slide. */
|
|
1886
2026
|
previousLabel?: (HelixHeadlessCarousel["previousLabel"]) | undefined;
|
|
2027
|
+
/** The word screen readers announce in place of the carousel's role, set as
|
|
2028
|
+
`aria-roledescription`. Translate it with the rest of your text, or empty
|
|
2029
|
+
it to leave the role as `group`. */
|
|
2030
|
+
"role-label"?: (HelixHeadlessCarousel["roleLabel"]) | undefined;
|
|
2031
|
+
/** The word screen readers announce in place of the carousel's role, set as
|
|
2032
|
+
`aria-roledescription`. Translate it with the rest of your text, or empty
|
|
2033
|
+
it to leave the role as `group`. */
|
|
2034
|
+
roleLabel?: (HelixHeadlessCarousel["roleLabel"]) | undefined;
|
|
1887
2035
|
/** The name of each slide, with `{index}` and `{count}` filled in. */
|
|
1888
2036
|
"slide-label"?: (HelixHeadlessCarousel["slideLabel"]) | undefined;
|
|
1889
2037
|
/** The name of each slide, with `{index}` and `{count}` filled in. */
|
|
@@ -1894,6 +2042,14 @@ case is the absent attribute, and the styles read it that way. */
|
|
|
1894
2042
|
/** The word screen readers announce in place of a slide's role, set as
|
|
1895
2043
|
`aria-roledescription`. Translate it with the rest of your text. */
|
|
1896
2044
|
slideRoleLabel?: (HelixHeadlessCarousel["slideRoleLabel"]) | undefined;
|
|
2045
|
+
/** How many slides Previous, Next, the indicators, rotation, and a drag move
|
|
2046
|
+
at a time. Unset moves one. The track stops at every `slides-per-move`th
|
|
2047
|
+
position from the first, and at the last. */
|
|
2048
|
+
"slides-per-move"?: (HelixHeadlessCarousel["slidesPerMove"] | `${number}`) | undefined;
|
|
2049
|
+
/** How many slides Previous, Next, the indicators, rotation, and a drag move
|
|
2050
|
+
at a time. Unset moves one. The track stops at every `slides-per-move`th
|
|
2051
|
+
position from the first, and at the last. */
|
|
2052
|
+
slidesPerMove?: (HelixHeadlessCarousel["slidesPerMove"]) | undefined;
|
|
1897
2053
|
/** The name of the rotation control while rotation is stopped. */
|
|
1898
2054
|
"start-label"?: (HelixHeadlessCarousel["startLabel"]) | undefined;
|
|
1899
2055
|
/** The name of the rotation control while rotation is stopped. */
|
|
@@ -1919,10 +2075,11 @@ export type HelixHeadlessChatComposerElementEvent<E = Event> = TypedEvent<
|
|
|
1919
2075
|
/** `helix-send` event type */
|
|
1920
2076
|
export type HelixHeadlessChatComposerHelixSendElementEvent =
|
|
1921
2077
|
HelixHeadlessChatComposerElementEvent<HelixSendEvent>;
|
|
2078
|
+
/** `helix-typing` event type */
|
|
2079
|
+
export type HelixHeadlessChatComposerHelixTypingElementEvent =
|
|
2080
|
+
HelixHeadlessChatComposerElementEvent<HelixTypingEvent>;
|
|
1922
2081
|
|
|
1923
2082
|
export type HelixHeadlessChatComposerVueProps = {
|
|
1924
|
-
/** Whether the composer blocks input, such as while a turn is being sent. */
|
|
1925
|
-
disabled?: (HelixHeadlessChatComposer["disabled"]) | undefined;
|
|
1926
2083
|
/** The field's name, read by screen readers. */
|
|
1927
2084
|
label?: (HelixHeadlessChatComposer["label"]) | undefined;
|
|
1928
2085
|
/** Placeholder text shown in an empty field. */
|
|
@@ -1949,16 +2106,50 @@ button only.
|
|
|
1949
2106
|
`button` is what a composer holding several paragraphs wants, where Enter
|
|
1950
2107
|
has to mean a new line and nothing else. */
|
|
1951
2108
|
submitOn?: (HelixHeadlessChatComposer["submitOn"]) | undefined;
|
|
2109
|
+
/** How long after the last keystroke the user still counts as typing, in
|
|
2110
|
+
milliseconds. */
|
|
2111
|
+
"typing-timeout"?: (HelixHeadlessChatComposer["typingTimeout"] | `${number}`) | undefined;
|
|
2112
|
+
/** How long after the last keystroke the user still counts as typing, in
|
|
2113
|
+
milliseconds. */
|
|
2114
|
+
typingTimeout?: (HelixHeadlessChatComposer["typingTimeout"]) | undefined;
|
|
1952
2115
|
/** The text the user has written.
|
|
1953
2116
|
|
|
1954
2117
|
It follows typing, so reading it gives the draft. Set it to seed a draft or
|
|
1955
2118
|
to replace the one in the field, and set it to `''` to clear it. */
|
|
1956
2119
|
value?: (HelixHeadlessChatComposer["value"]) | undefined;
|
|
2120
|
+
/** Whether the control is disabled and cannot be used.
|
|
2121
|
+
|
|
2122
|
+
Reflected, because the styled tier selects on it, and mirrored to
|
|
2123
|
+
`aria-disabled` rather than removing the element from the accessibility
|
|
2124
|
+
tree, so a screen reader can still announce that the control exists.
|
|
2125
|
+
|
|
2126
|
+
The mirror itself is in `willUpdate` below, here rather than in each
|
|
2127
|
+
control, because here is where `disabled` is. */
|
|
2128
|
+
disabled?: (HelixHeadlessChatComposer["disabled"]) | undefined;
|
|
2129
|
+
/** The name the control's value is submitted under.
|
|
2130
|
+
|
|
2131
|
+
**Reflected, and it is the exception to "reflect only what CSS selects
|
|
2132
|
+
on".** The platform builds a form's entry list from the `name` *content
|
|
2133
|
+
attribute*, not from the property, so a control named through the property
|
|
2134
|
+
submitted under no name at all and was silently dropped. Measured: two
|
|
2135
|
+
inputs in one form, one named by attribute and one by property, and the
|
|
2136
|
+
form carried a single entry.
|
|
2137
|
+
|
|
2138
|
+
Safe for a React consumer, which is what the rule is protecting: React
|
|
2139
|
+
renders a custom element's props as attributes on the server, so the name
|
|
2140
|
+
is already in the markup being hydrated and reflecting it writes what is
|
|
2141
|
+
there. It is only a change to the markup when a consumer assigns it
|
|
2142
|
+
imperatively later, and nothing is hydrating by then.
|
|
2143
|
+
|
|
2144
|
+
Here rather than on each control. */
|
|
2145
|
+
name?: (HelixHeadlessChatComposer["name"]) | undefined;
|
|
1957
2146
|
};
|
|
1958
2147
|
|
|
1959
2148
|
export type HelixHeadlessChatComposerVueEvents = {
|
|
1960
2149
|
/** Fired when the user sends their turn, and cancelable. */
|
|
1961
2150
|
"helix-send": HelixHeadlessChatComposerHelixSendElementEvent;
|
|
2151
|
+
/** The user started or stopped writing, with `typing` saying which, as the composer's `typing` does. */
|
|
2152
|
+
"helix-typing": HelixHeadlessChatComposerHelixTypingElementEvent;
|
|
1962
2153
|
/** The user changed the text. Read it from `value`, for a typing indicator or a saved draft. Sent on the composer and does not bubble. */
|
|
1963
2154
|
input: HelixHeadlessChatComposerElementEvent;
|
|
1964
2155
|
};
|
|
@@ -1983,6 +2174,18 @@ participants is the ordinary case for anything worth building this for.
|
|
|
1983
2174
|
`me` and `them` are the conventional values and the stylesheet knows them;
|
|
1984
2175
|
anything else is a name the consumer styles. */
|
|
1985
2176
|
author?: (HelixHeadlessChatMessage["author"]) | undefined;
|
|
2177
|
+
/** The author's name, as a screen reader says it at the start of the turn,
|
|
2178
|
+
such as "Support" or "Ada Lovelace".
|
|
2179
|
+
|
|
2180
|
+
Empty reads "You" for `me`, the `author` itself where it is a name, and
|
|
2181
|
+
nothing for `them`. */
|
|
2182
|
+
"author-label"?: (HelixHeadlessChatMessage["authorLabel"]) | undefined;
|
|
2183
|
+
/** The author's name, as a screen reader says it at the start of the turn,
|
|
2184
|
+
such as "Support" or "Ada Lovelace".
|
|
2185
|
+
|
|
2186
|
+
Empty reads "You" for `me`, the `author` itself where it is a name, and
|
|
2187
|
+
nothing for `them`. */
|
|
2188
|
+
authorLabel?: (HelixHeadlessChatMessage["authorLabel"]) | undefined;
|
|
1986
2189
|
/** Label for a message that did not send. */
|
|
1987
2190
|
"failed-label"?: (HelixHeadlessChatMessage["failedLabel"]) | undefined;
|
|
1988
2191
|
/** Label for a message that did not send. */
|
|
@@ -2063,6 +2266,18 @@ only the consumer knows whether the server has anything older. */
|
|
|
2063
2266
|
historyText?: (HelixHeadlessChat["historyText"]) | undefined;
|
|
2064
2267
|
/** The conversation's name, read by screen readers. */
|
|
2065
2268
|
label?: (HelixHeadlessChat["label"]) | undefined;
|
|
2269
|
+
/** The word a screen reader says for `me` when it names a turn. */
|
|
2270
|
+
"me-label"?: (HelixHeadlessChat["meLabel"]) | undefined;
|
|
2271
|
+
/** The word a screen reader says for `me` when it names a turn. */
|
|
2272
|
+
meLabel?: (HelixHeadlessChat["meLabel"]) | undefined;
|
|
2273
|
+
/** The name a screen reader gives a turn with both an author and a time.
|
|
2274
|
+
`{author}` is who wrote it and `{time}` is when, as the turn shows it. A
|
|
2275
|
+
turn with only one of the two is named by that one. */
|
|
2276
|
+
"message-label"?: (HelixHeadlessChat["messageLabel"]) | undefined;
|
|
2277
|
+
/** The name a screen reader gives a turn with both an author and a time.
|
|
2278
|
+
`{author}` is who wrote it and `{time}` is when, as the turn shows it. A
|
|
2279
|
+
turn with only one of the two is named by that one. */
|
|
2280
|
+
messageLabel?: (HelixHeadlessChat["messageLabel"]) | undefined;
|
|
2066
2281
|
/** Whether the transcript follows new turns to the bottom.
|
|
2067
2282
|
|
|
2068
2283
|
The reader's scrolling asks first: `helix-before-pin` is cancelable, so a
|
|
@@ -2088,6 +2303,23 @@ one of paragraphs, and a reader who has scrolled up by half a message has
|
|
|
2088
2303
|
not left. The same distance from the top is what counts as reaching the
|
|
2089
2304
|
history. */
|
|
2090
2305
|
threshold?: (HelixHeadlessChat["threshold"]) | undefined;
|
|
2306
|
+
/** The name a screen reader gives a turn with neither an author it can say
|
|
2307
|
+
nor a time: a turn by `them` with no `author-label`, say. */
|
|
2308
|
+
"turn-label"?: (HelixHeadlessChat["turnLabel"]) | undefined;
|
|
2309
|
+
/** The name a screen reader gives a turn with neither an author it can say
|
|
2310
|
+
nor a time: a turn by `them` with no `author-label`, say. */
|
|
2311
|
+
turnLabel?: (HelixHeadlessChat["turnLabel"]) | undefined;
|
|
2312
|
+
/** Who on the other side is typing, by name, or empty while nobody is.
|
|
2313
|
+
|
|
2314
|
+
Set it from your connection, and clear it when they stop or send. The
|
|
2315
|
+
status band says it with `typing-label`. */
|
|
2316
|
+
typing?: (HelixHeadlessChat["typing"]) | undefined;
|
|
2317
|
+
/** What the status band says while someone is typing. `{author}` is the
|
|
2318
|
+
name in `typing`. */
|
|
2319
|
+
"typing-label"?: (HelixHeadlessChat["typingLabel"]) | undefined;
|
|
2320
|
+
/** What the status band says while someone is typing. `{author}` is the
|
|
2321
|
+
name in `typing`. */
|
|
2322
|
+
typingLabel?: (HelixHeadlessChat["typingLabel"]) | undefined;
|
|
2091
2323
|
/** The text shown and announced when there are no rows and none are loading. */
|
|
2092
2324
|
"empty-text"?: (HelixHeadlessChat["emptyText"]) | undefined;
|
|
2093
2325
|
/** The text shown and announced when there are no rows and none are loading. */
|
|
@@ -2249,9 +2481,13 @@ Not reflected: the attribute is the consumer's input and stays as they
|
|
|
2249
2481
|
wrote it, and `:state(checked)` carries the resolved state for
|
|
2250
2482
|
stylesheets. */
|
|
2251
2483
|
checked?: (HelixHeadlessCheckbox["checked"]) | undefined;
|
|
2252
|
-
/** Whether the control starts checked. A form reset returns it to this state
|
|
2484
|
+
/** Whether the control starts checked. A form reset returns it to this state,
|
|
2485
|
+
and to the `checked` attribute where this one is not written, as a native
|
|
2486
|
+
checkbox resets to the `checked` it declares. */
|
|
2253
2487
|
"default-checked"?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
|
|
2254
|
-
/** Whether the control starts checked. A form reset returns it to this state
|
|
2488
|
+
/** Whether the control starts checked. A form reset returns it to this state,
|
|
2489
|
+
and to the `checked` attribute where this one is not written, as a native
|
|
2490
|
+
checkbox resets to the `checked` it declares. */
|
|
2255
2491
|
defaultChecked?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
|
|
2256
2492
|
/** Whether a reader can see and focus the control and cannot change it. A
|
|
2257
2493
|
read-only control still submits its value.
|
|
@@ -2343,19 +2579,42 @@ export type HelixHeadlessCheckboxVueEvents = {
|
|
|
2343
2579
|
};
|
|
2344
2580
|
|
|
2345
2581
|
export type HelixHeadlessCodeBlockVueProps = {
|
|
2582
|
+
/** The expand button's words while the block shows every line. */
|
|
2583
|
+
"collapse-label"?: (HelixHeadlessCodeBlock["collapseLabel"]) | undefined;
|
|
2584
|
+
/** The expand button's words while the block shows every line. */
|
|
2585
|
+
collapseLabel?: (HelixHeadlessCodeBlock["collapseLabel"]) | undefined;
|
|
2346
2586
|
/** The copy button's name and tooltip text after a copy. */
|
|
2347
2587
|
"copied-label"?: (HelixHeadlessCodeBlock["copiedLabel"]) | undefined;
|
|
2348
2588
|
/** The copy button's name and tooltip text after a copy. */
|
|
2349
2589
|
copiedLabel?: (HelixHeadlessCodeBlock["copiedLabel"]) | undefined;
|
|
2350
|
-
/** The copy button's name and tooltip text before a copy.
|
|
2590
|
+
/** The copy button's name and tooltip text before a copy.
|
|
2591
|
+
|
|
2592
|
+
Where the block has a name, the button says it too, such as "Copy code,
|
|
2593
|
+
app.ts", so each copy button on a page with several blocks is told apart.
|
|
2594
|
+
In a diff, that is each file's own name. */
|
|
2351
2595
|
"copy-label"?: (HelixHeadlessCodeBlock["copyLabel"]) | undefined;
|
|
2352
|
-
/** The copy button's name and tooltip text before a copy.
|
|
2596
|
+
/** The copy button's name and tooltip text before a copy.
|
|
2597
|
+
|
|
2598
|
+
Where the block has a name, the button says it too, such as "Copy code,
|
|
2599
|
+
app.ts", so each copy button on a page with several blocks is told apart.
|
|
2600
|
+
In a diff, that is each file's own name. */
|
|
2353
2601
|
copyLabel?: (HelixHeadlessCodeBlock["copyLabel"]) | undefined;
|
|
2354
2602
|
/** Whether the content is a unified diff, drawn as the lines it changed.
|
|
2355
2603
|
|
|
2356
2604
|
Reflected, because the stylesheet paints a diff differently from code, and
|
|
2357
2605
|
`false` reflects as no attribute at all. */
|
|
2358
2606
|
diff?: (HelixHeadlessCodeBlock["diff"]) | undefined;
|
|
2607
|
+
/** Whether a block whose height is capped takes a button that shows every
|
|
2608
|
+
line, and fewer again.
|
|
2609
|
+
|
|
2610
|
+
The cap is the page's, `--code-block-max-block-size` on the styled tier;
|
|
2611
|
+
the button is drawn only while the cap hides something, measured as the
|
|
2612
|
+
block lays out. Not for a diff, whose files each scroll on their own. */
|
|
2613
|
+
expandable?: (HelixHeadlessCodeBlock["expandable"]) | undefined;
|
|
2614
|
+
/** The expand button's words while the cap hides lines. */
|
|
2615
|
+
"expand-label"?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
|
|
2616
|
+
/** The expand button's words while the cap hides lines. */
|
|
2617
|
+
expandLabel?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
|
|
2359
2618
|
/** The block's name, usually a file name or a language.
|
|
2360
2619
|
|
|
2361
2620
|
In a diff, each file is named from the patch, and this names a patch that
|
|
@@ -2427,7 +2686,9 @@ the plain text.
|
|
|
2427
2686
|
Called with the code as written and returning HTML, such as the output of
|
|
2428
2687
|
Shiki's `codeToHtml` or Prism's `highlight`. **The markup is drawn as
|
|
2429
2688
|
given**, so it has to escape the code it was handed, which those
|
|
2430
|
-
highlighters do.
|
|
2689
|
+
highlighters do. A `<pre>` and `<code>` around the whole of it, which
|
|
2690
|
+
Shiki writes, are taken off, so the lines sit level with the gutter's
|
|
2691
|
+
numbers and the block keeps one tab stop. Bind the language in the function you pass. The code
|
|
2431
2692
|
stays in the slot, so the copy button copies it as written and a reader
|
|
2432
2693
|
without the script still has it. Not called on a server, which has no code
|
|
2433
2694
|
to read, nor for a diff. */
|
|
@@ -2569,9 +2830,13 @@ hydration, or diffed by a framework, it comes back holding whatever the
|
|
|
2569
2830
|
last reader did rather than what the author wrote. `:state(open)` carries
|
|
2570
2831
|
the resolved state for stylesheets, which is what the mirror is for. */
|
|
2571
2832
|
open?: (HelixHeadlessColorInput["open"]) | undefined;
|
|
2572
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
2833
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
2834
|
+
and to the `value` attribute where this one is not written, as a native
|
|
2835
|
+
control resets to the `value` it declares. */
|
|
2573
2836
|
"default-value"?: (HelixHeadlessColorInput["defaultValue"]) | undefined;
|
|
2574
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
2837
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
2838
|
+
and to the `value` attribute where this one is not written, as a native
|
|
2839
|
+
control resets to the `value` it declares. */
|
|
2575
2840
|
defaultValue?: (HelixHeadlessColorInput["defaultValue"]) | undefined;
|
|
2576
2841
|
/** The control's current value, which its form submits.
|
|
2577
2842
|
|
|
@@ -2760,6 +3025,13 @@ the color. */
|
|
|
2760
3025
|
"eyedropper-label"?: (HelixHeadlessColorPicker["eyedropperLabel"]) | undefined;
|
|
2761
3026
|
/** What the eyedropper is called. */
|
|
2762
3027
|
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;
|
|
2763
3035
|
/** The syntax the value is written in: `hex`, `rgb`, or `hsl`.
|
|
2764
3036
|
|
|
2765
3037
|
Only what is written. Everything is read whatever this says, so a picker on
|
|
@@ -2938,9 +3210,13 @@ speaks it. Absent is the control's own sentence, in English. */
|
|
|
2938
3210
|
named for the validity flag it reports, so a form in another language
|
|
2939
3211
|
speaks it. Absent is the control's own sentence, in English. */
|
|
2940
3212
|
valueMissingMessage?: (HelixHeadlessColorPicker["valueMissingMessage"]) | undefined;
|
|
2941
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
3213
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
3214
|
+
and to the `value` attribute where this one is not written, as a native
|
|
3215
|
+
control resets to the `value` it declares. */
|
|
2942
3216
|
"default-value"?: (HelixHeadlessColorPicker["defaultValue"]) | undefined;
|
|
2943
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
3217
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
3218
|
+
and to the `value` attribute where this one is not written, as a native
|
|
3219
|
+
control resets to the `value` it declares. */
|
|
2944
3220
|
defaultValue?: (HelixHeadlessColorPicker["defaultValue"]) | undefined;
|
|
2945
3221
|
/** The control's current value, which its form submits.
|
|
2946
3222
|
|
|
@@ -3012,6 +3288,9 @@ export type HelixHeadlessComboboxHelixCreateElementEvent =
|
|
|
3012
3288
|
/** `helix-filter` event type */
|
|
3013
3289
|
export type HelixHeadlessComboboxHelixFilterElementEvent =
|
|
3014
3290
|
HelixHeadlessComboboxElementEvent<HelixFilterEvent>;
|
|
3291
|
+
/** `helix-load-more` event type */
|
|
3292
|
+
export type HelixHeadlessComboboxHelixLoadMoreElementEvent =
|
|
3293
|
+
HelixHeadlessComboboxElementEvent<HelixLoadMoreEvent>;
|
|
3015
3294
|
/** `toggle` event type */
|
|
3016
3295
|
export type HelixHeadlessComboboxToggleElementEvent =
|
|
3017
3296
|
HelixHeadlessComboboxElementEvent<ToggleEvent>;
|
|
@@ -3058,10 +3337,34 @@ on it adds what was typed. */
|
|
|
3058
3337
|
"empty-text"?: (HelixHeadlessCombobox["emptyText"]) | undefined;
|
|
3059
3338
|
/** Text shown when the filter hides every option. */
|
|
3060
3339
|
emptyText?: (HelixHeadlessCombobox["emptyText"]) | undefined;
|
|
3340
|
+
/** How long typing rests before the list is narrowed and `helix-filter` is
|
|
3341
|
+
sent, in milliseconds.
|
|
3342
|
+
|
|
3343
|
+
For options filtered on a server, where `helix-filter` starts a request: a
|
|
3344
|
+
delay sends one request for a word instead of one per letter. The arrow
|
|
3345
|
+
keys, Enter and Escape narrow at once on what was typed. `0` narrows on
|
|
3346
|
+
every keystroke. See Listbox's `filter-delay`. */
|
|
3347
|
+
"filter-delay"?: (HelixHeadlessCombobox["filterDelay"] | `${number}`) | undefined;
|
|
3348
|
+
/** How long typing rests before the list is narrowed and `helix-filter` is
|
|
3349
|
+
sent, in milliseconds.
|
|
3350
|
+
|
|
3351
|
+
For options filtered on a server, where `helix-filter` starts a request: a
|
|
3352
|
+
delay sends one request for a word instead of one per letter. The arrow
|
|
3353
|
+
keys, Enter and Escape narrow at once on what was typed. `0` narrows on
|
|
3354
|
+
every keystroke. See Listbox's `filter-delay`. */
|
|
3355
|
+
filterDelay?: (HelixHeadlessCombobox["filterDelay"]) | undefined;
|
|
3061
3356
|
/** The list's name, read by screen readers. The list has no visible name. */
|
|
3062
3357
|
"list-label"?: (HelixHeadlessCombobox["listLabel"]) | undefined;
|
|
3063
3358
|
/** The list's name, read by screen readers. The list has no visible name. */
|
|
3064
3359
|
listLabel?: (HelixHeadlessCombobox["listLabel"]) | undefined;
|
|
3360
|
+
/** What the list says when its options could not be loaded, such as after a
|
|
3361
|
+
request to a server fails. Empty is no error. Passed to the list, which
|
|
3362
|
+
shows it under any options there are and tells screen readers. */
|
|
3363
|
+
"load-error"?: (HelixHeadlessCombobox["loadError"]) | undefined;
|
|
3364
|
+
/** What the list says when its options could not be loaded, such as after a
|
|
3365
|
+
request to a server fails. Empty is no error. Passed to the list, which
|
|
3366
|
+
shows it under any options there are and tells screen readers. */
|
|
3367
|
+
loadError?: (HelixHeadlessCombobox["loadError"]) | undefined;
|
|
3065
3368
|
/** Whether the options are still loading.
|
|
3066
3369
|
|
|
3067
3370
|
Passed straight to the list, which is where the rows are and so where the
|
|
@@ -3089,6 +3392,22 @@ property the role does not support and no spec here ever asserted: the one
|
|
|
3089
3392
|
that covers this says in as many words that telling the list is what this
|
|
3090
3393
|
element is responsible for. */
|
|
3091
3394
|
multiple?: (HelixHeadlessCombobox["multiple"]) | undefined;
|
|
3395
|
+
/** The text shown when typing hides every one of the options, where there are
|
|
3396
|
+
some. Absent, `empty-text` shows. See Listbox's `no-results-text`. */
|
|
3397
|
+
"no-results-text"?: (HelixHeadlessCombobox["noResultsText"]) | undefined;
|
|
3398
|
+
/** The text shown when typing hides every one of the options, where there are
|
|
3399
|
+
some. Absent, `empty-text` shows. See Listbox's `no-results-text`. */
|
|
3400
|
+
noResultsText?: (HelixHeadlessCombobox["noResultsText"]) | undefined;
|
|
3401
|
+
/** What opens the list: `input`, typing or pressing Down; `focus`, also
|
|
3402
|
+
arriving in the field, by Tab or a press; or `manual`, only Down, Alt+Down
|
|
3403
|
+
or a press on the caret, so typing narrows a list the reader has asked
|
|
3404
|
+
for. React Aria's `menuTrigger`. */
|
|
3405
|
+
"open-on"?: (HelixHeadlessCombobox["openOn"]) | undefined;
|
|
3406
|
+
/** What opens the list: `input`, typing or pressing Down; `focus`, also
|
|
3407
|
+
arriving in the field, by Tab or a press; or `manual`, only Down, Alt+Down
|
|
3408
|
+
or a press on the caret, so typing narrows a list the reader has asked
|
|
3409
|
+
for. React Aria's `menuTrigger`. */
|
|
3410
|
+
openOn?: (HelixHeadlessCombobox["openOn"]) | undefined;
|
|
3092
3411
|
/** Text shown while nothing has been chosen. */
|
|
3093
3412
|
placeholder?: (HelixHeadlessCombobox["placeholder"]) | undefined;
|
|
3094
3413
|
/** Whether the choice is locked. A read-only combobox still submits its value.
|
|
@@ -3167,9 +3486,13 @@ as `+3`, does not say what it does. */
|
|
|
3167
3486
|
"max-tags"?: (HelixHeadlessCombobox["maxTags"] | `${number}`) | undefined;
|
|
3168
3487
|
/** How many tokens to show before the rest become a count. */
|
|
3169
3488
|
maxTags?: (HelixHeadlessCombobox["maxTags"]) | undefined;
|
|
3170
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
3489
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
3490
|
+
and to the `value` attribute where this one is not written, as a native
|
|
3491
|
+
control resets to the `value` it declares. */
|
|
3171
3492
|
"default-value"?: (HelixHeadlessCombobox["defaultValue"]) | undefined;
|
|
3172
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
3493
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
3494
|
+
and to the `value` attribute where this one is not written, as a native
|
|
3495
|
+
control resets to the `value` it declares. */
|
|
3173
3496
|
defaultValue?: (HelixHeadlessCombobox["defaultValue"]) | undefined;
|
|
3174
3497
|
/** The control's current value, which its form submits.
|
|
3175
3498
|
|
|
@@ -3256,6 +3579,8 @@ export type HelixHeadlessComboboxVueEvents = {
|
|
|
3256
3579
|
"helix-create": HelixHeadlessComboboxHelixCreateElementEvent;
|
|
3257
3580
|
/** Fired as the user types, with the text the list is filtered by. Cancelable: cancel it to leave the list unfiltered and do the filtering yourself. */
|
|
3258
3581
|
"helix-filter": HelixHeadlessComboboxHelixFilterElementEvent;
|
|
3582
|
+
/** Fired once the list is scrolled within a screen of its end, once for each number of options, and not while `loading` is set. Add the next page and set `loading` while you fetch it. */
|
|
3583
|
+
"helix-load-more": HelixHeadlessComboboxHelixLoadMoreElementEvent;
|
|
3259
3584
|
/** Fired after the value changes. */
|
|
3260
3585
|
input: HelixHeadlessComboboxElementEvent;
|
|
3261
3586
|
/** Fired when the panel opens or closes, with `newState` and `oldState`. */
|
|
@@ -3276,6 +3601,9 @@ export type HelixHeadlessCommandHelixBeforeOpenElementEvent =
|
|
|
3276
3601
|
/** `helix-filter` event type */
|
|
3277
3602
|
export type HelixHeadlessCommandHelixFilterElementEvent =
|
|
3278
3603
|
HelixHeadlessCommandElementEvent<HelixFilterEvent>;
|
|
3604
|
+
/** `helix-load-more` event type */
|
|
3605
|
+
export type HelixHeadlessCommandHelixLoadMoreElementEvent =
|
|
3606
|
+
HelixHeadlessCommandElementEvent<HelixLoadMoreEvent>;
|
|
3279
3607
|
/** `helix-select` event type */
|
|
3280
3608
|
export type HelixHeadlessCommandHelixSelectElementEvent =
|
|
3281
3609
|
HelixHeadlessCommandElementEvent<HelixSelectEvent>;
|
|
@@ -3304,6 +3632,14 @@ with: one key, said once. */
|
|
|
3304
3632
|
hotkey?: (HelixHeadlessCommand["hotkey"]) | undefined;
|
|
3305
3633
|
/** Accessible name for the overlay, which has no visible heading. */
|
|
3306
3634
|
label?: (HelixHeadlessCommand["label"]) | undefined;
|
|
3635
|
+
/** What the list says when its commands could not be loaded, such as after a
|
|
3636
|
+
request to a server fails. Empty is no error. Passed to the list, which
|
|
3637
|
+
shows it under any commands there are and tells screen readers. */
|
|
3638
|
+
"load-error"?: (HelixHeadlessCommand["loadError"]) | undefined;
|
|
3639
|
+
/** What the list says when its commands could not be loaded, such as after a
|
|
3640
|
+
request to a server fails. Empty is no error. Passed to the list, which
|
|
3641
|
+
shows it under any commands there are and tells screen readers. */
|
|
3642
|
+
loadError?: (HelixHeadlessCommand["loadError"]) | undefined;
|
|
3307
3643
|
/** Whether the commands are still loading, for a palette that asks a server
|
|
3308
3644
|
for them as the user types.
|
|
3309
3645
|
|
|
@@ -3313,6 +3649,12 @@ Passed to the list, which shows `loading-text` and tells screen readers. */
|
|
|
3313
3649
|
"loading-text"?: (HelixHeadlessCommand["loadingText"]) | undefined;
|
|
3314
3650
|
/** The text shown while the commands load. */
|
|
3315
3651
|
loadingText?: (HelixHeadlessCommand["loadingText"]) | undefined;
|
|
3652
|
+
/** The text shown when typing hides every one of the commands, where there are
|
|
3653
|
+
some. Absent, `empty-text` shows. See Listbox's `no-results-text`. */
|
|
3654
|
+
"no-results-text"?: (HelixHeadlessCommand["noResultsText"]) | undefined;
|
|
3655
|
+
/** The text shown when typing hides every one of the commands, where there are
|
|
3656
|
+
some. Absent, `empty-text` shows. See Listbox's `no-results-text`. */
|
|
3657
|
+
noResultsText?: (HelixHeadlessCommand["noResultsText"]) | undefined;
|
|
3316
3658
|
/** The text shown in the filter field before anything is typed. */
|
|
3317
3659
|
placeholder?: (HelixHeadlessCommand["placeholder"]) | undefined;
|
|
3318
3660
|
/** What a screen reader hears when typing leaves one command. `{count}` is
|
|
@@ -3355,6 +3697,8 @@ export type HelixHeadlessCommandVueEvents = {
|
|
|
3355
3697
|
"helix-before-open": HelixHeadlessCommandHelixBeforeOpenElementEvent;
|
|
3356
3698
|
/** Fired as the user types, with the text the list is filtered by. Cancelable: cancel it to leave the list unfiltered and filter the commands yourself, for example on a server while `loading` is set. */
|
|
3357
3699
|
"helix-filter": HelixHeadlessCommandHelixFilterElementEvent;
|
|
3700
|
+
/** Fired once the list is scrolled within a screen of its end, once for each number of commands, and not while `loading` is set. Add the next page and set `loading` while you fetch it. */
|
|
3701
|
+
"helix-load-more": HelixHeadlessCommandHelixLoadMoreElementEvent;
|
|
3358
3702
|
/** A command was chosen, with its `href` where the option is a link. Cancelable: cancel it to keep the palette open, and to keep the browser from following the link. */
|
|
3359
3703
|
"helix-select": HelixHeadlessCommandHelixSelectElementEvent;
|
|
3360
3704
|
/** The palette opened or closed. The event carries `newState` and `oldState`. */
|
|
@@ -3369,6 +3713,12 @@ export type HelixHeadlessCopyButtonElementEvent<E = Event> = TypedEvent<
|
|
|
3369
3713
|
/** `helix-copy` event type */
|
|
3370
3714
|
export type HelixHeadlessCopyButtonHelixCopyElementEvent =
|
|
3371
3715
|
HelixHeadlessCopyButtonElementEvent<HelixCopyEvent>;
|
|
3716
|
+
/** `helix-copy-error` event type */
|
|
3717
|
+
export type HelixHeadlessCopyButtonHelixCopyErrorElementEvent =
|
|
3718
|
+
HelixHeadlessCopyButtonElementEvent<HelixCopyErrorEvent>;
|
|
3719
|
+
/** `helix-press` event type */
|
|
3720
|
+
export type HelixHeadlessCopyButtonHelixPressElementEvent =
|
|
3721
|
+
HelixHeadlessCopyButtonElementEvent<HelixPressEvent>;
|
|
3372
3722
|
|
|
3373
3723
|
export type HelixHeadlessCopyButtonVueProps = {
|
|
3374
3724
|
/** The button's name and tooltip text after a copy.
|
|
@@ -3387,6 +3737,12 @@ clipboard. */
|
|
|
3387
3737
|
/** The button's name and tooltip text after a press that put nothing on the
|
|
3388
3738
|
clipboard. */
|
|
3389
3739
|
errorLabel?: (HelixHeadlessCopyButton["errorLabel"]) | undefined;
|
|
3740
|
+
/** How long the confirmation or the failure stands, in milliseconds, before
|
|
3741
|
+
the button goes back to `label`. */
|
|
3742
|
+
"feedback-duration"?: (HelixHeadlessCopyButton["feedbackDuration"] | `${number}`) | undefined;
|
|
3743
|
+
/** How long the confirmation or the failure stands, in milliseconds, before
|
|
3744
|
+
the button goes back to `label`. */
|
|
3745
|
+
feedbackDuration?: (HelixHeadlessCopyButton["feedbackDuration"]) | undefined;
|
|
3390
3746
|
/** The element to copy from, by its id: `key` for its text, `key[value]` for
|
|
3391
3747
|
an attribute, and `key.value` for a property. Read at the press, and used
|
|
3392
3748
|
in place of `value`. An element that is not there copies nothing, which is
|
|
@@ -3405,72 +3761,6 @@ whatever its `type`. Declared here so its own page says what it holds. */
|
|
|
3405
3761
|
value?: (HelixHeadlessCopyButton["value"]) | undefined;
|
|
3406
3762
|
/** */
|
|
3407
3763
|
"aria-label"?: unknown;
|
|
3408
|
-
/** What to send when the button is activated, and what to send it to.
|
|
3409
|
-
|
|
3410
|
-
The platform's invoker attributes, forwarded onto the inner `<button>`
|
|
3411
|
-
rather than left on the host: only a real button is recognized as an
|
|
3412
|
-
invoker, so `commandfor` written on a custom element resolves nothing and
|
|
3413
|
-
the trigger silently does nothing at all. A wrapper has to hand them down,
|
|
3414
|
-
the same way `label` becomes `aria-label` in there.
|
|
3415
|
-
|
|
3416
|
-
```html
|
|
3417
|
-
<helix-headless-button commandfor="confirm" command="--show">Delete…</helix-headless-button>
|
|
3418
|
-
```
|
|
3419
|
-
|
|
3420
|
-
`commandFor` spells its attribute out, because Lit lowercases a property
|
|
3421
|
-
name to derive one rather than dash-casing it, and what a consumer writes
|
|
3422
|
-
is the platform's `commandfor`. */
|
|
3423
|
-
command?: (HelixHeadlessCopyButton["command"]) | undefined;
|
|
3424
|
-
/** The id of the element the command is sent to. */
|
|
3425
|
-
commandfor?: (HelixHeadlessCopyButton["commandFor"]) | undefined;
|
|
3426
|
-
/** The id of the element the command is sent to. */
|
|
3427
|
-
commandFor?: (HelixHeadlessCopyButton["commandFor"]) | undefined;
|
|
3428
|
-
/** Where this button's submission goes, overriding the form's own.
|
|
3429
|
-
|
|
3430
|
-
**The five `form*` overrides work by writing the form and putting it back**,
|
|
3431
|
-
which is the only mechanism available and is closer to the platform than it
|
|
3432
|
-
sounds. `requestSubmit(submitter)` is how a native submitter carries these,
|
|
3433
|
-
and it refuses ours twice over: the inner `<button>` is `type="button"` so
|
|
3434
|
-
it is not a submit button, and it sits in this shadow root so its form owner
|
|
3435
|
-
is not the consumer's form. Both throw. So the submission is started with no
|
|
3436
|
-
submitter and the overrides are applied to the form for the duration of it.
|
|
3437
|
-
|
|
3438
|
-
The whole submit algorithm runs synchronously inside `requestSubmit()`, so
|
|
3439
|
-
the window is one call and a `finally` closes it whether or not a listener
|
|
3440
|
-
refused. What a `submit` handler observes during that window is the form a
|
|
3441
|
-
native submitter would have given it, which is the point. */
|
|
3442
|
-
formaction?: (HelixHeadlessCopyButton["formAction"]) | undefined;
|
|
3443
|
-
/** Where this button's submission goes, overriding the form's own.
|
|
3444
|
-
|
|
3445
|
-
**The five `form*` overrides work by writing the form and putting it back**,
|
|
3446
|
-
which is the only mechanism available and is closer to the platform than it
|
|
3447
|
-
sounds. `requestSubmit(submitter)` is how a native submitter carries these,
|
|
3448
|
-
and it refuses ours twice over: the inner `<button>` is `type="button"` so
|
|
3449
|
-
it is not a submit button, and it sits in this shadow root so its form owner
|
|
3450
|
-
is not the consumer's form. Both throw. So the submission is started with no
|
|
3451
|
-
submitter and the overrides are applied to the form for the duration of it.
|
|
3452
|
-
|
|
3453
|
-
The whole submit algorithm runs synchronously inside `requestSubmit()`, so
|
|
3454
|
-
the window is one call and a `finally` closes it whether or not a listener
|
|
3455
|
-
refused. What a `submit` handler observes during that window is the form a
|
|
3456
|
-
native submitter would have given it, which is the point. */
|
|
3457
|
-
formAction?: (HelixHeadlessCopyButton["formAction"]) | undefined;
|
|
3458
|
-
/** How the submission is encoded, overriding the form's own. */
|
|
3459
|
-
formenctype?: (HelixHeadlessCopyButton["formEnctype"]) | undefined;
|
|
3460
|
-
/** How the submission is encoded, overriding the form's own. */
|
|
3461
|
-
formEnctype?: (HelixHeadlessCopyButton["formEnctype"]) | undefined;
|
|
3462
|
-
/** Which HTTP method the submission uses, overriding the form's own. */
|
|
3463
|
-
formmethod?: (HelixHeadlessCopyButton["formMethod"]) | undefined;
|
|
3464
|
-
/** Which HTTP method the submission uses, overriding the form's own. */
|
|
3465
|
-
formMethod?: (HelixHeadlessCopyButton["formMethod"]) | undefined;
|
|
3466
|
-
/** Whether this submission skips the form's validation. */
|
|
3467
|
-
formnovalidate?: (HelixHeadlessCopyButton["formNoValidate"]) | undefined;
|
|
3468
|
-
/** Whether this submission skips the form's validation. */
|
|
3469
|
-
formNoValidate?: (HelixHeadlessCopyButton["formNoValidate"]) | undefined;
|
|
3470
|
-
/** Which browsing context the response lands in, overriding the form's own. */
|
|
3471
|
-
formtarget?: (HelixHeadlessCopyButton["formTarget"]) | undefined;
|
|
3472
|
-
/** Which browsing context the response lands in, overriding the form's own. */
|
|
3473
|
-
formTarget?: (HelixHeadlessCopyButton["formTarget"]) | undefined;
|
|
3474
3764
|
/** Whether the action the button started is still running.
|
|
3475
3765
|
|
|
3476
3766
|
A pending button keeps focus and stays in the tab order, and refuses every
|
|
@@ -3487,8 +3777,6 @@ a press, so focus stays where the reader left it. */
|
|
|
3487
3777
|
"pending-label"?: (HelixHeadlessCopyButton["pendingLabel"]) | undefined;
|
|
3488
3778
|
/** What a reader hears when the button becomes pending while it has focus. */
|
|
3489
3779
|
pendingLabel?: (HelixHeadlessCopyButton["pendingLabel"]) | undefined;
|
|
3490
|
-
/** What activating the button does to its form. */
|
|
3491
|
-
type?: (HelixHeadlessCopyButton["type"]) | undefined;
|
|
3492
3780
|
/** Whether the control is disabled and cannot be used.
|
|
3493
3781
|
|
|
3494
3782
|
Reflected, because the styled tier selects on it, and mirrored to
|
|
@@ -3515,31 +3803,6 @@ imperatively later, and nothing is hydrating by then.
|
|
|
3515
3803
|
|
|
3516
3804
|
Here rather than on each control. */
|
|
3517
3805
|
name?: (HelixHeadlessCopyButton["name"]) | undefined;
|
|
3518
|
-
/** Whether this button is a disclosure trigger, and whether its panel is open.
|
|
3519
|
-
|
|
3520
|
-
**Set by whatever owns the panel, and a property rather than an attribute
|
|
3521
|
-
for the reason `Menu` already states about its items**: an attribute
|
|
3522
|
-
written onto a consumer's element after it upgrades is a hydration mismatch
|
|
3523
|
-
waiting to happen. Measured 28 Aug 2026 against React 19.2.8, server markup
|
|
3524
|
-
hydrated with the definitions loaded either side of `hydrateRoot`:
|
|
3525
|
-
`Megamenu` and `SpeedDial` wrote `aria-expanded` onto the slotted trigger
|
|
3526
|
-
and React reported "some attributes of the server rendered HTML didn't
|
|
3527
|
-
match the client properties. This won't be patched up" in both orders;
|
|
3528
|
-
`Popover` and `Menu`, which write nothing, were clean in both.
|
|
3529
|
-
|
|
3530
|
-
**A property crosses that gap because React never looks at one.** It diffs
|
|
3531
|
-
the attributes it rendered, and this one is `attribute: false`, so the state
|
|
3532
|
-
travels to the inner `<button>` and lands inside a shadow root React does
|
|
3533
|
-
not own and cannot compare. The consumer's own element is left exactly as
|
|
3534
|
-
they served it and the reader is still told what the control does.
|
|
3535
|
-
|
|
3536
|
-
`undefined` renders nothing at all, so a button that is not a trigger
|
|
3537
|
-
carries no `aria-expanded`: the resting state is the attribute's absence,
|
|
3538
|
-
which is the rule every reflected property here follows.
|
|
3539
|
-
|
|
3540
|
-
A consumer who wants to say this statically writes `aria-expanded` on the
|
|
3541
|
-
host instead, which `AriaForwardController` carries to the same place. */
|
|
3542
|
-
expanded?: (HelixHeadlessCopyButton["expanded"]) | undefined;
|
|
3543
3806
|
/** Whether the button holds its group's tab stop.
|
|
3544
3807
|
|
|
3545
3808
|
A toolbar keeps one tab stop across its children, and the obvious way to do
|
|
@@ -3551,14 +3814,6 @@ and the stop lands on the inner control inside the shadow root.
|
|
|
3551
3814
|
No attribute, because it is coordination between elements rather than
|
|
3552
3815
|
anything a consumer sets. */
|
|
3553
3816
|
focusable?: (HelixHeadlessCopyButton["focusable"]) | undefined;
|
|
3554
|
-
/** What kind of panel this button opens, where it opens one: `menu` for a
|
|
3555
|
-
`Menu`.
|
|
3556
|
-
|
|
3557
|
-
Set by the component that owns the panel, as a property for the reason
|
|
3558
|
-
`expanded` gives above. It is what makes a reader say the button opens a
|
|
3559
|
-
menu. Read from Chromium's tree, a Menu's trigger was a plain button that
|
|
3560
|
-
reported collapsed and expanded and no popup. */
|
|
3561
|
-
popup?: (HelixHeadlessCopyButton["popup"]) | undefined;
|
|
3562
3817
|
/** The element this button's command is sent to, resolved.
|
|
3563
3818
|
|
|
3564
3819
|
The platform's own accessor, because the resolution is otherwise kept
|
|
@@ -3572,8 +3827,10 @@ invoker without an id in the same tree needs. */
|
|
|
3572
3827
|
export type HelixHeadlessCopyButtonVueEvents = {
|
|
3573
3828
|
/** Fired after the clipboard write succeeds. */
|
|
3574
3829
|
"helix-copy": HelixHeadlessCopyButtonHelixCopyElementEvent;
|
|
3575
|
-
/** Fired when a press put nothing on the clipboard: the browser
|
|
3576
|
-
"helix-copy-error":
|
|
3830
|
+
/** Fired when a press put nothing on the clipboard: the browser did not allow the write, or there was nothing to copy. */
|
|
3831
|
+
"helix-copy-error": HelixHeadlessCopyButtonHelixCopyErrorElementEvent;
|
|
3832
|
+
/** Fired when a press acts, with `detail.pointerType` saying what pressed the button. */
|
|
3833
|
+
"helix-press": HelixHeadlessCopyButtonHelixPressElementEvent;
|
|
3577
3834
|
};
|
|
3578
3835
|
|
|
3579
3836
|
/** `HelixHeadlessDataTable` component event */
|
|
@@ -3584,12 +3841,18 @@ export type HelixHeadlessDataTableElementEvent<E = Event> = TypedEvent<
|
|
|
3584
3841
|
/** `helix-activate` event type */
|
|
3585
3842
|
export type HelixHeadlessDataTableHelixActivateElementEvent =
|
|
3586
3843
|
HelixHeadlessDataTableElementEvent<HelixActivateEvent>;
|
|
3844
|
+
/** `helix-expand` event type */
|
|
3845
|
+
export type HelixHeadlessDataTableHelixExpandElementEvent =
|
|
3846
|
+
HelixHeadlessDataTableElementEvent<HelixExpandEvent>;
|
|
3587
3847
|
/** `helix-filter` event type */
|
|
3588
3848
|
export type HelixHeadlessDataTableHelixFilterElementEvent =
|
|
3589
3849
|
HelixHeadlessDataTableElementEvent<HelixFilterEvent>;
|
|
3590
3850
|
/** `helix-filtered` event type */
|
|
3591
3851
|
export type HelixHeadlessDataTableHelixFilteredElementEvent =
|
|
3592
3852
|
HelixHeadlessDataTableElementEvent<HelixFilteredEvent>;
|
|
3853
|
+
/** `helix-load-more` event type */
|
|
3854
|
+
export type HelixHeadlessDataTableHelixLoadMoreElementEvent =
|
|
3855
|
+
HelixHeadlessDataTableElementEvent<HelixLoadMoreEvent>;
|
|
3593
3856
|
/** `helix-navigate` event type */
|
|
3594
3857
|
export type HelixHeadlessDataTableHelixNavigateElementEvent =
|
|
3595
3858
|
HelixHeadlessDataTableElementEvent<HelixNavigateEvent>;
|
|
@@ -3617,6 +3880,24 @@ export type HelixHeadlessDataTableVueProps = {
|
|
|
3617
3880
|
"ascending-label"?: (HelixHeadlessDataTable["ascendingLabel"]) | undefined;
|
|
3618
3881
|
/** The word for an ascending sort, in `sorted-label`. */
|
|
3619
3882
|
ascendingLabel?: (HelixHeadlessDataTable["ascendingLabel"]) | undefined;
|
|
3883
|
+
/** The field that holds a row's child rows, as an array. Set it, and `row-key`,
|
|
3884
|
+
and the grid becomes a tree grid.
|
|
3885
|
+
|
|
3886
|
+
Reflected, because the styled tier indents a tree grid's row headers by
|
|
3887
|
+
it. No default, so a table that sets none writes nothing onto its host. */
|
|
3888
|
+
"child-field"?: (HelixHeadlessDataTable["childField"]) | undefined;
|
|
3889
|
+
/** The field that holds a row's child rows, as an array. Set it, and `row-key`,
|
|
3890
|
+
and the grid becomes a tree grid.
|
|
3891
|
+
|
|
3892
|
+
Reflected, because the styled tier indents a tree grid's row headers by
|
|
3893
|
+
it. No default, so a table that sets none writes nothing onto its host. */
|
|
3894
|
+
childField?: (HelixHeadlessDataTable["childField"]) | undefined;
|
|
3895
|
+
/** The keys of the rows open at the start, separated by commas. Used until
|
|
3896
|
+
`expanded` is set. */
|
|
3897
|
+
"default-expanded"?: (HelixHeadlessDataTable["defaultExpanded"]) | undefined;
|
|
3898
|
+
/** The keys of the rows open at the start, separated by commas. Used until
|
|
3899
|
+
`expanded` is set. */
|
|
3900
|
+
defaultExpanded?: (HelixHeadlessDataTable["defaultExpanded"]) | undefined;
|
|
3620
3901
|
/** The starting search query, used until `filter` is set. */
|
|
3621
3902
|
"default-filter"?: (HelixHeadlessDataTable["defaultFilter"]) | undefined;
|
|
3622
3903
|
/** The starting search query, used until `filter` is set. */
|
|
@@ -3655,6 +3936,9 @@ replaces this with what each row came to as it draws. It still has to be
|
|
|
3655
3936
|
close, because it is what the scrollbar is built from before anything has
|
|
3656
3937
|
been measured. */
|
|
3657
3938
|
estimate?: (HelixHeadlessDataTable["estimate"]) | undefined;
|
|
3939
|
+
/** The keys of the open rows in a tree grid, separated by commas, the shape of
|
|
3940
|
+
`selected`. A reader's press writes it and then sends `helix-expand`. */
|
|
3941
|
+
expanded?: (HelixHeadlessDataTable["expanded"]) | undefined;
|
|
3658
3942
|
/** The search query. A row is shown when the query matches any of its columns.
|
|
3659
3943
|
|
|
3660
3944
|
One query rather than a predicate per column, which is what a reader means
|
|
@@ -3669,6 +3953,22 @@ replaced with the page it jumps to. */
|
|
|
3669
3953
|
gapLabel?: (HelixHeadlessDataTable["gapLabel"]) | undefined;
|
|
3670
3954
|
/** The grid's name, read by screen readers. */
|
|
3671
3955
|
label?: (HelixHeadlessDataTable["label"]) | undefined;
|
|
3956
|
+
/** Draws a row after the last one with a button that asks for more rows.
|
|
3957
|
+
|
|
3958
|
+
The button sends `helix-load-more`, and a `windowed` table sends it by
|
|
3959
|
+
itself once a reader scrolls within one screen of the end. Turn it off
|
|
3960
|
+
when there are no more rows to load. */
|
|
3961
|
+
"load-more"?: (HelixHeadlessDataTable["loadMore"]) | undefined;
|
|
3962
|
+
/** Draws a row after the last one with a button that asks for more rows.
|
|
3963
|
+
|
|
3964
|
+
The button sends `helix-load-more`, and a `windowed` table sends it by
|
|
3965
|
+
itself once a reader scrolls within one screen of the end. Turn it off
|
|
3966
|
+
when there are no more rows to load. */
|
|
3967
|
+
loadMore?: (HelixHeadlessDataTable["loadMore"]) | undefined;
|
|
3968
|
+
/** The words on the button in the `more` row. */
|
|
3969
|
+
"load-more-label"?: (HelixHeadlessDataTable["loadMoreLabel"]) | undefined;
|
|
3970
|
+
/** The words on the button in the `more` row. */
|
|
3971
|
+
loadMoreLabel?: (HelixHeadlessDataTable["loadMoreLabel"]) | undefined;
|
|
3672
3972
|
/** Where filtering, sorting, and paging happen. `client` does them in the
|
|
3673
3973
|
table, and `server` leaves them to your code.
|
|
3674
3974
|
|
|
@@ -3876,10 +4176,14 @@ holds and reordering it under them is a mutation they did not ask for. */
|
|
|
3876
4176
|
export type HelixHeadlessDataTableVueEvents = {
|
|
3877
4177
|
/** Fired after the page changes, with the new page as a string in `detail.value`. */
|
|
3878
4178
|
"helix-activate": HelixHeadlessDataTableHelixActivateElementEvent;
|
|
4179
|
+
/** Fired after a row opens or closes, with every open row's key, separated by commas, which `expanded` also holds. */
|
|
4180
|
+
"helix-expand": HelixHeadlessDataTableHelixExpandElementEvent;
|
|
3879
4181
|
/** The search query is about to change. Cancelable: cancel it to keep the current query. */
|
|
3880
4182
|
"helix-filter": HelixHeadlessDataTableHelixFilterElementEvent;
|
|
3881
4183
|
/** Fired after the search query changes, with the new query. */
|
|
3882
4184
|
"helix-filtered": HelixHeadlessDataTableHelixFilteredElementEvent;
|
|
4185
|
+
/** Fired when a reader asks for more rows, by the `load-more` row's button or by scrolling a `windowed` table near its end. */
|
|
4186
|
+
"helix-load-more": HelixHeadlessDataTableHelixLoadMoreElementEvent;
|
|
3883
4187
|
/** Another page was requested. Cancelable: cancel it to stay on the current page. */
|
|
3884
4188
|
"helix-navigate": HelixHeadlessDataTableHelixNavigateElementEvent;
|
|
3885
4189
|
/** The columns are about to move. The event carries every field in the new order. Cancelable: cancel it to keep the current order. */
|
|
@@ -4200,9 +4504,13 @@ as `+3`, does not say what it does. */
|
|
|
4200
4504
|
"max-tags"?: (HelixHeadlessDateInput["maxTags"] | `${number}`) | undefined;
|
|
4201
4505
|
/** How many tokens to show before the rest become a count. */
|
|
4202
4506
|
maxTags?: (HelixHeadlessDateInput["maxTags"]) | undefined;
|
|
4203
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
4507
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
4508
|
+
and to the `value` attribute where this one is not written, as a native
|
|
4509
|
+
control resets to the `value` it declares. */
|
|
4204
4510
|
"default-value"?: (HelixHeadlessDateInput["defaultValue"]) | undefined;
|
|
4205
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
4511
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
4512
|
+
and to the `value` attribute where this one is not written, as a native
|
|
4513
|
+
control resets to the `value` it declares. */
|
|
4206
4514
|
defaultValue?: (HelixHeadlessDateInput["defaultValue"]) | undefined;
|
|
4207
4515
|
/** The control's current value, which its form submits.
|
|
4208
4516
|
|
|
@@ -4513,9 +4821,13 @@ filled in as the year on show. */
|
|
|
4513
4821
|
/** The name of the heading where it shows a page of years, with `{heading}`
|
|
4514
4822
|
filled in as the year on show. */
|
|
4515
4823
|
yearViewLabel?: (HelixHeadlessDatePicker["yearViewLabel"]) | undefined;
|
|
4516
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
4824
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
4825
|
+
and to the `value` attribute where this one is not written, as a native
|
|
4826
|
+
control resets to the `value` it declares. */
|
|
4517
4827
|
"default-value"?: (HelixHeadlessDatePicker["defaultValue"]) | undefined;
|
|
4518
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
4828
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
4829
|
+
and to the `value` attribute where this one is not written, as a native
|
|
4830
|
+
control resets to the `value` it declares. */
|
|
4519
4831
|
defaultValue?: (HelixHeadlessDatePicker["defaultValue"]) | undefined;
|
|
4520
4832
|
/** The control's current value, which its form submits.
|
|
4521
4833
|
|
|
@@ -4621,6 +4933,9 @@ labels line up, and lining up is a fact about all of them.
|
|
|
4621
4933
|
a reflecting default writes an attribute onto markup the consumer rendered,
|
|
4622
4934
|
and React reports that as a hydration mismatch. */
|
|
4623
4935
|
direction?: (HelixHeadlessDescriptionList["direction"]) | undefined;
|
|
4936
|
+
/** The list's name, read by screen readers, such as "Server details". It
|
|
4937
|
+
makes the list a named group. */
|
|
4938
|
+
label?: (HelixHeadlessDescriptionList["label"]) | undefined;
|
|
4624
4939
|
};
|
|
4625
4940
|
|
|
4626
4941
|
export type HelixHeadlessDescriptionListVueEvents = {};
|
|
@@ -4785,6 +5100,22 @@ word is not. Reflected, it wrote a value onto every host a script had set
|
|
|
4785
5100
|
it on for nothing to read. `sweep` beside it is the converse and reflects,
|
|
4786
5101
|
because the styled sheet selects on it. */
|
|
4787
5102
|
hole?: (HelixHeadlessDonutChart["hole"]) | undefined;
|
|
5103
|
+
/** Writes each slice's share on the slice, the `slice-label` part, so a
|
|
5104
|
+
reader sees the parts without a legend or a pointer: "29%" in the middle
|
|
5105
|
+
of the band.
|
|
5106
|
+
|
|
5107
|
+
Absent writes none. A slice under a twentieth of the whole takes no
|
|
5108
|
+
label, there being no room on it for one. A screen reader hears every
|
|
5109
|
+
share in the summary, and the labels are hidden from it. */
|
|
5110
|
+
"slice-labels"?: (HelixHeadlessDonutChart["sliceLabels"]) | undefined;
|
|
5111
|
+
/** Writes each slice's share on the slice, the `slice-label` part, so a
|
|
5112
|
+
reader sees the parts without a legend or a pointer: "29%" in the middle
|
|
5113
|
+
of the band.
|
|
5114
|
+
|
|
5115
|
+
Absent writes none. A slice under a twentieth of the whole takes no
|
|
5116
|
+
label, there being no room on it for one. A screen reader hears every
|
|
5117
|
+
share in the summary, and the labels are hidden from it. */
|
|
5118
|
+
sliceLabels?: (HelixHeadlessDonutChart["sliceLabels"]) | undefined;
|
|
4788
5119
|
/** How much of the circle the whole occupies.
|
|
4789
5120
|
|
|
4790
5121
|
Absent is the full turn. `half` is a semi-donut: the same shares spread
|
|
@@ -4827,6 +5158,22 @@ percentages and its totals, such as `de` for `1.240` and `32 %`.
|
|
|
4827
5158
|
Absent uses the runtime's own. The table's cells are shown as the table
|
|
4828
5159
|
writes them, whatever this says. */
|
|
4829
5160
|
locale?: (HelixHeadlessDonutChart["locale"]) | undefined;
|
|
5161
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
5162
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
5163
|
+
`locale`.
|
|
5164
|
+
|
|
5165
|
+
Set it to the words of the page's language, such as `{position} von
|
|
5166
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
5167
|
+
legend hid is not counted. */
|
|
5168
|
+
"position-label"?: (HelixHeadlessDonutChart["positionLabel"]) | undefined;
|
|
5169
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
5170
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
5171
|
+
`locale`.
|
|
5172
|
+
|
|
5173
|
+
Set it to the words of the page's language, such as `{position} von
|
|
5174
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
5175
|
+
legend hid is not counted. */
|
|
5176
|
+
positionLabel?: (HelixHeadlessDonutChart["positionLabel"]) | undefined;
|
|
4830
5177
|
};
|
|
4831
5178
|
|
|
4832
5179
|
export type HelixHeadlessDonutChartVueEvents = {};
|
|
@@ -4869,6 +5216,17 @@ the property this component exists to keep.
|
|
|
4869
5216
|
Absent by default, which is the platform's `auto` and this library's rule
|
|
4870
5217
|
that a resting value is an attribute's absence. */
|
|
4871
5218
|
closedBy?: (HelixHeadlessDrawer["closedBy"]) | undefined;
|
|
5219
|
+
/** Draws a control that closes the drawer, in the corner where the title is.
|
|
5220
|
+
|
|
5221
|
+
Pressing it is `close()`, so it sends `helix-before-close` like every other
|
|
5222
|
+
way out. */
|
|
5223
|
+
dismissible?: (HelixHeadlessDrawer["dismissible"]) | undefined;
|
|
5224
|
+
/** The close control's accessible name. Translate it with the rest of your
|
|
5225
|
+
interface. */
|
|
5226
|
+
"dismiss-label"?: (HelixHeadlessDrawer["dismissLabel"]) | undefined;
|
|
5227
|
+
/** The close control's accessible name. Translate it with the rest of your
|
|
5228
|
+
interface. */
|
|
5229
|
+
dismissLabel?: (HelixHeadlessDrawer["dismissLabel"]) | undefined;
|
|
4872
5230
|
/** Accessible name for the panel. When it is empty, the heading in the
|
|
4873
5231
|
`header` slot names the panel. */
|
|
4874
5232
|
label?: (HelixHeadlessDrawer["label"]) | undefined;
|
|
@@ -4980,14 +5338,6 @@ elements, and writing `tabindex` onto a host the consumer rendered is a
|
|
|
4980
5338
|
change a React consumer's hydration reports and does not patch up. The stop
|
|
4981
5339
|
lands inside this shadow root instead. */
|
|
4982
5340
|
focusable?: (HelixHeadlessDrilldownItem["focusable"]) | undefined;
|
|
4983
|
-
/** Whether the page showing is the one this row is on.
|
|
4984
|
-
|
|
4985
|
-
Written by the stack. */
|
|
4986
|
-
onPage?: (HelixHeadlessDrilldownItem["onPage"]) | undefined;
|
|
4987
|
-
/** Whether this row's own page is the one showing.
|
|
4988
|
-
|
|
4989
|
-
Written by the stack. */
|
|
4990
|
-
showingPage?: (HelixHeadlessDrilldownItem["showingPage"]) | undefined;
|
|
4991
5341
|
};
|
|
4992
5342
|
|
|
4993
5343
|
export type HelixHeadlessDrilldownItemVueEvents = {
|
|
@@ -5071,6 +5421,12 @@ export type HelixHeadlessFileInputVueProps = {
|
|
|
5071
5421
|
A dropped file the list does not name is left out, because the picker's
|
|
5072
5422
|
filter is the only check the platform makes and a drop never meets it. */
|
|
5073
5423
|
accept?: (HelixHeadlessFileInput["accept"]) | undefined;
|
|
5424
|
+
/** What a reader hears when a drop or a paste adds files, with `{names}` and
|
|
5425
|
+
`{count}` filled in. */
|
|
5426
|
+
"added-text"?: (HelixHeadlessFileInput["addedText"]) | undefined;
|
|
5427
|
+
/** What a reader hears when a drop or a paste adds files, with `{names}` and
|
|
5428
|
+
`{count}` filled in. */
|
|
5429
|
+
addedText?: (HelixHeadlessFileInput["addedText"]) | undefined;
|
|
5074
5430
|
/** Which camera or microphone a mobile picker should offer, if any. */
|
|
5075
5431
|
capture?: (HelixHeadlessFileInput["capture"]) | undefined;
|
|
5076
5432
|
/** Whether the picker chooses a folder, and the field takes every file in
|
|
@@ -5098,6 +5454,10 @@ filled in. */
|
|
|
5098
5454
|
/** What a reader hears when files are refused, with `{count}` and `{names}`
|
|
5099
5455
|
filled in. */
|
|
5100
5456
|
rejectedText?: (HelixHeadlessFileInput["rejectedText"]) | undefined;
|
|
5457
|
+
/** What a reader hears when a file is removed, with `{name}` filled in. */
|
|
5458
|
+
"removed-text"?: (HelixHeadlessFileInput["removedText"]) | undefined;
|
|
5459
|
+
/** What a reader hears when a file is removed, with `{name}` filled in. */
|
|
5460
|
+
removedText?: (HelixHeadlessFileInput["removedText"]) | undefined;
|
|
5101
5461
|
/** The accessible name of the control that removes a file. `{name}` is
|
|
5102
5462
|
replaced with the file's name.
|
|
5103
5463
|
|
|
@@ -5172,6 +5532,15 @@ imperatively later, and nothing is hydrating by then.
|
|
|
5172
5532
|
|
|
5173
5533
|
Here rather than on each control. */
|
|
5174
5534
|
name?: (HelixHeadlessFileInput["name"]) | undefined;
|
|
5535
|
+
/** Draws a file's row in place of its name, size, and type: a Lit template, a
|
|
5536
|
+
string, or a DOM node, given the file and its place in the list. The
|
|
5537
|
+
remove button stays beside it. */
|
|
5538
|
+
renderFile?: (HelixHeadlessFileInput["renderFile"]) | undefined;
|
|
5539
|
+
/** Your own step between taking files and holding them, such as shrinking an
|
|
5540
|
+
image, as Zag's file upload `transformFiles`. It is given the files taken
|
|
5541
|
+
from one pick, drop, or paste and returns the files to hold, or a promise
|
|
5542
|
+
of them. A promise that rejects refuses those files, with its message. */
|
|
5543
|
+
transformFiles?: (HelixHeadlessFileInput["transformFiles"]) | undefined;
|
|
5175
5544
|
/** Your own check on each arriving file, which returns why it is refused, or
|
|
5176
5545
|
nothing to take it. A property, since a function cannot be an attribute. */
|
|
5177
5546
|
validate?: (HelixHeadlessFileInput["validate"]) | undefined;
|
|
@@ -5450,9 +5819,13 @@ as `+3`, does not say what it does. */
|
|
|
5450
5819
|
"max-tags"?: (HelixHeadlessFilterInput["maxTags"] | `${number}`) | undefined;
|
|
5451
5820
|
/** How many tokens to show before the rest become a count. */
|
|
5452
5821
|
maxTags?: (HelixHeadlessFilterInput["maxTags"]) | undefined;
|
|
5453
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
5822
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
5823
|
+
and to the `value` attribute where this one is not written, as a native
|
|
5824
|
+
control resets to the `value` it declares. */
|
|
5454
5825
|
"default-value"?: (HelixHeadlessFilterInput["defaultValue"]) | undefined;
|
|
5455
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
5826
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
5827
|
+
and to the `value` attribute where this one is not written, as a native
|
|
5828
|
+
control resets to the `value` it declares. */
|
|
5456
5829
|
defaultValue?: (HelixHeadlessFilterInput["defaultValue"]) | undefined;
|
|
5457
5830
|
/** The control's current value, which its form submits.
|
|
5458
5831
|
|
|
@@ -5947,6 +6320,10 @@ export type HelixHeadlessHeatmapHelixResizeElementEvent =
|
|
|
5947
6320
|
HelixHeadlessHeatmapElementEvent<HelixResizeEvent>;
|
|
5948
6321
|
|
|
5949
6322
|
export type HelixHeadlessHeatmapVueProps = {
|
|
6323
|
+
/** The word the `overview` puts before the busiest reading. */
|
|
6324
|
+
"busiest-label"?: (HelixHeadlessHeatmap["busiestLabel"]) | undefined;
|
|
6325
|
+
/** The word the `overview` puts before the busiest reading. */
|
|
6326
|
+
busiestLabel?: (HelixHeadlessHeatmap["busiestLabel"]) | undefined;
|
|
5950
6327
|
/** Shown when the table has no readings in it.
|
|
5951
6328
|
|
|
5952
6329
|
Never shown while the table cannot be read at all, which is a server render
|
|
@@ -6022,6 +6399,10 @@ compare two hues at all. `tones="surface info accent success primary"` for a
|
|
|
6022
6399
|
commit count is five unrelated hues for five amounts, which is confetti with
|
|
6023
6400
|
no order in it. */
|
|
6024
6401
|
tones?: (HelixHeadlessHeatmap["tones"]) | undefined;
|
|
6402
|
+
/** The word the `overview` puts before the total of the readings drawn. */
|
|
6403
|
+
"total-label"?: (HelixHeadlessHeatmap["totalLabel"]) | undefined;
|
|
6404
|
+
/** The word the `overview` puts before the total of the readings drawn. */
|
|
6405
|
+
totalLabel?: (HelixHeadlessHeatmap["totalLabel"]) | undefined;
|
|
6025
6406
|
/** The id of the table to read.
|
|
6026
6407
|
|
|
6027
6408
|
Names a table in the same tree, so a chart inside another component's
|
|
@@ -6042,6 +6423,22 @@ percentages and its totals, such as `de` for `1.240` and `32 %`.
|
|
|
6042
6423
|
Absent uses the runtime's own. The table's cells are shown as the table
|
|
6043
6424
|
writes them, whatever this says. */
|
|
6044
6425
|
locale?: (HelixHeadlessHeatmap["locale"]) | undefined;
|
|
6426
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
6427
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
6428
|
+
`locale`.
|
|
6429
|
+
|
|
6430
|
+
Set it to the words of the page's language, such as `{position} von
|
|
6431
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
6432
|
+
legend hid is not counted. */
|
|
6433
|
+
"position-label"?: (HelixHeadlessHeatmap["positionLabel"]) | undefined;
|
|
6434
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
6435
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
6436
|
+
`locale`.
|
|
6437
|
+
|
|
6438
|
+
Set it to the words of the page's language, such as `{position} von
|
|
6439
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
6440
|
+
legend hid is not counted. */
|
|
6441
|
+
positionLabel?: (HelixHeadlessHeatmap["positionLabel"]) | undefined;
|
|
6045
6442
|
};
|
|
6046
6443
|
|
|
6047
6444
|
export type HelixHeadlessHeatmapVueEvents = {
|
|
@@ -6049,6 +6446,15 @@ export type HelixHeadlessHeatmapVueEvents = {
|
|
|
6049
6446
|
"helix-resize": HelixHeadlessHeatmapHelixResizeElementEvent;
|
|
6050
6447
|
};
|
|
6051
6448
|
|
|
6449
|
+
/** `HelixHeadlessIconButton` component event */
|
|
6450
|
+
export type HelixHeadlessIconButtonElementEvent<E = Event> = TypedEvent<
|
|
6451
|
+
HelixHeadlessIconButton,
|
|
6452
|
+
E
|
|
6453
|
+
>;
|
|
6454
|
+
/** `helix-press` event type */
|
|
6455
|
+
export type HelixHeadlessIconButtonHelixPressElementEvent =
|
|
6456
|
+
HelixHeadlessIconButtonElementEvent<HelixPressEvent>;
|
|
6457
|
+
|
|
6052
6458
|
export type HelixHeadlessIconButtonVueProps = {
|
|
6053
6459
|
/** What to send when the button is activated, and what to send it to.
|
|
6054
6460
|
|
|
@@ -6236,7 +6642,10 @@ invoker without an id in the same tree needs. */
|
|
|
6236
6642
|
commandForElement?: (HelixHeadlessIconButton["commandForElement"]) | undefined;
|
|
6237
6643
|
};
|
|
6238
6644
|
|
|
6239
|
-
export type HelixHeadlessIconButtonVueEvents = {
|
|
6645
|
+
export type HelixHeadlessIconButtonVueEvents = {
|
|
6646
|
+
/** Fired when a press acts, with `detail.pointerType` saying what pressed the button. */
|
|
6647
|
+
"helix-press": HelixHeadlessIconButtonHelixPressElementEvent;
|
|
6648
|
+
};
|
|
6240
6649
|
|
|
6241
6650
|
/** `HelixHeadlessIcon` component event */
|
|
6242
6651
|
export type HelixHeadlessIconElementEvent<E = Event> = TypedEvent<
|
|
@@ -6399,6 +6808,9 @@ export type HelixHeadlessInputElementEvent<E = Event> = TypedEvent<
|
|
|
6399
6808
|
/** `helix-before-change` event type */
|
|
6400
6809
|
export type HelixHeadlessInputHelixBeforeChangeElementEvent =
|
|
6401
6810
|
HelixHeadlessInputElementEvent<HelixBeforeChangeEvent>;
|
|
6811
|
+
/** `helix-clear` event type */
|
|
6812
|
+
export type HelixHeadlessInputHelixClearElementEvent =
|
|
6813
|
+
HelixHeadlessInputElementEvent<HelixClearEvent>;
|
|
6402
6814
|
|
|
6403
6815
|
export type HelixHeadlessInputVueProps = {
|
|
6404
6816
|
/** Whether a phone capitalizes as the reader types: `off`, `sentences`,
|
|
@@ -6511,9 +6923,13 @@ Nothing reads it from the attribute either. The real `<input>` inside takes
|
|
|
6511
6923
|
it as a property binding, which is what makes the keyboard and the
|
|
6512
6924
|
validation follow. */
|
|
6513
6925
|
type?: (HelixHeadlessInput["type"]) | undefined;
|
|
6514
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
6926
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
6927
|
+
and to the `value` attribute where this one is not written, as a native
|
|
6928
|
+
control resets to the `value` it declares. */
|
|
6515
6929
|
"default-value"?: (HelixHeadlessInput["defaultValue"]) | undefined;
|
|
6516
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
6930
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
6931
|
+
and to the `value` attribute where this one is not written, as a native
|
|
6932
|
+
control resets to the `value` it declares. */
|
|
6517
6933
|
defaultValue?: (HelixHeadlessInput["defaultValue"]) | undefined;
|
|
6518
6934
|
/** The control's current value, which its form submits.
|
|
6519
6935
|
|
|
@@ -6594,6 +7010,10 @@ be anyway. */
|
|
|
6594
7010
|
selectionEnd?: (HelixHeadlessInput["selectionEnd"]) | undefined;
|
|
6595
7011
|
/** Where the selection starts, as an offset into the value. */
|
|
6596
7012
|
selectionStart?: (HelixHeadlessInput["selectionStart"]) | undefined;
|
|
7013
|
+
/** Your own rule for the value, run on every change once the browser finds
|
|
7014
|
+
nothing wrong. Return a message, or a list of them, to mark the field
|
|
7015
|
+
invalid, and `true`, `null`, or nothing to accept the value. */
|
|
7016
|
+
validate?: (HelixHeadlessInput["validate"]) | undefined;
|
|
6597
7017
|
};
|
|
6598
7018
|
|
|
6599
7019
|
export type HelixHeadlessInputVueEvents = {
|
|
@@ -6602,7 +7022,7 @@ export type HelixHeadlessInputVueEvents = {
|
|
|
6602
7022
|
/** The text is about to change. Cancelable: cancel it to keep the current text. */
|
|
6603
7023
|
"helix-before-change": HelixHeadlessInputHelixBeforeChangeElementEvent;
|
|
6604
7024
|
/** Fired after the clear button has emptied the field, after `input` and `change`. */
|
|
6605
|
-
"helix-clear":
|
|
7025
|
+
"helix-clear": HelixHeadlessInputHelixClearElementEvent;
|
|
6606
7026
|
/** Fired as the value changes. */
|
|
6607
7027
|
input: HelixHeadlessInputElementEvent;
|
|
6608
7028
|
};
|
|
@@ -6617,6 +7037,13 @@ export type HelixHeadlessKbdHelixShortcutElementEvent =
|
|
|
6617
7037
|
HelixHeadlessKbdElementEvent<HelixShortcutEvent>;
|
|
6618
7038
|
|
|
6619
7039
|
export type HelixHeadlessKbdVueProps = {
|
|
7040
|
+
/** Draws a chord under `keys` as one key per key, each a `key` part with a
|
|
7041
|
+
`separator` part between two where the platform writes a `+`, as GitHub
|
|
7042
|
+
and most docs draw `Ctrl` `K`.
|
|
7043
|
+
|
|
7044
|
+
Absent, a chord is one key holding the whole label, as it always was.
|
|
7045
|
+
Reflected, because the styled tier draws the caps on the keys under it. */
|
|
7046
|
+
caps?: (HelixHeadlessKbd["caps"]) | undefined;
|
|
6620
7047
|
/** The id of the control the shortcut works, which is given the chord as its
|
|
6621
7048
|
`aria-keyshortcuts`.
|
|
6622
7049
|
|
|
@@ -6624,6 +7051,26 @@ Names an element in the same tree, the way `Tooltip.for` does. Separate
|
|
|
6624
7051
|
from `within`, which says where the key listens: a key can describe a
|
|
6625
7052
|
shortcut the page binds itself. */
|
|
6626
7053
|
for?: (HelixHeadlessKbd["for"]) | undefined;
|
|
7054
|
+
/** Names for keys in place of the platform's own, by the key's name in
|
|
7055
|
+
`keys`, written as JSON in the attribute: `key-labels='{"mod":"Command",
|
|
7056
|
+
"enter":"Return"}'` shows `Command` and `Return` wherever `mod` and
|
|
7057
|
+
`enter` are written.
|
|
7058
|
+
|
|
7059
|
+
For a page in another language, or a product with its own word for a key.
|
|
7060
|
+
Absent, the platform's glyphs and words are used. Only what is shown
|
|
7061
|
+
changes: the chord written onto `aria-keyshortcuts` keeps the names a
|
|
7062
|
+
screen reader knows. */
|
|
7063
|
+
"key-labels"?: (HelixHeadlessKbd["keyLabels"]) | undefined;
|
|
7064
|
+
/** Names for keys in place of the platform's own, by the key's name in
|
|
7065
|
+
`keys`, written as JSON in the attribute: `key-labels='{"mod":"Command",
|
|
7066
|
+
"enter":"Return"}'` shows `Command` and `Return` wherever `mod` and
|
|
7067
|
+
`enter` are written.
|
|
7068
|
+
|
|
7069
|
+
For a page in another language, or a product with its own word for a key.
|
|
7070
|
+
Absent, the platform's glyphs and words are used. Only what is shown
|
|
7071
|
+
changes: the chord written onto `aria-keyshortcuts` keeps the names a
|
|
7072
|
+
screen reader knows. */
|
|
7073
|
+
keyLabels?: (HelixHeadlessKbd["keyLabels"]) | undefined;
|
|
6627
7074
|
/** The key or chord to show, such as `mod+k`, `?`, or `/`.
|
|
6628
7075
|
|
|
6629
7076
|
`mod` is the platform's own command modifier, which is the reason to write
|
|
@@ -6767,6 +7214,11 @@ Off by default, for a viewer whose chrome you compose in the `header` and
|
|
|
6767
7214
|
reader is idle, and the previous and next ones say they are unavailable at
|
|
6768
7215
|
either end of a set that does not `loop`. */
|
|
6769
7216
|
controls?: (HelixHeadlessLightbox["controls"]) | undefined;
|
|
7217
|
+
/** Draws the place of the shown item in the set over the picture, in the
|
|
7218
|
+
words of `status-label`, such as "2 of 5". It hides with the controls while
|
|
7219
|
+
the reader is idle. Screen readers hear the place from the live region, so
|
|
7220
|
+
the drawn copy is hidden from them. */
|
|
7221
|
+
counter?: (HelixHeadlessLightbox["counter"]) | undefined;
|
|
6770
7222
|
/** The close control's accessible name. Translate it with the rest of your
|
|
6771
7223
|
interface. */
|
|
6772
7224
|
"dismiss-label"?: (HelixHeadlessLightbox["dismissLabel"]) | undefined;
|
|
@@ -6791,6 +7243,12 @@ keep the chrome up is the consumer's to decide with this. */
|
|
|
6791
7243
|
label?: (HelixHeadlessLightbox["label"]) | undefined;
|
|
6792
7244
|
/** Whether moving past the last item returns to the first. */
|
|
6793
7245
|
loop?: (HelixHeadlessLightbox["loop"]) | undefined;
|
|
7246
|
+
/** How far a reader can zoom into the shown item, as a scale, such as `3`.
|
|
7247
|
+
`1`, the default, turns zooming off. */
|
|
7248
|
+
"max-zoom"?: (HelixHeadlessLightbox["maxZoom"] | `${number}`) | undefined;
|
|
7249
|
+
/** How far a reader can zoom into the shown item, as a scale, such as `3`.
|
|
7250
|
+
`1`, the default, turns zooming off. */
|
|
7251
|
+
maxZoom?: (HelixHeadlessLightbox["maxZoom"]) | undefined;
|
|
6794
7252
|
/** The next control's accessible name. */
|
|
6795
7253
|
"next-label"?: (HelixHeadlessLightbox["nextLabel"]) | undefined;
|
|
6796
7254
|
/** The next control's accessible name. */
|
|
@@ -6933,6 +7391,13 @@ the attribute being absent, which is the one thing a reader cannot debug.
|
|
|
6933
7391
|
Furniture rather than data, so the rules are inside the `aria-hidden` plot
|
|
6934
7392
|
and reach no reader through the table. */
|
|
6935
7393
|
gridlines?: (HelixHeadlessLineChart["gridlines"]) | undefined;
|
|
7394
|
+
/** Draws a mark on every reading, the `marker` part, so a reader sees where
|
|
7395
|
+
the readings are, as well as the line between them.
|
|
7396
|
+
|
|
7397
|
+
Absent draws none, except on a reading with a blank on either side: it
|
|
7398
|
+
has no line to be part of, so it takes a mark, the `marker` part with
|
|
7399
|
+
`marker-lone` beside it, or it would not be drawn at all. */
|
|
7400
|
+
markers?: (HelixHeadlessLineChart["markers"]) | undefined;
|
|
6936
7401
|
/** The shape of the mark on each series' last reading.
|
|
6937
7402
|
|
|
6938
7403
|
Absent is a dot, and absent rather than defaulted because a reflecting
|
|
@@ -6992,11 +7457,47 @@ percentages and its totals, such as `de` for `1.240` and `32 %`.
|
|
|
6992
7457
|
Absent uses the runtime's own. The table's cells are shown as the table
|
|
6993
7458
|
writes them, whatever this says. */
|
|
6994
7459
|
locale?: (HelixHeadlessLineChart["locale"]) | undefined;
|
|
7460
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
7461
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
7462
|
+
`locale`.
|
|
7463
|
+
|
|
7464
|
+
Set it to the words of the page's language, such as `{position} von
|
|
7465
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
7466
|
+
legend hid is not counted. */
|
|
7467
|
+
"position-label"?: (HelixHeadlessLineChart["positionLabel"]) | undefined;
|
|
7468
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
7469
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
7470
|
+
`locale`.
|
|
7471
|
+
|
|
7472
|
+
Set it to the words of the page's language, such as `{position} von
|
|
7473
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
7474
|
+
legend hid is not counted. */
|
|
7475
|
+
positionLabel?: (HelixHeadlessLineChart["positionLabel"]) | undefined;
|
|
6995
7476
|
};
|
|
6996
7477
|
|
|
6997
7478
|
export type HelixHeadlessLineChartVueEvents = {};
|
|
6998
7479
|
|
|
7480
|
+
/** `HelixHeadlessListItem` component event */
|
|
7481
|
+
export type HelixHeadlessListItemElementEvent<E = Event> = TypedEvent<
|
|
7482
|
+
HelixHeadlessListItem,
|
|
7483
|
+
E
|
|
7484
|
+
>;
|
|
7485
|
+
/** `helix-action` event type */
|
|
7486
|
+
export type HelixHeadlessListItemHelixActionElementEvent =
|
|
7487
|
+
HelixHeadlessListItemElementEvent<HelixActionEvent>;
|
|
7488
|
+
|
|
6999
7489
|
export type HelixHeadlessListItemVueProps = {
|
|
7490
|
+
/** Marks the row a reader is on: `page` for the page they are reading, `step`,
|
|
7491
|
+
`location`, `date` or `time` for those, and written bare for the current
|
|
7492
|
+
one of a set. It is `aria-current` on the row's link, or on the row where
|
|
7493
|
+
it has none.
|
|
7494
|
+
|
|
7495
|
+
Not reflected, as a state never is. `row-current` is the part a
|
|
7496
|
+
stylesheet draws it from. */
|
|
7497
|
+
current?: (HelixHeadlessListItem["current"]) | undefined;
|
|
7498
|
+
/** Takes the row out of reach in a list with `selection-mode`: the arrow keys
|
|
7499
|
+
pass over it and it cannot be selected or acted on. */
|
|
7500
|
+
disabled?: (HelixHeadlessListItem["disabled"]) | undefined;
|
|
7000
7501
|
/** The URL the row links to. Leave it empty for a row that is not a link.
|
|
7001
7502
|
|
|
7002
7503
|
Empty rather than optional, and unset by default: a list is not always a
|
|
@@ -7008,9 +7509,39 @@ to the current page on every row a consumer never asked to be one. */
|
|
|
7008
7509
|
rel?: (HelixHeadlessListItem["rel"]) | undefined;
|
|
7009
7510
|
/** Where the link opens. Use it for a row that leaves the site. */
|
|
7010
7511
|
target?: (HelixHeadlessListItem["target"]) | undefined;
|
|
7512
|
+
/** What the row stands for in its list's `value`.
|
|
7513
|
+
|
|
7514
|
+
Absent is the row's own words. */
|
|
7515
|
+
value?: (HelixHeadlessListItem["value"]) | undefined;
|
|
7516
|
+
/** Whether the row holds its list's tab stop.
|
|
7517
|
+
|
|
7518
|
+
Written by a list with `selection-mode` on every row it holds, and unset
|
|
7519
|
+
otherwise, which is how a row knows it is a row of a grid. No attribute:
|
|
7520
|
+
it is coordination between elements, as `Tag.focusable` is. */
|
|
7521
|
+
focusable?: (HelixHeadlessListItem["focusable"]) | undefined;
|
|
7522
|
+
/** Whether the row is selected, in a list that selects.
|
|
7523
|
+
|
|
7524
|
+
Written by the list from its own `value`, and unset where nothing can be
|
|
7525
|
+
selected, which keeps `aria-selected` off a list that does not select. */
|
|
7526
|
+
selected?: (HelixHeadlessListItem["selected"]) | undefined;
|
|
7527
|
+
};
|
|
7528
|
+
|
|
7529
|
+
export type HelixHeadlessListItemVueEvents = {
|
|
7530
|
+
/** The reader pressed Enter on the row, or pressed the row in a list that selects nothing, in a list with `selection-mode`. Read the row from `target`. A row with `href` follows its link instead. */
|
|
7531
|
+
"helix-action": HelixHeadlessListItemHelixActionElementEvent;
|
|
7011
7532
|
};
|
|
7012
7533
|
|
|
7013
|
-
|
|
7534
|
+
/** `HelixHeadlessList` component event */
|
|
7535
|
+
export type HelixHeadlessListElementEvent<E = Event> = TypedEvent<
|
|
7536
|
+
HelixHeadlessList,
|
|
7537
|
+
E
|
|
7538
|
+
>;
|
|
7539
|
+
/** `helix-action` event type */
|
|
7540
|
+
export type HelixHeadlessListHelixActionElementEvent =
|
|
7541
|
+
HelixHeadlessListElementEvent<HelixActionEvent>;
|
|
7542
|
+
/** `helix-before-change` event type */
|
|
7543
|
+
export type HelixHeadlessListHelixBeforeChangeElementEvent =
|
|
7544
|
+
HelixHeadlessListElementEvent<HelixBeforeChangeEvent>;
|
|
7014
7545
|
|
|
7015
7546
|
export type HelixHeadlessListVueProps = {
|
|
7016
7547
|
/** The kind of list, which follows from the content.
|
|
@@ -7036,6 +7567,28 @@ has to survive with the stylesheet turned off.
|
|
|
7036
7567
|
kind?: (HelixHeadlessList["kind"]) | undefined;
|
|
7037
7568
|
/** The list's name, read by screen readers. */
|
|
7038
7569
|
label?: (HelixHeadlessList["label"]) | undefined;
|
|
7570
|
+
/** Numbers an ordered list downward, so the count falls row by row and ends at
|
|
7571
|
+
its last row, as `<ol reversed>` does. */
|
|
7572
|
+
reversed?: (HelixHeadlessList["reversed"]) | undefined;
|
|
7573
|
+
/** What a press does to the rows already selected, in a list that selects:
|
|
7574
|
+
`toggle` adds or takes out the row, and `replace` selects it alone and
|
|
7575
|
+
lets the arrow keys carry the selection. */
|
|
7576
|
+
"selection-behavior"?: (HelixHeadlessList["selectionBehavior"]) | undefined;
|
|
7577
|
+
/** What a press does to the rows already selected, in a list that selects:
|
|
7578
|
+
`toggle` adds or takes out the row, and `replace` selects it alone and
|
|
7579
|
+
lets the arrow keys carry the selection. */
|
|
7580
|
+
selectionBehavior?: (HelixHeadlessList["selectionBehavior"]) | undefined;
|
|
7581
|
+
/** Makes the list interactive: `single` selects one row, `multiple` any
|
|
7582
|
+
number, and `none` moves and acts without selecting. Unset is a list a
|
|
7583
|
+
reader reads, with no tab stop of its own. */
|
|
7584
|
+
"selection-mode"?: (HelixHeadlessList["selectionMode"]) | undefined;
|
|
7585
|
+
/** Makes the list interactive: `single` selects one row, `multiple` any
|
|
7586
|
+
number, and `none` moves and acts without selecting. Unset is a list a
|
|
7587
|
+
reader reads, with no tab stop of its own. */
|
|
7588
|
+
selectionMode?: (HelixHeadlessList["selectionMode"]) | undefined;
|
|
7589
|
+
/** The number of an ordered list's first row, as `<ol start>` is. Unset counts
|
|
7590
|
+
from one, or down from the number of rows where `reversed`. */
|
|
7591
|
+
start?: (HelixHeadlessList["start"]) | undefined;
|
|
7039
7592
|
/** The markers an ordered list draws. It takes the five values of `<ol type>`.
|
|
7040
7593
|
|
|
7041
7594
|
Reflected, because this is one of the things a stylesheet selects on, each
|
|
@@ -7043,18 +7596,24 @@ value mapping to a `list-style-type`. The platform's spellings rather than
|
|
|
7043
7596
|
the CSS ones, so `<helix-headless-list kind="ordered" type="i">` is what a
|
|
7044
7597
|
consumer would have written on an `<ol>`.
|
|
7045
7598
|
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
`list-item` counter, and that counter is not author-resettable. Measured in
|
|
7049
|
-
Chrome 148, `counter-reset: list-item 4` moves nothing on a `<div>`, on a
|
|
7050
|
-
`<ul>`, or even on a real `<ol>`, while `<ol start="5">` does and a *named*
|
|
7051
|
-
counter with explicit `::before` content does. So the markers would have to
|
|
7052
|
-
be rebuilt out of generated content to gain a start, which is a different
|
|
7053
|
-
component. `type` is only `list-style-type` and works. */
|
|
7599
|
+
`type` is only `list-style-type`. `start` and `reversed` move the count
|
|
7600
|
+
itself. */
|
|
7054
7601
|
type?: (HelixHeadlessList["type"]) | undefined;
|
|
7602
|
+
/** The selected rows' values, separated by commas, in a list that selects.
|
|
7603
|
+
|
|
7604
|
+
Set it to start with rows selected. A row's value is its `value`, or its
|
|
7605
|
+
words where it has none. */
|
|
7606
|
+
value?: (HelixHeadlessList["value"]) | undefined;
|
|
7055
7607
|
};
|
|
7056
7608
|
|
|
7057
|
-
export type HelixHeadlessListVueEvents = {
|
|
7609
|
+
export type HelixHeadlessListVueEvents = {
|
|
7610
|
+
/** Fired once a press has changed which rows are selected. */
|
|
7611
|
+
change: HelixHeadlessListElementEvent;
|
|
7612
|
+
/** Sent from a row when the reader acts on it: Enter, or a press in a list that selects nothing. Read the row from `target`. A row with `href` follows its link instead. */
|
|
7613
|
+
"helix-action": HelixHeadlessListHelixActionElementEvent;
|
|
7614
|
+
/** Fired before a press changes which rows are selected, with the `value` it would leave. Cancelable. */
|
|
7615
|
+
"helix-before-change": HelixHeadlessListHelixBeforeChangeElementEvent;
|
|
7616
|
+
};
|
|
7058
7617
|
|
|
7059
7618
|
/** `HelixHeadlessListbox` component event */
|
|
7060
7619
|
export type HelixHeadlessListboxElementEvent<E = Event> = TypedEvent<
|
|
@@ -7067,6 +7626,9 @@ export type HelixHeadlessListboxHelixBeforeChangeElementEvent =
|
|
|
7067
7626
|
/** `helix-filter` event type */
|
|
7068
7627
|
export type HelixHeadlessListboxHelixFilterElementEvent =
|
|
7069
7628
|
HelixHeadlessListboxElementEvent<HelixFilterEvent>;
|
|
7629
|
+
/** `helix-load-more` event type */
|
|
7630
|
+
export type HelixHeadlessListboxHelixLoadMoreElementEvent =
|
|
7631
|
+
HelixHeadlessListboxElementEvent<HelixLoadMoreEvent>;
|
|
7070
7632
|
|
|
7071
7633
|
export type HelixHeadlessListboxVueProps = {
|
|
7072
7634
|
/** What the browser may autofill in the text field, as a platform token.
|
|
@@ -7128,6 +7690,18 @@ act on the list the reader expects. */
|
|
|
7128
7690
|
"filter-label"?: (HelixHeadlessListbox["filterLabel"]) | undefined;
|
|
7129
7691
|
/** Placeholder text for the filter field. */
|
|
7130
7692
|
filterLabel?: (HelixHeadlessListbox["filterLabel"]) | undefined;
|
|
7693
|
+
/** 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.
|
|
7695
|
+
|
|
7696
|
+
Set, it shows under any options there are, in place of `empty-text` and
|
|
7697
|
+
`loading-text`, and a screen reader hears it. Clear it when you ask again. */
|
|
7698
|
+
"load-error"?: (HelixHeadlessListbox["loadError"]) | undefined;
|
|
7699
|
+
/** 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.
|
|
7701
|
+
|
|
7702
|
+
Set, it shows under any options there are, in place of `empty-text` and
|
|
7703
|
+
`loading-text`, and a screen reader hears it. Clear it when you ask again. */
|
|
7704
|
+
loadError?: (HelixHeadlessListbox["loadError"]) | undefined;
|
|
7131
7705
|
/** Stops the arrow keys from choosing each option they move to. Enter, Space
|
|
7132
7706
|
or a click chooses the highlighted option.
|
|
7133
7707
|
|
|
@@ -7137,6 +7711,16 @@ a reader can move through the options before closing the panel on one. */
|
|
|
7137
7711
|
manual?: (HelixHeadlessListbox["manual"]) | undefined;
|
|
7138
7712
|
/** Whether more than one option can be chosen. */
|
|
7139
7713
|
multiple?: (HelixHeadlessListbox["multiple"]) | undefined;
|
|
7714
|
+
/** The text shown when a filter hides every option of a list that has some.
|
|
7715
|
+
|
|
7716
|
+
Absent, the list says `empty-text` in both cases. Set it to tell "nothing
|
|
7717
|
+
matches what you typed" from "there is nothing here". */
|
|
7718
|
+
"no-results-text"?: (HelixHeadlessListbox["noResultsText"]) | undefined;
|
|
7719
|
+
/** The text shown when a filter hides every option of a list that has some.
|
|
7720
|
+
|
|
7721
|
+
Absent, the list says `empty-text` in both cases. Set it to tell "nothing
|
|
7722
|
+
matches what you typed" from "there is nothing here". */
|
|
7723
|
+
noResultsText?: (HelixHeadlessListbox["noResultsText"]) | undefined;
|
|
7140
7724
|
/** What a screen reader hears when a filter leaves one option. `{count}` is
|
|
7141
7725
|
the count. */
|
|
7142
7726
|
"result-label"?: (HelixHeadlessListbox["resultLabel"]) | undefined;
|
|
@@ -7167,9 +7751,13 @@ say that without the component knowing what a row looks like. */
|
|
|
7167
7751
|
"loading-text"?: (HelixHeadlessListbox["loadingText"]) | undefined;
|
|
7168
7752
|
/** The text shown and announced while the rows load. */
|
|
7169
7753
|
loadingText?: (HelixHeadlessListbox["loadingText"]) | undefined;
|
|
7170
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
7754
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
7755
|
+
and to the `value` attribute where this one is not written, as a native
|
|
7756
|
+
control resets to the `value` it declares. */
|
|
7171
7757
|
"default-value"?: (HelixHeadlessListbox["defaultValue"]) | undefined;
|
|
7172
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
7758
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
7759
|
+
and to the `value` attribute where this one is not written, as a native
|
|
7760
|
+
control resets to the `value` it declares. */
|
|
7173
7761
|
defaultValue?: (HelixHeadlessListbox["defaultValue"]) | undefined;
|
|
7174
7762
|
/** The control's current value, which its form submits.
|
|
7175
7763
|
|
|
@@ -7254,6 +7842,8 @@ export type HelixHeadlessListboxVueEvents = {
|
|
|
7254
7842
|
"helix-before-change": HelixHeadlessListboxHelixBeforeChangeElementEvent;
|
|
7255
7843
|
/** Fired before the list is filtered, and cancelable. */
|
|
7256
7844
|
"helix-filter": HelixHeadlessListboxHelixFilterElementEvent;
|
|
7845
|
+
/** Fired once the list is scrolled within a screen of its end, once for each number of options, and not while `loading` is set. Add the next page of options and set `loading` while you fetch it. */
|
|
7846
|
+
"helix-load-more": HelixHeadlessListboxHelixLoadMoreElementEvent;
|
|
7257
7847
|
/** Fired after the value changes. */
|
|
7258
7848
|
input: HelixHeadlessListboxElementEvent;
|
|
7259
7849
|
};
|
|
@@ -7618,6 +8208,9 @@ export type HelixHeadlessMapHelixMapTiltElementEvent =
|
|
|
7618
8208
|
/** `helix-map-zoom` event type */
|
|
7619
8209
|
export type HelixHeadlessMapHelixMapZoomElementEvent =
|
|
7620
8210
|
HelixHeadlessMapElementEvent<HelixMapZoomEvent>;
|
|
8211
|
+
/** `helix-toggle` event type */
|
|
8212
|
+
export type HelixHeadlessMapHelixToggleElementEvent =
|
|
8213
|
+
HelixHeadlessMapElementEvent<HelixToggleEvent>;
|
|
7621
8214
|
|
|
7622
8215
|
export type HelixHeadlessMapVueProps = {
|
|
7623
8216
|
/** The map's rotation, in degrees clockwise from north. `connectMap` keeps it
|
|
@@ -7922,6 +8515,8 @@ export type HelixHeadlessMapVueEvents = {
|
|
|
7922
8515
|
"helix-map-tilt": HelixHeadlessMapHelixMapTiltElementEvent;
|
|
7923
8516
|
/** A zoom button or key was pressed, with a direction. Zoom your map in response. */
|
|
7924
8517
|
"helix-map-zoom": HelixHeadlessMapHelixMapZoomElementEvent;
|
|
8518
|
+
/** A layer's tile in the layers menu showed or hid it. Sent from the layer once its `hidden` attribute holds the choice, with `checked` true when it is shown. */
|
|
8519
|
+
"helix-toggle": HelixHeadlessMapHelixToggleElementEvent;
|
|
7925
8520
|
};
|
|
7926
8521
|
|
|
7927
8522
|
/** `HelixHeadlessMapRoute` component event */
|
|
@@ -8191,37 +8786,24 @@ So the anchor *is* the row, carrying `menuitem` and the `tabindex` the menu
|
|
|
8191
8786
|
roves, which is the same maneuver `Tree.Item` makes and the reason `href`
|
|
8192
8787
|
changes the markup rather than only adding an attribute.
|
|
8193
8788
|
|
|
8194
|
-
**`Option`
|
|
8195
|
-
|
|
8196
|
-
|
|
8197
|
-
option
|
|
8198
|
-
|
|
8199
|
-
|
|
8200
|
-
back `null`. So `role="option"` is pinned to the host, and an anchor under
|
|
8201
|
-
it hits the naming failure above. A menu has no such constraint because
|
|
8202
|
-
focus really moves to the row. */
|
|
8789
|
+
**`Option` takes an `href` too, and keeps its role a different way.** A
|
|
8790
|
+
listbox keeps focus somewhere else, in the text field for a combobox, and
|
|
8791
|
+
names the current option with `aria-activedescendant`, which can only point
|
|
8792
|
+
at the option's host. So an option stays `role="option"` on its host, draws
|
|
8793
|
+
no anchor, and follows its link through an anchor made for the moment. A
|
|
8794
|
+
menu has no such constraint, because focus really moves to the row. */
|
|
8203
8795
|
href?: (HelixHeadlessMenuItem["href"]) | undefined;
|
|
8204
8796
|
/** The link's `rel`. Set it whenever you set `target="_blank"`. */
|
|
8205
8797
|
rel?: (HelixHeadlessMenuItem["rel"]) | undefined;
|
|
8798
|
+
/** The row's keyboard shortcut as a chord, such as `mod+s`, shown after the
|
|
8799
|
+
label in the platform's glyphs and given to the row as
|
|
8800
|
+
`aria-keyshortcuts`. `mod` is Command on an Apple keyboard and Control
|
|
8801
|
+
elsewhere. Showing a shortcut does not bind it. */
|
|
8802
|
+
shortcut?: (HelixHeadlessMenuItem["shortcut"]) | undefined;
|
|
8206
8803
|
/** Where the link opens, for rows that should open outside the current page. */
|
|
8207
8804
|
target?: (HelixHeadlessMenuItem["target"]) | undefined;
|
|
8208
8805
|
/** The row's value, sent in `helix-select` when the row is chosen. */
|
|
8209
8806
|
value?: (HelixHeadlessMenuItem["value"]) | undefined;
|
|
8210
|
-
/** Whether the row is on the menu page that is showing.
|
|
8211
|
-
|
|
8212
|
-
Set by the menu, and a property rather than an attribute for that reason.
|
|
8213
|
-
Public because the menu has to reach it, and not something a consumer
|
|
8214
|
-
writes: which page is open is the menu's business. */
|
|
8215
|
-
onPage?: (HelixHeadlessMenuItem["onPage"]) | undefined;
|
|
8216
|
-
/** Whether the page showing is this row's submenu, or one below it.
|
|
8217
|
-
|
|
8218
|
-
Separate from `onPage`, and it has to be. A row that opened a page is not
|
|
8219
|
-
itself on that page, so both are false for it, and rendering nothing on
|
|
8220
|
-
that basis takes its `slot[name="submenu"]` with it: the rows inside have
|
|
8221
|
-
nowhere to be assigned and are never laid out. Every row on the way down to
|
|
8222
|
-
the open page has to keep its slot, not only the one directly above it.
|
|
8223
|
-
Three levels deep, the topmost row holds the slot the middle one lives in. */
|
|
8224
|
-
showingSubmenu?: (HelixHeadlessMenuItem["showingSubmenu"]) | undefined;
|
|
8225
8807
|
};
|
|
8226
8808
|
|
|
8227
8809
|
export type HelixHeadlessMenuItemVueEvents = {
|
|
@@ -8254,6 +8836,9 @@ export type HelixHeadlessMenuVueProps = {
|
|
|
8254
8836
|
"back-label"?: (HelixHeadlessMenu["backLabel"]) | undefined;
|
|
8255
8837
|
/** The text of the row that returns from a submenu. */
|
|
8256
8838
|
backLabel?: (HelixHeadlessMenu["backLabel"]) | undefined;
|
|
8839
|
+
/** Whether the menu is the trigger's context menu: it opens where the reader
|
|
8840
|
+
asks for one, with a right-click, a long press, Shift+F10 or the menu key. */
|
|
8841
|
+
context?: (HelixHeadlessMenu["context"]) | undefined;
|
|
8257
8842
|
/** Accessible name for the surface.
|
|
8258
8843
|
|
|
8259
8844
|
Empty by default, which names the surface by its trigger, so a menu opened
|
|
@@ -8310,6 +8895,14 @@ export type HelixHeadlessMenuVueEvents = {
|
|
|
8310
8895
|
toggle: HelixHeadlessMenuToggleElementEvent;
|
|
8311
8896
|
};
|
|
8312
8897
|
|
|
8898
|
+
export type HelixHeadlessMenuSectionVueProps = {
|
|
8899
|
+
/** The heading's words, when they are plain text. Content in the `heading`
|
|
8900
|
+
slot replaces it. */
|
|
8901
|
+
label?: (HelixHeadlessMenuSection["label"]) | undefined;
|
|
8902
|
+
};
|
|
8903
|
+
|
|
8904
|
+
export type HelixHeadlessMenuSectionVueEvents = {};
|
|
8905
|
+
|
|
8313
8906
|
export type HelixHeadlessMeterVueProps = {
|
|
8314
8907
|
/** Sets the band directly, for a rule that `low`, `high`, and `optimum` cannot
|
|
8315
8908
|
express.
|
|
@@ -8339,6 +8932,32 @@ stylesheet outside as `indicator-good`, `-fair` or `-poor` among the fill's
|
|
|
8339
8932
|
part names, so reflecting here would write an attribute onto the host for
|
|
8340
8933
|
no reader. */
|
|
8341
8934
|
band?: (HelixHeadlessMeter["band"]) | undefined;
|
|
8935
|
+
/** `Intl.NumberFormat` options the reading is written with, as React Aria's
|
|
8936
|
+
Meter and ProgressBar take them: a unit, a currency, or a number of
|
|
8937
|
+
decimals. Written as JSON in the attribute.
|
|
8938
|
+
|
|
8939
|
+
```html
|
|
8940
|
+
<helix-meter value="18" max="32" format-options='{"style":"unit","unit":"gigabyte"}'></helix-meter>
|
|
8941
|
+
```
|
|
8942
|
+
|
|
8943
|
+
A `percent` style writes the share of the range, and any other the value
|
|
8944
|
+
itself, so the example says "18 GB", and a value past an end as it is.
|
|
8945
|
+
Absent is a whole percentage. The words are announced as well as shown.
|
|
8946
|
+
`value-text` still wins. */
|
|
8947
|
+
"format-options"?: (HelixHeadlessMeter["formatOptions"]) | undefined;
|
|
8948
|
+
/** `Intl.NumberFormat` options the reading is written with, as React Aria's
|
|
8949
|
+
Meter and ProgressBar take them: a unit, a currency, or a number of
|
|
8950
|
+
decimals. Written as JSON in the attribute.
|
|
8951
|
+
|
|
8952
|
+
```html
|
|
8953
|
+
<helix-meter value="18" max="32" format-options='{"style":"unit","unit":"gigabyte"}'></helix-meter>
|
|
8954
|
+
```
|
|
8955
|
+
|
|
8956
|
+
A `percent` style writes the share of the range, and any other the value
|
|
8957
|
+
itself, so the example says "18 GB", and a value past an end as it is.
|
|
8958
|
+
Absent is a whole percentage. The words are announced as well as shown.
|
|
8959
|
+
`value-text` still wins. */
|
|
8960
|
+
formatOptions?: (HelixHeadlessMeter["formatOptions"]) | undefined;
|
|
8342
8961
|
/** Bottom of the high band.
|
|
8343
8962
|
|
|
8344
8963
|
Absent leaves the range unbanded. */
|
|
@@ -8416,6 +9035,11 @@ fair summary of a task and a poor one of a quantity. */
|
|
|
8416
9035
|
export type HelixHeadlessMeterVueEvents = {};
|
|
8417
9036
|
|
|
8418
9037
|
export type HelixHeadlessNavigationVueProps = {
|
|
9038
|
+
/** Whether the arrow keys move focus between the destinations.
|
|
9039
|
+
|
|
9040
|
+
Off by default, so a page whose readers scroll with the arrow keys while
|
|
9041
|
+
a link has focus keeps doing so. */
|
|
9042
|
+
arrows?: (HelixHeadlessNavigation["arrows"]) | undefined;
|
|
8419
9043
|
/** The landmark's name, read by screen readers.
|
|
8420
9044
|
|
|
8421
9045
|
An `aria-label` or `aria-labelledby` on the host names the landmark too,
|
|
@@ -8577,6 +9201,9 @@ export type HelixHeadlessNotificationsElementEvent<E = Event> = TypedEvent<
|
|
|
8577
9201
|
/** `helix-dismiss` event type */
|
|
8578
9202
|
export type HelixHeadlessNotificationsHelixDismissElementEvent =
|
|
8579
9203
|
HelixHeadlessNotificationsElementEvent<HelixDismissEvent>;
|
|
9204
|
+
/** `helix-load-more` event type */
|
|
9205
|
+
export type HelixHeadlessNotificationsHelixLoadMoreElementEvent =
|
|
9206
|
+
HelixHeadlessNotificationsElementEvent<HelixLoadMoreEvent>;
|
|
8580
9207
|
/** `helix-read` event type */
|
|
8581
9208
|
export type HelixHeadlessNotificationsHelixReadElementEvent =
|
|
8582
9209
|
HelixHeadlessNotificationsElementEvent<HelixReadEvent>;
|
|
@@ -8584,6 +9211,16 @@ export type HelixHeadlessNotificationsHelixReadElementEvent =
|
|
|
8584
9211
|
export type HelixHeadlessNotificationsVueProps = {
|
|
8585
9212
|
/** The feed's name, read by screen readers. */
|
|
8586
9213
|
label?: (HelixHeadlessNotifications["label"]) | undefined;
|
|
9214
|
+
/** Whether to draw a button after the list that asks for the next page, by
|
|
9215
|
+
sending `helix-load-more`. Take it off once there is nothing more. */
|
|
9216
|
+
"load-more"?: (HelixHeadlessNotifications["loadMore"]) | undefined;
|
|
9217
|
+
/** Whether to draw a button after the list that asks for the next page, by
|
|
9218
|
+
sending `helix-load-more`. Take it off once there is nothing more. */
|
|
9219
|
+
loadMore?: (HelixHeadlessNotifications["loadMore"]) | undefined;
|
|
9220
|
+
/** The text of the `load-more` button. */
|
|
9221
|
+
"load-more-label"?: (HelixHeadlessNotifications["loadMoreLabel"]) | undefined;
|
|
9222
|
+
/** The text of the `load-more` button. */
|
|
9223
|
+
loadMoreLabel?: (HelixHeadlessNotifications["loadMoreLabel"]) | undefined;
|
|
8587
9224
|
/** Whether to draw a control that marks everything read. */
|
|
8588
9225
|
"mark-all"?: (HelixHeadlessNotifications["markAll"]) | undefined;
|
|
8589
9226
|
/** Whether to draw a control that marks everything read. */
|
|
@@ -8617,6 +9254,8 @@ say that without the component knowing what a row looks like. */
|
|
|
8617
9254
|
export type HelixHeadlessNotificationsVueEvents = {
|
|
8618
9255
|
/** Fired when the user dismisses a row. The row dispatches it, and you can listen for it on the feed. Cancelable: cancel it to keep the row. */
|
|
8619
9256
|
"helix-dismiss": HelixHeadlessNotificationsHelixDismissElementEvent;
|
|
9257
|
+
/** Fired when a reader presses the `load-more` button, asking for the next page of the feed. */
|
|
9258
|
+
"helix-load-more": HelixHeadlessNotificationsHelixLoadMoreElementEvent;
|
|
8620
9259
|
/** Fired by an item when it is marked read or unread, and by the feed when everything is marked read. Cancelable. */
|
|
8621
9260
|
"helix-read": HelixHeadlessNotificationsHelixReadElementEvent;
|
|
8622
9261
|
};
|
|
@@ -8725,12 +9364,6 @@ filled in. */
|
|
|
8725
9364
|
readonly?: (HelixHeadlessNumberInput["readOnly"]) | undefined;
|
|
8726
9365
|
/** Prevents editing. The value is still submitted with the form. */
|
|
8727
9366
|
readOnly?: (HelixHeadlessNumberInput["readOnly"]) | undefined;
|
|
8728
|
-
/** What the field is described as on iOS and iPadOS, where it carries no
|
|
8729
|
-
spinbutton role. See the class description. */
|
|
8730
|
-
"role-description"?: (HelixHeadlessNumberInput["roleDescription"]) | undefined;
|
|
8731
|
-
/** What the field is described as on iOS and iPadOS, where it carries no
|
|
8732
|
-
spinbutton role. See the class description. */
|
|
8733
|
-
roleDescription?: (HelixHeadlessNumberInput["roleDescription"]) | undefined;
|
|
8734
9367
|
/** Makes the label a grip that changes the value when it is dragged.
|
|
8735
9368
|
|
|
8736
9369
|
The label is what is dragged, so this adds no chrome at all. Still opt-in,
|
|
@@ -8767,9 +9400,13 @@ number alone. */
|
|
|
8767
9400
|
React Aria's NumberField does unless told not to. Off, the wheel scrolls
|
|
8768
9401
|
the page, which is what a reader passing over a form expects. */
|
|
8769
9402
|
wheel?: (HelixHeadlessNumberInput["wheel"]) | undefined;
|
|
8770
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
9403
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
9404
|
+
and to the `value` attribute where this one is not written, as a native
|
|
9405
|
+
control resets to the `value` it declares. */
|
|
8771
9406
|
"default-value"?: (HelixHeadlessNumberInput["defaultValue"]) | undefined;
|
|
8772
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
9407
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
9408
|
+
and to the `value` attribute where this one is not written, as a native
|
|
9409
|
+
control resets to the `value` it declares. */
|
|
8773
9410
|
defaultValue?: (HelixHeadlessNumberInput["defaultValue"]) | undefined;
|
|
8774
9411
|
/** The control's current value, which its form submits.
|
|
8775
9412
|
|
|
@@ -8856,11 +9493,40 @@ export type HelixHeadlessObjectInspectorElementEvent<E = Event> = TypedEvent<
|
|
|
8856
9493
|
HelixHeadlessObjectInspector,
|
|
8857
9494
|
E
|
|
8858
9495
|
>;
|
|
9496
|
+
/** `helix-activate` event type */
|
|
9497
|
+
export type HelixHeadlessObjectInspectorHelixActivateElementEvent =
|
|
9498
|
+
HelixHeadlessObjectInspectorElementEvent<HelixActivateEvent>;
|
|
9499
|
+
/** `helix-before-activate` event type */
|
|
9500
|
+
export type HelixHeadlessObjectInspectorHelixBeforeActivateElementEvent =
|
|
9501
|
+
HelixHeadlessObjectInspectorElementEvent<HelixBeforeActivateEvent>;
|
|
9502
|
+
/** `helix-before-close` event type */
|
|
9503
|
+
export type HelixHeadlessObjectInspectorHelixBeforeCloseElementEvent =
|
|
9504
|
+
HelixHeadlessObjectInspectorElementEvent<HelixBeforeCloseEvent>;
|
|
9505
|
+
/** `helix-before-open` event type */
|
|
9506
|
+
export type HelixHeadlessObjectInspectorHelixBeforeOpenElementEvent =
|
|
9507
|
+
HelixHeadlessObjectInspectorElementEvent<HelixBeforeOpenEvent>;
|
|
8859
9508
|
/** `helix-copy` event type */
|
|
8860
9509
|
export type HelixHeadlessObjectInspectorHelixCopyElementEvent =
|
|
8861
9510
|
HelixHeadlessObjectInspectorElementEvent<HelixCopyEvent>;
|
|
9511
|
+
/** `helix-filter` event type */
|
|
9512
|
+
export type HelixHeadlessObjectInspectorHelixFilterElementEvent =
|
|
9513
|
+
HelixHeadlessObjectInspectorElementEvent<HelixFilterEvent>;
|
|
9514
|
+
/** `helix-filtered` event type */
|
|
9515
|
+
export type HelixHeadlessObjectInspectorHelixFilteredElementEvent =
|
|
9516
|
+
HelixHeadlessObjectInspectorElementEvent<HelixFilteredEvent>;
|
|
9517
|
+
/** `toggle` event type */
|
|
9518
|
+
export type HelixHeadlessObjectInspectorToggleElementEvent =
|
|
9519
|
+
HelixHeadlessObjectInspectorElementEvent<ToggleEvent>;
|
|
8862
9520
|
|
|
8863
9521
|
export type HelixHeadlessObjectInspectorVueProps = {
|
|
9522
|
+
/** The active row's path, such as `/meta/tags/0`, and the empty string for the
|
|
9523
|
+
root.
|
|
9524
|
+
|
|
9525
|
+
Reading gives the row the keys are on. Writing moves there, opening the
|
|
9526
|
+
branches around it, and sends no event, the way a script's write to any
|
|
9527
|
+
current value sends none. A path the value does not hold moves to the
|
|
9528
|
+
nearest branch above it that it does. */
|
|
9529
|
+
active?: (HelixHeadlessObjectInspector["active"]) | undefined;
|
|
8864
9530
|
/** The copy button's accessible name on a row with a key, with the key filled
|
|
8865
9531
|
in as `{name}`.
|
|
8866
9532
|
|
|
@@ -8891,6 +9557,15 @@ reader sees the shape of the value before its contents. `0` starts with the
|
|
|
8891
9557
|
root closed; a large number opens everything, which on a big value is the
|
|
8892
9558
|
wall of text this exists to avoid. */
|
|
8893
9559
|
defaultDepth?: (HelixHeadlessObjectInspector["defaultDepth"]) | undefined;
|
|
9560
|
+
/** Text the tree is narrowed to: the entries whose key or value holds it,
|
|
9561
|
+
ignoring case, and the branches that lead to them. Empty shows everything. */
|
|
9562
|
+
filter?: (HelixHeadlessObjectInspector["filter"]) | undefined;
|
|
9563
|
+
/** Whether to show a field that sets `filter`. */
|
|
9564
|
+
filterable?: (HelixHeadlessObjectInspector["filterable"]) | undefined;
|
|
9565
|
+
/** The filter field's placeholder and accessible name. */
|
|
9566
|
+
"filter-label"?: (HelixHeadlessObjectInspector["filterLabel"]) | undefined;
|
|
9567
|
+
/** The filter field's placeholder and accessible name. */
|
|
9568
|
+
filterLabel?: (HelixHeadlessObjectInspector["filterLabel"]) | undefined;
|
|
8894
9569
|
/** The id of a `<script type="application/json">` holding the value.
|
|
8895
9570
|
|
|
8896
9571
|
Read once the document exists, and again whenever this changes. Text that
|
|
@@ -8939,6 +9614,16 @@ who set the property. This button is positioned out of the flow and takes no
|
|
|
8939
9614
|
room, so nothing selects on it, and reflection exists so that a selector can
|
|
8940
9615
|
reach a value. */
|
|
8941
9616
|
noCopy?: (HelixHeadlessObjectInspector["noCopy"]) | undefined;
|
|
9617
|
+
/** What a screen reader hears when a filter matches one entry. `{count}` is the count. */
|
|
9618
|
+
"result-label"?: (HelixHeadlessObjectInspector["resultLabel"]) | undefined;
|
|
9619
|
+
/** What a screen reader hears when a filter matches one entry. `{count}` is the count. */
|
|
9620
|
+
resultLabel?: (HelixHeadlessObjectInspector["resultLabel"]) | undefined;
|
|
9621
|
+
/** What a screen reader hears when a filter matches any other number of
|
|
9622
|
+
entries. `{count}` is the count. The two are chosen by `Intl.PluralRules`. */
|
|
9623
|
+
"results-label"?: (HelixHeadlessObjectInspector["resultsLabel"]) | undefined;
|
|
9624
|
+
/** What a screen reader hears when a filter matches any other number of
|
|
9625
|
+
entries. `{count}` is the count. The two are chosen by `Intl.PluralRules`. */
|
|
9626
|
+
resultsLabel?: (HelixHeadlessObjectInspector["resultsLabel"]) | undefined;
|
|
8942
9627
|
/** The tree's accessible name when `label` is empty and the host names it
|
|
8943
9628
|
with neither `aria-label` nor `aria-labelledby`. */
|
|
8944
9629
|
"tree-label"?: (HelixHeadlessObjectInspector["treeLabel"]) | undefined;
|
|
@@ -8950,6 +9635,11 @@ with neither `aria-label` nor `aria-labelledby`. */
|
|
|
8950
9635
|
For a value of thousands of entries. Reflected, because the box it scrolls
|
|
8951
9636
|
needs a height, which is a stylesheet rule reading this attribute. */
|
|
8952
9637
|
windowed?: (HelixHeadlessObjectInspector["windowed"]) | undefined;
|
|
9638
|
+
/** The open branches, by path, in no set order.
|
|
9639
|
+
|
|
9640
|
+
Writing opens exactly these and closes every other, keeping the active row
|
|
9641
|
+
where it stays visible. A property, never an attribute. */
|
|
9642
|
+
expanded?: (HelixHeadlessObjectInspector["expanded"]) | undefined;
|
|
8953
9643
|
/** The value to show, when your code already holds it as an object.
|
|
8954
9644
|
|
|
8955
9645
|
Takes precedence over `for`. Anything JSON can say is drawn; anything else
|
|
@@ -8958,8 +9648,22 @@ is shown as its string. */
|
|
|
8958
9648
|
};
|
|
8959
9649
|
|
|
8960
9650
|
export type HelixHeadlessObjectInspectorVueEvents = {
|
|
9651
|
+
/** The active row moved, by a key or a click. The detail's `value` is its path. */
|
|
9652
|
+
"helix-activate": HelixHeadlessObjectInspectorHelixActivateElementEvent;
|
|
9653
|
+
/** The active row is about to move, with its new path. Cancelable: cancel it to keep the row where it is. */
|
|
9654
|
+
"helix-before-activate": HelixHeadlessObjectInspectorHelixBeforeActivateElementEvent;
|
|
9655
|
+
/** A reader is about to close the active branch. Cancelable: cancel it to keep the branch open. */
|
|
9656
|
+
"helix-before-close": HelixHeadlessObjectInspectorHelixBeforeCloseElementEvent;
|
|
9657
|
+
/** A reader is about to open the active branch, or `*` the branches beside it. Cancelable: cancel it to keep them closed. */
|
|
9658
|
+
"helix-before-open": HelixHeadlessObjectInspectorHelixBeforeOpenElementEvent;
|
|
8961
9659
|
/** A value was put on the clipboard, from the copy button or the keyboard. */
|
|
8962
9660
|
"helix-copy": HelixHeadlessObjectInspectorHelixCopyElementEvent;
|
|
9661
|
+
/** Text was typed in the filter field, with what it now holds. Cancelable: cancel it to keep the filter as it was. */
|
|
9662
|
+
"helix-filter": HelixHeadlessObjectInspectorHelixFilterElementEvent;
|
|
9663
|
+
/** The filter field changed `filter`, which now holds the text. */
|
|
9664
|
+
"helix-filtered": HelixHeadlessObjectInspectorHelixFilteredElementEvent;
|
|
9665
|
+
/** A reader opened or closed a branch, with `newState` and `oldState`. `expanded` holds every open branch. */
|
|
9666
|
+
toggle: HelixHeadlessObjectInspectorToggleElementEvent;
|
|
8963
9667
|
};
|
|
8964
9668
|
|
|
8965
9669
|
export type HelixHeadlessOptionGroupVueProps = {
|
|
@@ -8981,15 +9685,19 @@ export type HelixHeadlessOptionHelixSelectElementEvent =
|
|
|
8981
9685
|
export type HelixHeadlessOptionVueProps = {
|
|
8982
9686
|
/** Whether this is the option the keyboard is on.
|
|
8983
9687
|
|
|
8984
|
-
Written by the listbox
|
|
8985
|
-
|
|
8986
|
-
|
|
9688
|
+
Written by the listbox once a reader moves the highlight. Style it with
|
|
9689
|
+
`:state(active)`, or `::part(item-active)` for an option inside another
|
|
9690
|
+
component's shadow root. The `data-active` attribute sets it from markup;
|
|
9691
|
+
it is also written back for stylesheets from before the state, and no
|
|
9692
|
+
stylesheet of the library's own selects it. */
|
|
8987
9693
|
"data-active"?: (HelixHeadlessOption["active"]) | undefined;
|
|
8988
9694
|
/** Whether this is the option the keyboard is on.
|
|
8989
9695
|
|
|
8990
|
-
Written by the listbox
|
|
8991
|
-
|
|
8992
|
-
|
|
9696
|
+
Written by the listbox once a reader moves the highlight. Style it with
|
|
9697
|
+
`:state(active)`, or `::part(item-active)` for an option inside another
|
|
9698
|
+
component's shadow root. The `data-active` attribute sets it from markup;
|
|
9699
|
+
it is also written back for stylesheets from before the state, and no
|
|
9700
|
+
stylesheet of the library's own selects it. */
|
|
8993
9701
|
active?: (HelixHeadlessOption["active"]) | undefined;
|
|
8994
9702
|
/** A second destination for the row, opened when you choose it with the
|
|
8995
9703
|
modifier key held.
|
|
@@ -9163,7 +9871,13 @@ read at the click rather than cached, because a reader can change it while
|
|
|
9163
9871
|
the page is open and this is the only motion in the component that
|
|
9164
9872
|
JavaScript rather than CSS decides. */
|
|
9165
9873
|
behavior?: (HelixHeadlessOutline["behavior"]) | undefined;
|
|
9166
|
-
/**
|
|
9874
|
+
/** Keeps the link of the section in view in view itself, in an outline
|
|
9875
|
+
longer than the box it scrolls in, such as a contents rail with a
|
|
9876
|
+
scrollbar of its own. Only that box moves: never the page, and never the
|
|
9877
|
+
box the sections scroll in. */
|
|
9878
|
+
follow?: (HelixHeadlessOutline["follow"]) | undefined;
|
|
9879
|
+
/** The navigation's name, read by screen readers. A heading in the `heading`
|
|
9880
|
+
slot names it in place of this. */
|
|
9167
9881
|
label?: (HelixHeadlessOutline["label"]) | undefined;
|
|
9168
9882
|
/** How far below the top of the scroll container a heading counts as reached,
|
|
9169
9883
|
in pixels. The scroll container is the window or the panel the sections
|
|
@@ -9373,6 +10087,32 @@ Reading gives the real one; writing declares it the consumer's, and
|
|
|
9373
10087
|
`default-value` seeds one this element owns. Same accessor pair as
|
|
9374
10088
|
`Pagination.page` and the calendar's `month`. */
|
|
9375
10089
|
value?: (HelixHeadlessPaginationSize["value"]) | undefined;
|
|
10090
|
+
/** Whether the control is disabled and cannot be used.
|
|
10091
|
+
|
|
10092
|
+
Reflected, because the styled tier selects on it, and mirrored to
|
|
10093
|
+
`aria-disabled` rather than removing the element from the accessibility
|
|
10094
|
+
tree, so a screen reader can still announce that the control exists.
|
|
10095
|
+
|
|
10096
|
+
The mirror itself is in `willUpdate` below, here rather than in each
|
|
10097
|
+
control, because here is where `disabled` is. */
|
|
10098
|
+
disabled?: (HelixHeadlessPaginationSize["disabled"]) | undefined;
|
|
10099
|
+
/** The name the control's value is submitted under.
|
|
10100
|
+
|
|
10101
|
+
**Reflected, and it is the exception to "reflect only what CSS selects
|
|
10102
|
+
on".** The platform builds a form's entry list from the `name` *content
|
|
10103
|
+
attribute*, not from the property, so a control named through the property
|
|
10104
|
+
submitted under no name at all and was silently dropped. Measured: two
|
|
10105
|
+
inputs in one form, one named by attribute and one by property, and the
|
|
10106
|
+
form carried a single entry.
|
|
10107
|
+
|
|
10108
|
+
Safe for a React consumer, which is what the rule is protecting: React
|
|
10109
|
+
renders a custom element's props as attributes on the server, so the name
|
|
10110
|
+
is already in the markup being hydrated and reflecting it writes what is
|
|
10111
|
+
there. It is only a change to the markup when a consumer assigns it
|
|
10112
|
+
imperatively later, and nothing is hydrating by then.
|
|
10113
|
+
|
|
10114
|
+
Here rather than on each control. */
|
|
10115
|
+
name?: (HelixHeadlessPaginationSize["name"]) | undefined;
|
|
9376
10116
|
};
|
|
9377
10117
|
|
|
9378
10118
|
export type HelixHeadlessPaginationSizeVueEvents = {
|
|
@@ -9440,6 +10180,10 @@ the same code is one offer made six times. */
|
|
|
9440
10180
|
Awesome's `autosubmit` and Radix's `autoSubmit`. Only for a code the field
|
|
9441
10181
|
took: a refused last character submits nothing. */
|
|
9442
10182
|
autosubmit?: (HelixHeadlessPinInput["autosubmit"]) | undefined;
|
|
10183
|
+
/** How typed and pasted letters are cased: `upper`, `lower`, or `preserve`
|
|
10184
|
+
to keep them as typed. Web Awesome's OTP input takes the same `case`, for
|
|
10185
|
+
a code a service reads in one case. */
|
|
10186
|
+
case?: (HelixHeadlessPinInput["case"]) | undefined;
|
|
9443
10187
|
/** Accessible name for one box, with `{index}` and `{length}` filled in. */
|
|
9444
10188
|
"cell-label"?: (HelixHeadlessPinInput["cellLabel"]) | undefined;
|
|
9445
10189
|
/** Accessible name for one box, with `{index}` and `{length}` filled in. */
|
|
@@ -9493,9 +10237,13 @@ attribute no consumer's markup had. The area rules carry the sentence
|
|
|
9493
10237
|
"reflect only what CSS selects on". The real inputs take it as a binding,
|
|
9494
10238
|
which is what makes the keyboard follow. */
|
|
9495
10239
|
type?: (HelixHeadlessPinInput["type"]) | undefined;
|
|
9496
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
10240
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
10241
|
+
and to the `value` attribute where this one is not written, as a native
|
|
10242
|
+
control resets to the `value` it declares. */
|
|
9497
10243
|
"default-value"?: (HelixHeadlessPinInput["defaultValue"]) | undefined;
|
|
9498
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
10244
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
10245
|
+
and to the `value` attribute where this one is not written, as a native
|
|
10246
|
+
control resets to the `value` it declares. */
|
|
9499
10247
|
defaultValue?: (HelixHeadlessPinInput["defaultValue"]) | undefined;
|
|
9500
10248
|
/** The control's current value, which its form submits.
|
|
9501
10249
|
|
|
@@ -9597,8 +10345,9 @@ trigger already reads as belonging to it. */
|
|
|
9597
10345
|
/** The panel's name, read by screen readers. Left at `Popover`, the first
|
|
9598
10346
|
heading in the panel names it instead. */
|
|
9599
10347
|
label?: (HelixHeadlessPopover["label"]) | undefined;
|
|
9600
|
-
/** Keeps `Tab` inside the panel while it is open,
|
|
9601
|
-
`aria-modal
|
|
10348
|
+
/** Keeps `Tab` inside the panel while it is open, marks the panel
|
|
10349
|
+
`aria-modal`, and hides the rest of the page from screen readers. A press
|
|
10350
|
+
outside and Escape still close it. */
|
|
9602
10351
|
modal?: (HelixHeadlessPopover["modal"]) | undefined;
|
|
9603
10352
|
/** Space between the trigger and the panel, in pixels. */
|
|
9604
10353
|
offset?: (HelixHeadlessPopover["offset"]) | undefined;
|
|
@@ -9635,6 +10384,30 @@ export type HelixHeadlessPopoverVueEvents = {
|
|
|
9635
10384
|
};
|
|
9636
10385
|
|
|
9637
10386
|
export type HelixHeadlessProgressVueProps = {
|
|
10387
|
+
/** `Intl.NumberFormat` options the reading is written with, as React Aria's
|
|
10388
|
+
Meter and ProgressBar take them: a unit, a currency, or a number of
|
|
10389
|
+
decimals. Written as JSON in the attribute.
|
|
10390
|
+
|
|
10391
|
+
```html
|
|
10392
|
+
<helix-progress value="18" max="32" format-options='{"style":"unit","unit":"gigabyte"}'></helix-progress>
|
|
10393
|
+
```
|
|
10394
|
+
|
|
10395
|
+
A `percent` style writes the share of the range, and any other the value
|
|
10396
|
+
itself, so the example says "18 GB". Absent is a whole percentage. The
|
|
10397
|
+
words are announced as well as shown. `value-text` still wins. */
|
|
10398
|
+
"format-options"?: (HelixHeadlessProgress["formatOptions"]) | undefined;
|
|
10399
|
+
/** `Intl.NumberFormat` options the reading is written with, as React Aria's
|
|
10400
|
+
Meter and ProgressBar take them: a unit, a currency, or a number of
|
|
10401
|
+
decimals. Written as JSON in the attribute.
|
|
10402
|
+
|
|
10403
|
+
```html
|
|
10404
|
+
<helix-progress value="18" max="32" format-options='{"style":"unit","unit":"gigabyte"}'></helix-progress>
|
|
10405
|
+
```
|
|
10406
|
+
|
|
10407
|
+
A `percent` style writes the share of the range, and any other the value
|
|
10408
|
+
itself, so the example says "18 GB". Absent is a whole percentage. The
|
|
10409
|
+
words are announced as well as shown. `value-text` still wins. */
|
|
10410
|
+
formatOptions?: (HelixHeadlessProgress["formatOptions"]) | undefined;
|
|
9638
10411
|
/** Whether the length of the task is unknown. The bar then shows activity
|
|
9639
10412
|
without a value.
|
|
9640
10413
|
|
|
@@ -9799,22 +10572,26 @@ only `horizontal` has to be named. */
|
|
|
9799
10572
|
/** Whether a reader can see and focus the answer and cannot change it. A
|
|
9800
10573
|
read-only group still submits its value.
|
|
9801
10574
|
|
|
9802
|
-
React Aria's `isReadOnly`. A press on a radio is refused
|
|
9803
|
-
|
|
9804
|
-
|
|
9805
|
-
A script can still set `value`. */
|
|
10575
|
+
React Aria's `isReadOnly`. A press on a radio is refused. The arrow keys,
|
|
10576
|
+
Home and End move focus between the radios and choose nothing, so a reader
|
|
10577
|
+
can hear every choice, and Tab still reaches the answer. The group says
|
|
10578
|
+
`aria-readonly`. A script can still set `value`. */
|
|
9806
10579
|
readonly?: (HelixHeadlessRadioGroup["readOnly"]) | undefined;
|
|
9807
10580
|
/** Whether a reader can see and focus the answer and cannot change it. A
|
|
9808
10581
|
read-only group still submits its value.
|
|
9809
10582
|
|
|
9810
|
-
React Aria's `isReadOnly`. A press on a radio is refused
|
|
9811
|
-
|
|
9812
|
-
|
|
9813
|
-
A script can still set `value`. */
|
|
10583
|
+
React Aria's `isReadOnly`. A press on a radio is refused. The arrow keys,
|
|
10584
|
+
Home and End move focus between the radios and choose nothing, so a reader
|
|
10585
|
+
can hear every choice, and Tab still reaches the answer. The group says
|
|
10586
|
+
`aria-readonly`. A script can still set `value`. */
|
|
9814
10587
|
readOnly?: (HelixHeadlessRadioGroup["readOnly"]) | undefined;
|
|
9815
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
10588
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
10589
|
+
and to the `value` attribute where this one is not written, as a native
|
|
10590
|
+
control resets to the `value` it declares. */
|
|
9816
10591
|
"default-value"?: (HelixHeadlessRadioGroup["defaultValue"]) | undefined;
|
|
9817
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
10592
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
10593
|
+
and to the `value` attribute where this one is not written, as a native
|
|
10594
|
+
control resets to the `value` it declares. */
|
|
9818
10595
|
defaultValue?: (HelixHeadlessRadioGroup["defaultValue"]) | undefined;
|
|
9819
10596
|
/** The control's current value, which its form submits.
|
|
9820
10597
|
|
|
@@ -9982,6 +10759,12 @@ export type HelixHeadlessRatingElementEvent<E = Event> = TypedEvent<
|
|
|
9982
10759
|
/** `helix-before-change` event type */
|
|
9983
10760
|
export type HelixHeadlessRatingHelixBeforeChangeElementEvent =
|
|
9984
10761
|
HelixHeadlessRatingElementEvent<HelixBeforeChangeEvent>;
|
|
10762
|
+
/** `helix-clear` event type */
|
|
10763
|
+
export type HelixHeadlessRatingHelixClearElementEvent =
|
|
10764
|
+
HelixHeadlessRatingElementEvent<HelixClearEvent>;
|
|
10765
|
+
/** `helix-preview` event type */
|
|
10766
|
+
export type HelixHeadlessRatingHelixPreviewElementEvent =
|
|
10767
|
+
HelixHeadlessRatingElementEvent<HelixPreviewEvent>;
|
|
9985
10768
|
|
|
9986
10769
|
export type HelixHeadlessRatingVueProps = {
|
|
9987
10770
|
/** Whether a reader can take the rating back to unrated: by pressing the
|
|
@@ -10094,9 +10877,13 @@ answer from the value than from a sentence: "3.5" alone is a number without
|
|
|
10094
10877
|
a subject. This names the readout, where a control is named by its `label`
|
|
10095
10878
|
and each of its options by the score that option is. */
|
|
10096
10879
|
valueText?: (HelixHeadlessRating["valueText"]) | undefined;
|
|
10097
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
10880
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
10881
|
+
and to the `value` attribute where this one is not written, as a native
|
|
10882
|
+
control resets to the `value` it declares. */
|
|
10098
10883
|
"default-value"?: (HelixHeadlessRating["defaultValue"]) | undefined;
|
|
10099
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
10884
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
10885
|
+
and to the `value` attribute where this one is not written, as a native
|
|
10886
|
+
control resets to the `value` it declares. */
|
|
10100
10887
|
defaultValue?: (HelixHeadlessRating["defaultValue"]) | undefined;
|
|
10101
10888
|
/** The control's current value, which its form submits.
|
|
10102
10889
|
|
|
@@ -10175,7 +10962,9 @@ export type HelixHeadlessRatingVueEvents = {
|
|
|
10175
10962
|
/** The score is about to change. Cancelable: cancel it to keep the current score. */
|
|
10176
10963
|
"helix-before-change": HelixHeadlessRatingHelixBeforeChangeElementEvent;
|
|
10177
10964
|
/** The rating went back to unrated, under `clearable`. Sent after `input` and `change`. */
|
|
10178
|
-
"helix-clear":
|
|
10965
|
+
"helix-clear": HelixHeadlessRatingHelixClearElementEvent;
|
|
10966
|
+
/** The score under the pointer, shown before it is chosen, or `''` once the marks show the score again. Sent once each time the preview changes. */
|
|
10967
|
+
"helix-preview": HelixHeadlessRatingHelixPreviewElementEvent;
|
|
10179
10968
|
/** The score changed. */
|
|
10180
10969
|
input: HelixHeadlessRatingElementEvent;
|
|
10181
10970
|
};
|
|
@@ -10196,6 +10985,14 @@ is read along. */
|
|
|
10196
10985
|
"points-label"?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
|
|
10197
10986
|
/** The word the summary uses for a row when it counts them. */
|
|
10198
10987
|
pointsLabel?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
|
|
10988
|
+
/** Draws each series' line of best fit across the plot, by least squares, in
|
|
10989
|
+
the series' color: the regression line a reader would otherwise draw by
|
|
10990
|
+
eye.
|
|
10991
|
+
|
|
10992
|
+
Absent draws none. A series with fewer than two points, or with every
|
|
10993
|
+
point at one measure across, has no line to draw. The summary already
|
|
10994
|
+
gives each series' correlation, which says how near the points are to it. */
|
|
10995
|
+
trend?: (HelixHeadlessScatterChart["trend"]) | undefined;
|
|
10199
10996
|
/** The id of the table to read.
|
|
10200
10997
|
|
|
10201
10998
|
Names a table in the same tree, so a chart inside another component's
|
|
@@ -10216,18 +11013,67 @@ percentages and its totals, such as `de` for `1.240` and `32 %`.
|
|
|
10216
11013
|
Absent uses the runtime's own. The table's cells are shown as the table
|
|
10217
11014
|
writes them, whatever this says. */
|
|
10218
11015
|
locale?: (HelixHeadlessScatterChart["locale"]) | undefined;
|
|
11016
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
11017
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
11018
|
+
`locale`.
|
|
11019
|
+
|
|
11020
|
+
Set it to the words of the page's language, such as `{position} von
|
|
11021
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
11022
|
+
legend hid is not counted. */
|
|
11023
|
+
"position-label"?: (HelixHeadlessScatterChart["positionLabel"]) | undefined;
|
|
11024
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
11025
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
11026
|
+
`locale`.
|
|
11027
|
+
|
|
11028
|
+
Set it to the words of the page's language, such as `{position} von
|
|
11029
|
+
{count}`, or to nothing to say no position. A slice or a series a
|
|
11030
|
+
legend hid is not counted. */
|
|
11031
|
+
positionLabel?: (HelixHeadlessScatterChart["positionLabel"]) | undefined;
|
|
10219
11032
|
};
|
|
10220
11033
|
|
|
10221
11034
|
export type HelixHeadlessScatterChartVueEvents = {};
|
|
10222
11035
|
|
|
11036
|
+
/** `HelixHeadlessScrollArea` component event */
|
|
11037
|
+
export type HelixHeadlessScrollAreaElementEvent<E = Event> = TypedEvent<
|
|
11038
|
+
HelixHeadlessScrollArea,
|
|
11039
|
+
E
|
|
11040
|
+
>;
|
|
11041
|
+
|
|
10223
11042
|
export type HelixHeadlessScrollAreaVueProps = {
|
|
11043
|
+
/** How long the scrollbars stay after the content stops moving, or the pointer
|
|
11044
|
+
leaves, in milliseconds. Read under `scrollbars="scroll"` and
|
|
11045
|
+
`scrollbars="hover"`. */
|
|
11046
|
+
"hide-delay"?: (HelixHeadlessScrollArea["hideDelay"] | `${number}`) | undefined;
|
|
11047
|
+
/** How long the scrollbars stay after the content stops moving, or the pointer
|
|
11048
|
+
leaves, in milliseconds. Read under `scrollbars="scroll"` and
|
|
11049
|
+
`scrollbars="hover"`. */
|
|
11050
|
+
hideDelay?: (HelixHeadlessScrollArea["hideDelay"]) | undefined;
|
|
10224
11051
|
/** The region's name, read by screen readers.
|
|
10225
11052
|
|
|
10226
11053
|
Without one there is no region: see the note on the class. */
|
|
10227
11054
|
label?: (HelixHeadlessScrollArea["label"]) | undefined;
|
|
11055
|
+
/** The one axis the content scrolls along: `vertical` or `horizontal`. The
|
|
11056
|
+
other axis clips what is past it and has no scrollbar. Unset scrolls both. */
|
|
11057
|
+
orientation?: (HelixHeadlessScrollArea["orientation"]) | undefined;
|
|
11058
|
+
/** Draws scrollbars of the component's own in place of the browser's, and
|
|
11059
|
+
says when they show.
|
|
11060
|
+
|
|
11061
|
+
- `auto`: on each axis that has content past it.
|
|
11062
|
+
- `always`: on each axis that can scroll, whether or not it has anything to
|
|
11063
|
+
scroll, so the scrollbar is there before the content grows.
|
|
11064
|
+
- `scroll`: while the content is moving, and for `hide-delay` after.
|
|
11065
|
+
- `hover`: as `scroll`, and while the pointer is over the scroll area.
|
|
11066
|
+
|
|
11067
|
+
Absent keeps the browser's scrollbars. */
|
|
11068
|
+
scrollbars?: (HelixHeadlessScrollArea["scrollbars"]) | undefined;
|
|
10228
11069
|
};
|
|
10229
11070
|
|
|
10230
|
-
export type HelixHeadlessScrollAreaVueEvents = {
|
|
11071
|
+
export type HelixHeadlessScrollAreaVueEvents = {
|
|
11072
|
+
/** The content scrolled. Sent from the host, because the viewport's own does not leave the shadow root. Does not bubble. */
|
|
11073
|
+
scroll: HelixHeadlessScrollAreaElementEvent;
|
|
11074
|
+
/** The content stopped scrolling. Sent from the host, as `scroll` is, and once for a thumb dragged across the content. Does not bubble. */
|
|
11075
|
+
scrollend: HelixHeadlessScrollAreaElementEvent;
|
|
11076
|
+
};
|
|
10231
11077
|
|
|
10232
11078
|
/** `HelixHeadlessSelect` component event */
|
|
10233
11079
|
export type HelixHeadlessSelectElementEvent<E = Event> = TypedEvent<
|
|
@@ -10246,6 +11092,9 @@ export type HelixHeadlessSelectHelixBeforeOpenElementEvent =
|
|
|
10246
11092
|
/** `helix-filter` event type */
|
|
10247
11093
|
export type HelixHeadlessSelectHelixFilterElementEvent =
|
|
10248
11094
|
HelixHeadlessSelectElementEvent<HelixFilterEvent>;
|
|
11095
|
+
/** `helix-load-more` event type */
|
|
11096
|
+
export type HelixHeadlessSelectHelixLoadMoreElementEvent =
|
|
11097
|
+
HelixHeadlessSelectElementEvent<HelixLoadMoreEvent>;
|
|
10249
11098
|
/** `toggle` event type */
|
|
10250
11099
|
export type HelixHeadlessSelectToggleElementEvent =
|
|
10251
11100
|
HelixHeadlessSelectElementEvent<ToggleEvent>;
|
|
@@ -10291,9 +11140,13 @@ hydration, or diffed by a framework, it comes back holding whatever the
|
|
|
10291
11140
|
last reader did rather than what the author wrote. `:state(open)` carries
|
|
10292
11141
|
the resolved state for stylesheets, which is what the mirror is for. */
|
|
10293
11142
|
open?: (HelixHeadlessSelect["open"]) | undefined;
|
|
10294
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
11143
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
11144
|
+
and to the `value` attribute where this one is not written, as a native
|
|
11145
|
+
control resets to the `value` it declares. */
|
|
10295
11146
|
"default-value"?: (HelixHeadlessSelect["defaultValue"]) | undefined;
|
|
10296
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
11147
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
11148
|
+
and to the `value` attribute where this one is not written, as a native
|
|
11149
|
+
control resets to the `value` it declares. */
|
|
10297
11150
|
defaultValue?: (HelixHeadlessSelect["defaultValue"]) | undefined;
|
|
10298
11151
|
/** The control's current value, which its form submits.
|
|
10299
11152
|
|
|
@@ -10387,6 +11240,8 @@ export type HelixHeadlessSelectVueEvents = {
|
|
|
10387
11240
|
"helix-before-open": HelixHeadlessSelectHelixBeforeOpenElementEvent;
|
|
10388
11241
|
/** Fired as the user types in the filter field of a `filterable` select, with the text the list is filtered by. Cancelable: cancel it to leave the list unfiltered and filter the options yourself. */
|
|
10389
11242
|
"helix-filter": HelixHeadlessSelectHelixFilterElementEvent;
|
|
11243
|
+
/** Fired once the list is scrolled within a screen of its end, once for each number of options, and not while `loading` is set. Add the next page and set `loading` while you fetch it. */
|
|
11244
|
+
"helix-load-more": HelixHeadlessSelectHelixLoadMoreElementEvent;
|
|
10390
11245
|
/** Fired after the value changes. */
|
|
10391
11246
|
input: HelixHeadlessSelectElementEvent;
|
|
10392
11247
|
/** Fired after the list opens or closes, with `newState` and `oldState`. */
|
|
@@ -10514,12 +11369,22 @@ takes the width of the row it is in. `--slider-length` is that number and
|
|
|
10514
11369
|
defaults to nine rem, so one dropped into a layout is a usable height
|
|
10515
11370
|
rather than a thumb sitting on nothing. */
|
|
10516
11371
|
orientation?: (HelixHeadlessSlider["orientation"]) | undefined;
|
|
11372
|
+
/** Where a single thumb's fill starts: `start` at `min`, `center` at the
|
|
11373
|
+
middle of the track, or `end` at `max`. Absent is `start`. A range fills
|
|
11374
|
+
between its thumbs and ignores it. */
|
|
11375
|
+
origin?: (HelixHeadlessSlider["origin"]) | undefined;
|
|
10517
11376
|
/** Adds a second thumb, so the value is a pair.
|
|
10518
11377
|
|
|
10519
11378
|
The pair is one string, `"10,50"`, which is what a form submits and what
|
|
10520
11379
|
`MixinControllerValue` already holds. `valueAsNumber` reads the lower of
|
|
10521
11380
|
the two, since a range has no single number. */
|
|
10522
11381
|
range?: (HelixHeadlessSlider["range"]) | undefined;
|
|
11382
|
+
/** How the readout joins a range's two values, with `{start}` and `{end}`
|
|
11383
|
+
filled in. Write it in the page's language, such as `{start} bis {end}`. */
|
|
11384
|
+
"range-text"?: (HelixHeadlessSlider["rangeText"]) | undefined;
|
|
11385
|
+
/** How the readout joins a range's two values, with `{start}` and `{end}`
|
|
11386
|
+
filled in. Write it in the page's language, such as `{start} bis {end}`. */
|
|
11387
|
+
rangeText?: (HelixHeadlessSlider["rangeText"]) | undefined;
|
|
10523
11388
|
/** Shows the chosen value beside the track. */
|
|
10524
11389
|
"show-value"?: (HelixHeadlessSlider["showValue"]) | undefined;
|
|
10525
11390
|
/** Shows the chosen value beside the track. */
|
|
@@ -10532,9 +11397,13 @@ such as `{value} degrees`. Empty announces the number alone. */
|
|
|
10532
11397
|
/** What a screen reader says for a thumb's value, with `{value}` filled in,
|
|
10533
11398
|
such as `{value} degrees`. Empty announces the number alone. */
|
|
10534
11399
|
valueText?: (HelixHeadlessSlider["valueText"]) | undefined;
|
|
10535
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
11400
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
11401
|
+
and to the `value` attribute where this one is not written, as a native
|
|
11402
|
+
control resets to the `value` it declares. */
|
|
10536
11403
|
"default-value"?: (HelixHeadlessSlider["defaultValue"]) | undefined;
|
|
10537
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
11404
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
11405
|
+
and to the `value` attribute where this one is not written, as a native
|
|
11406
|
+
control resets to the `value` it declares. */
|
|
10538
11407
|
defaultValue?: (HelixHeadlessSlider["defaultValue"]) | undefined;
|
|
10539
11408
|
/** The control's current value, which its form submits.
|
|
10540
11409
|
|
|
@@ -10658,6 +11527,18 @@ the accessible representation of a sparkline, and a list of the fourteen
|
|
|
10658
11527
|
numbers is not. Absent, the drawing is hidden from a screen reader rather
|
|
10659
11528
|
than announced without a name. */
|
|
10660
11529
|
label?: (HelixHeadlessSparkline["label"]) | undefined;
|
|
11530
|
+
/** The locale the readout's numbers and positions are written in, such as
|
|
11531
|
+
`de` for `1.240`.
|
|
11532
|
+
|
|
11533
|
+
Absent uses the runtime's own. A table's cells are shown as the table
|
|
11534
|
+
writes them, whatever this says. */
|
|
11535
|
+
locale?: (HelixHeadlessSparkline["locale"]) | undefined;
|
|
11536
|
+
/** Which readings take a mark of their own: `high`, `low`, or both,
|
|
11537
|
+
separated by spaces.
|
|
11538
|
+
|
|
11539
|
+
Absent marks none, and the drawing is what it was. Each mark is a part,
|
|
11540
|
+
placed at its reading, for a stylesheet to draw. */
|
|
11541
|
+
marks?: (HelixHeadlessSparkline["marks"]) | undefined;
|
|
10661
11542
|
/** What the readings are drawn as.
|
|
10662
11543
|
|
|
10663
11544
|
Absent is `area`, a line with the region beneath it washed. `line` is the
|
|
@@ -10686,6 +11567,20 @@ anywhere the fill would be noise, several of them in one box for instance.
|
|
|
10686
11567
|
This tier rather than the one above: a plot type is geometry and geometry
|
|
10687
11568
|
is markup, the same reason `curve` lives here. */
|
|
10688
11569
|
plot?: (HelixHeadlessSparkline["plot"]) | undefined;
|
|
11570
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
11571
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
11572
|
+
`locale`.
|
|
11573
|
+
|
|
11574
|
+
Set it to the words of the page's language, such as `{position} von
|
|
11575
|
+
{count}`, or to nothing to say no position. */
|
|
11576
|
+
"position-label"?: (HelixHeadlessSparkline["positionLabel"]) | undefined;
|
|
11577
|
+
/** Where a reading the keys moved to stands among the readings, said after
|
|
11578
|
+
it. `{position}` and `{count}` are replaced with the numbers, written in
|
|
11579
|
+
`locale`.
|
|
11580
|
+
|
|
11581
|
+
Set it to the words of the page's language, such as `{position} von
|
|
11582
|
+
{count}`, or to nothing to say no position. */
|
|
11583
|
+
positionLabel?: (HelixHeadlessSparkline["positionLabel"]) | undefined;
|
|
10689
11584
|
/** The numbers, separated by whitespace or by commas.
|
|
10690
11585
|
|
|
10691
11586
|
An array assigned to the property works too, which is what React 19 does
|
|
@@ -10904,6 +11799,15 @@ Reading gives where it is; writing declares it the consumer's, and
|
|
|
10904
11799
|
`default-position` seeds one this element owns. The same accessor pair
|
|
10905
11800
|
`Pagination.page` and the calendar's `month` carry. */
|
|
10906
11801
|
position?: (HelixHeadlessSplitter["position"]) | undefined;
|
|
11802
|
+
/** Where a dragged divider snaps, comma separated, as Web Awesome's split
|
|
11803
|
+
panel does: a bare number is a percentage and a length such as `240px` is
|
|
11804
|
+
measured along the splitter, so `snap="25, 50, 75"` or `snap="240px, 50"`.
|
|
11805
|
+
The arrow keys move by `step` and do not snap. */
|
|
11806
|
+
snap?: (HelixHeadlessSplitter["snap"]) | undefined;
|
|
11807
|
+
/** How close a drag has to come to a snap point to land on it, in pixels. */
|
|
11808
|
+
"snap-threshold"?: (HelixHeadlessSplitter["snapThreshold"] | `${number}`) | undefined;
|
|
11809
|
+
/** How close a drag has to come to a snap point to land on it, in pixels. */
|
|
11810
|
+
snapThreshold?: (HelixHeadlessSplitter["snapThreshold"]) | undefined;
|
|
10907
11811
|
/** How far one arrow key press moves the divider, as a percentage. */
|
|
10908
11812
|
step?: (HelixHeadlessSplitter["step"]) | undefined;
|
|
10909
11813
|
};
|
|
@@ -10941,10 +11845,9 @@ A property rather than a `Flex` around it, because the unit has to stay on
|
|
|
10941
11845
|
the value's baseline whichever way the pair goes, and only this element
|
|
10942
11846
|
knows which of its children the unit belongs to.
|
|
10943
11847
|
|
|
10944
|
-
|
|
10945
|
-
moved
|
|
10946
|
-
|
|
10947
|
-
layouts, and the pair stays the column.
|
|
11848
|
+
The name and the values are `Flex`'s, which lays out the same way. Which
|
|
11849
|
+
way a number moved is `Trend`'s `movement`. On a Stat, `up`, `down` and
|
|
11850
|
+
`neutral` are not layouts, and the pair stays the column.
|
|
10948
11851
|
|
|
10949
11852
|
**Optional rather than defaulted to `column`, which is not a style
|
|
10950
11853
|
preference.** A reflecting property with a default writes its attribute onto
|
|
@@ -10979,6 +11882,9 @@ export type HelixHeadlessStepsVueProps = {
|
|
|
10979
11882
|
A list of stages is a landmark a reader arrives at out of order, so it
|
|
10980
11883
|
needs a name of its own rather than borrowing the heading above it. */
|
|
10981
11884
|
label?: (HelixHeadlessSteps["label"]) | undefined;
|
|
11885
|
+
/** Whether a reader has to finish each stage, or pass an `optional` one,
|
|
11886
|
+
before going on to the next. */
|
|
11887
|
+
linear?: (HelixHeadlessSteps["linear"]) | undefined;
|
|
10982
11888
|
/** Which way the steps run.
|
|
10983
11889
|
|
|
10984
11890
|
Absent is a row, which is what a form header wants, with each name under
|
|
@@ -11019,6 +11925,10 @@ Ignored once `active` is written. */
|
|
|
11019
11925
|
|
|
11020
11926
|
Ignored once `active` is written. */
|
|
11021
11927
|
defaultActive?: (HelixHeadlessSteps["defaultActive"]) | undefined;
|
|
11928
|
+
/** A function that answers whether a stage is valid, asked about the stage a
|
|
11929
|
+
reader is on before they move forward from it. Return `false` to keep them
|
|
11930
|
+
there. Not asked of an `optional` stage, nor for a move back. */
|
|
11931
|
+
validate?: (HelixHeadlessSteps["validate"]) | undefined;
|
|
11022
11932
|
};
|
|
11023
11933
|
|
|
11024
11934
|
export type HelixHeadlessStepsVueEvents = {
|
|
@@ -11042,10 +11952,19 @@ export type HelixHeadlessStepHelixSelectElementEvent =
|
|
|
11042
11952
|
export type HelixHeadlessStepVueProps = {
|
|
11043
11953
|
/** Whether this stage is finished. */
|
|
11044
11954
|
complete?: (HelixHeadlessStep["complete"]) | undefined;
|
|
11955
|
+
/** The words that tell a screen reader the stage is finished. Translate it
|
|
11956
|
+
with the page. */
|
|
11957
|
+
"complete-label"?: (HelixHeadlessStep["completeLabel"]) | undefined;
|
|
11958
|
+
/** The words that tell a screen reader the stage is finished. Translate it
|
|
11959
|
+
with the page. */
|
|
11960
|
+
completeLabel?: (HelixHeadlessStep["completeLabel"]) | undefined;
|
|
11045
11961
|
/** Whether this is the current stage. */
|
|
11046
11962
|
current?: (HelixHeadlessStep["current"]) | undefined;
|
|
11047
11963
|
/** Whether the stage is disabled, so the user cannot go to it. */
|
|
11048
11964
|
disabled?: (HelixHeadlessStep["disabled"]) | undefined;
|
|
11965
|
+
/** Whether a reader may pass the stage without finishing it, in a sequence
|
|
11966
|
+
with `linear`. Ark UI's skippable step. */
|
|
11967
|
+
optional?: (HelixHeadlessStep["optional"]) | undefined;
|
|
11049
11968
|
/** The value the step sends in `helix-select`. */
|
|
11050
11969
|
value?: (HelixHeadlessStep["value"]) | undefined;
|
|
11051
11970
|
};
|
|
@@ -11076,9 +11995,13 @@ Not reflected: the attribute is the consumer's input and stays as they
|
|
|
11076
11995
|
wrote it, and `:state(checked)` carries the resolved state for
|
|
11077
11996
|
stylesheets. */
|
|
11078
11997
|
checked?: (HelixHeadlessSwitch["checked"]) | undefined;
|
|
11079
|
-
/** Whether the control starts checked. A form reset returns it to this state
|
|
11998
|
+
/** Whether the control starts checked. A form reset returns it to this state,
|
|
11999
|
+
and to the `checked` attribute where this one is not written, as a native
|
|
12000
|
+
checkbox resets to the `checked` it declares. */
|
|
11080
12001
|
"default-checked"?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
|
|
11081
|
-
/** Whether the control starts checked. A form reset returns it to this state
|
|
12002
|
+
/** Whether the control starts checked. A form reset returns it to this state,
|
|
12003
|
+
and to the `checked` attribute where this one is not written, as a native
|
|
12004
|
+
checkbox resets to the `checked` it declares. */
|
|
11082
12005
|
defaultChecked?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
|
|
11083
12006
|
/** Whether a reader can see and focus the control and cannot change it. A
|
|
11084
12007
|
read-only control still submits its value.
|
|
@@ -11185,6 +12108,9 @@ export type HelixHeadlessTableColumnElementEvent<E = Event> = TypedEvent<
|
|
|
11185
12108
|
/** `helix-before-resize` event type */
|
|
11186
12109
|
export type HelixHeadlessTableColumnHelixBeforeResizeElementEvent =
|
|
11187
12110
|
HelixHeadlessTableColumnElementEvent<HelixBeforeResizeEvent>;
|
|
12111
|
+
/** `helix-resized` event type */
|
|
12112
|
+
export type HelixHeadlessTableColumnHelixResizedElementEvent =
|
|
12113
|
+
HelixHeadlessTableColumnElementEvent<HelixResizedEvent>;
|
|
11188
12114
|
|
|
11189
12115
|
export type HelixHeadlessTableColumnVueProps = {
|
|
11190
12116
|
/** The key this column reads out of a row.
|
|
@@ -11226,6 +12152,22 @@ replaced with the heading text. */
|
|
|
11226
12152
|
/** The accessible name of the separator that resizes the column. `{name}` is
|
|
11227
12153
|
replaced with the heading text. */
|
|
11228
12154
|
resizeLabel?: (HelixHeadlessTableColumn["resizeLabel"]) | undefined;
|
|
12155
|
+
/** Makes this column's cells the headers of their rows, in `DataTable`.
|
|
12156
|
+
|
|
12157
|
+
A screen reader moving along a row or down a column names the row by its
|
|
12158
|
+
row header, so the cell that identifies a row, a file's name say, is the
|
|
12159
|
+
one to mark. Where no column sets it, `DataTable` makes the first column
|
|
12160
|
+
with a `field` the row header. A `Table`'s cells are your markup, so there
|
|
12161
|
+
a cell is a row header through its own `header` attribute. */
|
|
12162
|
+
"row-header"?: (HelixHeadlessTableColumn["rowHeader"]) | undefined;
|
|
12163
|
+
/** Makes this column's cells the headers of their rows, in `DataTable`.
|
|
12164
|
+
|
|
12165
|
+
A screen reader moving along a row or down a column names the row by its
|
|
12166
|
+
row header, so the cell that identifies a row, a file's name say, is the
|
|
12167
|
+
one to mark. Where no column sets it, `DataTable` makes the first column
|
|
12168
|
+
with a `field` the row header. A `Table`'s cells are your markup, so there
|
|
12169
|
+
a cell is a row header through its own `header` attribute. */
|
|
12170
|
+
rowHeader?: (HelixHeadlessTableColumn["rowHeader"]) | undefined;
|
|
11229
12171
|
/** Whether the table can be sorted by this column.
|
|
11230
12172
|
|
|
11231
12173
|
Ignored without a `field`, and silently: a column with nothing to sort by
|
|
@@ -11353,6 +12295,8 @@ correct default: the raw value is what an API sorted by. */
|
|
|
11353
12295
|
export type HelixHeadlessTableColumnVueEvents = {
|
|
11354
12296
|
/** The column is about to be resized, with the requested width. Cancelable: cancel it to keep the current width. */
|
|
11355
12297
|
"helix-before-resize": HelixHeadlessTableColumnHelixBeforeResizeElementEvent;
|
|
12298
|
+
/** Fired after the column is resized, with the new width. */
|
|
12299
|
+
"helix-resized": HelixHeadlessTableColumnHelixResizedElementEvent;
|
|
11356
12300
|
};
|
|
11357
12301
|
|
|
11358
12302
|
/** `HelixHeadlessTable` component event */
|
|
@@ -11360,9 +12304,18 @@ export type HelixHeadlessTableElementEvent<E = Event> = TypedEvent<
|
|
|
11360
12304
|
HelixHeadlessTable,
|
|
11361
12305
|
E
|
|
11362
12306
|
>;
|
|
12307
|
+
/** `helix-select` event type */
|
|
12308
|
+
export type HelixHeadlessTableHelixSelectElementEvent =
|
|
12309
|
+
HelixHeadlessTableElementEvent<HelixSelectEvent>;
|
|
12310
|
+
/** `helix-selected` event type */
|
|
12311
|
+
export type HelixHeadlessTableHelixSelectedElementEvent =
|
|
12312
|
+
HelixHeadlessTableElementEvent<HelixSelectedEvent>;
|
|
11363
12313
|
/** `helix-sort` event type */
|
|
11364
12314
|
export type HelixHeadlessTableHelixSortElementEvent =
|
|
11365
12315
|
HelixHeadlessTableElementEvent<HelixSortEvent>;
|
|
12316
|
+
/** `helix-sorted` event type */
|
|
12317
|
+
export type HelixHeadlessTableHelixSortedElementEvent =
|
|
12318
|
+
HelixHeadlessTableElementEvent<HelixSortedEvent>;
|
|
11366
12319
|
|
|
11367
12320
|
export type HelixHeadlessTableVueProps = {
|
|
11368
12321
|
/** The word for an ascending sort, in `sorted-label`. */
|
|
@@ -11398,6 +12351,12 @@ and a list here would be a second way to say what that says. This table's
|
|
|
11398
12351
|
cells are markup, and a table written as rows of cells with no column
|
|
11399
12352
|
declared in it has nowhere else to be sized from. */
|
|
11400
12353
|
columns?: (HelixHeadlessTable["columns"]) | undefined;
|
|
12354
|
+
/** The keys selected at the start, separated by commas. Used until `selected`
|
|
12355
|
+
is set. */
|
|
12356
|
+
"default-selected"?: (HelixHeadlessTable["defaultSelected"]) | undefined;
|
|
12357
|
+
/** The keys selected at the start, separated by commas. Used until `selected`
|
|
12358
|
+
is set. */
|
|
12359
|
+
defaultSelected?: (HelixHeadlessTable["defaultSelected"]) | undefined;
|
|
11401
12360
|
/** The starting sort order, used until `sort` is set. */
|
|
11402
12361
|
"default-sort"?: (HelixHeadlessTable["defaultSort"]) | undefined;
|
|
11403
12362
|
/** The starting sort order, used until `sort` is set. */
|
|
@@ -11411,6 +12370,31 @@ declared in it has nowhere else to be sized from. */
|
|
|
11411
12370
|
An `aria-label` or `aria-labelledby` on the host names the table too, and
|
|
11412
12371
|
wins over this. */
|
|
11413
12372
|
label?: (HelixHeadlessTable["label"]) | undefined;
|
|
12373
|
+
/** Adds a column of checkboxes for selecting rows. Each row is known by its
|
|
12374
|
+
`value`, and by its place among the rows as written where it has none. */
|
|
12375
|
+
selectable?: (HelixHeadlessTable["selectable"]) | undefined;
|
|
12376
|
+
/** The name of the checkbox in the heading that selects every row. */
|
|
12377
|
+
"select-all-label"?: (HelixHeadlessTable["selectAllLabel"]) | undefined;
|
|
12378
|
+
/** The name of the checkbox in the heading that selects every row. */
|
|
12379
|
+
selectAllLabel?: (HelixHeadlessTable["selectAllLabel"]) | undefined;
|
|
12380
|
+
/** The keys of the selected rows, separated by commas.
|
|
12381
|
+
|
|
12382
|
+
A reader's press fires `helix-select` first, and refusing it leaves the
|
|
12383
|
+
selection as it was. `default-selected` seeds a selection this element
|
|
12384
|
+
then owns. */
|
|
12385
|
+
selected?: (HelixHeadlessTable["selected"]) | undefined;
|
|
12386
|
+
/** What screen readers hear when the chosen rows change. `{count}` is how many
|
|
12387
|
+
rows are chosen. */
|
|
12388
|
+
"selected-label"?: (HelixHeadlessTable["selectedLabel"]) | undefined;
|
|
12389
|
+
/** What screen readers hear when the chosen rows change. `{count}` is how many
|
|
12390
|
+
rows are chosen. */
|
|
12391
|
+
selectedLabel?: (HelixHeadlessTable["selectedLabel"]) | undefined;
|
|
12392
|
+
/** The name of a row's checkbox. `{row}` is replaced with the words of the
|
|
12393
|
+
row's first cell. */
|
|
12394
|
+
"select-row-label"?: (HelixHeadlessTable["selectRowLabel"]) | undefined;
|
|
12395
|
+
/** The name of a row's checkbox. `{row}` is replaced with the words of the
|
|
12396
|
+
row's first cell. */
|
|
12397
|
+
selectRowLabel?: (HelixHeadlessTable["selectRowLabel"]) | undefined;
|
|
11414
12398
|
/** The sort order, as `field:direction`, where `field` is a sortable column's
|
|
11415
12399
|
`field`.
|
|
11416
12400
|
|
|
@@ -11446,11 +12430,21 @@ say that without the component knowing what a row looks like. */
|
|
|
11446
12430
|
};
|
|
11447
12431
|
|
|
11448
12432
|
export type HelixHeadlessTableVueEvents = {
|
|
12433
|
+
/** The selection is about to change. The event carries every selected key, separated by commas. Cancelable: cancel it to keep the current selection. */
|
|
12434
|
+
"helix-select": HelixHeadlessTableHelixSelectElementEvent;
|
|
12435
|
+
/** Fired after the selection changes, with every selected key, separated by commas. */
|
|
12436
|
+
"helix-selected": HelixHeadlessTableHelixSelectedElementEvent;
|
|
11449
12437
|
/** A different sort order was requested, as `field:direction`, or empty for the order the rows were written in. Cancelable: cancel it to keep the current order. */
|
|
11450
12438
|
"helix-sort": HelixHeadlessTableHelixSortElementEvent;
|
|
12439
|
+
/** Fired after the sort order changes, with the new order. */
|
|
12440
|
+
"helix-sorted": HelixHeadlessTableHelixSortedElementEvent;
|
|
11451
12441
|
};
|
|
11452
12442
|
|
|
11453
|
-
export type HelixHeadlessTableRowVueProps = {
|
|
12443
|
+
export type HelixHeadlessTableRowVueProps = {
|
|
12444
|
+
/** The key the table's `selected` lists this row by. Left empty, the row is
|
|
12445
|
+
known by its place among the rows as written. */
|
|
12446
|
+
value?: (HelixHeadlessTableRow["value"]) | undefined;
|
|
12447
|
+
};
|
|
11454
12448
|
|
|
11455
12449
|
export type HelixHeadlessTableRowVueEvents = {};
|
|
11456
12450
|
|
|
@@ -11466,10 +12460,9 @@ because it is coordination between elements rather than anything a consumer
|
|
|
11466
12460
|
writes: the tab already says it.
|
|
11467
12461
|
|
|
11468
12462
|
A string and not a reference: an IDREF resolves only in the tree it is
|
|
11469
|
-
written in, and
|
|
11470
|
-
|
|
11471
|
-
|
|
11472
|
-
anyway. */
|
|
12463
|
+
written in, and the tab's control is inside the tab's shadow root, which no
|
|
12464
|
+
reference from the light DOM can reach. `aria-label` on a `tabpanel` is how
|
|
12465
|
+
the pattern names one anyway. */
|
|
11473
12466
|
label?: (HelixHeadlessTabPanel["label"]) | undefined;
|
|
11474
12467
|
};
|
|
11475
12468
|
|
|
@@ -11503,6 +12496,11 @@ Automatic is the default because showing a panel is usually cheap. Set this
|
|
|
11503
12496
|
where it is not, so a reader arrowing past four tabs does not load four
|
|
11504
12497
|
panels on the way. */
|
|
11505
12498
|
manual?: (HelixHeadlessTabs["manual"]) | undefined;
|
|
12499
|
+
/** The direction the tabs run. `vertical` sets them in a column beside the
|
|
12500
|
+
panels and tells a screen reader the list is vertical.
|
|
12501
|
+
|
|
12502
|
+
Optional, so the resting row writes no attribute onto the host. */
|
|
12503
|
+
orientation?: (HelixHeadlessTabs["orientation"]) | undefined;
|
|
11506
12504
|
/** How the row of tabs is drawn.
|
|
11507
12505
|
|
|
11508
12506
|
Unset is a raised pill on the selected tab with nothing behind the row,
|
|
@@ -11564,6 +12562,13 @@ export type HelixHeadlessTabHelixSelectElementEvent =
|
|
|
11564
12562
|
HelixHeadlessTabElementEvent<HelixSelectEvent>;
|
|
11565
12563
|
|
|
11566
12564
|
export type HelixHeadlessTabVueProps = {
|
|
12565
|
+
/** The URL the tab links to. Setting it renders the tab as a link, for a set
|
|
12566
|
+
of tabs that are pages of a site. */
|
|
12567
|
+
href?: (HelixHeadlessTab["href"]) | undefined;
|
|
12568
|
+
/** The link's `rel`, for a tab with an `href`. */
|
|
12569
|
+
rel?: (HelixHeadlessTab["rel"]) | undefined;
|
|
12570
|
+
/** Where the link opens, such as `_blank`, for a tab with an `href`. */
|
|
12571
|
+
target?: (HelixHeadlessTab["target"]) | undefined;
|
|
11567
12572
|
/** Whether the item is disabled and cannot be chosen. */
|
|
11568
12573
|
disabled?: (HelixHeadlessTab["disabled"]) | undefined;
|
|
11569
12574
|
/** Whether the item is selected.
|
|
@@ -11686,6 +12691,9 @@ export type HelixHeadlessTextareaElementEvent<E = Event> = TypedEvent<
|
|
|
11686
12691
|
/** `helix-before-change` event type */
|
|
11687
12692
|
export type HelixHeadlessTextareaHelixBeforeChangeElementEvent =
|
|
11688
12693
|
HelixHeadlessTextareaElementEvent<HelixBeforeChangeEvent>;
|
|
12694
|
+
/** `helix-clear` event type */
|
|
12695
|
+
export type HelixHeadlessTextareaHelixClearElementEvent =
|
|
12696
|
+
HelixHeadlessTextareaElementEvent<HelixClearEvent>;
|
|
11689
12697
|
|
|
11690
12698
|
export type HelixHeadlessTextareaVueProps = {
|
|
11691
12699
|
/** What the browser can autofill in the field, as a standard `autocomplete`
|
|
@@ -11698,6 +12706,12 @@ a token like `email` or `bday` to ask for autofill, or to `off` to refuse. */
|
|
|
11698
12706
|
"auto-grow"?: (HelixHeadlessTextarea["autoGrow"]) | undefined;
|
|
11699
12707
|
/** Grows the box to fit its content, so it does not scroll. */
|
|
11700
12708
|
autoGrow?: (HelixHeadlessTextarea["autoGrow"]) | undefined;
|
|
12709
|
+
/** Draws a button that empties the field while it holds text. */
|
|
12710
|
+
clearable?: (HelixHeadlessTextarea["clearable"]) | undefined;
|
|
12711
|
+
/** The accessible name of the clear button, which shows only an icon. */
|
|
12712
|
+
"clear-label"?: (HelixHeadlessTextarea["clearLabel"]) | undefined;
|
|
12713
|
+
/** The accessible name of the clear button, which shows only an icon. */
|
|
12714
|
+
clearLabel?: (HelixHeadlessTextarea["clearLabel"]) | undefined;
|
|
11701
12715
|
/** How many characters wide the box is, when the layout does not set its
|
|
11702
12716
|
width.
|
|
11703
12717
|
|
|
@@ -11762,9 +12776,13 @@ Not a label: it goes when typing starts. */
|
|
|
11762
12776
|
/** How the browser wraps the text, and whether the breaks are submitted with
|
|
11763
12777
|
it. */
|
|
11764
12778
|
wrap?: (HelixHeadlessTextarea["wrap"]) | undefined;
|
|
11765
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
12779
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
12780
|
+
and to the `value` attribute where this one is not written, as a native
|
|
12781
|
+
control resets to the `value` it declares. */
|
|
11766
12782
|
"default-value"?: (HelixHeadlessTextarea["defaultValue"]) | undefined;
|
|
11767
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
12783
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
12784
|
+
and to the `value` attribute where this one is not written, as a native
|
|
12785
|
+
control resets to the `value` it declares. */
|
|
11768
12786
|
defaultValue?: (HelixHeadlessTextarea["defaultValue"]) | undefined;
|
|
11769
12787
|
/** The control's current value, which its form submits.
|
|
11770
12788
|
|
|
@@ -11845,6 +12863,10 @@ which is where an empty field's caret would be anyway. */
|
|
|
11845
12863
|
selectionEnd?: (HelixHeadlessTextarea["selectionEnd"]) | undefined;
|
|
11846
12864
|
/** Where the selection starts, as an offset into the value. */
|
|
11847
12865
|
selectionStart?: (HelixHeadlessTextarea["selectionStart"]) | undefined;
|
|
12866
|
+
/** Your own rule for the value, run on every change once the browser finds
|
|
12867
|
+
nothing wrong. Return a message, or a list of them, to mark the field
|
|
12868
|
+
invalid, and `true`, `null`, or nothing to accept the value. */
|
|
12869
|
+
validate?: (HelixHeadlessTextarea["validate"]) | undefined;
|
|
11848
12870
|
};
|
|
11849
12871
|
|
|
11850
12872
|
export type HelixHeadlessTextareaVueEvents = {
|
|
@@ -11852,6 +12874,8 @@ export type HelixHeadlessTextareaVueEvents = {
|
|
|
11852
12874
|
change: HelixHeadlessTextareaElementEvent;
|
|
11853
12875
|
/** Fired as the text changes, and cancelable. */
|
|
11854
12876
|
"helix-before-change": HelixHeadlessTextareaHelixBeforeChangeElementEvent;
|
|
12877
|
+
/** Fired after the clear button has emptied the field, after `input` and `change`. */
|
|
12878
|
+
"helix-clear": HelixHeadlessTextareaHelixClearElementEvent;
|
|
11855
12879
|
/** Fired after the value changes. */
|
|
11856
12880
|
input: HelixHeadlessTextareaElementEvent;
|
|
11857
12881
|
};
|
|
@@ -12084,9 +13108,13 @@ as `+3`, does not say what it does. */
|
|
|
12084
13108
|
"max-tags"?: (HelixHeadlessTimeInput["maxTags"] | `${number}`) | undefined;
|
|
12085
13109
|
/** How many tokens to show before the rest become a count. */
|
|
12086
13110
|
maxTags?: (HelixHeadlessTimeInput["maxTags"]) | undefined;
|
|
12087
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
13111
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
13112
|
+
and to the `value` attribute where this one is not written, as a native
|
|
13113
|
+
control resets to the `value` it declares. */
|
|
12088
13114
|
"default-value"?: (HelixHeadlessTimeInput["defaultValue"]) | undefined;
|
|
12089
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
13115
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
13116
|
+
and to the `value` attribute where this one is not written, as a native
|
|
13117
|
+
control resets to the `value` it declares. */
|
|
12090
13118
|
defaultValue?: (HelixHeadlessTimeInput["defaultValue"]) | undefined;
|
|
12091
13119
|
/** The control's current value, which its form submits.
|
|
12092
13120
|
|
|
@@ -12237,9 +13265,15 @@ Absent is the locale's own, which is right for a reader's own form. Set it
|
|
|
12237
13265
|
where every reader must see the same clock whatever their language, as a
|
|
12238
13266
|
timetable does. The value is `HH:mm` on twenty-four hours either way. */
|
|
12239
13267
|
hourCycle?: (HelixHeadlessTimePicker["hourCycle"]) | undefined;
|
|
12240
|
-
/** What the wheel of hours is called, read by screen readers.
|
|
13268
|
+
/** What the wheel of hours is called, read by screen readers.
|
|
13269
|
+
|
|
13270
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "Hour" in
|
|
13271
|
+
English, "Stunde" in German. */
|
|
12241
13272
|
"hour-label"?: (HelixHeadlessTimePicker["hourLabel"]) | undefined;
|
|
12242
|
-
/** What the wheel of hours is called, read by screen readers.
|
|
13273
|
+
/** What the wheel of hours is called, read by screen readers.
|
|
13274
|
+
|
|
13275
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "Hour" in
|
|
13276
|
+
English, "Stunde" in German. */
|
|
12243
13277
|
hourLabel?: (HelixHeadlessTimePicker["hourLabel"]) | undefined;
|
|
12244
13278
|
/** Whether the current selection fails validation.
|
|
12245
13279
|
|
|
@@ -12266,16 +13300,28 @@ closes on a time. */
|
|
|
12266
13300
|
/** Latest time offered, as `HH:mm`. */
|
|
12267
13301
|
max?: (HelixHeadlessTimePicker["max"]) | undefined;
|
|
12268
13302
|
/** What the wheel of the half of the day is called, read by screen readers.
|
|
12269
|
-
Its two options are written as the locale writes them, such as AM and PM.
|
|
13303
|
+
Its two options are written as the locale writes them, such as AM and PM.
|
|
13304
|
+
|
|
13305
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "AM/PM" in
|
|
13306
|
+
English, "Tageshälfte" in German. */
|
|
12270
13307
|
"meridiem-label"?: (HelixHeadlessTimePicker["meridiemLabel"]) | undefined;
|
|
12271
13308
|
/** What the wheel of the half of the day is called, read by screen readers.
|
|
12272
|
-
Its two options are written as the locale writes them, such as AM and PM.
|
|
13309
|
+
Its two options are written as the locale writes them, such as AM and PM.
|
|
13310
|
+
|
|
13311
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "AM/PM" in
|
|
13312
|
+
English, "Tageshälfte" in German. */
|
|
12273
13313
|
meridiemLabel?: (HelixHeadlessTimePicker["meridiemLabel"]) | undefined;
|
|
12274
13314
|
/** Earliest time offered, as `HH:mm`. */
|
|
12275
13315
|
min?: (HelixHeadlessTimePicker["min"]) | undefined;
|
|
12276
|
-
/** What the wheel of minutes is called, read by screen readers.
|
|
13316
|
+
/** What the wheel of minutes is called, read by screen readers.
|
|
13317
|
+
|
|
13318
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "Minute" in
|
|
13319
|
+
English and German, "分" in Japanese. */
|
|
12277
13320
|
"minute-label"?: (HelixHeadlessTimePicker["minuteLabel"]) | undefined;
|
|
12278
|
-
/** What the wheel of minutes is called, read by screen readers.
|
|
13321
|
+
/** What the wheel of minutes is called, read by screen readers.
|
|
13322
|
+
|
|
13323
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "Minute" in
|
|
13324
|
+
English and German, "分" in Japanese. */
|
|
12279
13325
|
minuteLabel?: (HelixHeadlessTimePicker["minuteLabel"]) | undefined;
|
|
12280
13326
|
/** How many times can be held at once.
|
|
12281
13327
|
|
|
@@ -12333,9 +13379,15 @@ else set needs. */
|
|
|
12333
13379
|
readOnly?: (HelixHeadlessTimePicker["readOnly"]) | undefined;
|
|
12334
13380
|
/** Stops the form from submitting while no time is chosen. */
|
|
12335
13381
|
required?: (HelixHeadlessTimePicker["required"]) | undefined;
|
|
12336
|
-
/** What the wheel of seconds is called, read by screen readers.
|
|
13382
|
+
/** What the wheel of seconds is called, read by screen readers.
|
|
13383
|
+
|
|
13384
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "Second" in
|
|
13385
|
+
English, "Sekunde" in German. */
|
|
12337
13386
|
"second-label"?: (HelixHeadlessTimePicker["secondLabel"]) | undefined;
|
|
12338
|
-
/** What the wheel of seconds is called, read by screen readers.
|
|
13387
|
+
/** What the wheel of seconds is called, read by screen readers.
|
|
13388
|
+
|
|
13389
|
+
Absent is the locale's own word, from `Intl.DisplayNames`: "Second" in
|
|
13390
|
+
English, "Sekunde" in German. */
|
|
12339
13391
|
secondLabel?: (HelixHeadlessTimePicker["secondLabel"]) | undefined;
|
|
12340
13392
|
/** Whether times carry their seconds.
|
|
12341
13393
|
|
|
@@ -12390,9 +13442,13 @@ not touch, and React reads that as a hydration mismatch. The absent
|
|
|
12390
13442
|
attribute *is* the list, which the stylesheet reads as the base rule, so
|
|
12391
13443
|
only the departure has to be named. */
|
|
12392
13444
|
variant?: (HelixHeadlessTimePicker["variant"]) | undefined;
|
|
12393
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
13445
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
13446
|
+
and to the `value` attribute where this one is not written, as a native
|
|
13447
|
+
control resets to the `value` it declares. */
|
|
12394
13448
|
"default-value"?: (HelixHeadlessTimePicker["defaultValue"]) | undefined;
|
|
12395
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
13449
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
13450
|
+
and to the `value` attribute where this one is not written, as a native
|
|
13451
|
+
control resets to the `value` it declares. */
|
|
12396
13452
|
defaultValue?: (HelixHeadlessTimePicker["defaultValue"]) | undefined;
|
|
12397
13453
|
/** The control's current value, which its form submits.
|
|
12398
13454
|
|
|
@@ -12448,6 +13504,19 @@ export type HelixHeadlessTimePickerVueEvents = {
|
|
|
12448
13504
|
input: HelixHeadlessTimePickerElementEvent;
|
|
12449
13505
|
};
|
|
12450
13506
|
|
|
13507
|
+
export type HelixHeadlessTimelineGroupVueProps = {
|
|
13508
|
+
/** The level of the group's heading, from 1 to 6. */
|
|
13509
|
+
"heading-level"?: (HelixHeadlessTimelineGroup["headingLevel"] | `${number}`) | undefined;
|
|
13510
|
+
/** The level of the group's heading, from 1 to 6. */
|
|
13511
|
+
headingLevel?: (HelixHeadlessTimelineGroup["headingLevel"]) | undefined;
|
|
13512
|
+
/** The heading, when it is plain text, such as "Today".
|
|
13513
|
+
|
|
13514
|
+
The fallback of the `heading` slot, so slotted content replaces it. */
|
|
13515
|
+
label?: (HelixHeadlessTimelineGroup["label"]) | undefined;
|
|
13516
|
+
};
|
|
13517
|
+
|
|
13518
|
+
export type HelixHeadlessTimelineGroupVueEvents = {};
|
|
13519
|
+
|
|
12451
13520
|
export type HelixHeadlessTimelineItemVueProps = {
|
|
12452
13521
|
/** When it happened, in machine-readable form. Setting it wraps the time in a
|
|
12453
13522
|
`<time>` element.
|
|
@@ -12630,9 +13699,13 @@ as a toolbar of buttons with `aria-pressed`.
|
|
|
12630
13699
|
|
|
12631
13700
|
Optional, so the attribute is absent until a consumer writes it. */
|
|
12632
13701
|
selectionMode?: (HelixHeadlessToggleGroup["selectionMode"]) | undefined;
|
|
12633
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
13702
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
13703
|
+
and to the `value` attribute where this one is not written, as a native
|
|
13704
|
+
control resets to the `value` it declares. */
|
|
12634
13705
|
"default-value"?: (HelixHeadlessToggleGroup["defaultValue"]) | undefined;
|
|
12635
|
-
/** The value the control starts with. A form reset returns it to this value
|
|
13706
|
+
/** The value the control starts with. A form reset returns it to this value,
|
|
13707
|
+
and to the `value` attribute where this one is not written, as a native
|
|
13708
|
+
control resets to the `value` it declares. */
|
|
12636
13709
|
defaultValue?: (HelixHeadlessToggleGroup["defaultValue"]) | undefined;
|
|
12637
13710
|
/** The control's current value, which its form submits.
|
|
12638
13711
|
|
|
@@ -12801,6 +13874,12 @@ and wins over this. */
|
|
|
12801
13874
|
label?: (HelixHeadlessToolbar["label"]) | undefined;
|
|
12802
13875
|
/** The direction the arrow keys move focus in. */
|
|
12803
13876
|
orientation?: (HelixHeadlessToolbar["orientation"]) | undefined;
|
|
13877
|
+
/** Whether the arrow keys stop at the first and the last control. Unset, they
|
|
13878
|
+
wrap around from one end to the other. */
|
|
13879
|
+
"stop-at-ends"?: (HelixHeadlessToolbar["stopAtEnds"]) | undefined;
|
|
13880
|
+
/** Whether the arrow keys stop at the first and the last control. Unset, they
|
|
13881
|
+
wrap around from one end to the other. */
|
|
13882
|
+
stopAtEnds?: (HelixHeadlessToolbar["stopAtEnds"]) | undefined;
|
|
12804
13883
|
};
|
|
12805
13884
|
|
|
12806
13885
|
export type HelixHeadlessToolbarVueEvents = {};
|
|
@@ -12833,9 +13912,13 @@ Without one, sweeping across a row of controls flashes a tooltip for each
|
|
|
12833
13912
|
of them, which is noise rather than help. Focus opens with no delay: a
|
|
12834
13913
|
keyboard reader arriving on a control has already committed to it. */
|
|
12835
13914
|
delay?: (HelixHeadlessTooltip["delay"]) | undefined;
|
|
12836
|
-
/** How long the bubble stays after the pointer leaves
|
|
13915
|
+
/** How long the bubble stays after the pointer leaves the trigger or the
|
|
13916
|
+
bubble, in milliseconds: the close delay. It is the time a reader has to
|
|
13917
|
+
cross the gap onto the bubble. */
|
|
12837
13918
|
"delay-out"?: (HelixHeadlessTooltip["delayOut"] | `${number}`) | undefined;
|
|
12838
|
-
/** How long the bubble stays after the pointer leaves
|
|
13919
|
+
/** How long the bubble stays after the pointer leaves the trigger or the
|
|
13920
|
+
bubble, in milliseconds: the close delay. It is the time a reader has to
|
|
13921
|
+
cross the gap onto the bubble. */
|
|
12839
13922
|
delayOut?: (HelixHeadlessTooltip["delayOut"]) | undefined;
|
|
12840
13923
|
/** Stops the tooltip from showing. */
|
|
12841
13924
|
disabled?: (HelixHeadlessTooltip["disabled"]) | undefined;
|
|
@@ -12858,6 +13941,11 @@ through as attributes. Both paths reach the same place through Lit, so
|
|
|
12858
13941
|
nothing is broken by it; a `[for]` selector would find nothing, which is
|
|
12859
13942
|
why this does not reflect and nothing styles on it. */
|
|
12860
13943
|
for?: (HelixHeadlessTooltip["for"]) | undefined;
|
|
13944
|
+
/** Whether the pointer can move onto the bubble and the bubble stays, so a
|
|
13945
|
+
reader can read it under a magnifier or select its words, as WCAG 1.4.13
|
|
13946
|
+
asks. `hoverable="false"` hides the bubble once the pointer reaches it,
|
|
13947
|
+
for a bubble that covers something a reader moves on to. */
|
|
13948
|
+
hoverable?: (HelixHeadlessTooltip["hoverable"]) | undefined;
|
|
12861
13949
|
/** The space between the trigger and the tip of the bubble, in pixels.
|
|
12862
13950
|
|
|
12863
13951
|
**Measured from the point, which is what the arrow being back changed.**
|
|
@@ -12967,6 +14055,9 @@ export type HelixHeadlessTourHelixCompleteElementEvent =
|
|
|
12967
14055
|
/** `helix-tour-ask` event type */
|
|
12968
14056
|
export type HelixHeadlessTourHelixTourAskElementEvent =
|
|
12969
14057
|
HelixHeadlessTourElementEvent<HelixTourAskEvent>;
|
|
14058
|
+
/** `helix-tour-status` event type */
|
|
14059
|
+
export type HelixHeadlessTourHelixTourStatusElementEvent =
|
|
14060
|
+
HelixHeadlessTourElementEvent<HelixTourStatusEvent>;
|
|
12970
14061
|
/** `toggle` event type */
|
|
12971
14062
|
export type HelixHeadlessTourToggleElementEvent =
|
|
12972
14063
|
HelixHeadlessTourElementEvent<ToggleEvent>;
|
|
@@ -13049,6 +14140,8 @@ export type HelixHeadlessTourVueEvents = {
|
|
|
13049
14140
|
"helix-complete": HelixHeadlessTourHelixCompleteElementEvent;
|
|
13050
14141
|
/** Fired when a stop's control is pressed to move the tour. The stop sends it, and the tour handles it. */
|
|
13051
14142
|
"helix-tour-ask": HelixHeadlessTourHelixTourAskElementEvent;
|
|
14143
|
+
/** Fired when the tour starts waiting at a `wait` stop, is skipped, or is completed, with the stop's index and `detail.status` saying which. */
|
|
14144
|
+
"helix-tour-status": HelixHeadlessTourHelixTourStatusElementEvent;
|
|
13052
14145
|
/** Sent when the tour starts or ends, with `newState` and `oldState`. */
|
|
13053
14146
|
toggle: HelixHeadlessTourToggleElementEvent;
|
|
13054
14147
|
};
|
|
@@ -13125,6 +14218,9 @@ export type HelixHeadlessTreeItemHelixBeforeCloseElementEvent =
|
|
|
13125
14218
|
/** `helix-before-open` event type */
|
|
13126
14219
|
export type HelixHeadlessTreeItemHelixBeforeOpenElementEvent =
|
|
13127
14220
|
HelixHeadlessTreeItemElementEvent<HelixBeforeOpenEvent>;
|
|
14221
|
+
/** `helix-load` event type */
|
|
14222
|
+
export type HelixHeadlessTreeItemHelixLoadElementEvent =
|
|
14223
|
+
HelixHeadlessTreeItemElementEvent<HelixLoadEvent>;
|
|
13128
14224
|
/** `helix-select` event type */
|
|
13129
14225
|
export type HelixHeadlessTreeItemHelixSelectElementEvent =
|
|
13130
14226
|
HelixHeadlessTreeItemElementEvent<HelixSelectEvent>;
|
|
@@ -13133,12 +14229,20 @@ export type HelixHeadlessTreeItemToggleElementEvent =
|
|
|
13133
14229
|
HelixHeadlessTreeItemElementEvent<ToggleEvent>;
|
|
13134
14230
|
|
|
13135
14231
|
export type HelixHeadlessTreeItemVueProps = {
|
|
14232
|
+
/** Whether the item cannot be chosen, opened or followed. The arrow keys still
|
|
14233
|
+
reach it, so a reader knows it is there. */
|
|
14234
|
+
disabled?: (HelixHeadlessTreeItem["disabled"]) | undefined;
|
|
13136
14235
|
/** The URL this node links to. Setting it makes the row a link.
|
|
13137
14236
|
|
|
13138
14237
|
Unset by default, and unreflected: a tree of choosable nodes is not a tree
|
|
13139
14238
|
of links, and an empty `href` written onto every row would be a link to the
|
|
13140
14239
|
current page on every item a consumer never asked to be one. */
|
|
13141
14240
|
href?: (HelixHeadlessTreeItem["href"]) | undefined;
|
|
14241
|
+
/** Whether the item is a branch whose children are loaded when it opens.
|
|
14242
|
+
|
|
14243
|
+
Opening it sends `helix-load`. Add the children to its `children` slot,
|
|
14244
|
+
and remove `lazy` once they are in, as Web Awesome's tree item does. */
|
|
14245
|
+
lazy?: (HelixHeadlessTreeItem["lazy"]) | undefined;
|
|
13142
14246
|
/** The link's `rel` value, which describes how the linked page relates to this
|
|
13143
14247
|
one.
|
|
13144
14248
|
|
|
@@ -13206,6 +14310,8 @@ export type HelixHeadlessTreeItemVueEvents = {
|
|
|
13206
14310
|
"helix-before-close": HelixHeadlessTreeItemHelixBeforeCloseElementEvent;
|
|
13207
14311
|
/** Fired before a branch opens, and cancelable. */
|
|
13208
14312
|
"helix-before-open": HelixHeadlessTreeItemHelixBeforeOpenElementEvent;
|
|
14313
|
+
/** Fired when a `lazy` item opens, so you can load its children. */
|
|
14314
|
+
"helix-load": HelixHeadlessTreeItemHelixLoadElementEvent;
|
|
13209
14315
|
/** Fired when the item is chosen, and cancelable. Canceling it changes nothing. */
|
|
13210
14316
|
"helix-select": HelixHeadlessTreeItemHelixSelectElementEvent;
|
|
13211
14317
|
/** Sent when the branch opens or closes, with `newState` and `oldState`. */
|
|
@@ -13268,6 +14374,16 @@ branch as a label; a headless consumer reads the attribute and the
|
|
|
13268
14374
|
written here appears in the served markup of every tree anybody renders.
|
|
13269
14375
|
The resting state is the absence of the attribute, which is `peer`. */
|
|
13270
14376
|
nesting?: (HelixHeadlessTree["nesting"]) | undefined;
|
|
14377
|
+
/** Whether a reader can check many items, or choose only the items at the
|
|
14378
|
+
ends. Unset, one item is chosen at a time, branches included.
|
|
14379
|
+
|
|
14380
|
+
Optional, so a tree of one choice writes no attribute onto the host. */
|
|
14381
|
+
"selection-mode"?: (HelixHeadlessTree["selectionMode"]) | undefined;
|
|
14382
|
+
/** Whether a reader can check many items, or choose only the items at the
|
|
14383
|
+
ends. Unset, one item is chosen at a time, branches included.
|
|
14384
|
+
|
|
14385
|
+
Optional, so a tree of one choice writes no attribute onto the host. */
|
|
14386
|
+
selectionMode?: (HelixHeadlessTree["selectionMode"]) | undefined;
|
|
13271
14387
|
/** The text shown and announced when there are no rows and none are loading. */
|
|
13272
14388
|
"empty-text"?: (HelixHeadlessTree["emptyText"]) | undefined;
|
|
13273
14389
|
/** The text shown and announced when there are no rows and none are loading. */
|
|
@@ -13299,6 +14415,9 @@ Ignored once `active` is written. */
|
|
|
13299
14415
|
|
|
13300
14416
|
Ignored once `active` is written. */
|
|
13301
14417
|
defaultActive?: (HelixHeadlessTree["defaultActive"]) | undefined;
|
|
14418
|
+
/** The checked values, as a list, under `selection-mode="multiple"`, and the
|
|
14419
|
+
chosen value alone otherwise. Writing it sets `active`. */
|
|
14420
|
+
values?: (HelixHeadlessTree["values"]) | undefined;
|
|
13302
14421
|
};
|
|
13303
14422
|
|
|
13304
14423
|
export type HelixHeadlessTreeVueEvents = {
|
|
@@ -13315,26 +14434,27 @@ export type HelixHeadlessTrendVueProps = {
|
|
|
13315
14434
|
"better-label"?: (HelixHeadlessTrend["betterLabel"]) | undefined;
|
|
13316
14435
|
/** The word read out after the direction when the move is an improvement. */
|
|
13317
14436
|
betterLabel?: (HelixHeadlessTrend["betterLabel"]) | undefined;
|
|
13318
|
-
/** Which way the measurement moved.
|
|
13319
|
-
|
|
13320
|
-
Absent is neutral, so a trend with nothing to report draws a bar rather
|
|
13321
|
-
than picking a direction. Optional rather than defaulted for the reason
|
|
13322
|
-
`Stat.direction` is: a reflecting property with a default writes its
|
|
13323
|
-
attribute onto the host the moment the element upgrades, and the host is
|
|
13324
|
-
markup the consumer rendered, which React compares against what it rendered
|
|
13325
|
-
and reports as a hydration mismatch. */
|
|
14437
|
+
/** Which way the measurement moved, as `movement` says it. */
|
|
13326
14438
|
direction?: (HelixHeadlessTrend["direction"]) | undefined;
|
|
13327
14439
|
/** The word read out for a move down. */
|
|
13328
14440
|
"down-label"?: (HelixHeadlessTrend["downLabel"]) | undefined;
|
|
13329
14441
|
/** The word read out for a move down. */
|
|
13330
14442
|
downLabel?: (HelixHeadlessTrend["downLabel"]) | undefined;
|
|
13331
|
-
/** Which
|
|
14443
|
+
/** Which movement counts as an improvement for this metric.
|
|
13332
14444
|
|
|
13333
14445
|
Absent states the movement without judging it, which is the honest default:
|
|
13334
14446
|
revenue up is good news and latency up is bad news, and only the consumer
|
|
13335
14447
|
knows which one this is. Set it once per metric and it holds while the
|
|
13336
|
-
|
|
14448
|
+
movement changes underneath. */
|
|
13337
14449
|
good?: (HelixHeadlessTrend["good"]) | undefined;
|
|
14450
|
+
/** Which way the measurement moved.
|
|
14451
|
+
|
|
14452
|
+
Absent is neutral, so a trend with nothing to report draws a bar rather
|
|
14453
|
+
than picking a direction. Optional rather than defaulted: a reflecting
|
|
14454
|
+
property with a default writes its attribute onto the host the moment the
|
|
14455
|
+
element upgrades, and the host is markup the consumer rendered, which React
|
|
14456
|
+
compares against what it rendered and reports as a hydration mismatch. */
|
|
14457
|
+
movement?: (HelixHeadlessTrend["movement"]) | undefined;
|
|
13338
14458
|
/** The word read out for no move, or for a direction that is not one of the
|
|
13339
14459
|
three. */
|
|
13340
14460
|
"unchanged-label"?: (HelixHeadlessTrend["unchangedLabel"]) | undefined;
|
|
@@ -13428,10 +14548,25 @@ export type HelixHeadlessVideoPlaylistHelixActivateElementEvent =
|
|
|
13428
14548
|
/** `helix-before-activate` event type */
|
|
13429
14549
|
export type HelixHeadlessVideoPlaylistHelixBeforeActivateElementEvent =
|
|
13430
14550
|
HelixHeadlessVideoPlaylistElementEvent<HelixBeforeActivateEvent>;
|
|
14551
|
+
/** `helix-end` event type */
|
|
14552
|
+
export type HelixHeadlessVideoPlaylistHelixEndElementEvent =
|
|
14553
|
+
HelixHeadlessVideoPlaylistElementEvent<HelixEndEvent>;
|
|
13431
14554
|
|
|
13432
14555
|
export type HelixHeadlessVideoPlaylistVueProps = {
|
|
13433
14556
|
/** The list's name, read by screen readers. */
|
|
13434
14557
|
label?: (HelixHeadlessVideoPlaylist["label"]) | undefined;
|
|
14558
|
+
/** What happens when an entry ends with no next one to go to. `one` plays the
|
|
14559
|
+
same entry again, and `all` goes from the last entry back to the first.
|
|
14560
|
+
Absent, the playlist stops on the last entry and sends `helix-end`.
|
|
14561
|
+
|
|
14562
|
+
`all` also lets the next and previous controls go round, so next on the
|
|
14563
|
+
last entry is the first. `one` changes only what an ending does: next and
|
|
14564
|
+
previous still move, being a reader asking for another entry. */
|
|
14565
|
+
repeat?: (HelixHeadlessVideoPlaylist["repeat"]) | undefined;
|
|
14566
|
+
/** Whether the entries play in a random order. The order starts from the
|
|
14567
|
+
entry that is current, and holds until shuffle is turned off or an entry
|
|
14568
|
+
arrives or leaves, so previous goes back through what has played. */
|
|
14569
|
+
shuffle?: (HelixHeadlessVideoPlaylist["shuffle"]) | undefined;
|
|
13435
14570
|
/** The `value` of the current item.
|
|
13436
14571
|
|
|
13437
14572
|
Not `option.active`, which is the option the keyboard is on: that is a
|
|
@@ -13452,10 +14587,12 @@ Ignored once `active` is written. */
|
|
|
13452
14587
|
};
|
|
13453
14588
|
|
|
13454
14589
|
export type HelixHeadlessVideoPlaylistVueEvents = {
|
|
13455
|
-
/** The current entry changed. The playlist already holds the new entry when this is sent. */
|
|
14590
|
+
/** The current entry changed. The playlist already holds the new entry when this is sent, and `detail.previous` is the entry it left. */
|
|
13456
14591
|
"helix-activate": HelixHeadlessVideoPlaylistHelixActivateElementEvent;
|
|
13457
14592
|
/** The current entry is about to change. Cancelable: cancel it to keep the current entry. */
|
|
13458
14593
|
"helix-before-activate": HelixHeadlessVideoPlaylistHelixBeforeActivateElementEvent;
|
|
14594
|
+
/** The last entry finished playing, and the playlist stopped there. Not sent while `repeat` is set. */
|
|
14595
|
+
"helix-end": HelixHeadlessVideoPlaylistHelixEndElementEvent;
|
|
13459
14596
|
};
|
|
13460
14597
|
|
|
13461
14598
|
/** `HelixHeadlessVideo` component event */
|
|
@@ -13474,10 +14611,10 @@ export type HelixHeadlessVideoVueProps = {
|
|
|
13474
14611
|
/** Whether the video starts playing on its own. Browsers allow this only while
|
|
13475
14612
|
it is muted.
|
|
13476
14613
|
|
|
13477
|
-
Forwarded
|
|
13478
|
-
the browser's policy and
|
|
13479
|
-
|
|
13480
|
-
|
|
14614
|
+
Forwarded to the video, which decides. Whether an unprompted play is
|
|
14615
|
+
permitted is the browser's policy, and what follows a refused autoplay is a
|
|
14616
|
+
paused player showing its start control, which is the correct thing to be
|
|
14617
|
+
looking at. */
|
|
13481
14618
|
autoplay?: (HelixHeadlessVideo["autoplay"]) | undefined;
|
|
13482
14619
|
/** The name of the captions control when the video has one track. The control
|
|
13483
14620
|
turns that track on and off.
|
|
@@ -13711,6 +14848,12 @@ bar: two of the same control is worse than either placement. */
|
|
|
13711
14848
|
"pip-label"?: (HelixHeadlessVideo["pipLabel"]) | undefined;
|
|
13712
14849
|
/** What the control that floats the video over other windows is called. */
|
|
13713
14850
|
pipLabel?: (HelixHeadlessVideo["pipLabel"]) | undefined;
|
|
14851
|
+
/** The name of the player when `label` is not set. The player is a group, and
|
|
14852
|
+
this is what a screen reader calls it on arriving. */
|
|
14853
|
+
"player-label"?: (HelixHeadlessVideo["playerLabel"]) | undefined;
|
|
14854
|
+
/** The name of the player when `label` is not set. The player is a group, and
|
|
14855
|
+
this is what a screen reader calls it on arriving. */
|
|
14856
|
+
playerLabel?: (HelixHeadlessVideo["playerLabel"]) | undefined;
|
|
13714
14857
|
/** The name of the play control while pressing it would start the video. */
|
|
13715
14858
|
"play-label"?: (HelixHeadlessVideo["playLabel"]) | undefined;
|
|
13716
14859
|
/** The name of the play control while pressing it would start the video. */
|
|
@@ -13760,6 +14903,14 @@ nothing in it says "press to watch".
|
|
|
13760
14903
|
behind a hero, a grid of eight thumbnails, anything where the video is
|
|
13761
14904
|
decoration rather than something to start.
|
|
13762
14905
|
|
|
14906
|
+
**It is for the pointer, and the bar's Play is for everyone else.** Both
|
|
14907
|
+
play the video, so a keyboard met two stops called "Play" one after the
|
|
14908
|
+
other and a screen reader read the same button twice. The large one is out
|
|
14909
|
+
of the tab order and hidden from assistive technology while the bar is
|
|
14910
|
+
drawn, which is whenever it is: it shows only while the video is not
|
|
14911
|
+
playing, and the bar does not fade then. A press on it leaves focus on the
|
|
14912
|
+
player, so the keys go on working once it has gone.
|
|
14913
|
+
|
|
13763
14914
|
A value rather than a boolean, so the resting state is the attribute's
|
|
13764
14915
|
absence: a boolean defaulting to on would have to be spelled as its own
|
|
13765
14916
|
negation. */
|
|
@@ -13777,6 +14928,14 @@ nothing in it says "press to watch".
|
|
|
13777
14928
|
behind a hero, a grid of eight thumbnails, anything where the video is
|
|
13778
14929
|
decoration rather than something to start.
|
|
13779
14930
|
|
|
14931
|
+
**It is for the pointer, and the bar's Play is for everyone else.** Both
|
|
14932
|
+
play the video, so a keyboard met two stops called "Play" one after the
|
|
14933
|
+
other and a screen reader read the same button twice. The large one is out
|
|
14934
|
+
of the tab order and hidden from assistive technology while the bar is
|
|
14935
|
+
drawn, which is whenever it is: it shows only while the video is not
|
|
14936
|
+
playing, and the bar does not fade then. A press on it leaves focus on the
|
|
14937
|
+
player, so the keys go on working once it has gone.
|
|
14938
|
+
|
|
13780
14939
|
A value rather than a boolean, so the resting state is the attribute's
|
|
13781
14940
|
absence: a boolean defaulting to on would have to be spelled as its own
|
|
13782
14941
|
negation. */
|
|
@@ -13811,17 +14970,72 @@ past the end is the one write the platform answers with an exception. */
|
|
|
13811
14970
|
};
|
|
13812
14971
|
|
|
13813
14972
|
export type HelixHeadlessVideoVueEvents = {
|
|
13814
|
-
/** The
|
|
14973
|
+
/** The media stopped loading before it finished, without an error. */
|
|
14974
|
+
abort: HelixHeadlessVideoElementEvent;
|
|
14975
|
+
/** Enough has loaded to start playing. */
|
|
14976
|
+
canplay: HelixHeadlessVideoElementEvent;
|
|
14977
|
+
/** Enough has loaded to play to the end without stopping, at the current rate. */
|
|
14978
|
+
canplaythrough: HelixHeadlessVideoElementEvent;
|
|
14979
|
+
/** The duration changed, which it does once the metadata is in. */
|
|
14980
|
+
durationchange: HelixHeadlessVideoElementEvent;
|
|
14981
|
+
/** The media was reset, as when `src` changes. */
|
|
14982
|
+
emptied: HelixHeadlessVideoElementEvent;
|
|
14983
|
+
/** The video reached its end. */
|
|
13815
14984
|
ended: HelixHeadlessVideoElementEvent;
|
|
14985
|
+
/** The source could not be loaded or played. The player shows `error-label` as well. */
|
|
14986
|
+
error: HelixHeadlessVideoElementEvent;
|
|
13816
14987
|
/** The next video was requested. Load it in response. */
|
|
13817
14988
|
"helix-next": HelixHeadlessVideoHelixNextElementEvent;
|
|
13818
14989
|
/** The previous video was requested. Load it in response. */
|
|
13819
14990
|
"helix-previous": HelixHeadlessVideoHelixPreviousElementEvent;
|
|
13820
|
-
/**
|
|
14991
|
+
/** The frame at the current position has loaded. */
|
|
14992
|
+
loadeddata: HelixHeadlessVideoElementEvent;
|
|
14993
|
+
/** The duration and the size of the video are known. */
|
|
14994
|
+
loadedmetadata: HelixHeadlessVideoElementEvent;
|
|
14995
|
+
/** The video started looking for its media. */
|
|
14996
|
+
loadstart: HelixHeadlessVideoElementEvent;
|
|
14997
|
+
/** Playback paused. */
|
|
13821
14998
|
pause: HelixHeadlessVideoElementEvent;
|
|
13822
|
-
/** Playback
|
|
14999
|
+
/** Playback was asked to start. */
|
|
13823
15000
|
play: HelixHeadlessVideoElementEvent;
|
|
13824
|
-
|
|
15001
|
+
/** Playback started, or started again after waiting for data. */
|
|
15002
|
+
playing: HelixHeadlessVideoElementEvent;
|
|
15003
|
+
/** More of the media has downloaded. */
|
|
15004
|
+
progress: HelixHeadlessVideoElementEvent;
|
|
15005
|
+
/** The playback rate changed. Read `playbackRate`. */
|
|
15006
|
+
ratechange: HelixHeadlessVideoElementEvent;
|
|
15007
|
+
/** The video's own width or height changed. Read `videoWidth` and `videoHeight`. */
|
|
15008
|
+
resize: HelixHeadlessVideoElementEvent;
|
|
15009
|
+
/** A move to a new position finished. */
|
|
15010
|
+
seeked: HelixHeadlessVideoElementEvent;
|
|
15011
|
+
/** A move to a new position started. */
|
|
15012
|
+
seeking: HelixHeadlessVideoElementEvent;
|
|
15013
|
+
/** The browser is trying to load more data and none is arriving. */
|
|
15014
|
+
stalled: HelixHeadlessVideoElementEvent;
|
|
15015
|
+
/** Loading paused on purpose, as when `preload` asks for no more. */
|
|
15016
|
+
suspend: HelixHeadlessVideoElementEvent;
|
|
15017
|
+
/** The position changed. Read `currentTime`. */
|
|
15018
|
+
timeupdate: HelixHeadlessVideoElementEvent;
|
|
15019
|
+
/** The volume or the mute changed. Read `volume` and `muted`. */
|
|
15020
|
+
volumechange: HelixHeadlessVideoElementEvent;
|
|
15021
|
+
/** Playback stopped to wait for more data. */
|
|
15022
|
+
waiting: HelixHeadlessVideoElementEvent;
|
|
15023
|
+
};
|
|
15024
|
+
|
|
15025
|
+
/** `HelixHeadlessVirtualList` component event */
|
|
15026
|
+
export type HelixHeadlessVirtualListElementEvent<E = Event> = TypedEvent<
|
|
15027
|
+
HelixHeadlessVirtualList,
|
|
15028
|
+
E
|
|
15029
|
+
>;
|
|
15030
|
+
/** `helix-before-change` event type */
|
|
15031
|
+
export type HelixHeadlessVirtualListHelixBeforeChangeElementEvent =
|
|
15032
|
+
HelixHeadlessVirtualListElementEvent<HelixBeforeChangeEvent>;
|
|
15033
|
+
/** `helix-load-more` event type */
|
|
15034
|
+
export type HelixHeadlessVirtualListHelixLoadMoreElementEvent =
|
|
15035
|
+
HelixHeadlessVirtualListElementEvent<HelixLoadMoreEvent>;
|
|
15036
|
+
/** `helix-range-change` event type */
|
|
15037
|
+
export type HelixHeadlessVirtualListHelixRangeChangeElementEvent =
|
|
15038
|
+
HelixHeadlessVirtualListElementEvent<HelixRangeChangeEvent>;
|
|
13825
15039
|
|
|
13826
15040
|
export type HelixHeadlessVirtualListVueProps = {
|
|
13827
15041
|
/** The height of one row, in pixels, used to find the row at a scroll offset.
|
|
@@ -13829,28 +15043,93 @@ export type HelixHeadlessVirtualListVueProps = {
|
|
|
13829
15043
|
An estimate rather than a measurement while `measured` is off, which is
|
|
13830
15044
|
right whenever the rows really are one height and is the cheaper of the two. */
|
|
13831
15045
|
estimate?: (HelixHeadlessVirtualList["estimate"]) | undefined;
|
|
13832
|
-
/** The id of the script element that holds the
|
|
15046
|
+
/** The id of the script element that holds the items as JSON. `items` wins
|
|
15047
|
+
where both are set. */
|
|
13833
15048
|
for?: (HelixHeadlessVirtualList["for"]) | undefined;
|
|
15049
|
+
/** The field of each item that is its key in `value`, as a key or a path of
|
|
15050
|
+
keys. Empty reads a string or a number item as its own key, and any
|
|
15051
|
+
other item by its place in the set. */
|
|
15052
|
+
"key-field"?: (HelixHeadlessVirtualList["keyField"]) | undefined;
|
|
15053
|
+
/** The field of each item that is its key in `value`, as a key or a path of
|
|
15054
|
+
keys. Empty reads a string or a number item as its own key, and any
|
|
15055
|
+
other item by its place in the set. */
|
|
15056
|
+
keyField?: (HelixHeadlessVirtualList["keyField"]) | undefined;
|
|
13834
15057
|
/** The list's name, read by screen readers, because only some of its rows
|
|
13835
15058
|
are rendered at a time.
|
|
13836
15059
|
|
|
13837
15060
|
An `aria-label` or `aria-labelledby` on the host names the list too, and
|
|
13838
15061
|
wins over this. */
|
|
13839
15062
|
label?: (HelixHeadlessVirtualList["label"]) | undefined;
|
|
13840
|
-
/**
|
|
13841
|
-
|
|
15063
|
+
/** Marks the list as busy fetching more items, and draws a row after the last
|
|
15064
|
+
item that says so.
|
|
15065
|
+
|
|
15066
|
+
Set it when `helix-load-more` starts a fetch, and clear it when the items
|
|
15067
|
+
arrive. The list does not ask for more while it is set. */
|
|
15068
|
+
loading?: (HelixHeadlessVirtualList["loading"]) | undefined;
|
|
15069
|
+
/** The text of the row drawn while `loading` is set, where the `loading` slot is empty. */
|
|
15070
|
+
"loading-label"?: (HelixHeadlessVirtualList["loadingLabel"]) | undefined;
|
|
15071
|
+
/** The text of the row drawn while `loading` is set, where the `loading` slot is empty. */
|
|
15072
|
+
loadingLabel?: (HelixHeadlessVirtualList["loadingLabel"]) | undefined;
|
|
15073
|
+
/** Places each row by its own measured height. Without it, rows are placed
|
|
15074
|
+
by one height: `estimate` until rows are drawn, then the drawn rows' height,
|
|
15075
|
+
read once.
|
|
13842
15076
|
|
|
13843
15077
|
**Off by default, because the straight line is better when it holds.** One
|
|
13844
|
-
|
|
15078
|
+
height makes offset and index convert by division, which can never
|
|
13845
15079
|
disagree with itself; measuring is what a set of genuinely different
|
|
13846
15080
|
heights needs and costs a read of each row as it renders. A list of
|
|
13847
15081
|
one-line rows should leave this alone. */
|
|
13848
15082
|
measured?: (HelixHeadlessVirtualList["measured"]) | undefined;
|
|
15083
|
+
/** Makes the list a list box a reader chooses from: `single` selects one
|
|
15084
|
+
item, and `multiple` any number. Unset is a list a reader reads. */
|
|
15085
|
+
"selection-mode"?: (HelixHeadlessVirtualList["selectionMode"]) | undefined;
|
|
15086
|
+
/** Makes the list a list box a reader chooses from: `single` selects one
|
|
15087
|
+
item, and `multiple` any number. Unset is a list a reader reads. */
|
|
15088
|
+
selectionMode?: (HelixHeadlessVirtualList["selectionMode"]) | undefined;
|
|
15089
|
+
/** The field of each item that typing matches, as a key or a path of keys
|
|
15090
|
+
(`author.name`).
|
|
15091
|
+
|
|
15092
|
+
Empty by default, which matches the first `data-field` of the row
|
|
15093
|
+
template, or the item itself where it is a string or a number. */
|
|
15094
|
+
"text-field"?: (HelixHeadlessVirtualList["textField"]) | undefined;
|
|
15095
|
+
/** The field of each item that typing matches, as a key or a path of keys
|
|
15096
|
+
(`author.name`).
|
|
15097
|
+
|
|
15098
|
+
Empty by default, which matches the first `data-field` of the row
|
|
15099
|
+
template, or the item itself where it is a string or a number. */
|
|
15100
|
+
textField?: (HelixHeadlessVirtualList["textField"]) | undefined;
|
|
15101
|
+
/** The keys of the chosen items, separated by commas, in a list with
|
|
15102
|
+
`selection-mode`. Set it to start with items chosen. */
|
|
15103
|
+
value?: (HelixHeadlessVirtualList["value"]) | undefined;
|
|
15104
|
+
/** The items, as an array. Set it as a property.
|
|
15105
|
+
|
|
15106
|
+
Each item is drawn by `renderItem`, or into the row `<template>` by its
|
|
15107
|
+
fields. A new array draws the new rows, so replace the array to change it.
|
|
15108
|
+
Left unset, the list reads the script that `for` names. */
|
|
15109
|
+
items?: (HelixHeadlessVirtualList["items"]) | undefined;
|
|
15110
|
+
/** Draws one item into its row, given the item and its index. Set it as a
|
|
15111
|
+
property.
|
|
15112
|
+
|
|
15113
|
+
It returns what Lit renders: a template from `html`, a string, or a DOM
|
|
15114
|
+
node. The list wraps each result in a `<div>` that carries the row's role
|
|
15115
|
+
and place in the set. Where it is unset, the row `<template>` is used. */
|
|
15116
|
+
renderItem?: (HelixHeadlessVirtualList["renderItem"]) | undefined;
|
|
15117
|
+
};
|
|
15118
|
+
|
|
15119
|
+
export type HelixHeadlessVirtualListVueEvents = {
|
|
15120
|
+
/** Fired once a press or a key has changed which items are selected, in a list with `selection-mode`. */
|
|
15121
|
+
change: HelixHeadlessVirtualListElementEvent;
|
|
15122
|
+
/** Fired before a press or a key changes which items are selected, with the `value` it would leave. Cancelable. */
|
|
15123
|
+
"helix-before-change": HelixHeadlessVirtualListHelixBeforeChangeElementEvent;
|
|
15124
|
+
/** Fired when a reader comes within one screen of the last item, once for each length of the set. */
|
|
15125
|
+
"helix-load-more": HelixHeadlessVirtualListHelixLoadMoreElementEvent;
|
|
15126
|
+
/** Fired when the items on screen change, with the new `first` and `last`, which `range` also holds. */
|
|
15127
|
+
"helix-range-change": HelixHeadlessVirtualListHelixRangeChangeElementEvent;
|
|
13849
15128
|
};
|
|
13850
15129
|
|
|
13851
|
-
export type HelixHeadlessVirtualListVueEvents = {};
|
|
13852
|
-
|
|
13853
15130
|
export type CustomCssProperties = {
|
|
15131
|
+
/** The height of the content, in pixels, written on the `content` part while the section is open. */
|
|
15132
|
+
"--accordion-content-height"?: (string) | undefined;
|
|
13854
15133
|
/** The width of an axis, in `ch`, set from the widest number on it. The chart sets it on the axis itself, and only when the categories run along the bottom. In a horizontal chart the axis is a row, one line high. */
|
|
13855
15134
|
"--bar-chart-axis"?: (string) | undefined;
|
|
13856
15135
|
/** The color of the secondary axis, when one series is on it. The chart sets it from that series' `--chart-series-*` property, so the axis is drawn in whatever color that property resolves to. */
|
|
@@ -13879,6 +15158,8 @@ export type CustomCssProperties = {
|
|
|
13879
15158
|
"--color-picker-swatch"?: (string) | undefined;
|
|
13880
15159
|
/** The alignment of the cell's column: `start`, `center`, or `end`. Unset when the column sets none. The component writes it on each cell it draws, and the stylesheet reads it. `Table` sets `--table-cell-align` for the same purpose. */
|
|
13881
15160
|
"--data-table-cell-align"?: (string) | undefined;
|
|
15161
|
+
/** How deep a row is in a tree grid, from 1. The component writes it on each row header cell, and the stylesheet indents by it. */
|
|
15162
|
+
"--data-table-level"?: (string) | undefined;
|
|
13882
15163
|
/** The column track list, worked out from the columns. The component writes it inline on the element that reads it, so setting it has no effect. Set a column's `width` to change it. */
|
|
13883
15164
|
"--data-table-template"?: (string) | undefined;
|
|
13884
15165
|
/** How many month columns are drawn, capped at two. `--date-picker-columns` overrides it. */
|
|
@@ -13917,12 +15198,30 @@ export type CustomCssProperties = {
|
|
|
13917
15198
|
"--heatmap-tone-success"?: (string) | undefined;
|
|
13918
15199
|
/** The color of the `warning` tone. */
|
|
13919
15200
|
"--heatmap-tone-warning"?: (string) | undefined;
|
|
15201
|
+
/** How far the zoomed item is moved across from the middle of the viewport, in pixels, toward the right. Written only while zoomed. */
|
|
15202
|
+
"--lightbox-pan-x"?: (string) | undefined;
|
|
15203
|
+
/** How far the zoomed item is moved down from the middle of the viewport, in pixels. Written only while zoomed. */
|
|
15204
|
+
"--lightbox-pan-y"?: (string) | undefined;
|
|
15205
|
+
/** The scale the shown item is zoomed to, such as `2`. Written only while zoomed. */
|
|
15206
|
+
"--lightbox-zoom"?: (string) | undefined;
|
|
13920
15207
|
/** Where a series' last reading sits horizontally, as a percentage. Written by the component. */
|
|
13921
15208
|
"--chart-terminus-x"?: (string) | undefined;
|
|
13922
15209
|
/** Where a series' last reading sits vertically, as a percentage. Written by the component. */
|
|
13923
15210
|
"--chart-terminus-y"?: (string) | undefined;
|
|
15211
|
+
/** The number of the first row, written where `start` or `reversed` moves it. */
|
|
15212
|
+
"--list-first"?: (string) | undefined;
|
|
15213
|
+
/** What each row adds to the number before it: `1`, or `-1` where `reversed`. */
|
|
15214
|
+
"--list-step"?: (string) | undefined;
|
|
13924
15215
|
/** How far the needle turns to point north, as an angle. The frame writes it from `bearing`. */
|
|
13925
15216
|
"--map-needle-turn"?: (string) | undefined;
|
|
15217
|
+
/** The height of the panel this one took over from, written on the surface while it is open. */
|
|
15218
|
+
"--megamenu-from-block-size"?: (string) | undefined;
|
|
15219
|
+
/** The width of the panel this one took over from, written on the surface while it is open. */
|
|
15220
|
+
"--megamenu-from-inline-size"?: (string) | undefined;
|
|
15221
|
+
/** The panel's own height, written on the surface while it is open. */
|
|
15222
|
+
"--megamenu-surface-block-size"?: (string) | undefined;
|
|
15223
|
+
/** The panel's own width, written on the surface while it is open. */
|
|
15224
|
+
"--megamenu-surface-inline-size"?: (string) | undefined;
|
|
13926
15225
|
/** Where the panel starts, measured from the bar above it. */
|
|
13927
15226
|
"--megamenu-top"?: (string) | undefined;
|
|
13928
15227
|
/** Where a bound sits on the arc, as a length along it. */
|
|
@@ -13951,18 +15250,24 @@ export type CustomCssProperties = {
|
|
|
13951
15250
|
"--chart-point-y"?: (string) | undefined;
|
|
13952
15251
|
/** A tick's position along its axis, as a percentage. The component writes it. */
|
|
13953
15252
|
"--chart-tick"?: (string) | undefined;
|
|
15253
|
+
/** How far along its axis the content is scrolled, from 0 at the start to 1 at the end. Written on each `scrollbar` part, so its thumb inherits it. Counted from the right on a right-to-left page. */
|
|
15254
|
+
"--scroll-area-scroll-fraction"?: (string) | undefined;
|
|
15255
|
+
/** 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
|
+
"--scroll-area-thumb-fraction"?: (string) | undefined;
|
|
13954
15257
|
/** The value as a fraction of the range, 0 to 1. */
|
|
13955
15258
|
"--slider-fraction"?: (string) | undefined;
|
|
13956
|
-
/** Where
|
|
15259
|
+
/** 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`. */
|
|
13957
15260
|
"--slider-from"?: (string) | undefined;
|
|
13958
15261
|
/** Where one marker sits, as a percentage of the track. */
|
|
13959
15262
|
"--slider-marker-at"?: (string) | undefined;
|
|
13960
|
-
/** Where
|
|
15263
|
+
/** Where the filled span ends, as a fraction of the track, 0 to 1: a range's upper thumb, or the farther of a single thumb and its `origin`. */
|
|
13961
15264
|
"--slider-to"?: (string) | undefined;
|
|
13962
15265
|
/** Where a nested splitter crosses this one, as a percentage. */
|
|
13963
15266
|
"--splitter-corner-at"?: (string) | undefined;
|
|
13964
15267
|
/** Where the divider sits, as a percentage of the box. */
|
|
13965
15268
|
"--splitter-position"?: (string) | undefined;
|
|
15269
|
+
/** How far through the sequence is, as a percentage, written on the `progress` part. */
|
|
15270
|
+
"--steps-progress"?: (string) | undefined;
|
|
13966
15271
|
/** The text alignment of the column above the cell: `start`, `center`, or `end`, and unset when the column sets none. The table writes it, and the stylesheet that draws the cell reads it for `justify-content` and `text-align`, which both follow the writing direction. */
|
|
13967
15272
|
"--table-cell-align"?: (string) | undefined;
|
|
13968
15273
|
/** The column track list the table works out from its columns. The component writes it inline on the element that reads it, so setting it has no effect. Set `columns` to change the tracks. */
|
|
@@ -13971,6 +15276,14 @@ export type CustomCssProperties = {
|
|
|
13971
15276
|
"--toast-duration"?: (string) | undefined;
|
|
13972
15277
|
/** How far a swipe has moved the message across, in pixels, toward the right. */
|
|
13973
15278
|
"--toast-swipe-x"?: (string) | undefined;
|
|
15279
|
+
/** The lit box's height, in pixels, padding included. Written on the spotlight while it lights a target. */
|
|
15280
|
+
"--tour-spotlight-height"?: (string) | undefined;
|
|
15281
|
+
/** The lit box's width, in pixels, padding included. Written on the spotlight while it lights a target. */
|
|
15282
|
+
"--tour-spotlight-width"?: (string) | undefined;
|
|
15283
|
+
/** The lit box's left edge, from the window's left edge, in pixels. Written on the spotlight while it lights a target. */
|
|
15284
|
+
"--tour-spotlight-x"?: (string) | undefined;
|
|
15285
|
+
/** The lit box's top edge, from the window's top edge, in pixels. Written on the spotlight while it lights a target. */
|
|
15286
|
+
"--tour-spotlight-y"?: (string) | undefined;
|
|
13974
15287
|
/** How deep this row sits, counting from one as `aria-level` does, for the indent. */
|
|
13975
15288
|
"--tree-level"?: (string) | undefined;
|
|
13976
15289
|
/** The media's own aspect ratio, once it is known. `--video-aspect-ratio` overrides it. */
|
|
@@ -13985,25 +15298,25 @@ export type CustomCssProperties = {
|
|
|
13985
15298
|
// Note: Some tooling expects this augmentation under "@vue/runtime-core", while
|
|
13986
15299
|
// other docs/examples use "vue". We emit both for compatibility.
|
|
13987
15300
|
export interface WcToolkitVueGlobalComponents {
|
|
13988
|
-
/** 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. Closed content has both 'hidden' and 'inert'. 'hidden' collapses it when no stylesheet is loaded. 'inert' keeps it out of the tab order and the accessibility tree after the styled tier's 'display' overrides 'hidden'. */
|
|
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. Closed content has both 'hidden' and 'inert'. 'hidden' collapses it when no stylesheet is loaded. 'inert' keeps it out of the tab order and the accessibility tree after the styled tier's 'display' overrides 'hidden'. 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. Set 'hidden-until-found' and the browser's find in page searches a closed section too: a match opens it, with 'helix-before-open' first, as React Aria's disclosure does. The content is then 'hidden="until-found"' while closed, and not 'inert', since an inert region is never searched. */
|
|
13989
15302
|
"helix-headless-accordion-item": DefineCustomElement<
|
|
13990
15303
|
HelixHeadlessAccordionItem,
|
|
13991
15304
|
HelixHeadlessAccordionItemVueProps,
|
|
13992
15305
|
HelixHeadlessAccordionItemVueEvents
|
|
13993
15306
|
>;
|
|
13994
|
-
/** 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.
|
|
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. */
|
|
13995
15308
|
"helix-headless-accordion": DefineCustomElement<
|
|
13996
15309
|
HelixHeadlessAccordion,
|
|
13997
15310
|
HelixHeadlessAccordionVueProps,
|
|
13998
15311
|
HelixHeadlessAccordionVueEvents
|
|
13999
15312
|
>;
|
|
14000
|
-
/** 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
|
|
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. */
|
|
14001
15314
|
"helix-headless-announcement": DefineCustomElement<
|
|
14002
15315
|
HelixHeadlessAnnouncement,
|
|
14003
15316
|
HelixHeadlessAnnouncementVueProps,
|
|
14004
15317
|
HelixHeadlessAnnouncementVueEvents
|
|
14005
15318
|
>;
|
|
14006
|
-
/** Tracks whether the page has scrolled and sets the custom state 'scrolled', so the styled tier can lift the bar without a scroll handler of its own. The state is read when the element connects. A fresh load starts at the top, which matches the server markup, and a reload partway down the page is corrected on hydration. The element uses a custom state because an attribute such as 'data-scrolled', written onto its own host, is one the server did not send. A hydrating framework would report a mismatch whenever the page reloads far enough down. 'ElementInternals.states' is not in the DOM, so hydration has nothing to compare. Select the state with ':state(scrolled)'. The page is the window unless 'scroller' names the element that scrolls, for an app shell whose content scrolls inside a container. */
|
|
15319
|
+
/** Tracks whether the page has scrolled and sets the custom state 'scrolled', so the styled tier can lift the bar without a scroll handler of its own. The state is read when the element connects. A fresh load starts at the top, which matches the server markup, and a reload partway down the page is corrected on hydration. The element uses a custom state because an attribute such as 'data-scrolled', written onto its own host, is one the server did not send. A hydrating framework would report a mismatch whenever the page reloads far enough down. 'ElementInternals.states' is not in the DOM, so hydration has nothing to compare. Select the state with ':state(scrolled)'. The page is the window unless 'scroller' names the element that scrolls, for an app shell whose content scrolls inside a container. The host is the page's 'banner' landmark. Placed inside 'main', 'article', 'aside', 'nav' or 'section', it is a plain box instead, as a native '<header>' is there, so a header inside a card or a pane does not add a second banner. The ancestors are read as the accessibility tree reads them, through the slots that take the header in, so one slotted into a component that draws a '<nav>', such as 'Navigation', is not a banner either. A server cannot see the ancestors, so it serves the banner and the browser corrects it when the element connects. */
|
|
14007
15320
|
"helix-headless-app-header": DefineCustomElement<
|
|
14008
15321
|
HelixHeadlessAppHeader,
|
|
14009
15322
|
HelixHeadlessAppHeaderVueProps,
|
|
@@ -14015,7 +15328,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14015
15328
|
HelixHeadlessAreaChartVueProps,
|
|
14016
15329
|
HelixHeadlessAreaChartVueEvents
|
|
14017
15330
|
>;
|
|
14018
|
-
/** A part of 'Avatar' that arranges avatars. The group computes the overflow count from 'max' and renders the "+3" itself. There is no slot for it, because the number has to match which avatars are hidden. Avatars past 'max' stay in the DOM and are hidden. The group writes 'hidden' on each of them, so they are hidden on the headless tier as well, and
|
|
15331
|
+
/** A part of 'Avatar' that arranges avatars. The group computes the overflow count from 'max' and renders the "+3" itself. There is no slot for it, because the number has to match which avatars are hidden. Avatars past 'max' stay in the DOM and are hidden. The group writes 'hidden' on each of them, so they are hidden on the headless tier as well, and at any 'max'. The count is read out as 'overflow-label', such as "3 more: Grace Hopper, Alan Turing, Barbara Liskov", so a screen reader hears who is there past the ones it can reach. */
|
|
14019
15332
|
"helix-headless-avatar-group": DefineCustomElement<
|
|
14020
15333
|
HelixHeadlessAvatarGroup,
|
|
14021
15334
|
HelixHeadlessAvatarGroupVueProps,
|
|
@@ -14051,19 +15364,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14051
15364
|
HelixHeadlessBreadcrumbVueProps,
|
|
14052
15365
|
HelixHeadlessBreadcrumbVueEvents
|
|
14053
15366
|
>;
|
|
14054
|
-
/** The host is the navigation landmark, named "Breadcrumb" by default. An 'aria-label' on the host names the trail instead, and so does 'label'. When a page has more than one navigation landmark, screen reader users choose between them by name. The '<ol>' has an explicit 'role="list"', because Safari removes list semantics from a list with 'list-style: none', and the trail always hides its markers. The items are slotted directly, so they are '<ol>' children in the flat tree, and each item sets 'role="listitem"' on itself. The trail does not measure itself, and you write its overflow in markup: put the crumb that holds the folded items where the gap should appear. */
|
|
15367
|
+
/** The host is the navigation landmark, named "Breadcrumb" by default. An 'aria-label' on the host names the trail instead, and so does 'label'. When a page has more than one navigation landmark, screen reader users choose between them by name. The '<ol>' has an explicit 'role="list"', because Safari removes list semantics from a list with 'list-style: none', and the trail always hides its markers. The items are slotted directly, so they are '<ol>' children in the flat tree, and each item sets 'role="listitem"' on itself. The trail does not measure itself, and you write its overflow in markup: put the crumb that holds the folded items where the gap should appear. A trail built from data, such as a router's matched routes, takes 'items': an array of '{ label, href }', drawn as crumbs in order, the last one as the current page. Slotted crumbs follow them. Use one way or the other in a trail. With 'max-items', a trail drawn from 'items' that is longer folds its middle into one crumb: the first crumb, a button, then the last 'max-items' less one. The button is named by 'expand-label' and shows the whole trail, moving focus to the first crumb it brought back. A new 'items' folds again. Slotted crumbs do not fold; write the folded crumb where the gap should be. */
|
|
14055
15368
|
"helix-headless-breadcrumbs": DefineCustomElement<
|
|
14056
15369
|
HelixHeadlessBreadcrumbs,
|
|
14057
15370
|
HelixHeadlessBreadcrumbsVueProps,
|
|
14058
15371
|
HelixHeadlessBreadcrumbsVueEvents
|
|
14059
15372
|
>;
|
|
14060
|
-
/** 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. The group does not manage focus, so each button keeps its own tab stop. For one tab stop with arrow keys between the buttons, the APG toolbar pattern, use Toolbar. Buttons are slotted, so they stay your own elements and keep their own appearance and size. */
|
|
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 the buttons, the APG toolbar pattern, use Toolbar. Buttons are slotted, so they stay your own elements and keep their own appearance and size. */
|
|
14061
15374
|
"helix-headless-button-group": DefineCustomElement<
|
|
14062
15375
|
HelixHeadlessButtonGroup,
|
|
14063
15376
|
HelixHeadlessButtonGroupVueProps,
|
|
14064
15377
|
HelixHeadlessButtonGroupVueEvents
|
|
14065
15378
|
>;
|
|
14066
|
-
/** 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()' on its form, which runs validation, unlike 'submit()'. A 'submit' listener reads 'event.submitter' as 'null', because the platform accepts only a native submit button there. The button's 'name' and 'value' are in the form data, so read them from 'new FormData(form)' to 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'. */
|
|
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()' on its form, which runs validation, unlike 'submit()'. A 'submit' listener reads 'event.submitter' as 'null', because the platform accepts only a native submit button there. The button's 'name' and 'value' are in the form data, so read them from 'new FormData(form)' to 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. */
|
|
14067
15380
|
"helix-headless-button": DefineCustomElement<
|
|
14068
15381
|
HelixHeadlessButton,
|
|
14069
15382
|
HelixHeadlessButtonVueProps,
|
|
@@ -14093,49 +15406,49 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14093
15406
|
HelixHeadlessCanvasVueProps,
|
|
14094
15407
|
HelixHeadlessCanvasVueEvents
|
|
14095
15408
|
>;
|
|
14096
|
-
/** 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 '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. **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. '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. */
|
|
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. */
|
|
14097
15410
|
"helix-headless-card": DefineCustomElement<
|
|
14098
15411
|
HelixHeadlessCard,
|
|
14099
15412
|
HelixHeadlessCardVueProps,
|
|
14100
15413
|
HelixHeadlessCardVueEvents
|
|
14101
15414
|
>;
|
|
14102
|
-
/** The track is a scroll container with scroll snapping, so dragging, trackpad swipes, and the browser's momentum scrolling all work. The controls scroll the track. Slides are your own elements, and the carousel writes nothing onto them. It renders a pane for each slide with 'role="group"', 'aria-roledescription="slide"', and a name that gives the slide's position in the set, and assigns the slide into it. A screen reader announces the position, and a slide that is a link stays a link. See 'assign'. **Rotation stops on focus and on hover, and stays stopped** until the user starts it again, as the APG requires. The rotation control is labeled with the action it performs and is first in the tab order. Rotation goes on from the last slide to the first, with or without 'loop', which is about the reader's own moves. A move the reader makes is announced, the slide's position read from a polite live region. While the carousel rotates the region is off, so a screen reader is not interrupted every few seconds. The indicators are one tab stop.
|
|
15415
|
+
/** The track is a scroll container with scroll snapping, so dragging, trackpad swipes, and the browser's momentum scrolling all work. The controls scroll the track. Slides are your own elements, and the carousel writes nothing onto them. It renders a pane for each slide with 'role="group"', 'aria-roledescription="slide"', and a name that gives the slide's position in the set, and assigns the slide into it. A screen reader announces the position, and a slide that is a link stays a link. See 'assign'. **Rotation stops on focus and on hover, and stays stopped** until the user starts it again, as the APG requires. The rotation control is labeled with the action it performs and is first in the tab order. Rotation goes on from the last slide to the first, with or without 'loop', which is about the reader's own moves. A move the reader makes is announced, the slide's position read from a polite live region. While the carousel rotates the region is off, so a screen reader is not interrupted every few seconds. **Keyboard.** The indicators are one tab stop. | Key | What it does | |---|---| | Tab | Moves through the rotation control, Previous, Next, the slides' own links and buttons, and the indicators, in that order. | | Enter, Space | Presses the control or the indicator that has focus. | | Right, Left | On an indicator, moves to the next or the previous slide and its indicator. Left moves on, on a right-to-left page. | | Down, Up | The same, on a vertical carousel. | | Home, End | On an indicator, moves to the first or the last slide. | Without 'loop', Previous on the first slide and Next on the last are marked 'aria-disabled', and keep focus. **What a screen reader hears.** The carousel is a group named by 'label', announced as 'role-label' ("carousel"). Each slide is a group announced as 'slide-role-label' ("slide") and named by 'slide-label' ("2 of 5"). After a move by a control, an indicator, a key, or a drag, the 'live' part says the slide's name politely. While the carousel rotates the region is off. **'slides-per-move' moves several slides at a time.** With 'per-view="3"' and 'slides-per-move="3"', Next shows the next three, there is one indicator for each stop, and the track snaps only at the stops. The last stop is always the end of the run, so a run that does not divide evenly ends on its last slides. Unset moves one slide. **'mouse-drag' lets a mouse drag the track**, which otherwise only a touch screen, a trackpad, or the scroll wheel moves. The drag follows the pointer with snapping off and settles on the nearest slide when it is let go, and that move is announced and refusable like a press of Next. A link in a slide is not followed at the end of a drag. The glyphs on Previous and Next can be replaced by slotting an icon of your own into 'previous-icon' and 'next-icon'. */
|
|
14103
15416
|
"helix-headless-carousel": DefineCustomElement<
|
|
14104
15417
|
HelixHeadlessCarousel,
|
|
14105
15418
|
HelixHeadlessCarouselVueProps,
|
|
14106
15419
|
HelixHeadlessCarouselVueEvents
|
|
14107
15420
|
>;
|
|
14108
|
-
/** The composer is a separate element so you can replace it. If you need attachments, slash commands, or a model picker, replace the composer and keep the transcript. By default, Enter sends and Shift+Enter starts a new line, the convention in messaging apps. Document editors mostly use the opposite, so 'submit-on' takes 'enter' or 'button'. Use 'button' for a long-form composer. The composer clears only when no listener cancels the send, so the text is kept when you cancel a send that failed. */
|
|
15421
|
+
/** The composer is a separate element so you can replace it. If you need attachments, slash commands, or a model picker, replace the composer and keep the transcript. By default, Enter sends and Shift+Enter starts a new line, the convention in messaging apps. Document editors mostly use the opposite, so 'submit-on' takes 'enter' or 'button'. Use 'button' for a long-form composer. The composer clears only when no listener cancels the send, so the text is kept when you cancel a send that failed. **In a form, the draft is the composer's value**, submitted under 'name'. A form reset puts back the 'value' the markup declared, and a '<fieldset disabled>' turns the composer off. Sending is still 'helix-send', and it does not submit the form. **'typing' says whether the user is writing**, and 'helix-typing' is sent each time it changes: when they start, and when they send or stop for 'typing-timeout' milliseconds. Pass it on to show "is typing" to the other side. */
|
|
14109
15422
|
"helix-headless-chat-composer": DefineCustomElement<
|
|
14110
15423
|
HelixHeadlessChatComposer,
|
|
14111
15424
|
HelixHeadlessChatComposerVueProps,
|
|
14112
15425
|
HelixHeadlessChatComposerVueEvents
|
|
14113
15426
|
>;
|
|
14114
|
-
/** A chat message carries its state: sending, arrived, streaming, or failed. A failed message has a retry control in the message, which fires 'helix-send'. 'streaming' is the state the others are arranged around. A streaming message changes height on every frame, so it is marked 'aria-busy' while it arrives and announced once when it settles. A screen reader cannot follow a stream read out character by character. */
|
|
15427
|
+
/** A chat message carries its state: sending, arrived, streaming, or failed. A failed message has a retry control in the message, which fires 'helix-send'. 'streaming' is the state the others are arranged around. A streaming message changes height on every frame, so it is marked 'aria-busy' while it arrives and announced once when it settles. A screen reader cannot follow a stream read out character by character. A screen reader names the turn by its author and its time, such as "You, 2 minutes ago". The author is 'author-label', or "You" for 'me', or the 'author' itself where it is a name; give a turn by 'them' an 'author-label' to name it. The chat it sits in holds the sentence and the word for 'me', so a page in another language sets them once there. The time moves on by itself, so "now" becomes "1 minute ago" while the page is open. */
|
|
14115
15428
|
"helix-headless-chat-message": DefineCustomElement<
|
|
14116
15429
|
HelixHeadlessChatMessage,
|
|
14117
15430
|
HelixHeadlessChatMessageVueProps,
|
|
14118
15431
|
HelixHeadlessChatMessageVueEvents
|
|
14119
15432
|
>;
|
|
14120
|
-
/** 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 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, pass the turns as children. */
|
|
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, pass the turns as children. */
|
|
14121
15434
|
"helix-headless-chat": DefineCustomElement<
|
|
14122
15435
|
HelixHeadlessChat,
|
|
14123
15436
|
HelixHeadlessChatVueProps,
|
|
14124
15437
|
HelixHeadlessChatVueEvents
|
|
14125
15438
|
>;
|
|
14126
|
-
/** The host is the group. It has 'role="group"' through internals, and 'label' names it. Without a name, screen readers announce the checkboxes as separate controls. **Each checkbox submits its own value.** Checkboxes are already form-associated, and a native group is several inputs that share a name, so the group adds no form value of its own. It adds the grouping, a shared 'name' that you write once, and one place to read and write the whole set. 'value' is the checked values, separated by commas, in the order the checkboxes are written, read from the boxes themselves. Setting it checks exactly those values and unchecks the rest. 'select-all' draws a box above the set that checks every enabled box, or unchecks them all once every one is checked. It shows a dash while only some are checked, and changes the set through the same cancelable 'helix-before-change' a box does. A checkbox is a member wherever it sits inside the group, in a row or a grid cell of your own, unless another group inside this one holds it. A field of another kind inside the group, such as an "Other" text field, sends its own 'input' and 'change' past the group. **The group shows the message you set in 'feedback'.** It is form-associated only for validity and never calls 'setFormValue', so the browser does not generate a message for it. */
|
|
15439
|
+
/** The host is the group. It has 'role="group"' through internals, and 'label' names it. Without a name, screen readers announce the checkboxes as separate controls. **Each checkbox submits its own value.** Checkboxes are already form-associated, and a native group is several inputs that share a name, so the group adds no form value of its own. It adds the grouping, a shared 'name' that you write once, and one place to read and write the whole set. 'value' is the checked values, separated by commas, in the order the checkboxes are written, read from the boxes themselves. Setting it checks exactly those values and unchecks the rest. 'select-all' draws a box above the set that checks every enabled box, or unchecks them all once every one is checked. It shows a dash while only some are checked, and changes the set through the same cancelable 'helix-before-change' a box does. A checkbox is a member wherever it sits inside the group, in a row or a grid cell of your own, unless another group inside this one holds it. A field of another kind inside the group, such as an "Other" text field, sends its own 'input' and 'change' past the group. **The group shows the message you set in 'feedback'.** It is form-associated only for validity and never calls 'setFormValue', so the browser does not generate a message for it. **Keyboard.** Each box is its own tab stop, as a set of native checkboxes is, and Space checks the focused one. The select-all box comes first. */
|
|
14127
15440
|
"helix-headless-checkbox-group": DefineCustomElement<
|
|
14128
15441
|
HelixHeadlessCheckboxGroup,
|
|
14129
15442
|
HelixHeadlessCheckboxGroupVueProps,
|
|
14130
15443
|
HelixHeadlessCheckboxGroupVueEvents
|
|
14131
15444
|
>;
|
|
14132
|
-
/** Renders a native '<input type="checkbox">', so the Space key, the focus ring, and the indeterminate glyph come from the platform. 'delegatesFocus' sends focus to the input, and the input is in the server-rendered markup, so the control works before any script loads. An input inside a shadow root does not submit with a form. The host is form-associated and uses 'ElementInternals' for its value, its validity, and form reset. A checked box submits its 'value', and an unchecked one submits nothing, as a native checkbox does. 'indeterminate' changes only the presentation. Assistive technology reports it as neither checked nor unchecked, it never submits, and the first click resolves it. */
|
|
15445
|
+
/** Renders a native '<input type="checkbox">', so the Space key, the focus ring, and the indeterminate glyph come from the platform. 'delegatesFocus' sends focus to the input, and the input is in the server-rendered markup, so the control works before any script loads. An input inside a shadow root does not submit with a form. The host is form-associated and uses 'ElementInternals' for its value, its validity, and form reset. A checked box submits its 'value', and an unchecked one submits nothing, as a native checkbox does. 'indeterminate' changes only the presentation. Assistive technology reports it as neither checked nor unchecked, it never submits, and the first click resolves it. **Keyboard.** The box is one tab stop. | Key | What it does | |---|---| | Space | Checks or unchecks the box, and resolves 'indeterminate'. | The native input reports checked, unchecked, or mixed. 'aria-readonly' is set under 'readonly', and 'aria-invalid' and 'aria-describedby' point at the message while one shows. */
|
|
14133
15446
|
"helix-headless-checkbox": DefineCustomElement<
|
|
14134
15447
|
HelixHeadlessCheckbox,
|
|
14135
15448
|
HelixHeadlessCheckboxVueProps,
|
|
14136
15449
|
HelixHeadlessCheckboxVueEvents
|
|
14137
15450
|
>;
|
|
14138
|
-
/** 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 '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. */
|
|
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. */
|
|
14139
15452
|
"helix-headless-code-block": DefineCustomElement<
|
|
14140
15453
|
HelixHeadlessCodeBlock,
|
|
14141
15454
|
HelixHeadlessCodeBlockVueProps,
|
|
@@ -14153,7 +15466,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14153
15466
|
HelixHeadlessColorInputVueProps,
|
|
14154
15467
|
HelixHeadlessColorInputVueEvents
|
|
14155
15468
|
>;
|
|
14156
|
-
/** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. A screen reader hears the color's name, such as "vibrant red", after the two numbers on the square and after the number on the hue ramp, and each preset is named by its color. Set 'color-words' to speak the names in another language. */
|
|
15469
|
+
/** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. A screen reader hears the color's name, such as "vibrant red", after the two numbers on the square and after the number on the hue ramp, and each preset is named by its color. The opacity ramp is heard as a percentage. Set 'color-words' to speak the names in another language. The presets are a listbox with the current color selected, and one tab stop. The arrow keys move between them, Home and End go to the ends, and Enter, Space or a press chooses one. */
|
|
14157
15470
|
"helix-headless-color-picker": DefineCustomElement<
|
|
14158
15471
|
HelixHeadlessColorPicker,
|
|
14159
15472
|
HelixHeadlessColorPickerVueProps,
|
|
@@ -14177,7 +15490,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14177
15490
|
HelixHeadlessCopyButtonVueProps,
|
|
14178
15491
|
HelixHeadlessCopyButtonVueEvents
|
|
14179
15492
|
>;
|
|
14180
|
-
/** Declare the columns as 'TableColumn' children and pass the rows as an array. The schema stays readable in the HTML, and the rows can be windowed, which ten thousand row elements cannot be. '''html <helix-headless-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-headless-table-column field="name" sortable>Name</helix-headless-table-column> <helix-headless-table-column field="size" text-align="end" sortable .cell=${bytes}>Size</helix-headless-table-column> </helix-headless-data-table> ''' For a short table written out by hand, use 'Table', which takes rows as markup. Sort and filter apply to the whole set, including the rows on other pages. **The cell values do not server-render.** The headings and the row elements do. Reading a cell needs the columns, and Lit SSR does not pass the column children to this element, so a crawler sees an empty table of the right shape. Use 'Table' when the served HTML has to carry the values. 'selectable' adds a column of checkboxes, keyed on 'row-key': - A row is selected by its key, so the selection survives a sort, a filter, and a page change. - 'selected' holds the chosen keys, comma separated, the same shape 'Listbox' uses for a multiple choice. As with 'sort', writing it applies the selection, and 'default-selected' holds what the markup declared. - The checkbox in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. To act on a single row, such as opening it, put a link or a button in a cell. The grid is one tab stop, and the arrow keys move between its cells, the headings included
|
|
15493
|
+
/** Declare the columns as 'TableColumn' children and pass the rows as an array. The schema stays readable in the HTML, and the rows can be windowed, which ten thousand row elements cannot be. '''html <helix-headless-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-headless-table-column field="name" sortable>Name</helix-headless-table-column> <helix-headless-table-column field="size" text-align="end" sortable .cell=${bytes}>Size</helix-headless-table-column> </helix-headless-data-table> ''' For a short table written out by hand, use 'Table', which takes rows as markup. Sort and filter apply to the whole set, including the rows on other pages. **The cell values do not server-render.** The headings and the row elements do. Reading a cell needs the columns, and Lit SSR does not pass the column children to this element, so a crawler sees an empty table of the right shape. Use 'Table' when the served HTML has to carry the values. 'selectable' adds a column of checkboxes, keyed on 'row-key': - A row is selected by its key, so the selection survives a sort, a filter, and a page change. - 'selected' holds the chosen keys, comma separated, the same shape 'Listbox' uses for a multiple choice. As with 'sort', writing it applies the selection, and 'default-selected' holds what the markup declared. - The checkbox in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. - Shift with a press on a checkbox selects every row between it and the row last chosen. To act on a single row, such as opening it, put a link or a button in a cell. **Keyboard.** The grid is one tab stop, and the arrow keys move between its cells, the headings included. | 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 heading row and the 'load-more' row 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 grid. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's controls. Escape moves back to the cell, and Tab moves between the controls of one cell. | | Enter, Space on a sortable heading | Sorts by the column. | | Enter, Space on the 'load-more' row | Sends 'helix-load-more'. | | Space on a row | Selects the row, in a 'selectable' table. | | Shift with Down or Up | Selects the rows it moves across, in a 'selectable' table. | | Shift with Space | Selects every row from the one last chosen, in a 'selectable' table. | | Control or Command with A | Selects every row, in a 'selectable' table. | | Right on a row header in a tree grid | Opens a closed row, and moves one cell along an open one. | | Left on a row header in a tree grid | Closes an open row, and moves to the parent of a closed one. | | A letter or a word | Moves to the next row whose row header starts with what you typed. | 'selected' and 'expanded' hold their keys in the order of the rows, as do 'helix-select', 'helix-selected' and 'helix-expand'. Each row is named by its row header, the column marked 'row-header', or the first column with a 'field' where none is. A screen reader says it as a reader moves between rows. **Rows that hold rows.** 'child-field' names the field that holds a row's child rows, and the grid becomes a tree grid. The row header column draws a mark that a press opens and closes a row by, and 'expanded' holds the keys of the open rows, which 'row-key' names. Right on a closed row's header opens it, Left on an open one closes it, and Left on a child moves to its parent. A sort orders the rows under each parent, and a search shows the rows that lead to each match, open. 'load-more' adds a row after the last one with a button that sends 'helix-load-more'. A 'windowed' table also sends it by itself once a reader scrolls within one screen of the end, once for each number of rows. Add the next rows to 'rows', and set 'loading' while they are on their way. The controls inside the cells leave the tab order, so Tab moves past the whole grid. A windowed table keeps the row holding focus drawn while the rest scroll away. People can resize and reorder the columns. 'resizable' on a column puts a separator on its edge. 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The new order is written to 'order' as a list of fields. Your markup is not rewritten: the table assigns the headings to its header in that order. 'csv()' returns the result as text: every row that passes the filter, in the order and the columns on screen. Saving the file is up to you. 'DataTable' has no 'columns' attribute. Each 'TableColumn' is part of the schema, so you size a column with its own 'width'. 'Table' has 'columns' because its cells are markup you write and it can have no columns at all. Written on 'DataTable', 'columns' has no effect, so watch for it when you move a table from 'Table' to 'DataTable'. */
|
|
14181
15494
|
"helix-headless-data-table": DefineCustomElement<
|
|
14182
15495
|
HelixHeadlessDataTable,
|
|
14183
15496
|
HelixHeadlessDataTableVueProps,
|
|
@@ -14195,25 +15508,25 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14195
15508
|
HelixHeadlessDatePickerVueProps,
|
|
14196
15509
|
HelixHeadlessDatePickerVueEvents
|
|
14197
15510
|
>;
|
|
14198
|
-
/** 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. */
|
|
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. */
|
|
14199
15512
|
"helix-headless-description-list-item": DefineCustomElement<
|
|
14200
15513
|
HelixHeadlessDescriptionListItem,
|
|
14201
15514
|
HelixHeadlessDescriptionListItemVueProps,
|
|
14202
15515
|
HelixHeadlessDescriptionListItemVueEvents
|
|
14203
15516
|
>;
|
|
14204
|
-
/** Renders a '<dl>', with each item's label as a '<dt>' and its value as a '<dd>', for panels such as "Owner: Ada, Region: us-east, Created: 3 days ago". A screen reader announces which label goes with which value and how many pairs there are. **Each item renders its own term and description**, and the list takes the items through its slot. The accessibility tree is built from the flattened tree, so the pairs appear inside the list. Measured in Chromium, the result matches a plain '<dl>' with the same content node for node, both with a slotted label and with an item set to 'display: contents'. */
|
|
15517
|
+
/** Renders a '<dl>', with each item's label as a '<dt>' and its value as a '<dd>', for panels such as "Owner: Ada, Region: us-east, Created: 3 days ago". A screen reader announces which label goes with which value and how many pairs there are. **Each item renders its own term and description**, and the list takes the items through its slot. The accessibility tree is built from the flattened tree, so the pairs appear inside the list. Measured in Chromium, the result matches a plain '<dl>' with the same content node for node, both with a slotted label and with an item set to 'display: contents'. **A named list is a named group.** A '<dl>' takes no name in ARIA 1.2, so the list becomes a group around it when it has 'label', 'aria-label' or 'aria-labelledby', and the name lands on the group. Unnamed, the host adds nothing to the tree. */
|
|
14205
15518
|
"helix-headless-description-list": DefineCustomElement<
|
|
14206
15519
|
HelixHeadlessDescriptionList,
|
|
14207
15520
|
HelixHeadlessDescriptionListVueProps,
|
|
14208
15521
|
HelixHeadlessDescriptionListVueEvents
|
|
14209
15522
|
>;
|
|
14210
|
-
/** Renders a native '<dialog>' opened with 'showModal()'. The platform provides: - the top layer, so the dialog is above everything whatever the 'z-index' - a backdrop - closing with Escape - an inert page behind the dialog, unreachable by pointer, keyboard, or virtual cursor 'open' calls 'showModal()', and every way the dialog closes goes through 'requestOpen'. A native dialog closes three ways: the property, Escape, and a '<form method="dialog">' submit. Routing all three through 'requestOpen' keeps your state in step, so the dialog never closes while your state still says it is open, which would leave it impossible to reopen. The dialog'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. While it is open, the page behind it does not scroll. The dialog is described by the words at the start of its body: the elements in the default slot before the first one that is or holds a control. A question above a form describes the dialog, and the form does not. An 'aria-describedby' on the host replaces it. Set 'alert' for a dialog that interrupts to ask for an answer, such as a confirmation before a deletion. It is an 'alertdialog', which a screen reader announces with its description as it opens. Set 'dismissible' to draw a close control, labeled by 'dismiss-label'. */
|
|
15523
|
+
/** Renders a native '<dialog>' opened with 'showModal()'. The platform provides: - the top layer, so the dialog is above everything whatever the 'z-index' - a backdrop - closing with Escape - an inert page behind the dialog, unreachable by pointer, keyboard, or virtual cursor The dialog adds one thing to those: 'Tab' from its last control goes to its first, and 'Shift+Tab' from its first to its last. A native modal lets 'Tab' past its last control out to the browser's own controls. 'open' calls 'showModal()', and every way the dialog closes goes through 'requestOpen'. A native dialog closes three ways: the property, Escape, and a '<form method="dialog">' submit. Routing all three through 'requestOpen' keeps your state in step, so the dialog never closes while your state still says it is open, which would leave it impossible to reopen. The dialog'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. While it is open, the page behind it does not scroll. The dialog is described by the words at the start of its body: the elements in the default slot before the first one that is or holds a control. A question above a form describes the dialog, and the form does not. A Helix component that draws words and no control, such as 'Text', counts as words. An 'aria-describedby' on the host replaces it. Set 'alert' for a dialog that interrupts to ask for an answer, such as a confirmation before a deletion. It is an 'alertdialog', which a screen reader announces with its description as it opens. Set 'dismissible' to draw a close control, labeled by 'dismiss-label'. */
|
|
14211
15524
|
"helix-headless-dialog": DefineCustomElement<
|
|
14212
15525
|
HelixHeadlessDialog,
|
|
14213
15526
|
HelixHeadlessDialogVueProps,
|
|
14214
15527
|
HelixHeadlessDialogVueEvents
|
|
14215
15528
|
>;
|
|
14216
|
-
/** 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. Use 'orientation="vertical"' between items on one line, such as inside a toolbar. A vertical divider stretches to fit its flex parent and sets no height of its own. */
|
|
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. Set 'announced' for a line that divides one thing from another, and it is read as a separator, named by any content set into it. Use 'orientation="vertical"' between items on one line, such as inside a toolbar. A vertical divider stretches to fit its flex parent and sets no height of its own. */
|
|
14217
15530
|
"helix-headless-divider": DefineCustomElement<
|
|
14218
15531
|
HelixHeadlessDivider,
|
|
14219
15532
|
HelixHeadlessDividerVueProps,
|
|
@@ -14225,7 +15538,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14225
15538
|
HelixHeadlessDonutChartVueProps,
|
|
14226
15539
|
HelixHeadlessDonutChartVueEvents
|
|
14227
15540
|
>;
|
|
14228
|
-
/** 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. 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> ''' */
|
|
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> ''' */
|
|
14229
15542
|
"helix-headless-drawer": DefineCustomElement<
|
|
14230
15543
|
HelixHeadlessDrawer,
|
|
14231
15544
|
HelixHeadlessDrawerVueProps,
|
|
@@ -14237,19 +15550,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14237
15550
|
HelixHeadlessDrilldownItemVueProps,
|
|
14238
15551
|
HelixHeadlessDrilldownItemVueEvents
|
|
14239
15552
|
>;
|
|
14240
|
-
/** One panel whose content changes as you move between pages. Use it where there is no room for a second column, such as on a phone, or on a touch screen with no hover to open one. It is a region that stays where you put it, such as inside a drawer, a sidebar, or a settings panel. A 'Menu' opens from a trigger and closes when you are done. 'Menu' can drill into pages too, through the same controller. Rows are places to go and commands to run. Nothing here is form-associated and nothing is submitted. To choose a value, use a 'Listbox'. A row that opens a page contains that page, so the stack holds one reference and reads the rest from the DOM. The behavior lives in 'DrilldownController', which 'Menu' shares. The rows of the page showing are a 'menu', named by 'label' on the top page and by the page's title below it. The back button and the title sit above the menu. Disabled rows stay reachable with the arrow keys, and typing a letter moves to the next row whose name starts with it. */
|
|
15553
|
+
/** One panel whose content changes as you move between pages. Use it where there is no room for a second column, such as on a phone, or on a touch screen with no hover to open one. It is a region that stays where you put it, such as inside a drawer, a sidebar, or a settings panel. A 'Menu' opens from a trigger and closes when you are done. 'Menu' can drill into pages too, through the same controller. Rows are places to go and commands to run. Nothing here is form-associated and nothing is submitted. To choose a value, use a 'Listbox'. A row that opens a page contains that page, so the stack holds one reference and reads the rest from the DOM. The behavior lives in 'DrilldownController', which 'Menu' shares. After each move the host carries 'data-direction', 'forward' into a page or 'back' out of one, and records ':state(forward)' or ':state(back)', so a stylesheet can slide the new page in from the side the reader is going. Both are written again on every move, so an animation keyed on them runs for each page, two moves the same way included. The styled tier slides the page and swaps it at once under 'prefers-reduced-motion'. Keys, on a row: Up and Down Arrow move between the rows, Home and End go to the first and the last, and a typed letter moves to the next row whose name starts with it. Enter, Space, or Right Arrow opens a row's page, and Left Arrow or Escape goes back, the two arrows swapping on a right-to-left page. The rows of the page showing are a 'menu', named by 'label' on the top page and by the page's title below it. The back button and the title sit above the menu. Disabled rows stay reachable with the arrow keys, and typing a letter moves to the next row whose name starts with it. */
|
|
14241
15554
|
"helix-headless-drilldown": DefineCustomElement<
|
|
14242
15555
|
HelixHeadlessDrilldown,
|
|
14243
15556
|
HelixHeadlessDrilldownVueProps,
|
|
14244
15557
|
HelixHeadlessDrilldownVueEvents
|
|
14245
15558
|
>;
|
|
14246
|
-
/** 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. 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. */
|
|
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. */
|
|
14247
15560
|
"helix-headless-empty": DefineCustomElement<
|
|
14248
15561
|
HelixHeadlessEmpty,
|
|
14249
15562
|
HelixHeadlessEmptyVueProps,
|
|
14250
15563
|
HelixHeadlessEmptyVueEvents
|
|
14251
15564
|
>;
|
|
14252
|
-
/** File Input keeps a real '<input type="file">' and makes it invisible. Only a file input opens the file picker: the browser opens it for a click on the input or on a '<label>' that points at it, and a script cannot open it on its own. A custom button would still call '.click()' on a hidden input, and a screen reader would find two controls. The input holds the label, the name, the validity, and the focus, and the visible trigger is a '<label for>'. The label is not focusable. The input is, and Enter and Space on it open the picker. Files arrive from the picker, a drop, or a paste onto the field, and each one is screened: 'accept', 'max-file-size', 'max-files' and your own 'validate' can refuse it. A refused file is left out, 'helix-reject' lists each one with its reason, and a reader hears 'rejected-text' with the names filled in. 'directory' asks the picker for a folder. */
|
|
15565
|
+
/** File Input keeps a real '<input type="file">' and makes it invisible. Only a file input opens the file picker: the browser opens it for a click on the input or on a '<label>' that points at it, and a script cannot open it on its own. A custom button would still call '.click()' on a hidden input, and a screen reader would find two controls. The input holds the label, the name, the validity, and the focus, and the visible trigger is a '<label for>'. The label is not focusable. The input is, and Enter and Space on it open the picker. Files arrive from the picker, a drop, or a paste onto the field, and each one is screened: 'accept', 'max-file-size', 'max-files' and your own 'validate' can refuse it. A refused file is left out, 'helix-reject' lists each one with its reason, and a reader hears 'rejected-text' with the names filled in. A reader also hears 'added-text' for the files a drop or a paste adds, and 'removed-text' for a file a remove button takes out, since neither moves focus or says anything on its own. 'directory' asks the picker for a folder. 'transformFiles' changes the files a field takes before it holds them, such as shrinking an image. Each chosen file is a row: its name, its size and type as tags, and a remove button. 'renderFile' draws the row's details your own way, and the 'remove-icon' slot replaces the button's icon. **Keyboard.** The input is the tab stop, and each file's remove button is one more. | Key | What it does | |---|---| | Enter, Space | On the input, opens the picker. On a remove button, removes that file and moves focus to the button of the file in its place, or back to the input. | | Control+V, Command+V | Takes files from the clipboard, as a drop does. | */
|
|
14253
15566
|
"helix-headless-file-input": DefineCustomElement<
|
|
14254
15567
|
HelixHeadlessFileInput,
|
|
14255
15568
|
HelixHeadlessFileInputVueProps,
|
|
@@ -14279,7 +15592,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14279
15592
|
HelixHeadlessFilterOperatorVueProps,
|
|
14280
15593
|
HelixHeadlessFilterOperatorVueEvents
|
|
14281
15594
|
>;
|
|
14282
|
-
/** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types.
|
|
15595
|
+
/** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types. Backspace in an empty field fires 'helix-dismiss' on the last token, the same event its remove control fires, so one handler covers the pointer and the keyboard. **What a form receives.** The text under 'name', and then one more entry under 'name' for each token, in the order the tokens stand: | Token | Entry | |---|---| | Any element with a 'value' attribute | The value as written: 'saved:mine' | | 'FilterChip' with 'name' and values | 'status:open,pending' | | The same, with 'operator="none"' (what a typed '-status:' makes) | '-status:open,pending' | | The same, with any other 'operator' except 'any' | 'created[after]:2024' | | A token with neither | Nothing | The values are the chip's text outside its 'field' and 'operator' slots, with the spaces around each comma removed. A server splits an entry at its first colon, reads a leading '-' as the negation, and reads a word in brackets before the colon as the comparison. **Keyboard.** Focus stays in the text. The text names the highlighted suggestion as its 'aria-activedescendant'. | Key | What it does | |---|---| | Enter | Presses the highlighted suggestion. With none highlighted, reads the typed filters into chips, or submits the form when there are none. | | Down, Up | Moves the highlight through the suggestions, wrapping, and opens the panel. | | Home, End | Highlights the first or the last suggestion while the panel is open. | | Escape | Closes the panel and stops there, so a dialog around the field stays open. | | Backspace | In an empty field, asks the last token to go. | **Typed filters.** The field parses only the fields you declare. Write 'FilterField' elements, usually inside the 'FilterMenu' slotted into 'start', so the picker and the text share one set. On Enter, the field reads the text against them. 'disposition:refunded,settled' and '-disposition:refunded' fire 'helix-facet' exactly as ticking those values in the picker would, and the parsed text is removed. Everything else stays, so 'refund tuesday disposition:settled' is a filter and a search at once. Helix defines the punctuation and you define every word. 'grammar.ts' has the full rule, so read it before you rely on it. A field with no 'FilterField' in it parses nothing. A field whose values cannot be listed, such as 'assignee:ada', goes directly inside this element, outside the menu. It is not assigned to a slot, so nothing draws it and the menu has no page for it, and the grammar still reads it. **Suggestions.** Slot options into 'suggestions' and the field shows them, moves through them with the arrow keys, and presses one on Enter. The option fires its own 'helix-select', and you decide what choosing it means. Keys before a colon and values after it use the same panel with different contents. 'filter-suggestions' narrows the panel to the options whose words hold the term at the caret, after its colon, ignoring case and accents, and hides the rest. 'readFilterText' is exported so you can narrow it yourself against partly typed text. While the panel is open, a reader hears how many suggestions it offers. The panel opens when it has options and closes when it has none, and a choice does not close it, so after picking a key you see its values next. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **State.** Three things have three different owners: - 'value' is the text. The user types, the element applies it, and 'input' reports it. Setting 'value' seeds or corrects the text, and the next keystroke overwrites it, even in React. To control the value, cancel 'helix-before-change' and write the value you want, as with every field in this library. 'default-value' seeds the field. - 'open' is the suggestions panel. Cancel 'helix-before-open' or 'helix-before-close' to control it, and use 'default-open' to seed it. - Tokens are your elements in a slot and hold no state. A token goes when you remove it from your markup after 'helix-dismiss'. A 'FilterChip' naming a declared field works differently, because the picker holds what is ticked and removing the chip alone would leave its value ticked in the hidden menu. Its dismissal is treated as the field being filtered by nothing, so it fires 'helix-facet' like every other change, and the chip goes when the filter goes. */
|
|
14283
15596
|
"helix-headless-filter-input": DefineCustomElement<
|
|
14284
15597
|
HelixHeadlessFilterInput,
|
|
14285
15598
|
HelixHeadlessFilterInputVueProps,
|
|
@@ -14297,43 +15610,43 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14297
15610
|
HelixHeadlessGraphVueProps,
|
|
14298
15611
|
HelixHeadlessGraphVueEvents
|
|
14299
15612
|
>;
|
|
14300
|
-
/** 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. */
|
|
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. */
|
|
14301
15614
|
"helix-headless-heatmap": DefineCustomElement<
|
|
14302
15615
|
HelixHeadlessHeatmap,
|
|
14303
15616
|
HelixHeadlessHeatmapVueProps,
|
|
14304
15617
|
HelixHeadlessHeatmapVueEvents
|
|
14305
15618
|
>;
|
|
14306
|
-
/** A button with an icon for its content. Always set 'label': an icon-only control has no accessible name unless you give it one, and a button whose content is a glyph is announced as "button" and nothing else. A separate component with a 'label' makes the name something a review can check. The element is registered, so other headless components can render 'helix-headless-icon-button', for example as an announcement's dismiss control. They do not depend on a styled tag, which would never upgrade in this tier. Icon Button is a top-level component. A namespace such as 'Button.Icon' would mean a part of a button, and an icon-only button is a complete button with different content and a different shape. */
|
|
15619
|
+
/** A button with an icon for its content. Always set 'label': an icon-only control has no accessible name unless you give it one, and a button whose content is a glyph is announced as "button" and nothing else. A separate component with a 'label' makes the name something a review can check. The element is registered, so other headless components can render 'helix-headless-icon-button', for example as an announcement's dismiss control. They do not depend on a styled tag, which would never upgrade in this tier. Icon Button is a top-level component. A namespace such as 'Button.Icon' would mean a part of a button, and an icon-only button is a complete button with different content and a different shape. **Keyboard.** Enter and Space press the button, as 'Button''s do. */
|
|
14307
15620
|
"helix-headless-icon-button": DefineCustomElement<
|
|
14308
15621
|
HelixHeadlessIconButton,
|
|
14309
15622
|
HelixHeadlessIconButtonVueProps,
|
|
14310
15623
|
HelixHeadlessIconButtonVueEvents
|
|
14311
15624
|
>;
|
|
14312
|
-
/** 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. 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. */
|
|
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. */
|
|
14313
15626
|
"helix-headless-icon": DefineCustomElement<
|
|
14314
15627
|
HelixHeadlessIcon,
|
|
14315
15628
|
HelixHeadlessIconVueProps,
|
|
14316
15629
|
HelixHeadlessIconVueEvents
|
|
14317
15630
|
>;
|
|
14318
|
-
/** 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. */
|
|
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. */
|
|
14319
15632
|
"helix-headless-image": DefineCustomElement<
|
|
14320
15633
|
HelixHeadlessImage,
|
|
14321
15634
|
HelixHeadlessImageVueProps,
|
|
14322
15635
|
HelixHeadlessImageVueEvents
|
|
14323
15636
|
>;
|
|
14324
|
-
/** 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. */
|
|
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. */
|
|
14325
15638
|
"helix-headless-input": DefineCustomElement<
|
|
14326
15639
|
HelixHeadlessInput,
|
|
14327
15640
|
HelixHeadlessInputVueProps,
|
|
14328
15641
|
HelixHeadlessInputVueEvents
|
|
14329
15642
|
>;
|
|
14330
|
-
/** 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. */
|
|
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"}''. */
|
|
14331
15644
|
"helix-headless-kbd": DefineCustomElement<
|
|
14332
15645
|
HelixHeadlessKbd,
|
|
14333
15646
|
HelixHeadlessKbdVueProps,
|
|
14334
15647
|
HelixHeadlessKbdVueEvents
|
|
14335
15648
|
>;
|
|
14336
|
-
/** 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'. 'hidden-series' holds the hidden names, so a page can start with some hidden or read which are. */
|
|
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. */
|
|
14337
15650
|
"helix-headless-legend": DefineCustomElement<
|
|
14338
15651
|
HelixHeadlessLegend,
|
|
14339
15652
|
HelixHeadlessLegendVueProps,
|
|
@@ -14345,7 +15658,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14345
15658
|
HelixHeadlessLightboxItemVueProps,
|
|
14346
15659
|
HelixHeadlessLightboxItemVueEvents
|
|
14347
15660
|
>;
|
|
14348
|
-
/** 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'. Without it, compose the chrome yourself in the 'header' and 'footer' slots, with buttons that send '--previous', '--next' and '--close'. 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. */
|
|
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. */
|
|
14349
15662
|
"helix-headless-lightbox": DefineCustomElement<
|
|
14350
15663
|
HelixHeadlessLightbox,
|
|
14351
15664
|
HelixHeadlessLightboxVueProps,
|
|
@@ -14357,13 +15670,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14357
15670
|
HelixHeadlessLineChartVueProps,
|
|
14358
15671
|
HelixHeadlessLineChartVueEvents
|
|
14359
15672
|
>;
|
|
14360
|
-
/** Provides layout and semantics. The row is a target only when you set 'href'. **'href' makes the row a link.** The component wraps the leading content, the label, and the description in an '<a part="link">' inside the row, as 'Tree.Item' does. An anchor of your own cannot wrap slots it does not own. With the anchor, the row is a target, Enter follows it, middle click opens a new tab, the status bar shows the destination, and all of it works before JavaScript runs. **The 'end' slot sits beside the link, outside it**, so a button or a menu there is a control of its own: a click on it does not follow the link, and its name is not part of the link's. Client-side routing needs your own handling. A router cannot render its anchor inside the shadow root, so to navigate without a page load, intercept the click: the anchor is in 'composedPath()'. Handle only a plain primary click, so native gestures keep working. **For a row that holds controls and is not a destination, use 'data-list-item'.** With 'href' unset, the row is not a link. */
|
|
15673
|
+
/** Provides layout and semantics. The row is a target only when you set 'href'. **'href' makes the row a link.** The component wraps the leading content, the label, and the description in an '<a part="link">' inside the row, as 'Tree.Item' does. An anchor of your own cannot wrap slots it does not own. With the anchor, the row is a target, Enter follows it, middle click opens a new tab, the status bar shows the destination, and all of it works before JavaScript runs. **The 'end' slot sits beside the link, outside it**, so a button or a menu there is a control of its own: a click on it does not follow the link, and its name is not part of the link's. Client-side routing needs your own handling. A router cannot render its anchor inside the shadow root, so to navigate without a page load, intercept the click: the anchor is in 'composedPath()'. Handle only a plain primary click, so native gestures keep working. **For a row that holds controls and is not a destination, use 'data-list-item'.** With 'href' unset, the row is not a link. 'current' marks the row a reader is on, such as the page in a list of pages, with 'aria-current' on its link, or on the row where it has none. **In a list with 'selection-mode', the row is a row of a grid.** The list gives it its role, its place in the one tab stop and, where the list selects, whether it is selected. Its link leaves the tab order there, and Enter follows it from the row. */
|
|
14361
15674
|
"helix-headless-list-item": DefineCustomElement<
|
|
14362
15675
|
HelixHeadlessListItem,
|
|
14363
15676
|
HelixHeadlessListItemVueProps,
|
|
14364
15677
|
HelixHeadlessListItemVueEvents
|
|
14365
15678
|
>;
|
|
14366
|
-
/** Sets 'role="list"' on the host, so a screen reader counts the rows and announces each one's position, such as "1 of 7". */
|
|
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 End | Moves without selecting, under 'replace'. | | Control or Command with A | Selects every row, in 'multiple'. | | 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. */
|
|
14367
15680
|
"helix-headless-list": DefineCustomElement<
|
|
14368
15681
|
HelixHeadlessList,
|
|
14369
15682
|
HelixHeadlessListVueProps,
|
|
@@ -14375,7 +15688,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14375
15688
|
HelixHeadlessListboxVueProps,
|
|
14376
15689
|
HelixHeadlessListboxVueEvents
|
|
14377
15690
|
>;
|
|
14378
|
-
/** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. **'for' names the region being loaded**, and the loader sets 'aria-busy="true"' on it for as long as the loader is on the page, so a screen reader waits for the region rather than reading it half filled. Two loaders in one region hold it busy until the last one leaves. **'delay' keeps a quick load from flashing a loader.** The loader stays hidden, and silent, for that many milliseconds, and appears only if the work is still going. */
|
|
15691
|
+
/** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. **'for' names the region being loaded**, and the loader sets 'aria-busy="true"' on it for as long as the loader is on the page, so a screen reader waits for the region rather than reading it half filled. Two loaders in one region hold it busy until the last one leaves. A region drawn after the loader is marked when it arrives. **'delay' keeps a quick load from flashing a loader.** The loader stays hidden, and silent, for that many milliseconds, and appears only if the work is still going. While it waits it carries ':state(waiting)'. */
|
|
14379
15692
|
"helix-headless-loader": DefineCustomElement<
|
|
14380
15693
|
HelixHeadlessLoader,
|
|
14381
15694
|
HelixHeadlessLoaderVueProps,
|
|
@@ -14429,7 +15742,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14429
15742
|
HelixHeadlessMapRasterVueProps,
|
|
14430
15743
|
HelixHeadlessMapRasterVueEvents
|
|
14431
15744
|
>;
|
|
14432
|
-
/** Wraps a map drawn by MapLibre, Leaflet, or another renderer. The frame adds a name for the map, a column of controls, and a strip for the map credit. Helix does not draw the map itself. The controls are one column, and 'controls' names which ones: 'fullscreen', 'layers', 'tilt', 'zoom', and 'compass', top to bottom. 'zoom compass fullscreen' by default. The compass's needle points north as the map turns, and pressing it turns the map to face north. Add 'pan' and 'rotate' for buttons around the compass that move and turn the map. Dragging is otherwise the only way a pointer moves the map, so add them where the map has to be usable without dragging, as WCAG 2.2 asks at level AA. The arrow keys pan the map and Shift with Left or Right turns it either way. The pan and zoom buttons and the arrow keys send 'helix-map-pan' and 'helix-map-zoom'. Move your map in response, or connect it with 'connectMap' from '@fusion.dev/helix-map', which does this for you. Add 'tilt' to 'controls' for the 3D button, which a map with 3D buildings or terrain needs. It is a toggle. Pressed, it tilts the map 50 degrees, and 'connectMap' raises the buildings and the ground. Pressed again, it makes the map flat, and lays them flat too. Shift with Up or Down tilts the map in steps. Turning and tilting send 'helix-map-rotate' and 'helix-map-tilt', which 'connectMap' answers on MapLibre. Leaflet draws maps flat and does not rotate. Add 'layers' to 'controls' for a layers button. It opens a menu with a tile for each layer, which sets the layer's 'hidden' attribute. Layers with the same 'group', such as a route and its dotted legs, share one tile. A tile sends 'helix-before-toggle' from the layer first, so you can store the choice or refuse it. Imagery, a 'helix-map-raster' with 'ground', is a map type and not a tile. The menu opens with a card for each type, Standard, Hybrid, and Satellite, with a picture of the map in it, and 'map-type' says which is chosen. Standard hides the imagery, Hybrid draws it under the roads and names, and Satellite draws it alone. Choosing one sends 'helix-before-change' with its name, and 'change' once 'map-type' holds it. 'connectMap' does not draw a hidden layer, so a layer you write with 'hidden' starts turned off. Markers, routes, areas, live positions, and points layers go inside the frame as child elements. */
|
|
15745
|
+
/** Wraps a map drawn by MapLibre, Leaflet, or another renderer. The frame adds a name for the map, a column of controls, and a strip for the map credit. Helix does not draw the map itself. The controls are one column, and 'controls' names which ones: 'fullscreen', 'layers', 'tilt', 'zoom', and 'compass', top to bottom. 'zoom compass fullscreen' by default. The compass's needle points north as the map turns, and pressing it turns the map to face north. Add 'pan' and 'rotate' for buttons around the compass that move and turn the map. Dragging is otherwise the only way a pointer moves the map, so add them where the map has to be usable without dragging, as WCAG 2.2 asks at level AA. The arrow keys pan the map and Shift with Left or Right turns it either way. The pan and zoom buttons and the arrow keys send 'helix-map-pan' and 'helix-map-zoom'. Move your map in response, or connect it with 'connectMap' from '@fusion.dev/helix-map', which does this for you. Add 'tilt' to 'controls' for the 3D button, which a map with 3D buildings or terrain needs. It is a toggle. Pressed, it tilts the map 50 degrees, and 'connectMap' raises the buildings and the ground. Pressed again, it makes the map flat, and lays them flat too. Shift with Up or Down tilts the map in steps. Turning and tilting send 'helix-map-rotate' and 'helix-map-tilt', which 'connectMap' answers on MapLibre. Leaflet draws maps flat and does not rotate. Add 'layers' to 'controls' for a layers button. It opens a menu with a tile for each layer, which sets the layer's 'hidden' attribute. Layers with the same 'group', such as a route and its dotted legs, share one tile. A tile sends 'helix-before-toggle' from the layer first, so you can store the choice or refuse it, and 'helix-toggle' from it once 'hidden' holds the choice. Imagery, a 'helix-map-raster' with 'ground', is a map type and not a tile. The menu opens with a card for each type, Standard, Hybrid, and Satellite, with a picture of the map in it, and 'map-type' says which is chosen. Standard hides the imagery, Hybrid draws it under the roads and names, and Satellite draws it alone. Choosing one sends 'helix-before-change' with its name, and 'change' once 'map-type' holds it. 'connectMap' does not draw a hidden layer, so a layer you write with 'hidden' starts turned off. Markers, routes, areas, live positions, and points layers go inside the frame as child elements. */
|
|
14433
15746
|
"helix-headless-map": DefineCustomElement<
|
|
14434
15747
|
HelixHeadlessMap,
|
|
14435
15748
|
HelixHeadlessMapVueProps,
|
|
@@ -14447,31 +15760,37 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14447
15760
|
HelixHeadlessMapTerrainVueProps,
|
|
14448
15761
|
HelixHeadlessMapTerrainVueEvents
|
|
14449
15762
|
>;
|
|
14450
|
-
/** 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. */
|
|
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. Put megamenus in a 'Navigation' with 'arrows' and the arrow keys move between their triggers. 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'. */
|
|
14451
15764
|
"helix-headless-megamenu": DefineCustomElement<
|
|
14452
15765
|
HelixHeadlessMegamenu,
|
|
14453
15766
|
HelixHeadlessMegamenuVueProps,
|
|
14454
15767
|
HelixHeadlessMegamenuVueEvents
|
|
14455
15768
|
>;
|
|
14456
|
-
/** One element covers three kinds of row, and what you give it decides which: - Content in the 'submenu' slot makes the row open a submenu page. - 'checked' makes the row a choice. - With neither, the row is a command. The role follows the kind. A row with 'checked' is 'menuitemcheckbox' with 'aria-checked', and 'exclusive' makes it 'menuitemradio', for a set where only one can be on. A row that opens a page keeps 'menuitem' and sets 'aria-haspopup'. Choosing a choice row checks or unchecks it before 'helix-select' is sent, so a listener reads the new 'checked'. An 'exclusive' row turns on and turns off the 'exclusive' rows next to it. Cancel 'helix-before-toggle' to keep a row as it is and set 'checked' yourself. The menu sets whether the row's page is showing as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. */
|
|
15769
|
+
/** One element covers three kinds of row, and what you give it decides which: - Content in the 'submenu' slot makes the row open a submenu page. - 'checked' makes the row a choice. - With neither, the row is a command. The role follows the kind. A row with 'checked' is 'menuitemcheckbox' with 'aria-checked', and 'exclusive' makes it 'menuitemradio', for a set where only one can be on. A row that opens a page keeps 'menuitem' and sets 'aria-haspopup'. Choosing a choice row checks or unchecks it before 'helix-select' is sent, so a listener reads the new 'checked'. An 'exclusive' row turns on and turns off the 'exclusive' rows next to it. Cancel 'helix-before-toggle' to keep a row as it is and set 'checked' yourself. The menu sets whether the row's page is showing as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. 'shortcut' shows a row's keyboard shortcut after its label, drawn by 'Kbd' in the platform's glyphs, and gives the row 'aria-keyshortcuts'. It binds nothing: the shortcut is the page's to bind. Other trailing words, such as a count, go in the 'end' slot. 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 React Aria's menu item does with its description: a reader hears "Copy", then "Copies the selection". The check mark and the caret are the fallbacks of the 'check' and 'chevron' slots, so a mark of your own replaces either by being slotted. Neither is read as part of the row's name. */
|
|
14457
15770
|
"helix-headless-menu-item": DefineCustomElement<
|
|
14458
15771
|
HelixHeadlessMenuItem,
|
|
14459
15772
|
HelixHeadlessMenuItemVueProps,
|
|
14460
15773
|
HelixHeadlessMenuItemVueEvents
|
|
14461
15774
|
>;
|
|
14462
|
-
/** 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. */
|
|
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 announced>' 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. */
|
|
14463
15776
|
"helix-headless-menu": DefineCustomElement<
|
|
14464
15777
|
HelixHeadlessMenu,
|
|
14465
15778
|
HelixHeadlessMenuVueProps,
|
|
14466
15779
|
HelixHeadlessMenuVueEvents
|
|
14467
15780
|
>;
|
|
15781
|
+
/** The rows inside it are the menu's rows: the arrow keys and typed letters move through them with the rest, and a set of 'exclusive' rows is still the run of them next to each other. The section is a 'group' named by its heading, as React Aria's menu section is, so a screen reader says which group a row is in as it arrives. A section goes on the menu's first page. A submenu's page takes rows and dividers. */
|
|
15782
|
+
"helix-headless-menu-section": DefineCustomElement<
|
|
15783
|
+
HelixHeadlessMenuSection,
|
|
15784
|
+
HelixHeadlessMenuSectionVueProps,
|
|
15785
|
+
HelixHeadlessMenuSectionVueEvents
|
|
15786
|
+
>;
|
|
14468
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. */
|
|
14469
15788
|
"helix-headless-meter": DefineCustomElement<
|
|
14470
15789
|
HelixHeadlessMeter,
|
|
14471
15790
|
HelixHeadlessMeterVueProps,
|
|
14472
15791
|
HelixHeadlessMeterVueEvents
|
|
14473
15792
|
>;
|
|
14474
|
-
/** Renders a real '<nav>', the landmark that screen reader users jump to. Navigation is its own component, separate from 'AppHeader', so you can use it in a header, a footer, or a sidebar. **It renders no links.** Bring your own, mark the current one with 'aria-current="page"', and style them with the 'data-navigation-item' recipe. A router renders its own anchors and cannot render them inside the component's shadow root. The component moves a marker to the current item. It finds the current item by reading 'aria-current', so the attribute that screen readers announce also places the marker. Any value but 'false' counts, so a sidebar of sections on one page can mark the section in view with 'aria-current="location"'. Where several are marked, 'page' wins. Set 'orientation="vertical"' to stack the destinations in a column, for a sidebar. */
|
|
15793
|
+
/** Renders a real '<nav>', the landmark that screen reader users jump to. Navigation is its own component, separate from 'AppHeader', so you can use it in a header, a footer, or a sidebar. **It renders no links.** Bring your own, mark the current one with 'aria-current="page"', and style them with the 'data-navigation-item' recipe. A router renders its own anchors and cannot render them inside the component's shadow root. The component moves a marker to the current item. It finds the current item by reading 'aria-current', so the attribute that screen readers announce also places the marker. Any value but 'false' counts, so a sidebar of sections on one page can mark the section in view with 'aria-current="location"'. Where several are marked, 'page' wins. Set 'orientation="vertical"' to stack the destinations in a column, for a sidebar. Set 'arrows' and the arrow keys move focus between the destinations, as Radix's navigation menu does: left and right along a row, up and down a column, Home and End to the ends. A 'Megamenu' among them is reached at its trigger. Tab still stops at every link, since a navigation is a list of links and not a single control, and the keys across the other axis are left to the page and to an open panel. */
|
|
14475
15794
|
"helix-headless-navigation": DefineCustomElement<
|
|
14476
15795
|
HelixHeadlessNavigation,
|
|
14477
15796
|
HelixHeadlessNavigationVueProps,
|
|
@@ -14489,19 +15808,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14489
15808
|
HelixHeadlessNotificationVueProps,
|
|
14490
15809
|
HelixHeadlessNotificationVueEvents
|
|
14491
15810
|
>;
|
|
14492
|
-
/** 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. */
|
|
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. */
|
|
14493
15812
|
"helix-headless-notifications": DefineCustomElement<
|
|
14494
15813
|
HelixHeadlessNotifications,
|
|
14495
15814
|
HelixHeadlessNotificationsVueProps,
|
|
14496
15815
|
HelixHeadlessNotificationsVueEvents
|
|
14497
15816
|
>;
|
|
14498
|
-
/** A separate family from 'Input''s 'type="number"'. It renders two buttons, binds four keys 'Input' does not, and handles clamping and stepping. The field is 'type="text"' with 'inputmode="decimal"'. Tested in a real browser, 'type="number"' fails in three ways: - Typing '12e' gives a '.value' of '""', so the element cannot see what you typed. A 'type="text"' field keeps '"12e"'. - The mouse wheel over a focused field changes the value, for example from 5 to 4, when you only meant to scroll the page. - 'selectionStart' is 'null', so the caret cannot be managed. 'inputmode="decimal"' keeps the numeric keypad on phones. 'format-options' shows the number with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, while the field is not being edited. Focus shows the number itself, and a typed '$1,200' or '25%' is read back with the same options. The value stays the plain number: '1200', or '0.25' for 25%. The locale's group separators are read in every field, so '1,234' is a number in 'en-US'. On iOS and iPadOS the field is a text field
|
|
15817
|
+
/** A separate family from 'Input''s 'type="number"'. It renders two buttons, binds four keys 'Input' does not, and handles clamping and stepping. The field is 'type="text"' with 'inputmode="decimal"'. Tested in a real browser, 'type="number"' fails in three ways: - Typing '12e' gives a '.value' of '""', so the element cannot see what you typed. A 'type="text"' field keeps '"12e"'. - The mouse wheel over a focused field changes the value, for example from 5 to 4, when you only meant to scroll the page. - 'selectionStart' is 'null', so the caret cannot be managed. 'inputmode="decimal"' keeps the numeric keypad on phones. 'format-options' shows the number with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, while the field is not being edited. Focus shows the number itself, and a typed '$1,200' or '25%' is read back with the same options. The value stays the plain number: '1200', or '0.25' for 25%. The locale's group separators are read in every field, so '1,234' is a number in 'en-US'. On iOS and iPadOS the field is a plain text field, with no 'role="spinbutton"', which VoiceOver reads as a slider you cannot type in, and no role description, so VoiceOver says the field is required. React Aria's NumberField does the same. Validity follows the platform's rules: 'min', 'max', and 'step' are checked and reported through the host's own 'setValidity', under the platform's flag names. Stepping is separate from typing, so a number is not corrected while you type it. **Keyboard.** The field is one tab stop, and the stepper buttons are not in the tab order. | Key | What it does | |---|---| | Up, Down | Steps the value up or down by 'step'. | | Page Up, Page Down | Steps by 'large-step' steps, ten by default. | | Home, End | Goes to 'min' or 'max', where there is one. Without one, moves the caret. | | Enter | Commits the typed number and submits the form, as a native field does. | The field has 'role="spinbutton"' with 'aria-valuenow', 'aria-valuemin', 'aria-valuemax', and the formatted text in 'aria-valuetext'. */
|
|
14499
15818
|
"helix-headless-number-input": DefineCustomElement<
|
|
14500
15819
|
HelixHeadlessNumberInput,
|
|
14501
15820
|
HelixHeadlessNumberInputVueProps,
|
|
14502
15821
|
HelixHeadlessNumberInputVueEvents
|
|
14503
15822
|
>;
|
|
14504
|
-
/** 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. The tree is one tab stop.
|
|
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. */
|
|
14505
15824
|
"helix-headless-object-inspector": DefineCustomElement<
|
|
14506
15825
|
HelixHeadlessObjectInspector,
|
|
14507
15826
|
HelixHeadlessObjectInspectorVueProps,
|
|
@@ -14519,7 +15838,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14519
15838
|
HelixHeadlessOptionVueProps,
|
|
14520
15839
|
HelixHeadlessOptionVueEvents
|
|
14521
15840
|
>;
|
|
14522
|
-
/** 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 a nested
|
|
15841
|
+
/** 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. 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. */
|
|
14523
15842
|
"helix-headless-outline": DefineCustomElement<
|
|
14524
15843
|
HelixHeadlessOutline,
|
|
14525
15844
|
HelixHeadlessOutlineVueProps,
|
|
@@ -14531,7 +15850,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14531
15850
|
HelixHeadlessPaginationVueProps,
|
|
14532
15851
|
HelixHeadlessPaginationVueEvents
|
|
14533
15852
|
>;
|
|
14534
|
-
/** 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. */
|
|
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. */
|
|
14535
15854
|
"helix-headless-pagination-size": DefineCustomElement<
|
|
14536
15855
|
HelixHeadlessPaginationSize,
|
|
14537
15856
|
HelixHeadlessPaginationSizeVueProps,
|
|
@@ -14543,13 +15862,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14543
15862
|
HelixHeadlessPaginationSummaryVueProps,
|
|
14544
15863
|
HelixHeadlessPaginationSummaryVueEvents
|
|
14545
15864
|
>;
|
|
14546
|
-
/** Each cell is its own '<input>', so every box has a real focus ring, caret, and tab stop. Input longer than one character is treated as a paste, in any cell. This covers pasting, a browser autofilling an SMS code, and a password manager, which all put the whole code into the focused box. A six-character code that arrives in cell three fills from cell three. The code is one value to a form. The cells are in a shadow root and submit nothing. The host is form-associated and submits the joined string, which also carries validity and responds to a form reset. Only the first cell has 'autocomplete="one-time-code"', because the hint applies to the whole field. '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. Delete removes the character in the focused box and pulls the rest of the code back, as Backspace removes the one before it. The row of cells 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. */
|
|
15865
|
+
/** Each cell is its own '<input>', so every box has a real focus ring, caret, and tab stop. Input longer than one character is treated as a paste, in any cell. This covers pasting, a browser autofilling an SMS code, and a password manager, which all put the whole code into the focused box. A six-character code that arrives in cell three fills from cell three. The code is one value to a form. The cells are in a shadow root and submit nothing. The host is form-associated and submits the joined string, which also carries validity and responds to a form reset. Only the first cell has 'autocomplete="one-time-code"', because the hint applies to the whole field. '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. Delete removes the character in the focused box and pulls the rest of the code back, as Backspace removes the one before it. The row of cells 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.** Each box is a tab stop of its own, as each is a real input. | 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 | In an empty box, clears the box 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 row has 'role="group"' and the field's name, and each box is named by 'cell-label', such as "Character 2 of 6". 'helix-complete' is a 'HelixCompleteEvent' sent once the last box is filled. */
|
|
14547
15866
|
"helix-headless-pin-input": DefineCustomElement<
|
|
14548
15867
|
HelixHeadlessPinInput,
|
|
14549
15868
|
HelixHeadlessPinInputVueProps,
|
|
14550
15869
|
HelixHeadlessPinInputVueEvents
|
|
14551
15870
|
>;
|
|
14552
|
-
/** Popover is the general overlay that the specific ones build on. 'Menu' holds commands, 'Select' holds options, and 'Tooltip' holds a description. Popover holds any content you put in it, so it has no keyboard handling of its own. The trigger is slotted and stays your own element.
|
|
15871
|
+
/** Popover is the general overlay that the specific ones build on. 'Menu' holds commands, 'Select' holds options, and 'Tooltip' holds a description. Popover holds any content you put in it, so it has no keyboard handling of its own. The trigger is slotted and stays your own element. A Helix trigger is told whether the popover is open inside its own shadow root. On a plain element, such as a '<button>', the popover writes 'aria-expanded' only once a reader has pressed it, which is after any hydration, and never where you wrote 'aria-expanded' yourself. It writes nothing else onto your markup. The panel is in the top layer through the popover API, so it needs no 'z-index', and an ancestor with 'overflow: hidden', 'transform', 'filter', or 'contain' does not clip or move it. It opens on click and from a command. 'command="--show"' and the related commands work as they do on 'Dialog' and 'Drawer', so a button anywhere on the page can open the popover with no script. **Opening moves focus into the panel**, to the first control in it, or to the panel itself where it holds none, and closing from inside gives it back to the trigger. It closes on Escape, on a press outside it, and when focus moves out of the trigger and the panel to somewhere else on the page. 'modal' keeps 'Tab' inside the panel while it is open and says so with 'aria-modal', for a panel that has to be answered before the page goes on. The rest of the page is hidden from screen readers with 'aria-hidden' while it is open, so the virtual cursor stays in the panel too. Without it the popover does not trap focus. The panel's name is 'label' when you set it. Otherwise it is the first heading in the panel, or the elements an 'aria-labelledby' on the host names. 'arrow' draws a point on the panel's edge facing the trigger. The side the panel landed on is on the host as ':state(placed-top)' and its kin, and the trigger's width is on the panel as '--floating-anchor-inline-size', for a panel as wide as its trigger: '''css helix-popover::part(popover) { min-inline-size: var(--floating-anchor-inline-size); } ''' */
|
|
14553
15872
|
"helix-headless-popover": DefineCustomElement<
|
|
14554
15873
|
HelixHeadlessPopover,
|
|
14555
15874
|
HelixHeadlessPopoverVueProps,
|
|
@@ -14561,13 +15880,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14561
15880
|
HelixHeadlessProgressVueProps,
|
|
14562
15881
|
HelixHeadlessProgressVueEvents
|
|
14563
15882
|
>;
|
|
14564
|
-
/** 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 the name to what the code is for. When you pass no name, the value is the name. Most codes hold a URL, and a URL read aloud gives the destination. 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 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
|
|
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 the name to what the code is for. When you pass no name, the value is the name. Most codes hold a URL, and a URL read aloud gives the destination. 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 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. */
|
|
14565
15884
|
"helix-headless-qr-code": DefineCustomElement<
|
|
14566
15885
|
HelixHeadlessQrCode,
|
|
14567
15886
|
HelixHeadlessQrCodeVueProps,
|
|
14568
15887
|
HelixHeadlessQrCodeVueEvents
|
|
14569
15888
|
>;
|
|
14570
|
-
/** Renders a real '<q>', so the browser supplies the quotation marks. It inserts the correct marks for the document's language and nests them correctly when one quotation sits inside another. Do not type quotation marks into the content. For a passage set off from the surrounding text, use a blockquote. */
|
|
15889
|
+
/** Renders a real '<q>', so the browser supplies the quotation marks. It inserts the correct marks for the document's language and nests them correctly when one quotation sits inside another. Do not type quotation marks into the content: one that starts or ends with a typed mark warns once, with the runtime kind 'typed-marks'. A quotation in a language other than the page's takes 'lang' on the element, and its marks follow it: 'lang="de"' sets „…“ and 'lang="fr"' «…» inside an English page. For a passage set off from the surrounding text, use a blockquote. */
|
|
14571
15890
|
"helix-headless-quote": DefineCustomElement<
|
|
14572
15891
|
HelixHeadlessQuote,
|
|
14573
15892
|
HelixHeadlessQuoteVueProps,
|
|
@@ -14591,13 +15910,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14591
15910
|
HelixHeadlessRatingVueProps,
|
|
14592
15911
|
HelixHeadlessRatingVueEvents
|
|
14593
15912
|
>;
|
|
14594
|
-
/** 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. 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. */
|
|
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. */
|
|
14595
15914
|
"helix-headless-scatter-chart": DefineCustomElement<
|
|
14596
15915
|
HelixHeadlessScatterChart,
|
|
14597
15916
|
HelixHeadlessScatterChartVueProps,
|
|
14598
15917
|
HelixHeadlessScatterChartVueEvents
|
|
14599
15918
|
>;
|
|
14600
|
-
/** Measures which edges have content past them and sets one custom state per edge. CSS cannot read scroll position, so a stylesheet cannot work this out on its own. The styled tier draws a fade on each edge that has a state. Custom states keep an element that upgrades after a framework rendered it from adding markup the framework did not write. Select them with ':host(:state(more-block-end))'. While the content overflows, the region gets a 'tabindex', so keyboard users can scroll it. When nothing overflows, it is not a tab stop. It has 'role="region"' only when you set a 'label', because a screen reader announces an unnamed region as only "region". */
|
|
15919
|
+
/** Measures which edges have content past them and sets one custom state per edge. CSS cannot read scroll position, so a stylesheet cannot work this out on its own. The styled tier draws a fade on each edge that has a state. Custom states keep an element that upgrades after a framework rendered it from adding markup the framework did not write. Select them with ':host(:state(more-block-end))'. While the content overflows, the region gets a 'tabindex', so keyboard users can scroll it. When nothing overflows, it is not a tab stop. It has 'role="region"' only when you set a 'label', because a screen reader announces an unnamed region as only "region". **'scrollbars' draws scrollbars of its own** in place of the browser's: a 'scrollbar' part for each axis that scrolls, a 'thumb' in each, and a 'corner' where the two meet. They are for the pointer. The thumb drags, and a press on the track moves the thumb to the press. The viewport stays the tab stop and the region a screen reader reads, and the scrollbars are hidden from screen readers. On the headless tier your stylesheet sizes and places them, hides the browser's own with 'scrollbar-width: none' on the viewport, and draws the thumb from the two custom properties written on each scrollbar. An axis whose 'overflow' is 'hidden' gets no scrollbar. **'orientation' keeps the content to one axis.** 'vertical' scrolls up and down only, and 'horizontal' sideways only, so the other axis has no scrollbar, the browser's or the component's, and clips what is past it. Leave it unset to scroll both ways. The viewport's 'scroll' and 'scrollend' are sent again from the host, which is the element you hold. A thumb dragged across the content sends one 'scrollend', once it is let go. In React, bind them with 'onScroll' and 'onScrollEnd'. **Keyboard.** The viewport is the tab stop while the content overflows, and the browser's scrolling keys move it: the arrow keys, Page Up and Page Down, Home and End, and Space. The scrollbars take no focus. */
|
|
14601
15920
|
"helix-headless-scroll-area": DefineCustomElement<
|
|
14602
15921
|
HelixHeadlessScrollArea,
|
|
14603
15922
|
HelixHeadlessScrollAreaVueProps,
|
|
@@ -14621,13 +15940,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14621
15940
|
HelixHeadlessSkipLinkVueProps,
|
|
14622
15941
|
HelixHeadlessSkipLinkVueEvents
|
|
14623
15942
|
>;
|
|
14624
|
-
/** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value. 'min-steps-between-thumbs' keeps them that many steps apart. 'format-options' writes the value with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, and 'formatter' writes it with a function of your own, such as words for a scale. Either one is what a screen reader hears, what the readout shows and what the marker labels say. 'value-text' still wraps it in a sentence, with the formatted value in its place. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. */
|
|
15943
|
+
/** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value. 'min-steps-between-thumbs' keeps them that many steps apart, and the readout joins the two as 'range-text' writes them. 'origin' sets where a single thumb's fill starts: at 'min', at the middle of the track, or at 'max'. A balance or an offset from zero fills from the middle, as Zag's slider 'origin' does. The fill's ends are published as '--slider-from' and '--slider-to'. 'format-options' writes the value with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, and 'formatter' writes it with a function of your own, such as words for a scale. Either one is what a screen reader hears, what the readout shows and what the marker labels say. 'value-text' still wraps it in a sentence, with the formatted value in its place. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. **Keyboard.** Each thumb is one tab stop, and its keys are the native range's. | Key | What it does | |---|---| | Right, Up | Moves the thumb up by 'step'. | | Left, Down | Moves the thumb down by 'step'. | | Page Up, Page Down | Moves the thumb by a larger step. | | Home, End | Moves the thumb to its lowest or highest value. | Each thumb is an '<input type="range">' with 'aria-valuetext' where the value is formatted or worded. A range's thumbs say they stop at each other with 'aria-valuemin' and 'aria-valuemax'. */
|
|
14625
15944
|
"helix-headless-slider": DefineCustomElement<
|
|
14626
15945
|
HelixHeadlessSlider,
|
|
14627
15946
|
HelixHeadlessSliderVueProps,
|
|
14628
15947
|
HelixHeadlessSliderVueEvents
|
|
14629
15948
|
>;
|
|
14630
|
-
/** 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
|
|
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. */
|
|
14631
15950
|
"helix-headless-sparkline": DefineCustomElement<
|
|
14632
15951
|
HelixHeadlessSparkline,
|
|
14633
15952
|
HelixHeadlessSparklineVueProps,
|
|
@@ -14657,25 +15976,25 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14657
15976
|
HelixHeadlessStatGroupVueProps,
|
|
14658
15977
|
HelixHeadlessStatGroupVueEvents
|
|
14659
15978
|
>;
|
|
14660
|
-
/** The label comes first in the markup and the value after it, so a screen reader reads what the figure counts before the number. Visually, the number stands out either way. Both are bare slots. An element that assigned itself a slot on connect would add an attribute after upgrade, which markup rendered on the server by React does not have. */
|
|
15979
|
+
/** The label comes first in the markup and the value after it, so a screen reader reads what the figure counts before the number. Visually, the number stands out either way. Both are bare slots. An element that assigned itself a slot on connect would add an attribute after upgrade, which markup rendered on the server by React does not have. **A stat with a label is a group named by it**, so a reader moving through a dashboard hears "Revenue, group" and then the figure, its unit and its trend as one reading, rather than a run of loose words. The role and the name are set through 'ElementInternals' once the label is known, which writes no attribute; a stat with no label has no role. Put a 'Trend' in the 'trend' slot to have it read inside the group, after the figure it qualifies. */
|
|
14661
15980
|
"helix-headless-stat": DefineCustomElement<
|
|
14662
15981
|
HelixHeadlessStat,
|
|
14663
15982
|
HelixHeadlessStatVueProps,
|
|
14664
15983
|
HelixHeadlessStatVueEvents
|
|
14665
15984
|
>;
|
|
14666
|
-
/** '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. */
|
|
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'. */
|
|
14667
15986
|
"helix-headless-steps": DefineCustomElement<
|
|
14668
15987
|
HelixHeadlessSteps,
|
|
14669
15988
|
HelixHeadlessStepsVueProps,
|
|
14670
15989
|
HelixHeadlessStepsVueEvents
|
|
14671
15990
|
>;
|
|
14672
|
-
/** Only the step's name is a button. The marker is 'aria-hidden' decoration, so it is outside the button. The name uses 'Button', so the hover wash, the focus ring, and the disabled style come from 'Button'. Every step can be pressed and fires 'helix-select'. To stop the user from moving to a step, set 'disabled' on it. The marker is a slot, and its fallback shows the step's state: a check for a finished stage, a target for the current stage, and an empty ring for a stage not reached yet. Only that one mark is rendered, so the accessibility tree has no hidden marks. The half lines on each side of the mark are drawn on the step's '::before' and '::after' from properties the list sets, so the step renders no extra element for them. */
|
|
15991
|
+
/** Only the step's name is a button. The marker is 'aria-hidden' decoration, so it is outside the button. The name uses 'Button', so the hover wash, the focus ring, and the disabled style come from 'Button'. Every step can be pressed and fires 'helix-select'. To stop the user from moving to a step, set 'disabled' on it. The marker is a slot, and its fallback shows the step's state: a check for a finished stage, a target for the current stage, and an empty ring for a stage not reached yet. Only that one mark is rendered, so the accessibility tree has no hidden marks. The half lines on each side of the mark are drawn on the step's '::before' and '::after' from properties the list sets, so the step renders no extra element for them. A finished stage says so in words: the name's button is described by 'complete-label', "Complete" unless you translate it, and a stage that becomes complete while the page is open says it once in a polite live region. The current stage's button carries 'aria-current="step"', and only the button, so the state is said once, on the control. */
|
|
14673
15992
|
"helix-headless-step": DefineCustomElement<
|
|
14674
15993
|
HelixHeadlessStep,
|
|
14675
15994
|
HelixHeadlessStepVueProps,
|
|
14676
15995
|
HelixHeadlessStepVueEvents
|
|
14677
15996
|
>;
|
|
14678
|
-
/** A switch turns something on or off right away, and a checkbox is an answer the form submits later. A screen reader announces 'role="switch"' as "on" or "off", and people expect the change to take effect immediately. A switch is as common outside a form as inside one. It renders a real '<input type="checkbox">' with 'role="switch"', the pairing ARIA describes. The input is what a form submits and what a label forwards a press to, and the role is what a screen reader announces. The label sits beside the switch, inside the '<label>' that forwards the press, the same as a checkbox. The hint and the message go below the row, because the switch and its label share one line. */
|
|
15997
|
+
/** A switch turns something on or off right away, and a checkbox is an answer the form submits later. A screen reader announces 'role="switch"' as "on" or "off", and people expect the change to take effect immediately. A switch is as common outside a form as inside one. It renders a real '<input type="checkbox">' with 'role="switch"', the pairing ARIA describes. The input is what a form submits and what a label forwards a press to, and the role is what a screen reader announces. The label sits beside the switch, inside the '<label>' that forwards the press, the same as a checkbox. The hint and the message go below the row, because the switch and its label share one line. **Keyboard.** The switch is one tab stop. | Key | What it does | |---|---| | Space | Turns the switch on or off, as a native checkbox does. | The input carries 'role="switch"', so a screen reader says "on" or "off". 'aria-readonly' is set under 'readonly', and 'aria-invalid' and 'aria-describedby' point at the message while one shows. */
|
|
14679
15998
|
"helix-headless-switch": DefineCustomElement<
|
|
14680
15999
|
HelixHeadlessSwitch,
|
|
14681
16000
|
HelixHeadlessSwitchVueProps,
|
|
@@ -14693,37 +16012,37 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14693
16012
|
HelixHeadlessTableColumnVueProps,
|
|
14694
16013
|
HelixHeadlessTableColumnVueEvents
|
|
14695
16014
|
>;
|
|
14696
|
-
/** 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. A column with 'sortable' and a 'field' 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. 'helix-sort' asks first,
|
|
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. For a grid a reader moves through with the arrow keys, with typeahead and range selection, use 'DataTable'. To act on one row, put a link or a button in a cell. 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. */
|
|
14697
16016
|
"helix-headless-table": DefineCustomElement<
|
|
14698
16017
|
HelixHeadlessTable,
|
|
14699
16018
|
HelixHeadlessTableVueProps,
|
|
14700
16019
|
HelixHeadlessTableVueEvents
|
|
14701
16020
|
>;
|
|
14702
|
-
/** 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. */
|
|
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. */
|
|
14703
16022
|
"helix-headless-table-row": DefineCustomElement<
|
|
14704
16023
|
HelixHeadlessTableRow,
|
|
14705
16024
|
HelixHeadlessTableRowVueProps,
|
|
14706
16025
|
HelixHeadlessTableRowVueEvents
|
|
14707
16026
|
>;
|
|
14708
|
-
/** An inactive panel is hidden and stays mounted. Anything typed into it is still there when the person comes back, and the content of every panel is in the server-rendered markup for crawlers, whichever tab is open. */
|
|
16027
|
+
/** An inactive panel is hidden and stays mounted. Anything typed into it is still there when the person comes back, and the content of every panel is in the server-rendered markup for crawlers, whichever tab is open. The host is the 'tabpanel' while its tab is selected, through 'ElementInternals', so the tab's 'aria-controls' can reach it from the tab's shadow root. The box inside is a tab stop only while the panel holds nothing focusable, as the ARIA tabs pattern and React Aria's tab panel do: Tab from the tab list lands on the panel's first link or control where there is one, and on the panel itself where there is none. */
|
|
14709
16028
|
"helix-headless-tab-panel": DefineCustomElement<
|
|
14710
16029
|
HelixHeadlessTabPanel,
|
|
14711
16030
|
HelixHeadlessTabPanelVueProps,
|
|
14712
16031
|
HelixHeadlessTabPanelVueEvents
|
|
14713
16032
|
>;
|
|
14714
|
-
/** 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. */
|
|
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, and the arrow keys move focus without choosing, so arrowing past a tab never leaves the page. 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. */
|
|
14715
16034
|
"helix-headless-tabs": DefineCustomElement<
|
|
14716
16035
|
HelixHeadlessTabs,
|
|
14717
16036
|
HelixHeadlessTabsVueProps,
|
|
14718
16037
|
HelixHeadlessTabsVueEvents
|
|
14719
16038
|
>;
|
|
14720
|
-
/** A tab is an element, because it manages selection and its own tab stop.
|
|
16039
|
+
/** A tab is an element, because it manages selection and its own tab stop. With an 'href', the tab is a link: 'role="tab"' on an '<a>', which a press, Enter and the browser's own link gestures follow. 'helix-select' is sent first, and canceling it keeps the browser from following, so a client-side router follows it instead. */
|
|
14721
16040
|
"helix-headless-tab": DefineCustomElement<
|
|
14722
16041
|
HelixHeadlessTab,
|
|
14723
16042
|
HelixHeadlessTabVueProps,
|
|
14724
16043
|
HelixHeadlessTabVueEvents
|
|
14725
16044
|
>;
|
|
14726
|
-
/** 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. Name the set with 'label'. */
|
|
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. */
|
|
14727
16046
|
"helix-headless-tag-group": DefineCustomElement<
|
|
14728
16047
|
HelixHeadlessTagGroup,
|
|
14729
16048
|
HelixHeadlessTagGroupVueProps,
|
|
@@ -14735,7 +16054,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14735
16054
|
HelixHeadlessTagVueProps,
|
|
14736
16055
|
HelixHeadlessTagVueEvents
|
|
14737
16056
|
>;
|
|
14738
|
-
/** 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. */
|
|
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. */
|
|
14739
16058
|
"helix-headless-textarea": DefineCustomElement<
|
|
14740
16059
|
HelixHeadlessTextarea,
|
|
14741
16060
|
HelixHeadlessTextareaVueProps,
|
|
@@ -14753,19 +16072,25 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14753
16072
|
HelixHeadlessTimePickerVueProps,
|
|
14754
16073
|
HelixHeadlessTimePickerVueEvents
|
|
14755
16074
|
>;
|
|
16075
|
+
/** Groups entries by date, such as "Today" and "Yesterday", in a timeline that holds many. The group is an entry of the timeline, and its entries are a list of their own, named by the heading. A screen reader lists the heading with the page's headings and hears how many entries each day holds. The heading's level is 'heading-level', and 3 where it is not set. Each group draws its own line, so the line stops at the last entry of one day and starts again at the first entry of the next. */
|
|
16076
|
+
"helix-headless-timeline-group": DefineCustomElement<
|
|
16077
|
+
HelixHeadlessTimelineGroup,
|
|
16078
|
+
HelixHeadlessTimelineGroupVueProps,
|
|
16079
|
+
HelixHeadlessTimelineGroupVueEvents
|
|
16080
|
+
>;
|
|
14756
16081
|
/** Given 'datetime', the label you write is wrapped in a '<time>' element, so a machine-readable value such as "2026-08-19" travels with a label such as "yesterday". Without 'datetime', the label is a '<span>'. Each entry draws the connector line that arrives at it and hides it when it is the first entry, using ':host(:first-child)'. This needs no index, no counting parent, and no script. 'Steps' and 'Breadcrumbs' work the same way. 'tone' sets the kind of event and is the only thing that colors the mark. It uses the same values as 'Announcement'. */
|
|
14757
16082
|
"helix-headless-timeline-item": DefineCustomElement<
|
|
14758
16083
|
HelixHeadlessTimelineItem,
|
|
14759
16084
|
HelixHeadlessTimelineItemVueProps,
|
|
14760
16085
|
HelixHeadlessTimelineItemVueEvents
|
|
14761
16086
|
>;
|
|
14762
|
-
/** A timeline is a record of events that happened or are scheduled. Each entry carries a time, and no entry is current or complete. For a process you move through, with a current stage and 'active' and 'complete' states, use 'Steps'. Each entry draws the connector line that arrives at it and hides it when it is first, using ':host(:first-child)'. This resolves at layout with no script, so the server markup is correct before anything runs. The host has 'role="list"', because the entries are your elements in the light DOM. 'Steps' does the same.
|
|
16087
|
+
/** A timeline is a record of events that happened or are scheduled. Each entry carries a time, and no entry is current or complete. For a process you move through, with a current stage and 'active' and 'complete' states, use 'Steps'. Each entry draws the connector line that arrives at it and hides it when it is first, using ':host(:first-child)'. This resolves at layout with no script, so the server markup is correct before anything runs. The host has 'role="list"', because the entries are your elements in the light DOM. 'Steps' does the same. **Group entries by date with 'Timeline.Group'**, which puts a heading such as "Today" over its entries. The group is an entry of the timeline, and its entries are a list of their own named by the heading. **The reading order is the order you write the entries in**, in every layout the styled tier draws: down the page, either side of a line down the middle, or across the page. Inside each entry the time is read before what happened. Write the entries in the order the events happened, oldest or newest first, and the layout only moves where they are drawn. */
|
|
14763
16088
|
"helix-headless-timeline": DefineCustomElement<
|
|
14764
16089
|
HelixHeadlessTimeline,
|
|
14765
16090
|
HelixHeadlessTimelineVueProps,
|
|
14766
16091
|
HelixHeadlessTimelineVueEvents
|
|
14767
16092
|
>;
|
|
14768
|
-
/** 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. A 'danger' message is its own assertive live region, so it is announced at once; every other one is announced politely by the region. 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. */
|
|
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. A 'danger' message is its own assertive live region, so it is announced at once; every other one is announced politely by the region. 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. */
|
|
14769
16094
|
"helix-headless-toast-item": DefineCustomElement<
|
|
14770
16095
|
HelixHeadlessToastItem,
|
|
14771
16096
|
HelixHeadlessToastItemVueProps,
|
|
@@ -14777,7 +16102,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14777
16102
|
HelixHeadlessToastVueProps,
|
|
14778
16103
|
HelixHeadlessToastVueEvents
|
|
14779
16104
|
>;
|
|
14780
|
-
/** 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. The form receives one entry per pressed value. The indicator stays hidden, and each pressed item is marked with ':state(pressed)'. 'orientation="vertical"' runs the items down a column, says so to the accessibility tree, and the up and down arrows move between them. */
|
|
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. */
|
|
14781
16106
|
"helix-headless-toggle-group": DefineCustomElement<
|
|
14782
16107
|
HelixHeadlessToggleGroup,
|
|
14783
16108
|
HelixHeadlessToggleGroupVueProps,
|
|
@@ -14789,19 +16114,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14789
16114
|
HelixHeadlessToggleVueProps,
|
|
14790
16115
|
HelixHeadlessToggleVueEvents
|
|
14791
16116
|
>;
|
|
14792
|
-
/** 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 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. */
|
|
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. */
|
|
14793
16118
|
"helix-headless-toolbar": DefineCustomElement<
|
|
14794
16119
|
HelixHeadlessToolbar,
|
|
14795
16120
|
HelixHeadlessToolbarVueProps,
|
|
14796
16121
|
HelixHeadlessToolbarVueEvents
|
|
14797
16122
|
>;
|
|
14798
|
-
/** 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. 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. */
|
|
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. */
|
|
14799
16124
|
"helix-headless-tooltip": DefineCustomElement<
|
|
14800
16125
|
HelixHeadlessTooltip,
|
|
14801
16126
|
HelixHeadlessTooltipVueProps,
|
|
14802
16127
|
HelixHeadlessTooltipVueEvents
|
|
14803
16128
|
>;
|
|
14804
|
-
/** 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. 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. */
|
|
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. */
|
|
14805
16130
|
"helix-headless-tour": DefineCustomElement<
|
|
14806
16131
|
HelixHeadlessTour,
|
|
14807
16132
|
HelixHeadlessTourVueProps,
|
|
@@ -14813,19 +16138,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14813
16138
|
HelixHeadlessTourStopVueProps,
|
|
14814
16139
|
HelixHeadlessTourStopVueEvents
|
|
14815
16140
|
>;
|
|
14816
|
-
/** 'open' comes from 'MixinControllerOpen', the same state a disclosure holds, so you can respond to a branch opening and control the state yourself. The row renders 'aria-expanded'. Each item is an element because it holds state: whether it is open, selected, and focused. An item is a branch when something is slotted into 'children'. This is detected on the client, so server-rendered markup shows a leaf and the twisty appears on hydration. **'href' makes the whole row a link**, rendered as an '<a>'. Enter, middle click, and the status bar then work anywhere on the row. Pressing a branch, or Enter or Space on it, opens or closes it. A branch with a 'value' is chosen as well and sends 'helix-select', unless the tree has 'nesting="heading"', where a branch names the list under it. */
|
|
16141
|
+
/** 'open' comes from 'MixinControllerOpen', the same state a disclosure holds, so you can respond to a branch opening and control the state yourself. The row renders 'aria-expanded'. Each item is an element because it holds state: whether it is open, selected, and focused. An item is a branch when something is slotted into 'children'. This is detected on the client, so server-rendered markup shows a leaf and the twisty appears on hydration. **'href' makes the whole row a link**, rendered as an '<a>'. Enter, middle click, and the status bar then work anywhere on the row. Pressing a branch, or Enter or Space on it, opens or closes it. A branch with a 'value' is chosen as well and sends 'helix-select', unless the tree has 'nesting="heading"', where a branch names the list under it, or 'selection-mode="leaf"', where only the items at the ends are chosen. A 'disabled' item is reached by the arrow keys and announced as unavailable, and a press, Enter or Space on it does nothing. A 'lazy' item is a branch whose children you load when it opens: opening it sends 'helix-load', the row says it is busy, and the children you add appear in it. Remove 'lazy' once they are in. */
|
|
14817
16142
|
"helix-headless-tree-item": DefineCustomElement<
|
|
14818
16143
|
HelixHeadlessTreeItem,
|
|
14819
16144
|
HelixHeadlessTreeItemVueProps,
|
|
14820
16145
|
HelixHeadlessTreeItemVueEvents
|
|
14821
16146
|
>;
|
|
14822
|
-
/** The tree is a single tab stop, and arrow keys move focus between items, as the tree pattern requires, so Tab moves past a long sidebar in one press. The tree moves the tab stop to the focused item, so the browser's focus order stays intact. Items are found with 'instanceof', never by tag name, so the headless tier does not depend on the styled one. Typing a letter moves to the next visible item whose name starts with it, and '*' opens every branch beside the focused item. */
|
|
16147
|
+
/** The tree is a single tab stop, and arrow keys move focus between items, as the tree pattern requires, so Tab moves past a long sidebar in one press. The tree moves the tab stop to the focused item, so the browser's focus order stays intact. Items are found with 'instanceof', never by tag name, so the headless tier does not depend on the styled one. Typing a letter moves to the next visible item whose name starts with it, and '*' opens every branch beside the focused item. 'selection-mode="multiple"' draws a check mark on every row and lets a reader check many, as Web Awesome's and Ark UI's checkbox trees do. Checking a branch checks every item under it, and a branch some of whose items are checked is partly checked. Space or a press on the mark checks the focused row, and Enter or a press on a branch's row opens it. 'active' then holds the checked values, comma separated, which 'values' also gives as a list, and the tree says 'aria-multiselectable'. 'selection-mode="leaf"' chooses one item at a time and only the items at the ends: a press, Enter or Space on a branch opens or closes it and chooses nothing, as Web Awesome's 'leaf' mode does. Keys: Up and Down Arrow move between the items a reader can see; Right Arrow opens a shut branch and then moves into it, and Left Arrow shuts an open one and then moves to its parent, the two swapping on a right-to-left page. Home and End go to the first and the last item, Enter and Space choose or open, and the tree's one tab stop stays on the item last reached. In a tree of check marks, Control+A (Command+A on an Apple keyboard) checks every item or clears them all, and Shift with Up or Down Arrow moves and checks. */
|
|
14823
16148
|
"helix-headless-tree": DefineCustomElement<
|
|
14824
16149
|
HelixHeadlessTree,
|
|
14825
16150
|
HelixHeadlessTreeVueProps,
|
|
14826
16151
|
HelixHeadlessTreeVueEvents
|
|
14827
16152
|
>;
|
|
14828
|
-
/** A trend has three parts: a
|
|
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. */
|
|
14829
16154
|
"helix-headless-trend": DefineCustomElement<
|
|
14830
16155
|
HelixHeadlessTrend,
|
|
14831
16156
|
HelixHeadlessTrendVueProps,
|
|
@@ -14843,19 +16168,19 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
14843
16168
|
HelixHeadlessVideoPlaylistMenuVueProps,
|
|
14844
16169
|
HelixHeadlessVideoPlaylistMenuVueEvents
|
|
14845
16170
|
>;
|
|
14846
|
-
/** **You slot the player**, so it keeps your appearance, extra controls, captions, and poster treatment. 'Sandbox' takes its preview and 'Menu' its trigger the same way. **Entries are markup.** React skips properties it would set imperatively during hydration, so an array property on a custom element is missing on the first paint of a server-rendered page. 'using-the-elements.mdx' has the measurement. Markup also makes each entry a real button with its name inside. **The playlist does not play media.** It sets 'src' on the player and tracks which entry is current. The current entry moves when: - an entry is pressed, - the player dispatches 'helix-next' or 'helix-previous', or - the player reaches the end. On 'ended' the playlist advances and the next clip starts playing, because the user already pressed play once. */
|
|
16171
|
+
/** **You slot the player**, so it keeps your appearance, extra controls, captions, and poster treatment. 'Sandbox' takes its preview and 'Menu' its trigger the same way. **Entries are markup.** React skips properties it would set imperatively during hydration, so an array property on a custom element is missing on the first paint of a server-rendered page. 'using-the-elements.mdx' has the measurement. Markup also makes each entry a real button with its name inside. **The playlist does not play media.** It sets 'src' on the player and tracks which entry is current. The current entry moves when: - an entry is pressed, - the player dispatches 'helix-next' or 'helix-previous', or - the player reaches the end. On 'ended' the playlist advances and the next clip starts playing, because the user already pressed play once. 'repeat' decides what happens at the end: 'one' plays the same entry again, and 'all' goes from the last entry back to the first. Without it, the playlist stops on the last entry and sends 'helix-end'. 'shuffle' plays the entries in a random order, starting from the one that is current, and 'previous' retraces that order. **Keyboard.** Each entry is a button in the tab order, and Enter or Space plays it. The current entry carries 'aria-current'. While focus is on the player, the player's own keys work, and 'Video' lists them. Its previous and next controls move through the entries in the same order the playlist does. */
|
|
14847
16172
|
"helix-headless-video-playlist": DefineCustomElement<
|
|
14848
16173
|
HelixHeadlessVideoPlaylist,
|
|
14849
16174
|
HelixHeadlessVideoPlaylistVueProps,
|
|
14850
16175
|
HelixHeadlessVideoPlaylistVueEvents
|
|
14851
16176
|
>;
|
|
14852
|
-
/** The picture is a native '<video>', so decoding, buffering, captions, Picture in Picture, AirPlay, and codecs come from the platform. The component replaces the control bar, because the native bar cannot be styled. The scrubber and the volume are '<input type="range">' elements, so arrow keys, Home and End, touch targets, and screen reader announcements work as they do natively. When you set 'controls', the browser's control bar is used, the Helix bar is not drawn, and the keys below are not bound, so a key press does not seek twice. The keys match other players, and they are bound on the element only
|
|
16177
|
+
/** The picture is a native '<video>', so decoding, buffering, captions, Picture in Picture, AirPlay, and codecs come from the platform. The component replaces the control bar, because the native bar cannot be styled. The scrubber and the volume are '<input type="range">' elements, so arrow keys, Home and End, touch targets, and screen reader announcements work as they do natively. When you set 'controls', the browser's control bar is used, the Helix bar is not drawn, and the keys below are not bound, so a key press does not seek twice. **Keyboard.** The keys match other players, and they are bound on the element only, so they work while focus is on the player. | Key | What it does | |---|---| | Space, 'k' | Plays or pauses. Space on a button presses the button. | | Right, Left | Moves 5 seconds forward or back. | | Shift with Right or Left | Moves 10 seconds forward or back. | | 'l', 'j' | Moves 10 seconds forward or back, as the skip buttons do. | | Up, Down | Raises or lowers the volume by a tenth. | | 'm' | Mutes or unmutes. | | 'f' | Enters or leaves fullscreen. | | Tab | Moves through the controls on the bar. | On the scrubber and the volume slider, the arrow keys, Page Up, Page Down, Home, and End move the slider, as on any range input. '<source>' and '<track>' children are copied into the video. A media element selects resources from its own child nodes, and a slot is one node, so slotted sources would give the video no text tracks, no current source, and a 'readyState' of zero, and it would not play. They are copied so your light DOM stays intact, and are copied again whenever the slot changes. The player sends every media event of its inner video under the same name, without bubbling, as a '<video>' sends it. Listen on the player as you would on a video: 'timeupdate', 'volumechange', 'loadedmetadata', 'error', and the rest. */
|
|
14853
16178
|
"helix-headless-video": DefineCustomElement<
|
|
14854
16179
|
HelixHeadlessVideo,
|
|
14855
16180
|
HelixHeadlessVideoVueProps,
|
|
14856
16181
|
HelixHeadlessVideoVueEvents
|
|
14857
16182
|
>;
|
|
14858
|
-
/** The items arrive as data: - 'for' names a '<script type="application/json">' that holds an array of
|
|
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, Up, Down, 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. */
|
|
14859
16184
|
"helix-headless-virtual-list": DefineCustomElement<
|
|
14860
16185
|
HelixHeadlessVirtualList,
|
|
14861
16186
|
HelixHeadlessVirtualListVueProps,
|