forty-cdk 0.0.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,8 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, Provider, Signal, Type, ModelSignal, OutputEmitterRef, TemplateRef, ElementRef, OnInit } from '@angular/core';
2
+ import { InjectionToken, Provider, ModelSignal, Signal, EnvironmentInjector, ComponentRef, Type, Injector, OutputEmitterRef, TemplateRef, ElementRef } from '@angular/core';
3
3
  import * as forty_cdk from 'forty-cdk';
4
4
  import { ValidationError, FormValueControl, FormCheckboxControl, FieldTree } from '@angular/forms/signals';
5
+ import * as _floating_ui_dom from '@floating-ui/dom';
5
6
  import { ReferenceElement } from '@floating-ui/dom';
6
7
 
7
8
  /**
@@ -10,7 +11,7 @@ import { ReferenceElement } from '@floating-ui/dom';
10
11
  * (close, focus move, etc.) when set.
11
12
  *
12
13
  * Replaces the prior pattern of passing a real DOM `CustomEvent`, which
13
- * was a Radix transplant: Angular `output()` is a synchronous in-process
14
+ * was a poor fit: Angular `output()` is a synchronous in-process
14
15
  * emitter — events don't bubble, don't propagate, and have no `target` /
15
16
  * `currentTarget`. `CustomEvent` cost an allocation per emit and gave
16
17
  * consumers a misleading "looks like a DOM event" surface.
@@ -63,6 +64,260 @@ declare const FOR_ID_SALT: InjectionToken<string>;
63
64
  * @param salt A stable, app-unique salt.
64
65
  */
65
66
  declare function provideForIdSalt(salt: string): Provider;
67
+ /**
68
+ * Generates unique string IDs scoped to the application instance.
69
+ *
70
+ * Used by primitives that need to wire `aria-controls` / `aria-labelledby`
71
+ * relationships between pieces — the IDs are stable for the lifetime of the
72
+ * primitive instance.
73
+ *
74
+ * SSR: the generator is `providedIn: 'root'`, so a fresh instance is
75
+ * created for each Angular application bootstrap (one per SSR request).
76
+ * The IDs are salted with {@link FOR_ID_SALT} (which defaults to the
77
+ * application's `APP_ID`) so the server and the client produce identical
78
+ * strings for the same render order — the property hydration relies on.
79
+ *
80
+ * IMPORTANT — multiple apps on one page need distinct salts. The default salt
81
+ * is `APP_ID`, and Angular's default `APP_ID` is the literal `'ng'`. Two
82
+ * forty-cdk apps mounted side-by-side that both keep the default salt
83
+ * therefore start from the same salt and the same counter, emitting identical
84
+ * id sequences — duplicate DOM ids that mis-resolve `aria-labelledby` /
85
+ * `aria-controls` across apps. A per-instance random nonce is deliberately
86
+ * NOT mixed in: it would diverge the salt but break SSR hydration (the server
87
+ * and client renders would no longer agree). When running more than one
88
+ * forty-cdk app on a single page, give each a distinct salt via
89
+ * {@link provideForIdSalt} (the per-app knob that leaves the global `APP_ID`
90
+ * untouched). Overriding the global `APP_ID` works too, but it also drives
91
+ * Angular's hydration store and event replay, so `provideForIdSalt` is the
92
+ * narrower choice.
93
+ */
94
+ declare class IdGenerator {
95
+ #private;
96
+ /**
97
+ * Returns a fresh, unique ID with the given prefix.
98
+ *
99
+ * @param prefix Optional prefix for the generated ID. Defaults to `for`.
100
+ */
101
+ next(prefix?: string): string;
102
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IdGenerator, never>;
103
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<IdGenerator>;
104
+ }
105
+
106
+ /**
107
+ * Pluggable, date-library-agnostic seam for `ForCalendar`. Every internal
108
+ * algorithm (paging, the day matrix, comparison, formatting) goes through a
109
+ * `DateAdapter<D>`, so the primitive never hard-depends on a date library.
110
+ *
111
+ * The library ships two adapters behind {@link FOR_DATE_ADAPTER}:
112
+ *
113
+ * - `provideInternationalizedDateAdapter()` — over `@internationalized/date`'s
114
+ * immutable `CalendarDate`. Recommended for correct date-math and locale-aware
115
+ * formatting; `@internationalized/date` is an optional peer dependency. Both
116
+ * `@internationalized/date` adapters operate on the **Gregorian** calendar
117
+ * today — non-Gregorian calendar systems are deferred to the Temporal adapter
118
+ * track (#354).
119
+ * - `provideNativeDateAdapter()` — over the built-in `Date`. Zero-dependency
120
+ * fallback.
121
+ *
122
+ * A `Temporal.PlainDate` adapter is a planned non-breaking addition once the
123
+ * Temporal API is broadly available across browsers (#354).
124
+ *
125
+ * Implementations must be pure with respect to their date type: every
126
+ * operation returns a value and never mutates its inputs. The `D` produced by
127
+ * mutating operations (`add*`, `createDate`) is a fresh value, which keeps it
128
+ * signal-friendly (reference equality changes on every change).
129
+ *
130
+ * @typeParam D The immutable date representation the adapter operates on.
131
+ */
132
+ interface DateAdapter<D> {
133
+ /**
134
+ * Today's date in the runtime time zone.
135
+ *
136
+ * **SSR / hydration caveat.** The result depends on the runtime time zone, so
137
+ * a server render and a client hydration can disagree by up to a day near
138
+ * midnight — the server may compute a different calendar day than the
139
+ * browser. `ForCalendar` reads this once to mark the `data-today` /
140
+ * `aria-current="date"` cell, so a mismatch surfaces there as a hydration
141
+ * error and a flicker on the highlighted "today" cell.
142
+ *
143
+ * **SSR-safe pattern.** Have the consumer supply a fixed "today" (or pin a
144
+ * time zone) for the server render, or defer the today-highlight to
145
+ * `afterNextRender` so `today()` is only computed client-side. See the
146
+ * calendar README's "SSR / hydration" section.
147
+ */
148
+ today(): D;
149
+ /**
150
+ * Creates a date from its parts.
151
+ *
152
+ * @param year Full year (e.g. `2026`).
153
+ * @param month Month of year, **1-12**.
154
+ * @param day Day of month, **1-31** (constrained to the month's length).
155
+ */
156
+ createDate(year: number, month: number, day: number): D;
157
+ /** The full year of `date` (e.g. `2026`). */
158
+ getYear(date: D): number;
159
+ /** The month of `date`, **1-12**. */
160
+ getMonth(date: D): number;
161
+ /** The day of month of `date`, **1-31**. */
162
+ getDate(date: D): number;
163
+ /** The day of week of `date`, **0-6** where `0` is Sunday and `6` is Saturday. */
164
+ getDayOfWeek(date: D): number;
165
+ /** The number of days in `date`'s month. */
166
+ getDaysInMonth(date: D): number;
167
+ /**
168
+ * The first day of the week as a **0-6** index (`0` = Sunday). Used as the
169
+ * default when `ForCalendar`'s `firstDayOfWeek` input is `null`. Adapters
170
+ * return a locale-independent default (`0`); consumers localise it through
171
+ * the `firstDayOfWeek` input or `provideForCalendarDefaults`.
172
+ */
173
+ getFirstDayOfWeek(): number;
174
+ /** Returns a new date `n` days after `date` (negative goes backwards). */
175
+ addDays(date: D, n: number): D;
176
+ /**
177
+ * Returns a new date `n` months after `date` (negative goes backwards). The
178
+ * day of month is constrained to the target month's length (e.g. Jan 31 + 1
179
+ * month is Feb 28/29, never Mar 3).
180
+ */
181
+ addMonths(date: D, n: number): D;
182
+ /**
183
+ * Returns a new date `n` years after `date` (negative goes backwards). The
184
+ * day of month is constrained (e.g. Feb 29 + 1 year is Feb 28 in a common
185
+ * year).
186
+ */
187
+ addYears(date: D, n: number): D;
188
+ /**
189
+ * Compares two dates by their natural ordering — **the full instant**,
190
+ * including any time component the adapter's `D` carries. Returns a negative
191
+ * number when `a` is before `b`, `0` when they are equal, and a positive
192
+ * number when `a` is after `b`.
193
+ *
194
+ * This is the canonical comparator and the only one an adapter must
195
+ * implement. Time-capable adapters (`Date`, `@internationalized/date`'s
196
+ * `CalendarDateTime`) order by day *and* time; day-only adapters
197
+ * (`CalendarDate`) order by day alone because that is all their `D` carries.
198
+ *
199
+ * **Bounds granularity.** `minDate` / `maxDate` clamping in the date
200
+ * primitives compares the full instant through `compare`, so a date-time
201
+ * `min`/`max` clamps identically on every time-capable adapter (e.g. native
202
+ * `Date` and `CalendarDateTime` produce the same result for the same input).
203
+ * For the *calendar grid*, where availability is day-granular so the boundary
204
+ * day of a date-time `min`/`max` stays selectable, use {@link compareDateOf}
205
+ * (which honours {@link compareDate} when present and otherwise derives a
206
+ * day-only comparison from the y/m/d getters).
207
+ */
208
+ compare(a: D, b: D): number;
209
+ /**
210
+ * Optionally compares two dates by calendar day only, ignoring any time
211
+ * component. Returns a negative number when `a`'s day is before `b`'s, `0`
212
+ * when they fall on the same calendar day, and a positive number when `a`'s
213
+ * day is after `b`'s.
214
+ *
215
+ * Adapters may **omit** this method: {@link compareDateOf} then derives the
216
+ * day-only comparison from the {@link getYear} / {@link getMonth} /
217
+ * {@link getDate} getters, which is correct for any adapter. Implement it only
218
+ * to override that default (e.g. for a non-Gregorian ordering). Day-only
219
+ * adapters whose {@link compare} already ignores time need not implement it.
220
+ */
221
+ compareDate?(a: D, b: D): number;
222
+ /** Whether `a` and `b` fall on the same calendar day. */
223
+ isSameDay(a: D, b: D): boolean;
224
+ /** Whether `date` is a valid date of this adapter's type. */
225
+ isValid(date: D): boolean;
226
+ /**
227
+ * Formats `date` for display using the runtime's default locale.
228
+ *
229
+ * **SSR / hydration caveat.** The result resolves against the runtime's
230
+ * default locale, so a server render and a client hydration can produce
231
+ * different strings when the server and browser locales differ — surfacing as
232
+ * a hydration mismatch on every formatted value (heading, weekday headers,
233
+ * cell labels). The runtime time zone applies too for adapters that format
234
+ * through a wall-clock instant.
235
+ *
236
+ * **SSR-safe pattern.** Pin a locale (or format client-side) for the server
237
+ * render so both environments resolve the same locale. See the calendar
238
+ * README's "SSR / hydration" section.
239
+ *
240
+ * @param options Standard `Intl.DateTimeFormat` options (e.g.
241
+ * `{ month: 'long', year: 'numeric' }` for a calendar heading,
242
+ * `{ weekday: 'short' }` for a column header).
243
+ */
244
+ format(date: D, options: Intl.DateTimeFormatOptions): string;
245
+ /**
246
+ * Whether this adapter's `D` can carry a wall-clock time component (hour /
247
+ * minute / second). Day-only adapters omit the optional time accessors below
248
+ * and return `false` (or omit this method); time-capable adapters implement
249
+ * them and return `true`. `ForTimeField` — and the time granularity of the
250
+ * date primitives — require a time-capable adapter.
251
+ */
252
+ supportsTime?(): boolean;
253
+ /** The hour of `date`, **0-23** (24-hour clock). Time-capable adapters only. */
254
+ getHours?(date: D): number;
255
+ /** The minute of `date`, **0-59**. Time-capable adapters only. */
256
+ getMinutes?(date: D): number;
257
+ /** The second of `date`, **0-59**. Time-capable adapters only. */
258
+ getSeconds?(date: D): number;
259
+ /**
260
+ * Returns a new date with its time set to the given parts, preserving the
261
+ * calendar day. Time-capable adapters only.
262
+ *
263
+ * @param hours Hour of day, **0-23**.
264
+ * @param minutes Minute of hour, **0-59**.
265
+ * @param seconds Second of minute, **0-59**.
266
+ */
267
+ setTime?(date: D, hours: number, minutes: number, seconds: number): D;
268
+ }
269
+ /**
270
+ * A {@link DateAdapter} narrowed to one that implements the optional time
271
+ * accessors. Produced by {@link assertTimeCapable} so time primitives can call
272
+ * `getHours` / `setTime` / etc. without optional-chaining.
273
+ *
274
+ * @typeParam D The adapter's immutable date-time representation.
275
+ */
276
+ type TimeCapableDateAdapter<D> = DateAdapter<D> & Required<Pick<DateAdapter<D>, 'getHours' | 'getMinutes' | 'getSeconds' | 'setTime'>>;
277
+ /**
278
+ * Injection token holding the active {@link DateAdapter}. Provide it with
279
+ * `provideInternationalizedDateAdapter()` or `provideNativeDateAdapter()`.
280
+ * There is no application-wide default — a calendar with no adapter in scope
281
+ * throws a descriptive error.
282
+ */
283
+ declare const FOR_DATE_ADAPTER: InjectionToken<DateAdapter<unknown>>;
284
+ /**
285
+ * Injects the active {@link DateAdapter}, throwing a descriptive,
286
+ * primitive-prefixed error when no adapter has been provided.
287
+ *
288
+ * @param piece Name of the calling directive, used in the error message.
289
+ */
290
+ declare function injectDateAdapter<D>(piece: string): DateAdapter<D>;
291
+ /**
292
+ * Asserts that `adapter` implements the optional time accessors, returning it
293
+ * narrowed to {@link TimeCapableDateAdapter}. Throws a descriptive,
294
+ * primitive-prefixed error when the active adapter is day-only — the
295
+ * zero-dependency `provideNativeDateAdapter()` is time-capable, as is
296
+ * `provideInternationalizedDateTimeAdapter()`, but the day-pure
297
+ * `provideInternationalizedDateAdapter()` (`CalendarDate`) is not.
298
+ *
299
+ * @param adapter The active adapter, typically from {@link injectDateAdapter}.
300
+ * @param piece Name of the calling directive, used in the error message.
301
+ */
302
+ declare function assertTimeCapable<D>(adapter: DateAdapter<D>, piece: string): TimeCapableDateAdapter<D>;
303
+
304
+ /**
305
+ * Shared contract implemented by both `ForTimeField` and `ForTimePicker`. The
306
+ * `ForDatePicker` time bridge queries this token via `contentChild` so it can
307
+ * observe whichever time-editing primitive the consumer projects — without a
308
+ * hard import of either, keeping date-picker tree-shaking intact.
309
+ *
310
+ * @typeParam D The adapter's date-time type.
311
+ */
312
+ interface TimeValueSource<D> {
313
+ readonly value: ModelSignal<D | null>;
314
+ readonly adapter: DateAdapter<D>;
315
+ }
316
+ /**
317
+ * Token provided by `ForTimeField` and `ForTimePicker`. `ForDatePicker`
318
+ * queries descendants for this token to locate the projected time source.
319
+ */
320
+ declare const FOR_TIME_VALUE_SOURCE: InjectionToken<TimeValueSource<unknown>>;
66
321
 
67
322
  /**
68
323
  * Shared state contract between the pieces of a Disclosure primitive.
@@ -322,7 +577,13 @@ declare class ForAccordionItem implements ForAccordionItemContext {
322
577
  protected readonly parent: forty_cdk.ForAccordionContext;
323
578
  /** Unique identifier of this item within the accordion. Required. */
324
579
  readonly value: _angular_core.InputSignal<string>;
325
- /** When true, the trigger ignores clicks and reflects `disabled`. */
580
+ /**
581
+ * When true, the trigger ignores clicks and reflects the native `disabled`
582
+ * attribute (not `aria-disabled`). The trigger is therefore dropped from the
583
+ * Tab order and skipped by arrow-key navigation, but stays in the
584
+ * accessibility tree so screen readers still announce it. See
585
+ * `ForAccordionTrigger` for the rationale (rule #561 D2).
586
+ */
326
587
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
327
588
  readonly triggerId: _angular_core.Signal<string>;
328
589
  readonly contentId: _angular_core.Signal<string>;
@@ -360,7 +621,16 @@ declare class ForAccordionTrigger {
360
621
  /**
361
622
  * APG: aria-disabled is true only when the panel is open AND the accordion
362
623
  * disallows collapse. A real `disabled` item is reflected via the native
363
- * `disabled` attribute instead.
624
+ * `disabled` attribute instead — the sanctioned exception in rule #561 (D2):
625
+ * the trigger is a real single-purpose `<button>`, not a roving collection
626
+ * item (every trigger stays independently in the Tab order; the arrow-key
627
+ * navigation is an APG-optional enhancement layered on top, not a
628
+ * roving-tabindex collection), so native `disabled` is correct here. The
629
+ * button stays in the accessibility tree — screen readers still announce it
630
+ * as unavailable in browse mode — while being dropped from the Tab order and
631
+ * the arrow-key navigation (which `focusByOffset` already skips), keeping
632
+ * disabled triggers uniformly unreachable. The APG Accordion pattern does not
633
+ * require disabled headers to remain focusable.
364
634
  */
365
635
  protected readonly ariaDisabled: _angular_core.Signal<boolean>;
366
636
  constructor();
@@ -544,8 +814,7 @@ declare function injectFieldWiring(handle?: Omit<FieldControlHandle, 'host'>): v
544
814
 
545
815
  /**
546
816
  * Headless form-field container that wires accessible labelling, description,
547
- * and error association for a single control — the styleless counterpart to
548
- * Radix `Label` + `Form` / Base UI `Field`. It renders nothing and imposes no
817
+ * and error association for a single control. It renders nothing and imposes no
549
818
  * layout: its only job is to connect a `[forLabel]`, `[forFieldDescription]`,
550
819
  * and `[forFieldError]` to the control via `id` / `aria-labelledby` /
551
820
  * `aria-describedby` / `aria-errormessage`, and to reflect the control's
@@ -651,7 +920,7 @@ declare class ForField implements ForFieldContext {
651
920
  * is not re-forwarded, so a label-wrapping layout toggles once, matching native
652
921
  * `<label>` semantics.
653
922
  *
654
- * Usable standalone (Radix-style) outside a field — there it is an inert
923
+ * Usable standalone outside a field — there it is an inert
655
924
  * marker and the consumer wires native `for` themselves.
656
925
  *
657
926
  * @example
@@ -799,8 +1068,7 @@ declare const FOR_FIELDSET_CONTEXT: InjectionToken<ForFieldsetContext>;
799
1068
  /**
800
1069
  * Headless grouping container that gives a set of related fields a shared
801
1070
  * accessible name — the styleless counterpart to a native `<fieldset>` +
802
- * `<legend>`, and the grouping companion to `ForField`. Mirrors Base UI
803
- * `Fieldset`.
1071
+ * `<legend>`, and the grouping companion to `ForField`.
804
1072
  *
805
1073
  * On a native `<fieldset>` it relies on the implicit grouping and emits no
806
1074
  * role; on any other element it emits `role="group"` + `aria-labelledby`
@@ -1010,6 +1278,16 @@ declare abstract class FormUiControlBase {
1010
1278
  * `touched` directly, so both channels always fire together.
1011
1279
  */
1012
1280
  protected markTouched(): void;
1281
+ /**
1282
+ * The element the four form-state `data-*` booleans (`data-touched` /
1283
+ * `data-dirty` / `data-pending` / `data-invalid`) are reflected onto. Defaults
1284
+ * to the directive host — correct when the host carries the control's styling
1285
+ * surface. Override (returning `null` until it exists) when the reflected
1286
+ * element is a child the directive injects, e.g. `ForOtpInput`'s real
1287
+ * `<input>` rather than its `role="group"` host. Read reactively inside the
1288
+ * reflection effect, so a returned signal re-targets once the element appears.
1289
+ */
1290
+ protected fieldStateReflectionTarget(): HTMLElement | null;
1013
1291
  constructor();
1014
1292
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormUiControlBase, never>;
1015
1293
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FormUiControlBase, never, never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "touch": "touch"; }, never, never, true, never>;
@@ -1097,15 +1375,23 @@ declare class ForInput extends TextValueControlBase implements FormValueControl<
1097
1375
  * Apply on a native `<textarea>`. The element keeps its own caret, wrapping,
1098
1376
  * IME composition, and native form submission — the directive only bridges the
1099
1377
  * value to a signal and reflects validation state. The string-valued sibling
1100
- * of `[forInput]`; auto-resize is intentionally out of scope.
1378
+ * of `[forInput]`.
1101
1379
  *
1102
1380
  * The host gets `data-empty` (while the value is `''`), `data-disabled`, and
1103
1381
  * `data-readonly` for CSS hooks.
1104
1382
  *
1383
+ * With `[autosize]` the host grows and shrinks its height to fit the content on
1384
+ * every edit, programmatic value change, and width reflow, and reflects
1385
+ * `data-autosize` for styling (pair it with `resize: none; overflow: hidden;`).
1386
+ * Autosize is a DOM side effect gated to the browser, so it is inert under SSR.
1387
+ *
1105
1388
  * @example
1106
1389
  * ```html
1107
1390
  * <textarea forTextarea [(value)]="bio" placeholder="About you"></textarea>
1108
1391
  *
1392
+ * <!-- Grow to content: -->
1393
+ * <textarea forTextarea autosize [(value)]="bio"></textarea>
1394
+ *
1109
1395
  * <!-- With Signal Forms + Field (auto-wired): -->
1110
1396
  * <div forField>
1111
1397
  * <label forLabel>Bio</label>
@@ -1114,8 +1400,17 @@ declare class ForInput extends TextValueControlBase implements FormValueControl<
1114
1400
  * ```
1115
1401
  */
1116
1402
  declare class ForTextarea extends TextValueControlBase implements FormValueControl<string> {
1403
+ #private;
1404
+ /**
1405
+ * Opt into height auto-sizing. When `true` the textarea's height tracks its
1406
+ * content: it grows as the value gets taller and shrinks back as it gets
1407
+ * shorter, recomputed on every edit, on programmatic `value` writes, and on
1408
+ * width reflow. Defaults to `false`, leaving the element's height to CSS.
1409
+ */
1410
+ readonly autosize: _angular_core.InputSignalWithTransform<boolean, unknown>;
1411
+ constructor();
1117
1412
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForTextarea, never>;
1118
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTextarea, "[forTextarea]", ["forTextarea"], {}, {}, never, never, true, never>;
1413
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTextarea, "[forTextarea]", ["forTextarea"], { "autosize": { "alias": "autosize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1119
1414
  }
1120
1415
 
1121
1416
  /**
@@ -1195,7 +1490,7 @@ declare const FOR_INPUT_HOST_DIRECTIVE_OUTPUTS: readonly ["valueChange", "touche
1195
1490
  * export class MyTextarea {}
1196
1491
  * ```
1197
1492
  */
1198
- declare const FOR_TEXTAREA_HOST_DIRECTIVE_INPUTS: readonly ["value", "dirty", "disabled", "errors", "invalid", "name", "pending", "readonly", "required", "touched"];
1493
+ declare const FOR_TEXTAREA_HOST_DIRECTIVE_INPUTS: readonly ["value", "autosize", "dirty", "disabled", "errors", "invalid", "name", "pending", "readonly", "required", "touched"];
1199
1494
  /**
1200
1495
  * Exact public names of every `ForTextarea` output, the Signal Forms `touch` output
1201
1496
  * included. Spread it into the `outputs` array of the same `hostDirectives` entry as
@@ -1203,6 +1498,141 @@ declare const FOR_TEXTAREA_HOST_DIRECTIVE_INPUTS: readonly ["value", "dirty", "d
1203
1498
  */
1204
1499
  declare const FOR_TEXTAREA_HOST_DIRECTIVE_OUTPUTS: readonly ["valueChange", "touchedChange", "touch"];
1205
1500
 
1501
+ /**
1502
+ * Headless `role="searchbox"` text input implementing Angular's
1503
+ * `FormValueControl<string>` from `@angular/forms/signals`, so it auto-wires
1504
+ * with `[formField]` and auto-associates inside a `[forField]` (label /
1505
+ * description / error) with no extra markup. Reuses the exact form-value
1506
+ * wiring of `[forInput]` — same IME handling, same value mirror, same
1507
+ * validation reflection.
1508
+ *
1509
+ * Apply on a native `<input>`. The element keeps its own `type`, caret, IME
1510
+ * composition, and native form submission — the directive only bridges the
1511
+ * value to a signal, reflects validation state, and emits `role="searchbox"`.
1512
+ *
1513
+ * Pair with `[forSearchClear]` (passing the exported instance) for an inline
1514
+ * clear-button affordance that hides itself while the value is empty.
1515
+ *
1516
+ * @example
1517
+ * ```html
1518
+ * <input forSearch #s="forSearch" [(value)]="q" />
1519
+ * <button [forSearchClear]="s">×</button>
1520
+ *
1521
+ * <!-- With Signal Forms + Field (auto-wired): -->
1522
+ * <div forField>
1523
+ * <label forLabel>Search</label>
1524
+ * <input forSearch [formField]="search.query" />
1525
+ * </div>
1526
+ * ```
1527
+ */
1528
+ declare class ForSearch extends TextValueControlBase implements FormValueControl<string> {
1529
+ #private;
1530
+ /**
1531
+ * Resets the value to `''`. Typically called by `[forSearchClear]` when the
1532
+ * user activates the clear button, but can also be called programmatically.
1533
+ */
1534
+ clear(): void;
1535
+ /**
1536
+ * Moves focus to the native input element. Called by `[forSearchClear]`
1537
+ * after clearing so the user can continue typing without chasing the caret.
1538
+ */
1539
+ focusInput(): void;
1540
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForSearch, never>;
1541
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForSearch, "input[forSearch]", ["forSearch"], {}, {}, never, never, true, never>;
1542
+ }
1543
+
1544
+ /**
1545
+ * Optional clear button for `[forSearch]`. Apply on a `<button>` element and
1546
+ * pass the exported search instance through the selector input:
1547
+ * `[forSearchClear]="s"` where `#s="forSearch"` is on the `<input>`.
1548
+ *
1549
+ * The button self-hides while the value is `''`, so consumers can leave it
1550
+ * inline in the template without an extra `@if`. Visibility is enforced with
1551
+ * an inline `display: none` (which beats any author `display` rule applied via
1552
+ * a class) in addition to the `hidden` attribute that removes the element from
1553
+ * the accessibility tree. This mirrors `[forComboboxClear]`'s approach.
1554
+ *
1555
+ * On activation (click) the button clears the value to `''` and refocuses the
1556
+ * input so the user can continue typing without chasing the caret.
1557
+ *
1558
+ * The `aria-label="Clear"` default is set as a static host attribute. Consumers
1559
+ * who want a different label can override it with their own `aria-label` on the
1560
+ * same element — the consumer's attribute wins per Angular's host-binding
1561
+ * precedence rules.
1562
+ *
1563
+ * The button stays in the natural tab order (no `tabindex="-1"`) unlike
1564
+ * `[forComboboxClear]`, which lives inside an `aria-activedescendant` flow.
1565
+ */
1566
+ declare class ForSearchClear {
1567
+ /**
1568
+ * The `[forSearch]` instance to operate on. Pass the exported reference:
1569
+ * `<input forSearch #s="forSearch" /> <button [forSearchClear]="s">`.
1570
+ */
1571
+ readonly search: _angular_core.InputSignal<ForSearch>;
1572
+ /** `true` while there is text to clear; drives the self-hide logic. */
1573
+ protected readonly hasContent: _angular_core.Signal<boolean>;
1574
+ /**
1575
+ * Disabled when the search field is disabled or read-only — the clear action
1576
+ * is unavailable in those states.
1577
+ */
1578
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
1579
+ constructor();
1580
+ protected onClick(): void;
1581
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForSearchClear, never>;
1582
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForSearchClear, "[forSearchClear]", ["forSearchClear"], { "search": { "alias": "forSearchClear"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1583
+ }
1584
+
1585
+ /**
1586
+ * Defaults inherited by descendant `[forSearch]` controls in the surrounding
1587
+ * injector scope. Configure with `provideForSearchDefaults`. The shape is a
1588
+ * stub today — present so future per-scope tuning can land without churning
1589
+ * the public surface.
1590
+ */
1591
+ interface ForSearchDefaults {
1592
+ }
1593
+ /** Token holding the resolved search-field defaults for the current scope. */
1594
+ declare const FOR_SEARCH_DEFAULTS: _angular_core.InjectionToken<ForSearchDefaults>;
1595
+ /**
1596
+ * Configures forty-cdk search-field defaults for this injector scope. Partial
1597
+ * overrides inherit unspecified keys from the parent scope (or library
1598
+ * defaults at the root).
1599
+ */
1600
+ declare function provideForSearchDefaults(defaults?: Partial<ForSearchDefaults>): Provider[];
1601
+
1602
+ /**
1603
+ * Exact public names of every `ForSearch` input, its models included. Spread it into the
1604
+ * `inputs` array of a `hostDirectives` entry so a wrapper component re-exposes the
1605
+ * primitive's full surface — the Signal Forms members `[formField]` binds among them —
1606
+ * without hand-maintaining the list. Always spread into an inline object literal as shown
1607
+ * below: the literal is what keeps the entry statically analyzable for consumers compiling
1608
+ * against the published package. An anti-drift spec fails when this list no longer matches
1609
+ * the directive's actual API. See `docs/wrapping-form-primitives.md` for both supported
1610
+ * wrapping patterns.
1611
+ *
1612
+ * @example
1613
+ * ```ts
1614
+ * @Component({
1615
+ * selector: 'input[mySearch]',
1616
+ * template: '',
1617
+ * hostDirectives: [
1618
+ * {
1619
+ * directive: ForSearch,
1620
+ * inputs: [...FOR_SEARCH_HOST_DIRECTIVE_INPUTS],
1621
+ * outputs: [...FOR_SEARCH_HOST_DIRECTIVE_OUTPUTS],
1622
+ * },
1623
+ * ],
1624
+ * })
1625
+ * export class MySearch {}
1626
+ * ```
1627
+ */
1628
+ declare const FOR_SEARCH_HOST_DIRECTIVE_INPUTS: readonly ["value", "dirty", "disabled", "errors", "invalid", "name", "pending", "readonly", "required", "touched"];
1629
+ /**
1630
+ * Exact public names of every `ForSearch` output, the Signal Forms `touch` output
1631
+ * included. Spread it into the `outputs` array of the same `hostDirectives` entry as
1632
+ * {@link FOR_SEARCH_HOST_DIRECTIVE_INPUTS}.
1633
+ */
1634
+ declare const FOR_SEARCH_HOST_DIRECTIVE_OUTPUTS: readonly ["valueChange", "touchedChange", "touch"];
1635
+
1206
1636
  /**
1207
1637
  * Headless on/off switch implementing the
1208
1638
  * [WAI-ARIA Switch pattern](https://www.w3.org/WAI/ARIA/apg/patterns/switch/)
@@ -1335,7 +1765,7 @@ declare class ForCheckbox extends FormUiControlBase implements FormCheckboxContr
1335
1765
  * children with mixed selection).
1336
1766
  */
1337
1767
  readonly indeterminate: _angular_core.ModelSignal<boolean>;
1338
- protected readonly ariaChecked: _angular_core.Signal<"true" | "false" | "mixed">;
1768
+ protected readonly ariaChecked: _angular_core.Signal<"mixed" | "true" | "false">;
1339
1769
  /**
1340
1770
  * Logical state reflected on `data-state`: `'checked'`, `'unchecked'`, or
1341
1771
  * `'indeterminate'`. Exposed so `ForCheckboxIndicator` can mirror it without
@@ -2362,16 +2792,46 @@ type FloatingSide = 'top' | 'right' | 'bottom' | 'left';
2362
2792
  /** Alignment along the side axis: at the start edge, centered, or at the end edge. */
2363
2793
  type FloatingAlign = 'start' | 'center' | 'end';
2364
2794
 
2365
- /** Reason a show / hide was scheduled — escape bypasses the close delay. */
2366
- type TooltipScheduleReason = 'hover' | 'focus' | 'escape';
2367
2795
  /**
2368
- * Coordination contract owned by `ForTooltip`. Trigger and content register
2369
- * their host elements so floating-ui can compute position; the optional arrow
2370
- * registers itself so the `arrow` middleware can offset it inside the bubble.
2796
+ * Pointer-grace ("safe triangle") helper.
2797
+ *
2798
+ * When a mouse leaves a submenu trigger heading toward the submenu content,
2799
+ * a naive "close on pointer-leave" would dismiss the submenu the moment the
2800
+ * cursor crosses the gap between the trigger and the content. The fix native
2801
+ * desktop menus use is a *safe triangle*: a polygon drawn
2802
+ * from the cursor's exit point to the near edge of the submenu content. While
2803
+ * the pointer stays inside that polygon it is assumed to be travelling toward
2804
+ * the submenu, so the close is held off.
2805
+ *
2806
+ * This module keeps no Angular DI surface — the geometry is pure functions
2807
+ * (unit-tested in `pointer-grace.spec.ts`) and {@link attachPointerGrace} is a
2808
+ * plain `addEventListener` wrapper returning a cleanup, wired by the directive
2809
+ * through its `DestroyRef`. The DOM-measured inputs (cursor position, content
2810
+ * rect, resolved side) are supplied by the caller, so the geometry stays
2811
+ * testable without faking layout.
2812
+ */
2813
+ /** A point in client (viewport) coordinates. */
2814
+ interface Point {
2815
+ readonly x: number;
2816
+ readonly y: number;
2817
+ }
2818
+
2819
+ /**
2820
+ * The resolved floating-ui positioning surface every trigger-anchored overlay
2821
+ * root publishes on its context. `ForPopoverContext`, `ForTooltipContext`, and
2822
+ * `ForHoverCardContext` all `extends` this so the 12-member positioning half of
2823
+ * each context interface is single-sourced rather than copied verbatim.
2824
+ *
2825
+ * Each member is the *effective* value — the per-instance input merged with the
2826
+ * scope default — so a content directive forwards it straight into
2827
+ * `injectOverlayShell` via `toFloatingPositioner` without re-resolving defaults.
2828
+ *
2829
+ * `open` is included because the floating positioner gates `autoUpdate` on it;
2830
+ * it is published by every root's open `model()` (a `ModelSignal` is a
2831
+ * `Signal`), so a single `extends` covers the whole positioner surface.
2371
2832
  */
2372
- interface ForTooltipContext {
2833
+ interface AnchoredPositioningContext {
2373
2834
  readonly open: Signal<boolean>;
2374
- readonly disabled: Signal<boolean>;
2375
2835
  readonly side: Signal<FloatingSide>;
2376
2836
  readonly align: Signal<FloatingAlign>;
2377
2837
  readonly sideOffset: Signal<number>;
@@ -2382,18 +2842,55 @@ interface ForTooltipContext {
2382
2842
  readonly sticky: Signal<'partial' | 'always' | false>;
2383
2843
  readonly hideWhenDetached: Signal<boolean>;
2384
2844
  readonly clipUntilPositioned: Signal<boolean>;
2845
+ readonly arrow: Signal<HTMLElement | null>;
2846
+ }
2847
+
2848
+ /** Reason a show / hide was scheduled — escape bypasses the close delay. */
2849
+ type TooltipScheduleReason = 'hover' | 'focus' | 'escape';
2850
+ /**
2851
+ * Coordination contract owned by `ForTooltip`. Trigger and content register
2852
+ * their host elements so floating-ui can compute position; the optional arrow
2853
+ * registers itself so the `arrow` middleware can offset it inside the bubble.
2854
+ *
2855
+ * The trigger and content forward their host hover / focus events through the
2856
+ * `pointerEnter*` / `pointerLeave*` / `focusTrigger` / `blurTrigger` methods;
2857
+ * the root owns the single open / close decision so all keep-alive sources
2858
+ * (trigger hover, trigger focus, and — under `hoverableContent` — content
2859
+ * hover) are reconciled in one place.
2860
+ */
2861
+ interface ForTooltipContext extends AnchoredPositioningContext {
2862
+ readonly open: Signal<boolean>;
2863
+ readonly disabled: Signal<boolean>;
2864
+ /** Whether the pointer may move into the content without dismissing the tooltip. */
2865
+ readonly hoverableContent: Signal<boolean>;
2866
+ /** Whether `prefers-reduced-motion: reduce` is active — reflected as `data-reduced-motion`. */
2867
+ readonly reducedMotion: Signal<boolean>;
2385
2868
  /** Trigger element id — a consumer-set host `id` is adopted, else a generated one. */
2386
2869
  readonly triggerId: Signal<string>;
2387
2870
  /** Content element id — a consumer-set host `id` is adopted, else a generated one. Referenced by the trigger's `aria-describedby` while open. */
2388
2871
  readonly contentId: Signal<string>;
2389
2872
  readonly trigger: Signal<HTMLElement | null>;
2390
- readonly arrow: Signal<HTMLElement | null>;
2391
2873
  registerTrigger(el: HTMLElement): void;
2392
2874
  unregisterTrigger(el: HTMLElement): void;
2875
+ /** Registers the content host element so the hoverable-content grace polygon can measure it. */
2876
+ registerContent(el: HTMLElement): void;
2877
+ unregisterContent(el: HTMLElement): void;
2393
2878
  /** Adopts a consumer-set static `id` on the content host into `contentId`. */
2394
2879
  adoptContentId(el: HTMLElement): void;
2395
2880
  registerArrow(el: HTMLElement): void;
2396
2881
  unregisterArrow(el: HTMLElement): void;
2882
+ /** The pointer entered the trigger; opens after the resolved open delay (gated by `showOnOverflow`). */
2883
+ pointerEnterTrigger(): void;
2884
+ /** The pointer left the trigger; closes, or arms the hoverable-content bridge from `cursor`. */
2885
+ pointerLeaveTrigger(cursor: Point): void;
2886
+ /** The trigger received focus; opens after the resolved open delay (gated by `showOnOverflow`). */
2887
+ focusTrigger(): void;
2888
+ /** The trigger lost focus; closes when nothing else keeps the tooltip alive. */
2889
+ blurTrigger(): void;
2890
+ /** The pointer entered the content (`hoverableContent`); holds the tooltip open. */
2891
+ pointerEnterContent(): void;
2892
+ /** The pointer left the content (`hoverableContent`); closes when nothing else keeps it alive. */
2893
+ pointerLeaveContent(): void;
2397
2894
  /** Schedule the tooltip to open after `openDelay` ms (instant when delay is 0). */
2398
2895
  scheduleOpen(reason: TooltipScheduleReason): void;
2399
2896
  /** Schedule the tooltip to close after `closeDelay` ms (instant on `escape`). */
@@ -2450,7 +2947,7 @@ declare class ForTooltip implements ForTooltipContext {
2450
2947
  readonly align: _angular_core.Signal<FloatingAlign>;
2451
2948
  /**
2452
2949
  * Per-tooltip override for the gap (px) between trigger and content along
2453
- * the main axis. Mirrors Radix's `sideOffset`. When `undefined` (default),
2950
+ * the main axis. When `undefined` (default),
2454
2951
  * falls back to `ForTooltipDefaults.sideOffset` from the surrounding
2455
2952
  * `provideForTooltipDefaults` scope (`8` unless configured).
2456
2953
  *
@@ -2516,6 +3013,50 @@ declare class ForTooltip implements ForTooltipContext {
2516
3013
  readonly closeDelay: _angular_core.InputSignal<number | undefined>;
2517
3014
  /** When true, all hover / focus interaction is ignored and any open tooltip is forced closed. */
2518
3015
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3016
+ /**
3017
+ * Per-tooltip override for whether the tooltip shows only when the
3018
+ * trigger's own text is truncated (`scrollWidth > clientWidth`) — the
3019
+ * common pattern for ellipsized labels where the tooltip adds nothing once
3020
+ * the full text is visible. When `undefined` (default), falls back to
3021
+ * `ForTooltipDefaults.showOnOverflow` from the surrounding
3022
+ * `provideForTooltipDefaults` scope (`false` unless configured).
3023
+ *
3024
+ * The input is aliased to `showOnOverflow`; consumers bind
3025
+ * `[showOnOverflow]="..."` (or the bare attribute) and read the effective
3026
+ * value via the public `showOnOverflow` computed below.
3027
+ */
3028
+ readonly _showOnOverflowInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
3029
+ /** Effective overflow gate: the `showOnOverflow` input when set, else the scope default. */
3030
+ readonly showOnOverflow: _angular_core.Signal<boolean>;
3031
+ /**
3032
+ * Per-tooltip override for whether the pointer may move into the content
3033
+ * without dismissing the tooltip. When `true`, the content drops its
3034
+ * default `pointer-events: none` while open and a pointer-grace "safe
3035
+ * triangle" bridges the gap between trigger and content so a slow diagonal
3036
+ * traversal doesn't close it. When `undefined` (default), falls back to
3037
+ * `ForTooltipDefaults.hoverableContent` from the surrounding
3038
+ * `provideForTooltipDefaults` scope (`false` unless configured).
3039
+ *
3040
+ * Per APG the content must stay non-interactive; this only allows the
3041
+ * pointer to rest over descriptive text (e.g. to select it).
3042
+ *
3043
+ * The input is aliased to `hoverableContent`; consumers bind
3044
+ * `[hoverableContent]="..."` (or the bare attribute) and read the effective
3045
+ * value via the public `hoverableContent` computed below.
3046
+ */
3047
+ readonly _hoverableContentInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
3048
+ /** Effective hoverable-content flag: the `hoverableContent` input when set, else the scope default. */
3049
+ readonly hoverableContent: _angular_core.Signal<boolean>;
3050
+ /**
3051
+ * Whether the user has requested reduced motion via the OS
3052
+ * `prefers-reduced-motion: reduce` media query. Reflected as the boolean
3053
+ * `data-reduced-motion` attribute on the root and content so consumers can
3054
+ * disable their own `animate.enter` / `animate.leave` and CSS transitions
3055
+ * without re-deriving the media query. Tooltip's JS-coordinated timing (the
3056
+ * open / close hover-intent delays) is intent debouncing, not motion, so it
3057
+ * is deliberately unchanged under reduced motion.
3058
+ */
3059
+ readonly reducedMotion: _angular_core.Signal<boolean>;
2519
3060
  /**
2520
3061
  * Id of the trigger element. A consumer-set `id` on the trigger host is
2521
3062
  * adopted at registration and preserved; the generated
@@ -2534,21 +3075,55 @@ declare class ForTooltip implements ForTooltipContext {
2534
3075
  */
2535
3076
  registerTrigger(el: HTMLElement): void;
2536
3077
  unregisterTrigger(el: HTMLElement): void;
3078
+ /** Registers the content host element so the hoverable-content grace polygon can measure it. */
3079
+ registerContent(el: HTMLElement): void;
3080
+ unregisterContent(el: HTMLElement): void;
2537
3081
  /** Adopts a consumer-set static `id` on the content host into `contentId`. */
2538
3082
  adoptContentId(el: HTMLElement): void;
2539
3083
  registerArrow(el: HTMLElement): void;
2540
3084
  unregisterArrow(el: HTMLElement): void;
3085
+ pointerEnterTrigger(): void;
3086
+ pointerLeaveTrigger(cursor: Point): void;
3087
+ focusTrigger(): void;
3088
+ blurTrigger(): void;
3089
+ pointerEnterContent(): void;
3090
+ pointerLeaveContent(): void;
2541
3091
  scheduleOpen(_reason: TooltipScheduleReason): void;
2542
3092
  scheduleClose(reason: TooltipScheduleReason): void;
2543
3093
  cancelPending(): void;
3094
+ /**
3095
+ * Imperatively opens the tooltip — for programmatic control beyond hover and
3096
+ * focus (e.g. a design-system wrapper driving the tooltip from a
3097
+ * text-truncation observer). Schedules the show after the resolved
3098
+ * `openDelay` (instant when the delay is `0` or the scope's skip-delay window
3099
+ * is active) and applies the same gates as a hover / focus open: a no-op
3100
+ * while `disabled`, and a no-op under `showOnOverflow` when the trigger's own
3101
+ * text is not truncated. For an instant, unconditional open that bypasses the
3102
+ * delay and both gates, write the `[(open)]` model directly (`open.set(true)`).
3103
+ */
3104
+ show(): void;
3105
+ /**
3106
+ * Imperatively closes the tooltip, mirroring a hover-leave / blur close:
3107
+ * schedules the hide after the resolved `closeDelay` (instant when the delay
3108
+ * is `0`) and disarms the hoverable-content grace bridge. For an instant
3109
+ * close that ignores `closeDelay`, write the `[(open)]` model directly
3110
+ * (`open.set(false)`).
3111
+ */
3112
+ hide(): void;
2544
3113
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForTooltip, never>;
2545
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTooltip, "[forTooltip]", ["forTooltip"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "_sideInput": { "alias": "side"; "required": false; "isSignal": true; }; "_alignInput": { "alias": "align"; "required": false; "isSignal": true; }; "_sideOffsetInput": { "alias": "sideOffset"; "required": false; "isSignal": true; }; "alignOffset": { "alias": "alignOffset"; "required": false; "isSignal": true; }; "avoidCollisions": { "alias": "avoidCollisions"; "required": false; "isSignal": true; }; "_collisionPaddingInput": { "alias": "collisionPadding"; "required": false; "isSignal": true; }; "arrowPadding": { "alias": "arrowPadding"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "hideWhenDetached": { "alias": "hideWhenDetached"; "required": false; "isSignal": true; }; "clipUntilPositioned": { "alias": "clipUntilPositioned"; "required": false; "isSignal": true; }; "openDelay": { "alias": "openDelay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, never, true, never>;
3114
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTooltip, "[forTooltip]", ["forTooltip"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "_sideInput": { "alias": "side"; "required": false; "isSignal": true; }; "_alignInput": { "alias": "align"; "required": false; "isSignal": true; }; "_sideOffsetInput": { "alias": "sideOffset"; "required": false; "isSignal": true; }; "alignOffset": { "alias": "alignOffset"; "required": false; "isSignal": true; }; "avoidCollisions": { "alias": "avoidCollisions"; "required": false; "isSignal": true; }; "_collisionPaddingInput": { "alias": "collisionPadding"; "required": false; "isSignal": true; }; "arrowPadding": { "alias": "arrowPadding"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "hideWhenDetached": { "alias": "hideWhenDetached"; "required": false; "isSignal": true; }; "clipUntilPositioned": { "alias": "clipUntilPositioned"; "required": false; "isSignal": true; }; "openDelay": { "alias": "openDelay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "_showOnOverflowInput": { "alias": "showOnOverflow"; "required": false; "isSignal": true; }; "_hoverableContentInput": { "alias": "hoverableContent"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, never, true, never>;
2546
3115
  }
2547
3116
 
2548
3117
  /**
2549
- * Element that activates the tooltip on hover or focus. Apply on a focusable
2550
- * element — preferably a `<button>` so keyboard users can reach it. Receives
2551
- * `aria-describedby` only while the tooltip is open, per APG.
3118
+ * Element that activates the tooltip on mouse hover or keyboard focus. Apply on
3119
+ * a focusable element — preferably a `<button>` so keyboard users can reach it.
3120
+ * Receives `aria-describedby` only while the tooltip is open, per APG.
3121
+ *
3122
+ * A touch tap does NOT open the tooltip: touch pointers are filtered out of
3123
+ * both the hover-open path and the focus-open path, because a tap is not a
3124
+ * hover and the APG flags hover-tooltips as problematic on touch (no hover, no
3125
+ * separate focus affordance, no obvious dismiss). Keyboard focus stays the
3126
+ * touch-accessible fallback for descriptive content.
2552
3127
  *
2553
3128
  * The root is normally resolved via DI from the enclosing `[forTooltip]`.
2554
3129
  * When the trigger is declared inside an `ng-template` stamped into the root
@@ -2570,8 +3145,9 @@ declare class ForTooltipTrigger {
2570
3145
  readonly forTooltipTrigger: _angular_core.InputSignal<"" | ForTooltipContext>;
2571
3146
  protected readonly ctx: _angular_core.Signal<ForTooltipContext>;
2572
3147
  constructor();
2573
- protected onPointerEnter(): void;
2574
- protected onPointerLeave(): void;
3148
+ protected onPointerEnter(event: PointerEvent): void;
3149
+ protected onPointerDown(event: PointerEvent): void;
3150
+ protected onPointerLeave(event: PointerEvent): void;
2575
3151
  protected onFocus(): void;
2576
3152
  protected onBlur(): void;
2577
3153
  protected onEscape(event: Event): void;
@@ -2585,8 +3161,10 @@ declare class ForTooltipTrigger {
2585
3161
  * `injectOverlayShell` helper) while mounted.
2586
3162
  *
2587
3163
  * Default `pointer-events: none` is applied via host styles so the bubble
2588
- * layers above content without intercepting hover. Override with your own
2589
- * CSS if needed — but per APG, do not put interactive elements inside.
3164
+ * layers above content without intercepting hover. When the root opts in with
3165
+ * `hoverableContent`, `pointer-events` is dropped while open so the pointer
3166
+ * can rest over the bubble without dismissing it. Override with your own CSS
3167
+ * if needed — but per APG, do not put interactive elements inside.
2590
3168
  *
2591
3169
  * The directive does not manage DOM presence — wrap with
2592
3170
  * `@if (tip.open())` (using a template ref on `[forTooltip]`) so the
@@ -2647,7 +3225,7 @@ interface ForTooltipDefaults {
2647
3225
  align: FloatingAlign;
2648
3226
  /**
2649
3227
  * Gap (px) between trigger and content along the main axis for tooltips
2650
- * that don't override `sideOffset` locally. Mirrors Radix's `sideOffset`.
3228
+ * that don't override `sideOffset` locally.
2651
3229
  * Library fallback `8`.
2652
3230
  */
2653
3231
  sideOffset: number;
@@ -2657,6 +3235,18 @@ interface ForTooltipDefaults {
2657
3235
  * locally. Library fallback `8`.
2658
3236
  */
2659
3237
  collisionPadding: number;
3238
+ /**
3239
+ * Whether tooltips show only when the trigger's own text is truncated
3240
+ * (`scrollWidth > clientWidth`), for tooltips that don't override
3241
+ * `showOnOverflow` locally. Library fallback `false`.
3242
+ */
3243
+ showOnOverflow: boolean;
3244
+ /**
3245
+ * Whether the pointer may move into the content without dismissing the
3246
+ * tooltip, for tooltips that don't override `hoverableContent` locally.
3247
+ * Library fallback `false`.
3248
+ */
3249
+ hoverableContent: boolean;
2660
3250
  }
2661
3251
  /** Token holding the resolved tooltip defaults for the current scope. */
2662
3252
  declare const FOR_TOOLTIP_DEFAULTS: _angular_core.InjectionToken<ForTooltipDefaults>;
@@ -2757,8 +3347,8 @@ declare const FOR_DIALOG_CONTEXT: InjectionToken<ForDialogContext>;
2757
3347
  * `data-state` is a static `"open"`: because mount is the consumer's
2758
3348
  * responsibility (the host only exists inside `@if (open())`), the element is
2759
3349
  * present iff the dialog is open, so the attribute can never be `"closed"`.
2760
- * This intentionally diverges from Radix, which keeps the node mounted and
2761
- * flips `data-state="closed"` to drive an exit transition. Here, exit styling
3350
+ * This is a deliberate choice: rather than keeping the node mounted and
3351
+ * flipping `data-state="closed"` to drive an exit transition, exit styling
2762
3352
  * is the consumer's `animate.leave` (see the usage example above), not a
2763
3353
  * `data-state="closed"` selector — so a `[data-state="closed"]` rule would
2764
3354
  * never match and is not a bug.
@@ -2985,14 +3575,17 @@ declare class ForDialogBackdrop {
2985
3575
  }
2986
3576
 
2987
3577
  /**
2988
- * Handle returned by `ForDialogManager.open()`. Inject inside the opened
2989
- * component to drive close imperatively. Both reactive (`isClosed`, `result`)
2990
- * and awaitable (`closed`) APIs are exposed — pick what fits the call site.
3578
+ * Shared handle returned by an imperative overlay manager's `open()`.
3579
+ * `ForDialogRef` / `ForDrawerRef` extend this verbatim to keep their public
3580
+ * class identity (and DI token) while the close engine lives here once.
2991
3581
  *
2992
- * `R` is the close-result type. Default `unknown`; specify it on
2993
- * `manager.open<C, R>(...)` to get type safety.
3582
+ * Both reactive (`isClosed`, `result`) and awaitable (`closed`) APIs are
3583
+ * exposed — pick what fits the call site. `R` is the close-result type.
3584
+ *
3585
+ * Internal — not re-exported from `public-api.ts`; the public surface is
3586
+ * `ForDialogRef` / `ForDrawerRef`.
2994
3587
  */
2995
- declare class ForDialogRef<R = unknown> {
3588
+ declare class OverlayRef<R = unknown> {
2996
3589
  #private;
2997
3590
  /** Reactive: `true` once `close()` has been called. */
2998
3591
  readonly isClosed: _angular_core.Signal<boolean>;
@@ -3001,12 +3594,124 @@ declare class ForDialogRef<R = unknown> {
3001
3594
  /** Awaitable: resolves with the close result the first time `close()` runs. */
3002
3595
  readonly closed: Promise<R | undefined>;
3003
3596
  /**
3004
- * Close the dialog, optionally returning a result. Idempotent — calling
3597
+ * Close the overlay, optionally returning a result. Idempotent — calling
3005
3598
  * twice is a no-op.
3006
3599
  */
3007
3600
  close(result?: R): void;
3008
3601
  }
3009
3602
 
3603
+ /**
3604
+ * Handle returned by `ForDialogManager.open()`. Inject inside the opened
3605
+ * component to drive close imperatively. Both reactive (`isClosed`, `result`)
3606
+ * and awaitable (`closed`) APIs are exposed — pick what fits the call site.
3607
+ *
3608
+ * `R` is the close-result type. Default `unknown`; specify it on
3609
+ * `manager.open<C, R>(...)` to get type safety.
3610
+ */
3611
+ declare class ForDialogRef<R = unknown> extends OverlayRef<R> {
3612
+ }
3613
+
3614
+ /**
3615
+ * Minimal shape every overlay entry must satisfy so the shared core can index,
3616
+ * render, and tear it down. Per-primitive entries (`ForDialogEntry`,
3617
+ * `ForDrawerEntry`) extend this with their own directive-input fields.
3618
+ *
3619
+ * Internal — not re-exported from `public-api.ts`.
3620
+ */
3621
+ interface OverlayManagerEntry {
3622
+ readonly id: string;
3623
+ readonly ref: OverlayRef<unknown>;
3624
+ }
3625
+ /**
3626
+ * The reactive surface a manager's outlet component is wired with on first
3627
+ * `open()`. Mirrors `ForDialogOutletHost` / `ForDrawerOutletHost`.
3628
+ *
3629
+ * Internal — not re-exported from `public-api.ts`.
3630
+ */
3631
+ interface OverlayManagerOutletHost<TEntry extends OverlayManagerEntry> {
3632
+ readonly entries: Signal<readonly TEntry[]>;
3633
+ closeAllForDestroy(): void;
3634
+ }
3635
+ /**
3636
+ * The minimal surface a manager's outlet component exposes so the core can
3637
+ * wire it on first `open()`. Mirrors `ForDialogOutlet` / `ForDrawerOutlet`.
3638
+ *
3639
+ * Internal — not re-exported from `public-api.ts`.
3640
+ */
3641
+ interface OverlayManagerOutlet<TEntry extends OverlayManagerEntry> {
3642
+ init(host: OverlayManagerOutletHost<TEntry>): void;
3643
+ }
3644
+ /**
3645
+ * Per-primitive bindings the shared core needs: how to name ids and the
3646
+ * exit-animation host / backdrop attributes, and how to create the outlet
3647
+ * component that renders the entries.
3648
+ *
3649
+ * Internal — not re-exported from `public-api.ts`.
3650
+ */
3651
+ interface OverlayManagerConfig<TEntry extends OverlayManagerEntry> {
3652
+ /**
3653
+ * Per-instance id prefix passed to `IdGenerator.next` (e.g.
3654
+ * `'for-dialog-instance'`).
3655
+ */
3656
+ readonly idPrefix: string;
3657
+ /**
3658
+ * Attribute the overlay root + backdrop reflect their per-instance id on
3659
+ * (e.g. `'data-for-dialog-id'`), matched during exit animation.
3660
+ */
3661
+ readonly idAttribute: string;
3662
+ /**
3663
+ * Attribute marking the portaled backdrop element (e.g.
3664
+ * `'data-for-dialog-backdrop'`), matched during exit animation.
3665
+ */
3666
+ readonly backdropAttribute: string;
3667
+ /** Creates the manager-owned outlet component (e.g. `ForDialogOutlet`). */
3668
+ createOutlet(environmentInjector: EnvironmentInjector): ComponentRef<OverlayManagerOutlet<TEntry>>;
3669
+ }
3670
+ /**
3671
+ * Shared imperative-overlay engine behind `ForDialogManager` and
3672
+ * `ForDrawerManager`. Owns the entries signal, the reactive `openCount`, the
3673
+ * lazily-created outlet, the destroy-time close-all sweep, the exit-animation
3674
+ * `beginLeave` driver, and the parent-cached per-component `Injector` factory.
3675
+ * The two managers differ only in their entry shape and directive-input
3676
+ * mapping; everything structural lives here once.
3677
+ *
3678
+ * Internal — not re-exported from `public-api.ts`; the public surface is
3679
+ * `ForDialogManager` / `ForDrawerManager`.
3680
+ */
3681
+ declare class OverlayManagerCore<TEntry extends OverlayManagerEntry> {
3682
+ #private;
3683
+ protected readonly idGen: IdGenerator;
3684
+ /** Reactive count of currently open programmatic overlays. */
3685
+ readonly openCount: Signal<number>;
3686
+ constructor(config: OverlayManagerConfig<TEntry>);
3687
+ }
3688
+
3689
+ /**
3690
+ * Shape of a single open dialog entry stored in the manager.
3691
+ *
3692
+ * Internal — not re-exported from `public-api.ts`.
3693
+ */
3694
+ interface ForDialogEntry extends OverlayManagerEntry {
3695
+ readonly component: Type<unknown>;
3696
+ readonly hostClass: string;
3697
+ readonly dismissible: boolean | undefined;
3698
+ readonly modal: boolean | undefined;
3699
+ readonly alert: boolean | undefined;
3700
+ readonly returnFocus: boolean | undefined;
3701
+ readonly initialFocus: 'first' | 'container' | undefined;
3702
+ readonly ariaLabel: string | undefined;
3703
+ readonly container: HTMLElement | null | undefined;
3704
+ readonly animateEnter: string | undefined;
3705
+ readonly autoFocusOnOpen: ((e: VetoableEvent) => void) | undefined;
3706
+ readonly autoFocusOnClose: ((e: VetoableEvent) => void) | undefined;
3707
+ readonly escapeKeyDown: ((e: VetoableNativeEvent<KeyboardEvent>) => void) | undefined;
3708
+ readonly pointerDownOutside: ((e: VetoableNativeEvent<PointerEvent>) => void) | undefined;
3709
+ readonly focusOutside: ((e: VetoableNativeEvent<FocusEvent>) => void) | undefined;
3710
+ readonly interactOutside: ((e: VetoableNativeEvent<PointerEvent | FocusEvent>) => void) | undefined;
3711
+ handleClose(value: unknown): void;
3712
+ injectorFor(parent: Injector): Injector;
3713
+ }
3714
+
3010
3715
  /**
3011
3716
  * Injection token for the `data` payload passed to `ForDialogManager.open(component, { data })`.
3012
3717
  * The manager always provides this token, falling back to `null` when no `data`
@@ -3147,8 +3852,8 @@ interface ForDialogOpenConfig<D = unknown> {
3147
3852
  interactOutside?: (event: VetoableNativeEvent<PointerEvent | FocusEvent>) => void;
3148
3853
  }
3149
3854
  /**
3150
- * Programmatic dialog opener — the headless equivalent of CDK's `Dialog`.
3151
- * Inject anywhere, call `open(MyComponent, { data, ... })` and get a
3855
+ * Programmatic dialog opener — open a component as a modal dialog from
3856
+ * TypeScript. Inject anywhere, call `open(MyComponent, { data, ... })` and get a
3152
3857
  * `ForDialogRef<R>` back. Internally the manager renders the user component
3153
3858
  * inside a manager-owned `@for` outlet, so Angular's control-flow unmount
3154
3859
  * fires `animate.leave` before the node leaves the DOM — identical to the
@@ -3162,10 +3867,9 @@ interface ForDialogOpenConfig<D = unknown> {
3162
3867
  * Inject `ForDialogRef` to drive close imperatively and `FOR_DIALOG_DATA` (or
3163
3868
  * `injectDialogData<T>()`) for the payload.
3164
3869
  */
3165
- declare class ForDialogManager {
3870
+ declare class ForDialogManager extends OverlayManagerCore<ForDialogEntry> {
3166
3871
  #private;
3167
- /** Reactive count of currently open programmatic dialogs (useful for diagnostics). */
3168
- readonly openCount: _angular_core.Signal<number>;
3872
+ constructor();
3169
3873
  open<C, R = unknown, D = unknown>(component: Type<C>, config?: ForDialogOpenConfig<D>): ForDialogRef<R>;
3170
3874
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForDialogManager, never>;
3171
3875
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ForDialogManager>;
@@ -3226,7 +3930,7 @@ declare function provideForDialogDefaults(defaults?: Partial<ForDialogDefaults>)
3226
3930
  type ForDrawerSide = 'top' | 'right' | 'bottom' | 'left';
3227
3931
 
3228
3932
  /**
3229
- * A snap point. Three accepted shapes (Vaul-aligned):
3933
+ * A snap point. Three accepted shapes:
3230
3934
  *
3231
3935
  * - `number ∈ [0, 1]` — fraction of the dimension along the dismissal axis.
3232
3936
  * - `'NN%'` — equivalent to a fraction, e.g. `'50%' === 0.5`.
@@ -3346,7 +4050,7 @@ interface ForDrawerReleaseEvent {
3346
4050
  /**
3347
4051
  * Headless implementation of the [WAI-ARIA Modal Dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/),
3348
4052
  * specialised as a side / bottom-sheet drawer with optional swipe-to-dismiss
3349
- * and Vaul-style snap points.
4053
+ * and snap points.
3350
4054
  *
3351
4055
  * Apply `[forDrawer]` on the drawer surface itself — not on a wrapper. The
3352
4056
  * directive moves the host to `document.body` (portal), traps focus, locks
@@ -3421,7 +4125,7 @@ declare class ForDrawer implements ForDrawerContext {
3421
4125
  readonly swipeToDismiss: _angular_core.InputSignalWithTransform<boolean, unknown>;
3422
4126
  /**
3423
4127
  * Fraction past which a release dismisses instead of snapping back.
3424
- * Vaul-aligned default `0.25`. Without `snapPoints` it is a fraction of the
4128
+ * Default `0.25`. Without `snapPoints` it is a fraction of the
3425
4129
  * full drawer dimension along the dismissal axis (dragged > 25% of the
3426
4130
  * surface size toward the edge dismisses); with `snapPoints` it is a
3427
4131
  * fraction of the **lowest snap's** extent, so a small "peek" snap stays
@@ -3436,7 +4140,7 @@ declare class ForDrawer implements ForDrawerContext {
3436
4140
  readonly handleOnly: _angular_core.InputSignalWithTransform<boolean, unknown>;
3437
4141
  /**
3438
4142
  * When true, asks the registered `[forDrawerWrapper]` to scale and
3439
- * translate behind this drawer (Vaul-style "shouldScaleBackground"). No
4143
+ * translate behind this drawer (the "scale background" effect). No
3440
4144
  * effect under `prefers-reduced-motion: reduce`, and a no-op if no
3441
4145
  * wrapper is mounted. Default `false` so existing consumers are
3442
4146
  * untouched.
@@ -3450,7 +4154,7 @@ declare class ForDrawer implements ForDrawerContext {
3450
4154
  */
3451
4155
  readonly setBackgroundColorOnScale: _angular_core.InputSignalWithTransform<boolean, unknown>;
3452
4156
  /**
3453
- * Snap points (Vaul semantics): each entry is a `number ∈ [0, 1]`,
4157
+ * Snap points: each entry is a `number ∈ [0, 1]`,
3454
4158
  * a `'NN%'` string, or a `'NNpx'` string. Strictly increasing
3455
4159
  * (closest-to-edge first). The surface settles at the nearest snap on
3456
4160
  * release; dragging past the lowest snap by `closeThreshold` of that
@@ -3495,30 +4199,38 @@ declare class ForDrawer implements ForDrawerContext {
3495
4199
  readonly release: _angular_core.OutputEmitterRef<ForDrawerReleaseEvent>;
3496
4200
  readonly labelledBy: _angular_core.Signal<string | null>;
3497
4201
  readonly describedBy: _angular_core.Signal<string | null>;
4202
+ readonly activeSnapPointAttr: _angular_core.Signal<string | null>;
4203
+ readonly fadeFromActive: _angular_core.Signal<boolean>;
4204
+ /**
4205
+ * `true` while a pointer drag gesture is in flight. Mirrors the host's
4206
+ * `data-dragging` attribute; surfaced through `ForDrawerContext` so pieces
4207
+ * portaled away from the surface (the backdrop) can suppress their own
4208
+ * transitions during the gesture.
4209
+ */
3498
4210
  readonly dragging: _angular_core.Signal<boolean>;
4211
+ /**
4212
+ * Progress of the current drag toward the anchored edge, `∈ [0, 1]`.
4213
+ * Surfaced through `ForDrawerContext` so the backdrop can publish it as the
4214
+ * `--for-drawer-drag-progress` custom property.
4215
+ */
3499
4216
  readonly dragProgress: _angular_core.Signal<number>;
3500
- readonly activeSnapPointAttr: _angular_core.Signal<string | null>;
3501
4217
  /**
3502
4218
  * Live drag displacement as a CSS `translate` value (`"<x> <y>"`),
3503
4219
  * published on the host as the `--for-drawer-translate` custom property by
3504
- * an effect in the constructor. The consumer composes it on the surface
3505
- * with `translate: var(--for-drawer-translate, 0px 0px)`.
4220
+ * the gesture engine. The consumer composes it on the surface with
4221
+ * `translate: var(--for-drawer-translate, 0px 0px)`.
3506
4222
  *
3507
- * A **custom property** is used (rather than writing the `translate` /
3508
- * `transform` property directly) for two reasons: `transform` is reserved
3509
- * for `ForDrawerScaleCoordinator`'s nested / scale-background effect, and
3510
- * a directly-written inline `translate` is silently dropped by Angular
3511
- * when the consumer also binds a template `[style.*]` on the same host —
3512
- * custom properties survive because Angular's style bindings never touch
3513
- * them. `"0px 0px"` at rest. The write rides the same change-detection
3514
- * pass as the `data-dragging` removal and the `data-active-snap-point`
3515
- * change on release, so the consumer's `transition: translate` animates
3516
- * the drag delta back to zero in lockstep with the snap-position
3517
- * transition, instead of the surface jumping to the old rest position
3518
- * before sliding to the new snap.
4223
+ * A **custom property** is used (rather than writing `translate` /
4224
+ * `transform` directly) because `transform` is reserved for
4225
+ * `ForDrawerScaleCoordinator` and a directly-written inline `translate` is
4226
+ * dropped by Angular when the consumer also binds a template `[style.*]` on
4227
+ * the same host. `"0px 0px"` at rest; the write rides the same change-
4228
+ * detection pass as the `data-dragging` / `data-active-snap-point` changes
4229
+ * on release so the consumer's `transition: translate` animates back in
4230
+ * lockstep with the snap transition rather than jumping to the old rest
4231
+ * position first.
3519
4232
  */
3520
4233
  readonly dragTranslate: _angular_core.Signal<string>;
3521
- readonly fadeFromActive: _angular_core.Signal<boolean>;
3522
4234
  /** Host element of this drawer surface — exposed via `ForDrawerContext`. */
3523
4235
  get hostElement(): HTMLElement;
3524
4236
  readonly depthAttr: _angular_core.Signal<string>;
@@ -3607,13 +4319,13 @@ declare class ForDrawerTrigger {
3607
4319
  *
3608
4320
  * Reflects `data-fade-from-active` when `fadeFromIndex` on the drawer root
3609
4321
  * is set and the active snap point is at or past that index — consumers
3610
- * tie this to a CSS opacity transition for the Vaul-style "backdrop fades
4322
+ * tie this to a CSS opacity transition for the "backdrop fades
3611
4323
  * in once you snap up past N" effect.
3612
4324
  *
3613
4325
  * Publishes the live drag progress toward the anchored edge as the
3614
4326
  * `--for-drawer-drag-progress` custom property (`0` at rest → `1` fully
3615
4327
  * dragged off-screen) and mirrors the surface's `data-dragging` attribute.
3616
- * Together these drive the Vaul-style "backdrop fades out as you swipe to
4328
+ * Together these drive the "backdrop fades out as you swipe to
3617
4329
  * dismiss" effect with pure CSS:
3618
4330
  *
3619
4331
  * ```css
@@ -3705,9 +4417,7 @@ declare class ForDrawerClose {
3705
4417
  /**
3706
4418
  * Marks the consumer's app-shell wrapper so {@link ForDrawer}'s
3707
4419
  * `scaleBackground` effect can transform the rest of the page when a
3708
- * drawer opens — inspired by Vaul's `[data-vaul-drawer-wrapper]` and
3709
- * Base UI's `Drawer.Indent`, but wired through Angular DI instead of a
3710
- * global selector.
4420
+ * drawer opens — applied through Angular DI rather than a global selector.
3711
4421
  *
3712
4422
  * Apply on the element that contains everything the drawer should appear
3713
4423
  * to recede behind (typically the root shell). Reflects
@@ -3737,19 +4447,45 @@ declare class ForDrawerWrapper {
3737
4447
  * `R` is the close-result type. Default `unknown`; specify it on
3738
4448
  * `manager.open<C, R>(...)` to get type safety.
3739
4449
  */
3740
- declare class ForDrawerRef<R = unknown> {
3741
- #private;
3742
- /** Reactive: `true` once `close()` has been called. */
3743
- readonly isClosed: _angular_core.Signal<boolean>;
3744
- /** Reactive: the close result. `undefined` while open. */
3745
- readonly result: _angular_core.Signal<R | undefined>;
3746
- /** Awaitable: resolves with the close result the first time `close()` runs. */
3747
- readonly closed: Promise<R | undefined>;
3748
- /**
3749
- * Close the drawer, optionally returning a result. Idempotent — calling
3750
- * twice is a no-op.
3751
- */
3752
- close(result?: R): void;
4450
+ declare class ForDrawerRef<R = unknown> extends OverlayRef<R> {
4451
+ }
4452
+
4453
+ /**
4454
+ * Shape of a single open drawer entry stored in the manager.
4455
+ *
4456
+ * Internal — not re-exported from `public-api.ts`.
4457
+ */
4458
+ interface ForDrawerEntry extends OverlayManagerEntry {
4459
+ readonly component: Type<unknown>;
4460
+ readonly hostClass: string;
4461
+ readonly side: ForDrawerSide | undefined;
4462
+ readonly dismissible: boolean | undefined;
4463
+ readonly modal: boolean | undefined;
4464
+ readonly alert: boolean | undefined;
4465
+ readonly returnFocus: boolean | undefined;
4466
+ readonly initialFocus: 'first' | 'container' | undefined;
4467
+ readonly ariaLabel: string | undefined;
4468
+ readonly container: HTMLElement | null | undefined;
4469
+ readonly animateEnter: string | undefined;
4470
+ readonly autoFocusOnOpen: ((e: VetoableEvent) => void) | undefined;
4471
+ readonly autoFocusOnClose: ((e: VetoableEvent) => void) | undefined;
4472
+ readonly swipeToDismiss: boolean | undefined;
4473
+ readonly closeThreshold: number | undefined;
4474
+ readonly handleOnly: boolean | undefined;
4475
+ readonly scaleBackground: boolean | undefined;
4476
+ readonly setBackgroundColorOnScale: boolean | undefined;
4477
+ readonly snapPoints: ReadonlyArray<ForDrawerSnapPoint> | undefined;
4478
+ readonly activeSnapPoint: ForDrawerSnapPoint | undefined;
4479
+ readonly fadeFromIndex: number | undefined;
4480
+ readonly escapeKeyDown: ((e: VetoableNativeEvent<KeyboardEvent>) => void) | undefined;
4481
+ readonly pointerDownOutside: ((e: VetoableNativeEvent<PointerEvent>) => void) | undefined;
4482
+ readonly focusOutside: ((e: VetoableNativeEvent<FocusEvent>) => void) | undefined;
4483
+ readonly interactOutside: ((e: VetoableNativeEvent<PointerEvent | FocusEvent>) => void) | undefined;
4484
+ readonly onDrag: ((e: ForDrawerDragEvent) => void) | undefined;
4485
+ readonly onRelease: ((e: ForDrawerReleaseEvent) => void) | undefined;
4486
+ readonly onActiveSnapPointChange: ((snap: ForDrawerSnapPoint | null) => void) | undefined;
4487
+ handleClose(value: unknown): void;
4488
+ injectorFor(parent: Injector): Injector;
3753
4489
  }
3754
4490
 
3755
4491
  /**
@@ -3824,13 +4560,13 @@ interface ForDrawerOpenConfig<D = unknown> {
3824
4560
  backdropAnimateLeave?: string;
3825
4561
  /** When true (default), pointer drag past `closeThreshold` dismisses. */
3826
4562
  swipeToDismiss?: boolean;
3827
- /** Vaul-style fraction of dimension past which a release dismisses. Default `0.25`. */
4563
+ /** Fraction of dimension past which a release dismisses. Default `0.25`. */
3828
4564
  closeThreshold?: number;
3829
4565
  /** When true, swipe only arms on a registered handle element. Default `false`. */
3830
4566
  handleOnly?: boolean;
3831
4567
  /**
3832
4568
  * When true, asks the registered `[forDrawerWrapper]` to scale and translate
3833
- * behind this drawer (Vaul-style "shouldScaleBackground"). No effect under
4569
+ * behind this drawer (the "scale background" effect). No effect under
3834
4570
  * `prefers-reduced-motion: reduce`, and a no-op if no wrapper is mounted.
3835
4571
  */
3836
4572
  scaleBackground?: boolean;
@@ -3840,7 +4576,7 @@ interface ForDrawerOpenConfig<D = unknown> {
3840
4576
  * viewport edge does not show through.
3841
4577
  */
3842
4578
  setBackgroundColorOnScale?: boolean;
3843
- /** Snap points (Vaul semantics). Optional. */
4579
+ /** Snap points. Optional. */
3844
4580
  snapPoints?: ReadonlyArray<ForDrawerSnapPoint>;
3845
4581
  /** Initial snap point at open time. Defaults to `snapPoints?.[0]`. */
3846
4582
  defaultSnapPoint?: ForDrawerSnapPoint;
@@ -3945,10 +4681,9 @@ interface ForDrawerOpenConfig<D = unknown> {
3945
4681
  * Inject `ForDrawerRef` to drive close imperatively and `FOR_DRAWER_DATA` (or
3946
4682
  * `injectDrawerData<T>()`) for the payload.
3947
4683
  */
3948
- declare class ForDrawerManager {
4684
+ declare class ForDrawerManager extends OverlayManagerCore<ForDrawerEntry> {
3949
4685
  #private;
3950
- /** Reactive count of currently open programmatic drawers. */
3951
- readonly openCount: _angular_core.Signal<number>;
4686
+ constructor();
3952
4687
  open<C, R = unknown, D = unknown>(component: Type<C>, config?: ForDrawerOpenConfig<D>): ForDrawerRef<R>;
3953
4688
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForDrawerManager, never>;
3954
4689
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ForDrawerManager>;
@@ -3972,8 +4707,8 @@ interface ForDrawerDefaults {
3972
4707
  /**
3973
4708
  * Default `0.25`. Fraction past which a release dismisses instead of
3974
4709
  * snapping back: of the full dimension without snap points, of the lowest
3975
- * snap's extent with them. Vaul semantics (see
3976
- * `_internal/swipe-dismiss/resolveSnapTarget`).
4710
+ * snap's extent with them (see
4711
+ * `_internal/snap-points/resolveSnapTarget`).
3977
4712
  */
3978
4713
  closeThreshold?: number;
3979
4714
  /** Default `'first'`. Where to send focus on mount. */
@@ -3987,8 +4722,8 @@ interface ForDrawerDefaults {
3987
4722
  handleOnly?: boolean;
3988
4723
  /**
3989
4724
  * Default `false`. When `true`, an open drawer asks
3990
- * `[forDrawerWrapper]` to scale + translate behind it (Vaul-style
3991
- * "shouldScaleBackground"). Suppressed under
4725
+ * `[forDrawerWrapper]` to scale + translate behind it (the "scale
4726
+ * background" effect). Suppressed under
3992
4727
  * `prefers-reduced-motion: reduce`.
3993
4728
  */
3994
4729
  scaleBackground?: boolean;
@@ -4067,25 +4802,17 @@ declare function provideForDrawerDefaults(defaults?: Partial<ForDrawerDefaults>)
4067
4802
  * is published here so descendant pieces can react without each subscribing
4068
4803
  * to the directive instance directly.
4069
4804
  */
4070
- interface ForPopoverContext {
4805
+ interface ForPopoverContext extends AnchoredPositioningContext {
4071
4806
  readonly open: ModelSignal<boolean>;
4072
4807
  readonly disabled: Signal<boolean>;
4073
4808
  readonly dismissible: Signal<boolean>;
4074
4809
  readonly returnFocus: Signal<boolean>;
4075
4810
  readonly initialFocus: Signal<'first' | 'container'>;
4076
- readonly side: Signal<FloatingSide>;
4077
- readonly align: Signal<FloatingAlign>;
4078
- readonly sideOffset: Signal<number>;
4079
- readonly alignOffset: Signal<number>;
4080
- readonly avoidCollisions: Signal<boolean>;
4081
- readonly collisionPadding: Signal<number>;
4082
- readonly arrowPadding: Signal<number>;
4083
- readonly sticky: Signal<'partial' | 'always' | false>;
4084
- readonly hideWhenDetached: Signal<boolean>;
4085
- readonly clipUntilPositioned: Signal<boolean>;
4086
4811
  readonly triggerId: Signal<string>;
4087
4812
  readonly contentId: Signal<string>;
4088
4813
  readonly ariaLabel: Signal<string | null>;
4814
+ /** Whether `prefers-reduced-motion: reduce` is active — reflected as `data-reduced-motion`. */
4815
+ readonly reducedMotion: Signal<boolean>;
4089
4816
  readonly labelledBy: Signal<string | null>;
4090
4817
  readonly describedBy: Signal<string | null>;
4091
4818
  readonly trigger: Signal<HTMLElement | null>;
@@ -4098,7 +4825,6 @@ interface ForPopoverContext {
4098
4825
  * the popover paints.
4099
4826
  */
4100
4827
  readonly reference: Signal<HTMLElement | null>;
4101
- readonly arrow: Signal<HTMLElement | null>;
4102
4828
  registerTrigger(el: HTMLElement): void;
4103
4829
  unregisterTrigger(el: HTMLElement): void;
4104
4830
  /** Adopts a consumer-set static `id` on the content host into `contentId`. */
@@ -4203,7 +4929,7 @@ declare class ForPopover implements ForPopoverContext {
4203
4929
  /**
4204
4930
  * Per-popover override for the gap (px) between trigger and content along
4205
4931
  * the *main* axis (perpendicular to `side`). Forwarded to floating-ui's
4206
- * `offset` middleware. Mirrors Radix's `sideOffset`. When `undefined`
4932
+ * `offset` middleware. When `undefined`
4207
4933
  * (default), falls back to `ForPopoverDefaults.sideOffset` from the
4208
4934
  * surrounding `provideForPopoverDefaults` scope (`8` unless configured).
4209
4935
  *
@@ -4222,8 +4948,8 @@ declare class ForPopover implements ForPopoverContext {
4222
4948
  readonly avoidCollisions: _angular_core.InputSignalWithTransform<boolean, unknown>;
4223
4949
  /**
4224
4950
  * Per-popover override for the padding (px) applied uniformly to the
4225
- * `flip`, `shift`, and `size` middlewares. Mirrors Radix's
4226
- * `collisionPadding`. When `undefined` (default), falls back to
4951
+ * `flip`, `shift`, and `size` middlewares. When `undefined` (default),
4952
+ * falls back to
4227
4953
  * `ForPopoverDefaults.collisionPadding` from the surrounding
4228
4954
  * `provideForPopoverDefaults` scope (`8` unless configured).
4229
4955
  *
@@ -4282,6 +5008,15 @@ declare class ForPopover implements ForPopoverContext {
4282
5008
  readonly initialFocus: _angular_core.InputSignal<"first" | "container">;
4283
5009
  /** Manual `aria-label` on the content. Use this when no visible title element exists. */
4284
5010
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
5011
+ /**
5012
+ * Whether the user has requested reduced motion via the OS
5013
+ * `prefers-reduced-motion: reduce` media query. Reflected as the boolean
5014
+ * `data-reduced-motion` attribute on the root and content so consumers can
5015
+ * disable their own `animate.enter` / `animate.leave` and CSS transitions
5016
+ * without re-deriving the media query. The popover toggles open / closed
5017
+ * synchronously on trigger click, so it has no JS-coordinated timing to skip.
5018
+ */
5019
+ readonly reducedMotion: _angular_core.Signal<boolean>;
4285
5020
  /**
4286
5021
  * Fires when the user presses Escape while this popover is the topmost
4287
5022
  * dismissable layer. Call `preventDefault()` on the emitted veto to
@@ -4539,7 +5274,7 @@ interface ForPopoverDefaults {
4539
5274
  align: FloatingAlign;
4540
5275
  /**
4541
5276
  * Gap (px) between trigger and content along the main axis for popovers
4542
- * that don't override `sideOffset` locally. Mirrors Radix's `sideOffset`.
5277
+ * that don't override `sideOffset` locally.
4543
5278
  * Library fallback `8`.
4544
5279
  */
4545
5280
  sideOffset: number;
@@ -4651,7 +5386,7 @@ declare const FOR_TOGGLE_GROUP_CONTEXT: InjectionToken<ForToggleGroupContext>;
4651
5386
  * Headless group of toggle buttons: a `role="group"` container whose items
4652
5387
  * each carry `aria-pressed`, modelled on the
4653
5388
  * [WAI-ARIA Button pattern](https://www.w3.org/WAI/ARIA/apg/patterns/button/)
4654
- * (toggle-button variant) — mirroring Radix's ToggleGroup. Owns the
5389
+ * (toggle-button variant). Owns the
4655
5390
  * selected-values set, navigation policy, and the registry of
4656
5391
  * `[forToggleGroupItem]` children. Implements
4657
5392
  * `FormValueControl<readonly string[]>` from `@angular/forms/signals` for
@@ -4870,6 +5605,81 @@ declare const FOR_TOGGLE_GROUP_HOST_DIRECTIVE_INPUTS: readonly ["value", "dir",
4870
5605
  */
4871
5606
  declare const FOR_TOGGLE_GROUP_HOST_DIRECTIVE_OUTPUTS: readonly ["valueChange", "touchedChange", "touch"];
4872
5607
 
5608
+ /**
5609
+ * Headless implementation of the [WAI-ARIA Button pattern](https://www.w3.org/WAI/ARIA/apg/patterns/button/).
5610
+ *
5611
+ * Works on a native `<button>` host and on any arbitrary host element (e.g. `<div>`, `<span>`).
5612
+ * On a native button the platform handles Enter/Space → click synthesis and no `role` or
5613
+ * `tabindex` is emitted (the platform owns those). On a non-button host, `role="button"` and
5614
+ * `tabindex="0"` are applied, and keydown for Enter/Space synthesizes a click so the directive's
5615
+ * single `onClick` path handles all activations.
5616
+ *
5617
+ * Disabled stays focusable: per the APG a disabled button must remain reachable by assistive
5618
+ * technology, so the native `disabled` attribute is never set. Instead `aria-disabled="true"` and
5619
+ * `data-disabled=""` are reflected and the activation handler becomes a no-op.
5620
+ *
5621
+ * Interaction state is reflected as `data-pressed`, `data-hovered`, and `data-focus-visible`
5622
+ * (present/absent boolean attributes). There is no `data-state` — this primitive has no
5623
+ * open/closed or checked/unchecked logical state.
5624
+ *
5625
+ * @example
5626
+ * ```html
5627
+ * <!-- Native button — platform handles Enter/Space -->
5628
+ * <button forButton (activate)="doSomething()">Click me</button>
5629
+ *
5630
+ * <!-- Non-button host — role, tabindex, and keyboard handling added automatically -->
5631
+ * <div forButton (activate)="doSomething()">Click me</div>
5632
+ *
5633
+ * <!-- Disabled: stays focusable, activation is a no-op -->
5634
+ * <button forButton [disabled]="true" (activate)="doSomething()">Disabled</button>
5635
+ * ```
5636
+ */
5637
+ declare class ForButton {
5638
+ #private;
5639
+ /**
5640
+ * When `true`, activation (click, Enter, Space) is suppressed and the element
5641
+ * reflects `aria-disabled="true"` + `data-disabled=""`. The element remains
5642
+ * focusable so assistive technology can announce it.
5643
+ */
5644
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
5645
+ /**
5646
+ * Emitted once per user activation: a pointer click on any host, or Enter / Space
5647
+ * on a non-native-button host (native buttons synthesize click from keyboard). The
5648
+ * name `activate` is chosen deliberately to avoid colliding with the native `click`
5649
+ * event (which would trip `@angular-eslint/no-output-native` on wrapping consumers).
5650
+ */
5651
+ readonly activate: _angular_core.OutputEmitterRef<void>;
5652
+ protected readonly hovered: _angular_core.Signal<boolean>;
5653
+ protected readonly pressed: _angular_core.Signal<boolean>;
5654
+ protected readonly focusVisible: _angular_core.Signal<boolean>;
5655
+ protected readonly resolvedType: _angular_core.Signal<string | null>;
5656
+ protected readonly resolvedRole: _angular_core.Signal<"button" | null>;
5657
+ protected readonly resolvedTabindex: _angular_core.Signal<"0" | null>;
5658
+ protected onClick(event: MouseEvent): void;
5659
+ protected onKeydown(event: KeyboardEvent): void;
5660
+ protected onFocusIn(): void;
5661
+ protected onFocusOut(): void;
5662
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForButton, never>;
5663
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForButton, "[forButton]", ["forButton"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "activate": "activate"; }, never, never, true, never>;
5664
+ }
5665
+
5666
+ /**
5667
+ * Defaults inherited by descendant buttons in the surrounding injector
5668
+ * scope. Configure with `provideForButtonDefaults`. The shape is a stub
5669
+ * today — present so future per-scope tuning can land without churning the
5670
+ * public surface.
5671
+ */
5672
+ interface ForButtonDefaults {
5673
+ }
5674
+ /** Token holding the resolved button defaults for the current scope. */
5675
+ declare const FOR_BUTTON_DEFAULTS: _angular_core.InjectionToken<ForButtonDefaults>;
5676
+ /**
5677
+ * Configures forty-cdk button defaults for this injector scope. Partial
5678
+ * overrides inherit unspecified keys from the parent scope (or library
5679
+ * defaults at the root).
5680
+ */
5681
+ declare function provideForButtonDefaults(defaults?: Partial<ForButtonDefaults>): Provider[];
5682
+
4873
5683
  /**
4874
5684
  * The menu surface. Carries `role="menu"`, is portaled to `document.body`,
4875
5685
  * and is positioned by `@floating-ui/dom` against the registered anchor —
@@ -5343,7 +6153,7 @@ declare class MenuOverlay<H extends MenuOverlayItemHandle = MenuOverlayItemHandl
5343
6153
  /**
5344
6154
  * Clears `data-highlighted` from every item without moving focus. The shared
5345
6155
  * `[forMenuContent]` calls this on `pointerleave` so the hover highlight
5346
- * follows the pointer off the surface (Radix-style).
6156
+ * follows the pointer off the surface.
5347
6157
  */
5348
6158
  clearItemHighlights(): void;
5349
6159
  /**
@@ -5446,30 +6256,6 @@ declare abstract class MenuOverlayHost<H extends MenuOverlayItemHandle = MenuOve
5446
6256
  emitAutoFocusOnClose(): boolean;
5447
6257
  }
5448
6258
 
5449
- /**
5450
- * Pointer-grace ("safe triangle") helper.
5451
- *
5452
- * When a mouse leaves a submenu trigger heading toward the submenu content,
5453
- * a naive "close on pointer-leave" would dismiss the submenu the moment the
5454
- * cursor crosses the gap between the trigger and the content. Radix, Base UI,
5455
- * and native desktop menus solve this with a *safe triangle*: a polygon drawn
5456
- * from the cursor's exit point to the near edge of the submenu content. While
5457
- * the pointer stays inside that polygon it is assumed to be travelling toward
5458
- * the submenu, so the close is held off.
5459
- *
5460
- * This module keeps no Angular DI surface — the geometry is pure functions
5461
- * (unit-tested in `pointer-grace.spec.ts`) and {@link attachPointerGrace} is a
5462
- * plain `addEventListener` wrapper returning a cleanup, wired by the directive
5463
- * through its `DestroyRef`. The DOM-measured inputs (cursor position, content
5464
- * rect, resolved side) are supplied by the caller, so the geometry stays
5465
- * testable without faking layout.
5466
- */
5467
- /** A point in client (viewport) coordinates. */
5468
- interface Point {
5469
- readonly x: number;
5470
- readonly y: number;
5471
- }
5472
-
5473
6259
  /**
5474
6260
  * Minimal upward contract a menu uses to move between sibling menus of an
5475
6261
  * enclosing menubar. Implemented by the menubar root; keeps the generic menu
@@ -5480,8 +6266,8 @@ interface MenuSiblingNavigator {
5480
6266
  switchToSibling(direction: 'next' | 'prev'): void;
5481
6267
  }
5482
6268
  /**
5483
- * Why a menu requested close. Mirrors Radix's `onCloseAutoFocus` reasons
5484
- * but without the focus-routing decision baked in. `'programmatic'` also
6269
+ * Why a menu requested close. Enumerates the close reasons without the
6270
+ * focus-routing decision baked in. `'programmatic'` also
5485
6271
  * covers the user-initiated trigger toggle-close (clicking an open menu's
5486
6272
  * trigger): the toggle path reuses this reason by design rather than
5487
6273
  * exposing a distinct `'trigger'` reason.
@@ -5601,7 +6387,7 @@ interface ForMenuContext {
5601
6387
  /**
5602
6388
  * Clear `data-highlighted` from every item without moving focus. Called by
5603
6389
  * `[forMenuContent]` on `pointerleave` so the hover highlight follows the
5604
- * pointer off the surface (Radix-style hover-follows-pointer).
6390
+ * pointer off the surface (hover-follows-pointer).
5605
6391
  */
5606
6392
  clearItemHighlights(): void;
5607
6393
  /** Returns `true` if focus moved; `false` when no enabled items exist. */
@@ -5959,7 +6745,7 @@ interface ForMenuDefaults {
5959
6745
  subMenuPointerGraceDuration: number;
5960
6746
  /**
5961
6747
  * Distance (px) between the sub-trigger and the submenu content along the
5962
- * resolved `side` axis. Mirrors Radix's `sideOffset`. Default `0` — a
6748
+ * resolved `side` axis. Default `0` — a
5963
6749
  * submenu sits flush against its parent item.
5964
6750
  */
5965
6751
  sideOffset: number;
@@ -6033,7 +6819,7 @@ declare class ForDropdownMenu extends MenuOverlayHost implements ForMenuContext
6033
6819
  readonly align: _angular_core.InputSignal<FloatingAlign | undefined>;
6034
6820
  /**
6035
6821
  * Gap (px) between trigger and menu along the main axis. Default `4`.
6036
- * Mirrors Radix's `sideOffset`. The default is read from
6822
+ * The default is read from
6037
6823
  * `provideForDropdownMenuDefaults` for the surrounding scope.
6038
6824
  */
6039
6825
  readonly sideOffset: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -6194,7 +6980,7 @@ declare class ForDropdownMenuTrigger {
6194
6980
  interface ForDropdownMenuDefaults {
6195
6981
  /**
6196
6982
  * Distance (px) between the dropdown trigger and the floating content
6197
- * along the resolved `side` axis. Mirrors Radix's `sideOffset`.
6983
+ * along the resolved `side` axis.
6198
6984
  */
6199
6985
  sideOffset: number;
6200
6986
  /**
@@ -6498,8 +7284,8 @@ declare class ForContextMenuTrigger {
6498
7284
  interface ForContextMenuDefaults {
6499
7285
  /**
6500
7286
  * Distance (px) between the virtual anchor (pointer position) and the
6501
- * floating content along the resolved `side` axis. Mirrors Radix's
6502
- * `sideOffset`. Defaults to `0` since context menus open at the cursor.
7287
+ * floating content along the resolved `side` axis. Defaults to `0`
7288
+ * since context menus open at the cursor.
6503
7289
  */
6504
7290
  sideOffset: number;
6505
7291
  /**
@@ -6598,7 +7384,7 @@ interface ForMenubarContext extends MenuSiblingNavigator {
6598
7384
  /**
6599
7385
  * Hover-after-open. When some menu is open and pointer enters a sibling
6600
7386
  * trigger, that sibling's menu opens immediately. No-op while no menu
6601
- * is open (per Radix: first open requires keyboard / click).
7387
+ * is open (first open requires keyboard / click).
6602
7388
  */
6603
7389
  pointerEnterTrigger(value: string): void;
6604
7390
  /** Typeahead at the trigger row matches sibling trigger labels. */
@@ -6641,8 +7427,11 @@ interface MenubarMenuHost extends MenuSiblingNavigator {
6641
7427
  * context shape transparently covers whichever trigger's menu is mounted.
6642
7428
  *
6643
7429
  * Item navigation reuses the shared `MenuItemList` (the same item-collection /
6644
- * typeahead / navigate / focus mechanics that back `MenuOverlay`), so this only
6645
- * has to cover the parts the single-owner overlay can't.
7430
+ * typeahead / navigate / focus mechanics that back `MenuOverlay`), and the
7431
+ * initial-focus / highlight-consume protocol and the close-reason record reuse
7432
+ * the shared `InitialFocusState` / `CloseReasonState` micro-helpers (also
7433
+ * composed by `MenuOverlay`), so this only has to cover the parts the
7434
+ * single-owner overlay can't — the `activeTrigger`-derived multiplexing.
6646
7435
  *
6647
7436
  * A bar-level menu has no per-trigger dismiss / auto-focus outputs and no
6648
7437
  * per-context trigger registration (triggers register with the bar directly),
@@ -6802,6 +7591,16 @@ declare class ForMenubar implements ForMenubarContext {
6802
7591
  * as its return-focus `trigger`.
6803
7592
  */
6804
7593
  readonly lastTriggerHost: _angular_core.Signal<HTMLElement | null>;
7594
+ /**
7595
+ * Roving-tabindex tracker shared by every menubar trigger, mirroring
7596
+ * `ForToolbar` / `ForTabs`. Triggers promote themselves to active on
7597
+ * `(focus)` (via {@link setFocusedTrigger}) and read `active()` through
7598
+ * {@link tabindexFor}, so re-entry restores the last focused trigger. Before
7599
+ * any focus — and on every close — `active()` is `null`/stale and the tab
7600
+ * stop falls back to the first enabled trigger. The active pointer is
7601
+ * self-healing (a detached / disabled trigger no longer owns the stop).
7602
+ */
7603
+ readonly roving: RovingTabindex;
6805
7604
  constructor();
6806
7605
  /**
6807
7606
  * Single `ForMenuContext` provided to descendant `[forMenuContent]` and
@@ -6875,7 +7674,7 @@ declare class ForMenubar implements ForMenubarContext {
6875
7674
  * starts with the buffered string.
6876
7675
  *
6877
7676
  * While some other trigger's menu is open, hovering this trigger opens it
6878
- * immediately (no delay) — Radix-style "first open is intentional, subsequent
7677
+ * immediately (no delay) — "first open is intentional, subsequent
6879
7678
  * are hover". Keyboard focus alone never opens a menu.
6880
7679
  *
6881
7680
  * Pointer-driven opens (click — detected by the `pointerdown` preceding it —
@@ -7304,7 +8103,7 @@ declare class ForSelect<T = string> extends FormUiControlBase implements FormVal
7304
8103
  readonly align: _angular_core.InputSignal<FloatingAlign | undefined>;
7305
8104
  /**
7306
8105
  * Gap (px) between trigger and listbox along the main axis. Default `4`.
7307
- * Mirrors Radix's `sideOffset`. The default is read from
8106
+ * The default is read from
7308
8107
  * `provideForSelectDefaults` for the surrounding scope.
7309
8108
  */
7310
8109
  readonly sideOffset: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -7403,11 +8202,11 @@ declare class ForSelect<T = string> extends FormUiControlBase implements FormVal
7403
8202
  * focus return, and its dismissal exemption regardless of where the listbox
7404
8203
  * paints.
7405
8204
  */
7406
- readonly anchor: _angular_core.Signal<ReferenceElement | null>;
8205
+ readonly anchor: _angular_core.Signal<_floating_ui_dom.ReferenceElement | null>;
7407
8206
  readonly content: _angular_core.Signal<HTMLElement | null>;
8207
+ readonly options: _angular_core.Signal<readonly ForSelectOptionHandle<T>[]>;
7408
8208
  /** The active option's `id` in the virtualized path, `null` in the default path. */
7409
8209
  readonly activeDescendantId: _angular_core.Signal<string | null>;
7410
- readonly options: _angular_core.Signal<readonly ForSelectOptionHandle<T>[]>;
7411
8210
  /**
7412
8211
  * Trimmed display labels of the selected values, in selection order. Pure
7413
8212
  * derivation: when `[itemToLabel]` is supplied it is authoritative; otherwise
@@ -7606,7 +8405,7 @@ declare class ForSelectValue {
7606
8405
  * - **non-modal (default)** — `injectOverlayShell` anchors the listbox to the
7607
8406
  * trigger and branches on `[forSelect].position`:
7608
8407
  * - `'popper'` (default) — standard `injectFloating` path with full
7609
- * Radix-style anchored placement (`side`, `align`, `sideOffset`,
8408
+ * anchored placement (`side`, `align`, `sideOffset`,
7610
8409
  * `alignOffset`, `flip`, `shift`, `arrow`, `hideWhenDetached`).
7611
8410
  * - `'item-aligned'` — `injectItemAlignedPositioner` overlays the listbox so
7612
8411
  * the selected option's center aligns with the trigger's center. The
@@ -7783,7 +8582,7 @@ declare class ForSelectSeparator {
7783
8582
  interface ForSelectDefaults {
7784
8583
  /**
7785
8584
  * Distance (px) between the select trigger and the floating content
7786
- * along the resolved `side` axis. Mirrors Radix's `sideOffset`.
8585
+ * along the resolved `side` axis.
7787
8586
  */
7788
8587
  sideOffset: number;
7789
8588
  /**
@@ -8037,6 +8836,15 @@ interface ForComboboxContext<T = unknown> {
8037
8836
  isSelected(value: T): boolean;
8038
8837
  /** True when `id` is the activedescendant. */
8039
8838
  isActive(id: string): boolean;
8839
+ /**
8840
+ * Whether a pointer-suppression window is currently open. Opened whenever the
8841
+ * directive scrolls the active option into view during keyboard navigation,
8842
+ * so a synthetic `pointermove` fired because the scroll slid a different
8843
+ * option under a stationary cursor does not hijack the activedescendant.
8844
+ * Options consult this from their hover handler and skip the move while it
8845
+ * returns `true`.
8846
+ */
8847
+ isPointerSuppressed(): boolean;
8040
8848
  /**
8041
8849
  * Activate by handle. Single mode replaces + closes + commits label. Multi
8042
8850
  * mode toggles in/out + stays open + (when `commitOnSelect`) clears the
@@ -8224,9 +9032,8 @@ declare class ForCombobox<T = string> extends FormUiControlBase implements FormV
8224
9032
  /**
8225
9033
  * Auto-highlight the first enabled option whenever the listbox is open
8226
9034
  * and no activedescendant is set (e.g. after the consumer's filter
8227
- * removed the previously-active option). On by default — matches the
8228
- * Headless UI / Material Autocomplete behavior. Set `false` for
8229
- * Radix-style "user must arrow before anything is highlighted".
9035
+ * removed the previously-active option). On by default. Set `false` for
9036
+ * "user must arrow before anything is highlighted" behavior.
8230
9037
  */
8231
9038
  readonly autoHighlight: _angular_core.InputSignalWithTransform<boolean, unknown>;
8232
9039
  /**
@@ -8394,6 +9201,7 @@ declare class ForCombobox<T = string> extends FormUiControlBase implements FormV
8394
9201
  unregisterChip(handle: ForComboboxChipHandle<T>): void;
8395
9202
  isSelected(v: T): boolean;
8396
9203
  isActive(id: string): boolean;
9204
+ isPointerSuppressed(): boolean;
8397
9205
  activate(handle: ForComboboxOptionHandle<T>): void;
8398
9206
  removeValue(v: T): void;
8399
9207
  activateActive(): boolean;
@@ -8475,7 +9283,7 @@ declare class ForComboboxAnchor {
8475
9283
  /**
8476
9284
  * Button that opens the listbox and keeps showing the committed selection
8477
9285
  * (label + icon) while the search input lives **inside** the panel — the
8478
- * "combobox with trigger" / picker anatomy (shadcn / cmdk / Base UI). Apply on
9286
+ * "combobox with trigger" / picker anatomy. Apply on
8479
9287
  * a real `<button>` so Space / Enter dispatch native click events that toggle
8480
9288
  * via `(click)`.
8481
9289
  *
@@ -8538,6 +9346,7 @@ declare class ForComboboxTrigger<T = unknown> {
8538
9346
  * Keyboard:
8539
9347
  * - **ArrowDown / ArrowUp** — open + move activedescendant.
8540
9348
  * - **Home / End** (when open) — first / last enabled option.
9349
+ * - **PageUp / PageDown** (when open) — first / last enabled option.
8541
9350
  * - **Enter** (when open) — activate the activedescendant; no-op otherwise.
8542
9351
  * - **Escape** (when open) — close (focus stays in input). On the
8543
9352
  * open→closed transition the input value is re-synced to `query()` even
@@ -8685,7 +9494,7 @@ declare const FOR_COMBOBOX_OPTION: InjectionToken<ForComboboxOption<string>>;
8685
9494
  * `data-state="checked" | "unchecked"` always reflects membership in
8686
9495
  * `value()` regardless of mode, so consumers can paint a checkmark with
8687
9496
  * pure CSS in either mode. `data-highlighted` marks the option that is
8688
- * the current activedescendant — Radix-aligned and shared across the
9497
+ * the current activedescendant — shared across the
8689
9498
  * library's roving / activedescendant primitives.
8690
9499
  *
8691
9500
  * Hovering an option also makes it the activedescendant, mirroring native
@@ -9289,8 +10098,8 @@ declare class ForSlider extends FormUiControlBase implements Omit<FormValueContr
9289
10098
  /**
9290
10099
  * Emitted at the end of a value-changing interaction — pointerup /
9291
10100
  * pointercancel after a drag, or keyup after one or more keyboard
9292
- * adjustments — with the final value array. Mirrors Radix / Base UI
9293
- * `onValueCommit`. Use it to defer expensive work (network calls,
10101
+ * adjustments — with the final value array. Use it to defer expensive work
10102
+ * (network calls,
9294
10103
  * history entries) to the trailing edge of the interaction instead of
9295
10104
  * running it per step. Stays silent when nothing changed (e.g. press +
9296
10105
  * release without movement, or a non-navigation key on a focused thumb).
@@ -9491,8 +10300,8 @@ declare const FOR_SLIDER_HOST_DIRECTIVE_OUTPUTS: readonly ["valueChange", "value
9491
10300
  /**
9492
10301
  * Pointer-based swipe-to-dismiss helper.
9493
10302
  *
9494
- * Used by `ForToast` (and any future primitive that wants Radix-style
9495
- * swipe semantics: a horizontal/vertical drag that, when released past
10303
+ * Used by `ForToast` (and any future primitive that wants swipe-to-dismiss
10304
+ * semantics: a horizontal/vertical drag that, when released past
9496
10305
  * the configured threshold, triggers a dismissal).
9497
10306
  *
9498
10307
  * The helper keeps no Angular DI surface — it's a plain function that
@@ -9634,6 +10443,27 @@ interface ForToastConfig<D = unknown> {
9634
10443
  * {@link class} and with the directive's own host attributes.
9635
10444
  */
9636
10445
  classList?: string | readonly string[];
10446
+ /**
10447
+ * CSS class applied via `animate.enter` to the rendered toast root, so it
10448
+ * plays an enter animation on mount. Optional and symmetric with
10449
+ * {@link animateLeave}: a plain CSS `@keyframes` / `animation` declared on
10450
+ * `[forToast]` already plays on mount without this, so this is only needed
10451
+ * for class-applied entrances. When unset, falls through to the
10452
+ * viewport-level `[animateEnter]`.
10453
+ */
10454
+ animateEnter?: string;
10455
+ /**
10456
+ * CSS class applied via `animate.leave` to the rendered toast root, so it
10457
+ * plays an exit animation before the toast leaves the DOM on dismiss. When
10458
+ * unset, falls through to the viewport-level `[animateLeave]`.
10459
+ *
10460
+ * This is the only way to express a toast exit animation on the programmatic
10461
+ * path: the viewport renders the toast inside its own `@for`, and a pure-CSS
10462
+ * exit cannot defer the unmount — Angular needs `animate.leave` on the node to
10463
+ * keep it mounted until the animation settles. Leaving it unset keeps the
10464
+ * existing synchronous unmount on dismiss.
10465
+ */
10466
+ animateLeave?: string;
9637
10467
  /** Arbitrary payload passed to `template` context as `data`. */
9638
10468
  data?: D;
9639
10469
  /** Override the default rendering with a `TemplateRef`. */
@@ -9767,7 +10597,7 @@ declare class ForToast implements ForToastContext {
9767
10597
  readonly swipeDirection: _angular_core.InputSignal<ForToastSwipeDirection>;
9768
10598
  /**
9769
10599
  * Pixels of pointer travel along the active swipe direction needed
9770
- * to commit a dismissal. Defaults to `50` — matches Radix.
10600
+ * to commit a dismissal. Defaults to `50`.
9771
10601
  */
9772
10602
  readonly swipeThreshold: _angular_core.InputSignalWithTransform<number, unknown>;
9773
10603
  /** Emitted when the toast wants to be unmounted. The consumer reacts by removing it from the rendered list. */
@@ -9780,15 +10610,15 @@ declare class ForToast implements ForToastContext {
9780
10610
  readonly swipeEnd: _angular_core.OutputEmitterRef<SwipeEventDetail>;
9781
10611
  /** Fired on pointer-up before the threshold, or on `pointercancel`. */
9782
10612
  readonly swipeCancel: _angular_core.OutputEmitterRef<SwipeEventDetail>;
9783
- readonly paused: _angular_core.Signal<boolean>;
9784
- protected readonly swipeState: _angular_core.Signal<SwipeState | null>;
9785
- protected readonly swipeActiveDirection: _angular_core.Signal<SwipeDirection | null>;
9786
- protected readonly swipeMovementX: _angular_core.Signal<number>;
9787
- protected readonly swipeMovementY: _angular_core.Signal<number>;
9788
- readonly labelledBy: _angular_core.Signal<string | null>;
9789
- readonly describedBy: _angular_core.Signal<string | null>;
9790
- protected readonly computedRole: _angular_core.Signal<"alert" | "status">;
9791
- protected readonly ariaLive: _angular_core.Signal<"off" | "polite" | "assertive">;
10613
+ readonly paused: Signal<boolean>;
10614
+ protected readonly swipeState: Signal<SwipeState | null>;
10615
+ protected readonly swipeActiveDirection: Signal<SwipeDirection | null>;
10616
+ protected readonly swipeMovementX: Signal<number>;
10617
+ protected readonly swipeMovementY: Signal<number>;
10618
+ readonly labelledBy: Signal<string | null>;
10619
+ readonly describedBy: Signal<string | null>;
10620
+ protected readonly computedRole: Signal<"alert" | "status">;
10621
+ protected readonly ariaLive: Signal<"off" | "polite" | "assertive">;
9792
10622
  constructor();
9793
10623
  registerLabel(handle: ForToastTextHandle): void;
9794
10624
  unregisterLabel(handle: ForToastTextHandle): void;
@@ -9832,6 +10662,12 @@ declare class ForToast implements ForToastContext {
9832
10662
  * Per-toast classes: a config's `class` / `classList` is applied to the
9833
10663
  * rendered toast root, merged with the directive's own host attributes.
9834
10664
  *
10665
+ * Enter / exit animations: a toast renders inside this viewport's `@for`, so a
10666
+ * `[animate.leave]` on the row defers the unmount natively — the toast stays
10667
+ * mounted until its exit animation settles. Supply the class per-toast with
10668
+ * `show({ animateLeave })` or set a viewport-wide default with `[animateLeave]`
10669
+ * (per-toast wins); `[animateEnter]` mirrors it for class-applied entrances.
10670
+ *
9835
10671
  * Hotkey: pressing the configured `hotkey` (default `F6`) anywhere in the
9836
10672
  * document focuses the first toast. Override per-viewport with `[hotkey]`
9837
10673
  * or globally with `provideForToastDefaults({ hotkey: '…' })`. The listener
@@ -9892,6 +10728,21 @@ declare class ForToastViewport {
9892
10728
  * that doesn't override `swipeThreshold` in its own config.
9893
10729
  */
9894
10730
  readonly swipeThreshold: _angular_core.InputSignalWithTransform<number, unknown>;
10731
+ /**
10732
+ * Default `animate.enter` class applied to every programmatic toast that
10733
+ * doesn't set `animateEnter` in its own config. Empty (default) plays no
10734
+ * class-applied enter animation — a plain CSS `@keyframes` on `[forToast]`
10735
+ * already runs on mount without it.
10736
+ */
10737
+ readonly animateEnter: _angular_core.InputSignal<string>;
10738
+ /**
10739
+ * Default `animate.leave` class applied to every programmatic toast that
10740
+ * doesn't set `animateLeave` in its own config. Empty (default) unmounts the
10741
+ * toast synchronously on dismiss; set it (or per-toast `animateLeave`) to
10742
+ * keep the toast mounted until its exit animation settles before it leaves
10743
+ * the DOM.
10744
+ */
10745
+ readonly animateLeave: _angular_core.InputSignal<string>;
9895
10746
  protected readonly defaultDuration: Signal<number>;
9896
10747
  /**
9897
10748
  * Resolved `maxVisible` limit: the per-viewport `[maxVisible]` when set,
@@ -9908,8 +10759,20 @@ declare class ForToastViewport {
9908
10759
  * attributes untouched.
9909
10760
  */
9910
10761
  protected toastClass(toast: ForToastInstance): string;
10762
+ /**
10763
+ * `animate.enter` class for a toast row: its per-toast `animateEnter` config
10764
+ * when set, otherwise the viewport-level `[animateEnter]`. Empty when neither
10765
+ * is set.
10766
+ */
10767
+ protected toastAnimateEnter(toast: ForToastInstance): string;
10768
+ /**
10769
+ * `animate.leave` class for a toast row: its per-toast `animateLeave` config
10770
+ * when set, otherwise the viewport-level `[animateLeave]`. Empty when neither
10771
+ * is set, which keeps the toast's unmount synchronous on dismiss.
10772
+ */
10773
+ protected toastAnimateLeave(toast: ForToastInstance): string;
9911
10774
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForToastViewport, never>;
9912
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ForToastViewport, "for-toast-viewport, [forToastViewport]", ["forToastViewport"], { "label": { "alias": "label"; "required": false; "isSignal": true; }; "region": { "alias": "region"; "required": false; "isSignal": true; }; "hotkey": { "alias": "hotkey"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; "swipeDirection": { "alias": "swipeDirection"; "required": false; "isSignal": true; }; "swipeThreshold": { "alias": "swipeThreshold"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10775
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ForToastViewport, "for-toast-viewport, [forToastViewport]", ["forToastViewport"], { "label": { "alias": "label"; "required": false; "isSignal": true; }; "region": { "alias": "region"; "required": false; "isSignal": true; }; "hotkey": { "alias": "hotkey"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; "swipeDirection": { "alias": "swipeDirection"; "required": false; "isSignal": true; }; "swipeThreshold": { "alias": "swipeThreshold"; "required": false; "isSignal": true; }; "animateEnter": { "alias": "animateEnter"; "required": false; "isSignal": true; }; "animateLeave": { "alias": "animateLeave"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9913
10776
  }
9914
10777
 
9915
10778
  /**
@@ -10028,7 +10891,7 @@ declare class ForToastRef<R = unknown, D = unknown> {
10028
10891
  }
10029
10892
 
10030
10893
  /**
10031
- * Programmatic toast opener — the headless equivalent of CDK's snackbar.
10894
+ * Programmatic toast opener — show a transient notification from TypeScript.
10032
10895
  * Inject anywhere, call `show({ title, ... })` and get a `ForToastRef`
10033
10896
  * back. Toasts render through `<for-toast-viewport>`, which the consumer
10034
10897
  * mounts once near the root of their app.
@@ -10995,21 +11858,10 @@ declare function provideForToolbarDefaults(defaults?: Partial<ForToolbarDefaults
10995
11858
 
10996
11859
  /** Why an open / close was scheduled. */
10997
11860
  type HoverCardScheduleReason = 'hover-trigger' | 'hover-content' | 'focus' | 'escape';
10998
- interface ForHoverCardContext {
11861
+ interface ForHoverCardContext extends AnchoredPositioningContext {
10999
11862
  readonly open: Signal<boolean>;
11000
11863
  readonly disabled: Signal<boolean>;
11001
- readonly side: Signal<FloatingSide>;
11002
- readonly align: Signal<FloatingAlign>;
11003
- readonly sideOffset: Signal<number>;
11004
- readonly alignOffset: Signal<number>;
11005
- readonly avoidCollisions: Signal<boolean>;
11006
- readonly collisionPadding: Signal<number>;
11007
- readonly arrowPadding: Signal<number>;
11008
- readonly sticky: Signal<'partial' | 'always' | false>;
11009
- readonly hideWhenDetached: Signal<boolean>;
11010
- readonly clipUntilPositioned: Signal<boolean>;
11011
11864
  readonly trigger: Signal<HTMLElement | null>;
11012
- readonly arrow: Signal<HTMLElement | null>;
11013
11865
  readonly content: Signal<HTMLElement | null>;
11014
11866
  registerTrigger(el: HTMLElement): void;
11015
11867
  unregisterTrigger(el: HTMLElement): void;
@@ -11095,7 +11947,7 @@ declare class ForHoverCard implements ForHoverCardContext {
11095
11947
  readonly align: _angular_core.Signal<FloatingAlign>;
11096
11948
  /**
11097
11949
  * Per-card override for the gap (px) between trigger and card along the
11098
- * main axis. Mirrors Radix's `sideOffset`. When `undefined` (default),
11950
+ * main axis. When `undefined` (default),
11099
11951
  * falls back to `ForHoverCardDefaults.sideOffset` from the surrounding
11100
11952
  * `provideForHoverCardDefaults` scope (`8` unless configured).
11101
11953
  *
@@ -11185,7 +12037,7 @@ declare class ForHoverCard implements ForHoverCardContext {
11185
12037
  *
11186
12038
  * **Intentional ARIA exception.** The trigger exposes no `aria-controls`,
11187
12039
  * `aria-expanded`, or `aria-describedby`, and `[forHoverCardContent]` carries
11188
- * no role. This is deliberate, mirroring Radix: the trigger must already be
12040
+ * no role. This is deliberate: the trigger must already be
11189
12041
  * self-meaningful (a link or button that conveys the underlying action on its
11190
12042
  * own — the card adds preview, not meaning), and the card is non-essential
11191
12043
  * supplementary content that is hover/focus-revealed and not part of the
@@ -11244,7 +12096,7 @@ declare class ForHoverCardTrigger {
11244
12096
  *
11245
12097
  * **Intentional ARIA exception.** The content carries no role (only
11246
12098
  * `data-state` for styling) and the trigger exposes no ARIA linkage — the
11247
- * card is non-essential supplementary content, mirroring Radix. See
12099
+ * card is non-essential supplementary content. See
11248
12100
  * `ForHoverCardTrigger` for the full rationale.
11249
12101
  */
11250
12102
  declare class ForHoverCardContent {
@@ -11296,7 +12148,7 @@ interface ForHoverCardDefaults {
11296
12148
  align: FloatingAlign;
11297
12149
  /**
11298
12150
  * Gap (px) between trigger and card along the main axis for cards that
11299
- * don't override `sideOffset` locally. Mirrors Radix's `sideOffset`.
12151
+ * don't override `sideOffset` locally.
11300
12152
  * Library fallback `8`.
11301
12153
  */
11302
12154
  sideOffset: number;
@@ -11333,8 +12185,8 @@ interface ForNavigationMenuContentHandle extends CollectionHandle {
11333
12185
  readonly id: Signal<string>;
11334
12186
  }
11335
12187
  /**
11336
- * Per-viewport handle. Only one viewport is expected per menu (Radix
11337
- * mirror). The host element is the destination for re-parented active
12188
+ * Per-viewport handle. Only one viewport is expected per menu. The host
12189
+ * element is the destination for re-parented active
11338
12190
  * content panels, and the viewport owns their ordering.
11339
12191
  */
11340
12192
  interface ForNavigationMenuViewportHandle {
@@ -11433,7 +12285,7 @@ declare const FOR_NAVIGATION_MENU_ITEM_CONTEXT: InjectionToken<ForNavigationMenu
11433
12285
  * item's id, or `''` when nothing is open). The `model()` change emitter
11434
12286
  * fires only on internal transitions, never on consumer writes.
11435
12287
  *
11436
- * Submenús anidados (Radix-style `Sub`) están fuera de scope para v1.
12288
+ * Submenús anidados están fuera de scope para v1.
11437
12289
  *
11438
12290
  * @example
11439
12291
  * ```html
@@ -11544,7 +12396,7 @@ declare class ForNavigationMenu implements ForNavigationMenuContext {
11544
12396
  /**
11545
12397
  * `data-motion` direction for the content with the given `value`.
11546
12398
  *
11547
- * Mirrors Radix's `NavigationMenu.Content` convention: when the user
12399
+ * Sets the slide direction by index comparison: when the user
11548
12400
  * moves rightward from A (index 0) to B (index 2), the entering panel
11549
12401
  * slides in from the end side (`from-end`) and the leaving panel slides
11550
12402
  * out to the start side (`to-start`) — both shift in the same logical
@@ -11731,7 +12583,7 @@ declare class ForNavigationMenuIndicator {
11731
12583
  * Optional shared surface for mega-menu style navigation. When present,
11732
12584
  * `[forNavigationMenuContent]` re-parents itself into this host on mount,
11733
12585
  * so all active content panels live inside a single visual container that
11734
- * can animate width/height between trigger groups (Radix `Viewport`).
12586
+ * can animate width/height between trigger groups.
11735
12587
  *
11736
12588
  * The viewport exposes the active content's natural size as CSS custom
11737
12589
  * properties:
@@ -11889,7 +12741,7 @@ declare class ForScrollArea implements ForScrollAreaContext {
11889
12741
  * self-hides when the content fits.
11890
12742
  * - `always`: the scrollbar (and corner) stay mounted and
11891
12743
  * `data-state="visible"` regardless of overflow — a stable, always-painted
11892
- * track, matching Radix. When the axis does not overflow the thumb fills
12744
+ * track. When the axis does not overflow the thumb fills
11893
12745
  * the full track and dragging is a no-op. The library is headless and does
11894
12746
  * not own layout, so to actually *reserve* the gutter (no content shift
11895
12747
  * when crossing the overflow boundary) the consumer lays the scrollbar out
@@ -11984,7 +12836,7 @@ interface ElementBox {
11984
12836
  * The element is fully removed (`hidden`) when the corresponding axis has
11985
12837
  * no overflow *and* `type` is not `'always'` — there is no scrollbar to
11986
12838
  * render. Under `type="always"` the track stays painted regardless of
11987
- * overflow (Radix parity), so the consumer's reserved gutter is never empty.
12839
+ * overflow, so the consumer's reserved gutter is never empty.
11988
12840
  * Visibility is enforced with an inline `display: none` (which beats any
11989
12841
  * author `display` rule a consumer applies via a class) in addition to the
11990
12842
  * `hidden` attribute that removes it from the a11y tree.
@@ -12007,7 +12859,7 @@ declare class ForScrollAreaScrollbar {
12007
12859
  readonly hasOverflow: _angular_core.Signal<boolean>;
12008
12860
  /**
12009
12861
  * Whether the track is rendered at all. `'always'` keeps it painted
12010
- * unconditionally (a stable, always-present track — Radix parity); every
12862
+ * unconditionally (a stable, always-present track); every
12011
12863
  * other `type` paints only the axis that actually overflows. An in-flight
12012
12864
  * thumb drag also pins it painted so the gesture is never aborted by the
12013
12865
  * track self-removing. Gates both the `hidden` attribute and the inline
@@ -12405,9 +13257,9 @@ declare class ForTree implements ForTreeContext, ForTreeContainerContext {
12405
13257
  checkState(value: string): 'true' | 'false' | 'mixed';
12406
13258
  setExpanded(value: string, open: boolean): void;
12407
13259
  select(value: string): void;
12408
- navigate(currentItem: HTMLElement, action: ListNavigationAction): void;
12409
- expandOrEnter(currentItem: HTMLElement): void;
12410
- collapseOrLeave(currentItem: HTMLElement): void;
13260
+ navigate(_currentItem: HTMLElement, action: ListNavigationAction): void;
13261
+ expandOrEnter(_currentItem: HTMLElement): void;
13262
+ collapseOrLeave(_currentItem: HTMLElement): void;
12411
13263
  expandSiblings(currentItem: HTMLElement): void;
12412
13264
  extendByArrow(currentItem: HTMLElement, action: 'next' | 'prev'): void;
12413
13265
  selectRangeToFocused(currentItem: HTMLElement): void;
@@ -12480,7 +13332,7 @@ declare class ForTreeItem implements ForTreeItemContext {
12480
13332
  * when cascade is on and only some descendants are checked. Drives the
12481
13333
  * checkbox anatomy; meaningful only in `selectionMode="checkbox"`.
12482
13334
  */
12483
- readonly checkState: _angular_core.Signal<"true" | "false" | "mixed">;
13335
+ readonly checkState: _angular_core.Signal<"mixed" | "true" | "false">;
12484
13336
  /**
12485
13337
  * True when this node is the current keyboard-focused / active candidate.
12486
13338
  * In the roving-tabindex path tracks DOM focus; in the virtualized
@@ -12489,6 +13341,12 @@ declare class ForTreeItem implements ForTreeItemContext {
12489
13341
  */
12490
13342
  readonly highlighted: _angular_core.Signal<boolean>;
12491
13343
  readonly effectiveDisabled: _angular_core.Signal<boolean>;
13344
+ /**
13345
+ * Drop-indicator hook for `[forTreeNodeDrag]`: `'before'` / `'after'` when a live drag would
13346
+ * land adjacent to this row, `null` otherwise (and always `null` without a drag coordinator).
13347
+ * Reflected as `data-drop-position`.
13348
+ */
13349
+ protected readonly _dropPosition: _angular_core.Signal<"before" | "after" | null>;
12492
13350
  readonly level: _angular_core.Signal<number>;
12493
13351
  readonly posinset: _angular_core.Signal<number>;
12494
13352
  readonly setsize: _angular_core.Signal<number>;
@@ -12662,12 +13520,25 @@ interface ForTreeDragDropEvent {
12662
13520
  readonly currentIndex: number;
12663
13521
  }
12664
13522
 
13523
+ /**
13524
+ * Where the lifted node will land, for rendering an insertion indicator. `null` when idle.
13525
+ */
13526
+ interface ForTreeDropIndicator {
13527
+ /** The visible row the indicator anchors to (the node value). */
13528
+ readonly anchor: string;
13529
+ /** Whether the line sits just before or just after the anchor row in DOM order. */
13530
+ readonly position: 'before' | 'after';
13531
+ /** Resolved 1-based depth of the drop (mirror of `--for-tree-drop-level`). */
13532
+ readonly level: number;
13533
+ }
12665
13534
  /** The coordination contract the handle uses to register with the coordinator. */
12666
13535
  interface ForTreeNodeDragContext {
12667
13536
  /** Register a drag handle element for the item that contains it. */
12668
13537
  registerHandle(el: HTMLElement): void;
12669
13538
  /** Unregister a previously registered handle element. */
12670
13539
  unregisterHandle(el: HTMLElement): void;
13540
+ /** Resolved drop indicator while a drag is live; `null` when idle. */
13541
+ readonly dropIndicator: Signal<ForTreeDropIndicator | null>;
12671
13542
  }
12672
13543
  /** InjectionToken for the `[forTreeNodeDrag]` coordinator. */
12673
13544
  declare const FOR_TREE_NODE_DRAG_CONTEXT: InjectionToken<ForTreeNodeDragContext>;
@@ -12698,6 +13569,8 @@ declare class ForTreeNodeDrag implements ForTreeNodeDragContext {
12698
13569
  protected readonly _dragging: _angular_core.WritableSignal<boolean>;
12699
13570
  protected readonly _dropTargetValid: _angular_core.WritableSignal<boolean>;
12700
13571
  protected readonly _dropLevel: _angular_core.WritableSignal<number | null>;
13572
+ /** Resolved drop indicator while a drag is live; `null` when idle. */
13573
+ readonly dropIndicator: Signal<ForTreeDropIndicator | null>;
12701
13574
  constructor();
12702
13575
  registerHandle(el: HTMLElement): void;
12703
13576
  unregisterHandle(el: HTMLElement): void;
@@ -13101,9 +13974,9 @@ declare const OTP_REGEXP_ONLY_CHARS: RegExp;
13101
13974
  declare const OTP_REGEXP_ONLY_DIGITS_AND_CHARS: RegExp;
13102
13975
 
13103
13976
  /**
13104
- * Headless OTP / PIN input following the **single-input** model (shadcn
13105
- * `input-otp` / Spartan `BrnInputOtp`): one real `<input maxlength=N>` carries
13106
- * the whole code as a `string`, and the `[forOtpInputSlot]` pieces are a pure
13977
+ * Headless OTP / PIN input following the **single-input** model: one real
13978
+ * `<input maxlength=N>` carries the whole code as a `string`, and the
13979
+ * `[forOtpInputSlot]` pieces are a pure
13107
13980
  * styling surface painted over it. There is **no** WAI-ARIA APG pattern for
13108
13981
  * OTP; this gives the cleanest screen-reader experience (one ordinary text
13109
13982
  * field, not "edit text, 1 of 6" announced N times), native mobile SMS autofill
@@ -13117,9 +13990,12 @@ declare const OTP_REGEXP_ONLY_DIGITS_AND_CHARS: RegExp;
13117
13990
  * (label / description / error) with no extra markup.
13118
13991
  *
13119
13992
  * Because the focusable, submittable control is the injected `<input>` and not
13120
- * the `role="group"` host, `ForOtpInput` wires form-control reflection, the
13121
- * field association, and native `name` submission onto that input itself rather
13122
- * than extending `FormUiControlBase` (whose helpers target the directive host).
13993
+ * the `role="group"` host, `ForOtpInput` redirects `FormUiControlBase`'s
13994
+ * host-targeted helpers onto that input: it overrides `fieldLabelledElement()`
13995
+ * (so the field association lands on the input) and `fieldStateReflectionTarget()`
13996
+ * (so the form-state `data-*` reflect there), and reflects the OTP-specific input
13997
+ * attributes (`maxLength` / `inputmode` / `autocomplete` / `pattern` / `name`)
13998
+ * and ARIA on the input itself.
13123
13999
  *
13124
14000
  * The host gets `data-complete` (while every slot is filled) and `data-disabled`
13125
14001
  * for CSS hooks; the real input carries `data-disabled` / `data-readonly` plus
@@ -13143,7 +14019,7 @@ declare const OTP_REGEXP_ONLY_DIGITS_AND_CHARS: RegExp;
13143
14019
  * </div>
13144
14020
  * ```
13145
14021
  */
13146
- declare class ForOtpInput implements FormValueControl<string>, ForOtpInputContext {
14022
+ declare class ForOtpInput extends FormUiControlBase implements FormValueControl<string>, ForOtpInputContext {
13147
14023
  #private;
13148
14024
  /**
13149
14025
  * The current code. Required by `FormValueControl<string>`. Two-way bindable;
@@ -13170,47 +14046,9 @@ declare class ForOtpInput implements FormValueControl<string>, ForOtpInputContex
13170
14046
  * Accessible name for the group, also reflected as `aria-label` on the
13171
14047
  * injected real `<input>` whenever no field-provided `aria-labelledby`
13172
14048
  * applies (standalone usage, or a `[forField]` without a label). Emits
13173
- * `aria-label` only when truthy; a field label always wins on the input.
13174
- */
13175
- readonly ariaLabel: _angular_core.InputSignal<string | null>;
13176
- /**
13177
- * When true, interaction is ignored and `aria-disabled` / `data-disabled` are
13178
- * reflected. Behavior and ARIA gate off {@link effectiveDisabled}, which also
13179
- * folds in a surrounding disabled `[forFieldset]`.
13180
- */
13181
- readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
13182
- /**
13183
- * The control's own {@link disabled} OR'd with a surrounding disabled
13184
- * `[forFieldset]`. Drives interaction gating and `aria-disabled` /
13185
- * `data-disabled`, so a disabled group disables the OTP input too.
13186
- */
13187
- readonly effectiveDisabled: _angular_core.Signal<boolean>;
13188
- /** When true, interaction is ignored but the control stays focusable; `aria-readonly="true"`. */
13189
- readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
13190
- /** Reflected as `aria-required="true"` when truthy. */
13191
- readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
13192
- /** Reflected as `aria-invalid="true"` and `data-invalid` when truthy. */
13193
- readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
13194
- /** Reflected as `aria-busy="true"` and `data-pending` when truthy. */
13195
- readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
13196
- /** Reflected as `data-dirty` when truthy. */
13197
- readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
13198
- /** When non-empty, reflected as the real input's `name` for native form submission. */
13199
- readonly name: _angular_core.InputSignal<string>;
13200
- /** Validation errors surfaced by Signal Forms. */
13201
- readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
13202
- /**
13203
- * Set to true on blur. Two-way bindable for standalone consumers; under
13204
- * `[formField]` the directive pushes the field's touched state down through
13205
- * this input.
13206
- */
13207
- readonly touched: _angular_core.ModelSignal<boolean>;
13208
- /**
13209
- * Emitted on blur alongside the `touched` flip. `[formField]` listens to
13210
- * this output to mark the field touched — since Signal Forms v22 the
13211
- * `touched` input is write-only from the form's perspective.
14049
+ * `aria-label` only when truthy; a field label always wins on the input.
13212
14050
  */
13213
- readonly touch: _angular_core.OutputEmitterRef<void>;
14051
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
13214
14052
  /** Fires when every slot is filled (by typing or paste). */
13215
14053
  readonly valueComplete: _angular_core.OutputEmitterRef<string>;
13216
14054
  /** Fires when an entered / pasted character is rejected by `type` / `allowedPattern`. */
@@ -13222,6 +14060,19 @@ declare class ForOtpInput implements FormValueControl<string>, ForOtpInputContex
13222
14060
  /** The slot indices, for the consumer's `@for`. */
13223
14061
  readonly slots: _angular_core.Signal<readonly number[]>;
13224
14062
  constructor();
14063
+ /**
14064
+ * The injected real `<input>` is the focusable, submittable control, so the
14065
+ * surrounding `[forField]` associates with it rather than the `role="group"`
14066
+ * host. Returns `null` until the input is created (after hydration), at which
14067
+ * point the field-wiring effect re-targets it. See the Select precedent.
14068
+ */
14069
+ protected fieldLabelledElement(): HTMLElement | null;
14070
+ /**
14071
+ * The four form-state `data-*` booleans reflect onto the injected real
14072
+ * `<input>`, alongside the OTP-specific `data-disabled` / `data-readonly`,
14073
+ * rather than the `role="group"` host. `null` until the input exists.
14074
+ */
14075
+ protected fieldStateReflectionTarget(): HTMLElement | null;
13225
14076
  /** Move focus to the real input. Implements `FormUiControl.focus`. */
13226
14077
  focus(options?: FocusOptions): void;
13227
14078
  /** The character in slot `index` (masked when `mask`), or `null` when empty. */
@@ -13231,12 +14082,12 @@ declare class ForOtpInput implements FormValueControl<string>, ForOtpInputContex
13231
14082
  /** Whether slot `index` should render a fake caret. */
13232
14083
  hasFakeCaret(index: number): boolean;
13233
14084
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForOtpInput, never>;
13234
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForOtpInput, "[forOtpInput]", ["forOtpInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "length": { "alias": "length"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "allowedPattern": { "alias": "allowedPattern"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "oneTimeCode": { "alias": "oneTimeCode"; "required": false; "isSignal": true; }; "pasteTransformer": { "alias": "pasteTransformer"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "touch": "touch"; "valueComplete": "valueComplete"; "valueInvalid": "valueInvalid"; }, never, never, true, never>;
14085
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForOtpInput, "[forOtpInput]", ["forOtpInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "length": { "alias": "length"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "allowedPattern": { "alias": "allowedPattern"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "oneTimeCode": { "alias": "oneTimeCode"; "required": false; "isSignal": true; }; "pasteTransformer": { "alias": "pasteTransformer"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueComplete": "valueComplete"; "valueInvalid": "valueInvalid"; }, never, never, true, never>;
13235
14086
  }
13236
14087
 
13237
14088
  /**
13238
14089
  * One slot of a `[forOtpInput]` — a pure **styling surface** painted over the
13239
- * single real input, mirroring Spartan `BrnInputOtpSlot`. Apply one per index
14090
+ * single real input. Apply one per index
13240
14091
  * inside the `[forOtpInput]` wrapper, passing the 0-based `index`. It renders
13241
14092
  * nothing structural: it exposes the slot's character and active state, and
13242
14093
  * reflects boolean `data-active` / `data-empty` for CSS.
@@ -13318,204 +14169,6 @@ declare const FOR_OTP_INPUT_HOST_DIRECTIVE_INPUTS: readonly ["value", "allowedPa
13318
14169
  */
13319
14170
  declare const FOR_OTP_INPUT_HOST_DIRECTIVE_OUTPUTS: readonly ["valueChange", "touchedChange", "touch", "valueComplete", "valueInvalid"];
13320
14171
 
13321
- /**
13322
- * Pluggable, date-library-agnostic seam for `ForCalendar`. Every internal
13323
- * algorithm (paging, the day matrix, comparison, formatting) goes through a
13324
- * `DateAdapter<D>`, so the primitive never hard-depends on a date library.
13325
- *
13326
- * The library ships two adapters behind {@link FOR_DATE_ADAPTER}:
13327
- *
13328
- * - `provideInternationalizedDateAdapter()` — over `@internationalized/date`'s
13329
- * immutable `CalendarDate`. Recommended for correct date-math and locale-aware
13330
- * formatting; `@internationalized/date` is an optional peer dependency. Both
13331
- * `@internationalized/date` adapters operate on the **Gregorian** calendar
13332
- * today — non-Gregorian calendar systems are deferred to the Temporal adapter
13333
- * track (#354).
13334
- * - `provideNativeDateAdapter()` — over the built-in `Date`. Zero-dependency
13335
- * fallback.
13336
- *
13337
- * A `Temporal.PlainDate` adapter is a planned non-breaking addition once the
13338
- * Temporal API is broadly available across browsers (#354).
13339
- *
13340
- * Implementations must be pure with respect to their date type: every
13341
- * operation returns a value and never mutates its inputs. The `D` produced by
13342
- * mutating operations (`add*`, `createDate`) is a fresh value, which keeps it
13343
- * signal-friendly (reference equality changes on every change).
13344
- *
13345
- * @typeParam D The immutable date representation the adapter operates on.
13346
- */
13347
- interface DateAdapter<D> {
13348
- /**
13349
- * Today's date in the runtime time zone.
13350
- *
13351
- * **SSR / hydration caveat.** The result depends on the runtime time zone, so
13352
- * a server render and a client hydration can disagree by up to a day near
13353
- * midnight — the server may compute a different calendar day than the
13354
- * browser. `ForCalendar` reads this once to mark the `data-today` /
13355
- * `aria-current="date"` cell, so a mismatch surfaces there as a hydration
13356
- * error and a flicker on the highlighted "today" cell.
13357
- *
13358
- * **SSR-safe pattern.** Have the consumer supply a fixed "today" (or pin a
13359
- * time zone) for the server render, or defer the today-highlight to
13360
- * `afterNextRender` so `today()` is only computed client-side. See the
13361
- * calendar README's "SSR / hydration" section.
13362
- */
13363
- today(): D;
13364
- /**
13365
- * Creates a date from its parts.
13366
- *
13367
- * @param year Full year (e.g. `2026`).
13368
- * @param month Month of year, **1-12**.
13369
- * @param day Day of month, **1-31** (constrained to the month's length).
13370
- */
13371
- createDate(year: number, month: number, day: number): D;
13372
- /** The full year of `date` (e.g. `2026`). */
13373
- getYear(date: D): number;
13374
- /** The month of `date`, **1-12**. */
13375
- getMonth(date: D): number;
13376
- /** The day of month of `date`, **1-31**. */
13377
- getDate(date: D): number;
13378
- /** The day of week of `date`, **0-6** where `0` is Sunday and `6` is Saturday. */
13379
- getDayOfWeek(date: D): number;
13380
- /** The number of days in `date`'s month. */
13381
- getDaysInMonth(date: D): number;
13382
- /**
13383
- * The first day of the week as a **0-6** index (`0` = Sunday). Used as the
13384
- * default when `ForCalendar`'s `firstDayOfWeek` input is `null`. Adapters
13385
- * return a locale-independent default (`0`); consumers localise it through
13386
- * the `firstDayOfWeek` input or `provideForCalendarDefaults`.
13387
- */
13388
- getFirstDayOfWeek(): number;
13389
- /** Returns a new date `n` days after `date` (negative goes backwards). */
13390
- addDays(date: D, n: number): D;
13391
- /**
13392
- * Returns a new date `n` months after `date` (negative goes backwards). The
13393
- * day of month is constrained to the target month's length (e.g. Jan 31 + 1
13394
- * month is Feb 28/29, never Mar 3).
13395
- */
13396
- addMonths(date: D, n: number): D;
13397
- /**
13398
- * Returns a new date `n` years after `date` (negative goes backwards). The
13399
- * day of month is constrained (e.g. Feb 29 + 1 year is Feb 28 in a common
13400
- * year).
13401
- */
13402
- addYears(date: D, n: number): D;
13403
- /**
13404
- * Compares two dates by their natural ordering — **the full instant**,
13405
- * including any time component the adapter's `D` carries. Returns a negative
13406
- * number when `a` is before `b`, `0` when they are equal, and a positive
13407
- * number when `a` is after `b`.
13408
- *
13409
- * This is the canonical comparator and the only one an adapter must
13410
- * implement. Time-capable adapters (`Date`, `@internationalized/date`'s
13411
- * `CalendarDateTime`) order by day *and* time; day-only adapters
13412
- * (`CalendarDate`) order by day alone because that is all their `D` carries.
13413
- *
13414
- * **Bounds granularity.** `minDate` / `maxDate` clamping in the date
13415
- * primitives compares the full instant through `compare`, so a date-time
13416
- * `min`/`max` clamps identically on every time-capable adapter (e.g. native
13417
- * `Date` and `CalendarDateTime` produce the same result for the same input).
13418
- * For the *calendar grid*, where availability is day-granular so the boundary
13419
- * day of a date-time `min`/`max` stays selectable, use {@link compareDateOf}
13420
- * (which honours {@link compareDate} when present and otherwise derives a
13421
- * day-only comparison from the y/m/d getters).
13422
- */
13423
- compare(a: D, b: D): number;
13424
- /**
13425
- * Optionally compares two dates by calendar day only, ignoring any time
13426
- * component. Returns a negative number when `a`'s day is before `b`'s, `0`
13427
- * when they fall on the same calendar day, and a positive number when `a`'s
13428
- * day is after `b`'s.
13429
- *
13430
- * Adapters may **omit** this method: {@link compareDateOf} then derives the
13431
- * day-only comparison from the {@link getYear} / {@link getMonth} /
13432
- * {@link getDate} getters, which is correct for any adapter. Implement it only
13433
- * to override that default (e.g. for a non-Gregorian ordering). Day-only
13434
- * adapters whose {@link compare} already ignores time need not implement it.
13435
- */
13436
- compareDate?(a: D, b: D): number;
13437
- /** Whether `a` and `b` fall on the same calendar day. */
13438
- isSameDay(a: D, b: D): boolean;
13439
- /** Whether `date` is a valid date of this adapter's type. */
13440
- isValid(date: D): boolean;
13441
- /**
13442
- * Formats `date` for display using the runtime's default locale.
13443
- *
13444
- * **SSR / hydration caveat.** The result resolves against the runtime's
13445
- * default locale, so a server render and a client hydration can produce
13446
- * different strings when the server and browser locales differ — surfacing as
13447
- * a hydration mismatch on every formatted value (heading, weekday headers,
13448
- * cell labels). The runtime time zone applies too for adapters that format
13449
- * through a wall-clock instant.
13450
- *
13451
- * **SSR-safe pattern.** Pin a locale (or format client-side) for the server
13452
- * render so both environments resolve the same locale. See the calendar
13453
- * README's "SSR / hydration" section.
13454
- *
13455
- * @param options Standard `Intl.DateTimeFormat` options (e.g.
13456
- * `{ month: 'long', year: 'numeric' }` for a calendar heading,
13457
- * `{ weekday: 'short' }` for a column header).
13458
- */
13459
- format(date: D, options: Intl.DateTimeFormatOptions): string;
13460
- /**
13461
- * Whether this adapter's `D` can carry a wall-clock time component (hour /
13462
- * minute / second). Day-only adapters omit the optional time accessors below
13463
- * and return `false` (or omit this method); time-capable adapters implement
13464
- * them and return `true`. `ForTimeField` — and the time granularity of the
13465
- * date primitives — require a time-capable adapter.
13466
- */
13467
- supportsTime?(): boolean;
13468
- /** The hour of `date`, **0-23** (24-hour clock). Time-capable adapters only. */
13469
- getHours?(date: D): number;
13470
- /** The minute of `date`, **0-59**. Time-capable adapters only. */
13471
- getMinutes?(date: D): number;
13472
- /** The second of `date`, **0-59**. Time-capable adapters only. */
13473
- getSeconds?(date: D): number;
13474
- /**
13475
- * Returns a new date with its time set to the given parts, preserving the
13476
- * calendar day. Time-capable adapters only.
13477
- *
13478
- * @param hours Hour of day, **0-23**.
13479
- * @param minutes Minute of hour, **0-59**.
13480
- * @param seconds Second of minute, **0-59**.
13481
- */
13482
- setTime?(date: D, hours: number, minutes: number, seconds: number): D;
13483
- }
13484
- /**
13485
- * A {@link DateAdapter} narrowed to one that implements the optional time
13486
- * accessors. Produced by {@link assertTimeCapable} so time primitives can call
13487
- * `getHours` / `setTime` / etc. without optional-chaining.
13488
- *
13489
- * @typeParam D The adapter's immutable date-time representation.
13490
- */
13491
- type TimeCapableDateAdapter<D> = DateAdapter<D> & Required<Pick<DateAdapter<D>, 'getHours' | 'getMinutes' | 'getSeconds' | 'setTime'>>;
13492
- /**
13493
- * Injection token holding the active {@link DateAdapter}. Provide it with
13494
- * `provideInternationalizedDateAdapter()` or `provideNativeDateAdapter()`.
13495
- * There is no application-wide default — a calendar with no adapter in scope
13496
- * throws a descriptive error.
13497
- */
13498
- declare const FOR_DATE_ADAPTER: InjectionToken<DateAdapter<unknown>>;
13499
- /**
13500
- * Injects the active {@link DateAdapter}, throwing a descriptive,
13501
- * primitive-prefixed error when no adapter has been provided.
13502
- *
13503
- * @param piece Name of the calling directive, used in the error message.
13504
- */
13505
- declare function injectDateAdapter<D>(piece: string): DateAdapter<D>;
13506
- /**
13507
- * Asserts that `adapter` implements the optional time accessors, returning it
13508
- * narrowed to {@link TimeCapableDateAdapter}. Throws a descriptive,
13509
- * primitive-prefixed error when the active adapter is day-only — the
13510
- * zero-dependency `provideNativeDateAdapter()` is time-capable, as is
13511
- * `provideInternationalizedDateTimeAdapter()`, but the day-pure
13512
- * `provideInternationalizedDateAdapter()` (`CalendarDate`) is not.
13513
- *
13514
- * @param adapter The active adapter, typically from {@link injectDateAdapter}.
13515
- * @param piece Name of the calling directive, used in the error message.
13516
- */
13517
- declare function assertTimeCapable<D>(adapter: DateAdapter<D>, piece: string): TimeCapableDateAdapter<D>;
13518
-
13519
14172
  /** The active display mode of a `ForCalendar`. */
13520
14173
  type CalendarView = 'day' | 'month' | 'year';
13521
14174
  /**
@@ -13812,42 +14465,20 @@ declare const FOR_CALENDAR_CONTEXT: InjectionToken<ForCalendarContext<unknown>>;
13812
14465
  * `Shift+PageUp` / `Shift+PageDown` move the focused date, re-paging the grid
13813
14466
  * when crossing a month boundary; `Enter` / `Space` select.
13814
14467
  *
14468
+ * The day / month / year views are each backed by a sub-grid collaborator
14469
+ * ({@link CalendarDayNavigator} / {@link CalendarMonthNavigator} /
14470
+ * {@link CalendarYearNavigator}), and range selection by
14471
+ * {@link CalendarRangeSelection}; the root wires them together and exposes the
14472
+ * `[(value)]` / `[(view)]` / `[(range)]` models.
14473
+ *
13815
14474
  * `ForCalendar` is the grid widget, not a form value — it exposes `[(value)]`
13816
14475
  * as a `model<D | null>` in `selectionMode="single"` (default), and
13817
14476
  * `[(range)]` as a `model<CalendarDateRange<D> | null>` in
13818
14477
  * `selectionMode="range"`. The `FormValueControl<D>` contract arrives with the
13819
- * follow-up `ForDatePicker` / `ForDateField`.
14478
+ * follow-up `ForDatePicker` / `ForDateField`. See the primitive's README for a
14479
+ * complete styleless usage example.
13820
14480
  *
13821
14481
  * @typeParam D The adapter's immutable date type.
13822
- *
13823
- * @example
13824
- * ```html
13825
- * <div forCalendar [(value)]="date">
13826
- * <header>
13827
- * <button forCalendarPrevButton [ariaLabel]="'Previous month'">‹</button>
13828
- * <h2 forCalendarHeading #heading="forCalendarHeading">{{ heading.label() }}</h2>
13829
- * <button forCalendarNextButton [ariaLabel]="'Next month'">›</button>
13830
- * </header>
13831
- * <table forCalendarGrid #grid="forCalendarGrid">
13832
- * <thead forCalendarGridHeader>
13833
- * <tr>
13834
- * @for (day of grid.weekDays(); track day.key) {
13835
- * <th scope="col" [attr.aria-label]="day.long">{{ day.short }}</th>
13836
- * }
13837
- * </tr>
13838
- * </thead>
13839
- * <tbody>
13840
- * @for (week of grid.weeks(); track week.key) {
13841
- * <tr>
13842
- * @for (cell of week.days; track cell.key) {
13843
- * <td forCalendarCell [date]="cell.date">{{ cell.label }}</td>
13844
- * }
13845
- * </tr>
13846
- * }
13847
- * </tbody>
13848
- * </table>
13849
- * </div>
13850
- * ```
13851
14482
  */
13852
14483
  declare class ForCalendar<D> implements ForCalendarContext<D> {
13853
14484
  #private;
@@ -13963,9 +14594,13 @@ declare class ForCalendar<D> implements ForCalendarContext<D> {
13963
14594
  readonly viewTriggerLabel: _angular_core.Signal<string>;
13964
14595
  readonly isPreviousDisabled: _angular_core.Signal<boolean>;
13965
14596
  readonly isNextDisabled: _angular_core.Signal<boolean>;
13966
- readonly weekDays: _angular_core.Signal<readonly CalendarWeekday[]>;
13967
- readonly weeks: _angular_core.Signal<readonly CalendarWeek<D>[]>;
14597
+ /** Weekday column headers for the visible month, starting at `firstDayOfWeek`. */
14598
+ readonly weekDays: _angular_core.Signal<readonly forty_cdk.CalendarWeekday[]>;
14599
+ /** Week rows of the visible month, including outside-month padding days. */
14600
+ readonly weeks: _angular_core.Signal<readonly forty_cdk.CalendarWeek<D>[]>;
14601
+ /** Whether the previous-month button should be disabled (bounded by `min`). */
13968
14602
  readonly isPreviousMonthDisabled: _angular_core.Signal<boolean>;
14603
+ /** Whether the next-month button should be disabled (bounded by `max`). */
13969
14604
  readonly isNextMonthDisabled: _angular_core.Signal<boolean>;
13970
14605
  /**
13971
14606
  * Whether every day of `month` (**1-12**) in the visible year falls outside
@@ -14592,7 +15227,7 @@ declare const FOR_DATE_FIELD_CONTEXT: InjectionToken<SegmentEditorContext>;
14592
15227
  * counterpart to `ForCalendar`. There is no single WAI-ARIA APG pattern for a
14593
15228
  * date field; it is a composition of
14594
15229
  * [Spinbuttons](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/) inside a
14595
- * labelled `role="group"`, exactly as React Aria's `useDateField` models it.
15230
+ * labelled `role="group"`.
14596
15231
  * Each day / month / year part is an independent `role="spinbutton"` segment
14597
15232
  * (`[forDateFieldSegment]`) so entry is unambiguous and locale-correct — no
14598
15233
  * free-text parsing, no `03/04`-is-it-March-4th guesswork.
@@ -14925,12 +15560,26 @@ interface ForDatePickerContext {
14925
15560
  readonly formattedValue: Signal<string | null>;
14926
15561
  /** Placeholder shown by `[forDatePickerValue]` when no date is selected. */
14927
15562
  readonly placeholder: Signal<string>;
14928
- /** Element floating-ui anchors against (the trigger). */
15563
+ /**
15564
+ * Element floating-ui anchors the surface against. Prefers an optional
15565
+ * `[forDatePickerAnchor]` when registered, otherwise falls back to the
15566
+ * trigger. Decoupled from `trigger` so the trigger keeps driving
15567
+ * `aria-controls`, the click toggle, focus return, and its outside-pointer
15568
+ * exemption regardless of where the surface paints.
15569
+ */
14929
15570
  readonly reference: Signal<ReferenceElement | null>;
14930
15571
  /** The trigger button — exempt from outside-pointer checks and the return-focus target. */
14931
15572
  readonly trigger: Signal<HTMLElement | null>;
14932
15573
  registerTrigger(el: HTMLElement): void;
14933
15574
  unregisterTrigger(el: HTMLElement): void;
15575
+ /**
15576
+ * Register / unregister an optional `[forDatePickerAnchor]` positioning
15577
+ * element. At most one anchor per root; a second registration throws.
15578
+ * Reference-based unregister, so an anchor torn down inside `@if` restores
15579
+ * the trigger fallback cleanly.
15580
+ */
15581
+ registerAnchor(el: HTMLElement): void;
15582
+ unregisterAnchor(el: HTMLElement): void;
14934
15583
  /** The mounted `[forDatePickerContent]` element. */
14935
15584
  readonly content: Signal<HTMLElement | null>;
14936
15585
  registerContent(el: HTMLElement): void;
@@ -14983,8 +15632,7 @@ declare const FOR_DATE_PICKER_CONTEXT: InjectionToken<ForDatePickerContext>;
14983
15632
  type DatePickerGranularity = 'day' | 'hour' | 'minute' | 'second';
14984
15633
  /**
14985
15634
  * Headless date picker — the [WAI-ARIA Date Picker Dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepicker-dialog/)
14986
- * reinterpreted idiomatically for modern Angular, the way React Aria's
14987
- * `DatePicker` and Ark UI's `DatePicker` do it: a focusable trigger that opens
15635
+ * reinterpreted idiomatically for modern Angular: a focusable trigger that opens
14988
15636
  * a floating surface wrapping a projected `ForCalendar`.
14989
15637
  *
14990
15638
  * `ForDatePicker` is the root and the form value: it implements
@@ -14994,9 +15642,8 @@ type DatePickerGranularity = 'day' | 'hour' | 'minute' | 'second';
14994
15642
  * state flows root → projected calendar via `[(value)]`.
14995
15643
  *
14996
15644
  * The surface defaults to a **non-modal popover** (anchored to the trigger,
14997
- * dismiss on Escape / outside-pointer, return focus on close), matching React
14998
- * Aria / Ark UI; set `modal` for the trapped / inert / scroll-locked dialog
14999
- * variant. Mount/unmount of the surface is the consumer's job — wrap
15645
+ * dismiss on Escape / outside-pointer, return focus on close); set `modal`
15646
+ * for the trapped / inert / scroll-locked dialog variant. Mount/unmount of the surface is the consumer's job — wrap
15000
15647
  * `[forDatePickerContent]` with `@if (open())`.
15001
15648
  *
15002
15649
  * The projected `ForCalendar` is two-way bound by the consumer (`[(value)]`)
@@ -15198,6 +15845,14 @@ declare class ForDatePicker<D> extends FormUiControlBase implements FormValueCon
15198
15845
  readonly triggerId: _angular_core.WritableSignal<string>;
15199
15846
  readonly contentId: _angular_core.WritableSignal<string>;
15200
15847
  readonly trigger: _angular_core.Signal<HTMLElement | null>;
15848
+ /**
15849
+ * Element floating-ui anchors the surface against. Prefers an optional
15850
+ * `[forDatePickerAnchor]` when registered, otherwise falls back to the
15851
+ * trigger so existing pickers without an anchor keep their behavior.
15852
+ * Decoupled from `trigger` so the trigger keeps driving `aria-controls`, the
15853
+ * click toggle, focus return, and its dismissal exemption regardless of where
15854
+ * the surface paints.
15855
+ */
15201
15856
  readonly reference: _angular_core.Signal<ReferenceElement | null>;
15202
15857
  readonly content: _angular_core.Signal<HTMLElement | null>;
15203
15858
  /** Formatted current value via the adapter, or `null` when empty. */
@@ -15230,6 +15885,8 @@ declare class ForDatePicker<D> extends FormUiControlBase implements FormValueCon
15230
15885
  constructor();
15231
15886
  registerTrigger(el: HTMLElement): void;
15232
15887
  unregisterTrigger(el: HTMLElement): void;
15888
+ registerAnchor(el: HTMLElement): void;
15889
+ unregisterAnchor(el: HTMLElement): void;
15233
15890
  registerContent(el: HTMLElement): void;
15234
15891
  unregisterContent(el: HTMLElement): void;
15235
15892
  toggle(): void;
@@ -15262,6 +15919,45 @@ declare class ForDatePicker<D> extends FormUiControlBase implements FormValueCon
15262
15919
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForDatePicker<any>, "[forDatePicker]", ["forDatePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "isDateUnavailable": { "alias": "isDateUnavailable"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "granularity": { "alias": "granularity"; "required": false; "isSignal": true; }; "hourCycle": { "alias": "hourCycle"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "returnFocus": { "alias": "returnFocus"; "required": false; "isSignal": true; }; "formatOptions": { "alias": "formatOptions"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "rangeSeparator": { "alias": "rangeSeparator"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "sideOffset": { "alias": "sideOffset"; "required": false; "isSignal": true; }; "alignOffset": { "alias": "alignOffset"; "required": false; "isSignal": true; }; "avoidCollisions": { "alias": "avoidCollisions"; "required": false; "isSignal": true; }; "collisionPadding": { "alias": "collisionPadding"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "hideWhenDetached": { "alias": "hideWhenDetached"; "required": false; "isSignal": true; }; "clipUntilPositioned": { "alias": "clipUntilPositioned"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "_dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "open": "openChange"; "range": "rangeChange"; "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "autoFocusOnOpen": "autoFocusOnOpen"; "autoFocusOnClose": "autoFocusOnClose"; }, ["calendar", "timeSource"], never, true, never>;
15263
15920
  }
15264
15921
 
15922
+ /**
15923
+ * Optional positioning anchor. When present, `[forDatePickerContent]` is
15924
+ * positioned against this element instead of `[forDatePickerTrigger]` — useful
15925
+ * when the trigger lives inside a decorated field box (padding, prefix icon,
15926
+ * clear / chevron buttons) and the surface should align to the visible field
15927
+ * rather than the inner button.
15928
+ *
15929
+ * Only positioning changes: the trigger still owns `aria-controls`,
15930
+ * `aria-expanded`, the click toggle, focus return on close, and its exemption
15931
+ * from outside-pointer dismissal. If no anchor is registered the surface falls
15932
+ * back to anchoring against the trigger, so existing usages are unaffected.
15933
+ *
15934
+ * A date picker's calendar has its own intrinsic width and ignores
15935
+ * `--for-anchor-width`, so the practical effect is mostly start / side
15936
+ * alignment to the box edge.
15937
+ *
15938
+ * At most one `[forDatePickerAnchor]` may be registered per `[forDatePicker]`;
15939
+ * a second one throws.
15940
+ *
15941
+ * ```html
15942
+ * <div forDatePicker [(value)]="date">
15943
+ * <div forDatePickerAnchor class="field-box">
15944
+ * <icon />
15945
+ * <button forDatePickerTrigger><span forDatePickerValue>…</span></button>
15946
+ * <button class="clear">×</button>
15947
+ * </div>
15948
+ * @if (open()) {
15949
+ * <div forDatePickerContent>…</div>
15950
+ * }
15951
+ * </div>
15952
+ * ```
15953
+ */
15954
+ declare class ForDatePickerAnchor {
15955
+ #private;
15956
+ constructor();
15957
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForDatePickerAnchor, never>;
15958
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForDatePickerAnchor, "[forDatePickerAnchor]", ["forDatePickerAnchor"], {}, {}, never, never, true, never>;
15959
+ }
15960
+
15265
15961
  /**
15266
15962
  * The button that opens the date-picker surface — and the focusable form
15267
15963
  * control the picker exposes for `[formField]`. Apply on a `<button>` so
@@ -15369,7 +16065,7 @@ declare class ForDatePickerValue {
15369
16065
  interface ForDatePickerDefaults {
15370
16066
  /**
15371
16067
  * Distance (px) between the trigger and the floating surface along the
15372
- * resolved `side` axis. Mirrors Radix's `sideOffset`. Ignored in `modal`
16068
+ * resolved `side` axis. Ignored in `modal`
15373
16069
  * mode (the dialog is centered, not anchored).
15374
16070
  */
15375
16071
  sideOffset: number;
@@ -15456,7 +16152,7 @@ declare const FOR_TIME_FIELD_CONTEXT: InjectionToken<SegmentEditorContext>;
15456
16152
  * to `ForDateField`. There is no single WAI-ARIA APG pattern for a time field;
15457
16153
  * it is a composition of
15458
16154
  * [Spinbuttons](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/) inside a
15459
- * labelled `role="group"`, exactly as React Aria's `useTimeField` models it.
16155
+ * labelled `role="group"`.
15460
16156
  * Each hour / minute / second / AM·PM part is an independent
15461
16157
  * `role="spinbutton"` segment (`[forTimeFieldSegment]`) so entry is unambiguous
15462
16158
  * and locale-correct.
@@ -15831,6 +16527,8 @@ interface ForTimePickerContext<D = unknown> {
15831
16527
  readonly trigger: Signal<HTMLElement | null>;
15832
16528
  registerTrigger(el: HTMLElement): void;
15833
16529
  unregisterTrigger(el: HTMLElement): void;
16530
+ registerAnchor(el: HTMLElement): void;
16531
+ unregisterAnchor(el: HTMLElement): void;
15834
16532
  readonly content: Signal<HTMLElement | null>;
15835
16533
  registerContent(el: HTMLElement): void;
15836
16534
  unregisterContent(el: HTMLElement): void;
@@ -16019,7 +16717,15 @@ declare class ForTimePicker<D> extends FormUiControlBase implements FormValueCon
16019
16717
  readonly initialFocus: _angular_core.Signal<ForTimePickerInitialFocus>;
16020
16718
  readonly lastCloseReason: _angular_core.Signal<ForTimePickerCloseReason | null>;
16021
16719
  readonly trigger: _angular_core.Signal<HTMLElement | null>;
16022
- readonly anchor: _angular_core.Signal<ReferenceElement | null>;
16720
+ /**
16721
+ * Element floating-ui anchors the listbox against. Prefers an optional
16722
+ * `[forTimePickerAnchor]` when registered, otherwise falls back to the
16723
+ * trigger so existing pickers without an anchor keep their behavior.
16724
+ * Decoupled from `trigger` so the trigger keeps driving `aria-controls`, the
16725
+ * click toggle, focus return, and its dismissal exemption regardless of where
16726
+ * the listbox paints.
16727
+ */
16728
+ readonly anchor: _angular_core.Signal<_floating_ui_dom.ReferenceElement | null>;
16023
16729
  readonly content: _angular_core.Signal<HTMLElement | null>;
16024
16730
  readonly options: _angular_core.Signal<readonly ForTimePickerOptionHandle[]>;
16025
16731
  /**
@@ -16038,6 +16744,8 @@ declare class ForTimePicker<D> extends FormUiControlBase implements FormValueCon
16038
16744
  setInitialFocus(target: ForTimePickerInitialFocus): void;
16039
16745
  registerTrigger(el: HTMLElement): void;
16040
16746
  unregisterTrigger(el: HTMLElement): void;
16747
+ registerAnchor(el: HTMLElement): void;
16748
+ unregisterAnchor(el: HTMLElement): void;
16041
16749
  registerContent(el: HTMLElement): void;
16042
16750
  unregisterContent(el: HTMLElement): void;
16043
16751
  registerOption(handle: ForTimePickerOptionHandle): void;
@@ -16065,6 +16773,41 @@ declare class ForTimePicker<D> extends FormUiControlBase implements FormValueCon
16065
16773
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTimePicker<any>, "[forTimePicker]", ["forTimePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "granularity": { "alias": "granularity"; "required": false; "isSignal": true; }; "hourCycle": { "alias": "hourCycle"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "returnFocus": { "alias": "returnFocus"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "formatOptions": { "alias": "formatOptions"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "sideOffset": { "alias": "sideOffset"; "required": false; "isSignal": true; }; "alignOffset": { "alias": "alignOffset"; "required": false; "isSignal": true; }; "avoidCollisions": { "alias": "avoidCollisions"; "required": false; "isSignal": true; }; "collisionPadding": { "alias": "collisionPadding"; "required": false; "isSignal": true; }; "arrowPadding": { "alias": "arrowPadding"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "hideWhenDetached": { "alias": "hideWhenDetached"; "required": false; "isSignal": true; }; "clipUntilPositioned": { "alias": "clipUntilPositioned"; "required": false; "isSignal": true; }; "_dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "open": "openChange"; "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "autoFocusOnOpen": "autoFocusOnOpen"; "autoFocusOnClose": "autoFocusOnClose"; }, never, never, true, never>;
16066
16774
  }
16067
16775
 
16776
+ /**
16777
+ * Optional positioning anchor. When present, `[forTimePickerContent]` is
16778
+ * positioned against this element instead of `[forTimePickerTrigger]` — useful
16779
+ * when the trigger lives inside a decorated field box (padding, prefix icon,
16780
+ * clear / chevron buttons) and the listbox should align to the visible field
16781
+ * rather than the inner button.
16782
+ *
16783
+ * Only positioning changes: the trigger still owns `aria-controls`,
16784
+ * `aria-expanded`, the click toggle, focus return on close, and its exemption
16785
+ * from outside-pointer dismissal. If no anchor is registered the listbox falls
16786
+ * back to anchoring against the trigger, so existing usages are unaffected.
16787
+ *
16788
+ * At most one `[forTimePickerAnchor]` may be registered per `[forTimePicker]`;
16789
+ * a second one throws.
16790
+ *
16791
+ * ```html
16792
+ * <div forTimePicker [(value)]="time">
16793
+ * <div forTimePickerAnchor class="field-box">
16794
+ * <icon />
16795
+ * <button forTimePickerTrigger><span forTimePickerValue>…</span></button>
16796
+ * <button class="clear">×</button>
16797
+ * </div>
16798
+ * @if (open()) {
16799
+ * <div forTimePickerContent>…</div>
16800
+ * }
16801
+ * </div>
16802
+ * ```
16803
+ */
16804
+ declare class ForTimePickerAnchor {
16805
+ #private;
16806
+ constructor();
16807
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForTimePickerAnchor, never>;
16808
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTimePickerAnchor, "[forTimePickerAnchor]", ["forTimePickerAnchor"], {}, {}, never, never, true, never>;
16809
+ }
16810
+
16068
16811
  /**
16069
16812
  * Combobox button that opens the time picker listbox. Apply on a `<button>` so
16070
16813
  * Space / Enter dispatch native click events that toggle via `(click)`.
@@ -16190,7 +16933,7 @@ declare class ForTimePickerOption<D = unknown> {
16190
16933
  interface ForTimePickerDefaults {
16191
16934
  /**
16192
16935
  * Distance (px) between the time picker trigger and the floating content
16193
- * along the resolved `side` axis. Mirrors Radix's `sideOffset`.
16936
+ * along the resolved `side` axis.
16194
16937
  */
16195
16938
  sideOffset: number;
16196
16939
  /**
@@ -16458,6 +17201,10 @@ declare class ForCarousel implements ForCarouselContext {
16458
17201
  * Returns `true` when at least one registered, non-disabled indicator
16459
17202
  * matches the current `activeIndex`. Used by the tabindex ladder to decide
16460
17203
  * whether the first-enabled fallback must reclaim the tab stop.
17204
+ *
17205
+ * Assumes the one-indicator-per-slide mapping the rest of the picker is built
17206
+ * on: the indicator at DOM index `i` targets slide `i`. A mismatched indicator
17207
+ * count is dev-guarded by a `console.warn` at construction.
16461
17208
  */
16462
17209
  hasCurrentIndicator(): boolean;
16463
17210
  /** Start auto-rotation (explicit, sticky). Overrides the reduced-motion auto-start gate. */
@@ -16761,6 +17508,21 @@ declare const FOR_CAROUSEL_DEFAULTS: _angular_core.InjectionToken<ForCarouselDef
16761
17508
  */
16762
17509
  declare function provideForCarouselDefaults(defaults?: Partial<ForCarouselDefaults>): Provider[];
16763
17510
 
17511
+ /** A floating clone of the dragged element that follows the pointer. */
17512
+ interface DragPreview {
17513
+ /** Position the preview's top-left at `(x, y)` in viewport coordinates. */
17514
+ moveTo(x: number, y: number): void;
17515
+ /**
17516
+ * Transition the preview's top-left to `(x, y)`, then `destroy()` it once the transform
17517
+ * transition ends (with a timeout fallback). Marks the element `data-settling` so a consumer
17518
+ * CSS rule keyed on it governs duration / easing. If no transition is configured, destroys
17519
+ * immediately. Caller must pass the browser `Window`.
17520
+ */
17521
+ settle(x: number, y: number, win: Window): void;
17522
+ /** Remove the preview from the DOM. Idempotent. */
17523
+ destroy(): void;
17524
+ }
17525
+
16764
17526
  /** A registered draggable item, as seen by its drop list. */
16765
17527
  interface ForDraggableHandle {
16766
17528
  readonly host: HTMLElement;
@@ -16777,7 +17539,7 @@ interface ForDraggableHandle {
16777
17539
  */
16778
17540
  interface ForDropListContext {
16779
17541
  readonly host: HTMLElement;
16780
- readonly orientation: Signal<'horizontal' | 'vertical'>;
17542
+ readonly orientation: Signal<'horizontal' | 'vertical' | 'mixed'>;
16781
17543
  readonly dir: Signal<WritingDirection>;
16782
17544
  /** Effective disabled of the whole list. */
16783
17545
  readonly disabled: Signal<boolean>;
@@ -16807,13 +17569,14 @@ interface ForDropListContext {
16807
17569
  /**
16808
17570
  * Begin a pointer drag for `el` at viewport point `point`. Sets up the same session state as a
16809
17571
  * keyboard lift. `preview` is the floating element supplied by the draggable (a consumer
16810
- * `[forDragPreview]` template); when omitted, the list creates the default cloned preview.
17572
+ * `[forDragPreview]` template) — either a full {@link DragPreview} or the minimal
17573
+ * `{ moveTo, destroy }` shape; when omitted, the list creates the default cloned preview.
16811
17574
  * Returns the source index, or `-1` if it could not lift.
16812
17575
  */
16813
17576
  pointerLift(el: HTMLElement, point: {
16814
17577
  x: number;
16815
17578
  y: number;
16816
- }, preview?: {
17579
+ }, preview?: DragPreview | {
16817
17580
  moveTo(x: number, y: number): void;
16818
17581
  destroy(): void;
16819
17582
  } | null): number;
@@ -16848,13 +17611,25 @@ interface ForDragEndEvent {
16848
17611
  /** `true` on a committed drop, `false` on cancel. */
16849
17612
  readonly dropped: boolean;
16850
17613
  }
16851
- /** Internal coordination surface a `ForDraggable` exposes to its `[forDragHandle]` children. */
17614
+ /**
17615
+ * Internal coordination surface a `ForDraggable` / `ForFreeDrag` exposes to its
17616
+ * `[forDragHandle]` children.
17617
+ */
16852
17618
  interface ForDraggableContext {
16853
17619
  /** Register a handle element; while any handle is registered, pointer drags may only start on one. */
16854
17620
  registerHandle(el: HTMLElement): void;
16855
17621
  unregisterHandle(el: HTMLElement): void;
16856
17622
  }
16857
17623
 
17624
+ /**
17625
+ * Optional DI seam overriding the fallback `orientation` of every `[forDropList]` in scope.
17626
+ * `ForDropList`'s `orientation` input falls back to this token's value (`'vertical'` when the
17627
+ * token is not provided); a consumer `orientation` binding always wins over it. Wrappers
17628
+ * compose a horizontal list without leaking `orientation="horizontal"` boilerplate into the
17629
+ * consumer's template — `ForTableColumnReorder` provides `'horizontal'` so column reordering
17630
+ * resolves along the row axis out of the box.
17631
+ */
17632
+ declare const FOR_DROP_LIST_DEFAULT_ORIENTATION: InjectionToken<"horizontal" | "vertical" | "mixed">;
16858
17633
  /**
16859
17634
  * Root directive of the drag-drop primitive. Apply on any container element to
16860
17635
  * create a reorderable list. Items inside are declared with `[forDraggable]`.
@@ -16863,8 +17638,19 @@ interface ForDraggableContext {
16863
17638
  */
16864
17639
  declare class ForDropList implements ForDropListContext {
16865
17640
  #private;
16866
- /** Layout orientation of the list. Affects which arrow keys move focus and the lifted item. */
16867
- readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
17641
+ /**
17642
+ * Layout orientation of the list. Affects which arrow keys move focus and the lifted item, and
17643
+ * how a pointer drag resolves the live drop index. Defaults to `'vertical'`, or to
17644
+ * `FOR_DROP_LIST_DEFAULT_ORIENTATION` when an in-scope provider sets it (e.g.
17645
+ * `ForTableColumnReorder` defaults it to `'horizontal'`).
17646
+ *
17647
+ * `'mixed'` is for wrapping grids (`flex-wrap` / CSS grid) of uniformly-sized items: the drop
17648
+ * index is resolved in 2D so an item flowing across rows lands in the slot under the pointer's
17649
+ * row and column, and every arrow key steps the lifted item linearly in DOM order. A `'mixed'`
17650
+ * list that happens to render as a single row or single column resolves identically to
17651
+ * `'horizontal'` / `'vertical'`.
17652
+ */
17653
+ readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical" | "mixed">;
16868
17654
  /**
16869
17655
  * Writing direction. When unset (default `null`), the inherited ambient direction is
16870
17656
  * resolved from the nearest ancestor carrying a `dir` attribute (or `<html dir>`),
@@ -16892,6 +17678,10 @@ declare class ForDropList implements ForDropListContext {
16892
17678
  * reveal where the item will land. When false (the default), the placeholder stays in the
16893
17679
  * dragged item's source slot (the #806 behaviour). Has no effect without a
16894
17680
  * `[forDragPlaceholder]` template, and none on keyboard dragging.
17681
+ *
17682
+ * A `dragDisabled` sibling acts as a hard fence: the placeholder stops at the first
17683
+ * pinned item instead of travelling past it. This is purely visual — the committed drop
17684
+ * index emitted by `dragDrop` is resolved separately and unaffected.
16895
17685
  */
16896
17686
  readonly liveSort: _angular_core.InputSignalWithTransform<boolean, unknown>;
16897
17687
  /**
@@ -16944,7 +17734,7 @@ declare class ForDropList implements ForDropListContext {
16944
17734
  pointerLift(el: HTMLElement, point: {
16945
17735
  x: number;
16946
17736
  y: number;
16947
- }, preview?: {
17737
+ }, preview?: DragPreview | {
16948
17738
  moveTo(x: number, y: number): void;
16949
17739
  destroy(): void;
16950
17740
  } | null): number;
@@ -17001,7 +17791,11 @@ declare class ForDraggable implements ForDraggableContext {
17001
17791
  protected readonly placeholderActive: _angular_core.WritableSignal<boolean>;
17002
17792
  /** Data payload handed back in the `dragDrop` event when this item is dropped. */
17003
17793
  readonly dragData: _angular_core.InputSignal<unknown>;
17004
- /** When true, this item cannot be lifted. The item remains focusable. */
17794
+ /**
17795
+ * When true, this item cannot be lifted. The item remains focusable. It also acts as a
17796
+ * hard fence for the `liveSort` placeholder: a sibling being dragged cannot move its
17797
+ * placeholder across a pinned item (the committed drop index is unaffected).
17798
+ */
17005
17799
  readonly dragDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
17006
17800
  /** Emitted when a drag (keyboard or pointer) starts from this item. */
17007
17801
  readonly dragStart: _angular_core.OutputEmitterRef<ForDragStartEvent>;
@@ -17027,6 +17821,73 @@ declare class ForDraggable implements ForDraggableContext {
17027
17821
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForDraggable, "[forDraggable]", ["forDraggable"], { "dragData": { "alias": "dragData"; "required": true; "isSignal": true; }; "dragDisabled": { "alias": "dragDisabled"; "required": false; "isSignal": true; }; }, { "dragStart": "dragStart"; "dragEnd": "dragEnd"; }, ["previewTpl", "placeholderTpl"], never, true, never>;
17028
17822
  }
17029
17823
 
17824
+ /**
17825
+ * Standalone free-drag directive: repositions its host (or a resolved `rootElement`) by pointer
17826
+ * drag via a CSS `transform: translate(...)`, with **no** `[forDropList]` dependency. Unlike
17827
+ * `[forDraggable]`, it never commits a reorder — it only moves an arbitrary element around,
17828
+ * optionally confined to a `boundary` and locked to one axis. Composes the shared
17829
+ * `createPointerDragSession` transport and accepts `[forDragHandle]` children.
17830
+ *
17831
+ * Pointer-only: there is no WAI-ARIA APG pattern for "freely reposition an element", so this is
17832
+ * a documented headless exception (see `.claude/rules/conventions.md`). It owns no role or ARIA
17833
+ * state and must not destroy the moved element's semantics — the consumer keeps the moved
17834
+ * element operable at its default position (e.g. a repositionable dialog stays usable by
17835
+ * keyboard); dragging is a pointer convenience, not the only way to use it.
17836
+ */
17837
+ declare class ForFreeDrag implements ForDraggableContext {
17838
+ #private;
17839
+ /** When true, the element can't be dragged (it stays focusable; the transform doesn't change). */
17840
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
17841
+ /**
17842
+ * The element actually moved: an `HTMLElement`, or a selector resolved via `closest()` from the
17843
+ * host. `null` (the default) moves the host itself. Mirrors CDK's `cdkDragRootElement` — drag a
17844
+ * child handle, move an ancestor (e.g. drag a whole dialog by its header).
17845
+ */
17846
+ readonly rootElement: _angular_core.InputSignal<string | HTMLElement | null>;
17847
+ /**
17848
+ * Confine movement within an `HTMLElement`, a `closest()` selector resolved from the host, or
17849
+ * `null` (the default) for unbounded movement. Unlike `[forDropList]`'s boundary (which clamps a
17850
+ * floating clone), this clamps the **real moved element** so its box stays fully inside.
17851
+ */
17852
+ readonly boundary: _angular_core.InputSignal<string | HTMLElement | null>;
17853
+ /**
17854
+ * Constrain movement to one axis. `'x'` pins the element at its lift-time `y` (horizontal-only);
17855
+ * `'y'` pins it at its lift-time `x` (vertical-only). `null` (the default) is free.
17856
+ */
17857
+ readonly lockAxis: _angular_core.InputSignal<"x" | "y" | null>;
17858
+ /** Two-way translate offset (px) from the element's natural position. Controllable / restorable. */
17859
+ readonly position: _angular_core.ModelSignal<{
17860
+ x: number;
17861
+ y: number;
17862
+ }>;
17863
+ /** Emitted when a pointer drag starts, with the lift-time position. */
17864
+ readonly dragStart: _angular_core.OutputEmitterRef<{
17865
+ x: number;
17866
+ y: number;
17867
+ }>;
17868
+ /**
17869
+ * Emitted on every armed move with the live position. (Non-native verb — `dragMove`, not
17870
+ * `drag` / `dragMoved` — so `@angular-eslint/no-output-native` stays clear.)
17871
+ */
17872
+ readonly dragMove: _angular_core.OutputEmitterRef<{
17873
+ x: number;
17874
+ y: number;
17875
+ }>;
17876
+ /** Emitted when the drag ends, with the final position. */
17877
+ readonly dragEnd: _angular_core.OutputEmitterRef<{
17878
+ x: number;
17879
+ y: number;
17880
+ }>;
17881
+ /** True while a pointer drag is armed. Reflected as `data-dragging`. */
17882
+ readonly dragging: _angular_core.Signal<boolean>;
17883
+ protected readonly touchAction: _angular_core.Signal<"none" | null>;
17884
+ constructor();
17885
+ registerHandle(el: HTMLElement): void;
17886
+ unregisterHandle(el: HTMLElement): void;
17887
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForFreeDrag, never>;
17888
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForFreeDrag, "[forFreeDrag]", ["forFreeDrag"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rootElement": { "alias": "rootElement"; "required": false; "isSignal": true; }; "boundary": { "alias": "boundary"; "required": false; "isSignal": true; }; "lockAxis": { "alias": "lockAxis"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, { "position": "positionChange"; "dragStart": "dragStart"; "dragMove": "dragMove"; "dragEnd": "dragEnd"; }, never, never, true, never>;
17889
+ }
17890
+
17030
17891
  /**
17031
17892
  * Optional drag handle inside a `[forDraggable]`. When at least one handle is present on an item, a pointer
17032
17893
  * drag may only start from within a handle (keyboard dragging is unaffected). Apply on a child element.
@@ -17699,7 +18560,7 @@ declare class ForStepperProgress {
17699
18560
  protected readonly ctx: forty_cdk.ForStepperContext;
17700
18561
  /**
17701
18562
  * Basis for the reported percent. `'index'` (default) derives progress from
17702
- * the current step index (matches Ark UI's `Steps.Progress`); `'completed'`
18563
+ * the current step index; `'completed'`
17703
18564
  * derives it from the count of steps whose resolved state is `completed`.
17704
18565
  */
17705
18566
  readonly valueBy: _angular_core.InputSignal<"index" | "completed">;
@@ -17757,7 +18618,7 @@ declare function provideForStepperDefaults(defaults?: Partial<ForStepperDefaults
17757
18618
  type TableMode = 'table' | 'grid' | 'treegrid';
17758
18619
  /** Row-selection mode for `ForTable`. `'none'` disables selection. */
17759
18620
  type TableSelectionMode = 'none' | 'single' | 'multiple';
17760
- /** How a row click mutates selection. `'toggle'` flips it; `'replace'` replaces (modifier-aware), React-Aria semantics. */
18621
+ /** How a row click mutates selection. `'toggle'` flips it; `'replace'` replaces (modifier-aware). */
17761
18622
  type TableSelectionBehavior = 'toggle' | 'replace';
17762
18623
  /** Aggregate selection state across the table's selectable rows, for the select-all tri-state. */
17763
18624
  type TableSelectAllState = 'none' | 'some' | 'all';
@@ -17803,6 +18664,12 @@ interface TableVirtualRowNavigation {
17803
18664
  * column)`, scrolling that row into the window first when it is not mounted.
17804
18665
  */
17805
18666
  navigateTo(rowIndex: number, column: number): void;
18667
+ /**
18668
+ * Scroll the virtualizer so the row at the absolute `index` is in the window.
18669
+ * Used by `[forTableRowReorder]` to follow a keyboard reorder target across
18670
+ * the rendered window without taking a direct dependency on `ForTableVirtualized`.
18671
+ */
18672
+ scrollToRow(index: number): void;
17806
18673
  }
17807
18674
  /** Coordination contract owned by `ForTable`, injected by every descendant piece. */
17808
18675
  interface ForTableContext {
@@ -17873,6 +18740,13 @@ interface ForTableContext {
17873
18740
  * targeting an unmounted row are handled by the virtualization bridge.
17874
18741
  */
17875
18742
  registerVirtualNavigation(navigation: TableVirtualRowNavigation | null): void;
18743
+ /**
18744
+ * The currently registered cross-window row-navigation delegate, or `null`
18745
+ * when the table is not virtualized. `[forTableRowReorder]` reads this to gate
18746
+ * keyboard reordering to virtualized tables and to scroll the reorder target
18747
+ * into view, without taking a direct dependency on `ForTableVirtualized`.
18748
+ */
18749
+ readonly virtualRowNavigation: Signal<TableVirtualRowNavigation | null>;
17876
18750
  /**
17877
18751
  * Absolute index of the row currently being pointer-reordered (set by
17878
18752
  * `[forTableRowReorder]` on lift, cleared on release), or `null` when no row is
@@ -17948,7 +18822,7 @@ declare class ForTable implements ForTableContext {
17948
18822
  * The resolved value is reflected to the host `dir` attribute.
17949
18823
  */
17950
18824
  readonly _dirInput: _angular_core.InputSignal<WritingDirection | null>;
17951
- readonly dir: _angular_core.Signal<WritingDirection>;
18825
+ readonly dir: Signal<WritingDirection>;
17952
18826
  /**
17953
18827
  * True total number of data rows for `aria-rowcount`, e.g. for a server-paged or
17954
18828
  * (later) virtualized table that renders only a window of rows. Defaults to the
@@ -17993,24 +18867,25 @@ declare class ForTable implements ForTableContext {
17993
18867
  * consumer writes through `[(expanded)]`. Ignored outside `treegrid` mode.
17994
18868
  */
17995
18869
  readonly expanded: _angular_core.ModelSignal<readonly unknown[]>;
17996
- protected readonly headerSize: _angular_core.Signal<ElementBox | null>;
18870
+ protected readonly headerSize: Signal<ElementBox | null>;
17997
18871
  /** Live registered data rows, exposed to `[forTableVirtualized]`'s cross-window navigation bridge. */
17998
- readonly rows: _angular_core.Signal<readonly ForTableRowHandle[]>;
18872
+ readonly rows: Signal<readonly ForTableRowHandle[]>;
17999
18873
  /**
18000
18874
  * Absolute index of the row currently being pointer-reordered, or `null`. Set by
18001
18875
  * `[forTableRowReorder]` and read by `[forTableVirtualized]` to keep the lifted
18002
18876
  * row mounted across recycling during a drag.
18003
18877
  */
18004
- readonly reorderingRowIndex: _angular_core.Signal<number | null>;
18005
- readonly selectAllState: _angular_core.Signal<TableSelectAllState>;
18878
+ readonly reorderingRowIndex: Signal<number | null>;
18879
+ readonly virtualRowNavigation: Signal<TableVirtualRowNavigation | null>;
18880
+ readonly selectAllState: Signal<TableSelectAllState>;
18006
18881
  /**
18007
18882
  * Absolute index of the row that owns the currently roving-focused cell, or `null`
18008
18883
  * when no cell is focused (or the focused row carries no `virtualIndex`). Used by
18009
18884
  * `[forTableVirtualized]` to keep the focused row mounted across recycling.
18010
18885
  */
18011
- readonly focusedRowIndex: _angular_core.Signal<number | null>;
18012
- protected readonly rowCountAttr: _angular_core.Signal<number | null>;
18013
- protected readonly colCountAttr: _angular_core.Signal<number | null>;
18886
+ readonly focusedRowIndex: Signal<number | null>;
18887
+ protected readonly rowCountAttr: Signal<number | null>;
18888
+ protected readonly colCountAttr: Signal<number | null>;
18014
18889
  constructor();
18015
18890
  registerHeaderRow(el: HTMLElement): void;
18016
18891
  setColumnWidth(column: string, width: number): void;
@@ -18186,7 +19061,7 @@ declare class ForTableSelectAll {
18186
19061
  protected readonly ctx: forty_cdk.ForTableContext;
18187
19062
  /** Accessible label for the control (e.g. "Select all rows"). Truthy-only. */
18188
19063
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
18189
- protected readonly ariaChecked: _angular_core.Signal<"true" | "false" | "mixed">;
19064
+ protected readonly ariaChecked: _angular_core.Signal<"mixed" | "true" | "false">;
18190
19065
  protected readonly dataState: _angular_core.Signal<"checked" | "unchecked" | "indeterminate">;
18191
19066
  protected onClick(): void;
18192
19067
  protected onKeyDown(event: KeyboardEvent): void;
@@ -18215,8 +19090,13 @@ interface TableSortDescriptor {
18215
19090
  * the host attribute; `aria-sort` / `data-sorted` and click / keyboard activation stay
18216
19091
  * on the cell.
18217
19092
  *
18218
- * Cycle: `none → ascending → descending → none` (default).
19093
+ * Cycle (default `firstClickDirection='ascending'`): `none → ascending → descending → none`.
18219
19094
  * With `disableClear`: `none → ascending → descending → ascending`.
19095
+ *
19096
+ * `firstClickDirection='descending'` flips the entry pole, so a freshly activated
19097
+ * column starts descending: `none → descending → ascending → none` (and with
19098
+ * `disableClear`: `none → descending → ascending → descending`) — the descending-first
19099
+ * behavior used by single-always-active sort descriptors.
18220
19100
  */
18221
19101
  declare class ForTableSortHeader {
18222
19102
  #private;
@@ -18236,6 +19116,13 @@ declare class ForTableSortHeader {
18236
19116
  * Useful when clearing the sort is not allowed.
18237
19117
  */
18238
19118
  readonly disableClear: _angular_core.InputSignalWithTransform<boolean, unknown>;
19119
+ /**
19120
+ * Direction a previously-unsorted column enters on its first activation (the
19121
+ * `'none' → ?` step of the cycle). Defaults to `'ascending'`. Set to `'descending'`
19122
+ * for descending-first columns. The toggle between the two sorted directions and the
19123
+ * optional `'none'` step (`disableClear`) are unchanged.
19124
+ */
19125
+ readonly firstClickDirection: _angular_core.InputSignal<"ascending" | "descending">;
18239
19126
  /**
18240
19127
  * When `false`, the header is fully inert: no `tabindex`, no `aria-sort`, and click /
18241
19128
  * keyboard handlers are no-ops. Defaults to `true`.
@@ -18257,7 +19144,7 @@ declare class ForTableSortHeader {
18257
19144
  /** Handles Enter and Space keyboard events, forwarding to `activate()`. */
18258
19145
  protected onKeyDown(event: KeyboardEvent): void;
18259
19146
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForTableSortHeader, never>;
18260
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTableSortHeader, "[forTableSortHeader]", ["forTableSortHeader"], { "column": { "alias": "column"; "required": true; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "disableClear": { "alias": "disableClear"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; }, { "direction": "directionChange"; "sortChange": "sortChange"; }, never, never, true, never>;
19147
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTableSortHeader, "[forTableSortHeader]", ["forTableSortHeader"], { "column": { "alias": "column"; "required": true; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "disableClear": { "alias": "disableClear"; "required": false; "isSignal": true; }; "firstClickDirection": { "alias": "firstClickDirection"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; }, { "direction": "directionChange"; "sortChange": "sortChange"; }, never, never, true, never>;
18261
19148
  }
18262
19149
 
18263
19150
  /** Payload of `resizeCommit`: which column was resized and its committed width (px). */
@@ -18278,7 +19165,10 @@ interface TableResizeDescriptor {
18278
19165
  *
18279
19166
  * Reflects `data-resizing` (empty string) while a pointer drag is active. Carries
18280
19167
  * `role="separator"` with `aria-orientation="vertical"` and live `aria-value*`,
18281
- * mirroring `[forPaneResizer]`. The consumer supplies `aria-label`.
19168
+ * mirroring `[forPaneResizer]`. The consumer supplies `aria-label`. Before the first
19169
+ * gesture, `aria-valuenow` falls back to the header-cell width measured once on mount
19170
+ * (browser-only), so a separator with no `[width]` is never announced without a
19171
+ * current value; an explicit `[width]` always takes precedence.
18282
19172
  *
18283
19173
  * @example
18284
19174
  * ```html
@@ -18318,6 +19208,12 @@ declare class ForTableColumnResizer {
18318
19208
  protected readonly ariaValueMax: _angular_core.Signal<number | null>;
18319
19209
  /** Whether a pointer drag is currently active (drives `data-resizing`). */
18320
19210
  protected readonly resizing: _angular_core.Signal<boolean>;
19211
+ /**
19212
+ * Header-cell width measured once on mount (browser-only). Backs `aria-valuenow`
19213
+ * before any explicit `[width]` so the focusable separator never ships without a
19214
+ * current value on the measured-fallback path; an explicit `[width]` still wins.
19215
+ */
19216
+ protected readonly measuredWidth: _angular_core.Signal<number | null>;
18321
19217
  constructor();
18322
19218
  protected onPointerDown(event: PointerEvent): void;
18323
19219
  protected onKeyDown(event: KeyboardEvent): void;
@@ -18346,18 +19242,13 @@ interface TableColumnReorderDescriptor {
18346
19242
  * new column-name order; the consumer applies it to their own column array. **It never
18347
19243
  * reorders columns itself** (BYO-data).
18348
19244
  *
18349
- * Angular cannot fix a host-directive input to a constant, so set
18350
- * `orientation="horizontal"` on this element so the wrapped list resolves drops along
18351
- * the row (horizontal) axis.
19245
+ * The wrapped list defaults to `orientation="horizontal"` (a column reorder is always along
19246
+ * the row axis), so no `orientation` binding is needed. Bind `orientation="vertical"` to
19247
+ * override for the rare case.
18352
19248
  *
18353
19249
  * @example
18354
19250
  * ```html
18355
- * <div
18356
- * forTableHeaderRow
18357
- * forTableColumnReorder
18358
- * orientation="horizontal"
18359
- * (columnReorder)="columns.set($event.columns)"
18360
- * >
19251
+ * <div forTableHeaderRow forTableColumnReorder (columnReorder)="columns.set($event.columns)">
18361
19252
  * @for (col of columns(); track col) {
18362
19253
  * <div forTableHeaderCell [name]="col" forDraggable [dragData]="col">{{ col }}</div>
18363
19254
  * }
@@ -18422,302 +19313,432 @@ declare class ForTableRowReorder {
18422
19313
  }
18423
19314
 
18424
19315
  /**
18425
- * Configuration for {@link injectVirtualizer}. The consumer owns the data and
18426
- * the DOM; the virtualizer only computes which slice of the data is visible.
19316
+ * Defaults inherited by descendant tables in the surrounding injector scope.
19317
+ * Configure with `provideForTableDefaults`. The shape is a stub today — present
19318
+ * so future per-scope tuning can land without churning the public surface.
18427
19319
  */
18428
- interface VirtualizerOptions {
18429
- /** Reactive total number of items in the list. */
18430
- readonly count: Signal<number>;
18431
- /**
18432
- * Estimated size, in CSS pixels, of the item at `index` along the scroll
18433
- * axis (height when vertical, width when horizontal). Used until an item is
18434
- * measured. Should be a stable function reference.
18435
- */
18436
- readonly estimateSize: (index: number) => number;
18437
- /** Reactive reference to the scroll container element (e.g. a `viewChild`). */
18438
- readonly scrollElement: Signal<HTMLElement | null>;
18439
- /** Scroll axis. Defaults to `'vertical'`. */
18440
- readonly orientation?: 'vertical' | 'horizontal';
18441
- /**
18442
- * Number of items to render beyond the visible window on each side, to
18443
- * reduce blank flashes while scrolling. Defaults to `5`.
18444
- */
18445
- readonly overscan?: number;
18446
- /** Stable key for the item at `index`. Defaults to the index itself. */
18447
- readonly getItemKey?: (index: number) => string | number;
19320
+ interface ForTableDefaults {
18448
19321
  }
18449
- /** A single item in the currently rendered window. */
18450
- interface VirtualItem {
18451
- /** Index of the item in the full list. */
18452
- readonly index: number;
18453
- /** Stable key (from `getItemKey`, or the index). */
18454
- readonly key: string | number;
18455
- /** Offset of the item from the start of the scroll container, in pixels. */
18456
- readonly start: number;
18457
- /** Size of the item along the scroll axis, in pixels. */
18458
- readonly size: number;
18459
- }
18460
- /** Reactive handle returned by {@link injectVirtualizer}. */
18461
- interface ForVirtualizer {
18462
- /** The items in the currently visible window plus overscan. */
18463
- readonly virtualItems: Signal<readonly VirtualItem[]>;
18464
- /** Total scroll size of all items, in pixels (drives the spacer element). */
18465
- readonly totalSize: Signal<number>;
18466
- /**
18467
- * The inclusive-exclusive `[firstIndex, lastIndex + 1)` index window currently
18468
- * rendered (visible window plus overscan), or `[0, 0]` when nothing is rendered.
18469
- * Plugs straight into a list primitive's `[visibleRange]`-style input (e.g.
18470
- * `[forCombobox][visibleRange]`) so windowing composes without the consumer
18471
- * re-deriving the range from {@link ForVirtualizer.virtualItems}.
18472
- */
18473
- readonly range: Signal<readonly [number, number]>;
18474
- /** Scroll the container so the item at `index` is in view. */
18475
- scrollToIndex(index: number, options?: {
18476
- align?: 'start' | 'center' | 'end' | 'auto';
18477
- }): void;
18478
- /** Scroll the container to an absolute pixel offset. */
18479
- scrollToOffset(offset: number): void;
18480
- /** Record the measured size of a rendered item element (dynamic sizes). */
18481
- measureElement(element: HTMLElement): void;
19322
+ /** Token holding the resolved table defaults for the current scope. */
19323
+ declare const FOR_TABLE_DEFAULTS: _angular_core.InjectionToken<ForTableDefaults>;
19324
+ /**
19325
+ * Configures forty-cdk table defaults for this injector scope. Partial
19326
+ * overrides inherit unspecified keys from the parent scope (or library
19327
+ * defaults at the root).
19328
+ */
19329
+ declare function provideForTableDefaults(defaults?: Partial<ForTableDefaults>): Provider[];
19330
+
19331
+ /**
19332
+ * One entry in the computed visible-page list: either a clickable page number
19333
+ * or an ellipsis gap standing in for a collapsed run of pages.
19334
+ */
19335
+ interface PaginationItem {
19336
+ /** Discriminator: a real page button, or a non-interactive ellipsis gap. */
19337
+ readonly type: 'page' | 'ellipsis';
19338
+ /** 1-based page number. Present only when `type` is `'page'`. */
19339
+ readonly value?: number;
18482
19340
  }
19341
+
18483
19342
  /**
18484
- * Headless windowing core: given a reactive item count, a size estimator and a
18485
- * scroll container, returns the slice of items currently visible (plus
18486
- * overscan), the total scroll size, and imperative scroll/measure helpers. The
18487
- * consumer renders the items with their own `@for` and applies the position
18488
- * transform — this primitive owns no DOM.
18489
- *
18490
- * Backed by `@tanstack/virtual-core`. SSR-safe: off-browser it returns an empty
18491
- * window and the estimate-based total without touching `document`/`window`; the
18492
- * first real window is produced after the first browser render.
18493
- *
18494
- * Must be called from an injection context (a component/directive constructor
18495
- * or field initializer).
18496
- *
18497
- * @param options Reactive count, size estimator, scroll element and tuning.
18498
- * @returns A {@link ForVirtualizer} handle of signals + imperative methods.
19343
+ * Coordination contract owned by `ForPagination`. Page buttons, previous, and
19344
+ * next pieces inject it to read the current page / derived list and drive
19345
+ * navigation from a single source of truth.
18499
19346
  */
18500
- declare function injectVirtualizer(options: VirtualizerOptions): ForVirtualizer;
19347
+ interface ForPaginationContext {
19348
+ /** Current 1-based page. */
19349
+ readonly page: Signal<number>;
19350
+ /** Total number of pages. */
19351
+ readonly count: Signal<number>;
19352
+ /** Whether the whole control is disabled. */
19353
+ readonly disabled: Signal<boolean>;
19354
+ /** The computed visible-page list (page numbers + ellipsis gaps). */
19355
+ readonly items: Signal<readonly PaginationItem[]>;
19356
+ /** Whether the current page is the first (no previous page). */
19357
+ readonly isFirst: Signal<boolean>;
19358
+ /** Whether the current page is the last (no next page). */
19359
+ readonly isLast: Signal<boolean>;
19360
+ /** Navigate to `page`, clamped to `[1, count]`. No-op when disabled. */
19361
+ goToPage(page: number): void;
19362
+ /** Navigate to the previous page. No-op at the first page or when disabled. */
19363
+ previous(): void;
19364
+ /** Navigate to the next page. No-op at the last page or when disabled. */
19365
+ next(): void;
19366
+ }
19367
+ /** DI token providing the pagination context to descendant pieces. */
19368
+ declare const FOR_PAGINATION_CONTEXT: InjectionToken<ForPaginationContext>;
18501
19369
 
18502
19370
  /**
18503
- * Opt-in row-virtualization companion for `[forTable]` in `<div role>` grid mode. Place it on the
18504
- * same element as `[forTable]`; it builds the windowing core from the table's `[rowCount]` and
18505
- * exposes the visible window for the consumer to render with their own `@for` + position transform.
19371
+ * Headless pagination navigation landmark, implementing the
19372
+ * [WAI-ARIA `navigation` landmark](https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/navigation.html)
19373
+ * with [`aria-current="page"`](https://www.w3.org/TR/wai-aria-1.2/#aria-current) on the active page.
18506
19374
  *
18507
- * Tree-shakeable: `ForTable` never imports the virtualization core — only consumers that import
18508
- * `ForTableVirtualized` bundle `@tanstack/virtual-core`.
19375
+ * Derives the visible page list (with ellipsis gaps) from `page`, `count`,
19376
+ * `siblingCount`, and `boundaryCount`. Exposes `items()`, `isFirst()`,
19377
+ * `isLast()`, and navigation methods for the consumer template to render.
18509
19378
  *
18510
- * The focused row is kept mounted even when scrolled out of the window so the roving-focused
18511
- * `gridcell` is never unmounted (React Aria pattern). SSR-safe: off-browser the window is empty and
18512
- * `totalSize` is the estimate-based total.
19379
+ * There is no roving tabindex — each page button, previous, and next are their
19380
+ * own tab stops. RTL is visual-only: the resolved `dir` reflects on the host
19381
+ * for CSS; navigation semantics (previous = decrement, next = increment) never
19382
+ * change based on direction.
18513
19383
  *
18514
- * Also drives cross-window keyboard navigation: when an Arrow / Page / Ctrl+Home / Ctrl+End grid
18515
- * action resolves a row outside the rendered window, it scrolls that row into view and moves roving
18516
- * focus onto the target cell once it mounts (preserving the current column). `ForTable` stays
18517
- * unaware of virtualization — it delegates the row-crossing move through the table context.
19384
+ * @example
19385
+ * ```html
19386
+ * <nav forPagination [(page)]="page" [count]="20" ariaLabel="Pagination" #pg="forPagination">
19387
+ * <button forPaginationPrevious ariaLabel="Previous page">‹</button>
19388
+ * @for (item of pg.items(); track $index) {
19389
+ * @if (item.type === 'page') {
19390
+ * <button forPaginationItem [page]="item.value!">{{ item.value }}</button>
19391
+ * } @else {
19392
+ * <span aria-hidden="true">…</span>
19393
+ * }
19394
+ * }
19395
+ * <button forPaginationNext ariaLabel="Next page">›</button>
19396
+ * </nav>
19397
+ * ```
18518
19398
  */
18519
- declare class ForTableVirtualized {
19399
+ declare class ForPagination implements ForPaginationContext {
18520
19400
  #private;
18521
- /** Estimated row size in px along the scroll axis (the fixed-size fast path). Read for the size estimate. */
18522
- readonly estimateRowSize: _angular_core.InputSignalWithTransform<number, unknown>;
18523
- /** Scroll container. Defaults to the table root element (the scroll container in `<div>` grid mode). */
18524
- readonly scrollElement: _angular_core.InputSignal<HTMLElement | null>;
18525
- constructor();
18526
19401
  /**
18527
- * The rows in the visible window plus overscan, augmented to always include the focused row and
18528
- * the row being reordered even when they are scrolled out of view (so the roving-focused cell
18529
- * stays mounted, and a pointer reorder drag never unmounts the lifted row). Render these with
18530
- * `@for (vrow of v.virtualRows(); track vrow.index)` and position each row absolutely with
18531
- * `transform: translateY(vrow.start + 'px')`. Bind each row's `[virtualIndex]="vrow.index"`.
19402
+ * Current 1-based page number. Two-way bindable via `[(page)]`. The implicit
19403
+ * `pageChange` output emits whenever the directive updates this value (via
19404
+ * clicks, previous, or next). Do not add a separate `pageChange` output.
18532
19405
  */
18533
- readonly virtualRows: _angular_core.Signal<readonly VirtualItem[]>;
18534
- /** Total scroll size of all rows in px. Bind to the body container's height to size the scroll range. */
18535
- readonly totalSize: _angular_core.Signal<number>;
19406
+ readonly page: _angular_core.ModelSignal<number>;
18536
19407
  /**
18537
- * Scroll the container so the row at `index` is in view. Cross-window keyboard
18538
- * navigation calls this internally; consumers may also call it to scroll
18539
- * programmatically.
19408
+ * Total number of pages. Always bind as `[count]="n"` (a number, not a
19409
+ * string). Required.
18540
19410
  */
18541
- scrollToRow(index: number, options?: {
18542
- align?: 'start' | 'center' | 'end' | 'auto';
18543
- }): void;
18544
- /** Record the measured size of a rendered row element (dynamic / measured row heights). */
18545
- measureRow(element: HTMLElement): void;
18546
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForTableVirtualized, never>;
18547
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForTableVirtualized, "[forTableVirtualized]", ["forTableVirtualized"], { "estimateRowSize": { "alias": "estimateRowSize"; "required": false; "isSignal": true; }; "scrollElement": { "alias": "scrollElement"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19411
+ readonly count: _angular_core.InputSignal<number>;
19412
+ /**
19413
+ * Pages shown on each side of the current page before collapsing to an
19414
+ * ellipsis. Default read from `provideForPaginationDefaults` for the
19415
+ * surrounding scope (library fallback: `1`).
19416
+ */
19417
+ readonly siblingCount: _angular_core.InputSignalWithTransform<number, unknown>;
19418
+ /**
19419
+ * Pages always shown at each end (first and last). Default read from
19420
+ * `provideForPaginationDefaults` for the surrounding scope (library
19421
+ * fallback: `1`).
19422
+ */
19423
+ readonly boundaryCount: _angular_core.InputSignalWithTransform<number, unknown>;
19424
+ /** Whether the entire pagination control is disabled. */
19425
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
19426
+ /**
19427
+ * Writing direction. When unset (default `null`), the inherited ambient
19428
+ * direction is resolved from the nearest ancestor carrying a `dir` attribute
19429
+ * (or `<html dir>`), defaulting to `'ltr'`. An explicit `[dir]` always wins.
19430
+ * The resolved value is reflected to the host `dir` attribute. RTL affects
19431
+ * visual layout only — previous/next semantics do not change.
19432
+ */
19433
+ readonly _dirInput: _angular_core.InputSignal<WritingDirection | null>;
19434
+ readonly dir: _angular_core.Signal<WritingDirection>;
19435
+ /**
19436
+ * Accessible label for the navigation landmark. Supply this (or point
19437
+ * `aria-labelledby` at a visible label element) when the page contains more
19438
+ * than one `<nav>`. A `null` or empty value emits no attribute.
19439
+ */
19440
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
19441
+ /** The computed visible-page list (page numbers + ellipsis gaps). */
19442
+ readonly items: _angular_core.Signal<readonly PaginationItem[]>;
19443
+ /** Whether the current page is the first (no previous page). */
19444
+ readonly isFirst: _angular_core.Signal<boolean>;
19445
+ /** Whether the current page is the last (no next page). */
19446
+ readonly isLast: _angular_core.Signal<boolean>;
19447
+ /**
19448
+ * Navigate to `page`, clamped to `[1, count]`. No-op when disabled.
19449
+ */
19450
+ goToPage(page: number): void;
19451
+ /** Navigate to the previous page. No-op at the first page or when disabled. */
19452
+ previous(): void;
19453
+ /** Navigate to the next page. No-op at the last page or when disabled. */
19454
+ next(): void;
19455
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForPagination, never>;
19456
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForPagination, "[forPagination]", ["forPagination"], { "page": { "alias": "page"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": true; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "boundaryCount": { "alias": "boundaryCount"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "_dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; }, never, never, true, never>;
18548
19457
  }
18549
19458
 
18550
19459
  /**
18551
- * Defaults inherited by descendant tables in the surrounding injector scope.
18552
- * Configure with `provideForTableDefaults`. The shape is a stub today — present
18553
- * so future per-scope tuning can land without churning the public surface.
19460
+ * Page number button. Apply on a `<button>` so Enter/Space activation is
19461
+ * native. Reflects `aria-current="page"` when this button represents the
19462
+ * currently active page. Clicking calls `ctx.goToPage(page)`.
18554
19463
  */
18555
- interface ForTableDefaults {
19464
+ declare class ForPaginationItem {
19465
+ protected readonly ctx: forty_cdk.ForPaginationContext;
19466
+ /** The 1-based page number this button navigates to. */
19467
+ readonly page: _angular_core.InputSignal<number>;
19468
+ /** Per-item disabled override (in addition to the root's `disabled`). */
19469
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
19470
+ /** Whether this item is effectively disabled (own or root disabled). */
19471
+ readonly effectiveDisabled: _angular_core.Signal<boolean>;
19472
+ /** Whether this button represents the currently active page. */
19473
+ readonly isCurrent: _angular_core.Signal<boolean>;
19474
+ constructor();
19475
+ protected activate(): void;
19476
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForPaginationItem, never>;
19477
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForPaginationItem, "[forPaginationItem]", ["forPaginationItem"], { "page": { "alias": "page"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
18556
19478
  }
18557
- /** Token holding the resolved table defaults for the current scope. */
18558
- declare const FOR_TABLE_DEFAULTS: _angular_core.InjectionToken<ForTableDefaults>;
19479
+
18559
19480
  /**
18560
- * Configures forty-cdk table defaults for this injector scope. Partial
18561
- * overrides inherit unspecified keys from the parent scope (or library
18562
- * defaults at the root).
19481
+ * Previous-page button. Apply on a `<button>` so Enter/Space activation is
19482
+ * native. Disabled (via the native `disabled` attribute) when the current page
19483
+ * is the first page or the root is disabled. Clicking calls `ctx.previous()`.
18563
19484
  */
18564
- declare function provideForTableDefaults(defaults?: Partial<ForTableDefaults>): Provider[];
19485
+ declare class ForPaginationPrevious {
19486
+ protected readonly ctx: forty_cdk.ForPaginationContext;
19487
+ /**
19488
+ * Accessible label for this button (e.g. "Previous page"). When `null`
19489
+ * (default), no `aria-label` is emitted — the consumer should supply a
19490
+ * visible label or set this input.
19491
+ */
19492
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
19493
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
19494
+ constructor();
19495
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForPaginationPrevious, never>;
19496
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForPaginationPrevious, "[forPaginationPrevious]", ["forPaginationPrevious"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19497
+ }
18565
19498
 
18566
19499
  /**
18567
- * Configuration for {@link injectInfiniteScroll}. The consumer owns the data and
18568
- * the fetch; this core only decides *when* to ask for more.
19500
+ * Next-page button. Apply on a `<button>` so Enter/Space activation is
19501
+ * native. Disabled (via the native `disabled` attribute) when the current page
19502
+ * is the last page or the root is disabled. Clicking calls `ctx.next()`.
18569
19503
  */
18570
- interface InfiniteScrollOptions {
19504
+ declare class ForPaginationNext {
19505
+ protected readonly ctx: forty_cdk.ForPaginationContext;
18571
19506
  /**
18572
- * The rendered window, `[firstIndex, lastIndex + 1)` — e.g.
18573
- * `injectVirtualizer(...).range`. An empty `[0, 0]` window never fires.
19507
+ * Accessible label for this button (e.g. "Next page"). When `null`
19508
+ * (default), no `aria-label` is emitted — the consumer should supply a
19509
+ * visible label or set this input.
18574
19510
  */
18575
- readonly range: Signal<readonly [number, number]>;
18576
- /** Reactive total number of currently-loaded items. */
18577
- readonly count: Signal<number>;
19511
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
19512
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
19513
+ constructor();
19514
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForPaginationNext, never>;
19515
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForPaginationNext, "[forPaginationNext]", ["forPaginationNext"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19516
+ }
19517
+
19518
+ /**
19519
+ * Defaults inherited by descendant paginations in the surrounding injector
19520
+ * scope. Configure with `provideForPaginationDefaults` at the application root
19521
+ * or in any component's `providers`; partial overrides merge with the parent.
19522
+ */
19523
+ interface ForPaginationDefaults {
19524
+ /** Pages shown on each side of the current page before collapsing to an ellipsis. */
19525
+ siblingCount: number;
19526
+ /** Pages always shown at each end (first/last). */
19527
+ boundaryCount: number;
19528
+ }
19529
+ /** Token holding the resolved pagination defaults for the current scope. */
19530
+ declare const FOR_PAGINATION_DEFAULTS: _angular_core.InjectionToken<ForPaginationDefaults>;
19531
+ /**
19532
+ * Configures forty-cdk pagination defaults for this injector scope. Partial
19533
+ * overrides inherit unspecified keys from the parent scope (or library defaults
19534
+ * at the root).
19535
+ */
19536
+ declare function provideForPaginationDefaults(defaults?: Partial<ForPaginationDefaults>): Provider[];
19537
+
19538
+ /**
19539
+ * Headless breadcrumb trail implementing the
19540
+ * [WAI-ARIA Breadcrumb pattern](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/):
19541
+ * a `navigation` landmark wrapping a set of links that reveal the page's
19542
+ * position within the site hierarchy.
19543
+ *
19544
+ * The directive contributes only the landmark role + accessible name; the
19545
+ * consumer owns the markup structure (an `<ol>` of `<li>` links is the APG
19546
+ * recommendation) and applies their own styles. Each link decorated with
19547
+ * `[forBreadcrumbItem]` can mark itself the current page via `current`, and
19548
+ * visual dividers decorated with `[forBreadcrumbSeparator]` are hidden from
19549
+ * assistive technology.
19550
+ *
19551
+ * There is no keyboard interaction or focus management beyond what the native
19552
+ * links provide — breadcrumb links are ordinary tab stops.
19553
+ *
19554
+ * @example
19555
+ * ```html
19556
+ * <nav forBreadcrumbs>
19557
+ * <ol>
19558
+ * <li><a forBreadcrumbItem href="/">Home</a></li>
19559
+ * <li forBreadcrumbSeparator aria-hidden="true">/</li>
19560
+ * <li><a forBreadcrumbItem href="/library">Library</a></li>
19561
+ * <li forBreadcrumbSeparator aria-hidden="true">/</li>
19562
+ * <li><a forBreadcrumbItem href="/library/data" current>Data</a></li>
19563
+ * </ol>
19564
+ * </nav>
19565
+ * ```
19566
+ */
19567
+ declare class ForBreadcrumbs {
18578
19568
  /**
18579
- * Fire when the window's last index comes within this many items of `count`.
18580
- * Defaults to `5` (mirrors the windowing core's default overscan).
19569
+ * Accessible label for the navigation landmark. Defaults to `'Breadcrumb'`
19570
+ * so a bare `<nav forBreadcrumbs>` is already a correctly labelled landmark —
19571
+ * the conventional name for this pattern. Override it (or point a native
19572
+ * `aria-labelledby` at a visible heading) when the page hosts more than one
19573
+ * breadcrumb trail and they need to be told apart.
18581
19574
  */
18582
- readonly threshold?: number;
18583
- /** When this resolves to `true` the detector never fires. */
18584
- readonly disabled?: Signal<boolean>;
19575
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
19576
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForBreadcrumbs, never>;
19577
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForBreadcrumbs, "[forBreadcrumbs]", ["forBreadcrumbs"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19578
+ }
19579
+
19580
+ /**
19581
+ * A single link within a breadcrumb trail. Apply on an `<a>` so navigation is
19582
+ * native. Set `current` on the link that points to the page the user is on —
19583
+ * it reflects [`aria-current="page"`](https://www.w3.org/TR/wai-aria-1.2/#aria-current)
19584
+ * so assistive technology announces it as the current location.
19585
+ */
19586
+ declare class ForBreadcrumbItem {
18585
19587
  /**
18586
- * Called once per threshold crossing. If it returns a promise, the next fire
18587
- * is suppressed until that promise settles (`pending` reflects the in-flight
18588
- * state); the detector re-arms when `count` grows.
19588
+ * Whether this item represents the page the user is currently on. The
19589
+ * current item reflects `aria-current="page"`; all others emit no
19590
+ * `aria-current` attribute.
18589
19591
  */
18590
- readonly onLoadMore: () => void | Promise<unknown>;
19592
+ readonly current: _angular_core.InputSignalWithTransform<boolean, unknown>;
19593
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForBreadcrumbItem, never>;
19594
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForBreadcrumbItem, "[forBreadcrumbItem]", ["forBreadcrumbItem"], { "current": { "alias": "current"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
18591
19595
  }
18592
- /** Reactive handle returned by {@link injectInfiniteScroll}. */
18593
- interface ForInfiniteScroll {
18594
- /** True while an `onLoadMore` promise is in flight. */
18595
- readonly pending: Signal<boolean>;
19596
+
19597
+ /**
19598
+ * Decorative divider rendered between breadcrumb items (a `/`, `>`, chevron,
19599
+ * etc.). Reflects `aria-hidden="true"` so assistive technology skips it — the
19600
+ * trail's structure is already conveyed by the list and the links, making the
19601
+ * visual separator redundant in the accessibility tree.
19602
+ */
19603
+ declare class ForBreadcrumbSeparator {
19604
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForBreadcrumbSeparator, never>;
19605
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForBreadcrumbSeparator, "[forBreadcrumbSeparator]", ["forBreadcrumbSeparator"], {}, {}, never, never, true, never>;
18596
19606
  }
19607
+
18597
19608
  /**
18598
- * Headless infinite-scroll detector: composes on top of any windowed list's
18599
- * `range` + `count` signals and fires `onLoadMore` once per threshold crossing,
18600
- * suppressing re-fire while a returned promise is pending and re-arming when
18601
- * `count` grows (a page was appended). It owns no DOM, adds no scroll listener —
18602
- * the trigger rides the existing reactive recompute — and is SSR-safe by
18603
- * construction: off-browser the window is `[0, 0]`, so it never fires.
18604
- *
18605
- * Must be called from an injection context (a component/directive constructor
18606
- * or field initializer).
18607
- *
18608
- * @param options Reactive `range` + `count`, an optional `threshold`/`disabled`,
18609
- * and the `onLoadMore` callback.
18610
- * @returns A {@link ForInfiniteScroll} handle exposing the `pending` signal.
19609
+ * Defaults inherited by descendant breadcrumbs in the surrounding injector
19610
+ * scope. Configure with `provideForBreadcrumbsDefaults`. The shape is a stub
19611
+ * today — present so future per-scope tuning can land without churning the
19612
+ * public surface.
19613
+ */
19614
+ interface ForBreadcrumbsDefaults {
19615
+ }
19616
+ /** Token holding the resolved breadcrumbs defaults for the current scope. */
19617
+ declare const FOR_BREADCRUMBS_DEFAULTS: _angular_core.InjectionToken<ForBreadcrumbsDefaults>;
19618
+ /**
19619
+ * Configures forty-cdk breadcrumbs defaults for this injector scope. Partial
19620
+ * overrides inherit unspecified keys from the parent scope (or library
19621
+ * defaults at the root).
18611
19622
  */
18612
- declare function injectInfiniteScroll(options: InfiniteScrollOptions): ForInfiniteScroll;
19623
+ declare function provideForBreadcrumbsDefaults(defaults?: Partial<ForBreadcrumbsDefaults>): Provider[];
18613
19624
 
18614
19625
  /**
18615
- * Coordination surface a {@link ForVirtualViewport} exposes to the
18616
- * `*forVirtualFor` structural directive nested inside it.
19626
+ * Shared state contract between the pieces of a FileUpload primitive.
19627
+ * Provided by `ForFileUpload`, consumed by `ForFileUploadInput` and
19628
+ * `ForFileUploadTrigger`.
18617
19629
  */
18618
- interface ForVirtualViewportContext {
18619
- /** The items in the currently visible window plus overscan. */
18620
- readonly virtualItems: Signal<readonly VirtualItem[]>;
18621
- /** The total number of items in the full (non-windowed) list. */
18622
- readonly count: Signal<number>;
18623
- /** Scroll axis, resolved once when the viewport initializes. */
18624
- readonly orientation: Signal<'vertical' | 'horizontal'>;
19630
+ interface ForFileUploadContext {
19631
+ readonly accept: Signal<string | null>;
19632
+ readonly multiple: Signal<boolean>;
19633
+ readonly directory: Signal<boolean>;
19634
+ readonly disabled: Signal<boolean>;
19635
+ /** Registers the native `<input type="file">` so the root can open the dialog and sync dropped files. */
19636
+ registerInput(el: HTMLInputElement): void;
19637
+ /** Opens the native file chooser dialog by programmatically clicking the registered input. */
19638
+ openFileDialog(): void;
19639
+ /** Emits `filesChange` with the given `FileList` if it is non-empty. */
19640
+ emitFiles(files: FileList): void;
18625
19641
  }
18626
- /** DI token carrying the {@link ForVirtualViewportContext}. */
18627
- declare const FOR_VIRTUAL_VIEWPORT_CONTEXT: InjectionToken<ForVirtualViewportContext>;
19642
+ declare const FOR_FILE_UPLOAD_CONTEXT: InjectionToken<ForFileUploadContext>;
18628
19643
 
18629
19644
  /**
18630
- * Scroll viewport for the ergonomic virtualization layer. Decorate a fixed-size
18631
- * scroll container with `[forVirtualViewport]`, give it `[virtualCount]` and an
18632
- * `[estimateSize]`, and nest a single `*forVirtualFor` inside it — the viewport
18633
- * owns the scroll container, the total-size sizer, and the windowing core, so
18634
- * the consumer writes no manual spacer or position transform.
18635
- *
18636
- * Built on the headless {@link injectVirtualizer} core; for full manual control
18637
- * (custom DOM, dynamic measurement, window/document scroller) use that directly.
19645
+ * Root drop zone for the FileUpload primitive. Composes with
19646
+ * `[forFileUploadInput]` (the accessible native file input) and
19647
+ * `[forFileUploadTrigger]` (the button that opens the dialog).
18638
19648
  *
18639
- * The viewport forces `overflow: auto` on its host and renders a relatively
18640
- * positioned sizer whose main-axis size tracks `totalSize()`; `*forVirtualFor`
18641
- * projects its rows into that sizer and positions each one absolutely.
19649
+ * `filesChange` is a plain `output<FileList>()` — this primitive is not a
19650
+ * Signal Forms control; the native `<input type="file">` is the form participant.
18642
19651
  *
18643
- * `orientation` and `overscan` are read once when the viewport initializes;
18644
- * change them before first render, not at runtime.
19652
+ * Reflects `data-dragging` while files are dragged over the zone and
19653
+ * `data-disabled` when the input is disabled.
18645
19654
  */
18646
- declare class ForVirtualViewport implements ForVirtualViewportContext, OnInit {
19655
+ declare class ForFileUpload implements ForFileUploadContext {
18647
19656
  #private;
18648
- /** Total number of items in the full list. */
18649
- readonly virtualCount: _angular_core.InputSignal<number>;
18650
- /** Estimated item size in px along the scroll axis: a number or a per-index estimator. */
18651
- readonly estimateSize: _angular_core.InputSignal<number | ((index: number) => number)>;
18652
- /** Scroll axis. Resolved once on init; runtime changes are not tracked by the core. */
18653
- readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
18654
- /** Items rendered beyond the visible window on each side. Resolved once on init. */
18655
- readonly overscan: _angular_core.InputSignal<number>;
18656
- /** Stable key for the item at `index`. Defaults to the index. */
18657
- readonly getItemKey: _angular_core.InputSignal<((index: number) => string | number) | undefined>;
18658
- /**
18659
- * Emits when the rendered window comes within ~`overscan` items of the end of
18660
- * the list, signalling the consumer to load the next page. Built on
18661
- * {@link injectInfiniteScroll}; fires once per threshold crossing and re-arms
18662
- * when the bound count grows. The consumer owns the fetch (e.g. via `resource()`).
18663
- */
18664
- readonly endReached: _angular_core.OutputEmitterRef<void>;
18665
- /** The total number of items in the full (non-windowed) list. */
18666
- readonly count: Signal<number>;
18667
- /** The items in the currently visible window plus overscan. */
18668
- readonly virtualItems: Signal<readonly VirtualItem[]>;
18669
- /** Total scroll size of all items, in pixels (drives the sizer). */
18670
- readonly totalSize: Signal<number>;
18671
- protected readonly sizerWidth: Signal<string>;
18672
- protected readonly sizerHeight: Signal<string>;
18673
- ngOnInit(): void;
18674
- /** Scroll the container so the item at `index` is in view. No-op until initialized. */
18675
- scrollToIndex(index: number, options?: {
18676
- align?: 'start' | 'center' | 'end' | 'auto';
18677
- }): void;
18678
- /** Scroll the container to an absolute pixel offset. No-op until initialized. */
18679
- scrollToOffset(offset: number): void;
18680
- /** Record the measured size of a rendered item element. No-op until initialized. */
18681
- measureElement(element: HTMLElement): void;
18682
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForVirtualViewport, never>;
18683
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ForVirtualViewport, "for-virtual-viewport, [forVirtualViewport]", ["forVirtualViewport"], { "virtualCount": { "alias": "virtualCount"; "required": true; "isSignal": true; }; "estimateSize": { "alias": "estimateSize"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "getItemKey": { "alias": "getItemKey"; "required": false; "isSignal": true; }; }, { "endReached": "endReached"; }, never, ["*"], true, never>;
18684
- }
18685
-
18686
- /** Template context exposed to each row rendered by `*forVirtualFor`. */
18687
- interface ForVirtualForContext<T> {
18688
- /** The row data at this index (`let row`). */
18689
- $implicit: T;
18690
- /** The virtual item metadata: index, key, start offset, size (`let item = virtualItem`). */
18691
- virtualItem: VirtualItem;
18692
- /** The item's index in the full list (`let i = index`). */
18693
- index: number;
18694
- /** The total number of items in the full list (`let n = count`). */
18695
- count: number;
18696
- }
18697
- /**
18698
- * Structural directive that renders only the visible window of a list inside a
18699
- * `[forVirtualViewport]`. Pass the full data array; the directive iterates the
18700
- * viewport's `virtualItems()`, exposes each row plus its `virtualItem` to the
18701
- * template, positions it absolutely (so the consumer writes no transform), and
18702
- * binds `aria-setsize` (true total) / `aria-posinset` (`index + 1`) so screen
18703
- * readers announce the real list size.
19657
+ /** MIME types or file extensions accepted by the file chooser (e.g. `"image/*,.pdf"`). */
19658
+ readonly accept: _angular_core.InputSignal<string | null>;
19659
+ /** Whether multiple files can be selected at once. */
19660
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
19661
+ /**
19662
+ * When `true`, the native picker selects a whole folder; the emitted
19663
+ * `FileList` then contains every file inside it (each carrying a
19664
+ * `webkitRelativePath` so the consumer can reconstruct the tree).
19665
+ */
19666
+ readonly directory: _angular_core.InputSignalWithTransform<boolean, unknown>;
19667
+ /** Whether the file upload zone and all its pieces are disabled. */
19668
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
19669
+ /** Emitted when files are chosen via the dialog or dropped onto the zone. */
19670
+ readonly filesChange: _angular_core.OutputEmitterRef<FileList>;
19671
+ protected readonly dragging: _angular_core.Signal<boolean>;
19672
+ /** Registers the native input so the root can open the dialog and sync dropped files. */
19673
+ registerInput(el: HTMLInputElement): void;
19674
+ /** Opens the native file chooser dialog if not disabled. */
19675
+ openFileDialog(): void;
19676
+ /** Emits `filesChange` with the provided `FileList` if it contains at least one file. */
19677
+ emitFiles(files: FileList): void;
19678
+ protected onDragEnter(event: DragEvent): void;
19679
+ protected onDragOver(event: DragEvent): void;
19680
+ protected onDragLeave(): void;
19681
+ protected onDrop(event: DragEvent): void;
19682
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForFileUpload, never>;
19683
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForFileUpload, "[forFileUpload]", ["forFileUpload"], { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "directory": { "alias": "directory"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "filesChange": "filesChange"; }, never, never, true, never>;
19684
+ }
19685
+
19686
+ /**
19687
+ * The native `<input type="file">` piece of the FileUpload primitive.
19688
+ * Apply on a real `<input>` element inside `[forFileUpload]`.
19689
+ *
19690
+ * The directive forces `type="file"` and mirrors `accept`, `multiple`,
19691
+ * `directory` (as `webkitdirectory`), and `disabled` from the root context.
19692
+ * When the user selects files via the native dialog the `change` event emits
19693
+ * `filesChange` on the root.
19694
+ *
19695
+ * Consumers are expected to visually hide this input with their own CSS
19696
+ * (e.g. an `sr-only` / `visually-hidden` utility) while keeping it focusable
19697
+ * so keyboard users and assistive technology can activate it directly. The
19698
+ * directive never sets `hidden`, `display:none`, or `visibility:hidden` — it
19699
+ * remains strictly headless.
19700
+ */
19701
+ declare class ForFileUploadInput {
19702
+ #private;
19703
+ protected readonly ctx: forty_cdk.ForFileUploadContext;
19704
+ constructor();
19705
+ protected onChange(): void;
19706
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForFileUploadInput, never>;
19707
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForFileUploadInput, "input[forFileUploadInput]", ["forFileUploadInput"], {}, {}, never, never, true, never>;
19708
+ }
19709
+
19710
+ /**
19711
+ * Trigger button that opens the native file chooser dialog.
19712
+ * Apply on a native `<button>` inside `[forFileUpload]`.
18704
19713
  *
18705
- * ```html
18706
- * <div forVirtualViewport [virtualCount]="rows().length" [estimateSize]="44">
18707
- * <div *forVirtualFor="let row of rows(); let item = virtualItem">{{ row.label }}</div>
18708
- * </div>
18709
- * ```
19714
+ * `type="button"` is forced to prevent accidental form submission.
19715
+ * The native `disabled` attribute is reflected imperatively so the button
19716
+ * is visually and functionally disabled when the root zone is disabled.
18710
19717
  */
18711
- declare class ForVirtualFor<T> {
18712
- #private;
18713
- /** The full list of items to virtualize. */
18714
- readonly forVirtualForOf: _angular_core.InputSignal<readonly T[]>;
19718
+ declare class ForFileUploadTrigger {
19719
+ protected readonly ctx: forty_cdk.ForFileUploadContext;
18715
19720
  constructor();
18716
- /** Narrows the template context type for `let row of …` strict template checking. */
18717
- static ngTemplateContextGuard<T>(_directive: ForVirtualFor<T>, _context: unknown): _context is ForVirtualForContext<T>;
18718
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForVirtualFor<any>, never>;
18719
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForVirtualFor<any>, "[forVirtualFor][forVirtualForOf]", never, { "forVirtualForOf": { "alias": "forVirtualForOf"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
19721
+ protected onClick(): void;
19722
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForFileUploadTrigger, never>;
19723
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForFileUploadTrigger, "[forFileUploadTrigger]", ["forFileUploadTrigger"], {}, {}, never, never, true, never>;
19724
+ }
19725
+
19726
+ /**
19727
+ * Defaults inherited by descendant file-upload zones in the surrounding
19728
+ * injector scope. Configure with `provideForFileUploadDefaults`. The shape
19729
+ * is a stub today — present so future per-scope tuning can land without
19730
+ * churning the public surface.
19731
+ */
19732
+ interface ForFileUploadDefaults {
18720
19733
  }
19734
+ /** Token holding the resolved file-upload defaults for the current scope. */
19735
+ declare const FOR_FILE_UPLOAD_DEFAULTS: _angular_core.InjectionToken<ForFileUploadDefaults>;
19736
+ /**
19737
+ * Configures forty-cdk file-upload defaults for this injector scope. Partial
19738
+ * overrides inherit unspecified keys from the parent scope (or library
19739
+ * defaults at the root).
19740
+ */
19741
+ declare function provideForFileUploadDefaults(defaults?: Partial<ForFileUploadDefaults>): Provider[];
18721
19742
 
18722
- export { DEFAULT_DATE_FIELD_SEGMENT_LABELS, DEFAULT_TIME_FIELD_SEGMENT_LABELS, DEFAULT_TOAST_REGION, FOR_ACCORDION_CONTEXT, FOR_ACCORDION_DEFAULTS, FOR_ACCORDION_ITEM_CONTEXT, FOR_ASPECT_RATIO_DEFAULTS, FOR_AVATAR_CONTEXT, FOR_AVATAR_DEFAULTS, FOR_CALENDAR_CONTEXT, FOR_CALENDAR_DEFAULTS, FOR_CAROUSEL_CONTEXT, FOR_CAROUSEL_DEFAULTS, FOR_CHECKBOX, FOR_CHECKBOX_DEFAULTS, FOR_CHECKBOX_HOST_DIRECTIVE_INPUTS, FOR_CHECKBOX_HOST_DIRECTIVE_OUTPUTS, FOR_COMBOBOX_CONTEXT, FOR_COMBOBOX_DEFAULTS, FOR_COMBOBOX_HOST_DIRECTIVE_INPUTS, FOR_COMBOBOX_HOST_DIRECTIVE_OUTPUTS, FOR_COMBOBOX_OPTION, FOR_CONTEXT_MENU_CONTEXT, FOR_CONTEXT_MENU_DEFAULTS, FOR_DATE_ADAPTER, FOR_DATE_FIELD_CONTEXT, FOR_DATE_FIELD_DEFAULTS, FOR_DATE_FIELD_HOST_DIRECTIVE_INPUTS, FOR_DATE_FIELD_HOST_DIRECTIVE_OUTPUTS, FOR_DATE_PICKER_CONTEXT, FOR_DATE_PICKER_DEFAULTS, FOR_DATE_PICKER_HOST_DIRECTIVE_INPUTS, FOR_DATE_PICKER_HOST_DIRECTIVE_OUTPUTS, FOR_DIALOG_CONTEXT, FOR_DIALOG_DATA, FOR_DIALOG_DEFAULTS, FOR_DISCLOSURE_CONTEXT, FOR_DISCLOSURE_DEFAULTS, FOR_DRAG_DROP_CONTEXT, FOR_DRAG_DROP_DEFAULTS, FOR_DRAWER_CONTEXT, FOR_DRAWER_DATA, FOR_DRAWER_DEFAULTS, FOR_DROPDOWN_MENU_DEFAULTS, FOR_DROP_LIST_GROUP, FOR_FIELDSET_CONTEXT, FOR_FIELDSET_DEFAULTS, FOR_FIELD_CONTEXT, FOR_FIELD_DEFAULTS, FOR_HOVER_CARD_CONTEXT, FOR_HOVER_CARD_DEFAULTS, FOR_ID_SALT, FOR_INPUT_DEFAULTS, FOR_INPUT_HOST_DIRECTIVE_INPUTS, FOR_INPUT_HOST_DIRECTIVE_OUTPUTS, FOR_LISTBOX_CONTEXT, FOR_LISTBOX_DEFAULTS, FOR_LISTBOX_HOST_DIRECTIVE_INPUTS, FOR_LISTBOX_HOST_DIRECTIVE_OUTPUTS, FOR_LISTBOX_OPTION, FOR_MENUBAR_CONTEXT, FOR_MENUBAR_DEFAULTS, FOR_MENU_CHECKBOX_ITEM, FOR_MENU_CONTEXT, FOR_MENU_DEFAULTS, FOR_MENU_GROUP_CONTEXT, FOR_MENU_RADIO_GROUP_CONTEXT, FOR_MENU_RADIO_ITEM, FOR_METER_CONTEXT, FOR_METER_DEFAULTS, FOR_NAVIGATION_MENU_CONTEXT, FOR_NAVIGATION_MENU_DEFAULTS, FOR_NAVIGATION_MENU_ITEM_CONTEXT, FOR_NUMBER_INPUT_DEFAULTS, FOR_NUMBER_INPUT_GROUP, FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS, FOR_NUMBER_INPUT_HOST_DIRECTIVE_OUTPUTS, FOR_OTP_INPUT_CONTEXT, FOR_OTP_INPUT_DEFAULTS, FOR_OTP_INPUT_HOST_DIRECTIVE_INPUTS, FOR_OTP_INPUT_HOST_DIRECTIVE_OUTPUTS, FOR_PANE_RESIZER_DEFAULTS, FOR_POPOVER_CONTEXT, FOR_POPOVER_DEFAULTS, FOR_PROGRESS_CONTEXT, FOR_PROGRESS_DEFAULTS, FOR_RADIO, FOR_RADIO_GROUP_CONTEXT, FOR_RADIO_GROUP_DEFAULTS, FOR_RADIO_GROUP_HOST_DIRECTIVE_INPUTS, FOR_RADIO_GROUP_HOST_DIRECTIVE_OUTPUTS, FOR_SCROLL_AREA_CONTEXT, FOR_SCROLL_AREA_DEFAULTS, FOR_SELECT_CONTEXT, FOR_SELECT_DEFAULTS, FOR_SELECT_HOST_DIRECTIVE_INPUTS, FOR_SELECT_HOST_DIRECTIVE_OUTPUTS, FOR_SELECT_OPTION, FOR_SEPARATOR_DEFAULTS, FOR_SLIDER_CONTEXT, FOR_SLIDER_DEFAULTS, FOR_SLIDER_HOST_DIRECTIVE_INPUTS, FOR_SLIDER_HOST_DIRECTIVE_OUTPUTS, FOR_STEPPER_CONTEXT, FOR_STEPPER_DEFAULTS, FOR_STEPPER_ITEM_CONTEXT, FOR_SWITCH_DEFAULTS, FOR_SWITCH_HOST_DIRECTIVE_INPUTS, FOR_SWITCH_HOST_DIRECTIVE_OUTPUTS, FOR_TABLE_CONTEXT, FOR_TABLE_DEFAULTS, FOR_TABS_CONTEXT, FOR_TABS_DEFAULTS, FOR_TEXTAREA_HOST_DIRECTIVE_INPUTS, FOR_TEXTAREA_HOST_DIRECTIVE_OUTPUTS, FOR_TIME_FIELD_CONTEXT, FOR_TIME_FIELD_DEFAULTS, FOR_TIME_FIELD_HOST_DIRECTIVE_INPUTS, FOR_TIME_FIELD_HOST_DIRECTIVE_OUTPUTS, FOR_TIME_PICKER_CONTEXT, FOR_TIME_PICKER_DEFAULTS, FOR_TIME_PICKER_HOST_DIRECTIVE_INPUTS, FOR_TIME_PICKER_HOST_DIRECTIVE_OUTPUTS, FOR_TOAST_CONTEXT, FOR_TOAST_DEFAULTS, FOR_TOGGLE_DEFAULTS, FOR_TOGGLE_GROUP_CONTEXT, FOR_TOGGLE_GROUP_HOST_DIRECTIVE_INPUTS, FOR_TOGGLE_GROUP_HOST_DIRECTIVE_OUTPUTS, FOR_TOGGLE_HOST_DIRECTIVE_INPUTS, FOR_TOGGLE_HOST_DIRECTIVE_OUTPUTS, FOR_TOOLBAR_CONTEXT, FOR_TOOLBAR_DEFAULTS, FOR_TOOLTIP_CONTEXT, FOR_TOOLTIP_DEFAULTS, FOR_TREE_CONTAINER_CONTEXT, FOR_TREE_CONTEXT, FOR_TREE_DEFAULTS, FOR_TREE_ITEM_CONTEXT, FOR_TREE_NODE_DRAG_CONTEXT, FOR_VIRTUAL_VIEWPORT_CONTEXT, ForAccordion, ForAccordionContent, ForAccordionItem, ForAccordionTrigger, ForAspectRatio, ForAvatar, ForAvatarFallback, ForAvatarImage, ForCalendar, ForCalendarCell, ForCalendarGrid, ForCalendarGridHeader, ForCalendarHeading, ForCalendarMonthCell, ForCalendarMonthGrid, ForCalendarMonthSelect, ForCalendarNextButton, ForCalendarPrevButton, ForCalendarViewTrigger, ForCalendarYearCell, ForCalendarYearGrid, ForCalendarYearSelect, ForCarousel, ForCarouselDrag, ForCarouselIndicator, ForCarouselIndicators, ForCarouselNext, ForCarouselPrevious, ForCarouselRotationControl, ForCarouselSlide, ForCarouselTrack, ForCarouselViewport, ForCheckbox, ForCheckboxIndicator, ForCombobox, ForComboboxAnchor, ForComboboxChip, ForComboboxChipRemove, ForComboboxChips, ForComboboxClear, ForComboboxContent, ForComboboxEmpty, ForComboboxGroup, ForComboboxGroupLabel, ForComboboxIndicator, ForComboboxInput, ForComboboxList, ForComboboxOption, ForComboboxSeparator, ForComboboxStatus, ForComboboxTrigger, ForContextMenu, ForContextMenuTrigger, ForDateField, ForDateFieldLiteral, ForDateFieldSegment, ForDatePicker, ForDatePickerContent, ForDatePickerTrigger, ForDatePickerValue, ForDialog, ForDialogBackdrop, ForDialogClose, ForDialogDescription, ForDialogManager, ForDialogRef, ForDialogTitle, ForDialogTrigger, ForDisclosure, ForDisclosureContent, ForDisclosureTrigger, ForDragHandle, ForDragPlaceholder, ForDragPreview, ForDraggable, ForDrawer, ForDrawerBackdrop, ForDrawerClose, ForDrawerDescription, ForDrawerHandle, ForDrawerManager, ForDrawerRef, ForDrawerTitle, ForDrawerTrigger, ForDrawerWrapper, ForDropList, ForDropListGroup, ForDropdownMenu, ForDropdownMenuTrigger, ForField, ForFieldControl, ForFieldDescription, ForFieldError, ForFieldset, ForFieldsetLegend, ForHoverCard, ForHoverCardArrow, ForHoverCardContent, ForHoverCardTrigger, ForInput, ForLabel, ForListbox, ForListboxGroup, ForListboxGroupLabel, ForListboxOption, ForListboxOptionIndicator, ForMenuCheckboxItem, ForMenuContent, ForMenuGroup, ForMenuGroupLabel, ForMenuItem, ForMenuItemIndicator, ForMenuRadioGroup, ForMenuRadioItem, ForMenuSeparator, ForMenuSub, ForMenuSubTrigger, ForMenubar, ForMenubarTrigger, ForMeter, ForMeterIndicator, ForNavigationMenu, ForNavigationMenuContent, ForNavigationMenuIndicator, ForNavigationMenuItem, ForNavigationMenuLink, ForNavigationMenuList, ForNavigationMenuTrigger, ForNavigationMenuViewport, ForNumberInput, ForNumberInputDecrement, ForNumberInputGroup, ForNumberInputIncrement, ForOtpInput, ForOtpInputSlot, ForPaneResizer, ForPopover, ForPopoverAnchor, ForPopoverArrow, ForPopoverClose, ForPopoverContent, ForPopoverDescription, ForPopoverTitle, ForPopoverTrigger, ForProgress, ForProgressIndicator, ForRadio, ForRadioGroup, ForRadioIndicator, ForScrollArea, ForScrollAreaContent, ForScrollAreaCorner, ForScrollAreaScrollbar, ForScrollAreaThumb, ForScrollAreaViewport, ForSelect, ForSelectAnchor, ForSelectContent, ForSelectGroup, ForSelectGroupLabel, ForSelectIndicator, ForSelectOption, ForSelectSeparator, ForSelectTrigger, ForSelectValue, ForSeparator, ForSlider, ForSliderRange, ForSliderThumb, ForSliderTrack, ForStepper, ForStepperCompletedContent, ForStepperContent, ForStepperIndicator, ForStepperItem, ForStepperList, ForStepperNext, ForStepperPrevious, ForStepperProgress, ForStepperSeparator, ForStepperTrigger, ForSwitch, ForTable, ForTableCell, ForTableColumnReorder, ForTableColumnResizer, ForTableHeaderCell, ForTableHeaderRow, ForTableRow, ForTableRowReorder, ForTableRowSelector, ForTableSelectAll, ForTableSortHeader, ForTableVirtualized, ForTabs, ForTabsContent, ForTabsList, ForTabsTrigger, ForTextarea, ForTimeField, ForTimeFieldLiteral, ForTimeFieldSegment, ForTimePicker, ForTimePickerContent, ForTimePickerOption, ForTimePickerTrigger, ForTimePickerValue, ForToast, ForToastAction, ForToastClose, ForToastDescription, ForToastManager, ForToastRef, ForToastTitle, ForToastViewport, ForToggle, ForToggleGroup, ForToggleGroupItem, ForToolbar, ForToolbarButton, ForToolbarLink, ForToolbarSeparator, ForTooltip, ForTooltipArrow, ForTooltipContent, ForTooltipTrigger, ForTree, ForTreeGroup, ForTreeItem, ForTreeItemCheckbox, ForTreeItemCheckboxIndicator, ForTreeItemLabel, ForTreeItemToggle, ForTreeNodeDrag, ForTreeNodeDragHandle, ForVirtualFor, ForVirtualViewport, NativeDateAdapter, OTP_REGEXP_ONLY_CHARS, OTP_REGEXP_ONLY_DIGITS, OTP_REGEXP_ONLY_DIGITS_AND_CHARS, assertTimeCapable, buildTimeSlots, expandToReveal, forSingleValueField, injectDateAdapter, injectDialogData, injectDrawerData, injectFieldWiring, injectInfiniteScroll, injectNumberInputGroup, injectVirtualizer, moveItemInArray, moveTreeNode, provideForAccordionDefaults, provideForAspectRatioDefaults, provideForAvatarDefaults, provideForCalendarDefaults, provideForCarouselDefaults, provideForCheckboxDefaults, provideForComboboxDefaults, provideForContextMenuDefaults, provideForDateFieldDefaults, provideForDatePickerDefaults, provideForDialogDefaults, provideForDisclosureDefaults, provideForDragDropDefaults, provideForDrawerDefaults, provideForDropdownMenuDefaults, provideForFieldDefaults, provideForFieldsetDefaults, provideForHoverCardDefaults, provideForIdSalt, provideForInputDefaults, provideForListboxDefaults, provideForMenuDefaults, provideForMenubarDefaults, provideForMeterDefaults, provideForNavigationMenuDefaults, provideForNumberInputDefaults, provideForOtpInputDefaults, provideForPaneResizerDefaults, provideForPopoverDefaults, provideForProgressDefaults, provideForRadioGroupDefaults, provideForScrollAreaDefaults, provideForSelectDefaults, provideForSeparatorDefaults, provideForSliderDefaults, provideForStepperDefaults, provideForSwitchDefaults, provideForTableDefaults, provideForTabsDefaults, provideForTimeFieldDefaults, provideForTimePickerDefaults, provideForToastDefaults, provideForToggleDefaults, provideForToolbarDefaults, provideForTooltipDefaults, provideForTreeDefaults, provideNativeDateAdapter, transferArrayItem };
18723
- export type { CalendarDateLabelFormatter, CalendarDateRange, CalendarDayCell, CalendarMonthOption, CalendarMonthRow, CalendarView, CalendarWeek, CalendarWeekday, CalendarYearOption, CalendarYearRow, CarouselAlign, DateAdapter, DateFieldSegment, DateSegmentType, SegmentType as DateTimeSegmentType, FieldControlHandle, FieldGranularity, ForAccordionContext, ForAccordionDefaults, ForAccordionItemContext, ForAspectRatioDefaults, ForAvatarContext, ForAvatarDefaults, ForAvatarStatus, ForCalendarCellHandle, ForCalendarContext, ForCalendarDefaults, ForCalendarMonthCellHandle, ForCalendarYearCellHandle, ForCarouselContext, ForCarouselDefaults, ForCheckboxDefaults, ForComboboxAutocomplete, ForComboboxChipHandle, ForComboboxCloseReason, ForComboboxContext, ForComboboxDefaults, ForComboboxInitialFocus, ForComboboxOptionHandle, ForContextMenuContext, ForContextMenuDefaults, ForDateFieldContext, ForDateFieldDefaults, ForDateFieldSegmentHandle, ForDateFieldSegmentLabels, ForDatePickerContext, ForDatePickerDefaults, ForDialogCloseReason, ForDialogContext, ForDialogDefaults, ForDialogOpenConfig, ForDisclosureContext, ForDisclosureDefaults, ForDragDropDefaults, ForDragDropEvent, ForDragEndEvent, ForDragStartEvent, ForDraggableHandle, ForDrawerCloseReason, ForDrawerContext, ForDrawerDefaults, ForDrawerDragEvent, ForDrawerOpenConfig, ForDrawerReleaseEvent, ForDrawerSide, ForDrawerSnapPoint, ForDropListContext, ForDropdownMenuDefaults, ForFieldContext, ForFieldDefaults, ForFieldsetContext, ForFieldsetDefaults, ForHoverCardContext, ForHoverCardDefaults, ForInfiniteScroll, ForInputDefaults, ForListboxContext, ForListboxDefaults, ForMenuCloseReason, ForMenuContext, ForMenuDefaults, ForMenuGroupContext, ForMenuItemHandle, ForMenuRadioGroupContext, ForMenubarContext, ForMenubarDefaults, ForMenubarTriggerHandle, ForMeterContext, ForMeterDefaults, ForMeterQuality, ForNavigationMenuContentHandle, ForNavigationMenuContext, ForNavigationMenuDefaults, ForNavigationMenuItemContext, ForNavigationMenuMotion, ForNavigationMenuTriggerHandle, ForNavigationMenuViewportHandle, ForNumberInputContext, ForNumberInputDefaults, ForNumberInputGroupContext, ForOtpInputContext, ForOtpInputDefaults, ForPaneResizerDefaults, ForPopoverContext, ForPopoverDefaults, ForProgressContext, ForProgressDefaults, ForProgressState, ForRadioGroupContext, ForRadioGroupDefaults, ForScrollAreaContext, ForScrollAreaDefaults, ForScrollAreaType, ForScrollbarOrientation, ForSelectCloseReason, ForSelectContext, ForSelectDefaults, ForSelectInitialFocus, ForSelectOptionHandle, ForSeparatorDefaults, ForSliderContext, ForSliderDefaults, ForSliderThumbHandle, ForStepperContentHandle, ForStepperContext, ForStepperDefaults, ForStepperItemContext, ForStepperItemHandle, ForStepperTriggerHandle, ForSwitchDefaults, ForTableCellHandle, ForTableContext, ForTableDefaults, ForTableRowHandle, ForTabsContext, ForTabsDefaults, ForTimeFieldContext, ForTimeFieldDefaults, ForTimeFieldSegmentHandle, ForTimeFieldSegmentLabels, ForTimePickerCloseReason, ForTimePickerContext, ForTimePickerDefaults, ForTimePickerInitialFocus, ForTimePickerOptionHandle, ForTimeSlot, ForToastCloseReason, ForToastConfig, ForToastContext, ForToastDefaults, ForToastInstance, ForToastSwipeDirection, ForToastTemplateContext, ForToastVariant, ForToggleDefaults, ForToggleGroupContext, ForToggleGroupItemHandle, ForToolbarContext, ForToolbarDefaults, ForToolbarItemHandle, ForTooltipContext, ForTooltipDefaults, ForTreeContainerContext, ForTreeContext, ForTreeDefaults, ForTreeDragDropEvent, ForTreeItemContext, ForTreeItemHandle, ForTreeNodeDragContext, ForTreeVisibleNode, ForVirtualForContext, ForVirtualViewportContext, ForVirtualizer, HoverCardScheduleReason, InfiniteScrollOptions, MenuActivationModality, MoveTreeNodeOptions, NavigationMenuScheduleReason, OtpInputType, SliderArrowKey, StepperActivationMode, StepperMode, SwipeDirection, SwipeEventDetail, TableColumnReorderDescriptor, TableMode, TableResizeDescriptor, TableRowReorderDescriptor, TableSelectAllState, TableSelectionBehavior, TableSelectionMode, TableSortDescriptor, TableSortDirection, TableStickyValue, TabsActivationMode, TimeCapableDateAdapter, TimeFieldSegment, TimeGranularity, TimePickerGranularity, TimeSegmentType, TooltipScheduleReason, VetoableEvent, VetoableNativeEvent, VirtualItem, VirtualizerOptions };
19743
+ export { DEFAULT_DATE_FIELD_SEGMENT_LABELS, DEFAULT_TIME_FIELD_SEGMENT_LABELS, DEFAULT_TOAST_REGION, FOR_ACCORDION_CONTEXT, FOR_ACCORDION_DEFAULTS, FOR_ACCORDION_ITEM_CONTEXT, FOR_ASPECT_RATIO_DEFAULTS, FOR_AVATAR_CONTEXT, FOR_AVATAR_DEFAULTS, FOR_BREADCRUMBS_DEFAULTS, FOR_BUTTON_DEFAULTS, FOR_CALENDAR_CONTEXT, FOR_CALENDAR_DEFAULTS, FOR_CAROUSEL_CONTEXT, FOR_CAROUSEL_DEFAULTS, FOR_CHECKBOX, FOR_CHECKBOX_DEFAULTS, FOR_CHECKBOX_HOST_DIRECTIVE_INPUTS, FOR_CHECKBOX_HOST_DIRECTIVE_OUTPUTS, FOR_COMBOBOX_CONTEXT, FOR_COMBOBOX_DEFAULTS, FOR_COMBOBOX_HOST_DIRECTIVE_INPUTS, FOR_COMBOBOX_HOST_DIRECTIVE_OUTPUTS, FOR_COMBOBOX_OPTION, FOR_CONTEXT_MENU_CONTEXT, FOR_CONTEXT_MENU_DEFAULTS, FOR_DATE_ADAPTER, FOR_DATE_FIELD_CONTEXT, FOR_DATE_FIELD_DEFAULTS, FOR_DATE_FIELD_HOST_DIRECTIVE_INPUTS, FOR_DATE_FIELD_HOST_DIRECTIVE_OUTPUTS, FOR_DATE_PICKER_CONTEXT, FOR_DATE_PICKER_DEFAULTS, FOR_DATE_PICKER_HOST_DIRECTIVE_INPUTS, FOR_DATE_PICKER_HOST_DIRECTIVE_OUTPUTS, FOR_DIALOG_CONTEXT, FOR_DIALOG_DATA, FOR_DIALOG_DEFAULTS, FOR_DISCLOSURE_CONTEXT, FOR_DISCLOSURE_DEFAULTS, FOR_DRAG_DROP_CONTEXT, FOR_DRAG_DROP_DEFAULTS, FOR_DRAWER_CONTEXT, FOR_DRAWER_DATA, FOR_DRAWER_DEFAULTS, FOR_DROPDOWN_MENU_DEFAULTS, FOR_DROP_LIST_DEFAULT_ORIENTATION, FOR_DROP_LIST_GROUP, FOR_FIELDSET_CONTEXT, FOR_FIELDSET_DEFAULTS, FOR_FIELD_CONTEXT, FOR_FIELD_DEFAULTS, FOR_FILE_UPLOAD_CONTEXT, FOR_FILE_UPLOAD_DEFAULTS, FOR_HOVER_CARD_CONTEXT, FOR_HOVER_CARD_DEFAULTS, FOR_ID_SALT, FOR_INPUT_DEFAULTS, FOR_INPUT_HOST_DIRECTIVE_INPUTS, FOR_INPUT_HOST_DIRECTIVE_OUTPUTS, FOR_LISTBOX_CONTEXT, FOR_LISTBOX_DEFAULTS, FOR_LISTBOX_HOST_DIRECTIVE_INPUTS, FOR_LISTBOX_HOST_DIRECTIVE_OUTPUTS, FOR_LISTBOX_OPTION, FOR_MENUBAR_CONTEXT, FOR_MENUBAR_DEFAULTS, FOR_MENU_CHECKBOX_ITEM, FOR_MENU_CONTEXT, FOR_MENU_DEFAULTS, FOR_MENU_GROUP_CONTEXT, FOR_MENU_RADIO_GROUP_CONTEXT, FOR_MENU_RADIO_ITEM, FOR_METER_CONTEXT, FOR_METER_DEFAULTS, FOR_NAVIGATION_MENU_CONTEXT, FOR_NAVIGATION_MENU_DEFAULTS, FOR_NAVIGATION_MENU_ITEM_CONTEXT, FOR_NUMBER_INPUT_DEFAULTS, FOR_NUMBER_INPUT_GROUP, FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS, FOR_NUMBER_INPUT_HOST_DIRECTIVE_OUTPUTS, FOR_OTP_INPUT_CONTEXT, FOR_OTP_INPUT_DEFAULTS, FOR_OTP_INPUT_HOST_DIRECTIVE_INPUTS, FOR_OTP_INPUT_HOST_DIRECTIVE_OUTPUTS, FOR_PAGINATION_CONTEXT, FOR_PAGINATION_DEFAULTS, FOR_PANE_RESIZER_DEFAULTS, FOR_POPOVER_CONTEXT, FOR_POPOVER_DEFAULTS, FOR_PROGRESS_CONTEXT, FOR_PROGRESS_DEFAULTS, FOR_RADIO, FOR_RADIO_GROUP_CONTEXT, FOR_RADIO_GROUP_DEFAULTS, FOR_RADIO_GROUP_HOST_DIRECTIVE_INPUTS, FOR_RADIO_GROUP_HOST_DIRECTIVE_OUTPUTS, FOR_SCROLL_AREA_CONTEXT, FOR_SCROLL_AREA_DEFAULTS, FOR_SEARCH_DEFAULTS, FOR_SEARCH_HOST_DIRECTIVE_INPUTS, FOR_SEARCH_HOST_DIRECTIVE_OUTPUTS, FOR_SELECT_CONTEXT, FOR_SELECT_DEFAULTS, FOR_SELECT_HOST_DIRECTIVE_INPUTS, FOR_SELECT_HOST_DIRECTIVE_OUTPUTS, FOR_SELECT_OPTION, FOR_SEPARATOR_DEFAULTS, FOR_SLIDER_CONTEXT, FOR_SLIDER_DEFAULTS, FOR_SLIDER_HOST_DIRECTIVE_INPUTS, FOR_SLIDER_HOST_DIRECTIVE_OUTPUTS, FOR_STEPPER_CONTEXT, FOR_STEPPER_DEFAULTS, FOR_STEPPER_ITEM_CONTEXT, FOR_SWITCH_DEFAULTS, FOR_SWITCH_HOST_DIRECTIVE_INPUTS, FOR_SWITCH_HOST_DIRECTIVE_OUTPUTS, FOR_TABLE_CONTEXT, FOR_TABLE_DEFAULTS, FOR_TABS_CONTEXT, FOR_TABS_DEFAULTS, FOR_TEXTAREA_HOST_DIRECTIVE_INPUTS, FOR_TEXTAREA_HOST_DIRECTIVE_OUTPUTS, FOR_TIME_FIELD_CONTEXT, FOR_TIME_FIELD_DEFAULTS, FOR_TIME_FIELD_HOST_DIRECTIVE_INPUTS, FOR_TIME_FIELD_HOST_DIRECTIVE_OUTPUTS, FOR_TIME_PICKER_CONTEXT, FOR_TIME_PICKER_DEFAULTS, FOR_TIME_PICKER_HOST_DIRECTIVE_INPUTS, FOR_TIME_PICKER_HOST_DIRECTIVE_OUTPUTS, FOR_TIME_VALUE_SOURCE, FOR_TOAST_CONTEXT, FOR_TOAST_DEFAULTS, FOR_TOGGLE_DEFAULTS, FOR_TOGGLE_GROUP_CONTEXT, FOR_TOGGLE_GROUP_HOST_DIRECTIVE_INPUTS, FOR_TOGGLE_GROUP_HOST_DIRECTIVE_OUTPUTS, FOR_TOGGLE_HOST_DIRECTIVE_INPUTS, FOR_TOGGLE_HOST_DIRECTIVE_OUTPUTS, FOR_TOOLBAR_CONTEXT, FOR_TOOLBAR_DEFAULTS, FOR_TOOLTIP_CONTEXT, FOR_TOOLTIP_DEFAULTS, FOR_TREE_CONTAINER_CONTEXT, FOR_TREE_CONTEXT, FOR_TREE_DEFAULTS, FOR_TREE_ITEM_CONTEXT, FOR_TREE_NODE_DRAG_CONTEXT, ForAccordion, ForAccordionContent, ForAccordionItem, ForAccordionTrigger, ForAspectRatio, ForAvatar, ForAvatarFallback, ForAvatarImage, ForBreadcrumbItem, ForBreadcrumbSeparator, ForBreadcrumbs, ForButton, ForCalendar, ForCalendarCell, ForCalendarGrid, ForCalendarGridHeader, ForCalendarHeading, ForCalendarMonthCell, ForCalendarMonthGrid, ForCalendarMonthSelect, ForCalendarNextButton, ForCalendarPrevButton, ForCalendarViewTrigger, ForCalendarYearCell, ForCalendarYearGrid, ForCalendarYearSelect, ForCarousel, ForCarouselDrag, ForCarouselIndicator, ForCarouselIndicators, ForCarouselNext, ForCarouselPrevious, ForCarouselRotationControl, ForCarouselSlide, ForCarouselTrack, ForCarouselViewport, ForCheckbox, ForCheckboxIndicator, ForCombobox, ForComboboxAnchor, ForComboboxChip, ForComboboxChipRemove, ForComboboxChips, ForComboboxClear, ForComboboxContent, ForComboboxEmpty, ForComboboxGroup, ForComboboxGroupLabel, ForComboboxIndicator, ForComboboxInput, ForComboboxList, ForComboboxOption, ForComboboxSeparator, ForComboboxStatus, ForComboboxTrigger, ForContextMenu, ForContextMenuTrigger, ForDateField, ForDateFieldLiteral, ForDateFieldSegment, ForDatePicker, ForDatePickerAnchor, ForDatePickerContent, ForDatePickerTrigger, ForDatePickerValue, ForDialog, ForDialogBackdrop, ForDialogClose, ForDialogDescription, ForDialogManager, ForDialogRef, ForDialogTitle, ForDialogTrigger, ForDisclosure, ForDisclosureContent, ForDisclosureTrigger, ForDragHandle, ForDragPlaceholder, ForDragPreview, ForDraggable, ForDrawer, ForDrawerBackdrop, ForDrawerClose, ForDrawerDescription, ForDrawerHandle, ForDrawerManager, ForDrawerRef, ForDrawerTitle, ForDrawerTrigger, ForDrawerWrapper, ForDropList, ForDropListGroup, ForDropdownMenu, ForDropdownMenuTrigger, ForField, ForFieldControl, ForFieldDescription, ForFieldError, ForFieldset, ForFieldsetLegend, ForFileUpload, ForFileUploadInput, ForFileUploadTrigger, ForFreeDrag, ForHoverCard, ForHoverCardArrow, ForHoverCardContent, ForHoverCardTrigger, ForInput, ForLabel, ForListbox, ForListboxGroup, ForListboxGroupLabel, ForListboxOption, ForListboxOptionIndicator, ForMenuCheckboxItem, ForMenuContent, ForMenuGroup, ForMenuGroupLabel, ForMenuItem, ForMenuItemIndicator, ForMenuRadioGroup, ForMenuRadioItem, ForMenuSeparator, ForMenuSub, ForMenuSubTrigger, ForMenubar, ForMenubarTrigger, ForMeter, ForMeterIndicator, ForNavigationMenu, ForNavigationMenuContent, ForNavigationMenuIndicator, ForNavigationMenuItem, ForNavigationMenuLink, ForNavigationMenuList, ForNavigationMenuTrigger, ForNavigationMenuViewport, ForNumberInput, ForNumberInputDecrement, ForNumberInputGroup, ForNumberInputIncrement, ForOtpInput, ForOtpInputSlot, ForPagination, ForPaginationItem, ForPaginationNext, ForPaginationPrevious, ForPaneResizer, ForPopover, ForPopoverAnchor, ForPopoverArrow, ForPopoverClose, ForPopoverContent, ForPopoverDescription, ForPopoverTitle, ForPopoverTrigger, ForProgress, ForProgressIndicator, ForRadio, ForRadioGroup, ForRadioIndicator, ForScrollArea, ForScrollAreaContent, ForScrollAreaCorner, ForScrollAreaScrollbar, ForScrollAreaThumb, ForScrollAreaViewport, ForSearch, ForSearchClear, ForSelect, ForSelectAnchor, ForSelectContent, ForSelectGroup, ForSelectGroupLabel, ForSelectIndicator, ForSelectOption, ForSelectSeparator, ForSelectTrigger, ForSelectValue, ForSeparator, ForSlider, ForSliderRange, ForSliderThumb, ForSliderTrack, ForStepper, ForStepperCompletedContent, ForStepperContent, ForStepperIndicator, ForStepperItem, ForStepperList, ForStepperNext, ForStepperPrevious, ForStepperProgress, ForStepperSeparator, ForStepperTrigger, ForSwitch, ForTable, ForTableCell, ForTableColumnReorder, ForTableColumnResizer, ForTableHeaderCell, ForTableHeaderRow, ForTableRow, ForTableRowReorder, ForTableRowSelector, ForTableSelectAll, ForTableSortHeader, ForTabs, ForTabsContent, ForTabsList, ForTabsTrigger, ForTextarea, ForTimeField, ForTimeFieldLiteral, ForTimeFieldSegment, ForTimePicker, ForTimePickerAnchor, ForTimePickerContent, ForTimePickerOption, ForTimePickerTrigger, ForTimePickerValue, ForToast, ForToastAction, ForToastClose, ForToastDescription, ForToastManager, ForToastRef, ForToastTitle, ForToastViewport, ForToggle, ForToggleGroup, ForToggleGroupItem, ForToolbar, ForToolbarButton, ForToolbarLink, ForToolbarSeparator, ForTooltip, ForTooltipArrow, ForTooltipContent, ForTooltipTrigger, ForTree, ForTreeGroup, ForTreeItem, ForTreeItemCheckbox, ForTreeItemCheckboxIndicator, ForTreeItemLabel, ForTreeItemToggle, ForTreeNodeDrag, ForTreeNodeDragHandle, NativeDateAdapter, OTP_REGEXP_ONLY_CHARS, OTP_REGEXP_ONLY_DIGITS, OTP_REGEXP_ONLY_DIGITS_AND_CHARS, assertTimeCapable, buildTimeSlots, expandToReveal, forSingleValueField, injectDateAdapter, injectDialogData, injectDrawerData, injectFieldWiring, injectNumberInputGroup, moveItemInArray, moveTreeNode, provideForAccordionDefaults, provideForAspectRatioDefaults, provideForAvatarDefaults, provideForBreadcrumbsDefaults, provideForButtonDefaults, provideForCalendarDefaults, provideForCarouselDefaults, provideForCheckboxDefaults, provideForComboboxDefaults, provideForContextMenuDefaults, provideForDateFieldDefaults, provideForDatePickerDefaults, provideForDialogDefaults, provideForDisclosureDefaults, provideForDragDropDefaults, provideForDrawerDefaults, provideForDropdownMenuDefaults, provideForFieldDefaults, provideForFieldsetDefaults, provideForFileUploadDefaults, provideForHoverCardDefaults, provideForIdSalt, provideForInputDefaults, provideForListboxDefaults, provideForMenuDefaults, provideForMenubarDefaults, provideForMeterDefaults, provideForNavigationMenuDefaults, provideForNumberInputDefaults, provideForOtpInputDefaults, provideForPaginationDefaults, provideForPaneResizerDefaults, provideForPopoverDefaults, provideForProgressDefaults, provideForRadioGroupDefaults, provideForScrollAreaDefaults, provideForSearchDefaults, provideForSelectDefaults, provideForSeparatorDefaults, provideForSliderDefaults, provideForStepperDefaults, provideForSwitchDefaults, provideForTableDefaults, provideForTabsDefaults, provideForTimeFieldDefaults, provideForTimePickerDefaults, provideForToastDefaults, provideForToggleDefaults, provideForToolbarDefaults, provideForTooltipDefaults, provideForTreeDefaults, provideNativeDateAdapter, transferArrayItem };
19744
+ export type { CalendarDateLabelFormatter, CalendarDateRange, CalendarDayCell, CalendarMonthOption, CalendarMonthRow, CalendarView, CalendarWeek, CalendarWeekday, CalendarYearOption, CalendarYearRow, CarouselAlign, DateAdapter, DateFieldSegment, DateSegmentType, SegmentType as DateTimeSegmentType, FieldControlHandle, FieldGranularity, ForAccordionContext, ForAccordionDefaults, ForAccordionItemContext, ForAspectRatioDefaults, ForAvatarContext, ForAvatarDefaults, ForAvatarStatus, ForBreadcrumbsDefaults, ForButtonDefaults, ForCalendarCellHandle, ForCalendarContext, ForCalendarDefaults, ForCalendarMonthCellHandle, ForCalendarYearCellHandle, ForCarouselContext, ForCarouselDefaults, ForCheckboxDefaults, ForComboboxAutocomplete, ForComboboxChipHandle, ForComboboxCloseReason, ForComboboxContext, ForComboboxDefaults, ForComboboxInitialFocus, ForComboboxOptionHandle, ForContextMenuContext, ForContextMenuDefaults, ForDateFieldContext, ForDateFieldDefaults, ForDateFieldSegmentHandle, ForDateFieldSegmentLabels, ForDatePickerContext, ForDatePickerDefaults, ForDialogCloseReason, ForDialogContext, ForDialogDefaults, ForDialogOpenConfig, ForDisclosureContext, ForDisclosureDefaults, ForDragDropDefaults, ForDragDropEvent, ForDragEndEvent, ForDragStartEvent, ForDraggableHandle, ForDrawerCloseReason, ForDrawerContext, ForDrawerDefaults, ForDrawerDragEvent, ForDrawerOpenConfig, ForDrawerReleaseEvent, ForDrawerSide, ForDrawerSnapPoint, ForDropListContext, ForDropdownMenuDefaults, ForFieldContext, ForFieldDefaults, ForFieldsetContext, ForFieldsetDefaults, ForFileUploadContext, ForFileUploadDefaults, ForHoverCardContext, ForHoverCardDefaults, ForInputDefaults, ForListboxContext, ForListboxDefaults, ForMenuCloseReason, ForMenuContext, ForMenuDefaults, ForMenuGroupContext, ForMenuItemHandle, ForMenuRadioGroupContext, ForMenubarContext, ForMenubarDefaults, ForMenubarTriggerHandle, ForMeterContext, ForMeterDefaults, ForMeterQuality, ForNavigationMenuContentHandle, ForNavigationMenuContext, ForNavigationMenuDefaults, ForNavigationMenuItemContext, ForNavigationMenuMotion, ForNavigationMenuTriggerHandle, ForNavigationMenuViewportHandle, ForNumberInputContext, ForNumberInputDefaults, ForNumberInputGroupContext, ForOtpInputContext, ForOtpInputDefaults, ForPaginationContext, ForPaginationDefaults, ForPaneResizerDefaults, ForPopoverContext, ForPopoverDefaults, ForProgressContext, ForProgressDefaults, ForProgressState, ForRadioGroupContext, ForRadioGroupDefaults, ForScrollAreaContext, ForScrollAreaDefaults, ForScrollAreaType, ForScrollbarOrientation, ForSearchDefaults, ForSelectCloseReason, ForSelectContext, ForSelectDefaults, ForSelectInitialFocus, ForSelectOptionHandle, ForSeparatorDefaults, ForSliderContext, ForSliderDefaults, ForSliderThumbHandle, ForStepperContentHandle, ForStepperContext, ForStepperDefaults, ForStepperItemContext, ForStepperItemHandle, ForStepperTriggerHandle, ForSwitchDefaults, ForTableCellHandle, ForTableContext, ForTableDefaults, ForTableRowHandle, ForTabsContext, ForTabsDefaults, ForTimeFieldContext, ForTimeFieldDefaults, ForTimeFieldSegmentHandle, ForTimeFieldSegmentLabels, ForTimePickerCloseReason, ForTimePickerContext, ForTimePickerDefaults, ForTimePickerInitialFocus, ForTimePickerOptionHandle, ForTimeSlot, ForToastCloseReason, ForToastConfig, ForToastContext, ForToastDefaults, ForToastInstance, ForToastSwipeDirection, ForToastTemplateContext, ForToastVariant, ForToggleDefaults, ForToggleGroupContext, ForToggleGroupItemHandle, ForToolbarContext, ForToolbarDefaults, ForToolbarItemHandle, ForTooltipContext, ForTooltipDefaults, ForTreeContainerContext, ForTreeContext, ForTreeDefaults, ForTreeDragDropEvent, ForTreeDropIndicator, ForTreeItemContext, ForTreeItemHandle, ForTreeNodeDragContext, ForTreeVisibleNode, HoverCardScheduleReason, MenuActivationModality, MoveTreeNodeOptions, NavigationMenuScheduleReason, OtpInputType, PaginationItem, SliderArrowKey, StepperActivationMode, StepperMode, SwipeDirection, SwipeEventDetail, TableColumnReorderDescriptor, TableMode, TableResizeDescriptor, TableRowReorderDescriptor, TableSelectAllState, TableSelectionBehavior, TableSelectionMode, TableSortDescriptor, TableSortDirection, TableStickyValue, TabsActivationMode, TimeCapableDateAdapter, TimeFieldSegment, TimeGranularity, TimePickerGranularity, TimeSegmentType, TimeValueSource, TooltipScheduleReason, VetoableEvent, VetoableNativeEvent };