@fusion.dev/helix-headless 0.146.0 → 0.148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +9287 -1084
- package/dist/accordion/item/accordion-item.d.ts +43 -21
- package/dist/accordion/item/accordion-item.js +37 -11
- package/dist/accordion/root/accordion-root.d.ts +8 -2
- package/dist/accordion/root/accordion-root.js +6 -8
- package/dist/announcement/root/announcement-root.d.ts +66 -6
- package/dist/announcement/root/announcement-root.js +144 -13
- package/dist/area-chart/root/area-chart-root.d.ts +18 -1
- package/dist/area-chart/root/area-chart-root.js +14 -7
- package/dist/avatar/root/avatar-root.d.ts +31 -1
- package/dist/avatar/root/avatar-root.js +11 -1
- package/dist/badge/count.d.ts +14 -0
- package/dist/badge/count.js +20 -0
- package/dist/badge/root/badge-root.d.ts +57 -6
- package/dist/badge/root/badge-root.js +77 -8
- package/dist/bar-chart/root/bar-chart-root.js +11 -20
- package/dist/bar-chart/stack.d.ts +10 -0
- package/dist/bar-chart/stack.js +8 -0
- package/dist/blockquote/root/blockquote-root.d.ts +66 -8
- package/dist/blockquote/root/blockquote-root.js +85 -8
- package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +14 -0
- package/dist/breadcrumbs/breadcrumb/breadcrumb.js +12 -2
- package/dist/breadcrumbs/root/breadcrumbs-root.js +2 -2
- package/dist/button/root/button-root.d.ts +24 -38
- package/dist/button/root/button-root.js +6 -37
- package/dist/button/submitter.d.ts +27 -0
- package/dist/button/submitter.js +25 -0
- package/dist/button-group/arrows.d.ts +14 -0
- package/dist/button-group/arrows.js +10 -0
- package/dist/button-group/root/button-group-root.d.ts +141 -3
- package/dist/button-group/root/button-group-root.js +142 -2
- package/dist/canvas/edge-pan.d.ts +61 -0
- package/dist/canvas/edge-pan.js +63 -0
- package/dist/canvas/node/canvas-node.d.ts +12 -2
- package/dist/canvas/node/canvas-node.js +6 -2
- package/dist/canvas/root/canvas-document.d.ts +10 -0
- package/dist/canvas/root/canvas-document.js +1 -0
- package/dist/canvas/root/canvas-root.d.ts +107 -5
- package/dist/canvas/root/canvas-root.js +140 -36
- package/dist/canvas/snap.d.ts +42 -0
- package/dist/canvas/snap.js +32 -0
- package/dist/card/root/card-root.d.ts +12 -1
- package/dist/card/root/card-root.js +11 -4
- package/dist/carousel/root/carousel-root.d.ts +4 -3
- package/dist/carousel/root/carousel-root.js +2 -6
- package/dist/chat/root/chat-root.d.ts +28 -4
- package/dist/chat/root/chat-root.js +12 -7
- package/dist/checkbox/root/checkbox-root.js +5 -7
- package/dist/checkbox-group/root/checkbox-group-root.d.ts +13 -0
- package/dist/checkbox-group/root/checkbox-group-root.js +16 -7
- package/dist/checkbox-group/select-all.d.ts +9 -4
- package/dist/checkbox-group/select-all.js +1 -1
- package/dist/code-block/root/code-block-root.d.ts +41 -18
- package/dist/code-block/root/code-block-root.js +21 -6
- package/dist/color-input/root/color-input-root.d.ts +11 -0
- package/dist/color-input/root/color-input-root.js +12 -5
- package/dist/color-picker/channels.js +1 -2
- package/dist/color-picker/root/color-picker-root.d.ts +32 -24
- package/dist/color-picker/root/color-picker-root.js +99 -55
- package/dist/color-picker/wheel.d.ts +28 -0
- package/dist/color-picker/wheel.js +15 -0
- package/dist/combobox/root/combobox-root.d.ts +83 -11
- package/dist/combobox/root/combobox-root.js +81 -18
- package/dist/command/root/command-root.d.ts +7 -4
- package/dist/command/root/command-root.js +2 -19
- package/dist/copy-button/root/copy-button-root.d.ts +16 -1
- package/dist/copy-button/root/copy-button-root.js +7 -2
- package/dist/data-table/keys.d.ts +0 -18
- package/dist/data-table/keys.js +1 -11
- package/dist/data-table/root/data-table-root.js +29 -50
- package/dist/date-input/root/date-input-root.d.ts +8 -1
- package/dist/date-input/root/date-input-root.js +8 -5
- package/dist/date-picker/root/date-picker-root.d.ts +14 -9
- package/dist/date-picker/root/date-picker-root.js +21 -16
- package/dist/description-list/item/description-list-item.d.ts +22 -4
- package/dist/description-list/item/description-list-item.js +14 -4
- package/dist/divider/root/divider-root.d.ts +45 -16
- package/dist/divider/root/divider-root.js +28 -4
- package/dist/donut-chart/root/donut-chart-root.js +13 -6
- package/dist/donut-chart/slice-label.d.ts +35 -0
- package/dist/donut-chart/slice-label.js +11 -0
- package/dist/drawer/root/drawer-root.d.ts +4 -2
- package/dist/drawer/root/drawer-root.js +15 -3
- package/dist/drilldown/item/drilldown-item.d.ts +21 -1
- package/dist/drilldown/item/drilldown-item.js +38 -4
- package/dist/drilldown/root/drilldown-root.js +3 -2
- package/dist/element-events.generated.js +5 -1
- package/dist/empty/root/empty-root.d.ts +46 -2
- package/dist/empty/root/empty-root.js +50 -5
- package/dist/file-input/root/file-input-root.d.ts +34 -6
- package/dist/file-input/root/file-input-root.js +55 -21
- package/dist/file-input/status.d.ts +24 -0
- package/dist/file-input/status.js +11 -0
- package/dist/filter-input/chip/filter-chip.d.ts +23 -0
- package/dist/filter-input/chip/filter-chip.js +10 -2
- package/dist/filter-input/root/filter-input-root.d.ts +8 -0
- package/dist/filter-input/root/filter-input-root.js +17 -27
- package/dist/format-date/fields.d.ts +20 -0
- package/dist/format-date/fields.js +14 -0
- package/dist/format-date/options.d.ts +5 -5
- package/dist/format-date/options.js +10 -39
- package/dist/format-date/root/format-date-root.d.ts +53 -4
- package/dist/format-date/root/format-date-root.js +38 -50
- package/dist/graph/root/graph-root.d.ts +23 -5
- package/dist/graph/root/graph-root.js +17 -20
- package/dist/heatmap/root/buckets.d.ts +21 -0
- package/dist/heatmap/root/buckets.js +34 -0
- package/dist/heatmap/root/heatmap-root.d.ts +76 -3
- package/dist/heatmap/root/heatmap-root.js +105 -20
- package/dist/icon/index.d.ts +1 -1
- package/dist/icon/index.js +1 -1
- package/dist/icon/registry.d.ts +26 -1
- package/dist/icon/registry.js +12 -1
- package/dist/icon/root/icon-root.d.ts +13 -0
- package/dist/icon/root/icon-root.js +23 -2
- package/dist/icon/root/index.d.ts +1 -1
- package/dist/icon/root/index.js +1 -1
- package/dist/image/root/image-root.d.ts +20 -0
- package/dist/image/root/image-root.js +6 -1
- package/dist/input/root/input-root.d.ts +23 -2
- package/dist/input/root/input-root.js +12 -8
- package/dist/kbd/root/kbd-root.d.ts +20 -3
- package/dist/kbd/root/kbd-root.js +23 -50
- package/dist/legend/hidden-series.d.ts +10 -2
- package/dist/legend/hidden-series.js +5 -2
- package/dist/legend/root/legend-root.d.ts +25 -7
- package/dist/legend/root/legend-root.js +25 -26
- package/dist/lightbox/root/lightbox-root.d.ts +50 -5
- package/dist/lightbox/root/lightbox-root.js +76 -8
- package/dist/lightbox/zoom.d.ts +2 -0
- package/dist/lightbox/zoom.js +5 -3
- package/dist/line-chart/root/line-chart-root.d.ts +16 -0
- package/dist/line-chart/root/line-chart-root.js +10 -2
- package/dist/list/root/list-root.d.ts +10 -2
- package/dist/list/root/list-root.js +31 -24
- package/dist/list/selection.d.ts +17 -0
- package/dist/list/selection.js +16 -0
- package/dist/listbox/root/listbox-root.d.ts +125 -26
- package/dist/listbox/root/listbox-root.js +156 -166
- package/dist/map/marker/map-marker.d.ts +2 -1
- package/dist/map/root/map-root.d.ts +40 -2
- package/dist/map/root/map-root.js +64 -23
- package/dist/megamenu/hand-over.d.ts +75 -0
- package/dist/megamenu/hand-over.js +67 -0
- package/dist/megamenu/root/megamenu-root.d.ts +38 -14
- package/dist/megamenu/root/megamenu-root.js +29 -50
- package/dist/menu/item/menu-item.js +4 -4
- package/dist/menu/root/menu-root.d.ts +5 -2
- package/dist/meter/root/meter-root.d.ts +42 -0
- package/dist/meter/root/meter-root.js +33 -7
- package/dist/navigation/root/navigation-root.js +5 -8
- package/dist/notifications/group/notification-group.d.ts +8 -1
- package/dist/notifications/group/notification-group.js +12 -6
- package/dist/notifications/notification/notification.d.ts +12 -1
- package/dist/notifications/notification/notification.js +3 -1
- package/dist/notifications/root/notifications-root.d.ts +48 -3
- package/dist/notifications/root/notifications-root.js +36 -6
- package/dist/number-input/grain.d.ts +28 -0
- package/dist/number-input/grain.js +14 -0
- package/dist/number-input/root/number-input-root.d.ts +17 -1
- package/dist/number-input/root/number-input-root.js +29 -18
- package/dist/object-inspector/root/object-inspector-root.d.ts +17 -6
- package/dist/object-inspector/root/object-inspector-root.js +31 -20
- package/dist/option/index.d.ts +1 -0
- package/dist/option/index.js +1 -0
- package/dist/option/separator/option-separator.d.ts +30 -0
- package/dist/option/separator/option-separator.js +21 -0
- package/dist/outline/root/outline-root.d.ts +12 -0
- package/dist/outline/root/outline-root.js +5 -19
- package/dist/pagination/size/pagination-size.d.ts +6 -0
- package/dist/pagination/size/pagination-size.js +5 -3
- package/dist/pin-input/code.d.ts +51 -1
- package/dist/pin-input/code.js +37 -0
- package/dist/pin-input/root/pin-input-root.d.ts +98 -121
- package/dist/pin-input/root/pin-input-root.js +151 -156
- package/dist/popover/hide-outside.js +2 -9
- package/dist/popover/root/popover-root.d.ts +7 -1
- package/dist/popover/root/popover-root.js +9 -1
- package/dist/progress/root/progress-root.d.ts +27 -0
- package/dist/progress/root/progress-root.js +25 -7
- package/dist/qr-code/export.d.ts +19 -0
- package/dist/qr-code/export.js +14 -0
- package/dist/qr-code/name.d.ts +11 -0
- package/dist/qr-code/name.js +7 -0
- package/dist/qr-code/root/qr-code-root.d.ts +31 -9
- package/dist/qr-code/root/qr-code-root.js +29 -17
- package/dist/radio/group/radio-group.d.ts +15 -0
- package/dist/radio/root/radio-root.js +2 -2
- package/dist/rating/root/rating-root.d.ts +22 -9
- package/dist/rating/root/rating-root.js +15 -39
- package/dist/scatter-chart/measures.d.ts +22 -0
- package/dist/scatter-chart/measures.js +11 -0
- package/dist/scatter-chart/root/scatter-chart-root.d.ts +26 -0
- package/dist/scatter-chart/root/scatter-chart-root.js +21 -7
- package/dist/scroll-area/scrollbar.d.ts +0 -8
- package/dist/scroll-area/scrollbar.js +1 -1
- package/dist/select/align.d.ts +47 -0
- package/dist/select/align.js +7 -0
- package/dist/select/root/select-root.d.ts +115 -11
- package/dist/select/root/select-root.js +104 -20
- package/dist/slider/root/slider-root.d.ts +18 -1
- package/dist/slider/root/slider-root.js +22 -0
- package/dist/sparkline/readings.d.ts +30 -12
- package/dist/sparkline/readings.js +32 -15
- package/dist/sparkline/root/sparkline-root.d.ts +46 -3
- package/dist/sparkline/root/sparkline-root.js +60 -21
- package/dist/speed-dial/group/speed-dial-group.d.ts +48 -0
- package/dist/speed-dial/group/speed-dial-group.js +43 -0
- package/dist/speed-dial/index.d.ts +1 -0
- package/dist/speed-dial/index.js +1 -0
- package/dist/speed-dial/item/speed-dial-item.d.ts +27 -2
- package/dist/speed-dial/item/speed-dial-item.js +43 -5
- package/dist/speed-dial/long-press.d.ts +50 -0
- package/dist/speed-dial/long-press.js +48 -0
- package/dist/speed-dial/root/speed-dial-root.d.ts +86 -1
- package/dist/speed-dial/root/speed-dial-root.js +123 -6
- package/dist/splitter/root/splitter-root.d.ts +9 -2
- package/dist/splitter/root/splitter-root.js +18 -3
- package/dist/steps/root/steps-root.d.ts +8 -1
- package/dist/steps/root/steps-root.js +6 -1
- package/dist/steps/step/step.d.ts +1 -0
- package/dist/steps/step/step.js +1 -1
- package/dist/table/cell/table-cell.d.ts +8 -1
- package/dist/table/cell/table-cell.js +6 -2
- package/dist/table/column/table-column.d.ts +6 -0
- package/dist/table/column/table-column.js +5 -1
- package/dist/table/grid-controller.d.ts +117 -0
- package/dist/table/grid-controller.js +293 -0
- package/dist/table/root/table-root.d.ts +47 -3
- package/dist/table/root/table-root.js +93 -29
- package/dist/table/row/table-row.d.ts +36 -0
- package/dist/table/row/table-row.js +52 -2
- package/dist/tabs/root/tabs-root.d.ts +5 -3
- package/dist/tag/group/tag-group.d.ts +16 -4
- package/dist/tag/group/tag-group.js +23 -20
- package/dist/textarea/root/textarea-root.d.ts +14 -2
- package/dist/textarea/root/textarea-root.js +6 -7
- package/dist/time-input/root/time-input-root.d.ts +5 -1
- package/dist/time-input/root/time-input-root.js +10 -7
- package/dist/time-picker/root/time-picker-root.d.ts +12 -14
- package/dist/time-picker/root/time-picker-root.js +18 -23
- package/dist/toast/item/toast-item.d.ts +9 -6
- package/dist/toast/item/toast-item.js +1 -1
- package/dist/toast/root/toast-root.d.ts +40 -4
- package/dist/toast/root/toast-root.js +68 -16
- package/dist/toast/words.d.ts +12 -0
- package/dist/toast/words.js +25 -0
- package/dist/toggle/group/toggle-group.d.ts +29 -5
- package/dist/toggle/group/toggle-group.js +26 -43
- package/dist/toggle/root/toggle-root.js +2 -4
- package/dist/toolbar/root/toolbar-root.d.ts +52 -5
- package/dist/toolbar/root/toolbar-root.js +88 -13
- package/dist/tooltip/root/tooltip-root.d.ts +7 -1
- package/dist/tooltip/root/tooltip-root.js +10 -2
- package/dist/tour/root/tour-root.d.ts +15 -0
- package/dist/tour/root/tour-root.js +20 -1
- package/dist/tour/stop/tour-stop.d.ts +3 -0
- package/dist/tour/stop/tour-stop.js +3 -3
- package/dist/tree/root/tree-root.js +2 -2
- package/dist/trend/figure.d.ts +16 -0
- package/dist/trend/figure.js +8 -0
- package/dist/trend/root/trend-root.d.ts +41 -2
- package/dist/trend/root/trend-root.js +29 -3
- package/dist/video/root/extra-controls.d.ts +12 -0
- package/dist/video/root/extra-controls.js +6 -2
- package/dist/video/root/video-root.d.ts +16 -1
- package/dist/video/root/video-root.js +15 -1
- package/dist/video-playlist/root/video-playlist-root.d.ts +11 -1
- package/dist/video-playlist/root/video-playlist-root.js +3 -0
- package/dist/virtual-list/fill.d.ts +11 -0
- package/dist/virtual-list/fill.js +9 -0
- package/dist/virtual-list/keys.d.ts +16 -7
- package/dist/virtual-list/keys.js +17 -6
- package/dist/virtual-list/plan.d.ts +17 -1
- package/dist/virtual-list/plan.js +13 -2
- package/dist/virtual-list/root/virtual-list-root.d.ts +25 -3
- package/dist/virtual-list/root/virtual-list-root.js +53 -41
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +4934 -954
- package/types/svelte.d.ts +2 -0
- package/types/vue.d.ts +946 -253
- package/dist/color-picker/swatches.d.ts +0 -12
- package/dist/color-picker/swatches.js +0 -26
- package/dist/rating/steps.d.ts +0 -7
- package/dist/rating/steps.js +0 -9
- package/dist/tooltip/focus-target.d.ts +0 -6
- package/dist/tooltip/focus-target.js +0 -9
package/dist/lightbox/zoom.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { clamp } from '@fusion.dev/helix-core';
|
|
2
|
+
const held = (value, low, high) => clamp(value, low, high) || 0;
|
|
3
|
+
export const clampScale = (scale, max) => held(scale, 1, Math.max(max, 1));
|
|
3
4
|
export const clampPan = (pan, scale, width, height) => {
|
|
4
5
|
const x = ((scale - 1) * width) / 2;
|
|
5
6
|
const y = ((scale - 1) * height) / 2;
|
|
6
|
-
return { x:
|
|
7
|
+
return { x: held(pan.x, -x, x), y: held(pan.y, -y, y) };
|
|
7
8
|
};
|
|
8
9
|
export const zoomAt = (at, from, to, pan) => ({
|
|
9
10
|
x: at.x - ((at.x - pan.x) * to) / from,
|
|
@@ -14,3 +15,4 @@ export const between = (a, b) => ({
|
|
|
14
15
|
x: (a.x + b.x) / 2,
|
|
15
16
|
y: (a.y + b.y) / 2,
|
|
16
17
|
});
|
|
18
|
+
export const percentOf = (scale) => Math.round(scale * 100);
|
|
@@ -15,6 +15,10 @@ declare const HelixHeadlessLineChart_base: typeof HelixElement & (new (...args:
|
|
|
15
15
|
*
|
|
16
16
|
* Every series shares one scale, as in the bar chart.
|
|
17
17
|
*
|
|
18
|
+
* `dashed` names the series drawn as a dashed line, such as a forecast or a
|
|
19
|
+
* target beside the readings: `dashed="Forecast"`. Each takes a
|
|
20
|
+
* `line-dashed` part beside `line`.
|
|
21
|
+
*
|
|
18
22
|
* `area` fills each series down to the floor on its own, so the fills overlap.
|
|
19
23
|
* For a total made of parts, use `Area Chart`, which stacks the series so the
|
|
20
24
|
* top edge is the total and each band is a share.
|
|
@@ -47,6 +51,7 @@ declare const HelixHeadlessLineChart_base: typeof HelixElement & (new (...args:
|
|
|
47
51
|
* @csspart label - One reading's name.
|
|
48
52
|
* @csspart labels - The row of reading names.
|
|
49
53
|
* @csspart line - The line for one series.
|
|
54
|
+
* @csspart line-dashed - A `line` whose series `dashed` names. Set alongside `line`.
|
|
50
55
|
* @csspart live - The readout: a polite live region that says the reading the keys moved to. Hide it visually.
|
|
51
56
|
* @csspart mark - The invisible point the tooltip is anchored to.
|
|
52
57
|
* @csspart marker - The mark on one reading, under `markers`, and on a reading with a blank on either side. Placed with `inset-inline-start` and `inset-block-start`, and carries its series color as `--chart-series`.
|
|
@@ -112,6 +117,15 @@ export declare class HelixHeadlessLineChart extends HelixHeadlessLineChart_base
|
|
|
112
117
|
* here, which is what lets a line take the reading aid.
|
|
113
118
|
*/
|
|
114
119
|
curve?: Curve;
|
|
120
|
+
/**
|
|
121
|
+
* The series drawn as a dashed line, by their headings, separated by
|
|
122
|
+
* commas: `dashed="Forecast, Target"`.
|
|
123
|
+
*
|
|
124
|
+
* For a series that is not a reading, such as a forecast or a goal, drawn
|
|
125
|
+
* beside the ones that are. Each takes a `line-dashed` part beside `line`,
|
|
126
|
+
* which a stylesheet draws dashed. Absent, every line is solid.
|
|
127
|
+
*/
|
|
128
|
+
dashed: string;
|
|
115
129
|
/**
|
|
116
130
|
* Which rules are drawn across the plot, if any.
|
|
117
131
|
*
|
|
@@ -276,6 +290,8 @@ export declare class HelixHeadlessLineChart extends HelixHeadlessLineChart_base
|
|
|
276
290
|
* start, as the drawing is mirrored.
|
|
277
291
|
*/
|
|
278
292
|
protected renderMarkers(series: Series[], x: (value: number) => number, y: (value: number) => number): TemplateResult | typeof nothing;
|
|
293
|
+
/** Whether `dashed` names this series, matched as a heading is. */
|
|
294
|
+
private dashes;
|
|
279
295
|
/**
|
|
280
296
|
* One series, its wash first so the line is drawn over its own fill.
|
|
281
297
|
*
|
|
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { byRow, CHART_PLOT, customElement, drawTooltip, extent, HelixElement, linear, linePath, MixinChartSource, PLOT_HEIGHT, PLOT_WIDTH, seriesIndex, ticks, unbroken, } from '@fusion.dev/helix-core';
|
|
7
|
+
import { byRow, CHART_PLOT, commaList, customElement, drawTooltip, extent, HelixElement, linear, linePath, MixinChartSource, PLOT_HEIGHT, PLOT_WIDTH, seriesIndex, seriesKey, ticks, unbroken, } from '@fusion.dev/helix-core';
|
|
8
8
|
import { html, nothing, svg } from 'lit';
|
|
9
9
|
import { property } from 'lit/decorators.js';
|
|
10
10
|
import '../../tooltip/index.js';
|
|
@@ -12,6 +12,7 @@ let HelixHeadlessLineChart = class HelixHeadlessLineChart extends MixinChartSour
|
|
|
12
12
|
constructor() {
|
|
13
13
|
super(...arguments);
|
|
14
14
|
this.area = false;
|
|
15
|
+
this.dashed = '';
|
|
15
16
|
this.markers = false;
|
|
16
17
|
this.zero = false;
|
|
17
18
|
}
|
|
@@ -166,6 +167,10 @@ let HelixHeadlessLineChart = class HelixHeadlessLineChart extends MixinChartSour
|
|
|
166
167
|
style=${`--chart-series: var(--chart-series-${seriesIndex(depth)}); inset-inline-start: ${(x(point.at) / PLOT_WIDTH) * 100}%; inset-block-start: ${(y(point.value) / PLOT_HEIGHT) * 100}%`}
|
|
167
168
|
></span>`)}`;
|
|
168
169
|
}
|
|
170
|
+
dashes(name) {
|
|
171
|
+
const key = seriesKey(name);
|
|
172
|
+
return this.dashed !== '' && commaList(this.dashed).some((one) => seriesKey(one) === key);
|
|
173
|
+
}
|
|
169
174
|
renderSeries(one, depth, x, y) {
|
|
170
175
|
if (!this.showsSeries(one.name)) {
|
|
171
176
|
return html `${nothing}`;
|
|
@@ -199,7 +204,7 @@ let HelixHeadlessLineChart = class HelixHeadlessLineChart extends MixinChartSour
|
|
|
199
204
|
d=${path}
|
|
200
205
|
data-series=${index}
|
|
201
206
|
fill="none"
|
|
202
|
-
part="line"
|
|
207
|
+
part="line${this.dashes(one.name) ? ' line-dashed' : ''}"
|
|
203
208
|
style="--chart-series: var(--chart-series-${index})"
|
|
204
209
|
/>`;
|
|
205
210
|
}
|
|
@@ -235,6 +240,9 @@ __decorate([
|
|
|
235
240
|
__decorate([
|
|
236
241
|
property({ reflect: true })
|
|
237
242
|
], HelixHeadlessLineChart.prototype, "curve", void 0);
|
|
243
|
+
__decorate([
|
|
244
|
+
property()
|
|
245
|
+
], HelixHeadlessLineChart.prototype, "dashed", void 0);
|
|
238
246
|
__decorate([
|
|
239
247
|
property()
|
|
240
248
|
], HelixHeadlessLineChart.prototype, "gridlines", void 0);
|
|
@@ -27,12 +27,14 @@ import { type ListSelectionBehavior, type ListSelectionMode } from '../selection
|
|
|
27
27
|
* |---|---|
|
|
28
28
|
* | Down, Up | Moves to the next or the previous row. Under `replace`, selects it. |
|
|
29
29
|
* | Home, End | Moves to the first or the last row. Under `replace`, selects it. |
|
|
30
|
+
* | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under `replace`, selects the row it lands on. |
|
|
30
31
|
* | A letter or a word | Moves to the next row whose words start with what you typed. |
|
|
31
32
|
* | Left, Right | Moves between the row and the controls in its `end` slot. |
|
|
32
33
|
* | Space | Selects the row, or lets it go. |
|
|
33
|
-
* | Shift with Down, Up, Home, End or Space | Selects every row from the last one pressed, in `multiple`. |
|
|
34
|
-
* | Control or Command with Down, Up, Home or
|
|
34
|
+
* | Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in `multiple`. |
|
|
35
|
+
* | Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under `replace`. |
|
|
35
36
|
* | Control or Command with A | Selects every row, in `multiple`. |
|
|
37
|
+
* | Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. |
|
|
36
38
|
* | Enter | Acts on the row: follows its link, or sends `helix-action` from it. |
|
|
37
39
|
*
|
|
38
40
|
* A press with Shift selects every row from the last one pressed, and a press
|
|
@@ -185,6 +187,12 @@ export declare class HelixHeadlessList extends HelixElement {
|
|
|
185
187
|
* nothing was pressed yet.
|
|
186
188
|
*/
|
|
187
189
|
private arrive;
|
|
190
|
+
/**
|
|
191
|
+
* Page Down or Page Up from the row: focus moves a box's height of rows, the
|
|
192
|
+
* list's own where it scrolls and the window's where it does not, and lands
|
|
193
|
+
* the way an arrow does, so `replace` and Shift choose as they do there.
|
|
194
|
+
*/
|
|
195
|
+
private page;
|
|
188
196
|
/** Acts on the row: follows its link, or says it was acted on. */
|
|
189
197
|
protected act(row: HelixHeadlessListItem): void;
|
|
190
198
|
/** Left and Right inside a row: the cell, then each control in `end`, and back. */
|
|
@@ -4,13 +4,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { commaList, customElement,
|
|
7
|
+
import { commaList, customElement, focusItemOf, HelixActionEvent, HelixElement, hostAria, inlineStep, KeyboardNavigationController, pressedOwnControl, requestValue, rovingStop, scrollRoom, selectsAll, typeaheadByWords, whenHydrated, } from '@fusion.dev/helix-core';
|
|
8
8
|
import { html, nothing } from 'lit';
|
|
9
9
|
import { property } from 'lit/decorators.js';
|
|
10
10
|
import { HelixHeadlessListItem } from '../item/list-item.js';
|
|
11
11
|
import { numbering } from '../numbering.js';
|
|
12
|
-
import { choiceValue, rowStop, } from '../selection.js';
|
|
13
|
-
const PRESSABLE = 'a[href], button, input, label, select, textarea, [tabindex]';
|
|
12
|
+
import { choiceValue, pageReach, rowStop, } from '../selection.js';
|
|
14
13
|
let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
|
|
15
14
|
constructor() {
|
|
16
15
|
super(...arguments);
|
|
@@ -23,15 +22,19 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
|
|
|
23
22
|
origin: 'focus',
|
|
24
23
|
reserved: () => ['ArrowLeft', 'ArrowRight'],
|
|
25
24
|
selects: () => false,
|
|
26
|
-
typeahead:
|
|
25
|
+
typeahead: typeaheadByWords(),
|
|
27
26
|
wrap: false,
|
|
28
27
|
});
|
|
29
28
|
this.handleKeyCapture = (event) => {
|
|
30
29
|
this.moving = { extend: event.shiftKey, toggle: event.ctrlKey || event.metaKey };
|
|
31
30
|
};
|
|
32
31
|
this.handleKeydown = (event) => {
|
|
33
|
-
this.moving = undefined;
|
|
34
32
|
const row = this.interactive ? this.rowOf(event) : undefined;
|
|
33
|
+
if (row && !row.disabled && !event.altKey && /^Page(Down|Up)$/.test(event.key)) {
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
this.page(row, event.key === 'PageDown' ? 1 : -1);
|
|
36
|
+
}
|
|
37
|
+
this.moving = undefined;
|
|
35
38
|
if (!row || row.disabled || event.altKey) {
|
|
36
39
|
return;
|
|
37
40
|
}
|
|
@@ -43,11 +46,16 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
|
|
|
43
46
|
if (event.composedPath()[0] !== row.cell) {
|
|
44
47
|
return;
|
|
45
48
|
}
|
|
46
|
-
if (
|
|
49
|
+
if (selectsAll(event) && this.selectionMode === 'multiple') {
|
|
47
50
|
event.preventDefault();
|
|
48
51
|
const every = this.reachable.map((one) => this.valueFor(one)).join(', ');
|
|
49
52
|
this.choose(every === this.value ? null : every);
|
|
50
53
|
}
|
|
54
|
+
else if (event.key === 'Escape' && this.value !== '' && this.selectionMode !== 'none') {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
event.stopPropagation();
|
|
57
|
+
this.choose('');
|
|
58
|
+
}
|
|
51
59
|
else if (event.key === 'Enter' && !toggle) {
|
|
52
60
|
event.preventDefault();
|
|
53
61
|
this.act(row);
|
|
@@ -62,11 +70,8 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
|
|
|
62
70
|
if (!row) {
|
|
63
71
|
return;
|
|
64
72
|
}
|
|
65
|
-
const path = event.composedPath();
|
|
66
73
|
const cell = row.cell;
|
|
67
|
-
|
|
68
|
-
const inner = path.slice(0, Math.max(0, end));
|
|
69
|
-
if (inner.some((node) => node instanceof HTMLElement && node.matches(PRESSABLE))) {
|
|
74
|
+
if (pressedOwnControl(event, cell && event.composedPath().includes(cell) ? cell : row)) {
|
|
70
75
|
return;
|
|
71
76
|
}
|
|
72
77
|
if (this.selectionMode === 'none') {
|
|
@@ -101,14 +106,11 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
|
|
|
101
106
|
return this.interactive ? this.rows.filter((row) => !row.disabled) : [];
|
|
102
107
|
}
|
|
103
108
|
navigable(row) {
|
|
104
|
-
return {
|
|
105
|
-
contains: (node) => row.contains(node),
|
|
109
|
+
return focusItemOf(row, {
|
|
106
110
|
disabled: row.disabled,
|
|
107
|
-
|
|
108
|
-
select: () => { },
|
|
109
|
-
selected: false,
|
|
111
|
+
focus: () => row.focusItem(),
|
|
110
112
|
words: row.words,
|
|
111
|
-
};
|
|
113
|
+
});
|
|
112
114
|
}
|
|
113
115
|
valueFor(row) {
|
|
114
116
|
return row.value || row.words;
|
|
@@ -140,14 +142,8 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
|
|
|
140
142
|
if (next === null) {
|
|
141
143
|
return;
|
|
142
144
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
this.value = value;
|
|
146
|
-
this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
|
|
147
|
-
},
|
|
148
|
-
event: (value) => new HelixBeforeChangeEvent({ value }),
|
|
149
|
-
host: this,
|
|
150
|
-
next,
|
|
145
|
+
requestValue(this, next, (value) => {
|
|
146
|
+
this.value = value;
|
|
151
147
|
});
|
|
152
148
|
}
|
|
153
149
|
choice(row, extend, toggle, arrived) {
|
|
@@ -188,6 +184,17 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
|
|
|
188
184
|
}
|
|
189
185
|
this.choose(next);
|
|
190
186
|
}
|
|
187
|
+
page(row, step) {
|
|
188
|
+
const rows = this.reachable;
|
|
189
|
+
const edges = rows.map((one) => {
|
|
190
|
+
const box = one.getBoundingClientRect();
|
|
191
|
+
return { bottom: box.bottom, top: box.top };
|
|
192
|
+
});
|
|
193
|
+
const target = rows[pageReach(edges, rows.indexOf(row), scrollRoom(this), step)];
|
|
194
|
+
if (target && target !== row) {
|
|
195
|
+
target.focusItem();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
191
198
|
act(row) {
|
|
192
199
|
if (row.disabled) {
|
|
193
200
|
return;
|
package/dist/list/selection.d.ts
CHANGED
|
@@ -47,3 +47,20 @@ export declare const choiceValue: ({ anchor, arrived, behavior, extend, mode, pr
|
|
|
47
47
|
* and from the cell going back reaches the last control.
|
|
48
48
|
*/
|
|
49
49
|
export declare const rowStop: (count: number, at: number, step: -1 | 1) => number;
|
|
50
|
+
/** Where a row sits along the list, in pixels, as the page keys measure it. */
|
|
51
|
+
export interface RowEdges {
|
|
52
|
+
/** The row's top edge. */
|
|
53
|
+
top: number;
|
|
54
|
+
/** The row's bottom edge. */
|
|
55
|
+
bottom: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Where Page Down (`step` 1) or Page Up (`step` -1) goes from row `at`: the
|
|
59
|
+
* farthest row that fits whole in `room` pixels together with row `at`, so the
|
|
60
|
+
* row at one edge of the box lands at the other, and at least the next row.
|
|
61
|
+
*
|
|
62
|
+
* Measured rather than counted, because a list's rows differ in height. Rows of
|
|
63
|
+
* one height `h` move `floor(room / h) - 1` rows, which is what Data Table and
|
|
64
|
+
* Virtual List move. At either end it stays on row `at`.
|
|
65
|
+
*/
|
|
66
|
+
export declare const pageReach: (rows: readonly RowEdges[], at: number, room: number, step: -1 | 1) => number;
|
package/dist/list/selection.js
CHANGED
|
@@ -28,3 +28,19 @@ export const rowStop = (count, at, step) => {
|
|
|
28
28
|
}
|
|
29
29
|
return next < 0 ? count - 1 : next;
|
|
30
30
|
};
|
|
31
|
+
export const pageReach = (rows, at, room, step) => {
|
|
32
|
+
const from = rows[at];
|
|
33
|
+
if (!from) {
|
|
34
|
+
return at;
|
|
35
|
+
}
|
|
36
|
+
let reach = at;
|
|
37
|
+
for (let next = at + step; next >= 0 && next < rows.length; next += step) {
|
|
38
|
+
const row = rows[next];
|
|
39
|
+
const span = step === 1 ? row.bottom - from.top : from.bottom - row.top;
|
|
40
|
+
if (span > room && next !== at + step) {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
reach = next;
|
|
44
|
+
}
|
|
45
|
+
return reach;
|
|
46
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AriaForwardController, DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
|
|
1
|
+
import { AriaForwardController, type DataOptionItem, DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
|
|
2
2
|
import { nothing, type PropertyValues, type TemplateResult } from 'lit';
|
|
3
3
|
import { HelixHeadlessOption } from '../../option/root/option-root.js';
|
|
4
4
|
declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusion.dev/helix-core").CollectionElement) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerValueInterface) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinFieldInterface) & typeof HelixFormElement;
|
|
@@ -20,14 +20,31 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
|
|
|
20
20
|
* active option is where the keyboard is: the arrow keys move it, and
|
|
21
21
|
* `aria-activedescendant` points to it while focus stays on the list.
|
|
22
22
|
*
|
|
23
|
-
* The
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
23
|
+
* **Keyboard.** The list is one tab stop, or its filter field is where there
|
|
24
|
+
* is one. In a single-choice list the highlight is the choice unless `manual`
|
|
25
|
+
* is set; then Enter, Space or a click chooses.
|
|
26
|
+
*
|
|
27
|
+
* | Key | What it does |
|
|
28
|
+
* |---|---|
|
|
29
|
+
* | Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With `layout="grid"`, to the option below or above, stopping at the edge. |
|
|
30
|
+
* | Right, Left | With `layout="grid"`, moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. |
|
|
31
|
+
* | Home, End | Moves to the first or the last option. In a filter field, moves the caret. |
|
|
32
|
+
* | Page Down, Page Up | Moves by as many options as the list shows at once. |
|
|
33
|
+
* | A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. |
|
|
34
|
+
* | Enter | Chooses the highlighted option, or follows it where it is a link. |
|
|
35
|
+
* | Space | Chooses the highlighted option, or with `multiple` toggles it. In a filter field, types a space. |
|
|
36
|
+
* | Shift with Down or Up | With `multiple`, adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. |
|
|
37
|
+
* | Shift with Space | With `multiple`, adds every option from the one last chosen to the highlighted one. In a filter field, types a space. |
|
|
38
|
+
* | Shift with Home or End | With `multiple`, adds every option from the highlight to that end. In a filter field, hold Control as well. |
|
|
39
|
+
* | Control or Command with A | With `multiple`, chooses every option, or none where all are chosen. In a filter field, selects the text. |
|
|
40
|
+
* | Escape | In a filter field, clears the filter. |
|
|
41
|
+
*
|
|
42
|
+
* **ARIA.** The `items` part is the `listbox`, named by the label and
|
|
43
|
+
* described by the hint and the message, with `aria-multiselectable` under
|
|
44
|
+
* `multiple`, `aria-required`, `aria-invalid`, and `aria-busy` while loading.
|
|
45
|
+
* Each option is an `option` with `aria-selected`. The list, or its filter
|
|
46
|
+
* field, points `aria-activedescendant` at the highlighted option; the field
|
|
47
|
+
* is `aria-autocomplete="list"` and controls the list.
|
|
31
48
|
*
|
|
32
49
|
* An option with `href` is a link: Enter or a press follows it and selects
|
|
33
50
|
* nothing, and moving onto it with the arrows does not follow it.
|
|
@@ -80,12 +97,16 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
|
|
|
80
97
|
export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
81
98
|
protected readonly aria: AriaForwardController;
|
|
82
99
|
/**
|
|
83
|
-
* What
|
|
100
|
+
* What a browser's autofill may choose, as a platform token such as
|
|
101
|
+
* `country` or `cc-exp-month`, as a native `<select>` takes it.
|
|
102
|
+
*
|
|
103
|
+
* Set, the list draws a hidden native `<select>` with the same options for
|
|
104
|
+
* the browser to fill, as React Aria's `HiddenSelect` does, and a fill
|
|
105
|
+
* chooses the option. `off`, the default, draws none.
|
|
84
106
|
*
|
|
85
|
-
* **
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* keystrokes as the listbox. A consumer who wants autofill can still ask.
|
|
107
|
+
* **The filter field is never filled.** It narrows the list rather than
|
|
108
|
+
* collecting a value, so a browser offering it a saved address competes
|
|
109
|
+
* with the reader for the same keystrokes: it is always `off`.
|
|
89
110
|
*/
|
|
90
111
|
autocomplete: string;
|
|
91
112
|
/**
|
|
@@ -136,14 +157,49 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
136
157
|
* Placeholder text for the filter field.
|
|
137
158
|
*/
|
|
138
159
|
filterLabel: string;
|
|
160
|
+
/**
|
|
161
|
+
* The options as data, for a list too long to draw whole: each a value,
|
|
162
|
+
* which is also its words, or a record with a `value`, a `label` and
|
|
163
|
+
* `disabled`. Set, the list draws only the options in sight, and the ones
|
|
164
|
+
* you write as children are not read.
|
|
165
|
+
*
|
|
166
|
+
* **Every option is still reachable.** The keyboard, the typeahead, the
|
|
167
|
+
* filter and the value work over the whole set, and the option the keyboard
|
|
168
|
+
* is on is drawn wherever it is, so a screen reader is told about it. Each
|
|
169
|
+
* drawn option says its place in the set (`aria-posinset`, `aria-setsize`).
|
|
170
|
+
* React Aria virtualizes a `ListBox` with its `Virtualizer`; this is core's
|
|
171
|
+
* `VirtualizeController`.
|
|
172
|
+
*
|
|
173
|
+
* **The list needs a height to scroll in**: the styled tier's
|
|
174
|
+
* `--listbox-max-block-size`, or a `max-block-size` on `::part(items)` in the
|
|
175
|
+
* headless tier. Import the Option family as well, whose elements are drawn.
|
|
176
|
+
* A server sends the list empty, and the options are drawn once it hydrates.
|
|
177
|
+
*/
|
|
178
|
+
items: readonly DataOptionItem[] | undefined;
|
|
179
|
+
/**
|
|
180
|
+
* How the options are laid out, which the arrow keys follow: `stack`, one
|
|
181
|
+
* under another, or `grid`, in rows and columns, as React Aria's `ListBox`
|
|
182
|
+
* lays out cards or photos. With `grid`, Up and Down move within a column,
|
|
183
|
+
* and Left and Right along the list, mirrored right to left.
|
|
184
|
+
*
|
|
185
|
+
* The columns are the stylesheet's: the styled tier draws them at
|
|
186
|
+
* `--listbox-column-min-inline-size` or wider, and a headless list lays out
|
|
187
|
+
* `::part(items)` as it likes, since the keys read where each option is
|
|
188
|
+
* drawn. A list of `items` stays a stack. Left out, the list is a stack,
|
|
189
|
+
* and the host carries no attribute for it.
|
|
190
|
+
*/
|
|
191
|
+
layout?: 'grid' | 'stack';
|
|
192
|
+
/** Draws `items` a window at a time. See core's `OptionWindowController`. */
|
|
193
|
+
private readonly data;
|
|
139
194
|
/**
|
|
140
195
|
* What the list says when its options could not be loaded, such as after a
|
|
141
|
-
* request to a server fails. Empty is no error
|
|
196
|
+
* request to a server fails. Empty, null or no attribute is no error, so
|
|
197
|
+
* removing the attribute clears it.
|
|
142
198
|
*
|
|
143
199
|
* Set, it shows under any options there are, in place of `empty-text` and
|
|
144
200
|
* `loading-text`, and a screen reader hears it. Clear it when you ask again.
|
|
145
201
|
*/
|
|
146
|
-
loadError: string;
|
|
202
|
+
loadError: string | null;
|
|
147
203
|
/**
|
|
148
204
|
* Stops the arrow keys from choosing each option they move to. Enter, Space
|
|
149
205
|
* or a click chooses the highlighted option.
|
|
@@ -178,6 +234,11 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
178
234
|
* writes the rest here.
|
|
179
235
|
*/
|
|
180
236
|
resultsLabel: string;
|
|
237
|
+
/**
|
|
238
|
+
* What VoiceOver hears as the highlight reaches a chosen option from the
|
|
239
|
+
* filter field, on Apple devices. `{name}` is the option's words.
|
|
240
|
+
*/
|
|
241
|
+
selectedLabel: string;
|
|
181
242
|
/**
|
|
182
243
|
* Which option the keyboard is on, which is not what is chosen.
|
|
183
244
|
*/
|
|
@@ -187,6 +248,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
187
248
|
* it back on the first match.
|
|
188
249
|
*/
|
|
189
250
|
private parked;
|
|
251
|
+
/** The option last chosen, which Shift with Space extends from. */
|
|
252
|
+
private anchor;
|
|
190
253
|
/** The letters typed at the list, which move the highlight to a match. */
|
|
191
254
|
private readonly typeahead;
|
|
192
255
|
/**
|
|
@@ -210,6 +273,9 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
210
273
|
* markup, so the hiding is done to them in `willUpdate` and the render reads
|
|
211
274
|
* the answer it left here. Counted during render instead, a filter matching
|
|
212
275
|
* nothing left an empty box with no message in it.
|
|
276
|
+
*
|
|
277
|
+
* Plain rather than reactive: `place` writes it inside an update, which
|
|
278
|
+
* draws it, and a slot change asks for that update.
|
|
213
279
|
*/
|
|
214
280
|
private hasMatches;
|
|
215
281
|
/**
|
|
@@ -219,7 +285,7 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
219
285
|
* count: without this the list shipped "Nothing to show" over markup that was
|
|
220
286
|
* about to have options in it, which is the one thing an empty state must
|
|
221
287
|
* never do. `place` does not run on the server, so this is false exactly
|
|
222
|
-
* when the answer is unknown.
|
|
288
|
+
* when the answer is unknown. Plain, for the reason `hasMatches` is.
|
|
223
289
|
*/
|
|
224
290
|
private counted;
|
|
225
291
|
protected readonly cascade: DisabledCascadeController;
|
|
@@ -258,6 +324,17 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
258
324
|
* which the region says in place of this.
|
|
259
325
|
*/
|
|
260
326
|
private tell;
|
|
327
|
+
/**
|
|
328
|
+
* Says the option the arrows reached from the filter field, on Apple devices.
|
|
329
|
+
*
|
|
330
|
+
* **VoiceOver does not read the option `aria-activedescendant` points to**
|
|
331
|
+
* while focus is in a text field, so a filterable list moved its highlight
|
|
332
|
+
* in silence there. React Aria's combobox says the option on Apple devices,
|
|
333
|
+
* with "selected" where it is chosen; the field here is the same pattern.
|
|
334
|
+
* Only while the field has focus, so a highlight placed as the list opens
|
|
335
|
+
* or seeded from the value says nothing until the reader moves it.
|
|
336
|
+
*/
|
|
337
|
+
private tellActive;
|
|
261
338
|
/**
|
|
262
339
|
* @internal Moves the highlight to the option whose words start with the
|
|
263
340
|
* letters typed, and returns its value, or nothing where none matches.
|
|
@@ -267,6 +344,13 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
267
344
|
* `<select>` does.
|
|
268
345
|
*/
|
|
269
346
|
typeaheadTo(key: string): string | undefined;
|
|
347
|
+
/**
|
|
348
|
+
* @internal Called when the option already chosen is chosen again, which
|
|
349
|
+
* changes nothing here and answers the question for the control that opened
|
|
350
|
+
* the list. Select and Combobox close their panel on it, as a native
|
|
351
|
+
* `<select>` closes when its own answer is pressed.
|
|
352
|
+
*/
|
|
353
|
+
chosenAgain: (() => void) | undefined;
|
|
270
354
|
/** @internal Whether letters typed in the last moment are still one search. */
|
|
271
355
|
get typing(): boolean;
|
|
272
356
|
/**
|
|
@@ -286,7 +370,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
286
370
|
*/
|
|
287
371
|
get options(): HelixHeadlessOption[];
|
|
288
372
|
/**
|
|
289
|
-
*
|
|
373
|
+
* The elements of one kind in the list: its options, its groups or its
|
|
374
|
+
* rules. Walks the tree, and walks *through* a slot when it meets one.
|
|
290
375
|
*
|
|
291
376
|
* Through a slot because that is how this gets composed. `Select` renders a
|
|
292
377
|
* listbox in its own shadow root with a slot inside it, so the options are
|
|
@@ -294,9 +379,17 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
294
379
|
* `querySelectorAll` finds the slot and no options at all, and the whole
|
|
295
380
|
* component comes up empty.
|
|
296
381
|
*/
|
|
297
|
-
private
|
|
298
|
-
/**
|
|
382
|
+
private among;
|
|
383
|
+
/**
|
|
384
|
+
* The groups, found the same way and for the same reason, and by their
|
|
385
|
+
* name rather than their class, as the rules are: a list that holds no group
|
|
386
|
+
* does not carry the group's code, and either tier's tag ends the same way.
|
|
387
|
+
*/
|
|
299
388
|
private get groups();
|
|
389
|
+
/** Every option the list reads: the records of `items`, or the elements. */
|
|
390
|
+
private get entries();
|
|
391
|
+
/** The option elements on the page: the ones drawn for `items`, or the children. */
|
|
392
|
+
private get elements();
|
|
300
393
|
/** The options a filter has left showing. */
|
|
301
394
|
private get shown();
|
|
302
395
|
/** The chosen values, as an array whether or not `multiple` is set. */
|
|
@@ -309,6 +402,11 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
309
402
|
*/
|
|
310
403
|
private choose;
|
|
311
404
|
private readonly handleSelection;
|
|
405
|
+
/**
|
|
406
|
+
* Adds every option a reader can reach from the one last chosen to `to`,
|
|
407
|
+
* APG's Shift with Space. With none chosen yet, it adds `to` alone.
|
|
408
|
+
*/
|
|
409
|
+
private extend;
|
|
312
410
|
/**
|
|
313
411
|
* Moves the keyboard, and chooses with it only where that is the pattern.
|
|
314
412
|
*
|
|
@@ -377,10 +475,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
377
475
|
* read as a dial rather than scanned as a list, which is what Time Picker's
|
|
378
476
|
* wheels do with three of these.
|
|
379
477
|
*
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
* which is not this list and is not guaranteed to be anything: measuring both
|
|
383
|
-
* rects and moving by the difference needs no such assumption.
|
|
478
|
+
* Measured by core's `centerInView`, or, for a list of `items`, by the
|
|
479
|
+
* arithmetic, since the chosen option may not be drawn.
|
|
384
480
|
*/
|
|
385
481
|
reveal(): void;
|
|
386
482
|
/** Hides what the filter excludes, and writes the rest onto the options. */
|
|
@@ -455,8 +551,9 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
455
551
|
private askedAt;
|
|
456
552
|
/**
|
|
457
553
|
* Asks for more once the reader is within a screen of the end, React Aria's
|
|
458
|
-
* `onLoadMore
|
|
459
|
-
*
|
|
554
|
+
* `onLoadMore`, by core's `endInSight`, the rule Virtual List asks too: once
|
|
555
|
+
* for each number of options, so a scroll that goes on asks again only after
|
|
556
|
+
* the next page arrived, and never while loading.
|
|
460
557
|
*/
|
|
461
558
|
private readonly handleScroll;
|
|
462
559
|
/** Requests a new filter, and returns whether the request went through. */
|
|
@@ -519,6 +616,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
|
|
|
519
616
|
* different thing to say from a list that has none.
|
|
520
617
|
*/
|
|
521
618
|
private get noResults();
|
|
619
|
+
/** Whether `load-error` holds words, which a removed attribute does not. */
|
|
620
|
+
private get failed();
|
|
522
621
|
/** The error, or what a filter that hid everything says, before the shared words. */
|
|
523
622
|
protected renderLive(hasContent: boolean): TemplateResult;
|
|
524
623
|
protected render(): TemplateResult;
|