@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
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, model, output, inject, ElementRef, DestroyRef,
|
|
2
|
+
import { input, computed, model, output, inject, ElementRef, DestroyRef, viewChild, signal, linkedSignal, untracked, afterNextRender, isDevMode, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { NgControl
|
|
4
|
+
import { NgControl } from '@angular/forms';
|
|
5
5
|
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
6
6
|
import { Directionality } from '@angular/cdk/bidi';
|
|
7
|
-
import { merge } from 'rxjs';
|
|
8
7
|
import { tv } from 'tailwind-variants';
|
|
9
|
-
import {
|
|
8
|
+
import { wireErrorState } from '@cdevhub/ngx-tw/core';
|
|
10
9
|
|
|
11
10
|
/**
|
|
12
11
|
* `tw-slider` — select a single value or a contiguous range from a numeric scale.
|
|
@@ -177,11 +176,27 @@ const toNumber = (value, fallback) => {
|
|
|
177
176
|
* ```
|
|
178
177
|
*/
|
|
179
178
|
class SliderComponent {
|
|
180
|
-
/**
|
|
181
|
-
|
|
179
|
+
/**
|
|
180
|
+
* Lower bound of the slider scale. Defaults to `0`.
|
|
181
|
+
*
|
|
182
|
+
* Accepts `undefined` so `[formField]` type-checks under `strictTemplates`:
|
|
183
|
+
* signal forms writes the `min` control binding from the field's own
|
|
184
|
+
* `min()` state, which is `number | undefined`. `undefined` resolves back to
|
|
185
|
+
* the documented default through {@link min}.
|
|
186
|
+
*/
|
|
187
|
+
minInput = input(0, { ...(ngDevMode ? { debugName: "minInput" } : /* istanbul ignore next */ {}), alias: 'min' });
|
|
188
|
+
/**
|
|
189
|
+
* Upper bound of the slider scale. Defaults to `100`.
|
|
190
|
+
*
|
|
191
|
+
* Accepts `undefined` for the same reason as {@link minInput}; `undefined`
|
|
192
|
+
* resolves back to the documented default through {@link max}.
|
|
193
|
+
*/
|
|
194
|
+
maxInput = input(100, { ...(ngDevMode ? { debugName: "maxInput" } : /* istanbul ignore next */ {}), alias: 'max' });
|
|
195
|
+
/** @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. */
|
|
196
|
+
min = computed(() => this.minInput() ?? 0, /* @ts-ignore */
|
|
182
197
|
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
183
|
-
/**
|
|
184
|
-
max =
|
|
198
|
+
/** @internal Resolved upper bound — the `max` input with its documented `100` default restored when the binding resolves to `undefined`. */
|
|
199
|
+
max = computed(() => this.maxInput() ?? 100, /* @ts-ignore */
|
|
185
200
|
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
186
201
|
/** Step increment used for snapping, keyboard nav, and auto-generated marks. Pass `null` for continuous values. Defaults to `1`. */
|
|
187
202
|
step = input(1, /* @ts-ignore */
|
|
@@ -198,9 +213,26 @@ class SliderComponent {
|
|
|
198
213
|
/** When true, prevents interaction and applies muted styling. Defaults to `false`. */
|
|
199
214
|
disabled = input(false, /* @ts-ignore */
|
|
200
215
|
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
201
|
-
/** When true, sets `aria-required="true"` on the thumb for assistive tech. Defaults to `false`. */
|
|
202
|
-
|
|
203
|
-
|
|
216
|
+
/** 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`. */
|
|
217
|
+
requiredInput = input(false, { ...(ngDevMode ? { debugName: "requiredInput" } : /* istanbul ignore next */ {}), alias: 'required' });
|
|
218
|
+
/**
|
|
219
|
+
* @internal Shared `errorState` / `required` / `errors` derivation — see
|
|
220
|
+
* `wireErrorState`. Declared here, above `required`, because class field
|
|
221
|
+
* initializers run in declaration order.
|
|
222
|
+
*/
|
|
223
|
+
errorWiring = wireErrorState({
|
|
224
|
+
ngControl: () => this.ngControl,
|
|
225
|
+
matcher: () => this.errorStateMatcher(),
|
|
226
|
+
required: () => this.requiredInput(),
|
|
227
|
+
// Read focus so blur-driven `touched` transitions repaint the error
|
|
228
|
+
// border even when the underlying control's status/value didn't change.
|
|
229
|
+
track: [() => this.focusedThumb()],
|
|
230
|
+
});
|
|
231
|
+
/**
|
|
232
|
+
* @internal Resolved required state: the `required` input OR'd with
|
|
233
|
+
* `Validators.required` on a bound `NgControl`.
|
|
234
|
+
*/
|
|
235
|
+
required = this.errorWiring.required;
|
|
204
236
|
/** When true, the slider selects a `[start, end]` range and renders two thumbs. Defaults to `false`. */
|
|
205
237
|
range = input(false, /* @ts-ignore */
|
|
206
238
|
...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
|
|
@@ -228,11 +260,11 @@ class SliderComponent {
|
|
|
228
260
|
/** Optional form name attribute. Purely informational — the component does not render a native input. */
|
|
229
261
|
name = input(undefined, /* @ts-ignore */
|
|
230
262
|
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
231
|
-
/** Accessible name for the single-value thumb when no visible label is provided. */
|
|
263
|
+
/** Accessible name for the single-value thumb when no visible label is provided. Defaults to `undefined`. Alias: `aria-label`. */
|
|
232
264
|
ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
233
|
-
/** ID of an external element labelling the single-value thumb. */
|
|
265
|
+
/** ID of an external element labelling the single-value thumb. Defaults to `undefined`. Alias: `aria-labelledby`. */
|
|
234
266
|
ariaLabelledby = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
|
|
235
|
-
/** ID of an external element describing the slider. */
|
|
267
|
+
/** ID of an external element describing the slider. Defaults to `undefined`. Alias: `aria-describedby`. */
|
|
236
268
|
ariaDescribedby = input(undefined, { ...(ngDevMode ? { debugName: "ariaDescribedby" } : /* istanbul ignore next */ {}), alias: 'aria-describedby' });
|
|
237
269
|
/** Accessible name for the start (lower) thumb in range mode. Defaults to `"Minimum"`. */
|
|
238
270
|
ariaLabelStart = input('Minimum', /* @ts-ignore */
|
|
@@ -240,12 +272,38 @@ class SliderComponent {
|
|
|
240
272
|
/** Accessible name for the end (upper) thumb in range mode. Defaults to `"Maximum"`. */
|
|
241
273
|
ariaLabelEnd = input('Maximum', /* @ts-ignore */
|
|
242
274
|
...(ngDevMode ? [{ debugName: "ariaLabelEnd" }] : /* istanbul ignore next */ []));
|
|
243
|
-
/**
|
|
275
|
+
/**
|
|
276
|
+
* Two-way bound slider value. A `number` for single mode, or `[start, end]`
|
|
277
|
+
* for range mode. Updates on every interaction. Defaults to `0`.
|
|
278
|
+
*
|
|
279
|
+
* The two-way binding mints a `valueChange` output, which fires on every
|
|
280
|
+
* value mutation the user causes — each drag move and each key step, plus the
|
|
281
|
+
* commit. Note the slider differs from `tw-checkbox` / `tw-switch` /
|
|
282
|
+
* `tw-radio-group`, where the minted output is the *any-change* channel:
|
|
283
|
+
* here, a programmatic write from a bound form (`FormControl.setValue`,
|
|
284
|
+
* `ngModel`) reaches the rendered value through the CVA path without passing
|
|
285
|
+
* through this model, so it does **not** emit `valueChange`. To observe
|
|
286
|
+
* programmatic writes, use the form control's own `valueChanges`.
|
|
287
|
+
*
|
|
288
|
+
* For the two user-gesture channels, prefer `(input)` for live feedback and
|
|
289
|
+
* `(change)` for commit — see their docs below.
|
|
290
|
+
*/
|
|
244
291
|
value = model(0, /* @ts-ignore */
|
|
245
292
|
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
246
|
-
/**
|
|
293
|
+
/**
|
|
294
|
+
* Fires continuously while the user drags or holds a key — the *live* channel,
|
|
295
|
+
* for previewing a value that is not yet committed. Payload matches the
|
|
296
|
+
* current `value`. Template event name is `input` — the TS-side identifier is
|
|
297
|
+
* `valueInput` to avoid shadowing the imported `input` factory. Never fires
|
|
298
|
+
* for a programmatic write.
|
|
299
|
+
*/
|
|
247
300
|
valueInput = output({ alias: 'input' });
|
|
248
|
-
/**
|
|
301
|
+
/**
|
|
302
|
+
* Fires when the user commits a change (pointer release, key release, or blur
|
|
303
|
+
* after keyboard change) — the *commit* channel, for saving or querying on a
|
|
304
|
+
* settled value. Payload matches the current `value`. Never fires for a
|
|
305
|
+
* programmatic write; use `(input)` if you need every intermediate value.
|
|
306
|
+
*/
|
|
249
307
|
change = output();
|
|
250
308
|
/** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the component uses the `TW_ERROR_STATE_MATCHER` token's value. */
|
|
251
309
|
errorStateMatcher = input(undefined, /* @ts-ignore */
|
|
@@ -255,26 +313,8 @@ class SliderComponent {
|
|
|
255
313
|
destroyRef = inject(DestroyRef);
|
|
256
314
|
directionality = inject(Directionality, { optional: true });
|
|
257
315
|
ngControl = inject(NgControl, { optional: true, self: true });
|
|
258
|
-
parentForm = inject(NgForm, { optional: true });
|
|
259
|
-
parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
260
|
-
defaultMatcher = inject(TW_ERROR_STATE_MATCHER);
|
|
261
|
-
_ngControlRev = signal(0, /* @ts-ignore */
|
|
262
|
-
...(ngDevMode ? [{ debugName: "_ngControlRev" }] : /* istanbul ignore next */ []));
|
|
263
|
-
_formSubmitRev = signal(0, /* @ts-ignore */
|
|
264
|
-
...(ngDevMode ? [{ debugName: "_formSubmitRev" }] : /* istanbul ignore next */ []));
|
|
265
316
|
/** Whether the form control is in an error state per the configured `ErrorStateMatcher`. */
|
|
266
|
-
errorState =
|
|
267
|
-
this._ngControlRev();
|
|
268
|
-
this._formSubmitRev();
|
|
269
|
-
// Read focus so blur-driven `touched` transitions repaint the error
|
|
270
|
-
// border even when the underlying control's status/value didn't change.
|
|
271
|
-
this.focusedThumb();
|
|
272
|
-
const matcher = this.errorStateMatcher() ?? this.defaultMatcher;
|
|
273
|
-
const form = this.parentFormGroup ??
|
|
274
|
-
this.parentForm;
|
|
275
|
-
return matcher.isErrorState(this.ngControl?.control ?? null, form);
|
|
276
|
-
}, /* @ts-ignore */
|
|
277
|
-
...(ngDevMode ? [{ debugName: "errorState" }] : /* istanbul ignore next */ []));
|
|
317
|
+
errorState = this.errorWiring.errorState;
|
|
278
318
|
region = viewChild.required('region', /* @ts-ignore */
|
|
279
319
|
...(ngDevMode ? [{ debugName: "region" }] : /* istanbul ignore next */ []));
|
|
280
320
|
startThumb = viewChild('startThumb', /* @ts-ignore */
|
|
@@ -304,7 +344,16 @@ class SliderComponent {
|
|
|
304
344
|
...(ngDevMode ? [{ debugName: "internalStart" }] : /* istanbul ignore next */ []));
|
|
305
345
|
internalEnd = linkedSignal(() => toRange(this.value())[1], /* @ts-ignore */
|
|
306
346
|
...(ngDevMode ? [{ debugName: "internalEnd" }] : /* istanbul ignore next */ []));
|
|
307
|
-
|
|
347
|
+
// `min()` is read untracked deliberately. It is only the fallback for a
|
|
348
|
+
// non-numeric `value`, but tracking it made a bounds change re-run this
|
|
349
|
+
// computation — and `writeValue()` sets this signal directly without ever
|
|
350
|
+
// writing the `value` model, so the re-derivation recomputed from a model the
|
|
351
|
+
// CVA write never updated and silently discarded the written value. A
|
|
352
|
+
// reactive-forms slider whose `min` moved lost its value and snapped to the
|
|
353
|
+
// new bound. Clamping is unaffected: `singleValue` clamps on read, so a
|
|
354
|
+
// bounds change still constrains what is displayed and emitted — it just no
|
|
355
|
+
// longer destroys what was stored.
|
|
356
|
+
internalSingle = linkedSignal(() => toNumber(this.value(), untracked(() => this.min())), /* @ts-ignore */
|
|
308
357
|
...(ngDevMode ? [{ debugName: "internalSingle" }] : /* istanbul ignore next */ []));
|
|
309
358
|
/** @internal Which thumb currently has an active pointer gesture (or null). Bound in the template to drive the pressed-thumb styling. */
|
|
310
359
|
activeThumb = signal(null, /* @ts-ignore */
|
|
@@ -876,21 +925,7 @@ class SliderComponent {
|
|
|
876
925
|
// changes or the parent form is submitted. `ngOnInit` is the natural
|
|
877
926
|
// mount point — by here, the parent `FormControl*` directive's
|
|
878
927
|
// `ngOnChanges` has already populated `ngControl.control`.
|
|
879
|
-
|
|
880
|
-
if (ctrl) {
|
|
881
|
-
const streams = [ctrl.statusChanges, ctrl.valueChanges].filter((s) => !!s);
|
|
882
|
-
if (streams.length) {
|
|
883
|
-
merge(...streams)
|
|
884
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
885
|
-
.subscribe(() => this._ngControlRev.update((v) => v + 1));
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
const submit = this.parentFormGroup?.ngSubmit ?? this.parentForm?.ngSubmit;
|
|
889
|
-
if (submit) {
|
|
890
|
-
submit
|
|
891
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
892
|
-
.subscribe(() => this._formSubmitRev.update((v) => v + 1));
|
|
893
|
-
}
|
|
928
|
+
this.errorWiring.connect();
|
|
894
929
|
this.destroyRef.onDestroy(() => {
|
|
895
930
|
this.focusMonitor.stopMonitoring(this.elementRef);
|
|
896
931
|
for (const { target } of this.capturedPointers.values()) {
|
|
@@ -902,7 +937,7 @@ class SliderComponent {
|
|
|
902
937
|
});
|
|
903
938
|
}
|
|
904
939
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
905
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SliderComponent, isStandalone: true, selector: "tw-slider", inputs: {
|
|
940
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SliderComponent, isStandalone: true, selector: "tw-slider", inputs: { minInput: { classPropertyName: "minInput", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, maxInput: { classPropertyName: "maxInput", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, requiredInput: { classPropertyName: "requiredInput", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, marks: { classPropertyName: "marks", publicName: "marks", isSignal: true, isRequired: false, transformFunction: null }, showMarkLabels: { classPropertyName: "showMarkLabels", publicName: "showMarkLabels", isSignal: true, isRequired: false, transformFunction: null }, showMinMax: { classPropertyName: "showMinMax", publicName: "showMinMax", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, valueFormatter: { classPropertyName: "valueFormatter", publicName: "valueFormatter", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", 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 }, ariaLabelStart: { classPropertyName: "ariaLabelStart", publicName: "ariaLabelStart", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelEnd: { classPropertyName: "ariaLabelEnd", publicName: "ariaLabelEnd", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", valueInput: "input", change: "change" }, host: { properties: { "class": "rootClasses()", "attr.data-disabled": "isDisabled() || null" } }, viewQueries: [{ propertyName: "region", first: true, predicate: ["region"], descendants: true, isSignal: true }, { propertyName: "startThumb", first: true, predicate: ["startThumb"], descendants: true, isSignal: true }, { propertyName: "endThumb", first: true, predicate: ["endThumb"], descendants: true, isSignal: true }, { propertyName: "singleThumb", first: true, predicate: ["singleThumb"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
906
941
|
@if (hasHeader()) {
|
|
907
942
|
<div [class]="headerClasses()">
|
|
908
943
|
@if (label(); as lbl) {
|
|
@@ -1213,7 +1248,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
1213
1248
|
'[attr.data-disabled]': 'isDisabled() || null',
|
|
1214
1249
|
},
|
|
1215
1250
|
}]
|
|
1216
|
-
}], ctorParameters: () => [], propDecorators: {
|
|
1251
|
+
}], ctorParameters: () => [], propDecorators: { minInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], maxInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], requiredInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], range: [{ type: i0.Input, args: [{ isSignal: true, alias: "range", required: false }] }], marks: [{ type: i0.Input, args: [{ isSignal: true, alias: "marks", required: false }] }], showMarkLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showMarkLabels", required: false }] }], showMinMax: [{ type: i0.Input, args: [{ isSignal: true, alias: "showMinMax", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], valueFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueFormatter", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], ariaLabelStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelStart", required: false }] }], ariaLabelEnd: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelEnd", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], valueInput: [{ type: i0.Output, args: ["input"] }], change: [{ type: i0.Output, args: ["change"] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], region: [{ type: i0.ViewChild, args: ['region', { isSignal: true }] }], startThumb: [{ type: i0.ViewChild, args: ['startThumb', { isSignal: true }] }], endThumb: [{ type: i0.ViewChild, args: ['endThumb', { isSignal: true }] }], singleThumb: [{ type: i0.ViewChild, args: ['singleThumb', { isSignal: true }] }] } });
|
|
1217
1252
|
|
|
1218
1253
|
/**
|
|
1219
1254
|
* Generated bundle index. Do not edit.
|