fold-ng 0.5.1 → 0.5.2

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/CHANGELOG.md CHANGED
@@ -8,6 +8,34 @@ All notable changes to **fold-ng** are documented here. The format follows
8
8
 
9
9
  _Nothing yet._
10
10
 
11
+ ## [0.5.2] - 2026-07-27
12
+
13
+ ### Added
14
+
15
+ - **`fold-listbox` gains a `selectionChange: T` output** — fires when the user
16
+ picks an option, carrying the chosen value and **never `null`**. Use it for
17
+ the common "do X on selection" case to skip the `T | null` narrowing that
18
+ `[(value)]` / `valueChange` force on every handler. Clearing the value (the ×
19
+ affordance) does not fire it — observe `value` / `valueChange` for that.
20
+ - **`fold-range-slider` gains a `rangeChange: FoldRangeValue` output** — the same
21
+ ergonomics for ranges: fires on a thumb drag with the resolved `{ min, max }`,
22
+ never `undefined`.
23
+
24
+ ### Changed
25
+
26
+ - **`fold-card` `separators` / `raisedBands` accept a boolean shorthand.** On top
27
+ of the `FoldCardBandChrome` enum (`none`/`header`/`footer`/`both`), a bare
28
+ attribute (`<fold-card separators>`) or `[separators]="true"` now means `both`,
29
+ and `false` means `none` — the idiomatic Angular boolean-attribute ergonomics,
30
+ while the enum stays for per-band control. Exposes `foldCardBandChrome` (the
31
+ coercion fn) and `FoldCardBandChromeInput`.
32
+ - **`pnpm release` gates the full suite (incl. `test:e2e`) locally before
33
+ tagging.** Release tags are protected/immutable, so a tag pushed for a build
34
+ that then fails CI burns that version number (how `0.5.0` was lost). The
35
+ release script now runs `lint · tsc · strictTemplates · vitest · test:e2e`
36
+ (installing Chromium first) up front — a red build aborts with nothing bumped
37
+ or tagged.
38
+
11
39
  ## [0.5.1] - 2026-07-27
12
40
 
13
41
  First published 0.5.x — same tree as the (unpublished, e2e-gated) v0.5.0 tag with the release e2e locator scoped to the first control.
@@ -505,7 +533,8 @@ design-token stylesheet.
505
533
  `currentColor`; `prefers-reduced-motion` + `forced-colors` are respected;
506
534
  strings localise via inputs / providers (`provideFoldPanelLabels`).
507
535
 
508
- [unreleased]: https://github.com/hugoheynard/fold-ng/compare/v0.5.1...HEAD
536
+ [unreleased]: https://github.com/hugoheynard/fold-ng/compare/v0.5.2...HEAD
537
+ [0.5.2]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.5.2
509
538
  [0.5.1]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.5.1
510
539
  [0.5.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.5.0
511
540
  [0.4.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.4.0
@@ -2456,6 +2456,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2456
2456
  args: [{ selector: "fold-inline-confirm", standalone: true, imports: [FoldButtonComponent, FoldButtonIconComponent, FoldInputComponent], host: { "[class.is-open]": "open()" }, template: "@if (!open()) {\n <!-- Idle: the host's projected trigger. A click anywhere in it starts the\n flow; the trigger itself stays a real focusable control (button / anchor),\n so keyboard activation is native (Enter/Space \u2192 click) \u2014 no extra\n role/tabindex, and no keydown handler that would double-fire. -->\n <span #triggerWrap class=\"fic-trigger\" (click)=\"activate()\">\n <ng-content />\n </span>\n} @else {\n <div\n #groupEl\n class=\"fic-confirm\"\n role=\"group\"\n [attr.aria-label]=\"l().group\"\n (keydown.escape)=\"cancel(); $event.stopPropagation()\"\n >\n @if (message(); as text) {\n <p class=\"fic-message\" [id]=\"msgId\">{{ text }}</p>\n }\n\n @if (needsInput()) {\n <fold-input\n class=\"fic-field\"\n [label]=\"prompt()\"\n [type]=\"fieldType()\"\n [size]=\"size() === 'lg' ? 'lg' : 'sm'\"\n [placeholder]=\"placeholder() ?? ''\"\n [autocomplete]=\"password() ? 'current-password' : 'off'\"\n [(value)]=\"typed\"\n (keydown.enter)=\"confirm()\"\n />\n }\n\n <div class=\"fic-actions\">\n <button\n foldButton\n emphasis=\"solid\"\n [intent]=\"intent()\"\n [size]=\"size()\"\n [icon]=\"confirmIcon()\"\n [disabled]=\"!canConfirm()\"\n [attr.aria-describedby]=\"message() ? msgId : null\"\n (click)=\"confirm()\"\n >\n {{ loading() ? l().busy : l().confirm }}\n </button>\n\n @if (cancelIcon(); as icon) {\n <fold-button-icon\n [icon]=\"icon\"\n tone=\"ghost\"\n [size]=\"size()\"\n [disabled]=\"loading()\"\n [tooltip]=\"l().cancelAria\"\n (clicked)=\"cancel()\"\n />\n } @else {\n <button\n foldButton\n emphasis=\"soft\"\n intent=\"neutral\"\n [size]=\"size()\"\n [disabled]=\"loading()\"\n (click)=\"cancel()\"\n >\n {{ l().cancel }}\n </button>\n }\n </div>\n </div>\n}\n", styles: [":host{display:inline-flex;align-items:center;min-width:0}.fic-trigger{display:contents}.fic-confirm{display:inline-flex;flex-direction:column;gap:var(--fold-space-sm);min-width:0;animation:fic-in var(--fold-motion-fast)}.fic-message{margin:0;font-size:var(--fold-text-xs);line-height:1.5;color:var(--fold-color-text-secondary)}.fic-field{display:block;width:15rem;max-width:100%}.fic-actions{display:inline-flex;align-items:center;gap:var(--fold-space-xs)}@keyframes fic-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.fic-confirm{animation:none}}\n"] }]
2457
2457
  }], ctorParameters: () => [], propDecorators: { intent: [{ type: i0.Input, args: [{ isSignal: true, alias: "intent", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], match: [{ type: i0.Input, args: [{ isSignal: true, alias: "match", required: false }] }], password: [{ type: i0.Input, args: [{ isSignal: true, alias: "password", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], confirmIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmIcon", required: false }] }], cancelIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelIcon", required: false }] }], keepOpenOnConfirm: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepOpenOnConfirm", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], confirmed: [{ type: i0.Output, args: ["confirmed"] }], cancelled: [{ type: i0.Output, args: ["cancelled"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], triggerEl: [{ type: i0.ViewChild, args: ["triggerWrap", { isSignal: true }] }], groupEl: [{ type: i0.ViewChild, args: ["groupEl", { isSignal: true }] }] } });
2458
2458
 
2459
+ /** Coerce the band-chrome shorthand: bare attribute / `true` → `"both"`,
2460
+ * `false` → `"none"`, an explicit enum value passes through unchanged. */
2461
+ function foldCardBandChrome(value) {
2462
+ if (value === "" || value === true) {
2463
+ return "both";
2464
+ }
2465
+ if (value === false) {
2466
+ return "none";
2467
+ }
2468
+ return value;
2469
+ }
2459
2470
  /**
2460
2471
  * `<fold-card>` — the canonical raised content surface: a solid
2461
2472
  * `surface-card` background, a hairline border and a consistent radius. Use it
@@ -2543,13 +2554,13 @@ class FoldCardComponent {
2543
2554
  ariaLabel = input(/* @ts-ignore */
2544
2555
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
2545
2556
  /** Which bands get a hairline against the body — `none` (default), `header`,
2546
- * `footer`, or `both`. */
2547
- separators = input("none", /* @ts-ignore */
2548
- ...(ngDevMode ? [{ debugName: "separators" }] : /* istanbul ignore next */ []));
2557
+ * `footer`, or `both`. Accepts a boolean shorthand: a bare `separators` (or
2558
+ * `[separators]="true"`) means `both`; `false` means `none`. */
2559
+ separators = input("none", { ...(ngDevMode ? { debugName: "separators" } : /* istanbul ignore next */ {}), transform: foldCardBandChrome });
2549
2560
  /** Which bands are lifted with a subtle raised tint over the card surface
2550
- * (fainter on `sunken`) — `none` (default), `header`, `footer`, or `both`. */
2551
- raisedBands = input("none", /* @ts-ignore */
2552
- ...(ngDevMode ? [{ debugName: "raisedBands" }] : /* istanbul ignore next */ []));
2561
+ * (fainter on `sunken`) — `none` (default), `header`, `footer`, or `both`.
2562
+ * Accepts the same boolean shorthand as {@link separators}. */
2563
+ raisedBands = input("none", { ...(ngDevMode ? { debugName: "raisedBands" } : /* istanbul ignore next */ {}), transform: foldCardBandChrome });
2553
2564
  /** Fires when an `interactive` card is activated (click, Enter, or Space). */
2554
2565
  activated = output();
2555
2566
  /** Whether a per-band chrome value applies to the given band. */
@@ -5622,6 +5633,12 @@ class FoldListboxComponent {
5622
5633
  /** Two-way open state of the popup. */
5623
5634
  open = model(false, /* @ts-ignore */
5624
5635
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
5636
+ /** Fires when the **user picks an option** — carries the chosen value, never
5637
+ * `null`. Use it for the common "do X on selection" case to skip the
5638
+ * `T | null` narrowing that `[(value)]` / `valueChange` require. Clearing the
5639
+ * value (the × button) does **not** fire this; observe `value`/`valueChange`
5640
+ * for that. */
5641
+ selectionChange = output();
5625
5642
  /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
5626
5643
  size = input("md", /* @ts-ignore */
5627
5644
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
@@ -5815,12 +5832,14 @@ class FoldListboxComponent {
5815
5832
  }
5816
5833
  }
5817
5834
  commit(option) {
5818
- this.value.set(option.value());
5835
+ const picked = option.value();
5836
+ this.value.set(picked);
5837
+ this.selectionChange.emit(picked);
5819
5838
  this.touched.set(true);
5820
5839
  this.open.set(false);
5821
5840
  }
5822
5841
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: FoldListboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5823
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: FoldListboxComponent, isStandalone: true, selector: "fold-listbox", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", 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 }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, optional: { classPropertyName: "optional", publicName: "optional", isSignal: true, isRequired: false, transformFunction: null }, optionalLabel: { classPropertyName: "optionalLabel", publicName: "optionalLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, allowClear: { classPropertyName: "allowClear", publicName: "allowClear", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange", open: "openChange" }, host: { properties: { "class": "size() + \" \" + variant()" } }, providers: [
5842
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: FoldListboxComponent, isStandalone: true, selector: "fold-listbox", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", 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 }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, optional: { classPropertyName: "optional", publicName: "optional", isSignal: true, isRequired: false, transformFunction: null }, optionalLabel: { classPropertyName: "optionalLabel", publicName: "optionalLabel", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, allowClear: { classPropertyName: "allowClear", publicName: "allowClear", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange", open: "openChange", selectionChange: "selectionChange" }, host: { properties: { "class": "size() + \" \" + variant()" } }, providers: [
5824
5843
  { provide: FOLD_LISTBOX_OWNER, useExisting: FoldListboxComponent },
5825
5844
  ], queries: [{ propertyName: "optionTemplate", first: true, predicate: ["option"], descendants: true, isSignal: true }, { propertyName: "projectedOptions", predicate: FoldOptionComponent, isSignal: true }], viewQueries: [{ propertyName: "renderedOptions", predicate: FoldOptionComponent, descendants: true, isSignal: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }], ngImport: i0, template: "<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <fold-popover\n [(open)]=\"open\"\n [autoFocus]=\"false\"\n [ariaControls]=\"listId\"\n [placement]=\"placement()\"\n [fallbackPlacements]=\"['top-start', 'bottom-end', 'top-end']\"\n >\n <div class=\"lb-field\">\n <button\n type=\"button\"\n class=\"lb-trigger\"\n [class.has-clear]=\"showClear()\"\n [id]=\"inputId\"\n foldPopoverTrigger=\"listbox\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (selectedLabel(); as lbl) {\n <span class=\"lb-value\">{{ lbl }}</span>\n } @else {\n <span class=\"lb-placeholder\">{{ placeholder() }}</span>\n }\n <fold-icon\n name=\"chevron-down\"\n size=\"sm\"\n class=\"lb-caret\"\n aria-hidden=\"true\"\n />\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"lb-clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear($event)\"\n >\n <fold-icon name=\"close\" size=\"sm\" aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <div\n #list\n foldPopoverPanel\n class=\"lb-list\"\n role=\"listbox\"\n tabindex=\"-1\"\n [id]=\"listId\"\n [attr.aria-label]=\"label()\"\n [attr.aria-activedescendant]=\"activeId()\"\n (keydown)=\"onListKeydown($event)\"\n (click)=\"onListClick($event)\"\n (pointermove)=\"onListPointermove($event)\"\n >\n @if (options(); as opts) {\n @for (o of opts; track o.value) {\n <fold-option [value]=\"o.value\" [disabled]=\"o.disabled ?? false\">\n @if (optionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: o }\"\n />\n } @else {\n {{ o.label }}\n }\n </fold-option>\n }\n } @else {\n <ng-content />\n }\n </div>\n </fold-popover>\n</fold-input-base>\n", styles: [":host{display:block}.lb-trigger{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:.5rem;width:100%;font-family:inherit;color:var(--fold-color-text);background:var(--fold-color-surface-card);border:1px solid var(--fold-color-border-subtle);cursor:pointer;transition:border-color var(--fold-motion-fast),box-shadow var(--fold-motion-fast)}@media(prefers-reduced-motion:reduce){.lb-trigger{transition:none}}.lb-trigger:hover:not(:disabled){border-color:var(--fold-color-border)}.lb-trigger:focus-visible{border-color:var(--fold-color-primary);box-shadow:0 0 0 2px var(--fold-color-primary-border)}.lb-trigger:disabled{opacity:.4;cursor:not-allowed}.lb-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lb-placeholder{color:var(--fold-color-text-faded)}.lb-caret{margin-inline-start:auto;color:var(--fold-color-text-muted)}.lb-field{position:relative}.lb-trigger.has-clear .lb-caret{visibility:hidden}.lb-clear{all:unset;position:absolute;inset-inline-end:.4rem;top:50%;transform:translateY(-50%);display:grid;place-items:center;padding:.15rem;border-radius:var(--fold-radius-xs);color:var(--fold-color-text-muted);cursor:pointer}.lb-clear:hover,.lb-clear:focus-visible{color:var(--fold-color-text);background:var(--fold-color-surface-hover)}:host(.sm) .lb-trigger{height:1.75rem;font-size:var(--fold-text-sm);padding:.25rem .5rem;border-radius:var(--fold-radius-xs)}:host(.md) .lb-trigger{height:2.25rem;font-size:var(--fold-text-md);padding:.4rem .65rem;border-radius:var(--fold-radius-sm)}:host(.lg) .lb-trigger{height:2.75rem;font-size:var(--fold-text-lg);padding:.5rem .75rem;border-radius:var(--fold-radius-sm)}:host(.panel) .lb-trigger{height:auto;padding:7px 10px;border-radius:var(--fold-radius-sm);background:var(--fold-color-surface-raised)}:host(.panel) .lb-trigger:focus-visible{box-shadow:none}.lb-list{display:flex;flex-direction:column;gap:1px;min-width:var(--fold-popover-anchor-width, 11rem);outline:none}\n"], dependencies: [{ kind: "component", type: FoldInputBaseComponent, selector: "fold-input-base", inputs: ["label", "for", "required", "optional", "optionalLabel", "hint", "error"] }, { kind: "component", type: FoldIconComponent, selector: "fold-icon", inputs: ["name", "size", "title"] }, { kind: "component", type: FoldOptionComponent, selector: "fold-option", inputs: ["value", "disabled"] }, { kind: "component", type: FoldPopoverComponent, selector: "fold-popover", inputs: ["placement", "fallbackPlacements", "offset", "padding", "autoFocus", "arrow", "open", "ariaControls"], outputs: ["openChange"] }, { kind: "directive", type: FoldPopoverTriggerDirective, selector: "[foldPopoverTrigger]", inputs: ["foldPopoverTrigger"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
5826
5845
  }
@@ -5836,7 +5855,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
5836
5855
  ], host: { "[class]": 'size() + " " + variant()' }, providers: [
5837
5856
  { provide: FOLD_LISTBOX_OWNER, useExisting: FoldListboxComponent },
5838
5857
  ], template: "<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <fold-popover\n [(open)]=\"open\"\n [autoFocus]=\"false\"\n [ariaControls]=\"listId\"\n [placement]=\"placement()\"\n [fallbackPlacements]=\"['top-start', 'bottom-end', 'top-end']\"\n >\n <div class=\"lb-field\">\n <button\n type=\"button\"\n class=\"lb-trigger\"\n [class.has-clear]=\"showClear()\"\n [id]=\"inputId\"\n foldPopoverTrigger=\"listbox\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (selectedLabel(); as lbl) {\n <span class=\"lb-value\">{{ lbl }}</span>\n } @else {\n <span class=\"lb-placeholder\">{{ placeholder() }}</span>\n }\n <fold-icon\n name=\"chevron-down\"\n size=\"sm\"\n class=\"lb-caret\"\n aria-hidden=\"true\"\n />\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"lb-clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear($event)\"\n >\n <fold-icon name=\"close\" size=\"sm\" aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <div\n #list\n foldPopoverPanel\n class=\"lb-list\"\n role=\"listbox\"\n tabindex=\"-1\"\n [id]=\"listId\"\n [attr.aria-label]=\"label()\"\n [attr.aria-activedescendant]=\"activeId()\"\n (keydown)=\"onListKeydown($event)\"\n (click)=\"onListClick($event)\"\n (pointermove)=\"onListPointermove($event)\"\n >\n @if (options(); as opts) {\n @for (o of opts; track o.value) {\n <fold-option [value]=\"o.value\" [disabled]=\"o.disabled ?? false\">\n @if (optionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: o }\"\n />\n } @else {\n {{ o.label }}\n }\n </fold-option>\n }\n } @else {\n <ng-content />\n }\n </div>\n </fold-popover>\n</fold-input-base>\n", styles: [":host{display:block}.lb-trigger{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:.5rem;width:100%;font-family:inherit;color:var(--fold-color-text);background:var(--fold-color-surface-card);border:1px solid var(--fold-color-border-subtle);cursor:pointer;transition:border-color var(--fold-motion-fast),box-shadow var(--fold-motion-fast)}@media(prefers-reduced-motion:reduce){.lb-trigger{transition:none}}.lb-trigger:hover:not(:disabled){border-color:var(--fold-color-border)}.lb-trigger:focus-visible{border-color:var(--fold-color-primary);box-shadow:0 0 0 2px var(--fold-color-primary-border)}.lb-trigger:disabled{opacity:.4;cursor:not-allowed}.lb-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lb-placeholder{color:var(--fold-color-text-faded)}.lb-caret{margin-inline-start:auto;color:var(--fold-color-text-muted)}.lb-field{position:relative}.lb-trigger.has-clear .lb-caret{visibility:hidden}.lb-clear{all:unset;position:absolute;inset-inline-end:.4rem;top:50%;transform:translateY(-50%);display:grid;place-items:center;padding:.15rem;border-radius:var(--fold-radius-xs);color:var(--fold-color-text-muted);cursor:pointer}.lb-clear:hover,.lb-clear:focus-visible{color:var(--fold-color-text);background:var(--fold-color-surface-hover)}:host(.sm) .lb-trigger{height:1.75rem;font-size:var(--fold-text-sm);padding:.25rem .5rem;border-radius:var(--fold-radius-xs)}:host(.md) .lb-trigger{height:2.25rem;font-size:var(--fold-text-md);padding:.4rem .65rem;border-radius:var(--fold-radius-sm)}:host(.lg) .lb-trigger{height:2.75rem;font-size:var(--fold-text-lg);padding:.5rem .75rem;border-radius:var(--fold-radius-sm)}:host(.panel) .lb-trigger{height:auto;padding:7px 10px;border-radius:var(--fold-radius-sm);background:var(--fold-color-surface-raised)}:host(.panel) .lb-trigger:focus-visible{box-shadow:none}.lb-list{display:flex;flex-direction:column;gap:1px;min-width:var(--fold-popover-anchor-width, 11rem);outline:none}\n"] }]
5839
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], optional: [{ type: i0.Input, args: [{ isSignal: true, alias: "optional", required: false }] }], optionalLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionalLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], allowClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowClear", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], optionTemplate: [{ type: i0.ContentChild, args: ["option", { isSignal: true }] }], projectedOptions: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FoldOptionComponent), { isSignal: true }] }], renderedOptions: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => FoldOptionComponent), { isSignal: true }] }], list: [{ type: i0.ViewChild, args: ["list", { isSignal: true }] }] } });
5858
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], optional: [{ type: i0.Input, args: [{ isSignal: true, alias: "optional", required: false }] }], optionalLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionalLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], allowClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowClear", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], optionTemplate: [{ type: i0.ContentChild, args: ["option", { isSignal: true }] }], projectedOptions: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FoldOptionComponent), { isSignal: true }] }], renderedOptions: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => FoldOptionComponent), { isSignal: true }] }], list: [{ type: i0.ViewChild, args: ["list", { isSignal: true }] }] } });
5840
5859
 
5841
5860
  /** Labels beyond this count collapse to a "+N" tail on the trigger summary. */
5842
5861
  const SUMMARY_MAX = 3;
@@ -6470,6 +6489,11 @@ class FoldRangeSliderComponent {
6470
6489
  * A `model()`, so `[(value)]` and `(valueChange)` both work. */
6471
6490
  value = model(undefined, /* @ts-ignore */
6472
6491
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
6492
+ /** Fires when the **user drags a thumb** — carries the resolved `{ min, max }`,
6493
+ * never `undefined`. Use it for the common "filter on change" case to skip the
6494
+ * `FoldRangeValue | undefined` narrowing that `[(value)]` / `valueChange`
6495
+ * require. */
6496
+ rangeChange = output();
6473
6497
  /** How the values are formatted for display + `aria-valuetext`. @default 'number' */
6474
6498
  unit = input("number", /* @ts-ignore */
6475
6499
  ...(ngDevMode ? [{ debugName: "unit" }] : /* istanbul ignore next */ []));
@@ -6510,25 +6534,29 @@ class FoldRangeSliderComponent {
6510
6534
  }
6511
6535
  onMinChange(event) {
6512
6536
  const val = Number(readInputValue(event));
6513
- this.value.set({
6537
+ this.commit({
6514
6538
  min: Math.min(val, this.currentMax()),
6515
6539
  max: this.currentMax(),
6516
6540
  });
6517
6541
  }
6518
6542
  onMaxChange(event) {
6519
6543
  const val = Number(readInputValue(event));
6520
- this.value.set({
6544
+ this.commit({
6521
6545
  min: this.currentMin(),
6522
6546
  max: Math.max(val, this.currentMin()),
6523
6547
  });
6524
6548
  }
6549
+ commit(next) {
6550
+ this.value.set(next);
6551
+ this.rangeChange.emit(next);
6552
+ }
6525
6553
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: FoldRangeSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6526
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: FoldRangeSliderComponent, isStandalone: true, selector: "fold-range-slider", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, minLabel: { classPropertyName: "minLabel", publicName: "minLabel", isSignal: true, isRequired: false, transformFunction: null }, maxLabel: { classPropertyName: "maxLabel", publicName: "maxLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: "<div class=\"rs\" role=\"group\" [attr.aria-labelledby]=\"labelId\">\n <span class=\"rs-label\" [id]=\"labelId\">{{ label() }}</span>\n <div class=\"rs-track-wrap\">\n <div class=\"rs-track\">\n <div\n class=\"rs-fill\"\n [style.left.%]=\"fillLeft()\"\n [style.width.%]=\"fillWidth()\"\n ></div>\n </div>\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--min\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMin()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + minLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMin())\"\n (input)=\"onMinChange($event)\"\n />\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--max\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMax()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + maxLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMax())\"\n (input)=\"onMaxChange($event)\"\n />\n </div>\n <span class=\"rs-values\"\n >{{ formatValue(currentMin()) }} \u2013 {{ formatValue(currentMax()) }}</span\n >\n</div>\n", styles: [":host{display:block}.rs{display:flex;flex-direction:column;gap:var(--fold-space-xs)}.rs-label{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--fold-color-text-muted)}.rs-track-wrap{position:relative;height:20px}.rs-track{position:absolute;top:50%;left:0;right:0;height:4px;transform:translateY(-50%);background:var(--fold-color-border-subtle);border-radius:2px}.rs-fill{position:absolute;height:100%;background:var(--fold-color-primary);border-radius:2px}.rs-thumb{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;-webkit-appearance:none;appearance:none;background:transparent;pointer-events:none;outline:none}.rs-thumb::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--fold-color-primary);border:2px solid var(--fold-color-surface-card);cursor:pointer;pointer-events:auto;transition:transform var(--fold-motion-fast)}.rs-thumb::-webkit-slider-thumb:hover{transform:scale(1.2)}.rs-thumb::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--fold-color-primary);border:2px solid var(--fold-color-surface-card);cursor:pointer;pointer-events:auto}.rs-thumb:focus-visible{outline:none}.rs-thumb:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--fold-color-primary) 30%,transparent)}.rs-thumb:focus-visible::-moz-range-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--fold-color-primary) 30%,transparent)}@media(prefers-reduced-motion:reduce){.rs-thumb::-webkit-slider-thumb{transition:none}.rs-thumb::-webkit-slider-thumb:hover{transform:none}}@media(forced-colors:active){.rs-thumb::-webkit-slider-thumb{background:ButtonText;border-color:Canvas}.rs-thumb::-moz-range-thumb{background:ButtonText;border-color:Canvas}.rs-thumb:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 2px CanvasText}}.rs-thumb:disabled{cursor:not-allowed}.rs-track-wrap:has(.rs-thumb:disabled){opacity:.5}.rs-values{font-size:10px;font-weight:500;color:var(--fold-color-text-muted);text-align:center;font-variant-numeric:tabular-nums}\n"] });
6554
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: FoldRangeSliderComponent, isStandalone: true, selector: "fold-range-slider", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, minLabel: { classPropertyName: "minLabel", publicName: "minLabel", isSignal: true, isRequired: false, transformFunction: null }, maxLabel: { classPropertyName: "maxLabel", publicName: "maxLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", rangeChange: "rangeChange" }, ngImport: i0, template: "<div class=\"rs\" role=\"group\" [attr.aria-labelledby]=\"labelId\">\n <span class=\"rs-label\" [id]=\"labelId\">{{ label() }}</span>\n <div class=\"rs-track-wrap\">\n <div class=\"rs-track\">\n <div\n class=\"rs-fill\"\n [style.left.%]=\"fillLeft()\"\n [style.width.%]=\"fillWidth()\"\n ></div>\n </div>\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--min\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMin()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + minLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMin())\"\n (input)=\"onMinChange($event)\"\n />\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--max\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMax()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + maxLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMax())\"\n (input)=\"onMaxChange($event)\"\n />\n </div>\n <span class=\"rs-values\"\n >{{ formatValue(currentMin()) }} \u2013 {{ formatValue(currentMax()) }}</span\n >\n</div>\n", styles: [":host{display:block}.rs{display:flex;flex-direction:column;gap:var(--fold-space-xs)}.rs-label{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--fold-color-text-muted)}.rs-track-wrap{position:relative;height:20px}.rs-track{position:absolute;top:50%;left:0;right:0;height:4px;transform:translateY(-50%);background:var(--fold-color-border-subtle);border-radius:2px}.rs-fill{position:absolute;height:100%;background:var(--fold-color-primary);border-radius:2px}.rs-thumb{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;-webkit-appearance:none;appearance:none;background:transparent;pointer-events:none;outline:none}.rs-thumb::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--fold-color-primary);border:2px solid var(--fold-color-surface-card);cursor:pointer;pointer-events:auto;transition:transform var(--fold-motion-fast)}.rs-thumb::-webkit-slider-thumb:hover{transform:scale(1.2)}.rs-thumb::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--fold-color-primary);border:2px solid var(--fold-color-surface-card);cursor:pointer;pointer-events:auto}.rs-thumb:focus-visible{outline:none}.rs-thumb:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--fold-color-primary) 30%,transparent)}.rs-thumb:focus-visible::-moz-range-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--fold-color-primary) 30%,transparent)}@media(prefers-reduced-motion:reduce){.rs-thumb::-webkit-slider-thumb{transition:none}.rs-thumb::-webkit-slider-thumb:hover{transform:none}}@media(forced-colors:active){.rs-thumb::-webkit-slider-thumb{background:ButtonText;border-color:Canvas}.rs-thumb::-moz-range-thumb{background:ButtonText;border-color:Canvas}.rs-thumb:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 2px CanvasText}}.rs-thumb:disabled{cursor:not-allowed}.rs-track-wrap:has(.rs-thumb:disabled){opacity:.5}.rs-values{font-size:10px;font-weight:500;color:var(--fold-color-text-muted);text-align:center;font-variant-numeric:tabular-nums}\n"] });
6527
6555
  }
6528
6556
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: FoldRangeSliderComponent, decorators: [{
6529
6557
  type: Component,
6530
6558
  args: [{ selector: "fold-range-slider", standalone: true, template: "<div class=\"rs\" role=\"group\" [attr.aria-labelledby]=\"labelId\">\n <span class=\"rs-label\" [id]=\"labelId\">{{ label() }}</span>\n <div class=\"rs-track-wrap\">\n <div class=\"rs-track\">\n <div\n class=\"rs-fill\"\n [style.left.%]=\"fillLeft()\"\n [style.width.%]=\"fillWidth()\"\n ></div>\n </div>\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--min\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMin()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + minLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMin())\"\n (input)=\"onMinChange($event)\"\n />\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--max\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMax()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + maxLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMax())\"\n (input)=\"onMaxChange($event)\"\n />\n </div>\n <span class=\"rs-values\"\n >{{ formatValue(currentMin()) }} \u2013 {{ formatValue(currentMax()) }}</span\n >\n</div>\n", styles: [":host{display:block}.rs{display:flex;flex-direction:column;gap:var(--fold-space-xs)}.rs-label{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--fold-color-text-muted)}.rs-track-wrap{position:relative;height:20px}.rs-track{position:absolute;top:50%;left:0;right:0;height:4px;transform:translateY(-50%);background:var(--fold-color-border-subtle);border-radius:2px}.rs-fill{position:absolute;height:100%;background:var(--fold-color-primary);border-radius:2px}.rs-thumb{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;-webkit-appearance:none;appearance:none;background:transparent;pointer-events:none;outline:none}.rs-thumb::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--fold-color-primary);border:2px solid var(--fold-color-surface-card);cursor:pointer;pointer-events:auto;transition:transform var(--fold-motion-fast)}.rs-thumb::-webkit-slider-thumb:hover{transform:scale(1.2)}.rs-thumb::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--fold-color-primary);border:2px solid var(--fold-color-surface-card);cursor:pointer;pointer-events:auto}.rs-thumb:focus-visible{outline:none}.rs-thumb:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--fold-color-primary) 30%,transparent)}.rs-thumb:focus-visible::-moz-range-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--fold-color-primary) 30%,transparent)}@media(prefers-reduced-motion:reduce){.rs-thumb::-webkit-slider-thumb{transition:none}.rs-thumb::-webkit-slider-thumb:hover{transform:none}}@media(forced-colors:active){.rs-thumb::-webkit-slider-thumb{background:ButtonText;border-color:Canvas}.rs-thumb::-moz-range-thumb{background:ButtonText;border-color:Canvas}.rs-thumb:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 2px CanvasText}}.rs-thumb:disabled{cursor:not-allowed}.rs-track-wrap:has(.rs-thumb:disabled){opacity:.5}.rs-values{font-size:10px;font-weight:500;color:var(--fold-color-text-muted);text-align:center;font-variant-numeric:tabular-nums}\n"] }]
6531
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], unit: [{ type: i0.Input, args: [{ isSignal: true, alias: "unit", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], minLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLabel", required: false }] }], maxLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLabel", required: false }] }] } });
6559
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], rangeChange: [{ type: i0.Output, args: ["rangeChange"] }], unit: [{ type: i0.Input, args: [{ isSignal: true, alias: "unit", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], minLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLabel", required: false }] }], maxLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLabel", required: false }] }] } });
6532
6560
 
6533
6561
  /** Default glyph per variant — overridable with the `icon` input. */
6534
6562
  const DEFAULT_ICON = {
@@ -8819,5 +8847,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
8819
8847
  * Generated bundle index. Do not edit.
8820
8848
  */
8821
8849
 
8822
- export { FOLD_AUTO_PALETTES, FOLD_BLUR_TOKENS, FOLD_BUILTIN_ICONS, FOLD_DATA_TABLE_DEFAULT_LABELS, FOLD_DATA_TABLE_LABELS, FOLD_INLINE_CONFIRM_DEFAULT_LABELS, FOLD_INLINE_CONFIRM_LABELS, FOLD_MOTION_TOKENS, FOLD_PAGINATOR_DEFAULT_LABELS, FOLD_PAGINATOR_LABELS, FOLD_PALETTE_DEFAULT, FOLD_PANEL_CLOSE_LABEL, FOLD_RADIUS_TOKENS, FOLD_SEMANTIC_COLOR_TOKENS, FOLD_SHADOW_TOKENS, FOLD_SPACE_TOKENS, FOLD_TEXT_TOKENS, FOLD_TOAST_CONFIG, FoldAppShellComponent, FoldAsideLayoutComponent, FoldAvatarComponent, FoldAvatarDetailComponent, FoldAvatarListComponent, FoldBadgeComponent, FoldButtonComponent, FoldButtonIconComponent, FoldCalloutComponent, FoldCardComponent, FoldCheckboxComponent, FoldChoiceRowComponent, FoldContextCardComponent, FoldDataTableCellDirective, FoldDataTableComponent, FoldDataTableRowCardDirective, FoldDisclosureComponent, FoldDropdownComponent, FoldDropdownItemComponent, FoldElementTitleComponent, FoldElevatedDirective, FoldEmptyStateComponent, FoldFieldComponent, FoldFieldIdDirective, FoldFieldListComponent, FoldFileDropzoneComponent, FoldHeroCardComponent, FoldHeroSectionComponent, FoldIconComponent, FoldIconRegistry, FoldIdService, FoldInlineConfirmComponent, FoldInputComponent, FoldLinkComponent, FoldListboxComponent, FoldLoadingStateComponent, FoldMenuComponent, FoldMenuItemComponent, FoldMenuSectionComponent, FoldMenuSeparatorComponent, FoldMultiselectComponent, FoldNavLauncherComponent, FoldNavLayoutComponent, FoldNavTileComponent, FoldNumberInputComponent, FoldOptionComponent, FoldPageLayoutComponent, FoldPageSectionComponent, FoldPageTitleDirective, FoldPaginatorComponent, FoldPaletteRegistry, FoldPanelComponentOutletDirective, FoldPanelHeaderComponent, FoldPanelHostComponent, FoldPanelHostService, FoldPanelRef, FoldPanelToggle, FoldPasswordFieldComponent, FoldPopoverComponent, FoldPopoverTriggerDirective, FoldRangeSliderComponent, FoldRepeatPressDirective, FoldSearchComponent, FoldSelectComponent, FoldSliderComponent, FoldSpinnerComponent, FoldStatusBadgeComponent, FoldStickyColumnDirective, FoldSurfaceDirective, FoldTabPanelComponent, FoldTabsComponent, FoldTimelineComponent, FoldToastComponent, FoldToastContainerComponent, FoldToastService, FoldToggleIconComponent, FoldViewNavComponent, FoldViewToggleComponent, autoUpdate, computePlacement, foldBlurVar, foldColorProperty, foldColorVar, foldDefaultPasswordRules, foldHashSeed, foldMotionVar, foldRadiusVar, foldRegexRule, foldResolvePalette, foldShadowVar, foldSpaceVar, foldTextVar, observeElementWidth, provideFoldDataTableLabels, provideFoldIcons, provideFoldInlineConfirmLabels, provideFoldPaginatorLabels, provideFoldPalette, provideFoldPanelLabels, provideFoldToasts };
8850
+ export { FOLD_AUTO_PALETTES, FOLD_BLUR_TOKENS, FOLD_BUILTIN_ICONS, FOLD_DATA_TABLE_DEFAULT_LABELS, FOLD_DATA_TABLE_LABELS, FOLD_INLINE_CONFIRM_DEFAULT_LABELS, FOLD_INLINE_CONFIRM_LABELS, FOLD_MOTION_TOKENS, FOLD_PAGINATOR_DEFAULT_LABELS, FOLD_PAGINATOR_LABELS, FOLD_PALETTE_DEFAULT, FOLD_PANEL_CLOSE_LABEL, FOLD_RADIUS_TOKENS, FOLD_SEMANTIC_COLOR_TOKENS, FOLD_SHADOW_TOKENS, FOLD_SPACE_TOKENS, FOLD_TEXT_TOKENS, FOLD_TOAST_CONFIG, FoldAppShellComponent, FoldAsideLayoutComponent, FoldAvatarComponent, FoldAvatarDetailComponent, FoldAvatarListComponent, FoldBadgeComponent, FoldButtonComponent, FoldButtonIconComponent, FoldCalloutComponent, FoldCardComponent, FoldCheckboxComponent, FoldChoiceRowComponent, FoldContextCardComponent, FoldDataTableCellDirective, FoldDataTableComponent, FoldDataTableRowCardDirective, FoldDisclosureComponent, FoldDropdownComponent, FoldDropdownItemComponent, FoldElementTitleComponent, FoldElevatedDirective, FoldEmptyStateComponent, FoldFieldComponent, FoldFieldIdDirective, FoldFieldListComponent, FoldFileDropzoneComponent, FoldHeroCardComponent, FoldHeroSectionComponent, FoldIconComponent, FoldIconRegistry, FoldIdService, FoldInlineConfirmComponent, FoldInputComponent, FoldLinkComponent, FoldListboxComponent, FoldLoadingStateComponent, FoldMenuComponent, FoldMenuItemComponent, FoldMenuSectionComponent, FoldMenuSeparatorComponent, FoldMultiselectComponent, FoldNavLauncherComponent, FoldNavLayoutComponent, FoldNavTileComponent, FoldNumberInputComponent, FoldOptionComponent, FoldPageLayoutComponent, FoldPageSectionComponent, FoldPageTitleDirective, FoldPaginatorComponent, FoldPaletteRegistry, FoldPanelComponentOutletDirective, FoldPanelHeaderComponent, FoldPanelHostComponent, FoldPanelHostService, FoldPanelRef, FoldPanelToggle, FoldPasswordFieldComponent, FoldPopoverComponent, FoldPopoverTriggerDirective, FoldRangeSliderComponent, FoldRepeatPressDirective, FoldSearchComponent, FoldSelectComponent, FoldSliderComponent, FoldSpinnerComponent, FoldStatusBadgeComponent, FoldStickyColumnDirective, FoldSurfaceDirective, FoldTabPanelComponent, FoldTabsComponent, FoldTimelineComponent, FoldToastComponent, FoldToastContainerComponent, FoldToastService, FoldToggleIconComponent, FoldViewNavComponent, FoldViewToggleComponent, autoUpdate, computePlacement, foldBlurVar, foldCardBandChrome, foldColorProperty, foldColorVar, foldDefaultPasswordRules, foldHashSeed, foldMotionVar, foldRadiusVar, foldRegexRule, foldResolvePalette, foldShadowVar, foldSpaceVar, foldTextVar, observeElementWidth, provideFoldDataTableLabels, provideFoldIcons, provideFoldInlineConfirmLabels, provideFoldPaginatorLabels, provideFoldPalette, provideFoldPanelLabels, provideFoldToasts };
8823
8851
  //# sourceMappingURL=fold-ng.mjs.map