fold-ng 0.4.0 → 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.
@@ -1,6 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { TemplateRef, ElementRef, Signal, Provider, InjectionToken, Type, Injector, InputSignal, WritableSignal } from '@angular/core';
3
- import { FormValueControl, ValidationError } from '@angular/forms/signals';
2
+ import { InjectionToken, Provider, TemplateRef, ElementRef, Signal, Type, Injector, InputSignal, WritableSignal } from '@angular/core';
3
+ import { FormValueControl, ValidationError, FormCheckboxControl } from '@angular/forms/signals';
4
4
 
5
5
  /**
6
6
  * `<fold-app-shell>` — the responsive application skeleton.
@@ -847,9 +847,193 @@ declare class FoldToggleIconComponent {
847
847
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldToggleIconComponent, "fold-toggle-icon", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "toggled": "toggled"; }, never, never, true, never>;
848
848
  }
849
849
 
850
+ /**
851
+ * Every user-facing / accessible string the inline-confirm renders. The
852
+ * `typePrompt` is a function of the value to match, so a locale can reword the
853
+ * whole sentence rather than translate a fixed template. All defaults are
854
+ * English — a non-English app overrides them once via
855
+ * {@link provideFoldInlineConfirmLabels}, or per instance via the `labels` input.
856
+ */
857
+ interface FoldInlineConfirmLabels {
858
+ /** Label of the confirm button. */
859
+ readonly confirm: string;
860
+ /** Label of the cancel button. */
861
+ readonly cancel: string;
862
+ /** `aria-label` of the icon-only cancel button (`cancelIcon`). */
863
+ readonly cancelAria: string;
864
+ /** Confirm-button label while `loading`. */
865
+ readonly busy: string;
866
+ /** Accessible name of the confirmation group that replaces the trigger. */
867
+ readonly group: string;
868
+ /** Placeholder + prompt for the secret field (`password`, no `match`). */
869
+ readonly secret: string;
870
+ /** The type-to-confirm prompt, e.g. `("prod") => "Type prod to confirm"`. */
871
+ readonly typePrompt: (match: string) => string;
872
+ }
873
+ /** The English defaults — the base every override merges onto. */
874
+ declare const FOLD_INLINE_CONFIRM_DEFAULT_LABELS: FoldInlineConfirmLabels;
875
+ /** App-wide inline-confirm labels; defaults to English. */
876
+ declare const FOLD_INLINE_CONFIRM_LABELS: InjectionToken<FoldInlineConfirmLabels>;
877
+ /**
878
+ * Provide app-wide inline-confirm labels once at bootstrap. Partial — any key
879
+ * you omit keeps its English default.
880
+ *
881
+ * @example
882
+ * ```ts
883
+ * // app.config.ts
884
+ * providers: [
885
+ * provideFoldInlineConfirmLabels({
886
+ * confirm: "Confirmer",
887
+ * cancel: "Annuler",
888
+ * typePrompt: (m) => `Saisissez ${m} pour confirmer`,
889
+ * }),
890
+ * ];
891
+ * ```
892
+ */
893
+ declare function provideFoldInlineConfirmLabels(labels: Partial<FoldInlineConfirmLabels>): Provider;
894
+
895
+ /**
896
+ * `<fold-inline-confirm>` — an in-place "are you sure?" affordance. The host
897
+ * projects a **trigger** (a real, focusable control — a `foldButton`, a
898
+ * `fold-button-icon`); on activation the trigger is replaced *in the same slot*
899
+ * by a confirm/cancel row, so a destructive action is guarded without a modal
900
+ * and without the layout jumping. Emits `confirmed` / `cancelled`.
901
+ *
902
+ * Three families, chosen by input:
903
+ *
904
+ * - **Simple** (default) — trigger → `Confirm` · `Cancel`. `confirmed` emits `""`.
905
+ * - **Type-to-confirm** — set `match`: the confirm button stays disabled until
906
+ * the user types the value (case-insensitive, trimmed). `confirmed` emits the
907
+ * typed text.
908
+ * - **Secret** — set `password` (no `match`): a masked field that confirms once
909
+ * non-empty. `confirmed` emits the secret, so a handler can post it to the
910
+ * server (which is the only place a password can actually be checked).
911
+ *
912
+ * `Escape` cancels; `Enter` in the field confirms when valid. Opening moves
913
+ * focus to the field (typed families) or the confirm button (simple), and
914
+ * cancelling returns focus to the trigger.
915
+ *
916
+ * @selector `fold-inline-confirm`
917
+ *
918
+ * @example
919
+ * ```html
920
+ * <!-- simple -->
921
+ * <fold-inline-confirm (confirmed)="remove()">
922
+ * <fold-button-icon icon="trash" tooltip="Delete" />
923
+ * </fold-inline-confirm>
924
+ *
925
+ * <!-- type-to-confirm -->
926
+ * <fold-inline-confirm [match]="node.name" (confirmed)="archive()">
927
+ * <button foldButton emphasis="outline" intent="danger">Delete node</button>
928
+ * </fold-inline-confirm>
929
+ *
930
+ * <!-- password-gated -->
931
+ * <fold-inline-confirm password (confirmed)="deleteAccount($event)">
932
+ * <button foldButton intent="danger">Delete account</button>
933
+ * </fold-inline-confirm>
934
+ *
935
+ * <!-- async: keep it open + show a spinner until the request settles -->
936
+ * <fold-inline-confirm
937
+ * keepOpenOnConfirm
938
+ * [loading]="pending()"
939
+ * [(open)]="confirmOpen"
940
+ * confirmIcon="bin"
941
+ * cancelIcon="close"
942
+ * (confirmed)="onDelete()">
943
+ * <fold-button-icon icon="bin" tooltip="Delete" />
944
+ * </fold-inline-confirm>
945
+ * ```
946
+ */
947
+ declare class FoldInlineConfirmComponent {
948
+ private readonly defaults;
949
+ /** Intent (colour) of the confirm button. @default "danger" */
950
+ readonly intent: _angular_core.InputSignal<FoldButtonIntent>;
951
+ /** Optional warning shown above the confirm row. */
952
+ readonly message: _angular_core.InputSignal<string | undefined>;
953
+ /**
954
+ * The exact text the user must type to confirm (type-to-confirm family).
955
+ * Empty → the simple family. Matching is case-insensitive + trimmed.
956
+ */
957
+ readonly match: _angular_core.InputSignal<string>;
958
+ /**
959
+ * Mask the field and confirm on any non-empty value (secret family). A
960
+ * password can't be verified in the browser, so this only *collects* it —
961
+ * `confirmed` emits it for the handler to send to the server. Ignored when
962
+ * `match` is set.
963
+ */
964
+ readonly password: _angular_core.InputSignalWithTransform<boolean, unknown>;
965
+ /** Placeholder for the typed / secret field. */
966
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
967
+ /** Pending state — disables the buttons and shows the `busy` label. */
968
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
969
+ /** Control density. @default "sm" */
970
+ readonly size: _angular_core.InputSignal<FoldButtonSize>;
971
+ /** Optional leading icon on the confirm button (e.g. `"bin"` on "Delete"). */
972
+ readonly confirmIcon: _angular_core.InputSignal<FoldIconName | undefined>;
973
+ /**
974
+ * Render the cancel as an icon-only button of the given icon (e.g. `"close"`)
975
+ * instead of a labelled button. Unset → a labelled cancel. The name is your
976
+ * choice from the icon registry.
977
+ */
978
+ readonly cancelIcon: _angular_core.InputSignal<FoldIconName | undefined>;
979
+ /**
980
+ * Keep the affordance open after `confirmed` fires, so an async handler can
981
+ * show `loading` and then close it via `[(open)]`. Default: close on confirm
982
+ * (the right behaviour for synchronous / optimistic actions).
983
+ */
984
+ readonly keepOpenOnConfirm: _angular_core.InputSignalWithTransform<boolean, unknown>;
985
+ /** Per-instance label overrides, merged over the app-wide + English defaults. */
986
+ readonly labels: _angular_core.InputSignal<Partial<FoldInlineConfirmLabels> | undefined>;
987
+ /** Emitted when the user confirms — carries the typed text (or `""`). */
988
+ readonly confirmed: _angular_core.OutputEmitterRef<string>;
989
+ /** Emitted when the user cancels (button or `Escape`). */
990
+ readonly cancelled: _angular_core.OutputEmitterRef<void>;
991
+ /**
992
+ * Whether the confirm affordance (vs. the trigger) is showing. Two-way, so a
993
+ * parent can drive it — open it programmatically, or close it when an async
994
+ * `confirmed` handler settles (paired with `keepOpenOnConfirm`).
995
+ */
996
+ readonly open: _angular_core.ModelSignal<boolean>;
997
+ /** The text currently typed in the field. */
998
+ protected readonly typed: _angular_core.WritableSignal<string>;
999
+ private readonly triggerEl;
1000
+ private readonly groupEl;
1001
+ /** SSR-safe id tying the message to the confirm group. */
1002
+ protected readonly msgId: string;
1003
+ /** Effective labels: English defaults ← app-wide provider ← per-instance input. */
1004
+ protected readonly l: _angular_core.Signal<FoldInlineConfirmLabels>;
1005
+ /** True when a value must be typed before confirming. */
1006
+ protected readonly needsInput: _angular_core.Signal<boolean>;
1007
+ /** Whether the typed value satisfies the gate (match, or non-empty secret). */
1008
+ protected readonly inputValid: _angular_core.Signal<boolean>;
1009
+ /** The confirm button is live once the gate is satisfied and nothing pends. */
1010
+ protected readonly canConfirm: _angular_core.Signal<boolean>;
1011
+ protected readonly fieldType: _angular_core.Signal<"text" | "password">;
1012
+ /** Prompt above a typed field: the match sentence, or the secret label. */
1013
+ protected readonly prompt: _angular_core.Signal<string>;
1014
+ /** Has the affordance ever opened? Gates focus-return so mount doesn't steal. */
1015
+ private opened;
1016
+ constructor();
1017
+ /** Start the confirm flow (called by the projected trigger's click). */
1018
+ protected activate(): void;
1019
+ /** Complete the confirmation, emitting the typed value (or `""`). */
1020
+ protected confirm(): void;
1021
+ /** Abort and restore the trigger (focus returns via the render effect). */
1022
+ protected cancel(): void;
1023
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldInlineConfirmComponent, never>;
1024
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldInlineConfirmComponent, "fold-inline-confirm", never, { "intent": { "alias": "intent"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "match": { "alias": "match"; "required": false; "isSignal": true; }; "password": { "alias": "password"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "confirmIcon": { "alias": "confirmIcon"; "required": false; "isSignal": true; }; "cancelIcon": { "alias": "cancelIcon"; "required": false; "isSignal": true; }; "keepOpenOnConfirm": { "alias": "keepOpenOnConfirm"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "confirmed": "confirmed"; "cancelled": "cancelled"; "open": "openChange"; }, never, ["*"], true, never>;
1025
+ }
1026
+
850
1027
  /** Which band(s) carry a chrome treatment (a separator hairline or a raised
851
1028
  * tint): neither, just the header, just the footer, or both. */
852
1029
  type FoldCardBandChrome = "none" | "header" | "footer" | "both";
1030
+ /** What the `separators` / `raisedBands` inputs accept: the {@link FoldCardBandChrome}
1031
+ * enum, or a boolean shorthand — a bare attribute (`separators`, i.e. `""`) or
1032
+ * `true` means **both** bands; `false` means **none**. */
1033
+ type FoldCardBandChromeInput = FoldCardBandChrome | boolean | "";
1034
+ /** Coerce the band-chrome shorthand: bare attribute / `true` → `"both"`,
1035
+ * `false` → `"none"`, an explicit enum value passes through unchanged. */
1036
+ declare function foldCardBandChrome(value: FoldCardBandChromeInput): FoldCardBandChrome;
853
1037
  /**
854
1038
  * `<fold-card>` — the canonical raised content surface: a solid
855
1039
  * `surface-card` background, a hairline border and a consistent radius. Use it
@@ -933,11 +1117,13 @@ declare class FoldCardComponent {
933
1117
  /** Accessible name for the interactive card, when its content isn't enough. */
934
1118
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
935
1119
  /** Which bands get a hairline against the body — `none` (default), `header`,
936
- * `footer`, or `both`. */
937
- readonly separators: _angular_core.InputSignal<FoldCardBandChrome>;
1120
+ * `footer`, or `both`. Accepts a boolean shorthand: a bare `separators` (or
1121
+ * `[separators]="true"`) means `both`; `false` means `none`. */
1122
+ readonly separators: _angular_core.InputSignalWithTransform<FoldCardBandChrome, FoldCardBandChromeInput>;
938
1123
  /** Which bands are lifted with a subtle raised tint over the card surface
939
- * (fainter on `sunken`) — `none` (default), `header`, `footer`, or `both`. */
940
- readonly raisedBands: _angular_core.InputSignal<FoldCardBandChrome>;
1124
+ * (fainter on `sunken`) — `none` (default), `header`, `footer`, or `both`.
1125
+ * Accepts the same boolean shorthand as {@link separators}. */
1126
+ readonly raisedBands: _angular_core.InputSignalWithTransform<FoldCardBandChrome, FoldCardBandChromeInput>;
941
1127
  /** Fires when an `interactive` card is activated (click, Enter, or Space). */
942
1128
  readonly activated: _angular_core.OutputEmitterRef<Event>;
943
1129
  /** Whether a per-band chrome value applies to the given band. */
@@ -1600,10 +1786,13 @@ interface FoldTableColumn {
1600
1786
  readonly label: string;
1601
1787
  /** Renders a sort button in the header; emits `sortChange` with `key`. */
1602
1788
  readonly sortable?: boolean;
1603
- /** Right-align the header + cells (numeric columns). */
1604
- readonly align?: "right";
1789
+ /** Text alignment of the header + cells. Default left; `right` for numeric. */
1790
+ readonly align?: "right" | "center";
1605
1791
  /** Optional fixed column width (any CSS length). */
1606
1792
  readonly width?: string;
1793
+ /** Clip overflowing text to one line with an ellipsis (pair with `width`).
1794
+ * Cell templates should set their own `title` for the full-text tooltip. */
1795
+ readonly truncate?: boolean;
1607
1796
  /** Extra class applied to every cell in the column. */
1608
1797
  readonly cellClass?: string;
1609
1798
  }
@@ -1613,12 +1802,66 @@ interface FoldTableEmpty {
1613
1802
  readonly subtitle?: string;
1614
1803
  }
1615
1804
 
1805
+ /**
1806
+ * Every user-facing / accessible string {@link FoldDataTableComponent} renders
1807
+ * that isn't supplied per row. Parameterised strings are functions so a locale
1808
+ * can reword, not just translate. All defaults are English — a non-English app
1809
+ * overrides them once via {@link provideFoldDataTableLabels}, or per instance
1810
+ * via the `labels` input. (Per-row names come from the `selectionLabel` input;
1811
+ * {@link FoldDataTableLabels.selectRow} is only the fallback when it's unset.)
1812
+ */
1813
+ interface FoldDataTableLabels {
1814
+ /** `aria-label` of the select-all header checkbox. */
1815
+ readonly selectAll: string;
1816
+ /** Fallback `aria-label` of a row checkbox (used when no `selectionLabel`). */
1817
+ readonly selectRow: string;
1818
+ /** A sortable header's button `aria-label`, e.g. `("Name") => "Sort by Name"`. */
1819
+ readonly sortBy: (column: string) => string;
1820
+ /** The loading spinner's accessible label. */
1821
+ readonly loading: string;
1822
+ }
1823
+ /** The English defaults — the base every override merges onto. */
1824
+ declare const FOLD_DATA_TABLE_DEFAULT_LABELS: FoldDataTableLabels;
1825
+ /** App-wide data-table labels; defaults to English. */
1826
+ declare const FOLD_DATA_TABLE_LABELS: InjectionToken<FoldDataTableLabels>;
1827
+ /**
1828
+ * Provide app-wide data-table labels once at bootstrap. Partial — any key you
1829
+ * omit keeps its English default.
1830
+ *
1831
+ * @example
1832
+ * ```ts
1833
+ * providers: [
1834
+ * provideFoldDataTableLabels({
1835
+ * selectAll: "Tout sélectionner",
1836
+ * sortBy: (c) => `Trier par ${c}`,
1837
+ * }),
1838
+ * ];
1839
+ * ```
1840
+ */
1841
+ declare function provideFoldDataTableLabels(labels: Partial<FoldDataTableLabels>): Provider;
1842
+
1616
1843
  /**
1617
1844
  * `fold-data-table` — a controlled, presentational roster table. The parent
1618
1845
  * supplies already-paged/sorted `rows`, a `columns` definition, and a
1619
1846
  * `<ng-template foldCell="<key>">` per column for the cell content; the table
1620
1847
  * owns the chrome (sticky sortable header, row tone accents, focus/click, the
1621
- * mobile card layout, the empty state).
1848
+ * mobile card layout, the loading + empty states).
1849
+ *
1850
+ * Selection stays controlled too: pass a `selected` set of row keys and handle
1851
+ * `selectionChange` — the table renders the checkbox column, the header
1852
+ * select-all (with an indeterminate state over the current rows), and the
1853
+ * selected-row tint, but never owns the set.
1854
+ *
1855
+ * The narrow-screen behaviour is the parent's choice, not an imposed one, via
1856
+ * `mobileLayout`: `scroll` (default — stay tabular, scroll horizontally),
1857
+ * `auto-cards` (each row stacks into a label/value card), or `custom` (the
1858
+ * parent supplies `<ng-template foldRowCard let-row>` and owns the card).
1859
+ *
1860
+ * Accessible by construction: the first column renders as `<th scope="row">`
1861
+ * (screen readers announce each row by its identity cell), the sort direction
1862
+ * rides on `aria-sort` (the icon is decorative), clickable rows answer Enter and
1863
+ * Space and form a single roving-tabindex group (Arrow/Home/End move between
1864
+ * rows), and `caption` gives the table a visually-hidden name.
1622
1865
  *
1623
1866
  * Generic over the row type `T` so `rowKey`/`rowTone`/`rowClick` stay typed.
1624
1867
  * Cell templates are untyped (`let-row` is `any`) — render through the parent's
@@ -1633,28 +1876,101 @@ declare class FoldDataTableComponent<T> {
1633
1876
  readonly rowTone: _angular_core.InputSignal<((row: T) => FoldTableTone) | undefined>;
1634
1877
  readonly sort: _angular_core.InputSignal<FoldTableSort | null>;
1635
1878
  readonly empty: _angular_core.InputSignal<FoldTableEmpty | undefined>;
1879
+ /** While `true`, shows a spinner instead of the empty state — a table that
1880
+ * is fetching reads as "loading", never as "no data". */
1881
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
1882
+ /** Accessible table name, rendered as a visually-hidden `<caption>`. Set it
1883
+ * when the surrounding context does not already name the table for AT. */
1884
+ readonly caption: _angular_core.InputSignal<string | undefined>;
1636
1885
  /** Makes rows focusable + clickable (emits `rowClick`). */
1637
1886
  readonly clickable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1638
1887
  readonly zebra: _angular_core.InputSignalWithTransform<boolean, unknown>;
1639
1888
  readonly hover: _angular_core.InputSignalWithTransform<boolean, unknown>;
1640
- readonly mobileCards: _angular_core.InputSignalWithTransform<boolean, unknown>;
1889
+ /**
1890
+ * How the table behaves on a narrow screen:
1891
+ * - `scroll` (default) — stay tabular; the body scrolls horizontally. The
1892
+ * table imposes no card layout unless asked.
1893
+ * - `auto-cards` — each row stacks into an auto label/value card.
1894
+ * - `custom` — hide the table and render the projected `foldRowCard` template
1895
+ * per row, so the parent owns the mobile presentation.
1896
+ */
1897
+ readonly mobileLayout: _angular_core.InputSignal<"scroll" | "auto-cards" | "custom">;
1898
+ /** Row density — `compact` tightens padding for dense rosters. */
1899
+ readonly density: _angular_core.InputSignal<"comfortable" | "compact">;
1900
+ /** Pin the identity column while the body scrolls horizontally (wide tables). */
1901
+ readonly stickyFirst: _angular_core.InputSignalWithTransform<boolean, unknown>;
1902
+ /** Renders the checkbox column + header select-all. */
1903
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1904
+ /** Controlled selection — the set of selected row keys. The parent owns it. */
1905
+ readonly selected: _angular_core.InputSignal<ReadonlySet<string | number>>;
1906
+ /** Accessible label for a row's checkbox, e.g. `(row) => row.name`. */
1907
+ readonly selectionLabel: _angular_core.InputSignal<((row: T) => string) | undefined>;
1908
+ /** Per-instance label overrides (merged over the app-wide / English defaults). */
1909
+ readonly labels: _angular_core.InputSignal<Partial<FoldDataTableLabels> | undefined>;
1910
+ /** Emits the next selection set on any checkbox toggle (never mutates input). */
1911
+ readonly selectionChange: _angular_core.OutputEmitterRef<Set<string | number>>;
1641
1912
  /** Emits the clicked sortable column's `key`. */
1642
1913
  readonly sortChange: _angular_core.OutputEmitterRef<string>;
1643
1914
  readonly rowClick: _angular_core.OutputEmitterRef<T>;
1915
+ /** Key of the row that currently holds the single tab stop (roving tabindex). */
1916
+ private readonly focusedKey;
1917
+ /** True on a narrow viewport — gates the custom mobile-card rendering so the
1918
+ * desktop never instantiates the (CSS-hidden) per-row cards. */
1919
+ protected readonly isNarrow: _angular_core.WritableSignal<boolean>;
1920
+ private readonly destroyRef;
1921
+ private readonly injectedLabels;
1922
+ /** Effective labels — the app-wide (or English) set, with the `labels` input on top. */
1923
+ protected readonly l: _angular_core.Signal<FoldDataTableLabels>;
1924
+ constructor();
1644
1925
  private readonly cells;
1645
1926
  private readonly cellMap;
1927
+ private readonly rowCard;
1928
+ /** The custom mobile-card template, only when `mobileLayout="custom"`. */
1929
+ readonly rowCardTemplate: _angular_core.Signal<TemplateRef<unknown> | null>;
1930
+ /**
1931
+ * The toolbar's surface level — the "weight" the title bar lends the table.
1932
+ * All four map to fold surface tokens (never a hard-coded colour): `default`
1933
+ * (a subtle header lift), `sunken` / `raised` (a step down / up the elevation
1934
+ * ramp), and `accent` — a brand-filled bar whose projected content
1935
+ * auto-inverts to the on-accent palette per theme (the shared
1936
+ * `[data-surface="accent"]` machinery).
1937
+ */
1938
+ readonly toolbarSurface: _angular_core.InputSignal<"accent" | "default" | "sunken" | "raised">;
1646
1939
  /** The first column is the identity/primary cell (full-width on mobile). */
1647
1940
  readonly primaryKey: _angular_core.Signal<string>;
1941
+ /** Total ARIA column count (data columns + the checkbox column). */
1942
+ readonly colCount: _angular_core.Signal<number>;
1943
+ /** Current row keys, in order — the roving-nav anchor set. */
1944
+ private readonly rowKeys;
1945
+ /** The row that holds the single tab stop: the focused row while it still
1946
+ * exists, else the first row — so a removed/filtered focus never strands the
1947
+ * roving group with zero tab stops. */
1948
+ private readonly activeRowKey;
1648
1949
  cellTemplate(key: string): TemplateRef<unknown> | null;
1649
1950
  keyOf(row: T, index: number): string | number;
1650
1951
  toneOf(row: T): FoldTableTone;
1651
1952
  isSorted(key: string): boolean;
1652
- /** The sort glyph for a column: neutral `↕`, or the active direction. */
1653
- sortArrow(key: string): string;
1953
+ /** The sort icon for a column: a neutral up/down (`expand-all`) when idle, or
1954
+ * the active direction chevron. Decorative — `aria-sort` on the `<th>` is the
1955
+ * accessible carrier, so these icons stay `aria-hidden` (fold-icon default). */
1956
+ sortIcon(key: string): FoldIconName;
1654
1957
  ariaSort(key: string): "ascending" | "descending" | "none";
1655
1958
  onRowActivate(row: T): void;
1959
+ isRowSelected(row: T, index: number): boolean;
1960
+ /** All current rows selected (drives the header checkbox `checked`). */
1961
+ readonly allSelected: _angular_core.Signal<boolean>;
1962
+ /** Some — but not all — current rows selected (header `indeterminate`). */
1963
+ readonly someSelected: _angular_core.Signal<boolean>;
1964
+ toggleRow(row: T, index: number): void;
1965
+ /** Select-all toggles every current row; if all are already in, clears them. */
1966
+ toggleAll(): void;
1967
+ labelFor(row: T): string;
1968
+ /** The single tab stop: the focused (or fallback first) row. */
1969
+ rowTabIndex(row: T, index: number): 0 | -1 | null;
1970
+ onRowFocus(row: T, index: number): void;
1971
+ onRowKeydown(event: KeyboardEvent, row: T): void;
1656
1972
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldDataTableComponent<any>, never>;
1657
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldDataTableComponent<any>, "fold-data-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "rowTone": { "alias": "rowTone"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "zebra": { "alias": "zebra"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; "mobileCards": { "alias": "mobileCards"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "rowClick": "rowClick"; }, ["cells"], never, true, never>;
1973
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldDataTableComponent<any>, "fold-data-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "rowTone": { "alias": "rowTone"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "zebra": { "alias": "zebra"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; "mobileLayout": { "alias": "mobileLayout"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "stickyFirst": { "alias": "stickyFirst"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "selectionLabel": { "alias": "selectionLabel"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "toolbarSurface": { "alias": "toolbarSurface"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "sortChange": "sortChange"; "rowClick": "rowClick"; }, ["cells", "rowCard"], ["[foldToolbar]"], true, never>;
1658
1974
  }
1659
1975
 
1660
1976
  /**
@@ -1678,6 +1994,28 @@ declare class FoldDataTableCellDirective {
1678
1994
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldDataTableCellDirective, "ng-template[foldCell]", never, { "foldCell": { "alias": "foldCell"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1679
1995
  }
1680
1996
 
1997
+ /**
1998
+ * Marks the `<ng-template>` that renders a whole row as a **custom mobile card**
1999
+ * inside `<fold-data-table mobileLayout="custom">`:
2000
+ *
2001
+ * ```html
2002
+ * <ng-template foldRowCard let-row let-i="index"> … </ng-template>
2003
+ * ```
2004
+ *
2005
+ * The template context is `{ $implicit: row, index }`. When `mobileLayout` is
2006
+ * `"custom"`, the table hides on narrow screens and this template renders once
2007
+ * per row instead of the auto label/value stack — the parent owns the mobile
2008
+ * presentation entirely (including any interactions it wants inside the card).
2009
+ *
2010
+ * As with cell templates, `let-row` is untyped by design — annotate through the
2011
+ * parent component's typed helpers.
2012
+ */
2013
+ declare class FoldDataTableRowCardDirective {
2014
+ readonly template: TemplateRef<any>;
2015
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldDataTableRowCardDirective, never>;
2016
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldDataTableRowCardDirective, "ng-template[foldRowCard]", never, {}, {}, never, never, true, never>;
2017
+ }
2018
+
1681
2019
  /** Where the column pins while the main content scrolls past it. */
1682
2020
  type FoldStickyColumnAnchor = "top" | "center" | "bottom";
1683
2021
  /**
@@ -1731,7 +2069,7 @@ declare class FoldStickyColumnDirective {
1731
2069
  * flow position: `top`/`center` (which pin the top edge, at 0 / 50%) need the
1732
2070
  * column at the *top* of its tall row (`start`); `bottom` needs it at the
1733
2071
  * *bottom* (`end`), else it starts off-screen and only catches mid-scroll. */
1734
- protected readonly alignSelfStyle: _angular_core.Signal<"end" | "start">;
2072
+ protected readonly alignSelfStyle: _angular_core.Signal<"start" | "end">;
1735
2073
  /** Centre anchoring pins the top edge at 50%, then pulls back half its height. */
1736
2074
  protected readonly transformStyle: _angular_core.Signal<"none" | "translateY(-50%)">;
1737
2075
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldStickyColumnDirective, never>;
@@ -2122,6 +2460,12 @@ declare class FoldInputComponent implements FormValueControl<string> {
2122
2460
  * @default 'text'
2123
2461
  */
2124
2462
  readonly type: _angular_core.InputSignal<"text" | "email" | "password" | "tel" | "url">;
2463
+ /** On a `password` input, offer a reveal (eye) toggle to show/hide the value. */
2464
+ readonly revealable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2465
+ /** Accessible name of the reveal control while hidden. @default 'Show password' */
2466
+ readonly revealLabel: _angular_core.InputSignal<string>;
2467
+ /** Accessible name of the reveal control while shown. @default 'Hide password' */
2468
+ readonly hideLabel: _angular_core.InputSignal<string>;
2125
2469
  /**
2126
2470
  * Size preset controlling height, font-size, padding and border-radius.
2127
2471
  * - `sm` — compact (text-sm, tight padding) — inline table edits, compact forms
@@ -2184,13 +2528,22 @@ declare class FoldInputComponent implements FormValueControl<string> {
2184
2528
  protected readonly errorMessage: _angular_core.Signal<string | undefined>;
2185
2529
  /** `aria-describedby` target: the error when shown, else the hint, else none. */
2186
2530
  protected readonly describedBy: _angular_core.Signal<string | null>;
2531
+ /** Is the password currently revealed (shown as plain text)? */
2532
+ protected readonly revealed: _angular_core.WritableSignal<boolean>;
2533
+ /** Whether to render the reveal toggle — a `revealable` password input. */
2534
+ protected readonly showReveal: _angular_core.Signal<boolean>;
2535
+ /** The native `type` to render — `text` while a password is revealed. */
2536
+ protected readonly effectiveType: _angular_core.Signal<"text" | "email" | "password" | "tel" | "url">;
2537
+ /** The reveal control's accessible name, tracking its state. */
2538
+ protected readonly revealAria: _angular_core.Signal<string>;
2539
+ protected toggleReveal(): void;
2187
2540
  /** Handles native input event. `value.set()` also fires the model's
2188
2541
  * auto `valueChange` output for standalone `(valueChange)` consumers. */
2189
2542
  onInputChange(event: Event): void;
2190
2543
  /** Mark the field touched on blur, so errors can surface. */
2191
2544
  protected onBlur(): void;
2192
2545
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldInputComponent, never>;
2193
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldInputComponent, "fold-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2546
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldInputComponent, "fold-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "revealable": { "alias": "revealable"; "required": false; "isSignal": true; }; "revealLabel": { "alias": "revealLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2194
2547
  }
2195
2548
 
2196
2549
  /** The increment/decrement glyph: chevrons, `− / +`, or no buttons. */
@@ -2435,50 +2788,696 @@ declare class FoldSelectComponent implements FormValueControl<string> {
2435
2788
  }
2436
2789
 
2437
2790
  /**
2438
- * `<fold-slider>` — a single-value range slider with the design-system track,
2439
- * fill and thumb (a styled native `<input type="range">`). Two-way bound via
2440
- * `[(value)]`.
2791
+ * Zero-dependency placement math for {@link FoldPopoverComponent}. Pure and
2792
+ * framework-free so it unit-tests without a DOM: give it the anchor rect, the
2793
+ * floating size and the viewport, get back the `{ x, y }` to pin the floating
2794
+ * element (viewport coordinates, for `position: fixed`) plus the placement it
2795
+ * actually resolved to after collision handling.
2796
+ *
2797
+ * Three middlewares, in the order a good popover applies them:
2798
+ * 1. **flip** — pick the best-fitting side: keep the preferred one if it fits,
2799
+ * else its opposite, else whichever has the most room (so a bottom menu opens
2800
+ * upward near the fold instead of spilling offscreen).
2801
+ * 2. **size** — report the space available on the chosen side (`maxWidth` /
2802
+ * `maxHeight`), so the caller caps the panel and scrolls the overflow instead
2803
+ * of letting it run off the viewport.
2804
+ * 3. **shift** — slide along the cross axis to stay within the viewport padding,
2805
+ * without leaving the anchor's side.
2806
+ *
2807
+ * We deliberately do not depend on Floating UI — fold ships no runtime deps.
2808
+ */
2809
+ /** The side of the anchor the floating element sits on. */
2810
+ type FoldPopoverSide = "top" | "bottom" | "left" | "right";
2811
+ /** Alignment of the floating element along the anchor's cross axis. */
2812
+ type FoldPopoverAlign = "start" | "center" | "end";
2813
+ /** A full placement: a side, optionally suffixed with an alignment. */
2814
+ type FoldPopoverPlacement = FoldPopoverSide | `${FoldPopoverSide}-${FoldPopoverAlign}`;
2815
+ /** A rectangle in viewport coordinates (a subset of `DOMRect`). */
2816
+ interface FoldRect {
2817
+ readonly x: number;
2818
+ readonly y: number;
2819
+ readonly width: number;
2820
+ readonly height: number;
2821
+ }
2822
+ interface FoldPlacementInput {
2823
+ /** The trigger's bounding rect, in viewport coordinates. */
2824
+ readonly anchor: FoldRect;
2825
+ /** The floating element's measured size. */
2826
+ readonly floating: {
2827
+ readonly width: number;
2828
+ readonly height: number;
2829
+ };
2830
+ /** Preferred placement before collision handling. */
2831
+ readonly placement: FoldPopoverPlacement;
2832
+ /**
2833
+ * Ordered fallbacks tried (after the preferred) when the preferred side can't
2834
+ * fit — the first that fits wins, else the roomiest of all candidates. Each
2835
+ * may change side *and* alignment. Defaults to the opposite side.
2836
+ */
2837
+ readonly fallbackPlacements?: readonly FoldPopoverPlacement[] | undefined;
2838
+ /** Gap between the anchor and the floating element, in px. */
2839
+ readonly offset: number;
2840
+ /** Viewport size (usually `innerWidth` / `innerHeight`). */
2841
+ readonly viewport: {
2842
+ readonly width: number;
2843
+ readonly height: number;
2844
+ };
2845
+ /** Minimum gap kept between the floating element and the viewport edge. */
2846
+ readonly padding: number;
2847
+ }
2848
+ interface FoldPlacementResult {
2849
+ readonly x: number;
2850
+ readonly y: number;
2851
+ /** The placement after flip — drives the arrow / `data-placement`. */
2852
+ readonly placement: FoldPopoverPlacement;
2853
+ /** Space available to the floating element on the resolved side, minus
2854
+ * padding — the consumer caps `max-width` / `max-height` to these and lets
2855
+ * the panel scroll (the `size` middleware). */
2856
+ readonly maxWidth: number;
2857
+ readonly maxHeight: number;
2858
+ }
2859
+ /**
2860
+ * Resolve `{ x, y, placement, maxWidth, maxHeight }` for a floating element.
2861
+ * Order: **flip** (choose the best-fitting side) → **size** (available space on
2862
+ * that side, for the caller to cap + scroll) → **shift** (slide along the cross
2863
+ * axis to stay in the viewport).
2864
+ */
2865
+ declare function computePlacement(input: FoldPlacementInput): FoldPlacementResult;
2866
+
2867
+ /**
2868
+ * A data-driven option for the array API of `fold-listbox` / `fold-multiselect`
2869
+ * (`[options]`). Use it — instead of projecting `<fold-option>` — when the list
2870
+ * is data, not markup: the value type is linked to the control's value at compile
2871
+ * time (no projection seam). For rich per-row content, project an
2872
+ * `<ng-template #option let-o>` alongside `[options]`; otherwise `label` renders.
2873
+ */
2874
+ interface FoldSelectOption<T> {
2875
+ /** The value written back to the control when the row is chosen. */
2876
+ readonly value: T;
2877
+ /** The row's visible text (also the type-ahead + trigger label). */
2878
+ readonly label: string;
2879
+ /** Skip in keyboard nav and block selection. @default false */
2880
+ readonly disabled?: boolean;
2881
+ }
2882
+
2883
+ /**
2884
+ * The contract a `fold-option` needs from whatever owns it — the single-select
2885
+ * `fold-listbox` or the multi-select `fold-multiselect`. Injected through a token
2886
+ * (not the concrete class) so an option stays decoupled from either component and
2887
+ * there is no circular import. Generic over the option value type `T`; the token
2888
+ * itself is erased to `unknown` (the option↔owner value link is a runtime
2889
+ * contract — content projection can't carry `T` statically).
2890
+ */
2891
+ interface FoldListboxOwner<T> {
2892
+ /** Is this option's value currently selected? (equality vs. membership.) */
2893
+ isSelected(value: T): boolean;
2894
+ /** The keyboard-active option's id — the listbox's `aria-activedescendant`. */
2895
+ readonly activeId: Signal<string | null>;
2896
+ }
2897
+
2898
+ /**
2899
+ * `<fold-listbox>` — a **styleable** single-select, the richer sibling of the
2900
+ * native-`<select>`-wrapping {@link FoldSelectComponent}. Reach for it when the
2901
+ * options need custom rendering the native popup can't give (an icon, a second
2902
+ * line, a status) — otherwise `fold-select` stays the lighter, mobile-native
2903
+ * default. For picking several values, use `fold-multiselect`.
2904
+ *
2905
+ * Built on {@link FoldPopoverComponent}: the popover owns positioning, the native
2906
+ * top layer, outside-click / `Escape` dismissal and focus return. On top of that
2907
+ * this adds the ARIA select pattern — a `role="listbox"` that holds focus and
2908
+ * drives `aria-activedescendant`, full keyboard (↑/↓, `Home`/`End`, type-ahead,
2909
+ * `Enter`) — and Signal-Forms wiring (`FormValueControl<string>`), so `[formField]`
2910
+ * and `[(value)]` both work, exactly like `fold-input` / `fold-select`.
2911
+ *
2912
+ * ```html
2913
+ * <fold-listbox label="Devise" [(value)]="currency" placeholder="Choisir…">
2914
+ * <fold-option value="EUR">Euro</fold-option>
2915
+ * <fold-option value="USD">US Dollar</fold-option>
2916
+ * </fold-listbox>
2917
+ * ```
2918
+ *
2919
+ * @selector `fold-listbox`
2920
+ */
2921
+ declare class FoldListboxComponent<T> implements FormValueControl<T | null>, FoldListboxOwner<T> {
2922
+ /** Selected value (the chosen option's `value`), or `null` when nothing is
2923
+ * picked. A `model()` so `FormField` and `[(value)]` stay in sync. Generic
2924
+ * over the option value — `string` by inference, but `number`, an `enum` or
2925
+ * an object all work (objects need {@link compareWith}). */
2926
+ readonly value: _angular_core.ModelSignal<T | null>;
2927
+ /** How two values are compared for selection — supply it for **object** values
2928
+ * (reference equality won't match); primitives (string/number/enum) don't need
2929
+ * it. @default `Object.is` */
2930
+ readonly compareWith: _angular_core.InputSignal<((a: T, b: T) => boolean) | undefined>;
2931
+ /** Data-driven options — the alternative to projecting `<fold-option>`. When
2932
+ * set, the value type is linked to the options at compile time (no projection
2933
+ * seam). For rich rows, project `<ng-template #option let-o>`. */
2934
+ readonly options: _angular_core.InputSignal<readonly FoldSelectOption<T>[] | undefined>;
2935
+ /** Disabled state — bound automatically by `FormField`. */
2936
+ readonly disabled: _angular_core.InputSignal<boolean>;
2937
+ /** Two-way touched state — set on selection / blur, kept in sync with the field. */
2938
+ readonly touched: _angular_core.ModelSignal<boolean>;
2939
+ /** Validation errors — bound by `FormField`. */
2940
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
2941
+ /** Two-way open state of the popup. */
2942
+ readonly open: _angular_core.ModelSignal<boolean>;
2943
+ /** Fires when the **user picks an option** — carries the chosen value, never
2944
+ * `null`. Use it for the common "do X on selection" case to skip the
2945
+ * `T | null` narrowing that `[(value)]` / `valueChange` require. Clearing the
2946
+ * value (the × button) does **not** fire this; observe `value`/`valueChange`
2947
+ * for that. */
2948
+ readonly selectionChange: _angular_core.OutputEmitterRef<T>;
2949
+ /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
2950
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
2951
+ /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */
2952
+ readonly variant: _angular_core.InputSignal<"default" | "panel">;
2953
+ /** Optional label displayed above the control. */
2954
+ readonly label: _angular_core.InputSignal<string | undefined>;
2955
+ /** Show a required marker on the label. */
2956
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
2957
+ /** Show a lighter `(optional)` marker on the label (ignored when required). */
2958
+ readonly optional: _angular_core.InputSignalWithTransform<boolean, unknown>;
2959
+ /** The word inside the optional marker. @default 'optional' */
2960
+ readonly optionalLabel: _angular_core.InputSignal<string>;
2961
+ /** Optional helper text shown under the control. */
2962
+ readonly hint: _angular_core.InputSignal<string | undefined>;
2963
+ /** Text shown on the trigger while nothing is selected. */
2964
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
2965
+ /** Preferred popup placement. @default 'bottom-start' */
2966
+ readonly placement: _angular_core.InputSignal<FoldPopoverPlacement>;
2967
+ /** Show a clear (×) affordance on the trigger once a value is picked. */
2968
+ readonly allowClear: _angular_core.InputSignalWithTransform<boolean, unknown>;
2969
+ /** Accessible name of the clear button. @default 'Clear' */
2970
+ readonly clearLabel: _angular_core.InputSignal<string>;
2971
+ /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
2972
+ readonly inputId: string;
2973
+ /** Id of the `role="listbox"` element (own, distinct from the popover panel). */
2974
+ protected readonly listId: string;
2975
+ /** Rich per-row template for the `[options]` array API (`<ng-template #option>`). */
2976
+ protected readonly optionTemplate: _angular_core.Signal<TemplateRef<{
2977
+ $implicit: FoldSelectOption<T>;
2978
+ }> | undefined>;
2979
+ private readonly projectedOptions;
2980
+ private readonly renderedOptions;
2981
+ /** The live option instances, from whichever API is in use — the `[options]`
2982
+ * array (rendered in the view) when set, else the projected `<fold-option>`s. */
2983
+ private readonly allOptions;
2984
+ private readonly list;
2985
+ /** Compare two values — the injected `compareWith`, else `Object.is`. Called
2986
+ * only where both operands are `T`, so no erasure leaks in. */
2987
+ private eq;
2988
+ /** Shared roving/keyboard core; single-select commits + closes on activation. */
2989
+ private readonly nav;
2990
+ /** `aria-activedescendant`, read by each `fold-option` for its `is-active`. */
2991
+ readonly activeId: _angular_core.Signal<string | null>;
2992
+ /** The selected option's label, for the trigger. */
2993
+ protected readonly selectedLabel: _angular_core.Signal<string | undefined>;
2994
+ /** Whether the clear affordance is currently offered. */
2995
+ protected readonly showClear: _angular_core.Signal<boolean>;
2996
+ /** The message to show under the field: the first error, once touched. */
2997
+ protected readonly errorMessage: _angular_core.Signal<string | undefined>;
2998
+ /** `aria-describedby` target: the error when shown, else the hint, else none. */
2999
+ protected readonly describedBy: _angular_core.Signal<string | null>;
3000
+ /** Has the popup been opened at least once this lifetime — so closing it (by
3001
+ * Escape, outside-click, Tab or a pick) can mark the field touched, exactly as
3002
+ * a native `<select>` does on blur. Without this a `required` select that the
3003
+ * user opens and dismisses would never surface its error. */
3004
+ private hasOpened;
3005
+ constructor();
3006
+ /** A value is selected when it equals the current one (via `compareWith`). */
3007
+ isSelected(value: T): boolean;
3008
+ /** Clear the selection (the `allowClear` ×). */
3009
+ protected clear(event: Event): void;
3010
+ /** Open with the keys a native select opens on; otherwise type-ahead picks
3011
+ * directly without opening — native-`<select>` parity. */
3012
+ protected onTriggerKeydown(event: KeyboardEvent): void;
3013
+ /** Keyboard while the list is open and focused — delegated to the core. */
3014
+ protected onListKeydown(event: KeyboardEvent): void;
3015
+ /** Click on a row selects it (delegated, so projected rows need no wiring). */
3016
+ protected onListClick(event: MouseEvent): void;
3017
+ /** Hover arms the row, so pointer and keyboard share one active row. */
3018
+ protected onListPointermove(event: PointerEvent): void;
3019
+ /** Index of the selected option (or -1) — where the keyboard arms on open. */
3020
+ private selectedIndex;
3021
+ /** The enabled option under an event target, or null. */
3022
+ private enabledOptionFrom;
3023
+ private selectAt;
3024
+ private commit;
3025
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldListboxComponent<any>, never>;
3026
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldListboxComponent<any>, "fold-listbox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "allowClear": { "alias": "allowClear"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "open": "openChange"; "selectionChange": "selectionChange"; }, ["optionTemplate", "projectedOptions"], ["*"], true, never>;
3027
+ }
3028
+
3029
+ /**
3030
+ * `<fold-multiselect>` — the multi-select sibling of {@link FoldListboxComponent}.
3031
+ * Same styleable popover + `fold-option` rows, but the value is a set: activating
3032
+ * a row **toggles** its membership and the panel **stays open**, so several picks
3033
+ * are one interaction. It's a separate component (not a `multiple` flag) because
3034
+ * the Signal-Forms value type is genuinely different — `readonly string[]`, not
3035
+ * `string` — so `[formField]` and `[(value)]` stay honestly typed.
3036
+ *
3037
+ * `role="listbox"` + `aria-multiselectable`, full keyboard (↑/↓, `Home`/`End`,
3038
+ * type-ahead; `Enter`/`Space` toggle), and each selected row keeps its check. The
3039
+ * trigger summarises the selection (the chosen labels, joined).
3040
+ *
3041
+ * ```html
3042
+ * <fold-multiselect label="Genres" [(value)]="genres" placeholder="Pick a few…">
3043
+ * <fold-option value="rock">Rock</fold-option>
3044
+ * <fold-option value="jazz">Jazz</fold-option>
3045
+ * </fold-multiselect>
3046
+ * ```
3047
+ *
3048
+ * @selector `fold-multiselect`
3049
+ */
3050
+ declare class FoldMultiselectComponent<T> implements FormValueControl<readonly T[]>, FoldListboxOwner<T> {
3051
+ /** Selected values. A `model()` so `FormField` and `[(value)]` stay in sync.
3052
+ * Generic over the option value (string by inference; number/enum/object all
3053
+ * work — objects need {@link compareWith}). */
3054
+ readonly value: _angular_core.ModelSignal<readonly T[]>;
3055
+ /** How two values are compared for membership — supply it for **object**
3056
+ * values; primitives don't need it. @default `Object.is` */
3057
+ readonly compareWith: _angular_core.InputSignal<((a: T, b: T) => boolean) | undefined>;
3058
+ /** Data-driven options — the alternative to projecting `<fold-option>`. When
3059
+ * set, the value type is linked to the options at compile time. For rich rows,
3060
+ * project `<ng-template #option let-o>`. */
3061
+ readonly options: _angular_core.InputSignal<readonly FoldSelectOption<T>[] | undefined>;
3062
+ /** Disabled state — bound automatically by `FormField`. */
3063
+ readonly disabled: _angular_core.InputSignal<boolean>;
3064
+ /** Two-way touched state — set on the first toggle, kept in sync with the field. */
3065
+ readonly touched: _angular_core.ModelSignal<boolean>;
3066
+ /** Validation errors — bound by `FormField`. */
3067
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3068
+ /** Two-way open state of the popup. */
3069
+ readonly open: _angular_core.ModelSignal<boolean>;
3070
+ /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
3071
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
3072
+ /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */
3073
+ readonly variant: _angular_core.InputSignal<"default" | "panel">;
3074
+ /** Optional label displayed above the control. */
3075
+ readonly label: _angular_core.InputSignal<string | undefined>;
3076
+ /** Show a required marker on the label. */
3077
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3078
+ /** Show a lighter `(optional)` marker on the label (ignored when required). */
3079
+ readonly optional: _angular_core.InputSignalWithTransform<boolean, unknown>;
3080
+ /** The word inside the optional marker. @default 'optional' */
3081
+ readonly optionalLabel: _angular_core.InputSignal<string>;
3082
+ /** Optional helper text shown under the control. */
3083
+ readonly hint: _angular_core.InputSignal<string | undefined>;
3084
+ /** Text shown on the trigger while nothing is selected. */
3085
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
3086
+ /** Preferred popup placement. @default 'bottom-start' */
3087
+ readonly placement: _angular_core.InputSignal<FoldPopoverPlacement>;
3088
+ /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
3089
+ readonly inputId: string;
3090
+ /** Id of the `role="listbox"` element (own, distinct from the popover panel). */
3091
+ protected readonly listId: string;
3092
+ /** Rich per-row template for the `[options]` array API (`<ng-template #option>`). */
3093
+ protected readonly optionTemplate: _angular_core.Signal<TemplateRef<{
3094
+ $implicit: FoldSelectOption<T>;
3095
+ }> | undefined>;
3096
+ private readonly projectedOptions;
3097
+ private readonly renderedOptions;
3098
+ /** The live option instances, from whichever API is in use. */
3099
+ private readonly allOptions;
3100
+ private readonly list;
3101
+ /** Compare two values — the injected `compareWith`, else `Object.is`. */
3102
+ private eq;
3103
+ /** Shared roving/keyboard core; multi-select toggles + stays open on activation. */
3104
+ private readonly nav;
3105
+ /** `aria-activedescendant`, read by each `fold-option` for its `is-active`. */
3106
+ readonly activeId: _angular_core.Signal<string | null>;
3107
+ /** Fast-path membership: a `Set` when values compare by identity (the default,
3108
+ * O(1) per option), or `null` when a `compareWith` is supplied — then
3109
+ * membership falls back to a linear `eq` scan (correct for object values). */
3110
+ private readonly selectedSet;
3111
+ /** The chosen labels (in option order) — joined, collapsing to "…, +N" past
3112
+ * {@link SUMMARY_MAX} so the trigger can't grow unbounded. */
3113
+ protected readonly summaryLabel: _angular_core.Signal<string | undefined>;
3114
+ /** The message to show under the field: the first error, once touched. */
3115
+ protected readonly errorMessage: _angular_core.Signal<string | undefined>;
3116
+ /** `aria-describedby` target: the error when shown, else the hint, else none. */
3117
+ protected readonly describedBy: _angular_core.Signal<string | null>;
3118
+ /** Has the popup been opened this lifetime — so any close marks touched (blur
3119
+ * parity), even one that picked nothing. */
3120
+ private hasOpened;
3121
+ constructor();
3122
+ /** A value is selected when it's in the current set (via `compareWith`). */
3123
+ isSelected(value: T): boolean;
3124
+ /** Open with the keys a native select opens on. */
3125
+ protected onTriggerKeydown(event: KeyboardEvent): void;
3126
+ /** Keyboard while the list is open and focused — delegated to the core. */
3127
+ protected onListKeydown(event: KeyboardEvent): void;
3128
+ /** Click on a row toggles it (delegated, so projected rows need no wiring). */
3129
+ protected onListClick(event: MouseEvent): void;
3130
+ /** Hover arms the row, so pointer and keyboard share one active row. */
3131
+ protected onListPointermove(event: PointerEvent): void;
3132
+ /** Index of the first selected option (or -1) — where the keyboard arms on open. */
3133
+ private firstSelectedIndex;
3134
+ /** Index of the enabled option under an event target, or -1. */
3135
+ private enabledIndexFrom;
3136
+ /** Add or remove the option's value from the set; the panel stays open. */
3137
+ private toggle;
3138
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldMultiselectComponent<any>, never>;
3139
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldMultiselectComponent<any>, "fold-multiselect", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "open": "openChange"; }, ["optionTemplate", "projectedOptions"], ["*"], true, never>;
3140
+ }
3141
+
3142
+ /**
3143
+ * `<fold-option>` — a single choice inside a {@link FoldListboxComponent}. Project
3144
+ * as many as you need; the label is whatever you put inside (plain text, or richer
3145
+ * content — an icon, a description). It reads the parent for its own `is-selected`
3146
+ * / `is-active` state (computed, so nothing is pushed in during change detection —
3147
+ * which would read this required `value` before it is set), and exposes a stable
3148
+ * id the listbox points `aria-activedescendant` at.
3149
+ *
3150
+ * ```html
3151
+ * <fold-listbox [(value)]="currency">
3152
+ * <fold-option value="EUR">Euro</fold-option>
3153
+ * <fold-option value="USD" [disabled]="!usdAllowed">US Dollar</fold-option>
3154
+ * </fold-listbox>
3155
+ * ```
3156
+ *
3157
+ * @selector `fold-option`
3158
+ */
3159
+ declare class FoldOptionComponent<T> {
3160
+ private readonly host;
3161
+ private readonly owner;
3162
+ /** The value written back to the listbox when this option is chosen. */
3163
+ readonly value: _angular_core.InputSignal<T>;
3164
+ /** Disabled options are skipped by keyboard nav and can't be selected. */
3165
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3166
+ /** Stable, SSR-safe id — the listbox points `aria-activedescendant` at it. */
3167
+ readonly id: string;
3168
+ /** Derived from the parent — evaluated lazily during this option's own render,
3169
+ * so the required `value` is always set by the time it's read. */
3170
+ readonly selected: _angular_core.Signal<boolean>;
3171
+ readonly active: _angular_core.Signal<boolean>;
3172
+ /** The option's visible text — used for the trigger label and type-ahead. */
3173
+ get label(): string;
3174
+ /** Bring the option into view when it becomes keyboard-active. Optional-chained
3175
+ * so it's a no-op where `scrollIntoView` is absent (jsdom, non-DOM SSR). */
3176
+ scrollIntoView(): void;
3177
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldOptionComponent<any>, never>;
3178
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldOptionComponent<any>, "fold-option", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3179
+ }
3180
+
3181
+ /**
3182
+ * One password requirement shown as a live-validating dot in
3183
+ * {@link FoldPasswordFieldComponent}. The predicate is deliberately just a
3184
+ * function, so any validation style drops in:
3185
+ *
3186
+ * - **regex** — `foldRegexRule('An uppercase letter', /[A-Z]/)`, or inline
3187
+ * `{ label, test: (v) => /\d/.test(v) }`.
3188
+ * - **zod** (no dependency added here) —
3189
+ * `{ label: 'Valid', test: (v) => schema.safeParse(v).success }`.
3190
+ * - **anything** — length, an entropy score, a server-known blocklist, …
3191
+ */
3192
+ interface FoldPasswordRule {
3193
+ /** Human-readable requirement, e.g. "At least 8 characters". */
3194
+ readonly label: string;
3195
+ /** Passes when the value satisfies the rule. */
3196
+ readonly test: (value: string) => boolean;
3197
+ }
3198
+ /** Build a rule from a `RegExp` — the common case. */
3199
+ declare function foldRegexRule(label: string, pattern: RegExp): FoldPasswordRule;
3200
+ /**
3201
+ * A sensible default policy (English labels): 8+ characters, an uppercase and a
3202
+ * lowercase letter, and a digit. Override via the `rules` input for a different
3203
+ * policy or localised labels.
3204
+ */
3205
+ declare function foldDefaultPasswordRules(): readonly FoldPasswordRule[];
3206
+
3207
+ /**
3208
+ * `<fold-password-field>` — a password input with a **live requirements
3209
+ * checklist**. Composes `fold-input[type=password][revealable]` (so it inherits
3210
+ * the tokened box, the label/hint/error chrome and the show/hide eye) and renders
3211
+ * a dot per {@link FoldPasswordRule} that turns on as the value satisfies it.
3212
+ *
3213
+ * The rules are **injected**, not hard-coded — a `RegExp` (via `foldRegexRule`),
3214
+ * a `zod` `safeParse`, a length check, anything (see {@link FoldPasswordRule}).
3215
+ * `rules` defaults to {@link foldDefaultPasswordRules}. `validChange` emits
3216
+ * whether every rule passes; Signal-Forms-native (`FormValueControl<string>`).
3217
+ *
3218
+ * ```html
3219
+ * <fold-password-field
3220
+ * label="New password"
3221
+ * [(value)]="password"
3222
+ * (validChange)="ok.set($event)"
3223
+ * />
3224
+ * ```
3225
+ *
3226
+ * @selector `fold-password-field`
3227
+ */
3228
+ declare class FoldPasswordFieldComponent implements FormValueControl<string> {
3229
+ /** The password value. A `model()` so `FormField` and `[(value)]` stay in sync. */
3230
+ readonly value: _angular_core.ModelSignal<string>;
3231
+ /** Disabled state — bound automatically by `FormField`. */
3232
+ readonly disabled: _angular_core.InputSignal<boolean>;
3233
+ /** Two-way touched state — forwarded to the inner input (set on blur). */
3234
+ readonly touched: _angular_core.ModelSignal<boolean>;
3235
+ /** Validation errors — bound by `FormField`, shown under the input. */
3236
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3237
+ /** Label above the field. @default 'Password' */
3238
+ readonly label: _angular_core.InputSignal<string>;
3239
+ /** Placeholder text. */
3240
+ readonly placeholder: _angular_core.InputSignal<string>;
3241
+ /** Helper text under the input (above the rules). */
3242
+ readonly hint: _angular_core.InputSignal<string | undefined>;
3243
+ /** Show a required marker on the label. */
3244
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3245
+ /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
3246
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
3247
+ /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */
3248
+ readonly variant: _angular_core.InputSignal<"default" | "panel">;
3249
+ /** Native `autocomplete`. @default 'new-password' */
3250
+ readonly autocomplete: _angular_core.InputSignal<string | null>;
3251
+ /** Offer the reveal (eye) toggle. @default true */
3252
+ readonly revealable: _angular_core.InputSignalWithTransform<boolean, unknown>;
3253
+ /** `aria-label` of the reveal toggle when hidden — forwarded to the input. */
3254
+ readonly revealLabel: _angular_core.InputSignal<string>;
3255
+ /** `aria-label` of the reveal toggle when shown — forwarded to the input. */
3256
+ readonly hideLabel: _angular_core.InputSignal<string>;
3257
+ /** The requirements to display and validate against. @default the built-ins. */
3258
+ readonly rules: _angular_core.InputSignal<readonly FoldPasswordRule[]>;
3259
+ /** Built-in row marker: a filling `dot`, or a `check` tick on satisfied rows.
3260
+ * @default 'dot' */
3261
+ readonly marker: _angular_core.InputSignal<"check" | "dot">;
3262
+ /** Accessible name of the requirements list. @default 'Password requirements' */
3263
+ readonly rulesLabel: _angular_core.InputSignal<string>;
3264
+ /** Word prefixed to a satisfied rule for screen readers. @default 'met' */
3265
+ readonly metLabel: _angular_core.InputSignal<string>;
3266
+ /** Word prefixed to an unmet rule for screen readers. @default 'not met' */
3267
+ readonly unmetLabel: _angular_core.InputSignal<string>;
3268
+ /** Emits whether every rule passes, on each change. */
3269
+ readonly validChange: _angular_core.OutputEmitterRef<boolean>;
3270
+ /** Each rule paired with its live pass/fail state. Public + `exportAs`, so a
3271
+ * custom `[rules]` projection can render its own list off the same state:
3272
+ * `#pw="foldPasswordField"` then loop `pw.checklist()`. */
3273
+ readonly checklist: _angular_core.Signal<{
3274
+ label: string;
3275
+ met: boolean;
3276
+ }[]>;
3277
+ /** True when every rule passes. */
3278
+ protected readonly allValid: _angular_core.Signal<boolean>;
3279
+ constructor();
3280
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldPasswordFieldComponent, never>;
3281
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPasswordFieldComponent, "fold-password-field", ["foldPasswordField"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "revealable": { "alias": "revealable"; "required": false; "isSignal": true; }; "revealLabel": { "alias": "revealLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "rules": { "alias": "rules"; "required": false; "isSignal": true; }; "marker": { "alias": "marker"; "required": false; "isSignal": true; }; "rulesLabel": { "alias": "rulesLabel"; "required": false; "isSignal": true; }; "metLabel": { "alias": "metLabel"; "required": false; "isSignal": true; }; "unmetLabel": { "alias": "unmetLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "validChange": "validChange"; }, never, ["[rules]"], true, never>;
3282
+ }
3283
+
3284
+ /** One segment of a {@link FoldViewToggleComponent}. */
3285
+ interface FoldViewToggleOption {
3286
+ /** The value emitted when this segment is chosen. */
3287
+ readonly value: string;
3288
+ /** Optional leading icon. */
3289
+ readonly icon?: FoldIconName;
3290
+ /** Optional visible label. Omit for an icon-only segment (set `ariaLabel`). */
3291
+ readonly label?: string;
3292
+ /** Accessible name — required when there is no visible `label`. */
3293
+ readonly ariaLabel?: string;
3294
+ /** Disable this segment. */
3295
+ readonly disabled?: boolean;
3296
+ }
3297
+ /**
3298
+ * `<fold-view-toggle>` — a compact **segmented single-select** (Cards / Table, a
3299
+ * density switch, a chart mode…). Generic and zero-domain: pass `options` and
3300
+ * bind `[(value)]`. It's a proper `role="radiogroup"` of `role="radio"` segments
3301
+ * with roving tabindex and arrow-key selection (Home/End too), so it's a real
3302
+ * single-choice control, not two independent toggles.
3303
+ *
3304
+ * ```html
3305
+ * <fold-view-toggle
3306
+ * ariaLabel="View"
3307
+ * [options]="[
3308
+ * { value: 'cards', icon: 'grid', ariaLabel: 'Cards' },
3309
+ * { value: 'table', icon: 'list', ariaLabel: 'Table' },
3310
+ * ]"
3311
+ * [(value)]="view"
3312
+ * />
3313
+ * ```
3314
+ *
3315
+ * @selector `fold-view-toggle`
3316
+ */
3317
+ declare class FoldViewToggleComponent {
3318
+ private readonly host;
3319
+ /** The segments, in order. */
3320
+ readonly options: _angular_core.InputSignal<readonly FoldViewToggleOption[]>;
3321
+ /** The selected value. `[(value)]` / `FormField`-friendly. */
3322
+ readonly value: _angular_core.ModelSignal<string>;
3323
+ /** Accessible name of the group. */
3324
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
3325
+ /** Size preset. @default 'md' */
3326
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
3327
+ /** How the selected segment reads: a neutral `raised` chip, or an `accent`
3328
+ * brand tint. @default 'raised' */
3329
+ readonly activeStyle: _angular_core.InputSignal<"accent" | "raised">;
3330
+ /** Hide visible labels, keeping icons only (labels stay as accessible names). */
3331
+ readonly iconOnly: _angular_core.InputSignalWithTransform<boolean, unknown>;
3332
+ constructor();
3333
+ /** The segment holding the tab stop: the selected one when enabled, else the
3334
+ * first enabled — never a disabled (unfocusable) segment, so Tab always
3335
+ * reaches the group even if the selected value is disabled. */
3336
+ protected readonly rovingValue: _angular_core.Signal<string | null>;
3337
+ /** Pick a segment (no-op if disabled or already selected). */
3338
+ protected select(option: FoldViewToggleOption): void;
3339
+ /** Arrow keys move the selection between enabled segments (radiogroup pattern). */
3340
+ protected onKeydown(event: KeyboardEvent): void;
3341
+ /** The value to move to for a nav key, or null if the key isn't one. */
3342
+ private nextValue;
3343
+ private focusValue;
3344
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldViewToggleComponent, never>;
3345
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldViewToggleComponent, "fold-view-toggle", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "activeStyle": { "alias": "activeStyle"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
3346
+ }
3347
+
3348
+ /**
3349
+ * `<fold-checkbox>` — the boolean form control. A **native** `<input
3350
+ * type="checkbox">` (so keyboard, focus, the `checkbox` role, form submission
3351
+ * and `indeterminate` all come for free) is visually replaced by a tokenised
3352
+ * box + check/dash mark: best-in-class semantics with full visual control.
3353
+ *
3354
+ * Drive it standalone with `[(checked)]` / `(checkedChange)`, or bind a signal
3355
+ * form field with `[formField]` (it implements `FormCheckboxControl`, whose
3356
+ * value member is `checked` — not `value` — so the field's value **is** the
3357
+ * checked state; `disabled`, `touched` and `errors` are wired by `FormField`).
3358
+ * `indeterminate` renders the mixed state
3359
+ * (e.g. a "select all" over a partial selection); it is a visual cue only —
3360
+ * clicking a mixed box checks it, as natively.
3361
+ *
3362
+ * Accessible by construction: the box is decorative, the native input carries
3363
+ * the semantics; a visible `label` wraps the input (click-to-toggle) and names
3364
+ * it, otherwise pass `ariaLabel`. Focus-visible ring, `prefers-reduced-motion`
3365
+ * and `forced-colors` are all handled.
3366
+ *
3367
+ * @selector `fold-checkbox`
2441
3368
  *
2442
- * The fill is driven by a `--sl-pct` custom property computed from the value, so
3369
+ * @example
3370
+ * ```html
3371
+ * <fold-checkbox label="Remember me" [(checked)]="remember" />
3372
+ * <fold-checkbox ariaLabel="Select row" [checked]="selected" (checkedChange)="toggle()" />
3373
+ * <fold-checkbox label="I accept the terms" required [formField]="form.consent" />
3374
+ * ```
3375
+ */
3376
+ declare class FoldCheckboxComponent implements FormCheckboxControl {
3377
+ /** Checked state — the signal-forms field value. Bind with `[(checked)]`,
3378
+ * `(checkedChange)`, or `[formField]`. */
3379
+ readonly checked: _angular_core.ModelSignal<boolean>;
3380
+ /** Disabled state — bound automatically by `FormField`. */
3381
+ readonly disabled: _angular_core.InputSignal<boolean>;
3382
+ /** Two-way touched state — set on blur so `FormField` can surface errors. */
3383
+ readonly touched: _angular_core.ModelSignal<boolean>;
3384
+ /** Validation errors — bound by `FormField` from the field. */
3385
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3386
+ /** Mixed / tri-state visual (native `indeterminate`, a property not attribute). */
3387
+ readonly indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
3388
+ /** Optional visible label — wraps the box, so clicking it toggles. */
3389
+ readonly label: _angular_core.InputSignal<string | undefined>;
3390
+ /** Accessible name when there is no visible `label`. */
3391
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
3392
+ /** Optional helper text shown under the control. */
3393
+ readonly hint: _angular_core.InputSignal<string | undefined>;
3394
+ /** Show a required marker on the label (and set the native `required`). */
3395
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3396
+ /** Size preset — `sm` for dense rows/tables, `md` (default) for forms. */
3397
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
3398
+ /** Unique, SSR-safe id for label + message association. */
3399
+ readonly inputId: string;
3400
+ /** The message under the control: the first error once touched, else the hint. */
3401
+ protected readonly errorMessage: _angular_core.Signal<string | undefined>;
3402
+ protected readonly message: _angular_core.Signal<string | null>;
3403
+ /** `aria-describedby` target: the error when shown, else the hint, else none. */
3404
+ protected readonly describedBy: _angular_core.Signal<string | null>;
3405
+ constructor();
3406
+ /** Native change → sync the model (also fires the auto `checkedChange`). */
3407
+ onChange(event: Event): void;
3408
+ protected onBlur(): void;
3409
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCheckboxComponent, never>;
3410
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCheckboxComponent, "fold-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touched": "touchedChange"; }, never, never, true, never>;
3411
+ }
3412
+
3413
+ /**
3414
+ * `<fold-slider>` — a single-value range slider with the design-system track,
3415
+ * fill and thumb (a styled native `<input type="range">`, so keyboard, focus and
3416
+ * the `slider` role are all native). The fill is a `--sl-pct` custom property, so
2443
3417
  * there is no overlay markup. For a min↔max pair, use {@link FoldRangeSliderComponent}.
2444
3418
  *
3419
+ * Integrates with signal forms via `FormValueControl<number>` (bind
3420
+ * `[formField]`), or drive it standalone with `[(value)]` / `(valueChange)`. A
3421
+ * visible `label` is a real `<label for>`; a `valueText` override is announced
3422
+ * to assistive tech through `aria-valuetext` (so a value that _means_ something —
3423
+ * `"off"`, `"12:30"` — reads as that, not the raw number).
3424
+ *
2445
3425
  * @selector `fold-slider`
2446
3426
  *
2447
3427
  * @example
2448
3428
  * ```html
2449
- * <fold-slider label="railWidth" [min]="48" [max]="120" [(value)]="width" />
2450
- * <fold-slider label="min" [max]="10" [valueText]="min() || 'off'" [(value)]="min" />
3429
+ * <fold-slider label="Rail width" [min]="48" [max]="120" [(value)]="width" />
3430
+ * <fold-slider label="Volume" [formField]="form.volume" />
3431
+ * <fold-slider label="Min" [max]="10" [valueText]="min() || 'off'" [(value)]="min" />
2451
3432
  * ```
2452
3433
  */
2453
- declare class FoldSliderComponent {
2454
- /** The bound value. A `model()` so `[(value)]` keeps it in sync. */
3434
+ declare class FoldSliderComponent implements FormValueControl<number> {
3435
+ /** The bound value — a `model()`, so `[(value)]` and signal forms both sync. */
2455
3436
  readonly value: _angular_core.ModelSignal<number>;
2456
- /** Minimum value. @default 0 */
2457
- readonly min: _angular_core.InputSignal<number>;
2458
- /** Maximum value. @default 100 */
2459
- readonly max: _angular_core.InputSignal<number>;
3437
+ /** Minimum value (also the field's min validator via `FormField`). @default 0 */
3438
+ readonly min: _angular_core.InputSignal<number | undefined>;
3439
+ /** Maximum value (also the field's max validator via `FormField`). @default 100 */
3440
+ readonly max: _angular_core.InputSignal<number | undefined>;
2460
3441
  /** Increment granularity. @default 1 */
2461
- readonly step: _angular_core.InputSignal<number>;
2462
- /** Optional label shown above the track (also the `aria-label`). */
3442
+ readonly step: _angular_core.InputSignal<number | undefined>;
3443
+ /** Optional visible label (a real `<label for>`), also the accessible name. */
2463
3444
  readonly label: _angular_core.InputSignal<string | undefined>;
2464
- /** Override the displayed value text — e.g. `'off'` when the value means "no bound". */
3445
+ /** Accessible name when there is no visible `label`. */
3446
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
3447
+ /** Override the displayed + announced value text — e.g. `'off'` for "no bound". */
2465
3448
  readonly valueText: _angular_core.InputSignal<string | undefined>;
2466
3449
  /** Show the current value next to the label. @default true */
2467
3450
  readonly showValue: _angular_core.InputSignalWithTransform<boolean, unknown>;
3451
+ /** Optional helper text shown under the track. */
3452
+ readonly hint: _angular_core.InputSignal<string | undefined>;
2468
3453
  /** Disable interaction. */
2469
3454
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2470
- /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
3455
+ /** Two-way touched state — set on blur so `FormField` can surface errors. */
3456
+ readonly touched: _angular_core.ModelSignal<boolean>;
3457
+ /** Validation errors — bound by `FormField` from the field. */
3458
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3459
+ /** Unique, SSR-safe id for label + message association. */
2471
3460
  readonly inputId: string;
3461
+ /** Resolved bounds — the interface types min/max/step as `number | undefined`
3462
+ * (a `FormField` may leave a bound unset); fall back to the standalone defaults. */
3463
+ protected readonly rMin: _angular_core.Signal<number>;
3464
+ protected readonly rMax: _angular_core.Signal<number>;
3465
+ protected readonly rStep: _angular_core.Signal<number>;
2472
3466
  /** Fill percentage (0–100) of the track, from the value within [min, max]. */
2473
3467
  protected readonly percent: _angular_core.Signal<number>;
2474
3468
  /** The value text to display: the explicit {@link valueText} override, else the number. */
2475
3469
  protected readonly display: _angular_core.Signal<string>;
3470
+ /** The message under the track: the first error once touched, else the hint. */
3471
+ protected readonly errorMessage: _angular_core.Signal<string | undefined>;
3472
+ protected readonly message: _angular_core.Signal<string | null>;
3473
+ protected readonly describedBy: _angular_core.Signal<string | null>;
2476
3474
  protected onInput(event: Event): void;
3475
+ protected onBlur(): void;
2477
3476
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldSliderComponent, never>;
2478
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldSliderComponent, "fold-slider", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "valueText": { "alias": "valueText"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
3477
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldSliderComponent, "fold-slider", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "valueText": { "alias": "valueText"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2479
3478
  }
2480
3479
 
2481
- /** A min↔max pair emitted by {@link FoldRangeSliderComponent}. */
3480
+ /** A min↔max pair held by {@link FoldRangeSliderComponent}. */
2482
3481
  type FoldRangeValue = {
2483
3482
  min: number;
2484
3483
  max: number;
@@ -2488,16 +3487,21 @@ type FoldRangeValue = {
2488
3487
  * window over `[min, max]`. Shares the design-system track / fill / thumb with
2489
3488
  * {@link FoldSliderComponent}. For a single value, use `fold-slider`.
2490
3489
  *
3490
+ * Two-way bound via `[(value)]` (a `model()`), or one-way `[value]` +
3491
+ * `(valueChange)`. The thumbs never cross (each clamps against the other). The
3492
+ * pair is a labelled `role="group"`; each thumb announces its formatted value
3493
+ * through `aria-valuetext`, and the thumb names (`minLabel` / `maxLabel`) are
3494
+ * inputs so a non-English app can localise them.
3495
+ *
2491
3496
  * @selector `fold-range-slider`
2492
3497
  *
2493
3498
  * @example
2494
3499
  * ```html
2495
- * <fold-range-slider label="BPM" [min]="60" [max]="220" [step]="5"
2496
- * [value]="bpm()" (valueChange)="onBpm($event)" />
3500
+ * <fold-range-slider label="BPM" [min]="60" [max]="220" [step]="5" [(value)]="bpm" />
2497
3501
  * ```
2498
3502
  */
2499
3503
  declare class FoldRangeSliderComponent {
2500
- /** Label shown above the track. */
3504
+ /** Label shown above the track (names the `role="group"`). */
2501
3505
  readonly label: _angular_core.InputSignal<string>;
2502
3506
  /** Lower bound of the selectable range. @default 0 */
2503
3507
  readonly min: _angular_core.InputSignal<number>;
@@ -2505,12 +3509,24 @@ declare class FoldRangeSliderComponent {
2505
3509
  readonly max: _angular_core.InputSignal<number>;
2506
3510
  /** Increment granularity. @default 1 */
2507
3511
  readonly step: _angular_core.InputSignal<number>;
2508
- /** The current `{ min, max }` window; falls back to the full range when unset. */
2509
- readonly value: _angular_core.InputSignal<FoldRangeValue | undefined>;
2510
- /** How the values are formatted for display. @default 'number' */
3512
+ /** The current `{ min, max }` window; falls back to the full range when unset.
3513
+ * A `model()`, so `[(value)]` and `(valueChange)` both work. */
3514
+ readonly value: _angular_core.ModelSignal<FoldRangeValue | undefined>;
3515
+ /** Fires when the **user drags a thumb** — carries the resolved `{ min, max }`,
3516
+ * never `undefined`. Use it for the common "filter on change" case to skip the
3517
+ * `FoldRangeValue | undefined` narrowing that `[(value)]` / `valueChange`
3518
+ * require. */
3519
+ readonly rangeChange: _angular_core.OutputEmitterRef<FoldRangeValue>;
3520
+ /** How the values are formatted for display + `aria-valuetext`. @default 'number' */
2511
3521
  readonly unit: _angular_core.InputSignal<"number" | "duration">;
2512
- /** Emits the new window whenever either thumb moves. */
2513
- readonly valueChange: _angular_core.OutputEmitterRef<FoldRangeValue>;
3522
+ /** Disable both thumbs. */
3523
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3524
+ /** Accessible name suffix for the lower thumb. @default 'minimum' */
3525
+ readonly minLabel: _angular_core.InputSignal<string>;
3526
+ /** Accessible name suffix for the upper thumb. @default 'maximum' */
3527
+ readonly maxLabel: _angular_core.InputSignal<string>;
3528
+ /** Id of the visible label, so the group can point at it. */
3529
+ readonly labelId: string;
2514
3530
  protected readonly currentMin: _angular_core.Signal<number>;
2515
3531
  protected readonly currentMax: _angular_core.Signal<number>;
2516
3532
  protected readonly fillLeft: _angular_core.Signal<number>;
@@ -2518,8 +3534,9 @@ declare class FoldRangeSliderComponent {
2518
3534
  protected formatValue(val: number): string;
2519
3535
  protected onMinChange(event: Event): void;
2520
3536
  protected onMaxChange(event: Event): void;
3537
+ private commit;
2521
3538
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldRangeSliderComponent, never>;
2522
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldRangeSliderComponent, "fold-range-slider", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
3539
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldRangeSliderComponent, "fold-range-slider", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "minLabel": { "alias": "minLabel"; "required": false; "isSignal": true; }; "maxLabel": { "alias": "maxLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "rangeChange": "rangeChange"; }, never, never, true, never>;
2523
3540
  }
2524
3541
 
2525
3542
  /** Severity of a {@link FoldCalloutComponent} — colour + default icon. */
@@ -3320,6 +4337,53 @@ declare class FoldHeroSectionComponent {
3320
4337
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldHeroSectionComponent, "fold-hero-section", never, { "align": { "alias": "align"; "required": false; "isSignal": true; }; "wash": { "alias": "wash"; "required": false; "isSignal": true; }; }, {}, never, ["[heroBackdrop]", "*"], true, never>;
3321
4338
  }
3322
4339
 
4340
+ /**
4341
+ * Every user-facing / accessible string the paginator renders. Parameterised
4342
+ * strings (the visible range, a page's aria-label) are functions so a locale
4343
+ * can reorder or reword them, not just translate a fixed template. All defaults
4344
+ * are English — a non-English app overrides them once via
4345
+ * {@link provideFoldPaginatorLabels}, or per instance via the `labels` input.
4346
+ */
4347
+ interface FoldPaginatorLabels {
4348
+ /** `aria-label` of the page-size `<select>`. */
4349
+ readonly pageSize: string;
4350
+ /** Trailing text after the size selector, e.g. "per page". */
4351
+ readonly perPage: string;
4352
+ /** `aria-label` of the page-navigation `<nav>`. */
4353
+ readonly nav: string;
4354
+ /** Previous-page button `aria-label`. */
4355
+ readonly previous: string;
4356
+ /** Next-page button `aria-label`. */
4357
+ readonly next: string;
4358
+ /** Shown in place of the range when there are no items. */
4359
+ readonly empty: string;
4360
+ /** A page button's `aria-label`, e.g. `(3) => "Page 3"`. */
4361
+ readonly page: (page: number) => string;
4362
+ /** The visible range label, e.g. `(21, 30, 237) => "21–30 of 237"`. */
4363
+ readonly range: (start: number, end: number, total: number) => string;
4364
+ }
4365
+ /** The English defaults — the base every override merges onto. */
4366
+ declare const FOLD_PAGINATOR_DEFAULT_LABELS: FoldPaginatorLabels;
4367
+ /** App-wide paginator labels; defaults to English. */
4368
+ declare const FOLD_PAGINATOR_LABELS: InjectionToken<FoldPaginatorLabels>;
4369
+ /**
4370
+ * Provide app-wide paginator labels once at bootstrap. Partial — any key you
4371
+ * omit keeps its English default.
4372
+ *
4373
+ * @example
4374
+ * ```ts
4375
+ * // app.config.ts
4376
+ * providers: [
4377
+ * provideFoldPaginatorLabels({
4378
+ * perPage: "par page",
4379
+ * previous: "Page précédente",
4380
+ * range: (s, e, t) => `${s}–${e} sur ${t}`,
4381
+ * }),
4382
+ * ];
4383
+ * ```
4384
+ */
4385
+ declare function provideFoldPaginatorLabels(labels: Partial<FoldPaginatorLabels>): Provider;
4386
+
3323
4387
  /**
3324
4388
  * Item representing one slot in the page navigation bar.
3325
4389
  * Either a concrete page number (1-indexed) or an ellipsis gap.
@@ -3330,15 +4394,29 @@ type FoldPageItem = {
3330
4394
  } | {
3331
4395
  kind: "gap";
3332
4396
  };
4397
+ /** Which control a page change should refocus after the parent re-renders. */
4398
+ type RefocusTarget = "active" | "prev" | "next";
3333
4399
  /**
3334
4400
  * `fold-paginator` — presentational, fully controlled.
3335
4401
  *
3336
4402
  * Designed for **server-side pagination** (offset/limit): the parent owns
3337
4403
  * `currentPage`, `pageSize` and `totalItems`, fires the HTTP call on
3338
- * `(pageChange)` / `(pageSizeChange)`, then feeds the new values back in.
4404
+ * `(pageChange)` / `(pageSizeChange)`, then feeds the new values back in. The
4405
+ * component tolerates a lagging or out-of-range `currentPage` — the visible
4406
+ * range, the active button and the prev/next guards all use an internally
4407
+ * clamped page, so a stale value can never render a nonsensical range.
3339
4408
  *
3340
4409
  * Renders: `[page size selector] [items range] [‹ 1 2 3 … N ›]`.
3341
4410
  *
4411
+ * **Accessible:** the `<nav>`, both arrows, each page (`aria-current="page"` on
4412
+ * the active one) and the size selector carry labels, all overridable for i18n
4413
+ * via {@link provideFoldPaginatorLabels} (English by default) or the `labels`
4414
+ * input. After a page change it moves focus to the control the user was on (the
4415
+ * active page, or the prev/next arrow while it stays enabled) so keyboard focus
4416
+ * is never dropped to `<body>`.
4417
+ *
4418
+ * @selector `fold-paginator`
4419
+ *
3342
4420
  * @example
3343
4421
  * ```html
3344
4422
  * <fold-paginator
@@ -3366,13 +4444,28 @@ declare class FoldPaginatorComponent {
3366
4444
  */
3367
4445
  readonly siblingCount: _angular_core.InputSignal<number>;
3368
4446
  /** Disables all controls (both page nav and size selector). */
3369
- readonly disabled: _angular_core.InputSignal<boolean>;
4447
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4448
+ /** Per-instance label overrides (merged over the app-wide / English defaults). */
4449
+ readonly labels: _angular_core.InputSignal<Partial<FoldPaginatorLabels> | undefined>;
3370
4450
  /** Fires with the new 1-indexed page number. */
3371
4451
  readonly pageChange: _angular_core.OutputEmitterRef<number>;
3372
4452
  /** Fires with the newly selected page size. */
3373
4453
  readonly pageSizeChange: _angular_core.OutputEmitterRef<number>;
4454
+ private readonly host;
4455
+ private readonly injectedLabels;
4456
+ /** Effective labels — the app-wide (or English) set, with the `labels` input on top. */
4457
+ readonly l: _angular_core.Signal<FoldPaginatorLabels>;
3374
4458
  /** Total pages, minimum 1 so the UI always shows at least "1 of 1". */
3375
4459
  readonly totalPages: _angular_core.Signal<number>;
4460
+ /** The current page clamped into `[1, totalPages]` — the value everything
4461
+ * visible derives from, so a lagging/out-of-range parent never shows a
4462
+ * broken range or highlights a phantom page. */
4463
+ readonly page: _angular_core.Signal<number>;
4464
+ /** Sanitised sibling count — a non-negative integer. */
4465
+ private readonly siblings;
4466
+ /** The rendered size options, always including the current `pageSize` (so the
4467
+ * `<select>` can never silently show a value the parent isn't using). */
4468
+ readonly sizeOptions: _angular_core.Signal<readonly number[]>;
3376
4469
  /** Zero-indexed start / end of the currently visible range (for the label). */
3377
4470
  readonly rangeStart: _angular_core.Signal<number>;
3378
4471
  readonly rangeEnd: _angular_core.Signal<number>;
@@ -3386,12 +4479,16 @@ declare class FoldPaginatorComponent {
3386
4479
  * any two non-contiguous blocks.
3387
4480
  */
3388
4481
  readonly pageItems: _angular_core.Signal<FoldPageItem[]>;
3389
- goToPage(page: number): void;
4482
+ private refocus;
4483
+ private lastFocusedPage;
4484
+ constructor();
4485
+ private applyRefocus;
4486
+ goToPage(page: number, via?: RefocusTarget): void;
3390
4487
  prev(): void;
3391
4488
  next(): void;
3392
4489
  onPageSizeChange(raw: string): void;
3393
4490
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldPaginatorComponent, never>;
3394
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPaginatorComponent, "fold-paginator", never, { "currentPage": { "alias": "currentPage"; "required": true; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": true; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, never, never, true, never>;
4491
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPaginatorComponent, "fold-paginator", never, { "currentPage": { "alias": "currentPage"; "required": true; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": true; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, never, never, true, never>;
3395
4492
  }
3396
4493
 
3397
4494
  type FoldViewNavItem = {
@@ -3468,7 +4565,7 @@ declare class FoldViewNavComponent {
3468
4565
  * - `compact` (default) — inline / popover bars.
3469
4566
  * - `comfortable` — a prominent, page-level bar.
3470
4567
  */
3471
- readonly size: _angular_core.InputSignal<"compact" | "comfortable">;
4568
+ readonly size: _angular_core.InputSignal<"comfortable" | "compact">;
3472
4569
  /**
3473
4570
  * Collapse the bar to icons (independent of {@link size}). **Horizontal**, an
3474
4571
  * icon accordion: every item but the active one drops to its icon, the active
@@ -3564,7 +4661,7 @@ declare class FoldTabsComponent implements FoldTabsContext {
3564
4661
  */
3565
4662
  readonly direction: _angular_core.InputSignal<"auto" | "vertical" | "horizontal">;
3566
4663
  /** Density — see {@link FoldViewNavComponent} for the same scale. */
3567
- readonly size: _angular_core.InputSignal<"compact" | "comfortable">;
4664
+ readonly size: _angular_core.InputSignal<"comfortable" | "compact">;
3568
4665
  /** Collapse to icons — see {@link FoldViewNavComponent.collapsed}. */
3569
4666
  readonly collapsed: _angular_core.InputSignalWithTransform<boolean, unknown>;
3570
4667
  /** `surface` (filled bar, default) or `transparent`. */
@@ -4078,6 +5175,220 @@ interface FoldPanelLabels {
4078
5175
  */
4079
5176
  declare function provideFoldPanelLabels(labels: FoldPanelLabels): Provider;
4080
5177
 
5178
+ /**
5179
+ * `<fold-popover>` — an anchored floating layer. Project a trigger
5180
+ * (`[foldPopoverTrigger]`) and any content; the content renders in the native
5181
+ * **top layer** (via the `popover` attribute, so it escapes `overflow: hidden`
5182
+ * and every `z-index`) and is positioned against the trigger with a
5183
+ * dependency-free flip/shift engine ({@link computePlacement}).
5184
+ *
5185
+ * Controlled or uncontrolled through `[(open)]`. Dismissal is owned here
5186
+ * (outside-click + `Escape`) rather than the browser's light-dismiss, so
5187
+ * re-clicking the trigger toggles cleanly instead of reopening. Opening moves
5188
+ * focus into the panel; closing returns it to the trigger. The trigger gets
5189
+ * `aria-haspopup` / `aria-expanded` / `aria-controls` wired automatically.
5190
+ *
5191
+ * For an actions menu with `role="menu"` + keyboard, use `fold-dropdown`, which
5192
+ * is built on this.
5193
+ *
5194
+ * The panel's width is `max-content`; to make it match the trigger (a select-like
5195
+ * dropdown), read the published `--fold-popover-anchor-width` in the panel's CSS
5196
+ * (e.g. `min-width: var(--fold-popover-anchor-width)`) — it tracks the trigger.
5197
+ *
5198
+ * @selector `fold-popover`
5199
+ *
5200
+ * The trigger carries `[foldPopoverTrigger]`; the floating content is marked
5201
+ * `foldPopoverPanel`.
5202
+ *
5203
+ * @example
5204
+ * ```html
5205
+ * <fold-popover placement="bottom-end">
5206
+ * <button foldButton foldPopoverTrigger>Filters</button>
5207
+ * <div foldPopoverPanel class="my-panel">…</div>
5208
+ * </fold-popover>
5209
+ * ```
5210
+ */
5211
+ declare class FoldPopoverComponent {
5212
+ private readonly renderer;
5213
+ private readonly host;
5214
+ /** Preferred placement before collision handling. @default "bottom-start" */
5215
+ readonly placement: _angular_core.InputSignal<FoldPopoverPlacement>;
5216
+ /** Ordered placements to try when the preferred can't fit (default: the
5217
+ * opposite side). The first that fits wins, else the roomiest. */
5218
+ readonly fallbackPlacements: _angular_core.InputSignal<readonly FoldPopoverPlacement[] | undefined>;
5219
+ /** Gap between the trigger and the panel, in px. @default 8 */
5220
+ readonly offset: _angular_core.InputSignal<number>;
5221
+ /** Minimum gap kept from the viewport edge, in px. @default 8 */
5222
+ readonly padding: _angular_core.InputSignal<number>;
5223
+ /** Move focus into the panel on open. @default true (a dropdown sets false to
5224
+ * focus its first item instead). */
5225
+ readonly autoFocus: _angular_core.InputSignal<boolean>;
5226
+ /** Show a small arrow pointing at the trigger. @default false */
5227
+ readonly arrow: _angular_core.InputSignalWithTransform<boolean, unknown>;
5228
+ /** Two-way open state — drive it, or let the trigger toggle it. */
5229
+ readonly open: _angular_core.ModelSignal<boolean>;
5230
+ /** SSR-safe id linking the trigger's `aria-controls` to the panel. */
5231
+ readonly panelId: string;
5232
+ /** Override the trigger's `aria-controls` target — point it at the real
5233
+ * controlled element (e.g. an inner `role="listbox"`) when the panel is just a
5234
+ * wrapper. @default the panel's own id. */
5235
+ readonly ariaControls: _angular_core.InputSignal<string | undefined>;
5236
+ private readonly panel;
5237
+ private readonly inner;
5238
+ private readonly arrowEl;
5239
+ /**
5240
+ * The marked trigger — the projected `[foldPopoverTrigger]`. Found by DOM
5241
+ * query on the host (projected content is a DOM descendant of the host), so it
5242
+ * resolves regardless of how deeply it is re-projected (e.g. through
5243
+ * `fold-dropdown`) — a content query would not survive the re-projection. Used
5244
+ * to anchor against and to detect trigger clicks.
5245
+ */
5246
+ private markedTrigger;
5247
+ private static readonly FOCUSABLE;
5248
+ /**
5249
+ * The focusable trigger — the marked element itself if it's focusable, else
5250
+ * the first focusable inside it (e.g. `fold-button-icon`'s inner `<button>`).
5251
+ * This is what receives focus + the aria wiring, so a wrapper trigger is still
5252
+ * fully keyboard-accessible.
5253
+ */
5254
+ private focusableTrigger;
5255
+ constructor();
5256
+ /** Position the panel against the trigger: flip → size (cap + scroll) → shift,
5257
+ * then place the arrow. */
5258
+ private reposition;
5259
+ /** Set a `max-*` cap in px, but only when positive (skip a degenerate 0). */
5260
+ private applyCap;
5261
+ /** Center the arrow on the anchor along the cross axis, clamped to the panel. */
5262
+ private positionArrow;
5263
+ protected onHostClick(event: MouseEvent): void;
5264
+ protected onArrowDown(event: Event): void;
5265
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldPopoverComponent, never>;
5266
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPopoverComponent, "fold-popover", never, { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "fallbackPlacements": { "alias": "fallbackPlacements"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "autoFocus": { "alias": "autoFocus"; "required": false; "isSignal": true; }; "arrow": { "alias": "arrow"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "ariaControls": { "alias": "ariaControls"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[foldPopoverPanel]"], true, never>;
5267
+ }
5268
+
5269
+ /**
5270
+ * Marks the element inside a `<fold-popover>` that opens it — apply to a real,
5271
+ * focusable control (a `foldButton`), or a wrapper whose first focusable child
5272
+ * is the control (a `fold-button-icon`). The popover anchors to this element,
5273
+ * and wires `aria-haspopup` / `aria-expanded` / `aria-controls` onto the
5274
+ * focusable control. The value picks the `aria-haspopup` token — it is reflected
5275
+ * to the marker attribute so both `foldPopoverTrigger="menu"` and
5276
+ * `[foldPopoverTrigger]="expr"` work.
5277
+ *
5278
+ * ```html
5279
+ * <fold-popover>
5280
+ * <button foldButton foldPopoverTrigger="menu">Actions</button>
5281
+ * …panel…
5282
+ * </fold-popover>
5283
+ * ```
5284
+ *
5285
+ * @selector `[foldPopoverTrigger]`
5286
+ */
5287
+ declare class FoldPopoverTriggerDirective {
5288
+ /** The trigger's host element. */
5289
+ readonly el: ElementRef<HTMLElement>;
5290
+ /**
5291
+ * `aria-haspopup` value. @default "dialog" (use "menu" for a dropdown). Bare
5292
+ * `foldPopoverTrigger` (no value) keeps the default.
5293
+ */
5294
+ readonly haspopup: _angular_core.InputSignalWithTransform<FoldTriggerHaspopup, string>;
5295
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldPopoverTriggerDirective, never>;
5296
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldPopoverTriggerDirective, "[foldPopoverTrigger]", never, { "haspopup": { "alias": "foldPopoverTrigger"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5297
+ }
5298
+ type FoldTriggerHaspopup = "menu" | "dialog" | "listbox" | "true";
5299
+
5300
+ /**
5301
+ * `<fold-dropdown>` — an actions menu built on {@link FoldPopoverComponent}.
5302
+ * Project a trigger (`[foldPopoverTrigger]`) and a list of
5303
+ * `<fold-dropdown-item>`s; the menu is a `role="menu"` with full keyboard
5304
+ * support (↑/↓ roving, `Home`/`End`, type-ahead), opens focused on its first
5305
+ * enabled item, and closes — returning focus to the trigger — when an item is
5306
+ * chosen or on `Escape` / outside-click. Give the trigger `foldPopoverTrigger="menu"`
5307
+ * so its `aria-haspopup` reads as a menu.
5308
+ *
5309
+ * @selector `fold-dropdown`
5310
+ *
5311
+ * @example
5312
+ * ```html
5313
+ * <fold-dropdown ariaLabel="Row actions">
5314
+ * <fold-button-icon icon="more-vertical" tooltip="Actions" foldPopoverTrigger="menu" />
5315
+ * <fold-dropdown-item icon="edit" (selected)="rename(row)">Rename</fold-dropdown-item>
5316
+ * <fold-dropdown-item tone="danger" (selected)="remove(row)">Delete</fold-dropdown-item>
5317
+ * </fold-dropdown>
5318
+ * ```
5319
+ */
5320
+ declare class FoldDropdownComponent {
5321
+ private readonly renderer;
5322
+ /** Preferred placement. @default "bottom-start" */
5323
+ readonly placement: _angular_core.InputSignal<FoldPopoverPlacement>;
5324
+ /** Gap between trigger and menu, in px. @default 8 */
5325
+ readonly offset: _angular_core.InputSignal<number>;
5326
+ /** Accessible name of the menu. */
5327
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
5328
+ /** Two-way open state. */
5329
+ readonly open: _angular_core.ModelSignal<boolean>;
5330
+ private readonly items;
5331
+ /** Active row = index into {@link enabled}. Roving state lives here (not read
5332
+ * from `document.activeElement`), so it stays correct regardless of focus. */
5333
+ private readonly active;
5334
+ constructor();
5335
+ /** Enabled items only — keyboard nav + focus skip disabled rows. */
5336
+ private enabled;
5337
+ private focusIndex;
5338
+ protected onMenuKeydown(event: KeyboardEvent): void;
5339
+ /** Type-ahead buffer (multi-letter): keystrokes within 500 ms accumulate, so
5340
+ * "de" jumps to "Delete", not just the next "d". */
5341
+ private typeBuffer;
5342
+ private typeAt;
5343
+ private typeahead;
5344
+ /** A menuitem was activated (click / Enter / Space bubbles here) → close. */
5345
+ protected onMenuActivate(event: MouseEvent): void;
5346
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldDropdownComponent, never>;
5347
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldDropdownComponent, "fold-dropdown", never, { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, ["items"], ["[foldPopoverTrigger]", "*"], true, never>;
5348
+ }
5349
+
5350
+ /**
5351
+ * `<fold-dropdown-item>` — one actionable row inside a {@link FoldDropdownComponent}.
5352
+ * Renders a `role="menuitem"` button; emits `selected` on activation (click,
5353
+ * `Enter` or `Space`) and the parent closes the menu. Roving focus + arrow-key
5354
+ * navigation are owned by the dropdown.
5355
+ *
5356
+ * @selector `fold-dropdown-item`
5357
+ *
5358
+ * @example
5359
+ * ```html
5360
+ * <fold-dropdown-item icon="edit" (selected)="rename()">Rename</fold-dropdown-item>
5361
+ * <fold-dropdown-item tone="danger" (selected)="remove()">Delete</fold-dropdown-item>
5362
+ * ```
5363
+ */
5364
+ declare class FoldDropdownItemComponent {
5365
+ /** Disable the row — skipped by keyboard navigation, inert to clicks. */
5366
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
5367
+ /** Visual tone. @default "default" */
5368
+ readonly tone: _angular_core.InputSignal<"danger" | "default">;
5369
+ /** Optional leading icon. */
5370
+ readonly icon: _angular_core.InputSignal<FoldIconName | undefined>;
5371
+ /** Emitted on activation (click / Enter / Space). */
5372
+ readonly selected: _angular_core.OutputEmitterRef<void>;
5373
+ private readonly btn;
5374
+ /** The native button — the dropdown reads it for roving focus + typeahead. */
5375
+ get button(): HTMLButtonElement | undefined;
5376
+ focus(): void;
5377
+ protected onClick(): void;
5378
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldDropdownItemComponent, never>;
5379
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldDropdownItemComponent, "fold-dropdown-item", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, ["*"], true, never>;
5380
+ }
5381
+
5382
+ /**
5383
+ * Keep a floating element pinned to its anchor: call `onChange` whenever
5384
+ * anything that could move the anchor or resize either element happens —
5385
+ * scrolling (capture phase, so nested scroll containers count), a window
5386
+ * resize, or a size change of the anchor / floating element (`ResizeObserver`).
5387
+ * Returns a teardown that removes every listener. Mirrors Floating UI's
5388
+ * `autoUpdate`, dependency-free and scoped to fold's needs.
5389
+ */
5390
+ declare function autoUpdate(anchor: HTMLElement | null, floating: HTMLElement, onChange: () => void): () => void;
5391
+
4081
5392
  /**
4082
5393
  * Categorical auto-colour palettes + the seed→index hash.
4083
5394
  *
@@ -4145,6 +5456,6 @@ declare class FoldPaletteRegistry {
4145
5456
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FoldPaletteRegistry>;
4146
5457
  }
4147
5458
 
4148
- export { FOLD_AUTO_PALETTES, FOLD_BLUR_TOKENS, FOLD_BUILTIN_ICONS, FOLD_MOTION_TOKENS, 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, FoldChoiceRowComponent, FoldContextCardComponent, FoldDataTableCellDirective, FoldDataTableComponent, FoldDisclosureComponent, FoldElementTitleComponent, FoldElevatedDirective, FoldEmptyStateComponent, FoldFieldComponent, FoldFieldIdDirective, FoldFieldListComponent, FoldFileDropzoneComponent, FoldHeroCardComponent, FoldHeroSectionComponent, FoldIconComponent, FoldIconRegistry, FoldIdService, FoldInputComponent, FoldLinkComponent, FoldLoadingStateComponent, FoldMenuComponent, FoldMenuItemComponent, FoldMenuSectionComponent, FoldMenuSeparatorComponent, FoldNavLauncherComponent, FoldNavLayoutComponent, FoldNavTileComponent, FoldNumberInputComponent, FoldPageLayoutComponent, FoldPageSectionComponent, FoldPageTitleDirective, FoldPaginatorComponent, FoldPaletteRegistry, FoldPanelComponentOutletDirective, FoldPanelHeaderComponent, FoldPanelHostComponent, FoldPanelHostService, FoldPanelRef, FoldPanelToggle, FoldRangeSliderComponent, FoldRepeatPressDirective, FoldSearchComponent, FoldSelectComponent, FoldSliderComponent, FoldSpinnerComponent, FoldStatusBadgeComponent, FoldStickyColumnDirective, FoldSurfaceDirective, FoldTabPanelComponent, FoldTabsComponent, FoldTimelineComponent, FoldToastComponent, FoldToastContainerComponent, FoldToastService, FoldToggleIconComponent, FoldViewNavComponent, foldBlurVar, foldColorProperty, foldColorVar, foldHashSeed, foldMotionVar, foldRadiusVar, foldResolvePalette, foldShadowVar, foldSpaceVar, foldTextVar, observeElementWidth, provideFoldIcons, provideFoldPalette, provideFoldPanelLabels, provideFoldToasts };
4149
- export type { FoldAutoPaletteName, FoldAvatarListItem, FoldAvatarRing, FoldAvatarRingStyle, FoldAvatarVariant, FoldBadgeVariant, FoldBlurToken, FoldBuiltinIconName, FoldButtonEmphasis, FoldButtonIconShape, FoldButtonIconSize, FoldButtonIconTone, FoldButtonIntent, FoldButtonShape, FoldButtonSize, FoldCalloutAppearance, FoldCalloutVariant, FoldCardBandChrome, FoldChoiceOption, FoldComponentPanelDescriptor, FoldIconName, FoldIconSet, FoldIconSize, FoldMenuItemBadgeTone, FoldMenuLevel, FoldMenuTint, FoldMenuTogglePlacement, FoldMotionToken, FoldNumberControls, FoldNumberSpinner, FoldPageItem, FoldPaletteInput, FoldPanelConfig, FoldPanelContent, FoldPanelDescriptor, FoldPanelHandle, FoldPanelLabels, FoldPanelSide, FoldRadiusToken, FoldRangeValue, FoldSemanticColorToken, FoldShadowToken, FoldSpaceToken, FoldSpinnerSize, FoldStickyColumnAnchor, FoldSurfaceName, FoldTabItem, FoldTableColumn, FoldTableEmpty, FoldTableSort, FoldTableSortDir, FoldTableTone, FoldTabsContext, FoldTemplatePanelDescriptor, FoldTextToken, FoldTimelineDatePlacement, FoldTimelineNode, FoldToast, FoldToastConfig, FoldToastVariant, FoldViewNavItem };
5459
+ 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 };
5460
+ export type { FoldAutoPaletteName, FoldAvatarListItem, FoldAvatarRing, FoldAvatarRingStyle, FoldAvatarVariant, FoldBadgeVariant, FoldBlurToken, FoldBuiltinIconName, FoldButtonEmphasis, FoldButtonIconShape, FoldButtonIconSize, FoldButtonIconTone, FoldButtonIntent, FoldButtonShape, FoldButtonSize, FoldCalloutAppearance, FoldCalloutVariant, FoldCardBandChrome, FoldCardBandChromeInput, FoldChoiceOption, FoldComponentPanelDescriptor, FoldDataTableLabels, FoldIconName, FoldIconSet, FoldIconSize, FoldInlineConfirmLabels, FoldMenuItemBadgeTone, FoldMenuLevel, FoldMenuTint, FoldMenuTogglePlacement, FoldMotionToken, FoldNumberControls, FoldNumberSpinner, FoldPageItem, FoldPaginatorLabels, FoldPaletteInput, FoldPanelConfig, FoldPanelContent, FoldPanelDescriptor, FoldPanelHandle, FoldPanelLabels, FoldPanelSide, FoldPasswordRule, FoldPlacementInput, FoldPlacementResult, FoldPopoverAlign, FoldPopoverPlacement, FoldPopoverSide, FoldRadiusToken, FoldRangeValue, FoldRect, FoldSelectOption, FoldSemanticColorToken, FoldShadowToken, FoldSpaceToken, FoldSpinnerSize, FoldStickyColumnAnchor, FoldSurfaceName, FoldTabItem, FoldTableColumn, FoldTableEmpty, FoldTableSort, FoldTableSortDir, FoldTableTone, FoldTabsContext, FoldTemplatePanelDescriptor, FoldTextToken, FoldTimelineDatePlacement, FoldTimelineNode, FoldToast, FoldToastConfig, FoldToastVariant, FoldViewNavItem, FoldViewToggleOption };
4150
5461
  //# sourceMappingURL=fold-ng.d.ts.map