@fusion.dev/helix-headless 0.142.1 → 0.144.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 +25381 -1202
- package/dist/accordion/item/accordion-item.d.ts +38 -2
- package/dist/accordion/item/accordion-item.js +38 -6
- package/dist/accordion/root/accordion-root.d.ts +23 -1
- package/dist/accordion/root/accordion-root.js +39 -3
- package/dist/announcement/root/announcement-root.d.ts +11 -7
- package/dist/announcement/root/announcement-root.js +1 -1
- package/dist/app-header/root/app-header-root.d.ts +21 -0
- package/dist/app-header/root/app-header-root.js +31 -5
- package/dist/area-chart/root/area-chart-root.d.ts +12 -4
- package/dist/area-chart/root/area-chart-root.js +39 -11
- package/dist/avatar/group/avatar-group.d.ts +24 -3
- package/dist/avatar/group/avatar-group.js +34 -2
- package/dist/avatar/root/avatar-root.d.ts +17 -1
- package/dist/avatar/root/avatar-root.js +31 -10
- package/dist/badge/root/badge-root.d.ts +12 -0
- package/dist/badge/root/badge-root.js +1 -1
- package/dist/bar-chart/root/bar-chart-root.d.ts +30 -5
- package/dist/bar-chart/root/bar-chart-root.js +58 -21
- package/dist/blockquote/root/blockquote-root.d.ts +12 -7
- package/dist/blockquote/root/blockquote-root.js +6 -4
- package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +9 -3
- package/dist/breadcrumbs/root/breadcrumbs-root.js +9 -1
- package/dist/button/root/button-root.d.ts +84 -1
- package/dist/button/root/button-root.js +81 -3
- package/dist/callout/root/callout-root.d.ts +32 -6
- package/dist/callout/root/callout-root.js +26 -7
- package/dist/canvas/root/canvas-root.d.ts +1 -0
- package/dist/canvas/root/canvas-root.js +10 -1
- package/dist/card/root/card-root.d.ts +30 -1
- package/dist/card/root/card-root.js +38 -5
- package/dist/carousel/root/carousel-root.d.ts +47 -5
- package/dist/carousel/root/carousel-root.js +53 -21
- package/dist/chat/composer/chat-composer.d.ts +13 -11
- package/dist/chat/composer/chat-composer.js +6 -12
- package/dist/chat/message/chat-message.js +8 -1
- package/dist/chat/root/chat-root.d.ts +1 -0
- package/dist/chat/root/chat-root.js +2 -1
- package/dist/checkbox/root/checkbox-root.d.ts +7 -0
- package/dist/checkbox/root/checkbox-root.js +9 -3
- package/dist/checkbox-group/root/checkbox-group-root.d.ts +116 -33
- package/dist/checkbox-group/root/checkbox-group-root.js +141 -44
- package/dist/code/root/code-root.d.ts +1 -1
- package/dist/code-block/lines.d.ts +13 -0
- package/dist/code-block/lines.js +2 -0
- package/dist/code-block/root/code-block-root.d.ts +49 -0
- package/dist/code-block/root/code-block-root.js +44 -3
- package/dist/color-input/root/color-input-root.d.ts +60 -2
- package/dist/color-input/root/color-input-root.js +55 -7
- package/dist/color-picker/channels.d.ts +26 -0
- package/dist/color-picker/channels.js +84 -0
- package/dist/color-picker/root/color-picker-root.d.ts +118 -12
- package/dist/color-picker/root/color-picker-root.js +183 -13
- package/dist/combobox/root/combobox-root.d.ts +126 -3
- package/dist/combobox/root/combobox-root.js +224 -21
- package/dist/command/root/command-root.d.ts +47 -10
- package/dist/command/root/command-root.js +45 -4
- package/dist/copy-button/from.d.ts +22 -0
- package/dist/copy-button/from.js +28 -0
- package/dist/copy-button/root/copy-button-root.d.ts +48 -7
- package/dist/copy-button/root/copy-button-root.js +54 -8
- package/dist/data-table/root/data-table-root.d.ts +164 -10
- package/dist/data-table/root/data-table-root.js +488 -57
- package/dist/date-input/root/date-input-root.d.ts +123 -9
- package/dist/date-input/root/date-input-root.js +147 -45
- package/dist/date-picker/root/date-picker-root.d.ts +229 -18
- package/dist/date-picker/root/date-picker-root.js +342 -46
- package/dist/dialog/description.d.ts +9 -0
- package/dist/dialog/description.js +14 -0
- package/dist/dialog/root/dialog-root.d.ts +101 -10
- package/dist/dialog/root/dialog-root.js +83 -4
- package/dist/donut-chart/root/donut-chart-root.d.ts +61 -16
- package/dist/donut-chart/root/donut-chart-root.js +48 -13
- package/dist/drawer/root/drawer-root.d.ts +93 -7
- package/dist/drawer/root/drawer-root.js +126 -5
- package/dist/drawer/swipe-start.d.ts +9 -0
- package/dist/drawer/swipe-start.js +12 -0
- package/dist/drilldown/item/drilldown-item.d.ts +16 -13
- package/dist/drilldown/item/drilldown-item.js +6 -2
- package/dist/drilldown/root/drilldown-root.d.ts +21 -5
- package/dist/drilldown/root/drilldown-root.js +26 -10
- package/dist/element-events.generated.js +42 -13
- package/dist/empty/root/empty-root.d.ts +1 -1
- package/dist/file-input/root/file-input-root.d.ts +65 -1
- package/dist/file-input/root/file-input-root.js +76 -12
- package/dist/file-input/screen.d.ts +35 -0
- package/dist/file-input/screen.js +49 -0
- package/dist/filter-input/menu/filter-menu.d.ts +9 -0
- package/dist/filter-input/menu/filter-menu.js +8 -0
- package/dist/filter-input/root/filter-input-root.d.ts +43 -6
- package/dist/filter-input/root/filter-input-root.js +89 -10
- package/dist/filter-input/suggest.d.ts +17 -0
- package/dist/filter-input/suggest.js +23 -0
- package/dist/format-date/options.d.ts +33 -0
- package/dist/format-date/options.js +42 -0
- package/dist/format-date/root/format-date-root.d.ts +62 -3
- package/dist/format-date/root/format-date-root.js +78 -37
- package/dist/graph/root/graph-root.d.ts +24 -3
- package/dist/graph/root/graph-root.js +66 -12
- package/dist/heatmap/root/buckets.d.ts +2 -1
- package/dist/heatmap/root/buckets.js +5 -1
- package/dist/heatmap/root/heatmap-root.d.ts +47 -9
- package/dist/heatmap/root/heatmap-root.js +46 -18
- package/dist/icon/index.d.ts +2 -0
- package/dist/icon/index.js +2 -0
- package/dist/icon/registry.d.ts +37 -0
- package/dist/icon/registry.js +83 -0
- package/dist/icon/root/icon-root.d.ts +53 -6
- package/dist/icon/root/icon-root.js +72 -4
- package/dist/icon/root/index.d.ts +2 -0
- package/dist/icon/root/index.js +2 -0
- package/dist/icon/set.d.ts +1 -0
- package/dist/icon/set.js +3 -0
- package/dist/icon-button/root/icon-button-root.d.ts +1 -1
- package/dist/image/root/image-root.d.ts +23 -2
- package/dist/image/root/image-root.js +23 -4
- package/dist/input/root/input-root.d.ts +62 -9
- package/dist/input/root/input-root.js +61 -5
- package/dist/kbd/root/kbd-root.d.ts +26 -11
- package/dist/kbd/root/kbd-root.js +35 -38
- package/dist/kbd/shortcut.d.ts +18 -0
- package/dist/kbd/shortcut.js +35 -0
- package/dist/legend/hidden-series.d.ts +8 -0
- package/dist/legend/hidden-series.js +13 -0
- package/dist/legend/root/legend-root.d.ts +63 -0
- package/dist/legend/root/legend-root.js +61 -7
- package/dist/lightbox/item/lightbox-item.d.ts +17 -1
- package/dist/lightbox/item/lightbox-item.js +10 -1
- package/dist/lightbox/root/lightbox-root.d.ts +77 -6
- package/dist/lightbox/root/lightbox-root.js +116 -5
- package/dist/line-chart/root/line-chart-root.d.ts +29 -4
- package/dist/line-chart/root/line-chart-root.js +58 -17
- package/dist/list/item/list-item.d.ts +11 -5
- package/dist/list/item/list-item.js +5 -6
- package/dist/listbox/range.d.ts +17 -0
- package/dist/listbox/range.js +5 -0
- package/dist/listbox/root/listbox-root.d.ts +184 -4
- package/dist/listbox/root/listbox-root.js +229 -23
- package/dist/loader/busy.d.ts +17 -0
- package/dist/loader/busy.js +24 -0
- package/dist/loader/root/loader-root.d.ts +37 -0
- package/dist/loader/root/loader-root.js +52 -3
- package/dist/map/root/map-root.d.ts +19 -4
- package/dist/map/root/map-root.js +36 -7
- package/dist/megamenu/root/megamenu-root.d.ts +10 -1
- package/dist/megamenu/root/megamenu-root.js +10 -1
- package/dist/menu/item/menu-item.d.ts +41 -12
- package/dist/menu/item/menu-item.js +46 -3
- package/dist/menu/root/menu-root.d.ts +32 -2
- package/dist/menu/root/menu-root.js +48 -8
- package/dist/meter/root/meter-root.d.ts +13 -0
- package/dist/meter/root/meter-root.js +24 -5
- package/dist/navigation/root/navigation-root.d.ts +10 -2
- package/dist/navigation/root/navigation-root.js +13 -2
- package/dist/notifications/feed-keys.d.ts +10 -0
- package/dist/notifications/feed-keys.js +14 -0
- package/dist/notifications/group/notification-group.d.ts +1 -0
- package/dist/notifications/notification/notification.d.ts +29 -0
- package/dist/notifications/notification/notification.js +51 -3
- package/dist/notifications/root/notifications-root.d.ts +49 -0
- package/dist/notifications/root/notifications-root.js +76 -2
- package/dist/number-input/root/number-input-root.d.ts +109 -7
- package/dist/number-input/root/number-input-root.js +109 -21
- package/dist/object-inspector/root/object-inspector-root.d.ts +49 -5
- package/dist/object-inspector/root/object-inspector-root.js +92 -12
- package/dist/option/root/option-root.d.ts +58 -6
- package/dist/option/root/option-root.js +35 -5
- package/dist/outline/root/outline-root.d.ts +13 -2
- package/dist/outline/root/outline-root.js +4 -2
- package/dist/pagination/root/pagination-root.d.ts +19 -1
- package/dist/pagination/root/pagination-root.js +49 -9
- package/dist/pagination/size/pagination-size.d.ts +13 -3
- package/dist/pagination/size/pagination-size.js +7 -0
- package/dist/pin-input/format.d.ts +7 -0
- package/dist/pin-input/format.js +16 -0
- package/dist/pin-input/root/pin-input-root.d.ts +37 -0
- package/dist/pin-input/root/pin-input-root.js +48 -7
- package/dist/popover/root/popover-root.d.ts +78 -3
- package/dist/popover/root/popover-root.js +74 -5
- package/dist/progress/root/progress-root.d.ts +23 -1
- package/dist/progress/root/progress-root.js +40 -10
- package/dist/qr-code/export.d.ts +31 -0
- package/dist/qr-code/export.js +10 -0
- package/dist/qr-code/root/qr-code-root.d.ts +45 -0
- package/dist/qr-code/root/qr-code-root.js +78 -3
- package/dist/radio/group/radio-group.d.ts +64 -0
- package/dist/radio/group/radio-group.js +66 -12
- package/dist/radio/root/radio-root.d.ts +8 -5
- package/dist/radio/root/radio-root.js +1 -2
- package/dist/rating/root/rating-root.d.ts +49 -1
- package/dist/rating/root/rating-root.js +69 -10
- package/dist/scatter-chart/root/scatter-chart-root.d.ts +17 -3
- package/dist/scatter-chart/root/scatter-chart-root.js +40 -14
- package/dist/select/root/select-root.d.ts +93 -3
- package/dist/select/root/select-root.js +111 -13
- package/dist/skeleton/root/skeleton-root.d.ts +39 -3
- package/dist/skeleton/root/skeleton-root.js +33 -4
- package/dist/skip-link/root/skip-link-root.d.ts +10 -0
- package/dist/skip-link/root/skip-link-root.js +15 -1
- package/dist/slider/root/slider-root.d.ts +59 -2
- package/dist/slider/root/slider-root.js +82 -8
- package/dist/sparkline/root/sparkline-root.d.ts +9 -10
- package/dist/speed-dial/item/speed-dial-item.d.ts +11 -5
- package/dist/speed-dial/item/speed-dial-item.js +7 -2
- package/dist/speed-dial/root/speed-dial-root.d.ts +15 -4
- package/dist/speed-dial/root/speed-dial-root.js +19 -5
- package/dist/splitter/root/splitter-root.d.ts +28 -6
- package/dist/splitter/root/splitter-root.js +35 -1
- package/dist/stat/root/stat-root.d.ts +9 -1
- package/dist/stat/root/stat-root.js +15 -2
- package/dist/steps/root/steps-root.js +1 -1
- package/dist/steps/step/step.d.ts +1 -0
- package/dist/steps/step/step.js +1 -1
- package/dist/switch/root/switch-root.d.ts +14 -2
- package/dist/switch/root/switch-root.js +7 -1
- package/dist/table/cell/table-cell.d.ts +24 -4
- package/dist/table/cell/table-cell.js +21 -1
- package/dist/table/column/table-column.d.ts +32 -6
- package/dist/table/column/table-column.js +36 -6
- package/dist/table/root/table-root.d.ts +94 -3
- package/dist/table/root/table-root.js +128 -5
- package/dist/table/row/table-row.d.ts +7 -0
- package/dist/table/row/table-row.js +9 -1
- package/dist/tabs/root/tabs-root.d.ts +6 -1
- package/dist/tabs/root/tabs-root.js +6 -2
- package/dist/tag/group/tag-group.d.ts +107 -0
- package/dist/tag/group/tag-group.js +157 -0
- package/dist/tag/index.d.ts +1 -0
- package/dist/tag/index.js +1 -0
- package/dist/tag/root/tag-root.d.ts +83 -1
- package/dist/tag/root/tag-root.js +87 -17
- package/dist/tag/selection.d.ts +10 -0
- package/dist/tag/selection.js +12 -0
- package/dist/textarea/grow.d.ts +22 -0
- package/dist/textarea/grow.js +20 -0
- package/dist/textarea/root/textarea-root.d.ts +13 -0
- package/dist/textarea/root/textarea-root.js +10 -2
- package/dist/time-input/root/time-input-root.d.ts +71 -6
- package/dist/time-input/root/time-input-root.js +110 -44
- package/dist/time-picker/root/time-picker-root.d.ts +155 -26
- package/dist/time-picker/root/time-picker-root.js +192 -63
- package/dist/toast/hotkey.d.ts +22 -0
- package/dist/toast/hotkey.js +23 -0
- package/dist/toast/item/toast-item.d.ts +16 -1
- package/dist/toast/item/toast-item.js +41 -13
- package/dist/toast/root/toast-root.d.ts +105 -8
- package/dist/toast/root/toast-root.js +209 -4
- package/dist/toggle/group/toggle-group.d.ts +95 -16
- package/dist/toggle/group/toggle-group.js +99 -13
- package/dist/toggle/root/toggle-root.d.ts +26 -11
- package/dist/toggle/root/toggle-root.js +14 -6
- package/dist/toolbar/root/toolbar-root.d.ts +55 -15
- package/dist/toolbar/root/toolbar-root.js +99 -16
- package/dist/tooltip/focus-target.d.ts +6 -0
- package/dist/tooltip/focus-target.js +9 -0
- package/dist/tooltip/root/tooltip-root.d.ts +73 -15
- package/dist/tooltip/root/tooltip-root.js +96 -7
- package/dist/tour/naming.d.ts +30 -0
- package/dist/tour/naming.js +10 -0
- package/dist/tour/root/tour-root.d.ts +67 -3
- package/dist/tour/root/tour-root.js +105 -17
- package/dist/tour/stop/tour-stop.d.ts +65 -3
- package/dist/tour/stop/tour-stop.js +61 -11
- package/dist/tour/wait.d.ts +11 -0
- package/dist/tour/wait.js +19 -0
- package/dist/tree/item/tree-item.d.ts +21 -5
- package/dist/tree/item/tree-item.js +14 -4
- package/dist/tree/root/tree-root.d.ts +29 -5
- package/dist/tree/root/tree-root.js +64 -8
- package/dist/trend/root/trend-root.d.ts +36 -1
- package/dist/trend/root/trend-root.js +41 -15
- package/dist/video/root/keys.d.ts +5 -0
- package/dist/video/root/keys.js +13 -1
- package/dist/video/root/video-root.d.ts +19 -0
- package/dist/video/root/video-root.js +48 -4
- package/dist/video-playlist/menu/video-playlist-menu.d.ts +20 -2
- package/dist/video-playlist/menu/video-playlist-menu.js +27 -5
- package/dist/video-playlist/root/video-playlist-root.js +6 -3
- package/dist/virtual-list/root/virtual-list-root.d.ts +52 -4
- package/dist/virtual-list/root/virtual-list-root.js +103 -21
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +9140 -1149
- package/types/svelte.d.ts +1 -0
- package/types/vue.d.ts +2089 -267
|
@@ -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 { customElement, fillTemplate, HelixElement, HelixSelectEvent, hostAria, inlineStep, isRtl, requestChange, } from '@fusion.dev/helix-core';
|
|
7
|
+
import { customElement, fillTemplate, HelixActivateEvent, HelixElement, HelixSelectEvent, hostAria, inlineStep, isRtl, requestChange, } from '@fusion.dev/helix-core';
|
|
8
8
|
import { caretLeft, caretRight, play, stop } from '@fusion.dev/helix-icons';
|
|
9
9
|
import { html, nothing } from 'lit';
|
|
10
10
|
import { property, state } from 'lit/decorators.js';
|
|
@@ -28,6 +28,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
28
28
|
this.interval = 5000;
|
|
29
29
|
this.indexState = undefined;
|
|
30
30
|
this.scrolledFor = 0;
|
|
31
|
+
this.said = '';
|
|
31
32
|
this.label = 'Carousel';
|
|
32
33
|
this.loop = false;
|
|
33
34
|
this.nextLabel = 'Next slide';
|
|
@@ -43,17 +44,29 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
43
44
|
return;
|
|
44
45
|
}
|
|
45
46
|
this.fitted = fitted;
|
|
46
|
-
|
|
47
|
-
this.goTo(this.positions - 1);
|
|
48
|
-
}
|
|
47
|
+
this.holdIndex();
|
|
49
48
|
};
|
|
50
49
|
this.handleIndicatorKeydown = (event) => {
|
|
51
|
-
const
|
|
52
|
-
|
|
50
|
+
const vertical = this.orientation === 'vertical';
|
|
51
|
+
const step = vertical
|
|
52
|
+
? event.key === 'ArrowDown'
|
|
53
|
+
? 1
|
|
54
|
+
: event.key === 'ArrowUp'
|
|
55
|
+
? -1
|
|
56
|
+
: 0
|
|
57
|
+
: inlineStep(this, event.key);
|
|
58
|
+
let to = this.index + step;
|
|
59
|
+
if (event.key === 'Home') {
|
|
60
|
+
to = 0;
|
|
61
|
+
}
|
|
62
|
+
else if (event.key === 'End') {
|
|
63
|
+
to = this.positions - 1;
|
|
64
|
+
}
|
|
65
|
+
else if (step === 0) {
|
|
53
66
|
return;
|
|
54
67
|
}
|
|
55
68
|
event.preventDefault();
|
|
56
|
-
this.goTo(
|
|
69
|
+
this.goTo(to);
|
|
57
70
|
this.updateComplete.then(() => {
|
|
58
71
|
this.renderRoot.querySelector('[part~="indicator-current"]')?.focus();
|
|
59
72
|
});
|
|
@@ -88,11 +101,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
88
101
|
return;
|
|
89
102
|
}
|
|
90
103
|
const applied = requestChange({
|
|
91
|
-
apply: (value) =>
|
|
92
|
-
const previous = this.index;
|
|
93
|
-
this.indexState = value;
|
|
94
|
-
this.requestUpdate('index', previous);
|
|
95
|
-
},
|
|
104
|
+
apply: (value) => this.applyIndex(value),
|
|
96
105
|
event: (value) => new HelixSelectEvent({ value: String(value) }),
|
|
97
106
|
host: this,
|
|
98
107
|
next: nearest,
|
|
@@ -149,6 +158,14 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
149
158
|
}
|
|
150
159
|
return Math.max(1, Math.round((room + gap) / (pane + gap)));
|
|
151
160
|
}
|
|
161
|
+
holdIndex() {
|
|
162
|
+
const last = this.positions - 1;
|
|
163
|
+
if (this.slides.length > 0 && this.index > last) {
|
|
164
|
+
const previous = this.index;
|
|
165
|
+
this.indexState = Math.max(0, last);
|
|
166
|
+
this.requestUpdate('index', previous);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
152
169
|
handed() {
|
|
153
170
|
return this.fits ? nothing : `--carousel-per-view: ${this.clamped}`;
|
|
154
171
|
}
|
|
@@ -178,6 +195,12 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
178
195
|
get slides() {
|
|
179
196
|
return this.knownChildren.filter((child) => child instanceof HTMLElement);
|
|
180
197
|
}
|
|
198
|
+
applyIndex(value) {
|
|
199
|
+
const previous = this.index;
|
|
200
|
+
this.indexState = value;
|
|
201
|
+
this.requestUpdate('index', previous);
|
|
202
|
+
this.dispatchEvent(new HelixActivateEvent({ value: String(value) }));
|
|
203
|
+
}
|
|
181
204
|
goTo(index) {
|
|
182
205
|
if (this.slides.length === 0) {
|
|
183
206
|
return;
|
|
@@ -188,11 +211,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
188
211
|
return;
|
|
189
212
|
}
|
|
190
213
|
requestChange({
|
|
191
|
-
apply: (value) =>
|
|
192
|
-
const previous = this.index;
|
|
193
|
-
this.indexState = value;
|
|
194
|
-
this.requestUpdate('index', previous);
|
|
195
|
-
},
|
|
214
|
+
apply: (value) => this.applyIndex(value),
|
|
196
215
|
event: (value) => new HelixSelectEvent({ value: String(value) }),
|
|
197
216
|
host: this,
|
|
198
217
|
next,
|
|
@@ -246,7 +265,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
246
265
|
if (!this.rotating || this.slides.length < 2) {
|
|
247
266
|
return;
|
|
248
267
|
}
|
|
249
|
-
this.timer = setInterval(() => this.goTo(this.index + 1), this.interval);
|
|
268
|
+
this.timer = setInterval(() => this.goTo(this.index >= this.positions - 1 ? 0 : this.index + 1), this.interval);
|
|
250
269
|
}
|
|
251
270
|
nearest() {
|
|
252
271
|
const track = this.partNamed('track');
|
|
@@ -294,6 +313,12 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
294
313
|
}
|
|
295
314
|
if (changed.has('index')) {
|
|
296
315
|
this.showing = undefined;
|
|
316
|
+
if (this.hasUpdated) {
|
|
317
|
+
this.said = fillTemplate(this.slideLabel, {
|
|
318
|
+
count: this.slides.length,
|
|
319
|
+
index: this.index + 1,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
297
322
|
}
|
|
298
323
|
if (changed.has('perView')) {
|
|
299
324
|
this.fitted = undefined;
|
|
@@ -314,9 +339,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
314
339
|
}
|
|
315
340
|
this.scrolledFor = drawn;
|
|
316
341
|
this.runTimer();
|
|
317
|
-
|
|
318
|
-
this.goTo(this.positions - 1);
|
|
319
|
-
}
|
|
342
|
+
this.holdIndex();
|
|
320
343
|
this.watchPane();
|
|
321
344
|
this.assign();
|
|
322
345
|
}
|
|
@@ -343,6 +366,12 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
343
366
|
' - var(--carousel-gap) - 100%';
|
|
344
367
|
return `--carousel-run-end: calc(round(${run}, 1px) - (${run}))`;
|
|
345
368
|
}
|
|
369
|
+
atEnd(side) {
|
|
370
|
+
if (this.loop || this.slides.length < 2) {
|
|
371
|
+
return false;
|
|
372
|
+
}
|
|
373
|
+
return side === 'start' ? this.index <= 0 : this.index >= this.positions - 1;
|
|
374
|
+
}
|
|
346
375
|
render() {
|
|
347
376
|
const rotating = this.rotating;
|
|
348
377
|
const last = this.slides.length - 1;
|
|
@@ -369,6 +398,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
369
398
|
part="previous"
|
|
370
399
|
type="button"
|
|
371
400
|
aria-label=${this.previousLabel}
|
|
401
|
+
aria-disabled=${this.atEnd('start') ? 'true' : nothing}
|
|
372
402
|
@click=${() => this.goTo(this.index - 1)}
|
|
373
403
|
>
|
|
374
404
|
<svg part="previous-mark" data-mirror fill="currentColor" viewBox=${caretLeft.viewBox} aria-hidden="true">
|
|
@@ -379,6 +409,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
379
409
|
part="next"
|
|
380
410
|
type="button"
|
|
381
411
|
aria-label=${this.nextLabel}
|
|
412
|
+
aria-disabled=${this.atEnd('end') ? 'true' : nothing}
|
|
382
413
|
@click=${() => this.goTo(this.index + 1)}
|
|
383
414
|
>
|
|
384
415
|
<svg part="next-mark" data-mirror fill="currentColor" viewBox=${caretRight.viewBox} aria-hidden="true">
|
|
@@ -409,6 +440,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
409
440
|
></slot>
|
|
410
441
|
</div>`)}
|
|
411
442
|
</div>
|
|
443
|
+
${''}<span part="live" aria-live=${rotating ? 'off' : 'polite'}>${this.said}</span>
|
|
412
444
|
${this.slides.length > 1 && this.across !== undefined
|
|
413
445
|
? html `<div part="indicators" role="group" aria-label=${fillTemplate(this.indicatorsLabel, { label: this.label })}>
|
|
414
446
|
${''}
|
|
@@ -25,6 +25,7 @@ import { type PropertyValues, type TemplateResult } from 'lit';
|
|
|
25
25
|
* @slot start - Content under the field at the leading edge, such as an attachment button or a model picker.
|
|
26
26
|
*
|
|
27
27
|
* @event {HelixSendEvent} helix-send - Fired when the user sends their turn, and cancelable.
|
|
28
|
+
* @event {Event} input - 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.
|
|
28
29
|
*
|
|
29
30
|
* @csspart composer - The whole composer.
|
|
30
31
|
* @csspart end - The box around the `end` slot.
|
|
@@ -69,16 +70,14 @@ export declare class HelixHeadlessChatComposer extends HelixElement {
|
|
|
69
70
|
/**
|
|
70
71
|
* The text the user has written.
|
|
71
72
|
*
|
|
72
|
-
*
|
|
73
|
+
* It follows typing, so reading it gives the draft. Set it to seed a draft or
|
|
74
|
+
* to replace the one in the field, and set it to `''` to clear it.
|
|
73
75
|
*/
|
|
74
76
|
value: string;
|
|
75
|
-
private draft;
|
|
76
77
|
/**
|
|
77
78
|
* @internal Read by the transcript to find the composer among its children.
|
|
78
79
|
*/
|
|
79
80
|
readonly isChatComposer = true;
|
|
80
|
-
/** What is in the field, whoever last wrote it. */
|
|
81
|
-
private get text();
|
|
82
81
|
/**
|
|
83
82
|
* Sends what is written, and returns whether the send went through.
|
|
84
83
|
*
|
|
@@ -129,14 +128,17 @@ export declare class HelixHeadlessChatComposer extends HelixElement {
|
|
|
129
128
|
*/
|
|
130
129
|
protected render(): TemplateResult;
|
|
131
130
|
/**
|
|
132
|
-
*
|
|
131
|
+
* Takes what was typed into `value`, and says so from this element.
|
|
133
132
|
*
|
|
134
|
-
* **The
|
|
135
|
-
* the `<textarea>` in this shadow
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
133
|
+
* **The textarea's own `input` is stopped and this element sends one.**
|
|
134
|
+
* `input` is composed by specification, so the `<textarea>` in this shadow
|
|
135
|
+
* root sent its own past this host with a target a consumer cannot reach.
|
|
136
|
+
* The one sent here comes from the composer, whose `value` already holds
|
|
137
|
+
* the text, which is what a typing indicator or a saved draft reads.
|
|
138
|
+
*
|
|
139
|
+
* **The text is `value` and nothing beside it.** A private draft read before
|
|
140
|
+
* `value` sent a seed the reader had deleted, since an empty draft fell back
|
|
141
|
+
* to it, and left `value` reading empty while the field held a whole draft.
|
|
140
142
|
*/
|
|
141
143
|
private readonly handleInput;
|
|
142
144
|
private readonly handleSend;
|
|
@@ -7,7 +7,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { customElement, HelixElement, HelixSendEvent, hostAria, markRegion, } from '@fusion.dev/helix-core';
|
|
8
8
|
import { arrowElbowDownLeft } from '@fusion.dev/helix-icons';
|
|
9
9
|
import { html } from 'lit';
|
|
10
|
-
import { property
|
|
10
|
+
import { property } from 'lit/decorators.js';
|
|
11
|
+
import { live } from 'lit/directives/live.js';
|
|
11
12
|
import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
|
|
12
13
|
let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixElement {
|
|
13
14
|
constructor() {
|
|
@@ -19,11 +20,11 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
|
|
|
19
20
|
this.sendLabel = 'Send';
|
|
20
21
|
this.submitOn = 'enter';
|
|
21
22
|
this.value = '';
|
|
22
|
-
this.draft = '';
|
|
23
23
|
this.isChatComposer = true;
|
|
24
24
|
this.handleInput = (event) => {
|
|
25
25
|
event.stopPropagation();
|
|
26
|
-
this.
|
|
26
|
+
this.value = event.target.value;
|
|
27
|
+
this.dispatchEvent(new Event('input'));
|
|
27
28
|
};
|
|
28
29
|
this.handleSend = () => {
|
|
29
30
|
this.send();
|
|
@@ -39,18 +40,14 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
|
|
|
39
40
|
this.send();
|
|
40
41
|
};
|
|
41
42
|
}
|
|
42
|
-
get text() {
|
|
43
|
-
return this.draft || this.value;
|
|
44
|
-
}
|
|
45
43
|
send() {
|
|
46
|
-
const value = this.
|
|
44
|
+
const value = this.value.trim();
|
|
47
45
|
if (value === '' || this.disabled) {
|
|
48
46
|
return false;
|
|
49
47
|
}
|
|
50
48
|
if (!this.dispatchEvent(new HelixSendEvent({ value }))) {
|
|
51
49
|
return false;
|
|
52
50
|
}
|
|
53
|
-
this.draft = '';
|
|
54
51
|
this.value = '';
|
|
55
52
|
return true;
|
|
56
53
|
}
|
|
@@ -89,7 +86,7 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
|
|
|
89
86
|
return html `<div part="composer">
|
|
90
87
|
<textarea
|
|
91
88
|
part="field"
|
|
92
|
-
.value=${this.
|
|
89
|
+
.value=${live(this.value)}
|
|
93
90
|
aria-label=${this.label}
|
|
94
91
|
placeholder=${this.placeholder}
|
|
95
92
|
rows=${this.rows}
|
|
@@ -126,9 +123,6 @@ __decorate([
|
|
|
126
123
|
__decorate([
|
|
127
124
|
property()
|
|
128
125
|
], HelixHeadlessChatComposer.prototype, "value", void 0);
|
|
129
|
-
__decorate([
|
|
130
|
-
state()
|
|
131
|
-
], HelixHeadlessChatComposer.prototype, "draft", void 0);
|
|
132
126
|
HelixHeadlessChatComposer = __decorate([
|
|
133
127
|
customElement('helix-headless-chat-composer')
|
|
134
128
|
], HelixHeadlessChatComposer);
|
|
@@ -28,7 +28,14 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
|
|
|
28
28
|
apply: (next) => {
|
|
29
29
|
this.state = next;
|
|
30
30
|
},
|
|
31
|
-
event: () => new HelixSendEvent({
|
|
31
|
+
event: () => new HelixSendEvent({
|
|
32
|
+
value: [...this.childNodes]
|
|
33
|
+
.filter((node) => !(node.nodeType === 1 && node.hasAttribute('slot')))
|
|
34
|
+
.map((node) => node.textContent ?? '')
|
|
35
|
+
.join('')
|
|
36
|
+
.replace(/\s+/g, ' ')
|
|
37
|
+
.trim(),
|
|
38
|
+
}),
|
|
32
39
|
host: this,
|
|
33
40
|
next: 'sending',
|
|
34
41
|
});
|
|
@@ -65,6 +65,7 @@ declare const HelixHeadlessChat_base: (new (...args: any[]) => import("@fusion.d
|
|
|
65
65
|
*
|
|
66
66
|
* @event {HelixBeforePinEvent} helix-before-pin - Fired when the user pins or unpins the transcript by scrolling. Cancelable.
|
|
67
67
|
* @event {HelixHistoryEvent} helix-history - Fired when the user reaches the oldest turn while `history` is `more`. It reports the position and cannot be canceled.
|
|
68
|
+
* @event {HelixPinEvent} helix-pin - Fired after the transcript is pinned or unpinned, with `true` or `false` in `detail.value`.
|
|
68
69
|
* @event {HelixSendEvent} helix-send - Fired when the user sends a turn from the composer or retries a failed one. It is fired inside and handled here, so you can listen for it on the conversation. Cancelable: canceling it sends nothing and leaves the decision to you.
|
|
69
70
|
*
|
|
70
71
|
* @csspart actions - The controls for the conversation, at the header's trailing edge.
|
|
@@ -5,7 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
var HelixHeadlessChat_1;
|
|
8
|
-
import { customElement, HelixBeforePinEvent, HelixElement, HelixHistoryEvent, hostAria, MixinCollection, onUnlessFalse, requestChange, VirtualizeController, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { customElement, HelixBeforePinEvent, HelixElement, HelixHistoryEvent, HelixPinEvent, hostAria, MixinCollection, onUnlessFalse, requestChange, VirtualizeController, } from '@fusion.dev/helix-core';
|
|
9
9
|
import { nothing } from 'lit';
|
|
10
10
|
import { property, state } from 'lit/decorators.js';
|
|
11
11
|
import { keyed } from 'lit/directives/keyed.js';
|
|
@@ -181,6 +181,7 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
|
|
|
181
181
|
const previous = this.pinned;
|
|
182
182
|
this.pinnedState = value;
|
|
183
183
|
this.requestUpdate('pinned', previous);
|
|
184
|
+
this.dispatchEvent(new HelixPinEvent({ value: String(value) }));
|
|
184
185
|
},
|
|
185
186
|
event: (value) => new HelixBeforePinEvent({ value: String(value) }),
|
|
186
187
|
host: this,
|
|
@@ -28,6 +28,8 @@ declare const HelixHeadlessCheckbox_base: (new (...args: any[]) => import("@fusi
|
|
|
28
28
|
* @documentation https://fusion.dev/helix/components/checkbox
|
|
29
29
|
*
|
|
30
30
|
* @slot - The label.
|
|
31
|
+
* @slot feedback - The message that says what is wrong, for content richer than a string. It shows while there is a message.
|
|
32
|
+
* @slot hint - Help under the control, for content richer than the `hint` text.
|
|
31
33
|
*
|
|
32
34
|
* @event {Event} change - The box was checked or unchecked. Relayed from the native input.
|
|
33
35
|
* @event {HelixBeforeToggleEvent} helix-before-toggle - The box is about to be checked or unchecked. Cancelable: cancel it to keep its state.
|
|
@@ -46,6 +48,7 @@ declare const HelixHeadlessCheckbox_base: (new (...args: any[]) => import("@fusi
|
|
|
46
48
|
*
|
|
47
49
|
* @cssstate checked - While the box is checked.
|
|
48
50
|
* @cssstate has-label - The label slot has content, so the label is drawn.
|
|
51
|
+
* @cssstate indeterminate - While the box shows the dash, neither checked nor unchecked.
|
|
49
52
|
* @cssstate invalid - The control has an error to show, from the browser's validation or from your `feedback`.
|
|
50
53
|
*/
|
|
51
54
|
export declare class HelixHeadlessCheckbox extends HelixHeadlessCheckbox_base {
|
|
@@ -56,6 +59,10 @@ export declare class HelixHeadlessCheckbox extends HelixHeadlessCheckbox_base {
|
|
|
56
59
|
* Shows the box as neither checked nor unchecked.
|
|
57
60
|
*
|
|
58
61
|
* Presentation only. It never submits, and the first change resolves it.
|
|
62
|
+
*
|
|
63
|
+
* Not reflected, as no state is: the element resolves it itself, and a
|
|
64
|
+
* reflected one removed the attribute the consumer wrote. A stylesheet
|
|
65
|
+
* reads it as `:state(indeterminate)`.
|
|
59
66
|
*/
|
|
60
67
|
indeterminate: boolean;
|
|
61
68
|
/**
|
|
@@ -20,11 +20,14 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
|
|
|
20
20
|
this.handleChange = (event) => {
|
|
21
21
|
const input = event.target;
|
|
22
22
|
const next = input.checked;
|
|
23
|
-
|
|
23
|
+
const taken = this.requestChecked(next);
|
|
24
|
+
if (taken) {
|
|
24
25
|
this.indeterminate = false;
|
|
25
26
|
}
|
|
26
27
|
input.checked = this.checked;
|
|
27
|
-
|
|
28
|
+
if (taken) {
|
|
29
|
+
this.relayNativeEvent(event);
|
|
30
|
+
}
|
|
28
31
|
};
|
|
29
32
|
this.handleLabelChange = () => {
|
|
30
33
|
this.syncLabelPresence();
|
|
@@ -46,6 +49,7 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
|
|
|
46
49
|
willUpdate(changed) {
|
|
47
50
|
super.willUpdate(changed);
|
|
48
51
|
this.internals.ariaRequired = this.required ? 'true' : null;
|
|
52
|
+
this.toggleState('indeterminate', this.indeterminate);
|
|
49
53
|
if (this.indeterminate) {
|
|
50
54
|
this.dashed = true;
|
|
51
55
|
}
|
|
@@ -82,7 +86,9 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
|
|
|
82
86
|
?required=${this.required}
|
|
83
87
|
aria-describedby=${this.describedBy ?? nothing}
|
|
84
88
|
aria-invalid=${this.invalidity ?? nothing}
|
|
89
|
+
aria-readonly=${this.readOnly ? 'true' : nothing}
|
|
85
90
|
@change=${this.handleChange}
|
|
91
|
+
@click=${this.holdReadOnly}
|
|
86
92
|
@input=${this.stopInner}
|
|
87
93
|
/>
|
|
88
94
|
<span
|
|
@@ -98,7 +104,7 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
|
|
|
98
104
|
}
|
|
99
105
|
};
|
|
100
106
|
__decorate([
|
|
101
|
-
property({
|
|
107
|
+
property({ type: Boolean })
|
|
102
108
|
], HelixHeadlessCheckbox.prototype, "indeterminate", void 0);
|
|
103
109
|
__decorate([
|
|
104
110
|
property()
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
|
|
2
|
-
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
+
import { nothing, type PropertyValues, type TemplateResult } from 'lit';
|
|
3
3
|
import { HelixHeadlessCheckbox } from '../../checkbox/root/checkbox-root.js';
|
|
4
|
+
import '../../checkbox/index.js';
|
|
4
5
|
declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinFieldInterface) & typeof HelixFormElement;
|
|
5
6
|
/**
|
|
6
7
|
* @summary A group of related checkboxes under one label, with one value for the set.
|
|
@@ -16,8 +17,18 @@ declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("
|
|
|
16
17
|
* `name` that you write once, and one place to read and write the whole set.
|
|
17
18
|
*
|
|
18
19
|
* `value` is the checked values, separated by commas, in the order the
|
|
19
|
-
* checkboxes are written
|
|
20
|
-
* the rest.
|
|
20
|
+
* checkboxes are written, read from the boxes themselves. Setting it checks
|
|
21
|
+
* exactly those values and unchecks the rest.
|
|
22
|
+
*
|
|
23
|
+
* `select-all` draws a box above the set that checks every enabled box, or
|
|
24
|
+
* unchecks them all once every one is checked. It shows a dash while only some
|
|
25
|
+
* are checked, and changes the set through the same cancelable
|
|
26
|
+
* `helix-before-change` a box does.
|
|
27
|
+
*
|
|
28
|
+
* A checkbox is a member wherever it sits inside the group, in a row or a grid
|
|
29
|
+
* cell of your own, unless another group inside this one holds it. A field of
|
|
30
|
+
* another kind inside the group, such as an "Other" text field, sends its own
|
|
31
|
+
* `input` and `change` past the group.
|
|
21
32
|
*
|
|
22
33
|
* **The group shows the message you set in `feedback`.** It is form-associated
|
|
23
34
|
* only for validity and never calls `setFormValue`, so the browser does not
|
|
@@ -29,7 +40,8 @@ declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("
|
|
|
29
40
|
* @aliases Checkbox list, Multi-select
|
|
30
41
|
* @documentation https://fusion.dev/helix/components/checkbox-group
|
|
31
42
|
*
|
|
32
|
-
* @slot - The checkboxes.
|
|
43
|
+
* @slot - The checkboxes, and anything laid out around them.
|
|
44
|
+
* @slot feedback - The message that says what is wrong, for content richer than a string. It shows while there is a message.
|
|
33
45
|
* @slot hint - Help under the checkboxes, for help that needs more than plain text.
|
|
34
46
|
* @slot label - The group's label, for a label that needs more than plain text.
|
|
35
47
|
*
|
|
@@ -41,43 +53,97 @@ declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("
|
|
|
41
53
|
* @csspart hint - The help under the checkboxes.
|
|
42
54
|
* @csspart items - The element that holds the checkboxes, laid out by `orientation`.
|
|
43
55
|
* @csspart label - The group's label, above the checkboxes.
|
|
56
|
+
* @csspart select-all - The box that checks or unchecks every box, under `select-all`.
|
|
57
|
+
* @csspart select-all-box - The select-all box's box, under the mark.
|
|
58
|
+
* @csspart select-all-control - The select-all box's native input.
|
|
59
|
+
* @csspart select-all-feedback - The select-all box's own message, which it never shows.
|
|
60
|
+
* @csspart select-all-field - The row that holds the select-all box and its label.
|
|
61
|
+
* @csspart select-all-hint - The select-all box's own help, which it never shows.
|
|
62
|
+
* @csspart select-all-label - The words beside the select-all box.
|
|
63
|
+
* @csspart select-all-mark - The select-all box's check mark, or its dash while only some boxes are checked.
|
|
64
|
+
* @csspart select-all-mark-checked - Added to `select-all-mark` while every box is checked.
|
|
65
|
+
* @csspart select-all-mark-dash - Added to `select-all-mark` while only some boxes are checked, and kept until every one is.
|
|
66
|
+
* @csspart select-all-mark-indeterminate - Added to `select-all-mark` while only some boxes are checked.
|
|
44
67
|
*
|
|
45
68
|
* @cssstate invalid - The control has an error to show, from the browser's validation or from your `feedback`.
|
|
46
69
|
*/
|
|
47
70
|
export declare class HelixHeadlessCheckboxGroup extends HelixHeadlessCheckboxGroup_base {
|
|
71
|
+
/**
|
|
72
|
+
* Whether a box above the set checks or unchecks every enabled box.
|
|
73
|
+
*/
|
|
74
|
+
selectAll: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* The words beside the box `select-all` draws.
|
|
77
|
+
*/
|
|
78
|
+
selectAllLabel: string;
|
|
48
79
|
/**
|
|
49
80
|
* The checked values, comma separated.
|
|
81
|
+
*
|
|
82
|
+
* Read from the boxes once they are known, so a box a script ticks directly
|
|
83
|
+
* is in it at once. Written, it is pushed onto the boxes. A box whose value
|
|
84
|
+
* holds a comma cannot be named here: use `values`.
|
|
85
|
+
*/
|
|
86
|
+
get value(): string;
|
|
87
|
+
set value(next: string);
|
|
88
|
+
/**
|
|
89
|
+
* The checked values, as a list, in the order the boxes are written.
|
|
90
|
+
*
|
|
91
|
+
* The same set as `value`, and the one to use where a value may hold a
|
|
92
|
+
* comma. Written, it checks exactly those boxes and unchecks the rest.
|
|
93
|
+
*/
|
|
94
|
+
get values(): string[];
|
|
95
|
+
set values(next: string[]);
|
|
96
|
+
/** The values last written, which the boxes are given at the next update. */
|
|
97
|
+
private declared;
|
|
98
|
+
/**
|
|
99
|
+
* Whether `declared` has yet to reach the boxes.
|
|
100
|
+
*
|
|
101
|
+
* **Pushed once and then left alone**, which is the fix for a box a script
|
|
102
|
+
* ticked being unticked by the next unrelated update: every update used to
|
|
103
|
+
* push the group's value onto every box, whatever the boxes said since.
|
|
104
|
+
*/
|
|
105
|
+
private pending;
|
|
106
|
+
/** Watches for boxes arriving inside a wrapper, which no slot reports. */
|
|
107
|
+
private observer;
|
|
108
|
+
/** The value the required check last judged. */
|
|
109
|
+
private judged;
|
|
110
|
+
/** The boxes `member` is added to. */
|
|
111
|
+
private readonly watched;
|
|
112
|
+
/**
|
|
113
|
+
* Asks for an update when a box's own update moved the set.
|
|
114
|
+
*
|
|
115
|
+
* **A controller on each box, because a box changed by a script says
|
|
116
|
+
* nothing.** `box.checked = false` sends no event, as on a native checkbox,
|
|
117
|
+
* so the group heard of it only at its next unrelated update: a required
|
|
118
|
+
* group whose last box a script unchecked still passed `checkValidity()` and
|
|
119
|
+
* let its form submit. A box's update is the one thing every change to its
|
|
120
|
+
* state goes through, whatever made it.
|
|
50
121
|
*/
|
|
51
|
-
|
|
122
|
+
private readonly member;
|
|
52
123
|
protected readonly cascade: DisabledCascadeController;
|
|
53
|
-
/**
|
|
124
|
+
/**
|
|
125
|
+
* The checkboxes in the group, in the order they are written. Browser only.
|
|
126
|
+
*
|
|
127
|
+
* Descendants rather than children, so a box inside a layout wrapper of the
|
|
128
|
+
* consumer's is a member: only direct children counted, and a box in a row
|
|
129
|
+
* with a description got no name and no place in the set. A box held by a
|
|
130
|
+
* group nested inside this one is that group's.
|
|
131
|
+
*/
|
|
54
132
|
get boxes(): HelixHeadlessCheckbox[];
|
|
133
|
+
/** Whether this is the nearest group around `box`. */
|
|
134
|
+
private holds;
|
|
55
135
|
/**
|
|
56
|
-
* Pushes the group's name and value
|
|
136
|
+
* Pushes the group's name onto the boxes, and its value where one is waiting.
|
|
57
137
|
*
|
|
58
138
|
* As properties rather than attributes. A `name` written onto a box is a
|
|
59
139
|
* change to markup the consumer rendered, which a React consumer's hydration
|
|
60
140
|
* reports and does not patch up. A box that names itself keeps its own.
|
|
141
|
+
*
|
|
142
|
+
* **Nothing is pushed for a value nobody wrote**, so a group written with no
|
|
143
|
+
* `value` keeps what its boxes declare, and `group.value = ''` still clears
|
|
144
|
+
* every box, being a value somebody wrote.
|
|
61
145
|
*/
|
|
62
146
|
private sync;
|
|
63
|
-
/** Whether `seed` has had its one chance. */
|
|
64
|
-
private seeded;
|
|
65
|
-
/**
|
|
66
|
-
* Reads the boxes' own state into `value`, once, before anything is pushed.
|
|
67
|
-
*
|
|
68
|
-
* Seeding, and never a guard in `sync` refusing to write while `value` is
|
|
69
|
-
* empty. The guard would answer the same case, a group written with no `value`
|
|
70
|
-
* whose boxes declare their own `checked` being cleared on the first update,
|
|
71
|
-
* and it also makes `group.value = ''` do nothing at all: the obvious way to
|
|
72
|
-
* clear a group would silently not, and the last box could not be unticked
|
|
73
|
-
* through the group either.
|
|
74
|
-
*
|
|
75
|
-
* The markup decides the starting set, and from then on `value` is what the
|
|
76
|
-
* boxes follow, including when it is empty. The group's `value` is a derived
|
|
77
|
-
* read of the boxes rather than state it owns, so reading it out of them at
|
|
78
|
-
* the start is what it already means.
|
|
79
|
-
*/
|
|
80
|
-
private seed;
|
|
81
147
|
/**
|
|
82
148
|
* Reads a box's requested change into `value`, and says so once.
|
|
83
149
|
*
|
|
@@ -114,16 +180,17 @@ export declare class HelixHeadlessCheckboxGroup extends HelixHeadlessCheckboxGro
|
|
|
114
180
|
private readonly handleMemberNative;
|
|
115
181
|
connectedCallback(): void;
|
|
116
182
|
disconnectedCallback(): void;
|
|
183
|
+
/** Stops listening to a box that left the group. */
|
|
184
|
+
private unwatch;
|
|
117
185
|
protected willUpdate(changed: PropertyValues): void;
|
|
118
|
-
protected firstUpdated(changed: PropertyValues): void;
|
|
119
186
|
/**
|
|
120
187
|
* Goes back to the set the markup started with.
|
|
121
188
|
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* the
|
|
126
|
-
*
|
|
189
|
+
* The form resets each box too, in the same task and after this, so a group
|
|
190
|
+
* whose markup wrote no `value` has nothing to do: its boxes return to what
|
|
191
|
+
* they declared, and its value is read from them. A `value` the markup wrote
|
|
192
|
+
* is pushed again at the next update, after the boxes have reset, and an
|
|
193
|
+
* update is asked for, since an unchanged value schedules none.
|
|
127
194
|
*/
|
|
128
195
|
formResetCallback(): void;
|
|
129
196
|
/**
|
|
@@ -141,11 +208,27 @@ export declare class HelixHeadlessCheckboxGroup extends HelixHeadlessCheckboxGro
|
|
|
141
208
|
* `invalid`, which is what marks the field touched and puts the message on
|
|
142
209
|
* screen.
|
|
143
210
|
*
|
|
144
|
-
* Anchored on the list,
|
|
145
|
-
*
|
|
211
|
+
* Anchored on the list, which takes no focus, so the base points the bubble
|
|
212
|
+
* at the first box instead.
|
|
146
213
|
*/
|
|
147
214
|
private validate;
|
|
148
215
|
protected updated(changed: PropertyValues): void;
|
|
216
|
+
/**
|
|
217
|
+
* Checks every enabled box, or unchecks them all once every one is checked.
|
|
218
|
+
*
|
|
219
|
+
* The box's own request is refused, since the box shows what the set holds
|
|
220
|
+
* and the set is moved here, through one cancelable `helix-before-change`
|
|
221
|
+
* for the whole set, as a box moves it.
|
|
222
|
+
*/
|
|
223
|
+
private readonly handleSelectAll;
|
|
224
|
+
/**
|
|
225
|
+
* The box above the set that checks or unchecks every box, under
|
|
226
|
+
* `select-all`, behind a seam a tier can move.
|
|
227
|
+
*
|
|
228
|
+
* Checked while every box is, and showing a dash while only some are. It is
|
|
229
|
+
* in this shadow root, so it is no member of the set and submits nothing.
|
|
230
|
+
*/
|
|
231
|
+
protected renderSelectAll(): TemplateResult | typeof nothing;
|
|
149
232
|
protected render(): TemplateResult;
|
|
150
233
|
}
|
|
151
234
|
declare global {
|