@cdevhub/ngx-tw 0.2.0 → 0.3.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/README.md +264 -49
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +35 -22
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +416 -216
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +152 -81
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +42 -29
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +205 -110
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +141 -74
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +395 -149
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +142 -72
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +227 -122
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +47 -25
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +102 -52
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +16 -8
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +100 -55
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
- package/package.json +45 -17
- package/theme/_dark.css +16 -12
- package/theme/_semantic.css +3 -2
- package/theme/index.css +10 -2
- package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
- package/types/cdevhub-ngx-tw-code-block.d.ts +8 -7
- package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
- package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
- package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
- package/types/cdevhub-ngx-tw-select.d.ts +1 -1
- package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
- package/types/cdevhub-ngx-tw-table.d.ts +30 -1
- package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
- package/types/cdevhub-ngx-tw-toast.d.ts +1 -1
- package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
- package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
- package/types/cdevhub-ngx-tw.d.ts +7 -0
|
@@ -9,7 +9,7 @@ import { ComponentPortal } from '@angular/cdk/portal';
|
|
|
9
9
|
import { Platform } from '@angular/cdk/platform';
|
|
10
10
|
import { FocusMonitor, LiveAnnouncer } from '@angular/cdk/a11y';
|
|
11
11
|
import { tv } from 'tailwind-variants';
|
|
12
|
-
import {
|
|
12
|
+
import { TW_FORM_FIELD, TW_FORM_FIELD_CONTROL } from '@cdevhub/ngx-tw/form-field';
|
|
13
13
|
import { NgTemplateOutlet } from '@angular/common';
|
|
14
14
|
|
|
15
15
|
/**
|
|
@@ -23,47 +23,65 @@ class ComboboxOverlayComponent {
|
|
|
23
23
|
hostElement = inject((ElementRef));
|
|
24
24
|
// ── Config signals pushed by the parent ──
|
|
25
25
|
/** @internal */
|
|
26
|
-
listboxId = signal('',
|
|
26
|
+
listboxId = signal('', /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "listboxId" }] : /* istanbul ignore next */ []));
|
|
27
28
|
/** @internal */
|
|
28
|
-
labelledBy = signal('',
|
|
29
|
+
labelledBy = signal('', /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "labelledBy" }] : /* istanbul ignore next */ []));
|
|
29
31
|
/** @internal */
|
|
30
|
-
panelMaxHeight = signal(256,
|
|
32
|
+
panelMaxHeight = signal(256, /* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [{ debugName: "panelMaxHeight" }] : /* istanbul ignore next */ []));
|
|
31
34
|
/** @internal */
|
|
32
|
-
emptyMessage = signal('No results',
|
|
35
|
+
emptyMessage = signal('No results', /* @ts-ignore */
|
|
36
|
+
...(ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []));
|
|
33
37
|
/** @internal */
|
|
34
|
-
query = signal('',
|
|
38
|
+
query = signal('', /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
35
40
|
/** @internal */
|
|
36
|
-
loading = signal(false,
|
|
41
|
+
loading = signal(false, /* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
37
43
|
/** @internal */
|
|
38
|
-
activeIndex = signal(-1,
|
|
44
|
+
activeIndex = signal(-1, /* @ts-ignore */
|
|
45
|
+
...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
|
|
39
46
|
/** @internal */
|
|
40
|
-
renderedRows = signal([],
|
|
47
|
+
renderedRows = signal([], /* @ts-ignore */
|
|
48
|
+
...(ngDevMode ? [{ debugName: "renderedRows" }] : /* istanbul ignore next */ []));
|
|
41
49
|
/** @internal */
|
|
42
|
-
isSelected = signal(() => false,
|
|
50
|
+
isSelected = signal(() => false, /* @ts-ignore */
|
|
51
|
+
...(ngDevMode ? [{ debugName: "isSelected" }] : /* istanbul ignore next */ []));
|
|
43
52
|
/** @internal */
|
|
44
|
-
optionIdFn = signal((i) => `option-${i}`,
|
|
53
|
+
optionIdFn = signal((i) => `option-${i}`, /* @ts-ignore */
|
|
54
|
+
...(ngDevMode ? [{ debugName: "optionIdFn" }] : /* istanbul ignore next */ []));
|
|
45
55
|
/** @internal */
|
|
46
|
-
groupHeaderIdFn = signal((g) => `group-${g}`,
|
|
56
|
+
groupHeaderIdFn = signal((g) => `group-${g}`, /* @ts-ignore */
|
|
57
|
+
...(ngDevMode ? [{ debugName: "groupHeaderIdFn" }] : /* istanbul ignore next */ []));
|
|
47
58
|
/** @internal */
|
|
48
|
-
customPanelClass = signal('',
|
|
59
|
+
customPanelClass = signal('', /* @ts-ignore */
|
|
60
|
+
...(ngDevMode ? [{ debugName: "customPanelClass" }] : /* istanbul ignore next */ []));
|
|
49
61
|
/** @internal */
|
|
50
|
-
optionTemplate = signal(undefined,
|
|
62
|
+
optionTemplate = signal(undefined, /* @ts-ignore */
|
|
63
|
+
...(ngDevMode ? [{ debugName: "optionTemplate" }] : /* istanbul ignore next */ []));
|
|
51
64
|
/** @internal */
|
|
52
|
-
emptyTemplate = signal(undefined,
|
|
65
|
+
emptyTemplate = signal(undefined, /* @ts-ignore */
|
|
66
|
+
...(ngDevMode ? [{ debugName: "emptyTemplate" }] : /* istanbul ignore next */ []));
|
|
53
67
|
/** @internal */
|
|
54
|
-
loadingTemplate = signal(undefined,
|
|
68
|
+
loadingTemplate = signal(undefined, /* @ts-ignore */
|
|
69
|
+
...(ngDevMode ? [{ debugName: "loadingTemplate" }] : /* istanbul ignore next */ []));
|
|
55
70
|
// ── Callbacks pushed by the parent ──
|
|
56
71
|
/** @internal */
|
|
57
|
-
onOptionPick = signal(() => { },
|
|
72
|
+
onOptionPick = signal(() => { }, /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "onOptionPick" }] : /* istanbul ignore next */ []));
|
|
58
74
|
/** @internal */
|
|
59
|
-
onOptionHover = signal(() => { },
|
|
75
|
+
onOptionHover = signal(() => { }, /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "onOptionHover" }] : /* istanbul ignore next */ []));
|
|
60
77
|
// ── Computed classes ──
|
|
61
78
|
/** @internal */
|
|
62
79
|
panelClasses = computed(() => {
|
|
63
80
|
const base = 'block w-full bg-surface-overlay border border-border rounded-md shadow-md overflow-hidden';
|
|
64
81
|
const custom = this.customPanelClass();
|
|
65
82
|
return custom ? `${base} ${custom}` : base;
|
|
66
|
-
},
|
|
83
|
+
}, /* @ts-ignore */
|
|
84
|
+
...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
|
|
67
85
|
/** @internal */
|
|
68
86
|
optionClass(index, disabled) {
|
|
69
87
|
const base = 'flex cursor-pointer items-center gap-2 px-3 py-2 text-sm text-fg select-none transition-colors duration-normal motion-reduce:transition-none';
|
|
@@ -119,8 +137,8 @@ class ComboboxOverlayComponent {
|
|
|
119
137
|
return;
|
|
120
138
|
this.onOptionHover()(index);
|
|
121
139
|
}
|
|
122
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
123
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
140
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
141
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: ComboboxOverlayComponent, isStandalone: true, selector: "tw-combobox-overlay", host: { properties: { "class": "panelClasses()", "animate.enter": "\"scale-in\"", "animate.leave": "\"scale-out\"" } }, ngImport: i0, template: `
|
|
124
142
|
@if (loading()) {
|
|
125
143
|
@if (loadingTemplate(); as tpl) {
|
|
126
144
|
<ng-container *ngTemplateOutlet="tpl" />
|
|
@@ -177,6 +195,11 @@ class ComboboxOverlayComponent {
|
|
|
177
195
|
</div>
|
|
178
196
|
</li>
|
|
179
197
|
} @else {
|
|
198
|
+
<!-- ARIA activedescendant listbox: keyboard navigation lives on the
|
|
199
|
+
parent combobox input (via aria-activedescendant). Options are
|
|
200
|
+
click-targets only and never receive DOM focus, so neither a
|
|
201
|
+
keydown nor a tabindex applies here. -->
|
|
202
|
+
<!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
|
|
180
203
|
<li
|
|
181
204
|
role="option"
|
|
182
205
|
[id]="optionIdFn()(row.index)"
|
|
@@ -209,7 +232,7 @@ class ComboboxOverlayComponent {
|
|
|
209
232
|
</ul>
|
|
210
233
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
211
234
|
}
|
|
212
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
235
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxOverlayComponent, decorators: [{
|
|
213
236
|
type: Component,
|
|
214
237
|
args: [{
|
|
215
238
|
selector: 'tw-combobox-overlay',
|
|
@@ -277,6 +300,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
277
300
|
</div>
|
|
278
301
|
</li>
|
|
279
302
|
} @else {
|
|
303
|
+
<!-- ARIA activedescendant listbox: keyboard navigation lives on the
|
|
304
|
+
parent combobox input (via aria-activedescendant). Options are
|
|
305
|
+
click-targets only and never receive DOM focus, so neither a
|
|
306
|
+
keydown nor a tabindex applies here. -->
|
|
307
|
+
<!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
|
|
280
308
|
<li
|
|
281
309
|
role="option"
|
|
282
310
|
[id]="optionIdFn()(row.index)"
|
|
@@ -417,10 +445,10 @@ class ComboboxOptionTemplateDirective {
|
|
|
417
445
|
static ngTemplateContextGuard(_dir, _ctx) {
|
|
418
446
|
return true;
|
|
419
447
|
}
|
|
420
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
421
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
448
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxOptionTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
449
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: ComboboxOptionTemplateDirective, isStandalone: true, selector: "[twComboboxOption]", ngImport: i0 });
|
|
422
450
|
}
|
|
423
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
451
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxOptionTemplateDirective, decorators: [{
|
|
424
452
|
type: Directive,
|
|
425
453
|
args: [{ selector: '[twComboboxOption]' }]
|
|
426
454
|
}] });
|
|
@@ -432,10 +460,10 @@ class ComboboxEmptyTemplateDirective {
|
|
|
432
460
|
static ngTemplateContextGuard(_dir, _ctx) {
|
|
433
461
|
return true;
|
|
434
462
|
}
|
|
435
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
436
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
463
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxEmptyTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
464
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: ComboboxEmptyTemplateDirective, isStandalone: true, selector: "[twComboboxEmpty]", ngImport: i0 });
|
|
437
465
|
}
|
|
438
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
466
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxEmptyTemplateDirective, decorators: [{
|
|
439
467
|
type: Directive,
|
|
440
468
|
args: [{ selector: '[twComboboxEmpty]' }]
|
|
441
469
|
}] });
|
|
@@ -443,19 +471,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
443
471
|
class ComboboxLoadingTemplateDirective {
|
|
444
472
|
/** @internal */
|
|
445
473
|
templateRef = inject((TemplateRef));
|
|
446
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
447
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
474
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxLoadingTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
475
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: ComboboxLoadingTemplateDirective, isStandalone: true, selector: "[twComboboxLoading]", ngImport: i0 });
|
|
448
476
|
}
|
|
449
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
477
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxLoadingTemplateDirective, decorators: [{
|
|
450
478
|
type: Directive,
|
|
451
479
|
args: [{ selector: '[twComboboxLoading]' }]
|
|
452
480
|
}] });
|
|
453
481
|
/** Attribute directive marking a leading adornment projected inside the input row. */
|
|
454
482
|
class ComboboxPrefixDirective {
|
|
455
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
456
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
483
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxPrefixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
484
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: ComboboxPrefixDirective, isStandalone: true, selector: "[twComboboxPrefix]", host: { classAttribute: "flex items-center shrink-0 text-fg-muted" }, ngImport: i0 });
|
|
457
485
|
}
|
|
458
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
486
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxPrefixDirective, decorators: [{
|
|
459
487
|
type: Directive,
|
|
460
488
|
args: [{
|
|
461
489
|
selector: '[twComboboxPrefix]',
|
|
@@ -464,10 +492,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
464
492
|
}] });
|
|
465
493
|
/** Attribute directive marking a trailing adornment projected inside the input row, before the clear button. */
|
|
466
494
|
class ComboboxSuffixDirective {
|
|
467
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
468
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
495
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxSuffixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
496
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: ComboboxSuffixDirective, isStandalone: true, selector: "[twComboboxSuffix]", host: { classAttribute: "flex items-center shrink-0 text-fg-muted" }, ngImport: i0 });
|
|
469
497
|
}
|
|
470
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
498
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxSuffixDirective, decorators: [{
|
|
471
499
|
type: Directive,
|
|
472
500
|
args: [{
|
|
473
501
|
selector: '[twComboboxSuffix]',
|
|
@@ -486,63 +514,87 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
486
514
|
class ComboboxComponent {
|
|
487
515
|
// ── Inputs ──
|
|
488
516
|
/** Array of options to render in the popover. Accepts plain records or `TwComboboxOption<T>`. */
|
|
489
|
-
options = input([],
|
|
517
|
+
options = input([], /* @ts-ignore */
|
|
518
|
+
...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
490
519
|
/** Accessor returning the visible label for an option. Used by the default filter and the trigger label resolver. */
|
|
491
|
-
optionLabel = input(defaultOptionLabel,
|
|
520
|
+
optionLabel = input(defaultOptionLabel, /* @ts-ignore */
|
|
521
|
+
...(ngDevMode ? [{ debugName: "optionLabel" }] : /* istanbul ignore next */ []));
|
|
492
522
|
/** Accessor returning the value emitted via `valueCommit` when this option is picked. */
|
|
493
|
-
optionValue = input(defaultOptionValue,
|
|
523
|
+
optionValue = input(defaultOptionValue, /* @ts-ignore */
|
|
524
|
+
...(ngDevMode ? [{ debugName: "optionValue" }] : /* istanbul ignore next */ []));
|
|
494
525
|
/** Accessor returning whether an option is non-interactive. */
|
|
495
|
-
optionDisabled = input(defaultOptionDisabled,
|
|
526
|
+
optionDisabled = input(defaultOptionDisabled, /* @ts-ignore */
|
|
527
|
+
...(ngDevMode ? [{ debugName: "optionDisabled" }] : /* istanbul ignore next */ []));
|
|
496
528
|
/** Accessor returning a group label. Options sharing a group render under a labelled `role="group"` region. */
|
|
497
|
-
optionGroup = input(defaultOptionGroup,
|
|
529
|
+
optionGroup = input(defaultOptionGroup, /* @ts-ignore */
|
|
530
|
+
...(ngDevMode ? [{ debugName: "optionGroup" }] : /* istanbul ignore next */ []));
|
|
498
531
|
/** Accessor returning an optional secondary description rendered under the label in the default option row. */
|
|
499
|
-
optionDescription = input(defaultOptionDescription,
|
|
532
|
+
optionDescription = input(defaultOptionDescription, /* @ts-ignore */
|
|
533
|
+
...(ngDevMode ? [{ debugName: "optionDescription" }] : /* istanbul ignore next */ []));
|
|
500
534
|
/** Filter function applied client-side whenever `inputValue` changes. Pass `null` to disable client filtering (async mode). Defaults to case-insensitive `startsWith` on the label. */
|
|
501
|
-
filterFn = input(defaultStartsWithFilter,
|
|
535
|
+
filterFn = input(defaultStartsWithFilter, /* @ts-ignore */
|
|
536
|
+
...(ngDevMode ? [{ debugName: "filterFn" }] : /* istanbul ignore next */ []));
|
|
502
537
|
/** When `true`, free-text commits are rejected — the input reverts to the last committed label on blur. */
|
|
503
|
-
strict = input(false,
|
|
538
|
+
strict = input(false, /* @ts-ignore */
|
|
539
|
+
...(ngDevMode ? [{ debugName: "strict" }] : /* istanbul ignore next */ []));
|
|
504
540
|
/** Placeholder shown when the input is empty. */
|
|
505
|
-
placeholder = input(undefined,
|
|
541
|
+
placeholder = input(undefined, /* @ts-ignore */
|
|
542
|
+
...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
506
543
|
/** Disables the input and prevents the popover from opening. */
|
|
507
544
|
disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled' });
|
|
508
545
|
/** Sets `aria-required="true"` on the input. */
|
|
509
546
|
requiredInput = input(false, { ...(ngDevMode ? { debugName: "requiredInput" } : /* istanbul ignore next */ {}), alias: 'required' });
|
|
510
547
|
/** Controls trigger padding and font size per the inline padding scale. */
|
|
511
|
-
size = input('md',
|
|
548
|
+
size = input('md', /* @ts-ignore */
|
|
549
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
512
550
|
/** Semantic color for the focus ring. */
|
|
513
|
-
color = input('primary',
|
|
551
|
+
color = input('primary', /* @ts-ignore */
|
|
552
|
+
...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
514
553
|
/** Whether the trailing chevron affordance is rendered. */
|
|
515
554
|
// TRUE-default: the chevron signals the dropdown affordance; without it the
|
|
516
555
|
// combobox reads as a plain input. Opt-out is for inline search inputs.
|
|
517
|
-
showChevron = input(true,
|
|
556
|
+
showChevron = input(true, /* @ts-ignore */
|
|
557
|
+
...(ngDevMode ? [{ debugName: "showChevron" }] : /* istanbul ignore next */ []));
|
|
518
558
|
/** Whether the inline clear (×) button appears while `inputValue` is non-empty. */
|
|
519
559
|
// TRUE-default: the clear affordance is the expected combobox UX once a value
|
|
520
560
|
// is set; opt-out is for required-only flows.
|
|
521
|
-
clearable = input(true,
|
|
561
|
+
clearable = input(true, /* @ts-ignore */
|
|
562
|
+
...(ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []));
|
|
522
563
|
/** When `true`, shows an in-popover spinner and an inline spinner in the trigger while the popover is open. */
|
|
523
|
-
loading = input(false,
|
|
564
|
+
loading = input(false, /* @ts-ignore */
|
|
565
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
524
566
|
/** Debounce window (ms) before `queryChange` emits. Local filtering is not debounced. */
|
|
525
|
-
queryDebounce = input(150,
|
|
567
|
+
queryDebounce = input(150, /* @ts-ignore */
|
|
568
|
+
...(ngDevMode ? [{ debugName: "queryDebounce" }] : /* istanbul ignore next */ []));
|
|
526
569
|
/** Minimum query length before the popover opens automatically. `0` opens on focus. */
|
|
527
|
-
minQueryLength = input(0,
|
|
570
|
+
minQueryLength = input(0, /* @ts-ignore */
|
|
571
|
+
...(ngDevMode ? [{ debugName: "minQueryLength" }] : /* istanbul ignore next */ []));
|
|
528
572
|
/** Whether the popover opens automatically when the input receives focus. */
|
|
529
573
|
// TRUE-default: clicking into a combobox opens the dropdown — standard select-
|
|
530
574
|
// like UX. Opt-out is for command-palette-style flows triggered only by typing.
|
|
531
|
-
openOnFocus = input(true,
|
|
575
|
+
openOnFocus = input(true, /* @ts-ignore */
|
|
576
|
+
...(ngDevMode ? [{ debugName: "openOnFocus" }] : /* istanbul ignore next */ []));
|
|
532
577
|
/** Maximum height (px) of the popover scroll region. */
|
|
533
|
-
panelMaxHeight = input(256,
|
|
578
|
+
panelMaxHeight = input(256, /* @ts-ignore */
|
|
579
|
+
...(ngDevMode ? [{ debugName: "panelMaxHeight" }] : /* istanbul ignore next */ []));
|
|
534
580
|
/** Overlay width strategy. `'trigger'` matches input width; `'auto'` lets content decide; a number is applied as px; a string is passed as a CSS length. */
|
|
535
|
-
panelWidth = input('trigger',
|
|
581
|
+
panelWidth = input('trigger', /* @ts-ignore */
|
|
582
|
+
...(ngDevMode ? [{ debugName: "panelWidth" }] : /* istanbul ignore next */ []));
|
|
536
583
|
/** Extra class(es) appended to the overlay panel for consumer customization. */
|
|
537
|
-
panelClass = input('',
|
|
584
|
+
panelClass = input('', /* @ts-ignore */
|
|
585
|
+
...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
538
586
|
/** CDK overlay scroll strategy. */
|
|
539
|
-
scrollStrategy = input('reposition',
|
|
587
|
+
scrollStrategy = input('reposition', /* @ts-ignore */
|
|
588
|
+
...(ngDevMode ? [{ debugName: "scrollStrategy" }] : /* istanbul ignore next */ []));
|
|
540
589
|
/** Pixel offset between the input and the popover. */
|
|
541
|
-
offset = input(4,
|
|
590
|
+
offset = input(4, /* @ts-ignore */
|
|
591
|
+
...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
|
|
542
592
|
/** Fallback empty-state message when no `*twComboboxEmpty` template is projected. */
|
|
543
|
-
emptyMessage = input('No results',
|
|
593
|
+
emptyMessage = input('No results', /* @ts-ignore */
|
|
594
|
+
...(ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []));
|
|
544
595
|
/** Equality comparator used to reconcile `value` with options during `writeValue`. */
|
|
545
|
-
compareWith = input(Object.is,
|
|
596
|
+
compareWith = input(Object.is, /* @ts-ignore */
|
|
597
|
+
...(ngDevMode ? [{ debugName: "compareWith" }] : /* istanbul ignore next */ []));
|
|
546
598
|
/** Accessible name for the combobox input. */
|
|
547
599
|
ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
548
600
|
/** ID of an external label element. */
|
|
@@ -550,14 +602,18 @@ class ComboboxComponent {
|
|
|
550
602
|
/** ID of an external descriptor element. */
|
|
551
603
|
ariaDescribedby = input(undefined, { ...(ngDevMode ? { debugName: "ariaDescribedby" } : /* istanbul ignore next */ {}), alias: 'aria-describedby' });
|
|
552
604
|
/** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the combobox uses the `TW_ERROR_STATE_MATCHER` token's value. */
|
|
553
|
-
errorStateMatcher = input(undefined,
|
|
605
|
+
errorStateMatcher = input(undefined, /* @ts-ignore */
|
|
606
|
+
...(ngDevMode ? [{ debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
|
|
554
607
|
// ── Models ──
|
|
555
608
|
/** Two-way bound committed value. May be an option's value (`T`), a typed string (free-text mode), or `null`. */
|
|
556
|
-
value = model(null,
|
|
609
|
+
value = model(null, /* @ts-ignore */
|
|
610
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
557
611
|
/** Two-way bound visible text in the input. Bound separately from `value` so async consumers can drive the query. */
|
|
558
|
-
inputValue = model('',
|
|
612
|
+
inputValue = model('', /* @ts-ignore */
|
|
613
|
+
...(ngDevMode ? [{ debugName: "inputValue" }] : /* istanbul ignore next */ []));
|
|
559
614
|
/** Two-way bound open state of the popover. */
|
|
560
|
-
open = model(false,
|
|
615
|
+
open = model(false, /* @ts-ignore */
|
|
616
|
+
...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
561
617
|
// ── Outputs ──
|
|
562
618
|
/** Fires after the query text changes, debounced by `queryDebounce`. Async-mode consumers subscribe to this to fetch results. */
|
|
563
619
|
queryChange = output();
|
|
@@ -569,14 +625,19 @@ class ComboboxComponent {
|
|
|
569
625
|
openedChange = output();
|
|
570
626
|
// ── Content queries ──
|
|
571
627
|
/** @internal */
|
|
572
|
-
optionTemplateChild = contentChild(ComboboxOptionTemplateDirective,
|
|
628
|
+
optionTemplateChild = contentChild(ComboboxOptionTemplateDirective, /* @ts-ignore */
|
|
629
|
+
...(ngDevMode ? [{ debugName: "optionTemplateChild" }] : /* istanbul ignore next */ []));
|
|
573
630
|
/** @internal */
|
|
574
|
-
emptyTemplateChild = contentChild(ComboboxEmptyTemplateDirective,
|
|
631
|
+
emptyTemplateChild = contentChild(ComboboxEmptyTemplateDirective, /* @ts-ignore */
|
|
632
|
+
...(ngDevMode ? [{ debugName: "emptyTemplateChild" }] : /* istanbul ignore next */ []));
|
|
575
633
|
/** @internal */
|
|
576
|
-
loadingTemplateChild = contentChild(ComboboxLoadingTemplateDirective,
|
|
634
|
+
loadingTemplateChild = contentChild(ComboboxLoadingTemplateDirective, /* @ts-ignore */
|
|
635
|
+
...(ngDevMode ? [{ debugName: "loadingTemplateChild" }] : /* istanbul ignore next */ []));
|
|
577
636
|
// ── View queries ──
|
|
578
|
-
inputRef = viewChild('inputEl',
|
|
579
|
-
|
|
637
|
+
inputRef = viewChild('inputEl', /* @ts-ignore */
|
|
638
|
+
...(ngDevMode ? [{ debugName: "inputRef" }] : /* istanbul ignore next */ []));
|
|
639
|
+
triggerSurfaceRef = viewChild('triggerSurface', /* @ts-ignore */
|
|
640
|
+
...(ngDevMode ? [{ debugName: "triggerSurfaceRef" }] : /* istanbul ignore next */ []));
|
|
580
641
|
// ── Injected deps ──
|
|
581
642
|
overlayService = inject(Overlay);
|
|
582
643
|
elementRef = inject((ElementRef));
|
|
@@ -586,7 +647,7 @@ class ComboboxComponent {
|
|
|
586
647
|
focusMonitor = inject(FocusMonitor);
|
|
587
648
|
liveAnnouncer = inject(LiveAnnouncer);
|
|
588
649
|
platform = inject(Platform);
|
|
589
|
-
formField = inject(
|
|
650
|
+
formField = inject(TW_FORM_FIELD, { optional: true });
|
|
590
651
|
ngControl = inject(NgControl, { optional: true, self: true });
|
|
591
652
|
parentForm = inject(NgForm, { optional: true });
|
|
592
653
|
parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
@@ -603,24 +664,35 @@ class ComboboxComponent {
|
|
|
603
664
|
groupHeaderId = (group) => `${this.hostId}-group-${group.replace(/\s+/g, '-').toLowerCase()}`;
|
|
604
665
|
// ── Internal state signals ──
|
|
605
666
|
/** @internal */
|
|
606
|
-
composing = signal(false,
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
667
|
+
composing = signal(false, /* @ts-ignore */
|
|
668
|
+
...(ngDevMode ? [{ debugName: "composing" }] : /* istanbul ignore next */ []));
|
|
669
|
+
/** @internal */
|
|
670
|
+
focusedSignal = signal(false, /* @ts-ignore */
|
|
671
|
+
...(ngDevMode ? [{ debugName: "focusedSignal" }] : /* istanbul ignore next */ []));
|
|
672
|
+
cvaDisabled = signal(false, /* @ts-ignore */
|
|
673
|
+
...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
|
|
674
|
+
_ngControlRev = signal(0, /* @ts-ignore */
|
|
675
|
+
...(ngDevMode ? [{ debugName: "_ngControlRev" }] : /* istanbul ignore next */ []));
|
|
676
|
+
_formSubmitRev = signal(0, /* @ts-ignore */
|
|
677
|
+
...(ngDevMode ? [{ debugName: "_formSubmitRev" }] : /* istanbul ignore next */ []));
|
|
678
|
+
describedByIdsSignal = signal([], /* @ts-ignore */
|
|
679
|
+
...(ngDevMode ? [{ debugName: "describedByIdsSignal" }] : /* istanbul ignore next */ []));
|
|
680
|
+
labelledByIdsSignal = signal([], /* @ts-ignore */
|
|
681
|
+
...(ngDevMode ? [{ debugName: "labelledByIdsSignal" }] : /* istanbul ignore next */ []));
|
|
682
|
+
/** @internal */
|
|
683
|
+
lastCommittedLabel = signal('', /* @ts-ignore */
|
|
684
|
+
...(ngDevMode ? [{ debugName: "lastCommittedLabel" }] : /* istanbul ignore next */ []));
|
|
685
|
+
pendingWriteValue = signal(UNRESOLVED, /* @ts-ignore */
|
|
686
|
+
...(ngDevMode ? [{ debugName: "pendingWriteValue" }] : /* istanbul ignore next */ []));
|
|
687
|
+
closingSignal = signal(false, /* @ts-ignore */
|
|
688
|
+
...(ngDevMode ? [{ debugName: "closingSignal" }] : /* istanbul ignore next */ []));
|
|
618
689
|
/** Re-runs the input handler once after IME composition ends. */
|
|
619
690
|
composingPendingValue = null;
|
|
620
691
|
onChange = () => { };
|
|
621
692
|
onTouched = () => { };
|
|
622
693
|
overlayRef = null;
|
|
623
|
-
overlayInstanceSignal = signal(null,
|
|
694
|
+
overlayInstanceSignal = signal(null, /* @ts-ignore */
|
|
695
|
+
...(ngDevMode ? [{ debugName: "overlayInstanceSignal" }] : /* istanbul ignore next */ []));
|
|
624
696
|
closeTimer = null;
|
|
625
697
|
queryDebounceTimer = null;
|
|
626
698
|
announceTimer = null;
|
|
@@ -630,9 +702,11 @@ class ComboboxComponent {
|
|
|
630
702
|
}
|
|
631
703
|
// ── Derived state ──
|
|
632
704
|
/** @internal */
|
|
633
|
-
isDisabled = computed(() => this.disabledInput() || this.cvaDisabled(),
|
|
705
|
+
isDisabled = computed(() => this.disabledInput() || this.cvaDisabled(), /* @ts-ignore */
|
|
706
|
+
...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
634
707
|
/** @internal Auto-naked when wrapped in tw-form-field. */
|
|
635
|
-
naked = computed(() => !!this.formField,
|
|
708
|
+
naked = computed(() => !!this.formField, /* @ts-ignore */
|
|
709
|
+
...(ngDevMode ? [{ debugName: "naked" }] : /* istanbul ignore next */ []));
|
|
636
710
|
/** @internal Resolved visible options (after filter, with derived view fields). */
|
|
637
711
|
visibleOptions = computed(() => {
|
|
638
712
|
const opts = this.options();
|
|
@@ -652,7 +726,8 @@ class ComboboxComponent {
|
|
|
652
726
|
group: groupFn(option),
|
|
653
727
|
description: descFn(option),
|
|
654
728
|
}));
|
|
655
|
-
},
|
|
729
|
+
}, /* @ts-ignore */
|
|
730
|
+
...(ngDevMode ? [{ debugName: "visibleOptions" }] : /* istanbul ignore next */ []));
|
|
656
731
|
/** @internal Rendered rows (group headers + option rows). */
|
|
657
732
|
renderedRows = computed(() => {
|
|
658
733
|
const visible = this.visibleOptions();
|
|
@@ -668,7 +743,8 @@ class ComboboxComponent {
|
|
|
668
743
|
rows.push({ kind: 'option', option: v, index });
|
|
669
744
|
});
|
|
670
745
|
return rows;
|
|
671
|
-
},
|
|
746
|
+
}, /* @ts-ignore */
|
|
747
|
+
...(ngDevMode ? [{ debugName: "renderedRows" }] : /* istanbul ignore next */ []));
|
|
672
748
|
/** Returns the index of the first enabled option, or -1 when none. */
|
|
673
749
|
firstEnabledIndex(visible = this.visibleOptions()) {
|
|
674
750
|
for (let i = 0; i < visible.length; i++) {
|
|
@@ -701,20 +777,25 @@ class ComboboxComponent {
|
|
|
701
777
|
if (idx < 0 || idx >= visible.length)
|
|
702
778
|
return null;
|
|
703
779
|
return visible[idx];
|
|
704
|
-
},
|
|
780
|
+
}, /* @ts-ignore */
|
|
781
|
+
...(ngDevMode ? [{ debugName: "activeOption" }] : /* istanbul ignore next */ []));
|
|
705
782
|
/** @internal */
|
|
706
783
|
activeOptionId = computed(() => {
|
|
707
784
|
const idx = this.activeIndex();
|
|
708
785
|
if (idx < 0 || idx >= this.visibleOptions().length)
|
|
709
786
|
return null;
|
|
710
787
|
return this.optionId(idx);
|
|
711
|
-
},
|
|
788
|
+
}, /* @ts-ignore */
|
|
789
|
+
...(ngDevMode ? [{ debugName: "activeOptionId" }] : /* istanbul ignore next */ []));
|
|
712
790
|
/** @internal */
|
|
713
|
-
isEmpty = computed(() => this.inputValue().length === 0 && this.value() == null,
|
|
791
|
+
isEmpty = computed(() => this.inputValue().length === 0 && this.value() == null, /* @ts-ignore */
|
|
792
|
+
...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
|
|
714
793
|
/** @internal */
|
|
715
|
-
showClearButton = computed(() => this.clearable() && !this.isDisabled() && this.inputValue().length > 0,
|
|
794
|
+
showClearButton = computed(() => this.clearable() && !this.isDisabled() && this.inputValue().length > 0, /* @ts-ignore */
|
|
795
|
+
...(ngDevMode ? [{ debugName: "showClearButton" }] : /* istanbul ignore next */ []));
|
|
716
796
|
/** @internal */
|
|
717
|
-
showSpinner = computed(() => this.loading(),
|
|
797
|
+
showSpinner = computed(() => this.loading(), /* @ts-ignore */
|
|
798
|
+
...(ngDevMode ? [{ debugName: "showSpinner" }] : /* istanbul ignore next */ []));
|
|
718
799
|
/** @internal */
|
|
719
800
|
resolvedDescribedBy = computed(() => {
|
|
720
801
|
const extra = this.describedByIdsSignal();
|
|
@@ -723,7 +804,8 @@ class ComboboxComponent {
|
|
|
723
804
|
if (user)
|
|
724
805
|
merged.push(...user.split(/\s+/).filter(Boolean));
|
|
725
806
|
return merged.length ? merged.join(' ') : '';
|
|
726
|
-
},
|
|
807
|
+
}, /* @ts-ignore */
|
|
808
|
+
...(ngDevMode ? [{ debugName: "resolvedDescribedBy" }] : /* istanbul ignore next */ []));
|
|
727
809
|
/** @internal */
|
|
728
810
|
resolvedLabelledBy = computed(() => {
|
|
729
811
|
const extra = this.labelledByIdsSignal();
|
|
@@ -732,7 +814,8 @@ class ComboboxComponent {
|
|
|
732
814
|
if (user)
|
|
733
815
|
merged.push(...user.split(/\s+/).filter(Boolean));
|
|
734
816
|
return merged.length ? merged.join(' ') : '';
|
|
735
|
-
},
|
|
817
|
+
}, /* @ts-ignore */
|
|
818
|
+
...(ngDevMode ? [{ debugName: "resolvedLabelledBy" }] : /* istanbul ignore next */ []));
|
|
736
819
|
/** @internal Error-state per the configured `ErrorStateMatcher`. Reads the bound `NgControl.invalid` through the matcher. */
|
|
737
820
|
errorState = computed(() => {
|
|
738
821
|
this._ngControlRev();
|
|
@@ -741,7 +824,8 @@ class ComboboxComponent {
|
|
|
741
824
|
const form = this.parentFormGroup ??
|
|
742
825
|
this.parentForm;
|
|
743
826
|
return matcher.isErrorState(this.ngControl?.control ?? null, form);
|
|
744
|
-
},
|
|
827
|
+
}, /* @ts-ignore */
|
|
828
|
+
...(ngDevMode ? [{ debugName: "errorState" }] : /* istanbul ignore next */ []));
|
|
745
829
|
// ── tv() output ──
|
|
746
830
|
variantResult = computed(() => comboboxVariants({
|
|
747
831
|
size: this.size(),
|
|
@@ -750,22 +834,30 @@ class ComboboxComponent {
|
|
|
750
834
|
open: this.open(),
|
|
751
835
|
naked: this.naked(),
|
|
752
836
|
errorState: this.errorState(),
|
|
753
|
-
}),
|
|
837
|
+
}), /* @ts-ignore */
|
|
838
|
+
...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
|
|
754
839
|
/** @internal */
|
|
755
|
-
rootClasses = computed(() => this.variantResult().root(),
|
|
840
|
+
rootClasses = computed(() => this.variantResult().root(), /* @ts-ignore */
|
|
841
|
+
...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
|
|
756
842
|
/** @internal */
|
|
757
|
-
triggerClasses = computed(() => this.variantResult().trigger(),
|
|
843
|
+
triggerClasses = computed(() => this.variantResult().trigger(), /* @ts-ignore */
|
|
844
|
+
...(ngDevMode ? [{ debugName: "triggerClasses" }] : /* istanbul ignore next */ []));
|
|
758
845
|
/** @internal */
|
|
759
|
-
inputClasses = computed(() => this.variantResult().input(),
|
|
846
|
+
inputClasses = computed(() => this.variantResult().input(), /* @ts-ignore */
|
|
847
|
+
...(ngDevMode ? [{ debugName: "inputClasses" }] : /* istanbul ignore next */ []));
|
|
760
848
|
/** @internal */
|
|
761
|
-
clearButtonClasses = computed(() => this.variantResult().clearButton(),
|
|
849
|
+
clearButtonClasses = computed(() => this.variantResult().clearButton(), /* @ts-ignore */
|
|
850
|
+
...(ngDevMode ? [{ debugName: "clearButtonClasses" }] : /* istanbul ignore next */ []));
|
|
762
851
|
/** @internal */
|
|
763
|
-
chevronClasses = computed(() => this.variantResult().chevron(),
|
|
852
|
+
chevronClasses = computed(() => this.variantResult().chevron(), /* @ts-ignore */
|
|
853
|
+
...(ngDevMode ? [{ debugName: "chevronClasses" }] : /* istanbul ignore next */ []));
|
|
764
854
|
/** @internal */
|
|
765
|
-
spinnerClasses = computed(() => this.variantResult().spinner(),
|
|
855
|
+
spinnerClasses = computed(() => this.variantResult().spinner(), /* @ts-ignore */
|
|
856
|
+
...(ngDevMode ? [{ debugName: "spinnerClasses" }] : /* istanbul ignore next */ []));
|
|
766
857
|
// ── FormFieldControl impl ──
|
|
767
858
|
/** @internal */
|
|
768
|
-
id = computed(() => this.hostId,
|
|
859
|
+
id = computed(() => this.hostId, /* @ts-ignore */
|
|
860
|
+
...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
769
861
|
/** @internal */
|
|
770
862
|
focused = this.focusedSignal.asReadonly();
|
|
771
863
|
/** @internal */
|
|
@@ -773,13 +865,16 @@ class ComboboxComponent {
|
|
|
773
865
|
/** @internal */
|
|
774
866
|
disabled = this.isDisabled;
|
|
775
867
|
/** @internal */
|
|
776
|
-
required = computed(() => this.requiredInput(),
|
|
868
|
+
required = computed(() => this.requiredInput(), /* @ts-ignore */
|
|
869
|
+
...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
777
870
|
/** @internal */
|
|
778
871
|
controlType = 'combobox';
|
|
779
872
|
/** @internal */
|
|
780
|
-
userAriaDescribedBy = computed(() => this.ariaDescribedby(),
|
|
873
|
+
userAriaDescribedBy = computed(() => this.ariaDescribedby(), /* @ts-ignore */
|
|
874
|
+
...(ngDevMode ? [{ debugName: "userAriaDescribedBy" }] : /* istanbul ignore next */ []));
|
|
781
875
|
/** @internal */
|
|
782
|
-
userAriaLabelledby = computed(() => this.ariaLabelledby(),
|
|
876
|
+
userAriaLabelledby = computed(() => this.ariaLabelledby(), /* @ts-ignore */
|
|
877
|
+
...(ngDevMode ? [{ debugName: "userAriaLabelledby" }] : /* istanbul ignore next */ []));
|
|
783
878
|
// ── Constructor ──
|
|
784
879
|
constructor() {
|
|
785
880
|
// Material-style CVA wiring: declare ourselves as the value accessor on any
|
|
@@ -1509,8 +1604,8 @@ class ComboboxComponent {
|
|
|
1509
1604
|
.subscribe(() => this._formSubmitRev.update((n) => n + 1));
|
|
1510
1605
|
}
|
|
1511
1606
|
}
|
|
1512
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1513
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1607
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1608
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: ComboboxComponent, isStandalone: true, selector: "tw-combobox", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, optionDisabled: { classPropertyName: "optionDisabled", publicName: "optionDisabled", isSignal: true, isRequired: false, transformFunction: null }, optionGroup: { classPropertyName: "optionGroup", publicName: "optionGroup", isSignal: true, isRequired: false, transformFunction: null }, optionDescription: { classPropertyName: "optionDescription", publicName: "optionDescription", isSignal: true, isRequired: false, transformFunction: null }, filterFn: { classPropertyName: "filterFn", publicName: "filterFn", isSignal: true, isRequired: false, transformFunction: null }, strict: { classPropertyName: "strict", publicName: "strict", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, requiredInput: { classPropertyName: "requiredInput", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, showChevron: { classPropertyName: "showChevron", publicName: "showChevron", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, queryDebounce: { classPropertyName: "queryDebounce", publicName: "queryDebounce", isSignal: true, isRequired: false, transformFunction: null }, minQueryLength: { classPropertyName: "minQueryLength", publicName: "minQueryLength", isSignal: true, isRequired: false, transformFunction: null }, openOnFocus: { classPropertyName: "openOnFocus", publicName: "openOnFocus", isSignal: true, isRequired: false, transformFunction: null }, panelMaxHeight: { classPropertyName: "panelMaxHeight", publicName: "panelMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, scrollStrategy: { classPropertyName: "scrollStrategy", publicName: "scrollStrategy", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, inputValue: { classPropertyName: "inputValue", publicName: "inputValue", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", inputValue: "inputValueChange", open: "openChange", queryChange: "queryChange", optionSelected: "optionSelected", valueCommit: "valueCommit", openedChange: "openedChange" }, host: { properties: { "class": "rootClasses()" } }, providers: [
|
|
1514
1609
|
{
|
|
1515
1610
|
provide: TW_FORM_FIELD_CONTROL,
|
|
1516
1611
|
useExisting: forwardRef(() => ComboboxComponent),
|
|
@@ -1606,7 +1701,7 @@ class ComboboxComponent {
|
|
|
1606
1701
|
</span>
|
|
1607
1702
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1608
1703
|
}
|
|
1609
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1704
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ComboboxComponent, decorators: [{
|
|
1610
1705
|
type: Component,
|
|
1611
1706
|
args: [{
|
|
1612
1707
|
selector: 'tw-combobox',
|