@cdevhub/ngx-tw 0.5.0 → 0.6.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 +78 -15
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +18 -3
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
- package/index.json +1 -1
- package/package.json +63 -2
- package/theme/_base.css +13 -0
- package/theme/_dark.css +110 -36
- package/theme/_high-contrast-dark.css +367 -0
- package/theme/_high-contrast.css +13 -2
- package/theme/_light.css +276 -0
- package/theme/_semantic.css +47 -12
- package/theme/_typography.css +17 -0
- package/theme/index.css +86 -7
- package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
- package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
- package/types/cdevhub-ngx-tw-button.d.ts +1 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
- package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
- package/types/cdevhub-ngx-tw-card.d.ts +11 -3
- package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
- package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
- package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
- package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
- package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
- package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
- package/types/cdevhub-ngx-tw-core.d.ts +152 -21
- package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
- package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
- package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
- package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
- package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
- package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
- package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
- package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
- package/types/cdevhub-ngx-tw-input.d.ts +5 -8
- package/types/cdevhub-ngx-tw-item.d.ts +2 -0
- package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
- package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
- package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
- package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
- package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
- package/types/cdevhub-ngx-tw-select.d.ts +104 -33
- package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
- package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
- package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
- package/types/cdevhub-ngx-tw-split.d.ts +32 -2
- package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
- package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
- package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
- package/types/cdevhub-ngx-tw-table.d.ts +53 -10
- package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
- package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
- package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
- package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
- package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
- package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
- package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
- package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
- package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
- package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
- package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs.map +0 -1
|
@@ -143,13 +143,13 @@ declare class SelectFooterTemplateDirective {
|
|
|
143
143
|
declare class SelectComponent<T = unknown> implements ControlValueAccessor, FormFieldControl<T | readonly T[]>, OnInit {
|
|
144
144
|
/** Array of options to render in the panel. Accepts either `TwSelectOption<T>` objects or arbitrary records read via the accessor inputs. Defaults to an empty array. */
|
|
145
145
|
readonly options: _angular_core.InputSignal<readonly unknown[]>;
|
|
146
|
-
/** Accessor returning the visible label for an option. Override when passing arbitrary objects. */
|
|
146
|
+
/** Accessor returning the visible label for an option. Override when passing arbitrary objects. Defaults to reading `.label`, falling back to `String(.value)`. */
|
|
147
147
|
readonly optionLabel: _angular_core.InputSignal<(option: unknown) => string>;
|
|
148
|
-
/** Accessor returning the value for an option. The result is what `value` / `valueChange` emit. */
|
|
148
|
+
/** Accessor returning the value for an option. The result is what `value` / `valueChange` emit. Defaults to reading `.value`. */
|
|
149
149
|
readonly optionValue: _angular_core.InputSignal<(option: unknown) => T>;
|
|
150
150
|
/** Accessor returning the disabled state for an option. Defaults to reading `.disabled`. */
|
|
151
151
|
readonly optionDisabled: _angular_core.InputSignal<(option: unknown) => boolean>;
|
|
152
|
-
/** Accessor returning the group name for an option. Options sharing a group render under a labelled `role="group"` region. */
|
|
152
|
+
/** Accessor returning the group name for an option. Options sharing a group render under a labelled `role="group"` region. Defaults to reading `.group`. */
|
|
153
153
|
readonly optionGroup: _angular_core.InputSignal<(option: unknown) => string | undefined>;
|
|
154
154
|
/** When true, enables multi-selection. The `value` model becomes a `T[]` and the panel renders checkable options. Defaults to `false`. */
|
|
155
155
|
readonly multiple: _angular_core.InputSignal<boolean>;
|
|
@@ -157,11 +157,11 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
157
157
|
readonly searchable: _angular_core.InputSignal<boolean>;
|
|
158
158
|
/** Custom filter function for the search input. Defaults to a case-insensitive substring match on the option label. */
|
|
159
159
|
readonly filterPredicate: _angular_core.InputSignal<(option: unknown, search: string) => boolean>;
|
|
160
|
-
/** Placeholder text shown in the trigger when no value is selected. */
|
|
160
|
+
/** Placeholder text shown in the trigger when no value is selected. Defaults to `undefined`. */
|
|
161
161
|
readonly placeholder: _angular_core.InputSignal<string | undefined>;
|
|
162
|
-
/** When true, the trigger cannot be activated and the panel cannot open. Defaults to `false`. */
|
|
162
|
+
/** When true, the trigger cannot be activated and the panel cannot open. Defaults to `false`. Alias: `disabled`. */
|
|
163
163
|
readonly disabledInput: _angular_core.InputSignal<boolean>;
|
|
164
|
-
/** When true, exposes `aria-required="true"` on the trigger. Defaults to `false`. */
|
|
164
|
+
/** When true, exposes `aria-required="true"` on the trigger and the `*` marker on a wrapping `tw-form-field`. Also inferred from `Validators.required` on a bound control, so a reactive/template-driven form does not have to state it twice. Defaults to `false`. */
|
|
165
165
|
readonly requiredInput: _angular_core.InputSignal<boolean>;
|
|
166
166
|
/** Controls trigger padding, font size, and panel option density. Defaults to `'md'`. */
|
|
167
167
|
readonly size: _angular_core.InputSignal<TwSize>;
|
|
@@ -171,7 +171,7 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
171
171
|
readonly variant: _angular_core.InputSignal<SelectVariant | undefined>;
|
|
172
172
|
/** Overlay panel width. `'trigger'` matches the trigger's measured width; `'auto'` lets content decide; a number is applied as pixels; a string is passed through as a CSS length. Defaults to `'trigger'`. */
|
|
173
173
|
readonly panelWidth: _angular_core.InputSignal<string | number>;
|
|
174
|
-
/** Extra class(es) applied to the overlay panel element. */
|
|
174
|
+
/** Extra class(es) applied to the overlay panel element. Defaults to an empty string. */
|
|
175
175
|
readonly panelClass: _angular_core.InputSignal<string | readonly string[]>;
|
|
176
176
|
/** Maximum height of the listbox scroll region in pixels. Defaults to `256`. */
|
|
177
177
|
readonly panelMaxHeight: _angular_core.InputSignal<number>;
|
|
@@ -181,27 +181,27 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
181
181
|
readonly scrollStrategy: _angular_core.InputSignal<"reposition" | "close" | "block">;
|
|
182
182
|
/** Pixel distance between trigger and panel. Defaults to `4`. */
|
|
183
183
|
readonly offset: _angular_core.InputSignal<number>;
|
|
184
|
-
/** Fallback message rendered when the filter yields no options and no `*twSelectEmpty` template is provided. */
|
|
184
|
+
/** Fallback message rendered when the filter yields no options and no `*twSelectEmpty` template is provided. Defaults to `'No results'`. */
|
|
185
185
|
readonly emptyMessage: _angular_core.InputSignal<string>;
|
|
186
|
-
/** Accessible name for the combobox trigger. */
|
|
186
|
+
/** Accessible name for the combobox trigger. Defaults to `undefined`. Alias: `aria-label`. */
|
|
187
187
|
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
188
|
-
/** ID of an external element that labels the combobox. */
|
|
188
|
+
/** ID of an external element that labels the combobox. Defaults to `undefined`. Alias: `aria-labelledby`. */
|
|
189
189
|
readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
|
|
190
|
-
/** ID of an external element that describes the combobox. */
|
|
190
|
+
/** ID of an external element that describes the combobox. Defaults to `undefined`. Alias: `aria-describedby`. */
|
|
191
191
|
readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
|
|
192
192
|
/** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the select uses the `TW_ERROR_STATE_MATCHER` token's value. */
|
|
193
193
|
readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
|
|
194
194
|
/** Equality comparator for option values. Defaults to `Object.is`. */
|
|
195
195
|
readonly compareWith: _angular_core.InputSignal<(a: T, b: T) => boolean>;
|
|
196
|
-
/** Two-way bound selected value(s). Single-select: `T | null`. Multi-select: `T[]`. */
|
|
196
|
+
/** Two-way bound selected value(s). Single-select: `T | null`. Multi-select: `T[]`. Defaults to `null`. */
|
|
197
197
|
readonly value: _angular_core.ModelSignal<T | readonly T[] | null>;
|
|
198
|
-
/** Two-way bound open state of the panel. */
|
|
198
|
+
/** Two-way bound open state of the panel. Defaults to `false`. */
|
|
199
199
|
readonly open: _angular_core.ModelSignal<boolean>;
|
|
200
|
-
/** Fires when the panel's visibility finishes changing. */
|
|
200
|
+
/** Fires when the panel's visibility finishes changing. Payload carries the new `open` state and the trigger element the overlay is anchored to. */
|
|
201
201
|
readonly openedChange: _angular_core.OutputEmitterRef<TwSelectOpenedEvent>;
|
|
202
202
|
/** Fires after any selection change, with `added`, `removed`, `previousValue`, and a `source` discriminator. */
|
|
203
203
|
readonly selectionChange: _angular_core.OutputEmitterRef<TwSelectSelectionChangeEvent<T>>;
|
|
204
|
-
/** Fires whenever the search input changes (only when `searchable` is true). */
|
|
204
|
+
/** Fires whenever the search input changes (only when `searchable` is true). Payload carries the raw, untrimmed query and the post-filter `visibleCount`. Emitted immediately, not debounced. */
|
|
205
205
|
readonly searchChange: _angular_core.OutputEmitterRef<TwSelectSearchEvent>;
|
|
206
206
|
/** @internal */
|
|
207
207
|
readonly triggerTemplateChild: Signal<SelectTriggerTemplateDirective<any, any> | undefined>;
|
|
@@ -213,7 +213,10 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
213
213
|
readonly headerTemplateChild: Signal<SelectHeaderTemplateDirective | undefined>;
|
|
214
214
|
/** @internal */
|
|
215
215
|
readonly footerTemplateChild: Signal<SelectFooterTemplateDirective | undefined>;
|
|
216
|
+
/** @internal The combobox trigger — focus target after the clear control unmounts. */
|
|
217
|
+
private readonly triggerButtonRef;
|
|
216
218
|
private readonly overlayService;
|
|
219
|
+
private readonly coordinator;
|
|
217
220
|
private readonly elementRef;
|
|
218
221
|
private readonly viewContainerRef;
|
|
219
222
|
private readonly injector;
|
|
@@ -223,9 +226,6 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
223
226
|
private readonly platform;
|
|
224
227
|
private readonly formField;
|
|
225
228
|
private readonly ngControl;
|
|
226
|
-
private readonly parentForm;
|
|
227
|
-
private readonly parentFormGroup;
|
|
228
|
-
private readonly defaultMatcher;
|
|
229
229
|
private readonly uid;
|
|
230
230
|
/** @internal */
|
|
231
231
|
readonly hostId: string;
|
|
@@ -244,19 +244,22 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
244
244
|
/** @internal */
|
|
245
245
|
readonly focusedSignal: _angular_core.WritableSignal<boolean>;
|
|
246
246
|
private readonly cvaDisabled;
|
|
247
|
-
|
|
248
|
-
private readonly
|
|
247
|
+
/** @internal Shared `errorState` / `required` / `errors` derivation — see `wireErrorState`. */
|
|
248
|
+
private readonly errorWiring;
|
|
249
249
|
private readonly describedByIdsSignal;
|
|
250
250
|
private readonly labelledByIdsSignal;
|
|
251
|
-
private readonly closingSignal;
|
|
252
251
|
private onChange;
|
|
253
252
|
private onTouched;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
253
|
+
/**
|
|
254
|
+
* Watches the host for size changes so `panelWidth="trigger"` keeps tracking
|
|
255
|
+
* while the panel is up. Minted per open and disconnected on close, because
|
|
256
|
+
* the `OverlayRef` it feeds is disposed on close (see `openOverlay`).
|
|
257
|
+
*/
|
|
258
258
|
private resizeObserver;
|
|
259
|
-
private
|
|
259
|
+
private overlayInstance;
|
|
260
|
+
private closing;
|
|
261
|
+
/** Flips true once the overlay component is attached; the sole trigger for the state-push effect. */
|
|
262
|
+
private readonly isAttached;
|
|
260
263
|
/** @internal */
|
|
261
264
|
readonly isDisabled: Signal<boolean>;
|
|
262
265
|
/** @internal Effective variant — auto-naked when wrapped in tw-form-field. */
|
|
@@ -275,6 +278,16 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
275
278
|
readonly showClearButton: Signal<boolean>;
|
|
276
279
|
/** @internal */
|
|
277
280
|
readonly activeDescendantId: Signal<string | null>;
|
|
281
|
+
/**
|
|
282
|
+
* @internal `aria-activedescendant` for the trigger button.
|
|
283
|
+
*
|
|
284
|
+
* Null while a searchable panel is open: `openOverlay()` moves DOM focus to
|
|
285
|
+
* the overlay's search input, and `aria-activedescendant` is only honoured
|
|
286
|
+
* on the element that actually holds focus. Leaving it on the blurred
|
|
287
|
+
* trigger made arrow-key navigation silent to assistive tech. The overlay's
|
|
288
|
+
* search input carries it instead in that mode.
|
|
289
|
+
*/
|
|
290
|
+
readonly triggerActiveDescendantId: Signal<string | null>;
|
|
278
291
|
/** @internal */
|
|
279
292
|
readonly describedBy: Signal<string>;
|
|
280
293
|
/** @internal Merged `aria-labelledby`: form-field-pushed label ids + consumer-supplied `aria-labelledby`. */
|
|
@@ -295,7 +308,9 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
295
308
|
/** @internal */
|
|
296
309
|
readonly clearButtonClasses: Signal<string>;
|
|
297
310
|
/** @internal */
|
|
298
|
-
readonly
|
|
311
|
+
readonly clearSpacerClasses: Signal<string>;
|
|
312
|
+
/** @internal */
|
|
313
|
+
readonly optionSizeClass: Signal<"px-2 py-1 text-xs gap-1.5" | "px-3 py-1.5 text-sm" | "px-3 py-2 text-sm" | "px-4 py-2.5 text-base" | "px-4 py-3 text-base">;
|
|
299
314
|
/** @internal */
|
|
300
315
|
readonly checkmarkColorClass: Signal<string>;
|
|
301
316
|
/** @internal Class string applied to each option row. */
|
|
@@ -308,8 +323,18 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
308
323
|
readonly empty: Signal<boolean>;
|
|
309
324
|
/** @internal */
|
|
310
325
|
readonly disabled: Signal<boolean>;
|
|
311
|
-
/**
|
|
326
|
+
/**
|
|
327
|
+
* @internal Resolved required state: the `required` input OR'd with
|
|
328
|
+
* `Validators.required` on a bound `NgControl`. Without the validator arm the
|
|
329
|
+
* form-field `*` marker (`FormFieldComponent.isRequired`) and the trigger's
|
|
330
|
+
* `aria-required` silently vanish under reactive/template-driven forms, while
|
|
331
|
+
* signal forms shows them — `cvaControlCreate` writes the `required` *input*
|
|
332
|
+
* directly from the field state and never consults validators. The OR keeps
|
|
333
|
+
* both branches true at once.
|
|
334
|
+
*/
|
|
312
335
|
readonly required: Signal<boolean>;
|
|
336
|
+
/** @internal Active validation errors map from the bound `NgControl`. Drives `[twError match="…"]` inside a wrapping `tw-form-field`; without it the form-field's key set is permanently empty and every `match`ed error stays hidden. */
|
|
337
|
+
readonly errors: Signal<Record<string, unknown> | null>;
|
|
313
338
|
/** @internal Error-state per the configured `ErrorStateMatcher`. Reads the bound `NgControl.invalid` through the matcher. */
|
|
314
339
|
readonly errorState: Signal<boolean>;
|
|
315
340
|
/** @internal */
|
|
@@ -336,10 +361,38 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
336
361
|
selectByVisibleIndex(index: number, source?: TwSelectSelectionSource): void;
|
|
337
362
|
/** @internal */
|
|
338
363
|
onTriggerClick(): void;
|
|
339
|
-
/**
|
|
364
|
+
/**
|
|
365
|
+
* @internal
|
|
366
|
+
*
|
|
367
|
+
* `stopPropagation` + `preventDefault` are load-bearing even now that the
|
|
368
|
+
* control is a sibling of the trigger rather than nested inside it: inside a
|
|
369
|
+
* `tw-form-field` the click still bubbles to the field's control wrapper,
|
|
370
|
+
* which calls `onContainerClick()` and would open the panel on a clear.
|
|
371
|
+
*/
|
|
340
372
|
onClearClick(event: MouseEvent): void;
|
|
341
|
-
/**
|
|
373
|
+
/**
|
|
374
|
+
* @internal
|
|
375
|
+
*
|
|
376
|
+
* A native `button` already activates on Enter and Space in a browser, so
|
|
377
|
+
* this looks redundant — it is not. `preventDefault()` here suppresses that
|
|
378
|
+
* native activation, so the two paths cannot both fire, and jsdom never
|
|
379
|
+
* synthesises a click from a key event at all, which makes this the only
|
|
380
|
+
* keyboard path a unit spec can exercise.
|
|
381
|
+
*/
|
|
342
382
|
onClearKeydown(event: KeyboardEvent): void;
|
|
383
|
+
/**
|
|
384
|
+
* Clearing removes the clear control from the DOM (`showClearButton()` goes
|
|
385
|
+
* false), so whatever had focus is destroyed under the user. Hand focus back
|
|
386
|
+
* to the trigger rather than letting it fall to `<body>` (SC 2.4.3).
|
|
387
|
+
*
|
|
388
|
+
* The disabled guard is not redundant. `[disabled]` on a native button makes
|
|
389
|
+
* `.focus()` a silent no-op (the same trap `calendar-cell` hit), and today
|
|
390
|
+
* the only reason the path cannot be reached is that `showClearButton()`
|
|
391
|
+
* happens to include `!isDisabled()`. That is ordering, not a guarantee: a
|
|
392
|
+
* `setDisabledState(true)` landing between the keydown and this call would
|
|
393
|
+
* drop focus to `<body>` with nothing to show for it.
|
|
394
|
+
*/
|
|
395
|
+
private focusTrigger;
|
|
343
396
|
/** @internal */
|
|
344
397
|
onTriggerKeydown(event: KeyboardEvent): void;
|
|
345
398
|
/** @internal Handles keyboard events from the trigger AND the search input inside the overlay. */
|
|
@@ -354,15 +407,33 @@ declare class SelectComponent<T = unknown> implements ControlValueAccessor, Form
|
|
|
354
407
|
initActiveIndexOnOpen(): void;
|
|
355
408
|
private scrollActiveIntoView;
|
|
356
409
|
private commitSelection;
|
|
410
|
+
/**
|
|
411
|
+
* Builds and attaches the panel through {@link PickerOverlayCoordinator}.
|
|
412
|
+
*
|
|
413
|
+
* The coordinator disposes the `OverlayRef` on close, so every value read
|
|
414
|
+
* here — `offset`, `scrollStrategy`, `panelClass`, and the position
|
|
415
|
+
* strategy's origin — is re-read on each open rather than frozen at the
|
|
416
|
+
* first one. That replaces the previous `refreshPositionConfig()` /
|
|
417
|
+
* `applyScrollStrategy()` pair, which could only refresh the two inputs it
|
|
418
|
+
* knew about on a reused ref.
|
|
419
|
+
*
|
|
420
|
+
* `focusTrap: false` is load-bearing: this is an `aria-activedescendant`
|
|
421
|
+
* listbox, so DOM focus stays on the trigger (or the panel's search input)
|
|
422
|
+
* and a trap's anchor elements would inject tab stops around the panel.
|
|
423
|
+
*/
|
|
357
424
|
private openOverlay;
|
|
358
425
|
private closeOverlay;
|
|
359
|
-
private ensureOverlay;
|
|
360
426
|
private installResizeObserver;
|
|
361
427
|
private updateOverlaySize;
|
|
362
|
-
|
|
428
|
+
/**
|
|
429
|
+
* Registers the backdrop-click and Escape listeners for one open.
|
|
430
|
+
*
|
|
431
|
+
* Both streams come from the coordinator, which completes them when the
|
|
432
|
+
* overlay closes — so there is no per-open `Subscription` aggregate to keep
|
|
433
|
+
* and no way for listeners to accumulate across opens.
|
|
434
|
+
*/
|
|
363
435
|
private subscribePerOpen;
|
|
364
436
|
private resolvePanelClass;
|
|
365
|
-
private clearCloseTimer;
|
|
366
437
|
/** @internal */
|
|
367
438
|
buildTriggerContext(): TwSelectTriggerContext<T>;
|
|
368
439
|
writeValue(value: T | readonly T[] | null): void;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ComponentHarness, BaseHarnessFilters, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
import { SheetSide } from '@cdevhub/ngx-tw/sheet';
|
|
3
|
+
|
|
4
|
+
/** Filters accepted by `SheetHarness.with`. */
|
|
5
|
+
interface SheetHarnessFilters extends BaseHarnessFilters {
|
|
6
|
+
/** Match by the sheet's id — the same value as `SheetRef.id`. */
|
|
7
|
+
id?: string | RegExp;
|
|
8
|
+
/** Match by the text of the projected `[twSheetTitle]` element. */
|
|
9
|
+
title?: string | RegExp;
|
|
10
|
+
/** Match by the edge the sheet is anchored to. */
|
|
11
|
+
side?: SheetSide;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Harness for a sheet opened with `Sheet.open()`.
|
|
15
|
+
*
|
|
16
|
+
* ## Loading it
|
|
17
|
+
*
|
|
18
|
+
* A sheet is **service-opened**, not template-declared: nothing in the test
|
|
19
|
+
* fixture's own DOM represents it, and the container renders into the CDK
|
|
20
|
+
* overlay container on `document.body`. This harness's host *is* that container,
|
|
21
|
+
* so it must be loaded from
|
|
22
|
+
* `TestbedHarnessEnvironment.documentRootLoader(fixture)` — the ordinary
|
|
23
|
+
* `loader(fixture)` searches inside `fixture.nativeElement` and will never find
|
|
24
|
+
* it. Overlay panels belonging to template-declared components (`tw-select`,
|
|
25
|
+
* `tw-popover-overlay`, `tw-menu`) are the opposite case: those harnesses host
|
|
26
|
+
* on the in-fixture trigger and reach their panel internally, so the plain
|
|
27
|
+
* fixture loader is correct there.
|
|
28
|
+
*
|
|
29
|
+
* ## Waiting for it
|
|
30
|
+
*
|
|
31
|
+
* `Sheet` loads its render layer through a dynamic `import()`, so the container
|
|
32
|
+
* does **not** exist synchronously after `open()`. Await the ref's public
|
|
33
|
+
* {@link SheetRef.whenComponentReady} before asking for the harness — it
|
|
34
|
+
* resolves once the chunk has landed and the overlay is attached, for template
|
|
35
|
+
* sheets (with `null`) as well as component sheets.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const ref = sheet.open(FiltersSheet, { side: 'left' });
|
|
40
|
+
* await ref.whenComponentReady();
|
|
41
|
+
* const rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture);
|
|
42
|
+
* const harness = await rootLoader.getHarness(SheetHarness);
|
|
43
|
+
* expect(await harness.getSide()).toBe('left');
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
declare class SheetHarness extends ComponentHarness {
|
|
47
|
+
static hostSelector: string;
|
|
48
|
+
private readonly title;
|
|
49
|
+
private readonly content;
|
|
50
|
+
/** Any descendant of the container that currently holds DOM focus. */
|
|
51
|
+
private readonly focusedDescendant;
|
|
52
|
+
/**
|
|
53
|
+
* Overlay backdrops, which are siblings of the sheet's overlay pane rather
|
|
54
|
+
* than descendants of the container — hence the document-root lookup.
|
|
55
|
+
*/
|
|
56
|
+
private readonly backdrops;
|
|
57
|
+
/** Predicate for `locatorFor` / `locatorForAll`. */
|
|
58
|
+
static with(options?: SheetHarnessFilters): HarnessPredicate<SheetHarness>;
|
|
59
|
+
/** The sheet's id. Matches the `id` on the `SheetRef` returned by `open()`. */
|
|
60
|
+
getId(): Promise<string | null>;
|
|
61
|
+
/** The sheet's ARIA role — `'dialog'`, or `'alertdialog'` when so configured. */
|
|
62
|
+
getRole(): Promise<string | null>;
|
|
63
|
+
/**
|
|
64
|
+
* The edge the sheet is anchored to, read from the container's `data-side`
|
|
65
|
+
* attribute. This is the one axis a sheet has that a dialog does not.
|
|
66
|
+
*/
|
|
67
|
+
getSide(): Promise<SheetSide | null>;
|
|
68
|
+
/**
|
|
69
|
+
* Text of the projected `[twSheetTitle]` element, trimmed, or `null` when the
|
|
70
|
+
* sheet's content does not use the title directive.
|
|
71
|
+
*/
|
|
72
|
+
getTitleText(): Promise<string | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Text of the projected `[twSheetContent]` region, trimmed, or `null` when
|
|
75
|
+
* the sheet's content does not use the content directive.
|
|
76
|
+
*/
|
|
77
|
+
getContentText(): Promise<string | null>;
|
|
78
|
+
/**
|
|
79
|
+
* Whether DOM focus currently sits on the sheet container or anywhere inside
|
|
80
|
+
* it — the observable consequence of the CDK focus trap. CDK moves focus
|
|
81
|
+
* asynchronously, so let the fixture settle after opening before asserting.
|
|
82
|
+
*/
|
|
83
|
+
containsFocus(): Promise<boolean>;
|
|
84
|
+
/** Whether the sheet rendered a backdrop. */
|
|
85
|
+
hasBackdrop(): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* Clicks the backdrop — the pointer dismiss gesture. Does nothing observable
|
|
88
|
+
* when the sheet was opened with `disableClose: true` or
|
|
89
|
+
* `closeOnBackdropClick: false`, which is how a test asserts those flags.
|
|
90
|
+
*
|
|
91
|
+
* Throws when no backdrop is rendered. With several overlays stacked, the
|
|
92
|
+
* last backdrop in the overlay container is used, i.e. the topmost one.
|
|
93
|
+
*/
|
|
94
|
+
clickBackdrop(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Sends Escape to the sheet — the keyboard dismiss gesture. Deliberately a
|
|
97
|
+
* no-op when the sheet was opened with `disableClose: true` or
|
|
98
|
+
* `closeOnEscape: false`.
|
|
99
|
+
*/
|
|
100
|
+
pressEscape(): Promise<void>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export { SheetHarness };
|
|
104
|
+
export type { SheetHarnessFilters };
|
|
@@ -83,8 +83,24 @@ declare class SheetConfig<D = unknown, R = unknown> extends DialogConfig<D, R> {
|
|
|
83
83
|
restoreFocus?: SheetRestoreFocus;
|
|
84
84
|
}
|
|
85
85
|
/** Injection token carrying the `data` value passed via {@link SheetConfig.data}. */
|
|
86
|
-
declare const
|
|
86
|
+
declare const TW_SHEET_DATA: InjectionToken<unknown>;
|
|
87
87
|
/** Injection token for application-wide default sheet options. Set via `provideSheet()`. */
|
|
88
|
+
declare const TW_SHEET_DEFAULT_OPTIONS: InjectionToken<Partial<SheetConfig<unknown, unknown>>>;
|
|
89
|
+
/**
|
|
90
|
+
* @deprecated Renamed to {@link TW_SHEET_DATA} for consistency with every other
|
|
91
|
+
* ngx-tw injection token — and with `TW_DIALOG_DATA`, its direct counterpart.
|
|
92
|
+
* This is the *same token instance*, not a copy — providing under either name
|
|
93
|
+
* and injecting under the other resolves — so the rename is safe to adopt
|
|
94
|
+
* incrementally. Removed in the next major.
|
|
95
|
+
*/
|
|
96
|
+
declare const SHEET_DATA: InjectionToken<unknown>;
|
|
97
|
+
/**
|
|
98
|
+
* @deprecated Renamed to {@link TW_SHEET_DEFAULT_OPTIONS} for consistency with
|
|
99
|
+
* every other ngx-tw injection token — and with `TW_DIALOG_DEFAULT_OPTIONS`,
|
|
100
|
+
* its direct counterpart. This is the *same token instance*, not a copy —
|
|
101
|
+
* providing under either name and injecting under the other resolves — so the
|
|
102
|
+
* rename is safe to adopt incrementally. Removed in the next major.
|
|
103
|
+
*/
|
|
88
104
|
declare const SHEET_DEFAULT_OPTIONS: InjectionToken<Partial<SheetConfig<unknown, unknown>>>;
|
|
89
105
|
|
|
90
106
|
/** Lifecycle states a sheet passes through. */
|
|
@@ -380,7 +396,7 @@ declare class SheetActionsDirective {
|
|
|
380
396
|
* `[twSheetClose]` value to pass a result to `afterClosed()` subscribers.
|
|
381
397
|
*/
|
|
382
398
|
declare class SheetCloseDirective {
|
|
383
|
-
/** Value passed to `afterClosed()` when the button is clicked. */
|
|
399
|
+
/** Value passed to `afterClosed()` when the button is clicked. Defaults to `undefined`. */
|
|
384
400
|
readonly twSheetClose: i0.InputSignal<unknown>;
|
|
385
401
|
/** Native button `type`. Defaults to `'button'` to avoid accidental form submission. */
|
|
386
402
|
readonly type: i0.InputSignal<"button" | "submit" | "reset">;
|
|
@@ -390,5 +406,5 @@ declare class SheetCloseDirective {
|
|
|
390
406
|
static ɵdir: i0.ɵɵDirectiveDeclaration<SheetCloseDirective, "[twSheetClose]", never, { "twSheetClose": { "alias": "twSheetClose"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
391
407
|
}
|
|
392
408
|
|
|
393
|
-
export { SHEET_DATA, SHEET_DEFAULT_OPTIONS, Sheet, SheetActionsDirective, SheetCloseDirective, SheetConfig, SheetContentDirective, SheetDescriptionDirective, SheetHeaderDirective, SheetIconDirective, SheetRef, SheetSubtitleDirective, SheetTitleDirective, provideSheet };
|
|
409
|
+
export { SHEET_DATA, SHEET_DEFAULT_OPTIONS, Sheet, SheetActionsDirective, SheetCloseDirective, SheetConfig, SheetContainer, SheetContentDirective, SheetDescriptionDirective, SheetHeaderDirective, SheetIconDirective, SheetRef, SheetSubtitleDirective, SheetTitleDirective, TW_SHEET_DATA, TW_SHEET_DEFAULT_OPTIONS, provideSheet };
|
|
394
410
|
export type { SheetActionsAlign, SheetAnimationEvent, SheetAutoFocus, SheetRestoreFocus, SheetRole, SheetScrollStrategy, SheetSide, SheetSize, SheetState };
|
|
@@ -16,8 +16,14 @@ interface SliderMark {
|
|
|
16
16
|
}
|
|
17
17
|
/** Format function for the value displayed in the value bubble, min/max labels, and `aria-valuetext`. */
|
|
18
18
|
type SliderValueFormatter = (value: number) => string;
|
|
19
|
-
/**
|
|
20
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Identifies which thumb is the interaction target. `'single'` in single-value
|
|
21
|
+
* mode; `'start'` (lower) and `'end'` (upper) in range mode. Named in the
|
|
22
|
+
* public signatures of {@link SliderComponent.onThumbPointerDown} and
|
|
23
|
+
* {@link SliderComponent.onThumbKeyDown}, so it is exported for consumers that
|
|
24
|
+
* script those handlers directly.
|
|
25
|
+
*/
|
|
26
|
+
type SliderThumbId = 'single' | 'start' | 'end';
|
|
21
27
|
/**
|
|
22
28
|
* Select a single value or a numeric range from a scale.
|
|
23
29
|
*
|
|
@@ -29,10 +35,26 @@ type ThumbId = 'single' | 'start' | 'end';
|
|
|
29
35
|
* ```
|
|
30
36
|
*/
|
|
31
37
|
declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Lower bound of the slider scale. Defaults to `0`.
|
|
40
|
+
*
|
|
41
|
+
* Accepts `undefined` so `[formField]` type-checks under `strictTemplates`:
|
|
42
|
+
* signal forms writes the `min` control binding from the field's own
|
|
43
|
+
* `min()` state, which is `number | undefined`. `undefined` resolves back to
|
|
44
|
+
* the documented default through {@link min}.
|
|
45
|
+
*/
|
|
46
|
+
readonly minInput: _angular_core.InputSignal<number | undefined>;
|
|
47
|
+
/**
|
|
48
|
+
* Upper bound of the slider scale. Defaults to `100`.
|
|
49
|
+
*
|
|
50
|
+
* Accepts `undefined` for the same reason as {@link minInput}; `undefined`
|
|
51
|
+
* resolves back to the documented default through {@link max}.
|
|
52
|
+
*/
|
|
53
|
+
readonly maxInput: _angular_core.InputSignal<number | undefined>;
|
|
54
|
+
/** @internal Resolved lower bound — the `min` input with its documented `0` default restored when the binding resolves to `undefined`. Every internal reader goes through this, never through the raw input. */
|
|
55
|
+
readonly min: Signal<number>;
|
|
56
|
+
/** @internal Resolved upper bound — the `max` input with its documented `100` default restored when the binding resolves to `undefined`. */
|
|
57
|
+
readonly max: Signal<number>;
|
|
36
58
|
/** Step increment used for snapping, keyboard nav, and auto-generated marks. Pass `null` for continuous values. Defaults to `1`. */
|
|
37
59
|
readonly step: _angular_core.InputSignal<number | null>;
|
|
38
60
|
/** Semantic color for the filled portion and thumb border. Defaults to `'primary'`. */
|
|
@@ -43,8 +65,19 @@ declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
|
43
65
|
readonly variant: _angular_core.InputSignal<SliderVariant>;
|
|
44
66
|
/** When true, prevents interaction and applies muted styling. Defaults to `false`. */
|
|
45
67
|
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
46
|
-
/** When true, sets `aria-required="true"` on the thumb for assistive tech. Defaults to `false`. */
|
|
47
|
-
readonly
|
|
68
|
+
/** When true, sets `aria-required="true"` on the thumb for assistive tech. Also inferred from `Validators.required` on a bound control, so a reactive/template-driven form does not have to state it twice. Defaults to `false`. */
|
|
69
|
+
readonly requiredInput: _angular_core.InputSignal<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* @internal Shared `errorState` / `required` / `errors` derivation — see
|
|
72
|
+
* `wireErrorState`. Declared here, above `required`, because class field
|
|
73
|
+
* initializers run in declaration order.
|
|
74
|
+
*/
|
|
75
|
+
private readonly errorWiring;
|
|
76
|
+
/**
|
|
77
|
+
* @internal Resolved required state: the `required` input OR'd with
|
|
78
|
+
* `Validators.required` on a bound `NgControl`.
|
|
79
|
+
*/
|
|
80
|
+
readonly required: Signal<boolean>;
|
|
48
81
|
/** When true, the slider selects a `[start, end]` range and renders two thumbs. Defaults to `false`. */
|
|
49
82
|
readonly range: _angular_core.InputSignal<boolean>;
|
|
50
83
|
/** Tick marks: `true` auto-generates one mark per step, an array supplies custom marks, `false` renders no marks. Defaults to `false`. */
|
|
@@ -63,21 +96,47 @@ declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
|
63
96
|
readonly valueFormatter: _angular_core.InputSignal<SliderValueFormatter | undefined>;
|
|
64
97
|
/** Optional form name attribute. Purely informational — the component does not render a native input. */
|
|
65
98
|
readonly name: _angular_core.InputSignal<string | undefined>;
|
|
66
|
-
/** Accessible name for the single-value thumb when no visible label is provided. */
|
|
99
|
+
/** Accessible name for the single-value thumb when no visible label is provided. Defaults to `undefined`. Alias: `aria-label`. */
|
|
67
100
|
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
68
|
-
/** ID of an external element labelling the single-value thumb. */
|
|
101
|
+
/** ID of an external element labelling the single-value thumb. Defaults to `undefined`. Alias: `aria-labelledby`. */
|
|
69
102
|
readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
|
|
70
|
-
/** ID of an external element describing the slider. */
|
|
103
|
+
/** ID of an external element describing the slider. Defaults to `undefined`. Alias: `aria-describedby`. */
|
|
71
104
|
readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
|
|
72
105
|
/** Accessible name for the start (lower) thumb in range mode. Defaults to `"Minimum"`. */
|
|
73
106
|
readonly ariaLabelStart: _angular_core.InputSignal<string>;
|
|
74
107
|
/** Accessible name for the end (upper) thumb in range mode. Defaults to `"Maximum"`. */
|
|
75
108
|
readonly ariaLabelEnd: _angular_core.InputSignal<string>;
|
|
76
|
-
/**
|
|
109
|
+
/**
|
|
110
|
+
* Two-way bound slider value. A `number` for single mode, or `[start, end]`
|
|
111
|
+
* for range mode. Updates on every interaction. Defaults to `0`.
|
|
112
|
+
*
|
|
113
|
+
* The two-way binding mints a `valueChange` output, which fires on every
|
|
114
|
+
* value mutation the user causes — each drag move and each key step, plus the
|
|
115
|
+
* commit. Note the slider differs from `tw-checkbox` / `tw-switch` /
|
|
116
|
+
* `tw-radio-group`, where the minted output is the *any-change* channel:
|
|
117
|
+
* here, a programmatic write from a bound form (`FormControl.setValue`,
|
|
118
|
+
* `ngModel`) reaches the rendered value through the CVA path without passing
|
|
119
|
+
* through this model, so it does **not** emit `valueChange`. To observe
|
|
120
|
+
* programmatic writes, use the form control's own `valueChanges`.
|
|
121
|
+
*
|
|
122
|
+
* For the two user-gesture channels, prefer `(input)` for live feedback and
|
|
123
|
+
* `(change)` for commit — see their docs below.
|
|
124
|
+
*/
|
|
77
125
|
readonly value: _angular_core.ModelSignal<SliderValue>;
|
|
78
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Fires continuously while the user drags or holds a key — the *live* channel,
|
|
128
|
+
* for previewing a value that is not yet committed. Payload matches the
|
|
129
|
+
* current `value`. Template event name is `input` — the TS-side identifier is
|
|
130
|
+
* `valueInput` to avoid shadowing the imported `input` factory. Never fires
|
|
131
|
+
* for a programmatic write.
|
|
132
|
+
*/
|
|
79
133
|
readonly valueInput: _angular_core.OutputEmitterRef<SliderValue>;
|
|
80
|
-
/**
|
|
134
|
+
/**
|
|
135
|
+
* Fires when the user commits a change (pointer release, key release, or blur
|
|
136
|
+
* after keyboard change) — the *commit* channel, for saving or querying on a
|
|
137
|
+
* settled value. Payload matches the current `value`. Never fires for a
|
|
138
|
+
* programmatic write; use `(input)` if you need every intermediate value.
|
|
139
|
+
*/
|
|
81
140
|
readonly change: _angular_core.OutputEmitterRef<SliderValue>;
|
|
82
141
|
/** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the component uses the `TW_ERROR_STATE_MATCHER` token's value. */
|
|
83
142
|
readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
|
|
@@ -86,11 +145,6 @@ declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
|
86
145
|
private readonly destroyRef;
|
|
87
146
|
private readonly directionality;
|
|
88
147
|
private readonly ngControl;
|
|
89
|
-
private readonly parentForm;
|
|
90
|
-
private readonly parentFormGroup;
|
|
91
|
-
private readonly defaultMatcher;
|
|
92
|
-
private readonly _ngControlRev;
|
|
93
|
-
private readonly _formSubmitRev;
|
|
94
148
|
/** Whether the form control is in an error state per the configured `ErrorStateMatcher`. */
|
|
95
149
|
readonly errorState: Signal<boolean>;
|
|
96
150
|
private readonly region;
|
|
@@ -117,7 +171,7 @@ declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
|
117
171
|
private readonly internalEnd;
|
|
118
172
|
private readonly internalSingle;
|
|
119
173
|
/** @internal Which thumb currently has an active pointer gesture (or null). Bound in the template to drive the pressed-thumb styling. */
|
|
120
|
-
readonly activeThumb: _angular_core.WritableSignal<
|
|
174
|
+
readonly activeThumb: _angular_core.WritableSignal<SliderThumbId | null>;
|
|
121
175
|
/** @internal Which thumb is focused (for bubble visibility). */
|
|
122
176
|
private readonly focusedThumb;
|
|
123
177
|
/** @internal Set of pointer IDs currently captured per-thumb for release tracking. */
|
|
@@ -205,7 +259,7 @@ declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
|
205
259
|
*/
|
|
206
260
|
private readonly bubbleClassMap;
|
|
207
261
|
/** @internal Bubble visibility depends on drag / focus / hover state. */
|
|
208
|
-
bubbleClassFor(thumb:
|
|
262
|
+
bubbleClassFor(thumb: SliderThumbId): string;
|
|
209
263
|
/** @internal */
|
|
210
264
|
readonly resolvedAriaDescribedby: Signal<string | null>;
|
|
211
265
|
/** @internal */
|
|
@@ -223,12 +277,12 @@ declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
|
223
277
|
/** Track click: move the nearest thumb to the clicked position and begin a drag. */
|
|
224
278
|
onTrackPointerDown(event: PointerEvent): void;
|
|
225
279
|
/** Thumb press: capture pointer and begin a drag gesture. */
|
|
226
|
-
onThumbPointerDown(event: PointerEvent, thumb:
|
|
280
|
+
onThumbPointerDown(event: PointerEvent, thumb: SliderThumbId): void;
|
|
227
281
|
private beginDrag;
|
|
228
282
|
private readonly onPointerMove;
|
|
229
283
|
private readonly onPointerUp;
|
|
230
284
|
/** Keyboard navigation: arrows for step, PageUp/Down for 10% jumps, Home/End for extremes. */
|
|
231
|
-
onThumbKeyDown(event: KeyboardEvent, thumb:
|
|
285
|
+
onThumbKeyDown(event: KeyboardEvent, thumb: SliderThumbId): void;
|
|
232
286
|
/** @internal */
|
|
233
287
|
onThumbBlur(): void;
|
|
234
288
|
/** @internal Clamp to min/max and snap to step. Returns a finite number. */
|
|
@@ -251,8 +305,8 @@ declare class SliderComponent implements ControlValueAccessor, OnInit {
|
|
|
251
305
|
setDisabledState(isDisabled: boolean): void;
|
|
252
306
|
ngOnInit(): void;
|
|
253
307
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SliderComponent, never>;
|
|
254
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SliderComponent, "tw-slider", never, { "
|
|
308
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SliderComponent, "tw-slider", never, { "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "requiredInput": { "alias": "required"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "marks": { "alias": "marks"; "required": false; "isSignal": true; }; "showMarkLabels": { "alias": "showMarkLabels"; "required": false; "isSignal": true; }; "showMinMax": { "alias": "showMinMax"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "valueFormatter": { "alias": "valueFormatter"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "ariaLabelStart": { "alias": "ariaLabelStart"; "required": false; "isSignal": true; }; "ariaLabelEnd": { "alias": "ariaLabelEnd"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueInput": "input"; "change": "change"; }, never, never, true, never>;
|
|
255
309
|
}
|
|
256
310
|
|
|
257
311
|
export { SliderComponent };
|
|
258
|
-
export type { SliderMark, SliderValue, SliderValueFormatter, SliderVariant };
|
|
312
|
+
export type { SliderMark, SliderThumbId, SliderValue, SliderValueFormatter, SliderVariant };
|