fold-ng 0.7.0 → 0.9.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,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, Provider, TemplateRef, ElementRef, Signal, Type, Injector, InputSignal, WritableSignal } from '@angular/core';
2
+ import { InjectionToken, Provider, TemplateRef, ElementRef, Signal, Type, Injector, WritableSignal } from '@angular/core';
3
+ import * as fold_ng from 'fold-ng';
3
4
  import { FormValueControl, ValidationError, FormCheckboxControl } from '@angular/forms/signals';
4
5
 
5
6
  /**
@@ -61,8 +62,8 @@ import { FormValueControl, ValidationError, FormCheckboxControl } from '@angular
61
62
  * |----------------|-----------------------|-----------|--------------------------------------------|
62
63
  * | `headerLayout` | `"inset" \| "full"` | `"inset"` | `inset` = header sits over the content column (rails climb its side); `full` = header spans the full width, above the rails. |
63
64
  * | `footerLayout` | `"inset" \| "full"` | `"inset"` | `inset` = footer sits under the content column (rails climb its side); `full` = footer spans the full width, below the rails (the usual player-bar look). Ignored when `footerBehavior="scroll"`. |
64
- * | `footerBehavior`| `"pinned" \| "scroll"`| `"pinned"`| `pinned` = the footer is a fixed row, **always in sight** (a player / status bar) — supports `inset` and `full`. `scroll` = the footer flows at the **end of the content**, revealed when you scroll to the bottom (a legal / support footer) — it lives in the content column (inset), and the shell owns the content scroll, so project *flow* content, not a page that manages its own full-height scroll. |
65
- * | `contentScroll`| `"clip" \| "auto"` | `"clip"` | `clip` = the shell clips the content region; the page inside owns its scroll (`fold-page-layout`). `auto` = the content region scrolls itself, for plain content. Ignored under `footerBehavior="scroll"`. |
65
+ * | `footerBehavior`| `"pinned" \| "scroll"`| `"pinned"`| `pinned` = the footer is a fixed row, **always in sight** (a player / status bar) — supports `inset` and `full`. `scroll` = the footer flows at the **end of the content**, revealed when you scroll to the bottom (a legal / support footer) — it lives in the content column (inset). A short page still pushes it to the bottom (the content grows to fill), and a tall page reveals it below the fold; you never manage that. |
66
+ * | `scroll` | `"scroll" \| "stage"` | `"scroll"`| **Who owns the content scroll.** `scroll` (default) = the shell's content region owns the scroll; pages flow inside it (`fold-page-layout scroll="flow"`), the chrome stays put, a `scroll` footer sits at the true end. `stage` = the content region is a fixed-height stage that does *not* scroll — the page fills it and scrolling happens inside `[foldScrollRegion]` areas (a mail-style split view). See `docs/scroll.md`. |
66
67
  *
67
68
  * ## Elevation (the floating look)
68
69
  * The shell owns **structure**, not skin — it drives no `floating` flag. To lift
@@ -144,15 +145,23 @@ declare class FoldAppShellComponent {
144
145
  /** `"pinned"` (default) keeps the footer always in sight as a fixed row (a player / status bar); `"scroll"` lets it flow at the end of the content, revealed when you scroll to the bottom (a legal / support footer). `scroll` is inset-only and makes the shell own the content scroll — project flow content, not a page that manages its own full-height scroll. */
145
146
  readonly footerBehavior: _angular_core.InputSignal<"pinned" | "scroll">;
146
147
  /**
147
- * Who owns the content region's scroll:
148
- * - `"clip"` (default) — the shell clips it; the page inside owns its scroll
149
- * (an `fold-page-layout` is its own scroll box). A full-bleed page paints to
150
- * the edges and never double-scrolls.
151
- * - `"auto"` — the shell's content region scrolls itself. For plain content
152
- * that isn't wrapped in a self-scrolling page. Ignored under
153
- * `footerBehavior="scroll"` (which already makes the region scroll).
148
+ * Who owns the content region's scroll — the shell's single scroll switch.
149
+ * - `"scroll"` (default) — the shell's content region **owns** the scroll.
150
+ * Pages flow inside it (`fold-page-layout` defaults to `scroll="flow"`), the
151
+ * header/rails stay put, and a `footerBehavior="scroll"` footer sits at the
152
+ * true end of the content. This is the document case — the vast majority.
153
+ * - `"stage"` — the content region is a **fixed-height stage** that does *not*
154
+ * scroll; the page fills it and any scrolling happens inside
155
+ * `[foldScrollRegion]` areas. This is the app case: a mail-style split view
156
+ * where the list and the detail scroll independently and the viewport never
157
+ * moves. A page that must scroll as a unit inside a stage sets
158
+ * `fold-page-layout scroll="own"`.
159
+ *
160
+ * The scroll always lives on an **inner** scroll box, never on the content
161
+ * region itself, so a docked overlay (the panel host) anchored to the region
162
+ * stays fixed over the frame instead of scrolling away with the content.
154
163
  */
155
- readonly contentScroll: _angular_core.InputSignal<"clip" | "auto">;
164
+ readonly scroll: _angular_core.InputSignal<"scroll" | "stage">;
156
165
  /** The skip-link's label — the first Tab stop, jumping keyboard users past the
157
166
  * rails straight to `<main>`. Override for a non-English app. */
158
167
  readonly skipLinkLabel: _angular_core.InputSignal<string>;
@@ -195,6 +204,12 @@ declare class FoldAppShellComponent {
195
204
  readonly mobileNavOpen: _angular_core.ModelSignal<boolean>;
196
205
  /** The shell's own width, kept live by a shared `ResizeObserver` primitive. */
197
206
  private readonly width;
207
+ /** The registry of live scroll regions. The shell registers its own content
208
+ * scroll box so an overlay (the panel host) can freeze it — the scroll owner
209
+ * here is this inner box, not `document.body`. */
210
+ private readonly scrollRegions;
211
+ /** The inner content scroll box (`scroll` mode) / stage (`stage` mode). */
212
+ private readonly scrollBox;
198
213
  /** Whether the shell is narrow enough to collapse — tracked from its **own**
199
214
  * width, not the viewport, so the drawer engages in step with the CSS
200
215
  * collapse whether that fires on `@media` (the shell fills the viewport) or
@@ -221,7 +236,7 @@ declare class FoldAppShellComponent {
221
236
  protected readonly headerHeightVar: _angular_core.Signal<string | null>;
222
237
  protected readonly headerHeightMobileVar: _angular_core.Signal<string | null>;
223
238
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldAppShellComponent, never>;
224
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldAppShellComponent, "fold-app-shell", ["foldAppShell"], { "railWidth": { "alias": "railWidth"; "required": false; "isSignal": true; }; "headerHeight": { "alias": "headerHeight"; "required": false; "isSignal": true; }; "headerHeightMobile": { "alias": "headerHeightMobile"; "required": false; "isSignal": true; }; "headerLayout": { "alias": "headerLayout"; "required": false; "isSignal": true; }; "footerLayout": { "alias": "footerLayout"; "required": false; "isSignal": true; }; "footerBehavior": { "alias": "footerBehavior"; "required": false; "isSignal": true; }; "contentScroll": { "alias": "contentScroll"; "required": false; "isSignal": true; }; "skipLinkLabel": { "alias": "skipLinkLabel"; "required": false; "isSignal": true; }; "drawerLabel": { "alias": "drawerLabel"; "required": false; "isSignal": true; }; "mobileNav": { "alias": "mobileNav"; "required": false; "isSignal": true; }; "mobileNavOpen": { "alias": "mobileNavOpen"; "required": false; "isSignal": true; }; }, { "mobileNavOpen": "mobileNavOpenChange"; }, never, ["[railPrimary]", "[railSecondary]", "[header]", "[footer]", "*"], true, never>;
239
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldAppShellComponent, "fold-app-shell", ["foldAppShell"], { "railWidth": { "alias": "railWidth"; "required": false; "isSignal": true; }; "headerHeight": { "alias": "headerHeight"; "required": false; "isSignal": true; }; "headerHeightMobile": { "alias": "headerHeightMobile"; "required": false; "isSignal": true; }; "headerLayout": { "alias": "headerLayout"; "required": false; "isSignal": true; }; "footerLayout": { "alias": "footerLayout"; "required": false; "isSignal": true; }; "footerBehavior": { "alias": "footerBehavior"; "required": false; "isSignal": true; }; "scroll": { "alias": "scroll"; "required": false; "isSignal": true; }; "skipLinkLabel": { "alias": "skipLinkLabel"; "required": false; "isSignal": true; }; "drawerLabel": { "alias": "drawerLabel"; "required": false; "isSignal": true; }; "mobileNav": { "alias": "mobileNav"; "required": false; "isSignal": true; }; "mobileNavOpen": { "alias": "mobileNavOpen"; "required": false; "isSignal": true; }; }, { "mobileNavOpen": "mobileNavOpenChange"; }, never, ["[railPrimary]", "[railSecondary]", "[header]", "[footer]", "*"], true, never>;
225
240
  }
226
241
 
227
242
  /** Fill style — `ghost` dashes the outline (guests). */
@@ -529,6 +544,27 @@ declare const FOLD_BUILTIN_ICONS: {
529
544
  readonly rewind: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z\"/></svg>";
530
545
  readonly volume: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/></svg>";
531
546
  readonly waveform: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 20h.01M7 20v-4M12 20v-8M17 20V8M22 4v16\"/></svg>";
547
+ readonly "shopping-cart": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"9\" cy=\"21\" r=\"1\"/><circle cx=\"20\" cy=\"21\" r=\"1\"/><path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"/></svg>";
548
+ readonly "shopping-bag": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"/><path d=\"M3 6h18\"/><path d=\"M16 10a4 4 0 0 1-8 0\"/></svg>";
549
+ readonly basket: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5.5 9h13l-1.13 9.06a2 2 0 0 1-1.98 1.94H8.61a2 2 0 0 1-1.98-1.94z\"/><path d=\"m8.5 9 3-6 3 6\"/><path d=\"M9.5 13v3\"/><path d=\"M14.5 13v3\"/></svg>";
550
+ readonly package: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16.5 9.4 7.5 4.21\"/><path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"/><path d=\"M3.27 6.96 12 12.01l8.73-5.05\"/><path d=\"M12 22.08V12\"/></svg>";
551
+ readonly "package-check": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16 16.5V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-3 1.73\"/><path d=\"M3.3 7 12 12l3-1.7\"/><path d=\"M12 22V12\"/><path d=\"M21 8.5V16a2 2 0 0 1-1 1.73l-7 4a2 2 0 0 1-1.5.24\"/><path d=\"m16.5 19.5 2 2 4-4\"/></svg>";
552
+ readonly tag: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.59 13.41 13.42 20.58a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\"/><path d=\"M7 7h.01\"/></svg>";
553
+ readonly tags: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 5H4a2 2 0 0 0-2 2v5l7.59 7.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82z\"/><path d=\"M6 9.5h.01\"/><path d=\"m14 4 6.59 6.59a2 2 0 0 1 0 2.82L16 18\"/></svg>";
554
+ readonly barcode: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 5v14\"/><path d=\"M6.5 5v14\"/><path d=\"M10 5v14\"/><path d=\"M14 5v14\"/><path d=\"M17.5 5v14\"/><path d=\"M21 5v14\"/></svg>";
555
+ readonly "qr-code": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><path d=\"M14 14h3v3h-3z\"/><path d=\"M20 14h1\"/><path d=\"M14 20h1\"/><path d=\"M20 17v4\"/><path d=\"M17 20h4\"/></svg>";
556
+ readonly gift: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 12v9a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-9\"/><rect x=\"2\" y=\"7\" width=\"20\" height=\"5\" rx=\"1\"/><path d=\"M12 22V7\"/><path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"/><path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"/></svg>";
557
+ readonly "credit-card": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M2 10h20\"/></svg>";
558
+ readonly wallet: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 12V7H5a2 2 0 0 1 0-4h13a1 1 0 0 1 1 1v3\"/><path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\"/><path d=\"M18 12a2 2 0 0 0 0 4h4v-4z\"/></svg>";
559
+ readonly receipt: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 2v20l2.5-1.5L9 22l2.5-1.5L14 22l2.5-1.5L19 22l1-1V2l-2.5 1.5L15 2l-2.5 1.5L10 2 7.5 3.5 5 2z\"/><path d=\"M8 8h8\"/><path d=\"M8 12h8\"/><path d=\"M8 16h5\"/></svg>";
560
+ readonly coins: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M18.09 10.37A6 6 0 1 1 10.34 18\"/><path d=\"M7 6h1v4\"/><path d=\"m16.71 13.88.7.71-2.82 2.82\"/></svg>";
561
+ readonly banknote: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><path d=\"M6 12h.01\"/><path d=\"M18 12h.01\"/></svg>";
562
+ readonly percent: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 5 5 19\"/><circle cx=\"6.5\" cy=\"6.5\" r=\"2.5\"/><circle cx=\"17.5\" cy=\"17.5\" r=\"2.5\"/></svg>";
563
+ readonly truck: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 18V6a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h1\"/><path d=\"M14 9h4l3 3v5a1 1 0 0 1-1 1h-1\"/><circle cx=\"6\" cy=\"18\" r=\"2\"/><circle cx=\"17\" cy=\"18\" r=\"2\"/><path d=\"M8 18h6\"/></svg>";
564
+ readonly store: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 9.5V20a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1V9.5\"/><path d=\"M2 9.5 3.6 4a1 1 0 0 1 1-.75h14.8a1 1 0 0 1 1 .75L22 9.5a3 3 0 0 1-6 0 3 3 0 0 1-6 0 3 3 0 0 1-6 0z\"/><path d=\"M9 21v-5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v5\"/></svg>";
565
+ readonly warehouse: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 8.35V20a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V8.35a2 2 0 0 1 1.26-1.86l8-3.2a2 2 0 0 1 1.48 0l8 3.2A2 2 0 0 1 22 8.35z\"/><path d=\"M6 10h12\"/><path d=\"M6 14h12\"/><path d=\"M6 18h12\"/></svg>";
566
+ readonly "map-pin": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/></svg>";
567
+ readonly "package-return": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h11a5 5 0 0 1 5 5v0a5 5 0 0 1-5 5h-4\"/></svg>";
532
568
  readonly absence: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9.5 1.5 14.5 6.5M14.5 1.5 9.5 6.5\"/><path d=\"M9 11v-1a4 4 0 0 1 6 0v1\"/><rect x=\"2.5\" y=\"11\" width=\"19\" height=\"2.6\" rx=\"0.7\"/><path d=\"M4.5 13.6V22M19.5 13.6V22\"/><path d=\"M7.5 16.6h9M8.5 16.6V22M15.5 16.6V22\"/></svg>";
533
569
  readonly bell: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/></svg>";
534
570
  readonly company: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"7\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"M8 7V5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M3 13h18\"/></svg>";
@@ -597,6 +633,44 @@ declare const FOLD_BUILTIN_ICONS: {
597
633
  readonly view: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m23.705,18.549c-.896-1.325-2.959-3.549-6.705-3.549s-5.81,2.224-6.705,3.549c-.391.577-.392,1.323,0,1.902.896,1.325,2.96,3.549,6.706,3.549s5.809-2.224,6.705-3.549c.391-.578.391-1.324,0-1.902Zm-6.705,2.951c-1.105,0-2-.895-2-2s.895-2,2-2,2,.895,2,2-.895,2-2,2Zm-8.362.072c-.852-1.262-.851-2.888.001-4.146,1.116-1.651,3.689-4.427,8.361-4.427,3.311,0,5.568,1.395,7,2.796V5c0-2.761-2.239-5-5-5H5C2.239,0,0,2.239,0,5v13c0,2.761,2.239,5,5,5h4.797c-.489-.506-.872-1.004-1.159-1.428Zm2.362-16.572h7c.552,0,1,.448,1,1s-.448,1-1,1h-7c-.552,0-1-.448-1-1s.448-1,1-1Zm0,5h7c.552,0,1,.448,1,1s-.448,1-1,1h-7c-.552,0-1-.448-1-1s.448-1,1-1Zm-4.5-5.5c.828,0,1.5.672,1.5,1.5s-.672,1.5-1.5,1.5-1.5-.672-1.5-1.5.672-1.5,1.5-1.5Zm0,5c.828,0,1.5.672,1.5,1.5s-.672,1.5-1.5,1.5-1.5-.672-1.5-1.5.672-1.5,1.5-1.5Zm0,8c-.828,0-1.5-.672-1.5-1.5s.672-1.5,1.5-1.5,1.5.672,1.5,1.5-.672,1.5-1.5,1.5Z\"/></svg>";
598
634
  readonly wrench: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/></svg>";
599
635
  };
636
+ /**
637
+ * The built-in catalogue grouped by category, in display order — the single
638
+ * source of truth for tooling that browses icons by theme (e.g. the
639
+ * `fold-icon-devtool`). Each source file owns its slice; this list only names
640
+ * and orders them. Host-registered icons are *not* here — they carry no
641
+ * built-in category, so tooling buckets them separately.
642
+ */
643
+ declare const FOLD_BUILTIN_ICON_CATEGORIES: readonly [{
644
+ readonly id: "ui";
645
+ readonly label: "UI";
646
+ readonly names: string[];
647
+ }, {
648
+ readonly id: "nav";
649
+ readonly label: "Navigation";
650
+ readonly names: string[];
651
+ }, {
652
+ readonly id: "commerce";
653
+ readonly label: "Commerce";
654
+ readonly names: string[];
655
+ }, {
656
+ readonly id: "music";
657
+ readonly label: "Music";
658
+ readonly names: string[];
659
+ }, {
660
+ readonly id: "status";
661
+ readonly label: "Status";
662
+ readonly names: string[];
663
+ }, {
664
+ readonly id: "people";
665
+ readonly label: "People";
666
+ readonly names: string[];
667
+ }, {
668
+ readonly id: "brands";
669
+ readonly label: "Brands";
670
+ readonly names: string[];
671
+ }];
672
+ /** A built-in icon category id (`"ui"`, `"commerce"`, …). */
673
+ type FoldIconCategoryId = (typeof FOLD_BUILTIN_ICON_CATEGORIES)[number]["id"];
600
674
  /** Every built-in icon name — derived from the registry keys (autocompletes). */
601
675
  type FoldBuiltinIconName = keyof typeof FOLD_BUILTIN_ICONS;
602
676
  /**
@@ -756,6 +830,68 @@ declare class FoldButtonComponent {
756
830
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldButtonComponent, "button[foldButton], a[foldButton]", never, { "emphasis": { "alias": "emphasis"; "required": false; "isSignal": true; }; "intent": { "alias": "intent"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconTrailing": { "alias": "iconTrailing"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
757
831
  }
758
832
 
833
+ /**
834
+ * `<fold-danger-zone>` — the framed region for **destructive** actions on a
835
+ * settings page (delete an entity, close an account). A title, a projected
836
+ * explanation, and an optional guarded action.
837
+ *
838
+ * **Two appearances:**
839
+ * - `filled` (default) — the whole block is alert-tinted; a compact "delete X"
840
+ * region (e.g. at the foot of a panel).
841
+ * - `section` — a **danger *section***: an alert-bordered card with a
842
+ * **normal-background body**, so it can host ordinary content (rows,
843
+ * descriptions, forms) with only the frame + heading signalling danger — the
844
+ * GitHub "Danger Zone" look.
845
+ *
846
+ * **The confirm reveals on click.** The destructive control is a projected-free
847
+ * `actionLabel` button; activating it opens an in-place {@link
848
+ * FoldInlineConfirmComponent} — a simple "are you sure?", or (with
849
+ * `confirmPhrase`) a type-to-confirm field that must be retyped before the action
850
+ * arms. The input is never shown until the button is clicked. `(confirmed)` fires
851
+ * with the typed text (or `""`). Omit `actionLabel` for a framed danger section
852
+ * with no action of its own.
853
+ *
854
+ * ```html
855
+ * <fold-danger-zone
856
+ * appearance="section"
857
+ * title="Delete workspace"
858
+ * actionLabel="Delete workspace"
859
+ * [confirmPhrase]="workspace.name"
860
+ * (confirmed)="delete()"
861
+ * >
862
+ * <p>This permanently deletes the workspace and everything in it. It cannot be undone.</p>
863
+ * </fold-danger-zone>
864
+ * ```
865
+ *
866
+ * @selector `fold-danger-zone`
867
+ */
868
+ declare class FoldDangerZoneComponent {
869
+ private readonly ids;
870
+ /** The region heading — also its accessible name. */
871
+ readonly title: _angular_core.InputSignal<string>;
872
+ /**
873
+ * `filled` (alert-tinted block) or `section` (alert-bordered card with a
874
+ * normal-background body — the danger *section*). @default 'filled'
875
+ */
876
+ readonly appearance: _angular_core.InputSignal<"section" | "filled">;
877
+ /** The destructive button's label. Omit for a framed danger section with no
878
+ * action of its own. */
879
+ readonly actionLabel: _angular_core.InputSignal<string | undefined>;
880
+ /** The exact phrase the user must retype to arm the action (type-to-confirm).
881
+ * Omit for a plain "are you sure?" reveal. */
882
+ readonly confirmPhrase: _angular_core.InputSignal<string | undefined>;
883
+ /** An optional warning shown above the confirm row when the action opens. */
884
+ readonly message: _angular_core.InputSignal<string | undefined>;
885
+ /** Colour of the destructive button. @default 'danger' */
886
+ readonly intent: _angular_core.InputSignal<FoldButtonIntent>;
887
+ /** Fires when the user confirms — carries the typed phrase (or `""`). */
888
+ readonly confirmed: _angular_core.OutputEmitterRef<string>;
889
+ /** Stable id the host's `aria-labelledby` points at. */
890
+ protected readonly titleId: string;
891
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldDangerZoneComponent, never>;
892
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldDangerZoneComponent, "fold-danger-zone", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "actionLabel": { "alias": "actionLabel"; "required": false; "isSignal": true; }; "confirmPhrase": { "alias": "confirmPhrase"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "intent": { "alias": "intent"; "required": false; "isSignal": true; }; }, { "confirmed": "confirmed"; }, never, ["*"], true, never>;
893
+ }
894
+
759
895
  /** Surface shape of a `fold-button-icon`. */
760
896
  type FoldButtonIconShape = "square" | "round";
761
897
  /** Hit-area preset — `xs` 22px · `sm` 28px · `md` 32px · `lg` 38px. */
@@ -1739,7 +1875,7 @@ declare class FoldNavTileComponent {
1739
1875
  /** The label under the icon (also the accessible name of the control). */
1740
1876
  readonly label: _angular_core.InputSignal<string>;
1741
1877
  /** `"surface"` (default, subtle raised) or `"filled"` (solid brand fill). */
1742
- readonly variant: _angular_core.InputSignal<"surface" | "filled">;
1878
+ readonly variant: _angular_core.InputSignal<"filled" | "surface">;
1743
1879
  /** Lights the active indicator — the current destination. */
1744
1880
  readonly active: _angular_core.InputSignalWithTransform<boolean, unknown>;
1745
1881
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldNavTileComponent, never>;
@@ -2103,232 +2239,1756 @@ declare class FoldStickyColumnDirective {
2103
2239
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldStickyColumnDirective, "[foldStickyColumn]", never, { "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "stickyOffset": { "alias": "stickyOffset"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2104
2240
  }
2105
2241
 
2106
- type FoldChoiceOption = {
2107
- key: string;
2108
- label: string;
2109
- /** Optional trailing count badge (e.g. how many rows match this filter). */
2110
- count?: number;
2111
- };
2112
2242
  /**
2113
- * `<fold-choice-row>` — a horizontal single-select control.
2243
+ * Plain-date arithmetic for the calendar family — `YYYY-MM-DD` in, `YYYY-MM-DD`
2244
+ * out. Framework-free and side-effect-free, so every rule here is unit-testable
2245
+ * without a TestBed.
2246
+ *
2247
+ * ## Why a string and not a `Date`
2248
+ * A calendar of all-day spans deals in **plain dates** — "the 18th of May",
2249
+ * with no instant and no zone. A `Date` is a timestamp, so the moment one
2250
+ * crosses a zone or a DST boundary the same span lands on a different cell:
2251
+ * `new Date("2026-05-18")` is UTC midnight, which is the *17th* anywhere west
2252
+ * of Greenwich. Modelling the domain as `YYYY-MM-DD` removes that entire bug
2253
+ * class by construction, and buys three things for free: values compare
2254
+ * **lexicographically** (`a <= b` *is* "on or before"), they are `===`-equal
2255
+ * when they mean the same day (a `Date` never is), and they are already the
2256
+ * wire format every backend sends.
2257
+ *
2258
+ * {@link FoldTimelineNode} keeps a native `Date` on purpose — it plots dated
2259
+ * *instants* on a rail, which is the other domain.
2260
+ *
2261
+ * Arithmetic runs through `Date.UTC`, never local time: UTC has no DST, so a
2262
+ * day is always exactly 86 400 000 ms and "add 1 day" can never silently
2263
+ * return the same date twice (or skip one) around a clock change.
2264
+ *
2265
+ * ## Supported range
2266
+ * `0001-01-01` to `9999-12-31`. The four-digit year is what makes the
2267
+ * lexicographic guarantee hold, so it is enforced rather than assumed: years
2268
+ * below 1000 are zero-padded (`0099-12-31`, which still sorts correctly), and
2269
+ * arithmetic that walks past `9999-12-31` returns a five-digit string that
2270
+ * {@link foldIsCalendarDate} rejects — a value that fails the type's own
2271
+ * predicate rather than one that silently sorts before every other date.
2272
+ */
2273
+ /**
2274
+ * A plain calendar date — an ISO-8601 **date**, `YYYY-MM-DD`, with no time and
2275
+ * no zone. Inclusive wherever it bounds a range.
2114
2276
  *
2115
- * One row, one active option, emits the chosen `key`; the parent owns the
2116
- * state and feeds it back via `activeKey`. Two layouts:
2277
+ * A plain `string` alias, deliberately: it is the wire format, so a value read
2278
+ * from an API or a `<input type="date">` has to flow in without a cast.
2279
+ * {@link foldIsCalendarDate} is the runtime guard, and every component that
2280
+ * takes one runs it in dev mode.
2281
+ */
2282
+ type FoldCalendarDate = string;
2283
+ /** A day of the week, as the anchor a calendar's weeks start on. */
2284
+ type FoldWeekday = "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun";
2285
+ /**
2286
+ * The days a calendar shades as the weekend by default. A separate fact from
2287
+ * the week's anchor day: a Sunday-first calendar still rests on Sat/Sun, and a
2288
+ * Saturday-first one (much of the Middle East) rests on Fri/Sat while starting
2289
+ * on Saturday — which is why the two are different inputs, not one derived
2290
+ * from the other.
2291
+ */
2292
+ declare const FOLD_DEFAULT_WEEKEND_DAYS: readonly ["sat", "sun"];
2293
+ /**
2294
+ * Whether `value` is a well-formed **and real** plain date. Catches both a
2295
+ * malformed shape (`"2026-5-1"`) and an impossible day (`"2026-02-30"`), the
2296
+ * latter by round-tripping through UTC and checking the parts survived.
2297
+ */
2298
+ declare function foldIsCalendarDate(value: string): boolean;
2299
+ /**
2300
+ * Today, read from the **local** clock — the day the user believes it is,
2301
+ * which is what a calendar highlights. Pass `now` to pin it (tests, a
2302
+ * workspace clock).
2303
+ */
2304
+ declare function foldToday(now?: Date): FoldCalendarDate;
2305
+ /**
2306
+ * A native `Date` read as the plain date it shows on a **local** clock — the
2307
+ * inbound bridge, and the one conversion every consumer would otherwise write
2308
+ * by hand as `date.toISOString().slice(0, 10)`, which is UTC and therefore off
2309
+ * by a day for anyone west of Greenwich after 6pm. That is the exact bug this
2310
+ * whole module exists to remove, so the correct form ships with it.
2117
2311
  *
2118
- * - `segmented` (default) — equal-width buttons that fill the row, no wrap.
2119
- * The right shape for a small mode/segment toggle (2–4 options).
2120
- * - `chips` — auto-width rounded chips that wrap. The right shape for a
2121
- * status/category filter above a table or list.
2312
+ * Pair with {@link foldToNativeDate} for the way out.
2313
+ */
2314
+ declare function foldFromNativeDate(date: Date): FoldCalendarDate;
2315
+ /** `date` shifted by `days` (negative moves back). */
2316
+ declare function foldAddDays(date: FoldCalendarDate, days: number): FoldCalendarDate;
2317
+ /**
2318
+ * Whole days from `from` to `to` — signed, and **exclusive** (same day → `0`),
2319
+ * so a span's length is `foldDaysBetween(start, end) + 1`.
2320
+ */
2321
+ declare function foldDaysBetween(from: FoldCalendarDate, to: FoldCalendarDate): number;
2322
+ /**
2323
+ * `date` shifted by `months`, clamping the day to the target month's length so
2324
+ * the result is always a real date (31 Jan + 1 month → 28/29 Feb, never 3 Mar).
2325
+ */
2326
+ declare function foldAddMonths(date: FoldCalendarDate, months: number): FoldCalendarDate;
2327
+ /** The first day of `date`'s month. */
2328
+ declare function foldStartOfMonth(date: FoldCalendarDate): FoldCalendarDate;
2329
+ /** The last day of `date`'s month (28–31, leap years included). */
2330
+ declare function foldEndOfMonth(date: FoldCalendarDate): FoldCalendarDate;
2331
+ /**
2332
+ * The start of the week `date` falls in, for a calendar anchored on
2333
+ * `weekStartsOn`. Anchor-agnostic: a Monday-first and a Sunday-first calendar
2334
+ * ask the same question and get their own answer.
2335
+ */
2336
+ declare function foldStartOfWeek(date: FoldCalendarDate, weekStartsOn?: FoldWeekday): FoldCalendarDate;
2337
+ /**
2338
+ * `date`'s position in its week, `0` on the anchor day — the column a day
2339
+ * occupies in a 7-wide grid.
2340
+ */
2341
+ declare function foldWeekdayIndex(date: FoldCalendarDate, weekStartsOn?: FoldWeekday): number;
2342
+ /**
2343
+ * The ISO-8601 week number `date` falls in, `1`–`53`.
2122
2344
  *
2123
- * @selector `fold-choice-row`
2345
+ * ISO weeks always start on Monday and belong to the year holding their
2346
+ * **Thursday**, which is why 1 January is sometimes week 52 of the year before
2347
+ * — the rule European B2B reporting runs on, and the reason this cannot be
2348
+ * derived from the calendar's own `weekStartsOn`.
2349
+ */
2350
+ declare function foldIsoWeek(date: FoldCalendarDate): number;
2351
+ /** The ISO week-numbering year of `date` — not always its calendar year. */
2352
+ declare function foldIsoWeekYear(date: FoldCalendarDate): number;
2353
+ /** Which day of the week `date` falls on, anchor-independent. */
2354
+ declare function foldWeekdayOf(date: FoldCalendarDate): FoldWeekday;
2355
+ /**
2356
+ * Whether `date` is one of the days a calendar shades as the weekend.
2124
2357
  *
2125
- * @example
2126
- * ```html
2127
- * <fold-choice-row
2128
- * [options]="[{ key: 'manager', label: 'Manager' }, { key: 'member', label: 'Member' }]"
2129
- * [activeKey]="role()"
2130
- * (selected)="role.set($event)"
2131
- * />
2358
+ * Takes the weekend **as data**, because it is not derivable from the week's
2359
+ * anchor: the two are independent locale facts. Deriving it — "the last two
2360
+ * columns" — shades Friday and Saturday on a Sunday-first calendar and calls
2361
+ * Sunday a working day, which is wrong everywhere it is used.
2132
2362
  *
2133
- * <fold-choice-row
2134
- * layout="chips"
2135
- * [options]="statuses"
2136
- * [activeKey]="status()"
2137
- * ariaLabel="Filter by status"
2138
- * (selected)="setStatus($event)"
2139
- * />
2140
- * ```
2363
+ * @default FOLD_DEFAULT_WEEKEND_DAYS (`['sat', 'sun']`)
2141
2364
  */
2142
- declare class FoldChoiceRowComponent {
2143
- /** The selectable options, in display order. */
2144
- readonly options: _angular_core.InputSignal<readonly FoldChoiceOption[]>;
2145
- /** The `key` of the currently selected option. */
2146
- readonly activeKey: _angular_core.InputSignal<string>;
2147
- /** `segmented` (equal-width, default) or `chips` (auto-width, wraps). */
2148
- readonly layout: _angular_core.InputSignal<"segmented" | "chips">;
2149
- /** Accessible label for the group. */
2150
- readonly ariaLabel: _angular_core.InputSignal<string>;
2151
- /** Emits the `key` of the clicked option. */
2152
- readonly selected: _angular_core.OutputEmitterRef<string>;
2153
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldChoiceRowComponent, never>;
2154
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldChoiceRowComponent, "fold-choice-row", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "activeKey": { "alias": "activeKey"; "required": true; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, never, true, never>;
2365
+ declare function foldIsWeekend(date: FoldCalendarDate, weekendDays?: readonly FoldWeekday[]): boolean;
2366
+ /**
2367
+ * Anything whose `toString()` opens with an ISO date — `Temporal.PlainDate`,
2368
+ * `PlainDateTime` and `ZonedDateTime` all do, and so does a plain string.
2369
+ *
2370
+ * Typed structurally on purpose: the package takes no dependency on `Temporal`
2371
+ * and works whether or not the runtime has it.
2372
+ */
2373
+ interface FoldIsoDateLike {
2374
+ toString(): string;
2155
2375
  }
2156
-
2157
2376
  /**
2158
- * The design tokens, as a typed source-of-truth.
2377
+ * A `Temporal` value read as the plain date it starts with.
2159
2378
  *
2160
- * These lists are the CONTRACT. The token contract test asserts that the CSS
2161
- * declares exactly these tokens — for colours, that the `:root` (dark) and
2162
- * `[data-theme="lumen"]` blocks each declare exactly the colour set (parity);
2163
- * for scales, that `scales.css` declares exactly the radius/type steps. Add a
2164
- * token here and to the CSS in the same change, or the test fails. That is how
2165
- * the theme stays complete and drift-free.
2379
+ * `Temporal.PlainDate.toString()` **is** `YYYY-MM-DD` — the primitive this
2380
+ * module chose for correctness turns out to be exactly Temporal-shaped, which
2381
+ * no `Date`-based calendar can say. Going the other way needs no helper at all:
2382
+ * `Temporal.PlainDate.from(foldDate)` already accepts one of ours.
2166
2383
  *
2167
- * They also power typed `fold*Var` helpers so call sites get autocomplete and a
2168
- * compile error on a misspelt token.
2384
+ * A `PlainDateTime` or a `ZonedDateTime` drops its time here, which is the
2385
+ * point — this family plots whole days, and the day you mean is the one in the
2386
+ * value's own calendar and zone, not the one UTC would have given you.
2387
+ *
2388
+ * Returns `""` for anything that is not an ISO date, so a bad value fails
2389
+ * {@link foldIsCalendarDate} rather than silently rendering the wrong month.
2169
2390
  */
2170
- declare const FOLD_SEMANTIC_COLOR_TOKENS: readonly ["bg-page", "bg-header", "bg-rail-primary", "bg-rail-secondary", "bg-rail-tertiary", "primary", "primary-strong", "on-primary", "primary-text", "primary-surface", "primary-border", "info", "info-text", "info-surface", "info-border", "warning", "warning-text", "warning-surface", "warning-border", "alert", "alert-text", "alert-surface", "alert-border", "success", "success-text", "success-surface", "success-border", "text", "text-secondary", "text-muted", "text-faded", "surface-card", "surface-sunken", "surface-subtle", "surface-raised", "surface-hover", "border", "border-subtle", "glass", "glass-border", "scrim"];
2171
- type FoldSemanticColorToken = (typeof FOLD_SEMANTIC_COLOR_TOKENS)[number];
2172
- /** Border-radius scale. `lg` is a real large radius; `pill` is the capsule. */
2173
- declare const FOLD_RADIUS_TOKENS: readonly ["xs", "sm", "md", "lg", "pill", "round"];
2174
- type FoldRadiusToken = (typeof FOLD_RADIUS_TOKENS)[number];
2175
- /** Type (font-size) scale. */
2176
- declare const FOLD_TEXT_TOKENS: readonly ["xs", "sm", "md", "lg", "xl"];
2177
- type FoldTextToken = (typeof FOLD_TEXT_TOKENS)[number];
2178
- /** Icon-size scale — the length a `fold-icon` renders at, per size preset. */
2179
- declare const FOLD_ICON_SIZE_TOKENS: readonly ["xs", "sm", "md", "lg", "xl"];
2180
- type FoldIconSizeToken = (typeof FOLD_ICON_SIZE_TOKENS)[number];
2181
- /** Space (gap / padding / margin) scale. */
2182
- declare const FOLD_SPACE_TOKENS: readonly ["xs", "sm", "md", "lg", "xl", "2xl", "3xl", "4xl", "5xl"];
2183
- type FoldSpaceToken = (typeof FOLD_SPACE_TOKENS)[number];
2184
- /** Motion scale — `transition` shorthands (duration + easing). */
2185
- declare const FOLD_MOTION_TOKENS: readonly ["fast", "base", "slow"];
2186
- type FoldMotionToken = (typeof FOLD_MOTION_TOKENS)[number];
2187
- /** Backdrop-blur radii (`--fold-blur-*`). */
2188
- declare const FOLD_BLUR_TOKENS: readonly ["glass"];
2189
- type FoldBlurToken = (typeof FOLD_BLUR_TOKENS)[number];
2391
+ declare function foldFromTemporal(value: FoldIsoDateLike): FoldCalendarDate;
2190
2392
  /**
2191
- * Elevation scale — full `box-shadow` values. The shared depth language: a
2192
- * component never spells its own shadow, it names a level. Theme-invariant
2193
- * (black ink via `color-mix`, which reads acceptably on both themes), so they
2194
- * live with the scales. `panel-*` are the directional side-panel shadows.
2393
+ * A `Date` at **UTC midnight** of `date` — the bridge to `Intl.DateTimeFormat`
2394
+ * for month and weekday names. Format it with `timeZone: "UTC"`, or the local
2395
+ * zone will shift the label back a day west of Greenwich.
2195
2396
  */
2196
- declare const FOLD_SHADOW_TOKENS: readonly ["sm", "md", "lg", "panel-right", "panel-left"];
2197
- type FoldShadowToken = (typeof FOLD_SHADOW_TOKENS)[number];
2198
- /** The full custom-property name for a semantic colour token. */
2199
- declare function foldColorProperty(token: FoldSemanticColorToken): string;
2200
- /** A ready-to-use `var(--fold-color-…)` reference for a semantic colour token. */
2201
- declare function foldColorVar(token: FoldSemanticColorToken): string;
2202
- /** A ready-to-use `var(--fold-radius-…)` reference. */
2203
- declare function foldRadiusVar(token: FoldRadiusToken): string;
2204
- /** A ready-to-use `var(--fold-text-…)` reference. */
2205
- declare function foldTextVar(token: FoldTextToken): string;
2206
- /** A ready-to-use `var(--fold-space-…)` reference. */
2207
- declare function foldSpaceVar(token: FoldSpaceToken): string;
2208
- /** A ready-to-use `var(--fold-motion-…)` reference. */
2209
- declare function foldMotionVar(token: FoldMotionToken): string;
2210
- /** A ready-to-use `var(--fold-blur-…)` reference. */
2211
- declare function foldBlurVar(token: FoldBlurToken): string;
2212
- /** A ready-to-use `var(--fold-shadow-…)` reference. */
2213
- declare function foldShadowVar(token: FoldShadowToken): string;
2397
+ declare function foldToNativeDate(date: FoldCalendarDate): Date;
2214
2398
 
2215
- /** Spinner size — an icon-size token (`xs…xl`) or an explicit pixel number. */
2216
- type FoldSpinnerSize = FoldIconSizeToken | number;
2217
2399
  /**
2218
- * `fold-spinner` — an indeterminate loading indicator: a rotating arc drawn in
2219
- * `currentColor`, sized off the same scale as `fold-icon` so it drops into a
2220
- * button in place of its glyph without shifting layout.
2221
- *
2222
- * Give it a `label` when it stands alone (it becomes `role="status"` +
2223
- * `aria-label`, so assistive tech announces the wait). Leave `label` unset when
2224
- * it lives inside something that already announces busy-ness (a button with
2225
- * `aria-busy`) — it then renders `aria-hidden`, purely decorative.
2226
- *
2227
- * Honours `prefers-reduced-motion`: the rotation stops and a fuller static ring
2228
- * is shown instead, so the indicator still reads as "busy" without animating.
2229
- *
2230
- * @selector `fold-spinner`
2400
+ * Wall-clock time for the time grid — `HH:mm`, 24-hour, **no zone**.
2401
+ *
2402
+ * ## Why not an instant
2403
+ * The same decision as the date, for the same reason. A meeting at 09:00 is at
2404
+ * 09:00 on the wall the person is looking at; storing it as an instant means
2405
+ * every render re-derives that wall time from a zone, and the moment the zone
2406
+ * is wrong — a server default, a user travelling, a DST edge — the grid draws
2407
+ * the wrong hour. `"09:00"` cannot be wrong about which hour it means.
2408
+ *
2409
+ * The zone is the **app's** boundary, exactly like the date: convert once on
2410
+ * the way in ({@link foldFromTemporal} takes a `ZonedDateTime` and drops it to
2411
+ * the day and, here, the caller reads its `.hour`/`.minute`), and the calendar
2412
+ * never has to know.
2413
+ *
2414
+ * Times compare **lexicographically** like the dates do — `"09:00" < "14:30"` —
2415
+ * which is what makes overlap detection a string comparison rather than a
2416
+ * parse. `24:00` is legal and means the end of the day, so a span that runs to
2417
+ * midnight has an end greater than its start.
2418
+ */
2419
+ /** A wall-clock time, `HH:mm`, `00:00`–`24:00`. */
2420
+ type FoldCalendarTime = string;
2421
+ /** Minutes in a day — the grid's own unit. */
2422
+ declare const FOLD_MINUTES_PER_DAY = 1440;
2423
+ /**
2424
+ * Whether `value` is a well-formed **and real** wall-clock time.
2231
2425
  *
2232
- * @example
2233
- * ```html
2234
- * <fold-spinner label="Loading contracts" />
2235
- * <fold-spinner size="sm" /> <!-- decorative, inside a busy control -->
2236
- * <fold-spinner [size]="18" />
2237
- * ```
2426
+ * The shape check is not enough on its own: `"10:75"` and `"23:60"` both match
2427
+ * `HH:mm` and both sit under 1440 minutes, so a range check on the total would
2428
+ * wave them through. The fields are validated separately — minutes `00`–`59`,
2429
+ * hours `00`–`23`, plus the single `24:00` that means the end of the day — the
2430
+ * same rigour {@link foldIsCalendarDate} applies to `2026-02-30`.
2238
2431
  */
2239
- declare class FoldSpinnerComponent {
2240
- /** Size — an icon-size token (`xs…xl`, default `md`) or a pixel number. */
2241
- readonly size: _angular_core.InputSignal<FoldSpinnerSize>;
2242
- /** Accessible label. Set → `role="status"` + `aria-label`; unset → decorative. */
2243
- readonly label: _angular_core.InputSignal<string | undefined>;
2244
- /** Resolves the size to a CSS length for `--fold-spinner-size`. */
2245
- readonly sizeVar: _angular_core.Signal<string>;
2246
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldSpinnerComponent, never>;
2247
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldSpinnerComponent, "fold-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2248
- }
2432
+ declare function foldIsCalendarTime(value: string): boolean;
2433
+ /** Minutes since midnight — the number the grid positions on. */
2434
+ declare function foldToMinutes(time: FoldCalendarTime): number;
2435
+ /** Minutes since midnight back to `HH:mm`, clamped to the day. */
2436
+ declare function foldFromMinutes(minutes: number): FoldCalendarTime;
2437
+ /** `time` shifted by `minutes`, clamped to the day rather than wrapping. */
2438
+ declare function foldAddMinutes(time: FoldCalendarTime, minutes: number): FoldCalendarTime;
2249
2439
 
2250
2440
  /**
2251
- * Generates unique, SSR-safe element ids.
2252
- *
2253
- * A per-injector counter (`providedIn: 'root'` → one instance per application,
2254
- * and a fresh one per request on the server) so the sequence is deterministic
2255
- * in render order and therefore matches between server and client. That's the
2256
- * point: `crypto.randomUUID()` returns a different value on the server than on
2257
- * the client for the same element, which trips Angular hydration; a counter
2258
- * reset per request does not, and can't collide across requests or grow
2259
- * unbounded.
2260
- *
2261
- * Used by the labelled controls that own their id ({@link FoldInputComponent},
2262
- * `fold-select`) and by {@link FoldFieldIdDirective} for loose native controls.
2441
+ * Every date format the calendar family renders, in one table.
2442
+ *
2443
+ * They used to be five components' worth of inline `Intl.DateTimeFormat`
2444
+ * option bags — which is how the day view ended up asking for
2445
+ * `{ weekday: 'long', month: 'long' }` and printing "Saturday May", a phrase in
2446
+ * no locale. Side by side they can be read against each other, and a consumer
2447
+ * can see what a locale is actually asked for.
2448
+ *
2449
+ * `timeZone: 'UTC'` is not optional: a plain date is bridged to `Date` at UTC
2450
+ * midnight, so formatting it in the local zone would print the day before for
2451
+ * anyone west of Greenwich.
2452
+ *
2453
+ * `calendar: 'gregory'` is pinned for the same reason `timeZone` is: the grid
2454
+ * counts days and groups months in the Gregorian calendar (that is what a
2455
+ * `YYYY-MM-DD` string *is*), so the names beside those numbers must be Gregorian
2456
+ * too. Left to the locale's own default, `ar-SA` would print Hijri month names
2457
+ * over Gregorian day numbers on rows that break on Gregorian months — a
2458
+ * calendar contradicting itself. The family is Gregorian, localised into the
2459
+ * language of the locale, not into its calendar system; a non-Gregorian layout
2460
+ * is a separate widget this one does not pretend to be.
2263
2461
  */
2264
- declare class FoldIdService {
2265
- private counter;
2266
- /**
2267
- * The next unique id, e.g. `fold-input-3`.
2268
- * @param prefix a short, human-readable namespace for the id.
2269
- */
2270
- next(prefix?: string): string;
2271
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldIdService, never>;
2272
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<FoldIdService>;
2273
- }
2462
+ declare const FOLD_CALENDAR_FORMATS: {
2463
+ /** Whole date, spelled out — accessible names. */
2464
+ readonly dateFull: {
2465
+ readonly dateStyle: "long";
2466
+ };
2467
+ /** Whole date **with its weekday** — a period title, where it is the heading. */
2468
+ readonly dateFullWeekday: {
2469
+ readonly dateStyle: "full";
2470
+ };
2471
+ /** `18 May 2026` — the ends of a week, which `formatRange` then joins. */
2472
+ readonly dayMonthYear: {
2473
+ readonly day: "numeric";
2474
+ readonly month: "long";
2475
+ readonly year: "numeric";
2476
+ };
2477
+ /** `Mon` — grid column headers. */
2478
+ readonly weekdayShort: {
2479
+ readonly weekday: "short";
2480
+ };
2481
+ /** `Monday` — a day heading, where there is room. */
2482
+ readonly weekdayLong: {
2483
+ readonly weekday: "long";
2484
+ };
2485
+ /** `May` — beside a day number, never on its own with a weekday. */
2486
+ readonly monthLong: {
2487
+ readonly month: "long";
2488
+ };
2489
+ /** `May` (abbreviated) — the agenda rail, where width is scarce. */
2490
+ readonly monthShort: {
2491
+ readonly month: "short";
2492
+ };
2493
+ /** `May 2026` — a period title. */
2494
+ readonly monthYear: {
2495
+ readonly month: "long";
2496
+ readonly year: "numeric";
2497
+ };
2498
+ /** `18 May` — a span's ends, which `formatRange` then joins. */
2499
+ readonly dayMonthShort: {
2500
+ readonly day: "numeric";
2501
+ readonly month: "short";
2502
+ };
2503
+ /** `09:00` in France, `9:00 AM` in the US — an hour down the grid's gutter. */
2504
+ readonly hourMark: {
2505
+ readonly hour: "numeric";
2506
+ readonly minute: "2-digit";
2507
+ };
2508
+ };
2509
+ /** A key of {@link FOLD_CALENDAR_FORMATS}. */
2510
+ type FoldCalendarFormat = keyof typeof FOLD_CALENDAR_FORMATS;
2274
2511
 
2275
2512
  /**
2276
- * Auto-assigns a unique, SSR-safe `id` to any native form control (`<input>`,
2277
- * `<select>`, `<textarea>`) that has neither an `id` nor a `name`.
2278
- *
2279
- * You don't write `foldFieldId` on elements — the directive **auto-applies** by
2280
- * selector. Add it to a component's `imports` once and every unidentified native
2281
- * control in that component's template is fixed in one go, with no per-element
2282
- * edit. It silences the browser's *"A form field element should have an id or
2283
- * name attribute"* warning (autofill + accessibility), and the id it sets can be
2284
- * targeted by a `<label for>`.
2513
+ * Every string the calendar renders that does not come from the caller's data.
2285
2514
  *
2286
- * The selector matches only controls missing **both** `id` and `name` — static
2287
- * or bound (`[id]`/`[attr.id]`/`[name]` all count as present) — so it never
2288
- * fights a control you've already identified. Components that render their own
2289
- * labelled control ({@link FoldInputComponent}, `fold-select`) own their id
2290
- * explicitly and are unaffected.
2515
+ * Month and weekday names are deliberately **absent**: they come from
2516
+ * `Intl.DateTimeFormat` driven by the `locale` input, so a consumer gets all
2517
+ * ~200 locales for free instead of hand-translating twelve month names. What
2518
+ * remains here is the chrome — the words `Intl` cannot supply.
2291
2519
  */
2292
- declare class FoldFieldIdDirective {
2293
- /** Assigned once at construction, in deterministic render order (SSR-safe). */
2294
- protected readonly autoId: string;
2295
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldFieldIdDirective, never>;
2296
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldFieldIdDirective, "input:not([id]):not([name]),select:not([id]):not([name]),textarea:not([id]):not([name])", never, {}, {}, never, never, true, never>;
2520
+ interface FoldCalendarLabels {
2521
+ /** Accessible name of the grid itself. */
2522
+ readonly grid: string;
2523
+ /** Word marking the cell that is today, appended to its accessible name. */
2524
+ readonly today: string;
2525
+ /** The chip standing for events a week had no lane for. */
2526
+ readonly moreEvents: (count: number) => string;
2527
+ /**
2528
+ * A count of events — announced on a day cell, and on a chip that collapses
2529
+ * a group into one.
2530
+ */
2531
+ readonly eventCount: (count: number) => string;
2532
+ /**
2533
+ * Announced on a day cell that is showing fewer events than it holds — the
2534
+ * lane budget is a visual limit, and a screen reader is told about it rather
2535
+ * than silently given a smaller number.
2536
+ */
2537
+ readonly hiddenCount: (count: number) => string;
2538
+ /** Label of the time grid's all-day strip. */
2539
+ readonly allDay: string;
2540
+ /** Accessible name of the time grid's scrollable hour area. */
2541
+ readonly hours: string;
2542
+ /** Header of the ISO week-number column — a symbol, not a sentence. */
2543
+ readonly weekNumberShort: string;
2544
+ /** Accessible reading of a week number, since the column header is a glyph. */
2545
+ readonly weekNumber: (week: number) => string;
2546
+ /** Shown by the day view when nothing sits on the day. */
2547
+ readonly emptyDay: string;
2548
+ /** Shown by the list view when the range holds nothing. */
2549
+ readonly emptyRange: string;
2550
+ /** The toolbar's jump-to-today button. */
2551
+ readonly todayAction: string;
2552
+ /** Accessible name of the toolbar's back control. */
2553
+ readonly previousPeriod: string;
2554
+ /** Accessible name of the toolbar's forward control. */
2555
+ readonly nextPeriod: string;
2556
+ /** Accessible name of the view switch. */
2557
+ readonly viewSwitch: string;
2558
+ /** The four view names, in the switch. */
2559
+ readonly viewMonth: string;
2560
+ readonly viewWeek: string;
2561
+ readonly viewDay: string;
2562
+ readonly viewList: string;
2563
+ /** Accessible name of the agenda rail. */
2564
+ readonly agenda: string;
2565
+ /** Accessible name of the rail's slice switch — distinct from the rail itself. */
2566
+ readonly agendaModes: string;
2567
+ /** The agenda's two slices, in its own switch. */
2568
+ readonly agendaTodo: string;
2569
+ readonly agendaUpcoming: string;
2570
+ /** Shown when the agenda's current slice is clear. */
2571
+ readonly agendaEmptyTodo: string;
2572
+ readonly agendaEmptyUpcoming: string;
2573
+ /** Shown when `limit` stopped the rail short of what is actually ahead. */
2574
+ readonly agendaMore: (days: number) => string;
2575
+ /** Relative day names the agenda prefers over a date. */
2576
+ readonly relativeToday: string;
2577
+ readonly relativeTomorrow: string;
2578
+ /** Accessible names of the rail's collapse control, in each state. */
2579
+ readonly collapse: string;
2580
+ readonly expand: string;
2581
+ /** Accessible name of the source filter. */
2582
+ readonly sourceFilter: string;
2583
+ /** Reading of a source's state, e.g. `("Absences", true) => "Absences, shown"`. */
2584
+ readonly sourceState: (label: string, shown: boolean) => string;
2297
2585
  }
2586
+ /** The English defaults — the base every override merges onto. */
2587
+ declare const FOLD_CALENDAR_DEFAULT_LABELS: FoldCalendarLabels;
2588
+ /** App-wide calendar labels; defaults to English. */
2589
+ declare const FOLD_CALENDAR_LABELS: InjectionToken<FoldCalendarLabels>;
2590
+ /** Provide calendar labels for the whole app, merged over the English defaults. */
2591
+ declare function provideFoldCalendarLabels(labels: Partial<FoldCalendarLabels>): Provider;
2298
2592
 
2299
2593
  /**
2300
- * `[foldRepeatPress]` — press-and-hold auto-repeat.
2301
- *
2302
- * Fires `(foldRepeatPress)` once immediately on pointer press, then keeps firing
2303
- * on a fixed cadence while the pointer is held, stopping on release, leave,
2304
- * cancel or destroy. Bind `[foldRepeatPressDisabled]` to a reactive bound (e.g.
2305
- * "at max") so the repeat also stops the instant the action becomes unavailable
2306
- * mid-hold — a plain `pointerup` is unreliable once the host button disables
2307
- * itself under the finger.
2594
+ * The three things every calendar view needs and none of them is about: its
2595
+ * labels, its locale, and the chip template a consumer may have projected.
2308
2596
  *
2309
- * Keyboard activation is intentionally out of scope: it produces `click`, not
2310
- * `pointerdown`, so wire a separate `(click)` handler for Enter/Space.
2597
+ * Applied through `hostDirectives`, so `locale` and `labels` are still ordinary
2598
+ * inputs on `<fold-calendar-month>`, `<fold-calendar-week>` and the rest — the
2599
+ * consumer sees no difference, and the five views stop carrying five identical
2600
+ * copies of the same eight lines.
2311
2601
  *
2312
- * @selector `[foldRepeatPress]`
2602
+ * Internal — a view exposes it, it is never applied by hand.
2313
2603
  *
2314
2604
  * @example
2315
- * ```html
2316
- * <button
2317
- * foldRepeatPress
2318
- * [foldRepeatPressDisabled]="atMax()"
2319
- * (foldRepeatPress)="step(1)"
2320
- * >+</button>
2605
+ * ```ts
2606
+ * @Component({
2607
+ * hostDirectives: [
2608
+ * { directive: FoldCalendarChromeDirective, inputs: ['locale', 'labels'] },
2609
+ * ],
2610
+ * })
2611
+ * export class FoldCalendarWeekComponent<T = unknown> {
2612
+ * protected readonly chrome = inject(FoldCalendarChromeDirective);
2613
+ * }
2321
2614
  * ```
2322
2615
  */
2323
- declare class FoldRepeatPressDirective {
2324
- /** Fires immediately on press, then repeatedly while the pointer is held. */
2325
- readonly repeat: _angular_core.OutputEmitterRef<void>;
2326
- /** When true, a press does nothing and any running repeat stops at once. */
2327
- readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2328
- /** Delay before the auto-repeat begins, in ms. @default 350 */
2329
- readonly delay: _angular_core.InputSignal<number>;
2330
- /** Cadence of the auto-repeat once started, in ms. @default 60 */
2331
- readonly period: _angular_core.InputSignal<number>;
2616
+ declare class FoldCalendarChromeDirective {
2617
+ /** BCP-47 tag driving every `Intl` name; omitted, the runtime default. */
2618
+ readonly locale: _angular_core.InputSignal<string | undefined>;
2619
+ /** Per-instance label overrides, merged over the app-wide (or English) set. */
2620
+ readonly labels: _angular_core.InputSignal<Partial<FoldCalendarLabels> | undefined>;
2621
+ /**
2622
+ * Per-instance `Intl` option overrides, merged over
2623
+ * {@link FOLD_CALENDAR_FORMATS}. Labels let a locale translate; this lets it
2624
+ * **reformat** — a numeric weekday header, a four-digit year, a narrow month.
2625
+ */
2626
+ readonly formats: _angular_core.InputSignal<Partial<Record<"dateFull" | "dateFullWeekday" | "dayMonthYear" | "weekdayShort" | "weekdayLong" | "monthLong" | "monthShort" | "monthYear" | "dayMonthShort" | "hourMark", Intl.DateTimeFormatOptions>> | undefined>;
2627
+ private readonly injectedLabels;
2628
+ private readonly projectedEvent;
2629
+ /** Effective labels — the app-wide (or English) set, with `labels` on top. */
2630
+ readonly l: _angular_core.Signal<FoldCalendarLabels>;
2631
+ /** The custom chip template, when one is projected. */
2632
+ readonly eventContent: _angular_core.Signal<_angular_core.TemplateRef<fold_ng.FoldCalendarEventContext<any>> | null>;
2633
+ /**
2634
+ * What this locale says its week looks like — the default behind
2635
+ * `weekStartsOn` and `weekendDays`, so a calendar is right in Cairo and
2636
+ * Chicago without the caller having to know either.
2637
+ */
2638
+ readonly weekInfo: _angular_core.Signal<fold_ng.FoldWeekInfo>;
2639
+ /** The anchor a view should use: the caller's, else the locale's. */
2640
+ anchor(explicit: FoldWeekday | undefined): FoldWeekday;
2641
+ /** The weekend a view should shade: the caller's, else the locale's. */
2642
+ weekend(explicit: readonly FoldWeekday[] | undefined): readonly FoldWeekday[];
2643
+ /** One date, in this view's locale and its format overrides. */
2644
+ format(date: FoldCalendarDate, format: FoldCalendarFormat): string;
2645
+ /** A wall-clock time, in this view's locale (24-hour, or AM/PM). */
2646
+ formatTime(time: string): string;
2647
+ /** A span, in this view's locale and its format overrides. */
2648
+ formatRange(from: FoldCalendarDate, to: FoldCalendarDate, format: FoldCalendarFormat): string;
2649
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarChromeDirective, never>;
2650
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldCalendarChromeDirective, never, never, { "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "formats": { "alias": "formats"; "required": false; "isSignal": true; }; }, {}, ["projectedEvent"], never, true, never>;
2651
+ }
2652
+
2653
+ /**
2654
+ * Public data model for the calendar family. The calendar knows nothing of the
2655
+ * domain it plots — an app maps its own records onto {@link FoldCalendarEvent}
2656
+ * and gets them back, still typed, on every output.
2657
+ *
2658
+ * That ignorance is the design, not a stage it will grow out of. The family
2659
+ * **displays**; it never originates a record, because the validation and the
2660
+ * write path both belong to the consumer. Which is also why `tone` is an input
2661
+ * rather than something derived here: a band that turns amber and then red as
2662
+ * an account sits unactivated, and a band that is amber because a leave request
2663
+ * is pending, are the same component being told two different things.
2664
+ */
2665
+ /**
2666
+ * Semantic weight of an event, mapped to the shared tone roles. `muted` reads
2667
+ * as struck-through and dimmed — the "it no longer counts" state (cancelled,
2668
+ * withdrawn, superseded) rather than a quieter `neutral`.
2669
+ */
2670
+ type FoldCalendarTone = "neutral" | "success" | "warning" | "alert" | "muted";
2671
+ /** Which half of a day an event's edge falls on. */
2672
+ type FoldCalendarHalfDay = "morning" | "afternoon";
2673
+ /**
2674
+ * An entry on the calendar, spanning one or more whole days.
2675
+ *
2676
+ * Generic over `T` so `data` carries the app's own record through layout and
2677
+ * back out of `eventClick` without a cast. Both bounds are **inclusive**: a
2678
+ * single-day event has `start === end`.
2679
+ */
2680
+ interface FoldCalendarEvent<T = unknown> {
2681
+ /** Stable identity — also the layout key, so it must be unique per render. */
2682
+ readonly id: string;
2683
+ /** First day, inclusive. */
2684
+ readonly start: FoldCalendarDate;
2685
+ /** Last day, inclusive. Equal to {@link start} for a single-day event. */
2686
+ readonly end: FoldCalendarDate;
2687
+ /** Primary text on the chip. */
2688
+ readonly label: string;
2689
+ /** Secondary line — status, duration, venue. Rendered verbatim. */
2690
+ readonly subline?: string;
2691
+ /** Semantic weight. @default 'neutral' */
2692
+ readonly tone?: FoldCalendarTone;
2693
+ /** Leading glyph, drawn with `fold-icon`. */
2694
+ readonly icon?: FoldIconName;
2695
+ /**
2696
+ * Wall-clock start, `HH:mm`. An event carrying **both** times is placed on
2697
+ * the time grid's clock; anything else — neither, or only one — is an all-day
2698
+ * span, which is what the month, week, day and list views plot. Half a time
2699
+ * is a data bug, and reading it as all-day loses the least.
2700
+ *
2701
+ * No zone, by the same decision as the date: 09:00 is the hour on the wall,
2702
+ * and the app converts once at its own boundary.
2703
+ */
2704
+ readonly startTime?: FoldCalendarTime;
2705
+ /** Wall-clock end, `HH:mm`. `24:00` is midnight at the end of {@link end}. */
2706
+ readonly endTime?: FoldCalendarTime;
2707
+ /** Which half of {@link start} the event opens on. */
2708
+ readonly startHalfDay?: FoldCalendarHalfDay;
2709
+ /** Which half of {@link end} the event closes on. */
2710
+ readonly endHalfDay?: FoldCalendarHalfDay;
2711
+ /**
2712
+ * Collapses events sharing this key into a single chip carrying a count —
2713
+ * for a bulk action that would otherwise flood the grid (a whole team off on
2714
+ * the same days).
2715
+ *
2716
+ * The chip covers the **union** of the members' ranges, and is open-ended if
2717
+ * **any** member is. Everything else it renders (tone, icon, label, subline,
2718
+ * `sourceKey`) comes from one real member: the most severe by tone
2719
+ * (`alert` → `warning` → `success` → `neutral` → `muted`), ties going to
2720
+ * document order. Picking one event rather than merging fields keeps the chip
2721
+ * something that actually exists in the feed, and stops a first cancelled
2722
+ * member from quietly greying out a group that contains an alert.
2723
+ */
2724
+ readonly groupId?: string;
2725
+ /** Label for the collapsed chip; falls back to the representative's `label`. */
2726
+ readonly groupLabel?: string;
2727
+ /**
2728
+ * The real range extends past {@link start} beyond what was loaded — the
2729
+ * caller clamped it to the queried window. Renders the same open edge as a
2730
+ * span continuing from an earlier week.
2731
+ */
2732
+ readonly openStart?: boolean;
2733
+ /** As {@link openStart}, for an end with no known bound (an open contract). */
2734
+ readonly openEnd?: boolean;
2735
+ /**
2736
+ * Which feed this came from — the key a {@link FoldCalendarSource} declares.
2737
+ * A calendar usually merges several (a programme, staff leave, contracts),
2738
+ * and this is what lets one be counted and switched off without the calendar
2739
+ * knowing what any of them mean.
2740
+ */
2741
+ readonly sourceKey?: string;
2742
+ /** The app's own record, handed back untouched on every output. */
2743
+ readonly data?: T;
2744
+ }
2745
+ /** One feed of events, as the source filter lists it. */
2746
+ interface FoldCalendarSource {
2747
+ /** Matches {@link FoldCalendarEvent.sourceKey}. */
2748
+ readonly key: string;
2749
+ /** Shown on the chip. */
2750
+ readonly label: string;
2751
+ /** Dot colour — the tone the feed reads as. @default 'neutral' */
2752
+ readonly tone?: FoldCalendarTone;
2753
+ }
2754
+ /**
2755
+ * One day cell of a grid — the calendar's answer to "what is this square",
2756
+ * with every flag a view needs to style it already resolved.
2757
+ */
2758
+ interface FoldCalendarDay {
2759
+ /** The day this cell stands for. */
2760
+ readonly date: FoldCalendarDate;
2761
+ /** Day of the month, `1`–`31`, for the cell's number. */
2762
+ readonly dayOfMonth: number;
2763
+ /** Inside the month being displayed — `false` for the leading/trailing pad. */
2764
+ readonly inMonth: boolean;
2765
+ /** Matches the calendar's "today". */
2766
+ readonly isToday: boolean;
2767
+ /** Falls on one of the configured weekend days. */
2768
+ readonly isWeekend: boolean;
2769
+ /** How many events cover this day — already counted, so a view never refilters. */
2770
+ readonly eventCount: number;
2771
+ /**
2772
+ * How many of them no lane could take, so this cell is showing fewer events
2773
+ * than it has. Always `0` in the column views, which never drop anything.
2774
+ */
2775
+ readonly hiddenCount: number;
2776
+ }
2777
+ /**
2778
+ * Extra class names for one day cell — the hook for anything the calendar
2779
+ * cannot know: a public holiday, a closure, a blackout, "fully staffed". Each
2780
+ * name is emitted as `data-fold-day-<name>` on the cell, so an app styles it
2781
+ * from its own sheet without reaching for an internal class.
2782
+ *
2783
+ * @example
2784
+ * ```ts
2785
+ * readonly holidays = (day: FoldCalendarDay) =>
2786
+ * HOLIDAYS.has(day.date) ? ['holiday'] : [];
2787
+ * ```
2788
+ */
2789
+ type FoldCalendarDayModifiers = (day: FoldCalendarDay) => readonly string[];
2790
+ /**
2791
+ * A laid-out slice of one event inside one week row: which columns it covers,
2792
+ * which lane it sits in, and whether its edges are real or a continuation.
2793
+ *
2794
+ * An event spanning a week boundary produces one band per week — same event,
2795
+ * different segment — which is why {@link key} exists alongside the event id.
2796
+ */
2797
+ interface FoldCalendarBand<T = unknown> {
2798
+ /** Unique per segment (`<eventId>@<weekStart>`) — the `@for` track key. */
2799
+ readonly key: string;
2800
+ /** The event this segment belongs to (the representative, when grouped). */
2801
+ readonly event: FoldCalendarEvent<T>;
2802
+ /** First column covered, `0`–`6`. */
2803
+ readonly startColumn: number;
2804
+ /** Last column covered, `0`–`6`, inclusive. */
2805
+ readonly endColumn: number;
2806
+ /** Row within the week's stack, `0`-based. */
2807
+ readonly lane: number;
2808
+ /** The span started before this week (or is open-ended) — draw an open edge. */
2809
+ readonly continuesBefore: boolean;
2810
+ /** The span continues after this week (or is open-ended). */
2811
+ readonly continuesAfter: boolean;
2812
+ /** Events collapsed into this band; `1` when it stands for itself. */
2813
+ readonly groupSize: number;
2814
+ /** Half-day edge, only when this segment carries the event's real start. */
2815
+ readonly startHalfDay?: FoldCalendarHalfDay;
2816
+ /** Half-day edge, only when this segment carries the event's real end. */
2817
+ readonly endHalfDay?: FoldCalendarHalfDay;
2818
+ }
2819
+ /**
2820
+ * A day with the events sitting on it — the render model of the column views
2821
+ * (week, day), where chips stack in a list and need no lane packing.
2822
+ */
2823
+ interface FoldCalendarDayEvents<T = unknown> {
2824
+ readonly day: FoldCalendarDay;
2825
+ /** Events covering {@link day}, in the caller's order. */
2826
+ readonly events: readonly FoldCalendarEvent<T>[];
2827
+ }
2828
+ /** One row of a month grid: its seven days, the bands over them, and what did not fit. */
2829
+ interface FoldCalendarWeek<T = unknown> {
2830
+ /** The week's anchor day — also the segment keys' discriminator. */
2831
+ readonly start: FoldCalendarDate;
2832
+ /** Seven cells, in column order. */
2833
+ readonly days: readonly FoldCalendarDay[];
2834
+ /** Placed bands, ordered by lane then column. */
2835
+ readonly bands: readonly FoldCalendarBand<T>[];
2836
+ /**
2837
+ * Spans overlapping this week that no lane could take. What each *day* lost
2838
+ * is on the day itself ({@link FoldCalendarDay.hiddenCount}) — a row-wide
2839
+ * total says a week is crowded without saying which day to open.
2840
+ */
2841
+ readonly hiddenCount: number;
2842
+ }
2843
+
2844
+ /**
2845
+ * `<fold-calendar-month>` — a month grid where events span the days they cover.
2846
+ *
2847
+ * The grid is a **date axis**: seven columns of whole days, and over them a
2848
+ * layer of bands, each stretching from the column its event starts on to the
2849
+ * column it ends on. An event crossing a week boundary is drawn once per week
2850
+ * with an open edge on the side that continues, so a three-week holiday reads
2851
+ * as one thing rather than twenty-one chips.
2852
+ *
2853
+ * Dates are plain `YYYY-MM-DD` strings — see `calendar-date.ts` for why that,
2854
+ * and not `Date`.
2855
+ *
2856
+ * ## Inputs
2857
+ * | Input | Type | Default | Meaning |
2858
+ * |----------------|-------------------------------|---------------|---------|
2859
+ * | `month` | `FoldCalendarDate` | — | **Two-way.** Any date in the month on display; keyboard paging writes back. |
2860
+ * | `events` | `FoldCalendarEvent<T>[]` | `[]` | What to plot. Anything outside the grid is ignored. |
2861
+ * | `today` | `FoldCalendarDate` | — | The day to mark. Omitted, nothing is marked — pass `foldToday()`. |
2862
+ * | `weekStartsOn` | `FoldWeekday` | the locale's | Which day opens the row — `Intl.Locale` knows, so it is only an override. |
2863
+ * | `weekendDays` | `FoldWeekday[]` | the locale's | Which days are shaded — a separate fact from the anchor, and also in the locale. |
2864
+ * | `showWeekNumbers` | `boolean` | `false` | An ISO week number in a leading column. |
2865
+ * | `maxLanes` | `number` | `3` | Bands a week stacks before the rest collapse into overflow chips. |
2866
+ * | `fixedWeeks` | `boolean` | `false` | Always six rows, so the grid keeps one height across months. |
2867
+ * | `dayModifiers` | `(day) => string[]` | — | Extra names per cell, emitted as `data-fold-day-modifiers`. |
2868
+ * | `locale` | `string` | runtime | Drives month/weekday names through `Intl`. |
2869
+ * | `labels` | `Partial<FoldCalendarLabels>` | — | Per-instance overrides of the chrome strings. |
2870
+ *
2871
+ * ## Outputs
2872
+ * | Output | Payload | Fires on |
2873
+ * |-----------------|------------------------|----------|
2874
+ * | `dayClick` | `FoldCalendarDate` | A day cell activated by click, `Enter` or `Space`. |
2875
+ * | `eventClick` | `FoldCalendarEvent<T>` | A band clicked. Grouped bands emit their representative. |
2876
+ * | `overflowClick` | `FoldCalendarDate` | A `+N` chip — the **day** whose events overflowed, so the caller knows which one to open. |
2877
+ *
2878
+ * ## Templates
2879
+ * | Directive | Replaces |
2880
+ * |------------------------|----------|
2881
+ * | `foldCalendarEvent` | The inside of a band — icon + label + count. |
2882
+ * | `foldCalendarDay` | The inside of a day cell — the day number. |
2883
+ * | `foldCalendarOverflow` | The `+N` chip. |
2884
+ *
2885
+ * ## Theming
2886
+ * | CSS variable | Default | Sets |
2887
+ * |---------------------------------------|---------|------|
2888
+ * | `--fold-calendar-month-header-row` | `30px` | Height of the day-number row. |
2889
+ * | `--fold-calendar-month-lane` | `22px` | Height of one band lane. |
2890
+ * | `--fold-calendar-month-row-min-height`| `112px` | Minimum height of a week row. |
2891
+ * | `--fold-calendar-month-daynum-size` | `22px` | The day number's round box. |
2892
+ * | `--fold-calendar-month-cell-padding` | `--fold-space-sm` | Padding inside a day cell. |
2893
+ * | `--fold-calendar-month-week-number-width` | `34px` | The ISO week column, when shown. |
2894
+ * | `--fold-calendar-bar-width` | `3px` | The tone bar down a band's leading edge. |
2895
+ * | `--fold-calendar-band-radius` | `--fold-radius-sm` | Band and chip corners. |
2896
+ * | `--fold-calendar-band-gutter` | `--fold-space-xs` | Gap between a band and its cell edge. |
2897
+ *
2898
+ * ## Accessibility
2899
+ * The **date grid** is the ARIA structure: `role="grid"` over rows of
2900
+ * `gridcell` days, with one roving tab stop (the focused day, else today, else
2901
+ * the 1st) and the grid pattern on the arrow keys — horizontal steps a day,
2902
+ * vertical steps a week, `Home`/`End` snap to the week, and `PageUp`/`PageDown`
2903
+ * page the month, writing back through `month`.
2904
+ *
2905
+ * Bands cannot be `gridcell`s — they span columns, which is the whole point —
2906
+ * so they are **`aria-hidden` mouse affordances**, and each day cell instead
2907
+ * announces its date, the today marker, its **event count** and, when the lane
2908
+ * budget hid some, **how many it is not showing**.
2909
+ *
2910
+ * That makes `dayClick` **load-bearing, not optional**: it is the accessible
2911
+ * path into an individual event. A month that handles only `eventClick` is a
2912
+ * view whose events no keyboard can reach — wire `dayClick` to a day or list
2913
+ * view, as the gallery does.
2914
+ *
2915
+ * @selector `fold-calendar-month`
2916
+ *
2917
+ * @example
2918
+ * ```html
2919
+ * <fold-calendar-month
2920
+ * [(month)]="month"
2921
+ * [events]="events()"
2922
+ * [today]="today"
2923
+ * (dayClick)="openDay($event)"
2924
+ * (eventClick)="openEvent($event)"
2925
+ * />
2926
+ * ```
2927
+ */
2928
+ declare class FoldCalendarMonthComponent<T = unknown> {
2929
+ /** Any date inside the month on display. Two-way: keyboard paging writes back. */
2930
+ readonly month: _angular_core.ModelSignal<string>;
2931
+ /** Events to plot; those missing the grid entirely are ignored. */
2932
+ readonly events: _angular_core.InputSignal<readonly FoldCalendarEvent<T>[]>;
2933
+ /** The day to mark as today. Omit and none is marked (an SSR-stable default). */
2934
+ readonly today: _angular_core.InputSignal<string | undefined>;
2935
+ /** Day the weeks start on. @default the locale's own first day */
2936
+ readonly weekStartsOn: _angular_core.InputSignal<FoldWeekday | undefined>;
2937
+ /** Days shaded as the weekend. @default the locale's own weekend */
2938
+ readonly weekendDays: _angular_core.InputSignal<readonly FoldWeekday[] | undefined>;
2939
+ /** Show the ISO week number in a leading column. */
2940
+ readonly showWeekNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
2941
+ /** Bands a week stacks before the rest collapse into overflow chips. @default 3 */
2942
+ readonly maxLanes: _angular_core.InputSignalWithTransform<number, unknown>;
2943
+ /** Always emit six rows, so the grid keeps one height across months. */
2944
+ readonly fixedWeeks: _angular_core.InputSignalWithTransform<boolean, unknown>;
2945
+ /** Extra names for a cell, emitted as `data-fold-day-modifiers`. */
2946
+ readonly dayModifiers: _angular_core.InputSignal<FoldCalendarDayModifiers | undefined>;
2947
+ /** A day cell was activated. */
2948
+ readonly dayClick: _angular_core.OutputEmitterRef<string>;
2949
+ /** A band was clicked; a grouped band emits its representative event. */
2950
+ readonly eventClick: _angular_core.OutputEmitterRef<FoldCalendarEvent<T>>;
2951
+ /** A `+N` chip was clicked, with the day whose events overflowed. */
2952
+ readonly overflowClick: _angular_core.OutputEmitterRef<string>;
2953
+ /** Labels, locale and the projected chip template — see the directive. */
2954
+ protected readonly chrome: FoldCalendarChromeDirective;
2955
+ private readonly host;
2956
+ private readonly projectedDay;
2957
+ private readonly projectedOverflow;
2958
+ /** The custom day-cell template, when one is projected. */
2959
+ protected readonly dayContent: _angular_core.Signal<_angular_core.TemplateRef<fold_ng.FoldCalendarDayContext> | null>;
2960
+ /** The custom overflow-chip template, when one is projected. */
2961
+ protected readonly overflowContent: _angular_core.Signal<_angular_core.TemplateRef<fold_ng.FoldCalendarOverflowContext> | null>;
2962
+ /**
2963
+ * Lanes this grid stacks — clamped once, by the layout, and read back here so
2964
+ * the geometry and the CSS row template can never disagree.
2965
+ */
2966
+ private readonly lanes;
2967
+ /** The laid-out grid: week rows, their days, and their packed bands. */
2968
+ /** The anchor in force: the caller's, else the one the locale declares. */
2969
+ protected readonly anchor: _angular_core.Signal<FoldWeekday>;
2970
+ protected readonly weeks: _angular_core.Signal<readonly FoldCalendarWeek<T>[]>;
2971
+ /** Column headers, walked out of `Intl` so every locale comes for free. */
2972
+ protected readonly weekdayNames: _angular_core.Signal<readonly string[]>;
2973
+ /**
2974
+ * Columns before the first day. The week-number column is a real grid column,
2975
+ * so everything placed by index — cells, bands, overflow chips — shifts with
2976
+ * it, and nothing has to know why.
2977
+ */
2978
+ protected readonly columnOffset: _angular_core.Signal<0 | 1>;
2979
+ /** The ISO week each row belongs to — always Monday-based, whatever the anchor. */
2980
+ protected weekNumber(week: FoldCalendarWeek<T>): number;
2981
+ /**
2982
+ * Row track sizes: the day-number row, one row per lane, then the overflow
2983
+ * row. Both heights are themeable knobs, which is why they are `var()`s.
2984
+ */
2985
+ protected readonly rowTemplate: _angular_core.Signal<string>;
2986
+ /** The overflow chips' row — always the one after the last lane. */
2987
+ protected readonly overflowRow: _angular_core.Signal<number>;
2988
+ /** Every date the grid currently shows — the bound focus may not leave. */
2989
+ private readonly gridDates;
2990
+ /** Where the tab stop sits before the user moves it: today, else the 1st. */
2991
+ private readonly defaultStop;
2992
+ /** The grid's single tab stop and the arrow keys that move it. */
2993
+ private readonly focus;
2994
+ protected dayTabIndex(date: FoldCalendarDate): 0 | -1;
2995
+ /** A cell's caller-supplied names, as one `~=`-matchable attribute. */
2996
+ protected dayModifierAttr(day: FoldCalendarDay): string | null;
2997
+ /**
2998
+ * A day's accessible name: its date, the today marker, what sits on it, and
2999
+ * what the lane budget is keeping from it.
3000
+ */
3001
+ protected dayLabel(day: FoldCalendarDay): string;
3002
+ /** A band's text: the group's label when it stands for several events. */
3003
+ protected bandLabel(band: FoldCalendarBand<T>): string;
3004
+ /** The leading glyph — suppressed on a continuation, which has no real start. */
3005
+ protected bandIcon(band: FoldCalendarBand<T>): FoldIconName | null;
3006
+ protected onDayFocus(date: FoldCalendarDate): void;
3007
+ /** A cell is not a `<button>`, so activation is wired by hand. */
3008
+ protected onDayKeydown(event: KeyboardEvent, date: FoldCalendarDate): void;
3009
+ private rootElement;
3010
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarMonthComponent<any>, never>;
3011
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarMonthComponent<any>, "fold-calendar-month", never, { "month": { "alias": "month"; "required": true; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "weekStartsOn": { "alias": "weekStartsOn"; "required": false; "isSignal": true; }; "weekendDays": { "alias": "weekendDays"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "maxLanes": { "alias": "maxLanes"; "required": false; "isSignal": true; }; "fixedWeeks": { "alias": "fixedWeeks"; "required": false; "isSignal": true; }; "dayModifiers": { "alias": "dayModifiers"; "required": false; "isSignal": true; }; }, { "month": "monthChange"; "dayClick": "dayClick"; "eventClick": "eventClick"; "overflowClick": "overflowClick"; }, ["projectedDay", "projectedOverflow"], never, true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
3012
+ }
3013
+
3014
+ /**
3015
+ * `<fold-calendar-week>` — one week as seven day columns of stacked chips.
3016
+ *
3017
+ * Where the month view packs spans into lanes, a week simply lists what covers
3018
+ * each day: a three-day event appears under all three, which is the reading a
3019
+ * week is for. Nothing spans, so nothing is clipped and there is no overflow.
3020
+ *
3021
+ * ## Inputs
3022
+ * | Input | Type | Default | Meaning |
3023
+ * |----------------|--------------------------|---------|---------|
3024
+ * | `date` | `FoldCalendarDate` | — | Any date in the week on display. |
3025
+ * | `events` | `FoldCalendarEvent<T>[]` | `[]` | What to list. |
3026
+ * | `today` | `FoldCalendarDate` | — | The day to mark. |
3027
+ * | `weekStartsOn` | `FoldWeekday` | the locale's | Which day opens the week — `Intl.Locale` knows. |
3028
+ * | `weekendDays` | `FoldWeekday[]` | the locale's | Which days are shaded. |
3029
+ * | `locale` | `string` | runtime | Drives the column headers through `Intl`. |
3030
+ * | `labels` | `Partial<FoldCalendarLabels>` | — | Per-instance label overrides. |
3031
+ *
3032
+ * `date` is a plain input, not a `model`: this view never pages itself, so
3033
+ * writing back would be a promise it does not keep. Pair it with
3034
+ * `<fold-calendar-toolbar>`, which does own the paging.
3035
+ *
3036
+ * ## Theming
3037
+ * | CSS variable | Default | Sets |
3038
+ * |---------------------------------------|---------|------|
3039
+ * | `--fold-calendar-week-column-height` | `320px` | Height of the day columns. |
3040
+ * | `--fold-calendar-bar-width` | `3px` | The tone bar down a chip's leading edge. |
3041
+ * | `--fold-calendar-band-radius` | `--fold-radius-sm` | Chip corners. |
3042
+ *
3043
+ * ## Outputs
3044
+ * | Output | Payload | Fires on |
3045
+ * |--------------|------------------------|----------|
3046
+ * | `dayClick` | `FoldCalendarDate` | A column header activated. |
3047
+ * | `eventClick` | `FoldCalendarEvent<T>` | A chip activated. |
3048
+ *
3049
+ * ## Accessibility
3050
+ * Each column is a `<section>` named by its full date, holding a header button
3051
+ * and a list of chips. Because a chip sits **inside** the day it belongs to —
3052
+ * no spanning, no overlay — every control is a real child in the natural tab
3053
+ * order, so this view needs none of the month grid's roving-tabindex machinery
3054
+ * and every event is reachable by keyboard.
3055
+ *
3056
+ * @selector `fold-calendar-week`
3057
+ *
3058
+ * @example
3059
+ * ```html
3060
+ * <fold-calendar-week
3061
+ * [(date)]="date"
3062
+ * [events]="events()"
3063
+ * [today]="today"
3064
+ * (eventClick)="open($event)"
3065
+ * />
3066
+ * ```
3067
+ */
3068
+ declare class FoldCalendarWeekComponent<T = unknown> {
3069
+ /** Any date inside the week on display. */
3070
+ readonly date: _angular_core.InputSignal<string>;
3071
+ /** Events to list under the days they cover. */
3072
+ readonly events: _angular_core.InputSignal<readonly FoldCalendarEvent<T>[]>;
3073
+ /** The day to mark as today. */
3074
+ readonly today: _angular_core.InputSignal<string | undefined>;
3075
+ /** Day the week starts on. @default the locale's own first day */
3076
+ readonly weekStartsOn: _angular_core.InputSignal<FoldWeekday | undefined>;
3077
+ /** Days shaded as the weekend. @default ['sat', 'sun'] */
3078
+ readonly weekendDays: _angular_core.InputSignal<readonly FoldWeekday[] | undefined>;
3079
+ /** A column header was activated. */
3080
+ readonly dayClick: _angular_core.OutputEmitterRef<string>;
3081
+ /** A chip was activated. */
3082
+ readonly eventClick: _angular_core.OutputEmitterRef<FoldCalendarEvent<T>>;
3083
+ /** Labels, locale and the projected chip template — see the directive. */
3084
+ protected readonly chrome: FoldCalendarChromeDirective;
3085
+ protected readonly columns: _angular_core.Signal<readonly FoldCalendarDayEvents<T>[]>;
3086
+ protected weekdayName(column: FoldCalendarDayEvents<T>): string;
3087
+ /** A column's accessible name: its date, the today marker, and what sits on it. */
3088
+ protected columnLabel(column: FoldCalendarDayEvents<T>): string;
3089
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarWeekComponent<any>, never>;
3090
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarWeekComponent<any>, "fold-calendar-week", never, { "date": { "alias": "date"; "required": true; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "weekStartsOn": { "alias": "weekStartsOn"; "required": false; "isSignal": true; }; "weekendDays": { "alias": "weekendDays"; "required": false; "isSignal": true; }; }, { "dayClick": "dayClick"; "eventClick": "eventClick"; }, never, never, true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
3091
+ }
3092
+
3093
+ /**
3094
+ * `<fold-calendar-day>` — one day, its events listed in full.
3095
+ *
3096
+ * The end of the drill-down: where the month view has room only for a label,
3097
+ * this one has room for the subline too, so it is the view a `dayClick`
3098
+ * naturally lands on.
3099
+ *
3100
+ * ## Inputs
3101
+ * | Input | Type | Default | Meaning |
3102
+ * |----------|--------------------------|---------|---------|
3103
+ * | `date` | `FoldCalendarDate` | — | The day on display. |
3104
+ * | `events` | `FoldCalendarEvent<T>[]` | `[]` | Filtered to those covering `date`. |
3105
+ * | `today` | `FoldCalendarDate` | — | Marks the header when it matches. |
3106
+ * | `locale` | `string` | runtime | Drives the header through `Intl`. |
3107
+ * | `labels` | `Partial<FoldCalendarLabels>` | — | Per-instance label overrides. |
3108
+ *
3109
+ * ## Outputs
3110
+ * | Output | Payload | Fires on |
3111
+ * |--------------|------------------------|----------|
3112
+ * | `eventClick` | `FoldCalendarEvent<T>` | A chip activated. |
3113
+ *
3114
+ * ## Slots
3115
+ * | Selector | Region |
3116
+ * |--------------------------------|--------|
3117
+ * | `button[empty]`, `a[empty]`, `div[empty]` | Under the empty message — the place for a "new request" action. |
3118
+ * | *(default)* | After the list. |
3119
+ *
3120
+ * The `empty` slot is **tag-qualified** (rule 4.8): `empty` is also an input on
3121
+ * `fold-field` and `fold-data-table`, and a bare `[empty]` selector would
3122
+ * capture either of them whole.
3123
+ *
3124
+ * ## Theming
3125
+ * | CSS variable | Default | Sets |
3126
+ * |------------------------------------|---------|------|
3127
+ * | `--fold-calendar-day-number-size` | `--fold-text-3xl` | The big day number. |
3128
+ * | `--fold-calendar-bar-width` | `3px` | The tone bar down a chip's leading edge. |
3129
+ * | `--fold-calendar-band-radius` | `--fold-radius-sm` | Chip corners. |
3130
+ *
3131
+ * @selector `fold-calendar-day`
3132
+ *
3133
+ * @example
3134
+ * ```html
3135
+ * <fold-calendar-day [date]="date()" [events]="events()" [today]="today">
3136
+ * <button empty foldButton (click)="request()">New request</button>
3137
+ * </fold-calendar-day>
3138
+ * ```
3139
+ */
3140
+ declare class FoldCalendarDayComponent<T = unknown> {
3141
+ /** The day on display. */
3142
+ readonly date: _angular_core.InputSignal<string>;
3143
+ /** Events to filter down to this day. */
3144
+ readonly events: _angular_core.InputSignal<readonly FoldCalendarEvent<T>[]>;
3145
+ /** The day to mark as today. */
3146
+ readonly today: _angular_core.InputSignal<string | undefined>;
3147
+ /** A chip was activated. */
3148
+ readonly eventClick: _angular_core.OutputEmitterRef<FoldCalendarEvent<T>>;
3149
+ /** Labels, locale and the projected chip template — see the directive. */
3150
+ protected readonly chrome: FoldCalendarChromeDirective;
3151
+ protected readonly dayEvents: _angular_core.Signal<readonly FoldCalendarEvent<T>[]>;
3152
+ protected readonly isToday: _angular_core.Signal<boolean>;
3153
+ /** `Saturday` — the weekday alone; the month sits beside the number. */
3154
+ protected readonly weekdayName: _angular_core.Signal<string>;
3155
+ /** `May` — read with the day number, which is why it is not in the line above. */
3156
+ protected readonly monthName: _angular_core.Signal<string>;
3157
+ protected readonly dayOfMonth: _angular_core.Signal<number>;
3158
+ /** The header's accessible name: the full date, plus the today marker. */
3159
+ protected readonly headerLabel: _angular_core.Signal<string>;
3160
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarDayComponent<any>, never>;
3161
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarDayComponent<any>, "fold-calendar-day", never, { "date": { "alias": "date"; "required": true; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; }, { "eventClick": "eventClick"; }, never, ["button[empty], a[empty], div[empty]", "*"], true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
3162
+ }
3163
+
3164
+ /**
3165
+ * `<fold-calendar-list>` — everything in a range, in date order.
3166
+ *
3167
+ * The flat reading of the same data: no grid, no packing, so nothing is ever
3168
+ * hidden behind a lane budget. Each row leads with the span it covers, which
3169
+ * is what the grid views can only imply.
3170
+ *
3171
+ * For a sortable, column-configurable table instead, feed
3172
+ * `foldEventsInRange()` straight into {@link FoldDataTableComponent} — this
3173
+ * view stays deliberately small.
3174
+ *
3175
+ * ## Inputs
3176
+ * | Input | Type | Default | Meaning |
3177
+ * |----------|--------------------------|---------|---------|
3178
+ * | `events` | `FoldCalendarEvent<T>[]` | `[]` | Source events. |
3179
+ * | `from` | `FoldCalendarDate` | — | Range start; omit to list everything. |
3180
+ * | `to` | `FoldCalendarDate` | — | Range end; omit to list everything. |
3181
+ * | `locale` | `string` | runtime | Drives the span labels through `Intl`. |
3182
+ * | `labels` | `Partial<FoldCalendarLabels>` | — | Per-instance label overrides. |
3183
+ *
3184
+ * ## Outputs
3185
+ * | Output | Payload | Fires on |
3186
+ * |--------------|------------------------|----------|
3187
+ * | `eventClick` | `FoldCalendarEvent<T>` | A row activated. |
3188
+ *
3189
+ * ## Theming
3190
+ * | CSS variable | Default | Sets |
3191
+ * |------------------------------------|---------|------|
3192
+ * | `--fold-calendar-list-date-width` | `7rem` | The leading date column — widen it for verbose locales. |
3193
+ * | `--fold-calendar-bar-width` | `3px` | The tone bar down a row's leading edge. |
3194
+ *
3195
+ * A projected `foldCalendarEvent` template replaces a row's **whole** inside,
3196
+ * as in every other view: the built-in bar and date belong to the default
3197
+ * rendering, not to the frame around it.
3198
+ *
3199
+ * @selector `fold-calendar-list`
3200
+ *
3201
+ * @example
3202
+ * ```html
3203
+ * <fold-calendar-list
3204
+ * [events]="events()"
3205
+ * [from]="range().from"
3206
+ * [to]="range().to"
3207
+ * (eventClick)="open($event)"
3208
+ * />
3209
+ * ```
3210
+ */
3211
+ declare class FoldCalendarListComponent<T = unknown> {
3212
+ /** Source events. */
3213
+ readonly events: _angular_core.InputSignal<readonly FoldCalendarEvent<T>[]>;
3214
+ /** Range start, inclusive. Omit (with `to`) to list every event given. */
3215
+ readonly from: _angular_core.InputSignal<string | undefined>;
3216
+ /** Range end, inclusive. */
3217
+ readonly to: _angular_core.InputSignal<string | undefined>;
3218
+ /** A row was activated. */
3219
+ readonly eventClick: _angular_core.OutputEmitterRef<FoldCalendarEvent<T>>;
3220
+ /** Labels, locale and the projected chip template — see the directive. */
3221
+ protected readonly chrome: FoldCalendarChromeDirective;
3222
+ /** In range (when one is given), earliest first. */
3223
+ protected readonly rows: _angular_core.Signal<readonly FoldCalendarEvent<T>[]>;
3224
+ /**
3225
+ * The span, collapsed to one date when it covers a single day — `Intl`'s
3226
+ * own range formatter does that, and picks the locale's separator and its
3227
+ * order, which is why this is not a translatable label.
3228
+ */
3229
+ protected rangeLabel(event: FoldCalendarEvent<T>): string;
3230
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarListComponent<any>, never>;
3231
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarListComponent<any>, "fold-calendar-list", never, { "events": { "alias": "events"; "required": false; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; "to": { "alias": "to"; "required": false; "isSignal": true; }; }, { "eventClick": "eventClick"; }, never, never, true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
3232
+ }
3233
+
3234
+ /**
3235
+ * The time grid's geometry: hour columns with events placed **inside** a day,
3236
+ * and an all-day strip above them.
3237
+ *
3238
+ * The two halves are two different problems and stay two: a timed event is an
3239
+ * interval in minutes laid out across a column's width
3240
+ * ({@link foldLayOutOverlaps}), an all-day event is a span across days laid out
3241
+ * in lanes ({@link foldPackRow}) — the same packer the month grid uses, so a
3242
+ * three-day absence reads identically in both.
3243
+ *
3244
+ * Everything here is a **fraction of the visible window**, not a pixel: the
3245
+ * window is a caller's choice (`dayStart`/`dayEnd`), the height is CSS's, and a
3246
+ * layout that computed pixels would have to be told about both.
3247
+ */
3248
+ /** How to build a time grid. */
3249
+ interface FoldTimeGridOptions {
3250
+ /** Any date inside the range to display. */
3251
+ readonly date: FoldCalendarDate;
3252
+ /** Days to show: `1` is a day view, `7` a week. @default 7 */
3253
+ readonly dayCount?: number;
3254
+ /** Snap the range to the week — ignored unless `dayCount` is 7. @default true */
3255
+ readonly snapToWeek?: boolean;
3256
+ /** Day the week starts on. @default 'mon' */
3257
+ readonly weekStartsOn?: FoldWeekday;
3258
+ /** Days shaded as the weekend. @default ['sat', 'sun'] */
3259
+ readonly weekendDays?: readonly FoldWeekday[] | undefined;
3260
+ /** The day to flag as today; omit to flag none. */
3261
+ readonly today?: FoldCalendarDate | undefined;
3262
+ /** First hour on screen. @default '00:00' */
3263
+ readonly dayStart?: FoldCalendarTime;
3264
+ /** Last hour on screen; `24:00` is midnight. @default '24:00' */
3265
+ readonly dayEnd?: FoldCalendarTime;
3266
+ /** Lanes the all-day strip stacks before events overflow. @default 2 */
3267
+ readonly maxAllDayLanes?: number;
3268
+ }
3269
+ /** One timed event's slice of one day. */
3270
+ interface FoldCalendarBlock<T = unknown> {
3271
+ /** Unique per slice (`<eventId>@<date>`) — the `@for` track key. */
3272
+ readonly key: string;
3273
+ readonly event: FoldCalendarEvent<T>;
3274
+ /** Where it starts, as a fraction `0`–`1` of the visible window. */
3275
+ readonly top: number;
3276
+ /** How tall it is, as a fraction of the visible window. */
3277
+ readonly height: number;
3278
+ /** Its column inside its overlap cluster, `0`-based. */
3279
+ readonly column: number;
3280
+ /** How many columns the cluster needed — the denominator of the width. */
3281
+ readonly columns: number;
3282
+ /** It began before this day, or before the visible window. */
3283
+ readonly continuesBefore: boolean;
3284
+ /** It runs past this day, or past the visible window. */
3285
+ readonly continuesAfter: boolean;
3286
+ }
3287
+ /** One day column: the cell it stands for, and the events inside it. */
3288
+ interface FoldTimeGridColumn<T = unknown> {
3289
+ readonly day: FoldCalendarDay;
3290
+ /** Timed events, in the caller's order. */
3291
+ readonly blocks: readonly FoldCalendarBlock<T>[];
3292
+ }
3293
+ /** A laid-out time grid. */
3294
+ interface FoldTimeGrid<T = unknown> {
3295
+ /** The day columns, earliest first. */
3296
+ readonly columns: readonly FoldTimeGridColumn<T>[];
3297
+ /** All-day spans across the strip on top, packed into lanes. */
3298
+ readonly allDay: readonly FoldCalendarBand<T>[];
3299
+ /** All-day spans no lane could take. */
3300
+ readonly allDayHiddenCount: number;
3301
+ /** The hour labels down the gutter, as `HH:mm`. */
3302
+ readonly hours: readonly FoldCalendarTime[];
3303
+ /** First minute on screen. */
3304
+ readonly startMinute: number;
3305
+ /** Last minute on screen. */
3306
+ readonly endMinute: number;
3307
+ }
3308
+ /**
3309
+ * Whether an event is placed on the clock or on the strip.
3310
+ *
3311
+ * **Both** ends are needed: an event with only a start has no height, and one
3312
+ * with only an end has no origin. Half a time is a data bug, and treating it as
3313
+ * all-day is the reading that loses the least.
3314
+ */
3315
+ declare function foldIsTimed<T>(event: FoldCalendarEvent<T>): boolean;
3316
+ /**
3317
+ * Lays out `dayCount` days as hour columns plus an all-day strip.
3318
+ *
3319
+ * Timed events are placed on the clock; everything else — no times, or only one
3320
+ * of them — goes on the strip, where it spans days exactly as it does in the
3321
+ * month grid.
3322
+ */
3323
+ declare function foldBuildTimeGrid<T>(events: readonly FoldCalendarEvent<T>[], options: FoldTimeGridOptions): FoldTimeGrid<T>;
3324
+
3325
+ /**
3326
+ * `<fold-calendar-timegrid>` — days as hour columns, with an all-day strip.
3327
+ *
3328
+ * The reading the other four cannot give: **when inside a day**. A meeting is a
3329
+ * block whose height is its duration and whose width is shared with whatever it
3330
+ * collides with; an absence is a band across the strip on top, spanning days
3331
+ * exactly as it does in the month view — the same packer draws both, so a
3332
+ * three-day leave request reads identically wherever it appears.
3333
+ *
3334
+ * Times are wall-clock `HH:mm`, never instants — the same decision as the date,
3335
+ * for the same reason. 09:00 is the hour on the wall; the app converts once at
3336
+ * its own boundary, and no zone can move a meeting after that.
3337
+ *
3338
+ * ## Inputs
3339
+ * | Input | Type | Default | Meaning |
3340
+ * |-------------------|--------------------------|-----------|---------|
3341
+ * | `date` | `FoldCalendarDate` | — | Any date in the range. |
3342
+ * | `events` | `FoldCalendarEvent<T>[]` | `[]` | Timed events go on the clock, the rest on the strip. |
3343
+ * | `dayCount` | `number` | `7` | `1` is a day view, `7` a week. |
3344
+ * | `today` | `FoldCalendarDate` | — | The column to mark. |
3345
+ * | `now` | `FoldCalendarTime` | — | Draws the current-time line on `today`'s column. Passed in, never read from a clock — the package has none, and an SSR render must not invent one. |
3346
+ * | `dayStart`/`dayEnd` | `FoldCalendarTime` | `00:00`/`24:00` | The visible window; `08:00`–`20:00` is a working day. |
3347
+ * | `weekStartsOn` | `FoldWeekday` | the locale's | Which day opens the week. |
3348
+ * | `weekendDays` | `FoldWeekday[]` | the locale's | Which columns are shaded. |
3349
+ * | `maxAllDayLanes` | `number` | `2` | Lanes the strip stacks before overflowing. |
3350
+ * | `locale`/`labels`/`formats` | — | — | See the other views. |
3351
+ *
3352
+ * ## Outputs
3353
+ * | Output | Payload | Fires on |
3354
+ * |--------------|------------------------|----------|
3355
+ * | `dayClick` | `FoldCalendarDate` | A column header activated. |
3356
+ * | `eventClick` | `FoldCalendarEvent<T>` | A block or an all-day band activated. |
3357
+ *
3358
+ * ## Theming
3359
+ * | CSS variable | Default | Sets |
3360
+ * |---------------------------------------|---------|------|
3361
+ * | `--fold-calendar-timegrid-height` | `640px` | Height of the hour area. |
3362
+ * | `--fold-calendar-timegrid-gutter` | `56px` | Width of the hour labels. |
3363
+ * | `--fold-calendar-timegrid-lane` | `20px` | Height of one all-day lane. |
3364
+ * | `--fold-calendar-bar-width` | `3px` | The tone bar down a block's leading edge. |
3365
+ *
3366
+ * ## Accessibility
3367
+ * Every block and every band is a real `<button>` inside the column it belongs
3368
+ * to, so the tab order follows the day and this view needs none of the month
3369
+ * grid's roving-tabindex machinery. A block's accessible name carries its
3370
+ * **times**, which its position on the clock conveys only visually.
3371
+ *
3372
+ * @selector `fold-calendar-timegrid`
3373
+ *
3374
+ * @example
3375
+ * ```html
3376
+ * <fold-calendar-timegrid
3377
+ * [date]="date()"
3378
+ * [events]="events()"
3379
+ * [today]="today"
3380
+ * [now]="now()"
3381
+ * dayStart="08:00"
3382
+ * dayEnd="20:00"
3383
+ * (eventClick)="open($event)"
3384
+ * />
3385
+ * ```
3386
+ */
3387
+ declare class FoldCalendarTimegridComponent<T = unknown> {
3388
+ /** Any date inside the range on display. */
3389
+ readonly date: _angular_core.InputSignal<string>;
3390
+ /** Events to plot; timed ones on the clock, the rest on the strip. */
3391
+ readonly events: _angular_core.InputSignal<readonly FoldCalendarEvent<T>[]>;
3392
+ /** Days to show: `1` is a day view, `7` a week. @default 7 */
3393
+ readonly dayCount: _angular_core.InputSignalWithTransform<number, unknown>;
3394
+ /** The day to mark as today. */
3395
+ readonly today: _angular_core.InputSignal<string | undefined>;
3396
+ /**
3397
+ * The current wall-clock time, for the "now" line. Passed in rather than
3398
+ * read: this package owns no clock (`today` works the same way), and a
3399
+ * server render that invented one would hydrate to a different position.
3400
+ */
3401
+ readonly now: _angular_core.InputSignal<string | undefined>;
3402
+ /** First hour on screen. @default '00:00' */
3403
+ readonly dayStart: _angular_core.InputSignal<string>;
3404
+ /** Last hour on screen. @default '24:00' */
3405
+ readonly dayEnd: _angular_core.InputSignal<string>;
3406
+ /** Day the week starts on. @default the locale's own first day */
3407
+ readonly weekStartsOn: _angular_core.InputSignal<FoldWeekday | undefined>;
3408
+ /** Days shaded as the weekend. @default the locale's own weekend */
3409
+ readonly weekendDays: _angular_core.InputSignal<readonly FoldWeekday[] | undefined>;
3410
+ /** Lanes the all-day strip stacks before events overflow. @default 2 */
3411
+ readonly maxAllDayLanes: _angular_core.InputSignalWithTransform<number, unknown>;
3412
+ /** A column header was activated. */
3413
+ readonly dayClick: _angular_core.OutputEmitterRef<string>;
3414
+ /** A block or an all-day band was activated. */
3415
+ readonly eventClick: _angular_core.OutputEmitterRef<FoldCalendarEvent<T>>;
3416
+ /** Labels, locale and the projected chip template — see the directive. */
3417
+ protected readonly chrome: FoldCalendarChromeDirective;
3418
+ protected readonly grid: _angular_core.Signal<fold_ng.FoldTimeGrid<T>>;
3419
+ /** Lane rows for the all-day strip, or none when nothing spans. */
3420
+ protected readonly stripRows: _angular_core.Signal<string>;
3421
+ /** Where the "now" line sits, as a fraction of the window, or `null`. */
3422
+ protected readonly nowOffset: _angular_core.Signal<number | null>;
3423
+ protected weekdayName(column: FoldTimeGridColumn<T>): string;
3424
+ protected hourLabel(hour: FoldCalendarTime): string;
3425
+ /** A column's accessible name: its date, the today marker, and its load. */
3426
+ protected columnLabel(column: FoldTimeGridColumn<T>): string;
3427
+ /**
3428
+ * A block's accessible name — its times first, because where it sits on the
3429
+ * clock is information a screen reader has no other way to get.
3430
+ */
3431
+ protected blockLabel(block: FoldCalendarBlock<T>): string;
3432
+ /** A band's text: the group's label when it stands for several events. */
3433
+ protected bandLabel(band: FoldCalendarBand<T>): string;
3434
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarTimegridComponent<any>, never>;
3435
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarTimegridComponent<any>, "fold-calendar-timegrid", never, { "date": { "alias": "date"; "required": true; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "dayCount": { "alias": "dayCount"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "now": { "alias": "now"; "required": false; "isSignal": true; }; "dayStart": { "alias": "dayStart"; "required": false; "isSignal": true; }; "dayEnd": { "alias": "dayEnd"; "required": false; "isSignal": true; }; "weekStartsOn": { "alias": "weekStartsOn"; "required": false; "isSignal": true; }; "weekendDays": { "alias": "weekendDays"; "required": false; "isSignal": true; }; "maxAllDayLanes": { "alias": "maxAllDayLanes"; "required": false; "isSignal": true; }; }, { "dayClick": "dayClick"; "eventClick": "eventClick"; }, never, never, true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
3436
+ }
3437
+
3438
+ /** What an event template is handed. */
3439
+ interface FoldCalendarEventContext<T> {
3440
+ /** The event to render — `let-event`. */
3441
+ readonly $implicit: FoldCalendarEvent<T>;
3442
+ /**
3443
+ * The laid-out segment in the month view, `null` in the column views — so a
3444
+ * template can react to a continuation edge where there is one, and does not
3445
+ * have to pretend there is one where there is not.
3446
+ */
3447
+ readonly band: FoldCalendarBand<T> | null;
3448
+ }
3449
+ /**
3450
+ * Marks an `<ng-template>` as the renderer for every event chip inside a
3451
+ * calendar view, replacing the built-in icon + label + count row:
3452
+ *
3453
+ * ```html
3454
+ * <fold-calendar-month [(month)]="month" [events]="events()">
3455
+ * <ng-template foldCalendarEvent let-event let-band="band">
3456
+ * <fold-avatar [name]="event.data.owner" size="xs" />
3457
+ * <span>{{ event.label }}</span>
3458
+ * </ng-template>
3459
+ * </fold-calendar-month>
3460
+ * ```
3461
+ *
3462
+ * `let-event` and `let-band` are **fully typed** under `strictTemplates`: the
3463
+ * directive is generic over the same `T` as the events it renders, and its
3464
+ * context guard carries that through, so `event.data` is the app's own record
3465
+ * with no cast.
3466
+ *
3467
+ * @selector `ng-template[foldCalendarEvent]`
3468
+ */
3469
+ declare class FoldCalendarEventDirective<T = unknown> {
3470
+ readonly template: TemplateRef<FoldCalendarEventContext<T>>;
3471
+ /** Teaches the template checker what `let-event` and `let-band` are. */
3472
+ static ngTemplateContextGuard<T>(_directive: FoldCalendarEventDirective<T>, context: unknown): context is FoldCalendarEventContext<T>;
3473
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarEventDirective<any>, never>;
3474
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldCalendarEventDirective<any>, "ng-template[foldCalendarEvent]", never, {}, {}, never, never, true, never>;
3475
+ }
3476
+
3477
+ /**
3478
+ * The containers a calendar draws around its events, opened up as templates.
3479
+ *
3480
+ * The chip has always been replaceable ({@link FoldCalendarEventDirective});
3481
+ * these are the four places an app reaches for next — the cell behind the
3482
+ * chips, the heading above them, the period title, and the chip standing for
3483
+ * what did not fit. Each is a plain `<ng-template>` with a typed context, so
3484
+ * replacing one costs nothing and leaves the rest of the view alone.
3485
+ */
3486
+ /** What a day-cell template is handed. */
3487
+ interface FoldCalendarDayContext {
3488
+ /** The cell to render — `let-day`. Carries its own counts and flags. */
3489
+ readonly $implicit: FoldCalendarDay;
3490
+ }
3491
+ /**
3492
+ * Replaces the **inside of a month day cell** — by default just the day number.
3493
+ *
3494
+ * This is the hook for everything the calendar cannot know: a holiday marker, a
3495
+ * closure, "3/8 staffed", a price. The cell itself (the button, its focus
3496
+ * behaviour, its accessible name) stays the calendar's job.
3497
+ *
3498
+ * ```html
3499
+ * <ng-template foldCalendarDay let-day>
3500
+ * <span>{{ day.dayOfMonth }}</span>
3501
+ * @if (closed(day.date)) { <fold-icon name="lock" size="xs" /> }
3502
+ * </ng-template>
3503
+ * ```
3504
+ *
3505
+ * @selector `ng-template[foldCalendarDay]`
3506
+ */
3507
+ declare class FoldCalendarDayDirective {
3508
+ readonly template: TemplateRef<FoldCalendarDayContext>;
3509
+ static ngTemplateContextGuard(_directive: FoldCalendarDayDirective, context: unknown): context is FoldCalendarDayContext;
3510
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarDayDirective, never>;
3511
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldCalendarDayDirective, "ng-template[foldCalendarDay]", never, {}, {}, never, never, true, never>;
3512
+ }
3513
+ /** What a day-heading template is handed. */
3514
+ interface FoldCalendarHeadingContext<T> {
3515
+ /** The day being headed — `let-date`. */
3516
+ readonly $implicit: FoldCalendarDate;
3517
+ /** The events filed under it, so a heading can count or summarise them. */
3518
+ readonly events: readonly FoldCalendarEvent<T>[];
3519
+ }
3520
+ /**
3521
+ * Replaces the **day heading** of the agenda rail — by default a big day number
3522
+ * with a relative name beside it. Where an app puts a per-day count, a total,
3523
+ * or a quick action.
3524
+ *
3525
+ * @selector `ng-template[foldCalendarHeading]`
3526
+ */
3527
+ declare class FoldCalendarHeadingDirective<T = unknown> {
3528
+ readonly template: TemplateRef<FoldCalendarHeadingContext<T>>;
3529
+ static ngTemplateContextGuard<T>(_directive: FoldCalendarHeadingDirective<T>, context: unknown): context is FoldCalendarHeadingContext<T>;
3530
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarHeadingDirective<any>, never>;
3531
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldCalendarHeadingDirective<any>, "ng-template[foldCalendarHeading]", never, {}, {}, never, never, true, never>;
3532
+ }
3533
+ /** What a toolbar-title template is handed. */
3534
+ interface FoldCalendarTitleContext {
3535
+ /** The period name the toolbar would have rendered — `let-title`. */
3536
+ readonly $implicit: string;
3537
+ /** First day of the period on display. */
3538
+ readonly from: FoldCalendarDate;
3539
+ /** Last day of the period on display. */
3540
+ readonly to: FoldCalendarDate;
3541
+ /** The view the period belongs to. */
3542
+ readonly view: string;
3543
+ }
3544
+ /**
3545
+ * Replaces the toolbar's **period title** — by default an `<h2>` holding
3546
+ * `foldViewTitle()`. Project one to change the wording, or to give the title a
3547
+ * heading level that fits the page's outline.
3548
+ *
3549
+ * @selector `ng-template[foldCalendarTitle]`
3550
+ */
3551
+ declare class FoldCalendarTitleDirective {
3552
+ readonly template: TemplateRef<FoldCalendarTitleContext>;
3553
+ static ngTemplateContextGuard(_directive: FoldCalendarTitleDirective, context: unknown): context is FoldCalendarTitleContext;
3554
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarTitleDirective, never>;
3555
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldCalendarTitleDirective, "ng-template[foldCalendarTitle]", never, {}, {}, never, never, true, never>;
3556
+ }
3557
+ /** What an overflow-chip template is handed. */
3558
+ interface FoldCalendarOverflowContext {
3559
+ /** How many events this day could not show — `let-count`. */
3560
+ readonly $implicit: number;
3561
+ /** The day they belong to. */
3562
+ readonly date: FoldCalendarDate;
3563
+ }
3564
+ /**
3565
+ * Replaces the month view's **`+N` chip** — by default a small text button.
3566
+ * Where an app puts an avatar stack, or the trigger of a "see all" popover.
3567
+ *
3568
+ * @selector `ng-template[foldCalendarOverflow]`
3569
+ */
3570
+ declare class FoldCalendarOverflowDirective {
3571
+ readonly template: TemplateRef<FoldCalendarOverflowContext>;
3572
+ static ngTemplateContextGuard(_directive: FoldCalendarOverflowDirective, context: unknown): context is FoldCalendarOverflowContext;
3573
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarOverflowDirective, never>;
3574
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldCalendarOverflowDirective, "ng-template[foldCalendarOverflow]", never, {}, {}, never, never, true, never>;
3575
+ }
3576
+
3577
+ /**
3578
+ * What a locale says about its own week.
3579
+ *
3580
+ * `Intl` hands us every month and weekday name, and then most calendars stop
3581
+ * there and hard-code Monday — which is right in France and wrong in the United
3582
+ * States, Egypt and the Maldives. `Intl.Locale` also knows **which day the week
3583
+ * starts on and which days are the weekend**; asking is one call, and it turns
3584
+ * two inputs from "the caller guesses" into "the caller overrides".
3585
+ *
3586
+ * Support is uneven (`getWeekInfo()` in Chrome and Safari, the `weekInfo`
3587
+ * getter in older Firefox), so both shapes are probed and neither is assumed.
3588
+ * A runtime with neither falls back to Monday + Sat/Sun, which is the most
3589
+ * common answer and the previous behaviour.
3590
+ */
3591
+ /** A locale's week conventions. */
3592
+ interface FoldWeekInfo {
3593
+ /** The day its calendars open on. */
3594
+ readonly weekStartsOn: FoldWeekday;
3595
+ /** The days it shades as the weekend. */
3596
+ readonly weekendDays: readonly FoldWeekday[];
3597
+ }
3598
+ /** What a runtime that cannot answer gets: the most common week in the world. */
3599
+ declare const FOLD_FALLBACK_WEEK_INFO: FoldWeekInfo;
3600
+ /**
3601
+ * The week conventions of `locale` — its first day and its weekend.
3602
+ *
3603
+ * `undefined` asks the runtime for its own locale, which is what a calendar
3604
+ * with no `locale` input is already formatting in.
3605
+ */
3606
+ declare function foldLocaleWeekInfo(locale?: string): FoldWeekInfo;
3607
+
3608
+ /**
3609
+ * Where a key press moves the focused day. Split out of the component because
3610
+ * "what does ArrowDown mean on a calendar" is a pure question about dates, and
3611
+ * answering it here means it can be tested without a grid, a DOM or a TestBed.
3612
+ *
3613
+ * {@link foldCalendarNextFocus} is public: it is the other half of the geometry
3614
+ * tier, and a hand-rolled date grid owes its users the same arrow keys as the
3615
+ * built-in one. {@link foldFocusDayCell} stays internal — it reads a
3616
+ * `data-fold-day` attribute this package writes, and exporting it would freeze
3617
+ * that attribute into the public contract.
3618
+ */
3619
+ /**
3620
+ * The day `key` moves focus to from `from`, or `null` when the key is not a
3621
+ * grid-navigation key and the component should leave the event alone.
3622
+ *
3623
+ * The mapping is the ARIA grid pattern applied to a date axis: horizontal keys
3624
+ * step a day, vertical keys step a **week** (the column stays put, which is the
3625
+ * whole point of a 7-wide grid), `Home`/`End` snap to the week's bounds, and
3626
+ * `PageUp`/`PageDown` page by month.
3627
+ */
3628
+ declare function foldCalendarNextFocus(key: string, from: FoldCalendarDate, weekStartsOn?: FoldWeekday): FoldCalendarDate | null;
3629
+
3630
+ /**
3631
+ * Month geometry — where every chip lands, and what did not fit.
3632
+ *
3633
+ * Packing spans into lanes is the one genuinely algorithmic part of a calendar,
3634
+ * so it lives on its own, framework-free apart from a dev-mode warning, and is
3635
+ * tested exhaustively without rendering anything.
3636
+ *
3637
+ * **Public on purpose.** `fold-calendar-month` is one consumer of this, not its
3638
+ * owner: an app that needs a month laid out but drawn its own way calls
3639
+ * `foldBuildMonthGrid` and renders the rows itself, and gets the packing, the
3640
+ * week-boundary clipping and the open edges for free. Pair it with
3641
+ * `foldCalendarNextFocus` for the keyboard, and with `FoldCalendarLabels` for
3642
+ * the strings.
3643
+ */
3644
+ /** How to build a month grid. */
3645
+ interface FoldMonthGridOptions {
3646
+ /** Any date inside the month to display. */
3647
+ readonly month: FoldCalendarDate;
3648
+ /** Day the weeks start on. @default 'mon' */
3649
+ readonly weekStartsOn?: FoldWeekday;
3650
+ /** Days shaded as the weekend. @default ['sat', 'sun'] */
3651
+ readonly weekendDays?: readonly FoldWeekday[] | undefined;
3652
+ /** The day to flag as today; omit to flag none (an SSR-stable default). */
3653
+ readonly today?: FoldCalendarDate | undefined;
3654
+ /** Lanes a week row can stack before events spill into the overflow count. @default 3 */
3655
+ readonly maxLanes?: number;
3656
+ /**
3657
+ * Always emit six week rows, so the grid keeps one height across months
3658
+ * instead of reflowing between 4, 5 and 6 rows. @default false
3659
+ */
3660
+ readonly fixedWeeks?: boolean;
3661
+ }
3662
+ /**
3663
+ * Lays a month out as week rows with their events already packed into lanes.
3664
+ *
3665
+ * The grid runs from the week containing the 1st to the week containing the
3666
+ * last day, so it always starts and ends on whole weeks; `fixedWeeks` pads it
3667
+ * to six rows. Events outside that window are dropped, and an event crossing a
3668
+ * week boundary yields one band per week it touches.
3669
+ *
3670
+ * An unparseable `month` yields **no rows** rather than a grid of `Invalid
3671
+ * Date` cells, with a dev-mode warning naming the value.
3672
+ */
3673
+ declare function foldBuildMonthGrid<T>(events: readonly FoldCalendarEvent<T>[], options: FoldMonthGridOptions): readonly FoldCalendarWeek<T>[];
3674
+
3675
+ /**
3676
+ * Render models for the column views (week, day).
3677
+ *
3678
+ * Nothing is packed here: chips stack in a column, so a multi-day event simply
3679
+ * appears under every day it covers, and no event is ever dropped — which is
3680
+ * why these cells always report `hiddenCount: 0`.
3681
+ */
3682
+ /** How to build a column view. */
3683
+ interface FoldDayColumnsOptions {
3684
+ /** Any date inside the range to display. */
3685
+ readonly date: FoldCalendarDate;
3686
+ /** Day the week starts on — ignored when building a single day. @default 'mon' */
3687
+ readonly weekStartsOn?: FoldWeekday;
3688
+ /** Days shaded as the weekend. @default ['sat', 'sun'] */
3689
+ readonly weekendDays?: readonly FoldWeekday[] | undefined;
3690
+ /** The day to flag as today; omit to flag none. */
3691
+ readonly today?: FoldCalendarDate | undefined;
3692
+ }
3693
+ /**
3694
+ * The seven days of `date`'s week, each with the events covering it — the
3695
+ * render model of the week view.
3696
+ */
3697
+ declare function foldBuildWeek<T>(events: readonly FoldCalendarEvent<T>[], options: FoldDayColumnsOptions): readonly FoldCalendarDayEvents<T>[];
3698
+ /** A single day with its events — the render model of the day view. */
3699
+ declare function foldBuildDay<T>(events: readonly FoldCalendarEvent<T>[], options: FoldDayColumnsOptions): FoldCalendarDayEvents<T>;
3700
+
3701
+ /**
3702
+ * The three selections every view and every consumer makes over a feed.
3703
+ *
3704
+ * Deliberately the smallest, least coupled part of the family: an app that
3705
+ * wants the calendar's semantics — "covers this day", "overlaps this window",
3706
+ * "belongs to a live feed" — without any of its rendering imports only this.
3707
+ */
3708
+ /**
3709
+ * Events covering `date`, in the caller's order — the selection the week, day
3710
+ * and list views render, where chips stack in a column and need no packing.
3711
+ */
3712
+ declare function foldEventsOnDay<T>(events: readonly FoldCalendarEvent<T>[], date: FoldCalendarDate): readonly FoldCalendarEvent<T>[];
3713
+ /** Events overlapping `[from, to]` at all, in the caller's order. */
3714
+ declare function foldEventsInRange<T>(events: readonly FoldCalendarEvent<T>[], from: FoldCalendarDate, to: FoldCalendarDate): readonly FoldCalendarEvent<T>[];
3715
+ /**
3716
+ * Events from the feeds in `active`, in the caller's order — the other half of
3717
+ * `fold-calendar-source-filter`, which owns only the selection.
3718
+ *
3719
+ * `null` means nothing has been switched off yet and everything passes; it is
3720
+ * the filter chips' own initial value, so the one function built to consume
3721
+ * that model accepts it rather than making every caller write the ternary.
3722
+ * An empty `Set` is the opposite — every feed switched off — which is why the
3723
+ * two are not collapsed.
3724
+ *
3725
+ * An event with no `sourceKey` belongs to no feed, so no chip can hide it and
3726
+ * it always passes.
3727
+ */
3728
+ declare function foldFilterBySource<T>(events: readonly FoldCalendarEvent<T>[], active: ReadonlySet<string> | null): readonly FoldCalendarEvent<T>[];
3729
+
3730
+ /**
3731
+ * Where overlapping timed events sit side by side — the time grid's only
3732
+ * genuinely algorithmic part, and the same shape as the month's lane packing
3733
+ * turned ninety degrees: intervals over **minutes** instead of days, laid out
3734
+ * across the column's width instead of down its height.
3735
+ *
3736
+ * Pure, so the rule can be exercised exhaustively without a grid.
3737
+ */
3738
+ /** An interval to place, in minutes since midnight. */
3739
+ interface FoldOverlapInput {
3740
+ readonly startMinute: number;
3741
+ /** Exclusive: an event ending at 10:00 does not overlap one starting there. */
3742
+ readonly endMinute: number;
3743
+ }
3744
+ /** Where one interval landed across the width. */
3745
+ interface FoldOverlapSlot {
3746
+ /** Its column index inside the cluster, `0`-based. */
3747
+ readonly column: number;
3748
+ /** How many columns its cluster needed — the denominator of its width. */
3749
+ readonly columns: number;
3750
+ }
3751
+ /**
3752
+ * Lays intervals out across the width, one slot per input, in input order.
3753
+ *
3754
+ * Two events that merely touch — one ends at 10:00, the next starts at 10:00 —
3755
+ * do **not** overlap and each keep the full width. That is the difference
3756
+ * between the month grid (inclusive days: touching means colliding) and a time
3757
+ * grid (exclusive minutes: touching means back-to-back), and getting it wrong
3758
+ * halves the width of every event in a packed morning.
3759
+ *
3760
+ * Events are grouped into **clusters** — runs connected by overlap — and each
3761
+ * cluster is widened only as far as it needs, so one triple-booked hour does
3762
+ * not narrow the rest of the day.
3763
+ */
3764
+ declare function foldLayOutOverlaps(intervals: readonly FoldOverlapInput[]): readonly FoldOverlapSlot[];
3765
+
3766
+ type FoldChoiceOption = {
3767
+ key: string;
3768
+ label: string;
3769
+ /** Optional trailing count badge (e.g. how many rows match this filter). */
3770
+ count?: number;
3771
+ };
3772
+ /**
3773
+ * `<fold-choice-row>` — a horizontal single-select control.
3774
+ *
3775
+ * One row, one active option, emits the chosen `key`; the parent owns the
3776
+ * state and feeds it back via `activeKey`. Two layouts:
3777
+ *
3778
+ * - `segmented` (default) — equal-width buttons that fill the row, no wrap.
3779
+ * The right shape for a small mode/segment toggle (2–4 options).
3780
+ * - `chips` — auto-width rounded chips that wrap. The right shape for a
3781
+ * status/category filter above a table or list.
3782
+ *
3783
+ * @selector `fold-choice-row`
3784
+ *
3785
+ * @example
3786
+ * ```html
3787
+ * <fold-choice-row
3788
+ * [options]="[{ key: 'manager', label: 'Manager' }, { key: 'member', label: 'Member' }]"
3789
+ * [activeKey]="role()"
3790
+ * (selected)="role.set($event)"
3791
+ * />
3792
+ *
3793
+ * <fold-choice-row
3794
+ * layout="chips"
3795
+ * [options]="statuses"
3796
+ * [activeKey]="status()"
3797
+ * ariaLabel="Filter by status"
3798
+ * (selected)="setStatus($event)"
3799
+ * />
3800
+ * ```
3801
+ */
3802
+ declare class FoldChoiceRowComponent {
3803
+ /** The selectable options, in display order. */
3804
+ readonly options: _angular_core.InputSignal<readonly FoldChoiceOption[]>;
3805
+ /** The `key` of the currently selected option. */
3806
+ readonly activeKey: _angular_core.InputSignal<string>;
3807
+ /** `segmented` (equal-width, default) or `chips` (auto-width, wraps). */
3808
+ readonly layout: _angular_core.InputSignal<"segmented" | "chips">;
3809
+ /** Accessible label for the group. */
3810
+ readonly ariaLabel: _angular_core.InputSignal<string>;
3811
+ /** Emits the `key` of the clicked option. */
3812
+ readonly selected: _angular_core.OutputEmitterRef<string>;
3813
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldChoiceRowComponent, never>;
3814
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldChoiceRowComponent, "fold-choice-row", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "activeKey": { "alias": "activeKey"; "required": true; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, never, true, never>;
3815
+ }
3816
+
3817
+ /**
3818
+ * The design tokens, as a typed source-of-truth.
3819
+ *
3820
+ * These lists are the CONTRACT. The token contract test asserts that the CSS
3821
+ * declares exactly these tokens — for colours, that the `:root` (dark) and
3822
+ * `[data-theme="lumen"]` blocks each declare exactly the colour set (parity);
3823
+ * for scales, that `scales.css` declares exactly the radius/type steps. Add a
3824
+ * token here and to the CSS in the same change, or the test fails. That is how
3825
+ * the theme stays complete and drift-free.
3826
+ *
3827
+ * They also power typed `fold*Var` helpers so call sites get autocomplete and a
3828
+ * compile error on a misspelt token.
3829
+ */
3830
+ declare const FOLD_SEMANTIC_COLOR_TOKENS: readonly ["bg-page", "bg-header", "bg-rail-primary", "bg-rail-secondary", "bg-rail-tertiary", "primary", "primary-strong", "on-primary", "primary-text", "primary-surface", "primary-border", "info", "info-text", "info-surface", "info-border", "warning", "warning-text", "warning-surface", "warning-border", "alert", "alert-text", "alert-surface", "alert-border", "success", "success-text", "success-surface", "success-border", "text", "text-secondary", "text-muted", "text-faded", "surface-card", "surface-sunken", "surface-subtle", "surface-raised", "surface-hover", "border", "border-subtle", "glass", "glass-border", "scrim"];
3831
+ type FoldSemanticColorToken = (typeof FOLD_SEMANTIC_COLOR_TOKENS)[number];
3832
+ /** Border-radius scale. `lg` is a real large radius; `pill` is the capsule. */
3833
+ declare const FOLD_RADIUS_TOKENS: readonly ["xs", "sm", "md", "lg", "pill", "round"];
3834
+ type FoldRadiusToken = (typeof FOLD_RADIUS_TOKENS)[number];
3835
+ /** Type (font-size) scale. */
3836
+ declare const FOLD_TEXT_TOKENS: readonly ["xs", "sm", "md", "lg", "xl"];
3837
+ type FoldTextToken = (typeof FOLD_TEXT_TOKENS)[number];
3838
+ /** Icon-size scale — the length a `fold-icon` renders at, per size preset. */
3839
+ declare const FOLD_ICON_SIZE_TOKENS: readonly ["xs", "sm", "md", "lg", "xl"];
3840
+ type FoldIconSizeToken = (typeof FOLD_ICON_SIZE_TOKENS)[number];
3841
+ /** Space (gap / padding / margin) scale. */
3842
+ declare const FOLD_SPACE_TOKENS: readonly ["xs", "sm", "md", "lg", "xl", "2xl", "3xl", "4xl", "5xl"];
3843
+ type FoldSpaceToken = (typeof FOLD_SPACE_TOKENS)[number];
3844
+ /** Motion scale — `transition` shorthands (duration + easing). */
3845
+ declare const FOLD_MOTION_TOKENS: readonly ["fast", "base", "slow"];
3846
+ type FoldMotionToken = (typeof FOLD_MOTION_TOKENS)[number];
3847
+ /** Backdrop-blur radii (`--fold-blur-*`). */
3848
+ declare const FOLD_BLUR_TOKENS: readonly ["glass"];
3849
+ type FoldBlurToken = (typeof FOLD_BLUR_TOKENS)[number];
3850
+ /**
3851
+ * Elevation scale — full `box-shadow` values. The shared depth language: a
3852
+ * component never spells its own shadow, it names a level. Theme-invariant
3853
+ * (black ink via `color-mix`, which reads acceptably on both themes), so they
3854
+ * live with the scales. `panel-*` are the directional side-panel shadows.
3855
+ */
3856
+ declare const FOLD_SHADOW_TOKENS: readonly ["sm", "md", "lg", "panel-right", "panel-left"];
3857
+ type FoldShadowToken = (typeof FOLD_SHADOW_TOKENS)[number];
3858
+ /** The full custom-property name for a semantic colour token. */
3859
+ declare function foldColorProperty(token: FoldSemanticColorToken): string;
3860
+ /** A ready-to-use `var(--fold-color-…)` reference for a semantic colour token. */
3861
+ declare function foldColorVar(token: FoldSemanticColorToken): string;
3862
+ /** A ready-to-use `var(--fold-radius-…)` reference. */
3863
+ declare function foldRadiusVar(token: FoldRadiusToken): string;
3864
+ /** A ready-to-use `var(--fold-text-…)` reference. */
3865
+ declare function foldTextVar(token: FoldTextToken): string;
3866
+ /** A ready-to-use `var(--fold-space-…)` reference. */
3867
+ declare function foldSpaceVar(token: FoldSpaceToken): string;
3868
+ /** A ready-to-use `var(--fold-motion-…)` reference. */
3869
+ declare function foldMotionVar(token: FoldMotionToken): string;
3870
+ /** A ready-to-use `var(--fold-blur-…)` reference. */
3871
+ declare function foldBlurVar(token: FoldBlurToken): string;
3872
+ /** A ready-to-use `var(--fold-shadow-…)` reference. */
3873
+ declare function foldShadowVar(token: FoldShadowToken): string;
3874
+
3875
+ /** Spinner size — an icon-size token (`xs…xl`) or an explicit pixel number. */
3876
+ type FoldSpinnerSize = FoldIconSizeToken | number;
3877
+ /**
3878
+ * `fold-spinner` — an indeterminate loading indicator: a rotating arc drawn in
3879
+ * `currentColor`, sized off the same scale as `fold-icon` so it drops into a
3880
+ * button in place of its glyph without shifting layout.
3881
+ *
3882
+ * Give it a `label` when it stands alone (it becomes `role="status"` +
3883
+ * `aria-label`, so assistive tech announces the wait). Leave `label` unset when
3884
+ * it lives inside something that already announces busy-ness (a button with
3885
+ * `aria-busy`) — it then renders `aria-hidden`, purely decorative.
3886
+ *
3887
+ * Honours `prefers-reduced-motion`: the rotation stops and a fuller static ring
3888
+ * is shown instead, so the indicator still reads as "busy" without animating.
3889
+ *
3890
+ * @selector `fold-spinner`
3891
+ *
3892
+ * @example
3893
+ * ```html
3894
+ * <fold-spinner label="Loading contracts" />
3895
+ * <fold-spinner size="sm" /> <!-- decorative, inside a busy control -->
3896
+ * <fold-spinner [size]="18" />
3897
+ * ```
3898
+ */
3899
+ declare class FoldSpinnerComponent {
3900
+ /** Size — an icon-size token (`xs…xl`, default `md`) or a pixel number. */
3901
+ readonly size: _angular_core.InputSignal<FoldSpinnerSize>;
3902
+ /** Accessible label. Set → `role="status"` + `aria-label`; unset → decorative. */
3903
+ readonly label: _angular_core.InputSignal<string | undefined>;
3904
+ /** Resolves the size to a CSS length for `--fold-spinner-size`. */
3905
+ readonly sizeVar: _angular_core.Signal<string>;
3906
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldSpinnerComponent, never>;
3907
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldSpinnerComponent, "fold-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3908
+ }
3909
+
3910
+ /**
3911
+ * Generates unique, SSR-safe element ids.
3912
+ *
3913
+ * A per-injector counter (`providedIn: 'root'` → one instance per application,
3914
+ * and a fresh one per request on the server) so the sequence is deterministic
3915
+ * in render order and therefore matches between server and client. That's the
3916
+ * point: `crypto.randomUUID()` returns a different value on the server than on
3917
+ * the client for the same element, which trips Angular hydration; a counter
3918
+ * reset per request does not, and can't collide across requests or grow
3919
+ * unbounded.
3920
+ *
3921
+ * Used by the labelled controls that own their id ({@link FoldInputComponent},
3922
+ * `fold-select`) and by {@link FoldFieldIdDirective} for loose native controls.
3923
+ */
3924
+ declare class FoldIdService {
3925
+ private counter;
3926
+ /**
3927
+ * The next unique id, e.g. `fold-input-3`.
3928
+ * @param prefix a short, human-readable namespace for the id.
3929
+ */
3930
+ next(prefix?: string): string;
3931
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldIdService, never>;
3932
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FoldIdService>;
3933
+ }
3934
+
3935
+ /**
3936
+ * Auto-assigns a unique, SSR-safe `id` to any native form control (`<input>`,
3937
+ * `<select>`, `<textarea>`) that has neither an `id` nor a `name`.
3938
+ *
3939
+ * You don't write `foldFieldId` on elements — the directive **auto-applies** by
3940
+ * selector. Add it to a component's `imports` once and every unidentified native
3941
+ * control in that component's template is fixed in one go, with no per-element
3942
+ * edit. It silences the browser's *"A form field element should have an id or
3943
+ * name attribute"* warning (autofill + accessibility), and the id it sets can be
3944
+ * targeted by a `<label for>`.
3945
+ *
3946
+ * The selector matches only controls missing **both** `id` and `name` — static
3947
+ * or bound (`[id]`/`[attr.id]`/`[name]` all count as present) — so it never
3948
+ * fights a control you've already identified. Components that render their own
3949
+ * labelled control ({@link FoldInputComponent}, `fold-select`) own their id
3950
+ * explicitly and are unaffected.
3951
+ */
3952
+ declare class FoldFieldIdDirective {
3953
+ /** Assigned once at construction, in deterministic render order (SSR-safe). */
3954
+ protected readonly autoId: string;
3955
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldFieldIdDirective, never>;
3956
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldFieldIdDirective, "input:not([id]):not([name]),select:not([id]):not([name]),textarea:not([id]):not([name])", never, {}, {}, never, never, true, never>;
3957
+ }
3958
+
3959
+ /**
3960
+ * `[foldRepeatPress]` — press-and-hold auto-repeat.
3961
+ *
3962
+ * Fires `(foldRepeatPress)` once immediately on pointer press, then keeps firing
3963
+ * on a fixed cadence while the pointer is held, stopping on release, leave,
3964
+ * cancel or destroy. Bind `[foldRepeatPressDisabled]` to a reactive bound (e.g.
3965
+ * "at max") so the repeat also stops the instant the action becomes unavailable
3966
+ * mid-hold — a plain `pointerup` is unreliable once the host button disables
3967
+ * itself under the finger.
3968
+ *
3969
+ * Keyboard activation is intentionally out of scope: it produces `click`, not
3970
+ * `pointerdown`, so wire a separate `(click)` handler for Enter/Space.
3971
+ *
3972
+ * @selector `[foldRepeatPress]`
3973
+ *
3974
+ * @example
3975
+ * ```html
3976
+ * <button
3977
+ * foldRepeatPress
3978
+ * [foldRepeatPressDisabled]="atMax()"
3979
+ * (foldRepeatPress)="step(1)"
3980
+ * >+</button>
3981
+ * ```
3982
+ */
3983
+ declare class FoldRepeatPressDirective {
3984
+ /** Fires immediately on press, then repeatedly while the pointer is held. */
3985
+ readonly repeat: _angular_core.OutputEmitterRef<void>;
3986
+ /** When true, a press does nothing and any running repeat stops at once. */
3987
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3988
+ /** Delay before the auto-repeat begins, in ms. @default 350 */
3989
+ readonly delay: _angular_core.InputSignal<number>;
3990
+ /** Cadence of the auto-repeat once started, in ms. @default 60 */
3991
+ readonly period: _angular_core.InputSignal<number>;
2332
3992
  private startTimer;
2333
3993
  private tick;
2334
3994
  constructor();
@@ -2443,6 +4103,101 @@ declare class FoldElevatedDirective {
2443
4103
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldElevatedDirective, "[foldElevated]", never, { "foldElevated": { "alias": "foldElevated"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2444
4104
  }
2445
4105
 
4106
+ /** Which axis a scroll region scrolls on. */
4107
+ type FoldScrollAxis = "block" | "inline" | "both";
4108
+ /**
4109
+ * `[foldScrollRegion]` — turns any element into a **bounded, coordinated scroll
4110
+ * box** without the consumer ever writing `overflow`.
4111
+ *
4112
+ * It is the one opt-in of the shell scroll system (`docs/scroll.md`): with
4113
+ * `fold-app-shell` owning the page scroll, a layout that genuinely needs an
4114
+ * independently-scrolling area (a split list/detail, a data-table body, a sticky
4115
+ * sidebar, a panel body) marks that area with this directive instead of
4116
+ * hand-rolling the three foot-guns. It:
4117
+ *
4118
+ * - sets `overflow: auto`, `min-height: 0` (and `min-width: 0` for the inline
4119
+ * axis) and `overscroll-behavior: contain` — the three foot-guns, in one place;
4120
+ * - paints the thin house scrollbar (`scrollbar-width: thin`; the tokenised
4121
+ * colour/radius lands with the scroll-system Slice C);
4122
+ * - **registers with the {@link ScrollRegionRegistry}**, so an overlay (the panel
4123
+ * host) can freeze this region — alongside the shell's own scroll box — while a
4124
+ * modal is open, robust to the scroll owner being the shell rather than `body`.
4125
+ * The registry is injected optionally, so the directive is a useful bounded
4126
+ * scroll box even outside a shell; the coordination is a bonus when one is present.
4127
+ *
4128
+ * The axis is the directive's own value (default `block` = vertical):
4129
+ * `foldScrollRegion` / `foldScrollRegion="block"` (vertical), `="inline"`
4130
+ * (horizontal), `="both"`.
4131
+ *
4132
+ * @selector `[foldScrollRegion]`
4133
+ *
4134
+ * @example
4135
+ * ```html
4136
+ * <!-- a split view: the list scrolls on its own, the detail flows -->
4137
+ * <fold-aside-layout>
4138
+ * <nav asideleft foldScrollRegion>…long list…</nav>
4139
+ * <article>…detail…</article>
4140
+ * </fold-aside-layout>
4141
+ *
4142
+ * <div foldScrollRegion="both" class="table-body">…</div>
4143
+ * ```
4144
+ */
4145
+ declare class FoldScrollRegionDirective {
4146
+ /** The scroll axis; defaults to `block` (vertical), including a bare attribute. */
4147
+ readonly foldScrollRegion: _angular_core.InputSignalWithTransform<FoldScrollAxis, "" | FoldScrollAxis>;
4148
+ /** `scrollbar-color: <thumb> <track>`, tokenised with a self-sufficient
4149
+ * fallback so the region paints a subtle thumb even without `tokens.css`. */
4150
+ protected readonly scrollbarColor = "var(--fold-scrollbar-thumb, color-mix(in srgb, currentColor 24%, transparent)) var(--fold-scrollbar-track, transparent)";
4151
+ protected readonly overflowY: _angular_core.Signal<"auto" | null>;
4152
+ protected readonly overflowX: _angular_core.Signal<"auto" | null>;
4153
+ /** A scrollable box must be shrinkable on its scroll axis, or flex/grid parents
4154
+ * pin it to content height and it never scrolls. */
4155
+ protected readonly minHeight: _angular_core.Signal<"0" | null>;
4156
+ protected readonly minWidth: _angular_core.Signal<"0" | null>;
4157
+ constructor();
4158
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldScrollRegionDirective, never>;
4159
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FoldScrollRegionDirective, "[foldScrollRegion]", never, { "foldScrollRegion": { "alias": "foldScrollRegion"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4160
+ }
4161
+
4162
+ /**
4163
+ * Registry of the live scroll regions in a shell — the shell's own content
4164
+ * scroll box and every `[foldScrollRegion]`.
4165
+ *
4166
+ * It exists so an overlay can freeze **the real scroll containers** at once, not
4167
+ * just `document.body`. In a `fold-app-shell` the scroll owner is an inner box
4168
+ * (`.content-scroll`), not `body`, so the body scroll-lock alone leaves the page
4169
+ * scrollable behind a modal panel. The panel host freezes this registry too, and
4170
+ * every registered region — the shell box and each nested `foldScrollRegion` —
4171
+ * stops scrolling until the overlay closes.
4172
+ *
4173
+ * `freeze()`/`unfreeze()` are **reference-counted** (like {@link ScrollLockService}):
4174
+ * stacked overlays each freeze once; the regions thaw only when the last unfreezes.
4175
+ * Freezing toggles {@link FOLD_SCROLL_FROZEN_CLASS} rather than writing inline
4176
+ * `overflow`, so a region's own overflow (inline binding or stylesheet) is never
4177
+ * clobbered — it simply returns when the class is removed.
4178
+ *
4179
+ * SSR-safe: registration only stores an element reference; the class toggles
4180
+ * happen in `freeze()`, which an overlay only calls in the browser.
4181
+ */
4182
+ declare class ScrollRegionRegistry {
4183
+ /** The live regions. A `Set` so a double-register is idempotent. */
4184
+ private readonly regions;
4185
+ /** How many overlays currently hold the freeze. */
4186
+ private freezes;
4187
+ /** Add a region. If a freeze is already active, the new region joins it. */
4188
+ register(element: HTMLElement): void;
4189
+ /** Remove a region (on directive/shell teardown) and thaw it. */
4190
+ unregister(element: HTMLElement): void;
4191
+ /** Freeze every region's scroll (idempotent per matching `unfreeze()`). */
4192
+ freeze(): void;
4193
+ /** Release one freeze; thaws the regions only when the last is released. */
4194
+ unfreeze(): void;
4195
+ /** True while at least one overlay holds the freeze. */
4196
+ get isFrozen(): boolean;
4197
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollRegionRegistry, never>;
4198
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ScrollRegionRegistry>;
4199
+ }
4200
+
2446
4201
  /**
2447
4202
  * `<fold-input>` — the text-input control (`value: string`): the *edit* half of a
2448
4203
  * record, where {@link FoldFieldComponent} is the *read* half. It renders an
@@ -2586,39 +4341,340 @@ type FoldNumberControls = "inside" | "outside";
2586
4341
  * field. It also keeps the number-only knobs ({@link min} / {@link max} /
2587
4342
  * {@link step}) off the text input.
2588
4343
  *
2589
- * Empty is a first-class value: clearing the field sets `null` (not `0`, not
2590
- * `NaN`), so an optional number reads correctly. Shares the exact visual shell as
2591
- * `fold-input` (same tokens, sizes, variants) via `input-shell.scss`.
4344
+ * Empty is a first-class value: clearing the field sets `null` (not `0`, not
4345
+ * `NaN`), so an optional number reads correctly. Shares the exact visual shell as
4346
+ * `fold-input` (same tokens, sizes, variants) via `input-shell.scss`.
4347
+ *
4348
+ * @selector `fold-number-input`
4349
+ *
4350
+ * @example
4351
+ * ```html
4352
+ * <!-- Signal-forms field (form.bpm: number) -->
4353
+ * <fold-number-input placeholder="BPM" [min]="0" [formField]="form.bpm" />
4354
+ *
4355
+ * <!-- Standalone two-way -->
4356
+ * <fold-number-input align="center" [step]="0.5" [(value)]="gain" />
4357
+ * ```
4358
+ */
4359
+ declare class FoldNumberInputComponent implements FormValueControl<number | null> {
4360
+ /** The bound value — `null` when the field is empty. A `model()` so signal
4361
+ * forms' `FormField` and `[(value)]` both keep it in sync. */
4362
+ readonly value: _angular_core.ModelSignal<number | null>;
4363
+ /** Disabled state — bound automatically by `FormField` from the field. */
4364
+ readonly disabled: _angular_core.InputSignal<boolean>;
4365
+ /** Two-way touched state — set on blur (so `FormField` marks the field
4366
+ * touched), and kept in sync with the field's touched state. */
4367
+ readonly touched: _angular_core.ModelSignal<boolean>;
4368
+ /** Validation errors — bound by `FormField` from the field. */
4369
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
4370
+ /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
4371
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
4372
+ /** Text alignment inside the box. @default 'start' */
4373
+ readonly align: _angular_core.InputSignal<"center" | "start">;
4374
+ /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */
4375
+ readonly variant: _angular_core.InputSignal<"default" | "panel">;
4376
+ /** Optional label displayed above the input. */
4377
+ readonly label: _angular_core.InputSignal<string | undefined>;
4378
+ /** Show a required marker on the label (and set the native `required`). */
4379
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
4380
+ /** Show a lighter `(optional)` marker on the label (ignored when required). */
4381
+ readonly optional: _angular_core.InputSignalWithTransform<boolean, unknown>;
4382
+ /** The word inside the optional marker. @default 'optional' */
4383
+ readonly optionalLabel: _angular_core.InputSignal<string>;
4384
+ /** Optional helper text shown under the input. */
4385
+ readonly hint: _angular_core.InputSignal<string | undefined>;
4386
+ /** Placeholder text. */
4387
+ readonly placeholder: _angular_core.InputSignal<string>;
4388
+ /** Render as read-only. Named `readOnly` to avoid the `FormField` reserved binding. */
4389
+ readonly readOnly: _angular_core.InputSignal<boolean>;
4390
+ /** Minimum value — passthrough + bound by a field's `min` validator. */
4391
+ readonly min: _angular_core.InputSignal<number | undefined>;
4392
+ /** Maximum value — passthrough + bound by a field's `max` validator. */
4393
+ readonly max: _angular_core.InputSignal<number | undefined>;
4394
+ /** Increment applied by the spinner buttons / arrow keys. @default 1 */
4395
+ readonly step: _angular_core.InputSignal<number | undefined>;
4396
+ /** The step glyph — `plusminus` (`−`/`+`, default), `arrows` (chevrons), `none`. */
4397
+ readonly spinner: _angular_core.InputSignal<FoldNumberSpinner>;
4398
+ /** Where the buttons sit — `inside` the box (default) or `outside`, flanking it. */
4399
+ readonly controls: _angular_core.InputSignal<FoldNumberControls>;
4400
+ /** Show the {@link step} as a small suffix, so the increment is visible. */
4401
+ readonly showStep: _angular_core.InputSignalWithTransform<boolean, unknown>;
4402
+ /**
4403
+ * Keep the value on the step grid. When on, a manually typed value snaps to
4404
+ * the nearest valid `base + n·step` **on blur** (base is {@link min}, else 0),
4405
+ * then clamps to min/max — so free typing is allowed while editing, and the
4406
+ * settled value always respects the step. Off by default.
4407
+ */
4408
+ readonly snapToStep: _angular_core.InputSignalWithTransform<boolean, unknown>;
4409
+ /**
4410
+ * Cap the number of decimal places on the settled value: it is rounded to this
4411
+ * many decimals when stepping and on blur. `undefined` = unconstrained (any
4412
+ * decimals allowed). See {@link integer} for the `0` shorthand.
4413
+ */
4414
+ readonly decimals: _angular_core.InputSignal<number | undefined>;
4415
+ /** Shorthand for `decimals = 0` — integers only. Takes precedence over {@link decimals}. */
4416
+ readonly integer: _angular_core.InputSignalWithTransform<boolean, unknown>;
4417
+ /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
4418
+ readonly inputId: string;
4419
+ /** The effective step (defaults to 1 when unset). */
4420
+ protected readonly effectiveStep: _angular_core.Signal<number>;
4421
+ /** The resolved decimal cap: `0` when {@link integer}, else {@link decimals}. */
4422
+ private readonly maxDecimals;
4423
+ /** The active numeric constraints — shared by settling and the alignment check. */
4424
+ private readonly constraints;
4425
+ /** The native `step` attribute — `1` for integers with no explicit step. */
4426
+ protected readonly nativeStep: _angular_core.Signal<number | undefined>;
4427
+ /** At/below the min bound — the decrement button is disabled. */
4428
+ protected readonly atMin: _angular_core.Signal<boolean>;
4429
+ /** At/above the max bound — the increment button is disabled. */
4430
+ protected readonly atMax: _angular_core.Signal<boolean>;
4431
+ /** Whether any spinner button renders. */
4432
+ protected readonly hasControls: _angular_core.Signal<boolean>;
4433
+ /** Non-interactive (disabled or read-only) → both buttons off. */
4434
+ private readonly frozen;
4435
+ /** The increment button is disabled. */
4436
+ protected readonly incDisabled: _angular_core.Signal<boolean>;
4437
+ /** The decrement button is disabled. */
4438
+ protected readonly decDisabled: _angular_core.Signal<boolean>;
4439
+ /** The message to show under the field: the first error, once touched. */
4440
+ protected readonly errorMessage: _angular_core.Signal<string | undefined>;
4441
+ /** `aria-describedby` target: the error when shown, else the hint, else none. */
4442
+ protected readonly describedBy: _angular_core.Signal<string | null>;
4443
+ constructor();
4444
+ /** Parses the native value: empty or unparseable → `null`, otherwise a `number`. */
4445
+ onInputChange(event: Event): void;
4446
+ /** On blur: mark touched; settle the value onto its constraints when any apply. */
4447
+ protected onBlur(): void;
4448
+ /** Keyboard-only click (Enter/Space have `detail === 0`); pointer presses are
4449
+ * driven by {@link FoldRepeatPressDirective} so they don't double-step. */
4450
+ protected onButtonClick(direction: 1 | -1, event: MouseEvent): void;
4451
+ /** Own the ↑/↓ arrows so keyboard stepping obeys snap/clamp/precision, not the
4452
+ * native `step` (which would only reconcile on blur). */
4453
+ protected onArrow(direction: 1 | -1, event: Event): void;
4454
+ /** A focused number field changes value on scroll — blur so the page scrolls
4455
+ * instead (blur on an unfocused input is a no-op). */
4456
+ protected onWheel(event: WheelEvent): void;
4457
+ /** The glyph for a step button in the given direction (arrows vs `− / +`). */
4458
+ protected iconFor(direction: 1 | -1): FoldIconName;
4459
+ /** Nudge the value by ±step, then settle it onto its constraints. */
4460
+ protected stepBy(direction: 1 | -1): void;
4461
+ /**
4462
+ * Resolve a raw number to a valid settled value — the single source of truth
4463
+ * for "what counts as valid", so blur and stepping never diverge. Delegates to
4464
+ * the pure {@link settleNumber} with the current constraints.
4465
+ */
4466
+ private settle;
4467
+ private warnStepMisaligned;
4468
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldNumberInputComponent, never>;
4469
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldNumberInputComponent, "fold-number-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "spinner": { "alias": "spinner"; "required": false; "isSignal": true; }; "controls": { "alias": "controls"; "required": false; "isSignal": true; }; "showStep": { "alias": "showStep"; "required": false; "isSignal": true; }; "snapToStep": { "alias": "snapToStep"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "integer": { "alias": "integer"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
4470
+ }
4471
+
4472
+ /**
4473
+ * `<fold-textarea>` — the multiline sibling of {@link FoldInputComponent}
4474
+ * (`value: string`): a note / description field. It shares the exact box chrome
4475
+ * (tokens, sizes, `panel` variant, focus/disabled) as `fold-input` via
4476
+ * `input-shell.scss`, and the label / required / hint / error chrome via {@link
4477
+ * FoldInputBaseComponent} — so a multiline field is no longer a hand-rolled native
4478
+ * `<textarea>` + duplicated box CSS.
4479
+ *
4480
+ * **No resize handle by design** — the box has a fixed row count and **wraps +
4481
+ * scrolls** its overflow (`resize: none; overflow-y: auto`), so it never breaks a
4482
+ * panel/form layout the way a user-draggable corner does. Height is driven by
4483
+ * `rows` (the box shares the control font / padding / radius but not a fixed
4484
+ * height).
4485
+ *
4486
+ * Integrates with signal forms via the `FormValueControl` contract (bind with
4487
+ * `[formField]`), or drive it standalone with `[(value)]` / `(valueChange)`.
4488
+ *
4489
+ * @selector `fold-textarea`
4490
+ *
4491
+ * @example
4492
+ * ```html
4493
+ * <!-- Signal-forms field -->
4494
+ * <fold-textarea label="Note" [rows]="3" [formField]="form.note" />
4495
+ *
4496
+ * <!-- Standalone two-way -->
4497
+ * <fold-textarea placeholder="Consigne…" [(value)]="note" />
4498
+ * ```
4499
+ */
4500
+ declare class FoldTextareaComponent implements FormValueControl<string> {
4501
+ /** The bound value — a `model()` so signal forms' `FormField` and `[(value)]`
4502
+ * both keep it in sync. */
4503
+ readonly value: _angular_core.ModelSignal<string>;
4504
+ /** Disabled state — bound automatically by `FormField` from the field. */
4505
+ readonly disabled: _angular_core.InputSignal<boolean>;
4506
+ /** Two-way touched state — set on blur, kept in sync with the field. */
4507
+ readonly touched: _angular_core.ModelSignal<boolean>;
4508
+ /** Validation errors — bound by `FormField` from the field. */
4509
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
4510
+ /** Visible row count — the initial (and, with no resize, effective) height.
4511
+ * Overflow beyond it wraps and scrolls. @default 3 */
4512
+ readonly rows: _angular_core.InputSignalWithTransform<number, unknown>;
4513
+ /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
4514
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
4515
+ /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */
4516
+ readonly variant: _angular_core.InputSignal<"default" | "panel">;
4517
+ /** Optional label displayed above the control. */
4518
+ readonly label: _angular_core.InputSignal<string | undefined>;
4519
+ /** Show a required marker on the label (and set the native `required`). */
4520
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
4521
+ /** Show a lighter `(optional)` marker on the label (ignored when required). */
4522
+ readonly optional: _angular_core.InputSignalWithTransform<boolean, unknown>;
4523
+ /** The word inside the optional marker. @default 'optional' */
4524
+ readonly optionalLabel: _angular_core.InputSignal<string>;
4525
+ /** Optional helper text shown under the control. */
4526
+ readonly hint: _angular_core.InputSignal<string | undefined>;
4527
+ /** Placeholder text. */
4528
+ readonly placeholder: _angular_core.InputSignal<string>;
4529
+ /** Render as read-only. Named `readOnly` (not `readonly`) to avoid the
4530
+ * signal-forms `FormField` reserved `readonly` field-state binding. */
4531
+ readonly readOnly: _angular_core.InputSignal<boolean>;
4532
+ /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
4533
+ readonly inputId: string;
4534
+ /** The message to show under the field: the first error, once touched. */
4535
+ protected readonly errorMessage: _angular_core.Signal<string | undefined>;
4536
+ /** `aria-describedby` target: the error when shown, else the hint, else none. */
4537
+ protected readonly describedBy: _angular_core.Signal<string | null>;
4538
+ /** Handles native input event. `value.set()` also fires the model's auto
4539
+ * `valueChange` output for standalone `(valueChange)` consumers. */
4540
+ onInputChange(event: Event): void;
4541
+ /** Mark the field touched on blur, so errors can surface. */
4542
+ protected onBlur(): void;
4543
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldTextareaComponent, never>;
4544
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldTextareaComponent, "fold-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
4545
+ }
4546
+
4547
+ /** The native calendar-date input types `fold-date` wraps — they share the exact
4548
+ * chrome and a `string` value; only the picker granularity differs. For a
4549
+ * clock/time field use {@link FoldTimeComponent} (`fold-time`). */
4550
+ type FoldDateType = "date" | "datetime-local" | "month" | "week";
4551
+ /**
4552
+ * `<fold-date>` — the calendar-field sibling of {@link FoldInputComponent}: a thin
4553
+ * wrapper around a **native `<input type="date">`** (and its family — `datetime-local`,
4554
+ * `month`, `week` via {@link type}), like `fold-select` wraps the native `<select>`.
4555
+ * It honours the project's Signal-Forms convention (native `[value]` / `(input)`)
4556
+ * and gives back a **typed `[(value)]`** (the native value string, `YYYY-MM-DD` for
4557
+ * a date) — so consumers stop hand-writing an `inputValue($event)` reader on a bare
4558
+ * `<input type="date">`. For a time-of-day field, use the sibling {@link
4559
+ * FoldTimeComponent} (`fold-time`).
4560
+ *
4561
+ * The native pickers keep the OS calendar + mobile keyboard for free (same
4562
+ * reasoning as {@link FoldNumberInputComponent} staying `type="number"`). This is
4563
+ * **not** a calendar popover — that's the `fold-calendar` family; this is the plain
4564
+ * field. Shares the exact box chrome (tokens, sizes, `panel` variant) via
4565
+ * `input-shell.scss` and the label / required / hint / error chrome via {@link
4566
+ * FoldInputBaseComponent}.
4567
+ *
4568
+ * @selector `fold-date`
4569
+ *
4570
+ * @example
4571
+ * ```html
4572
+ * <!-- A date field, signal-forms bound -->
4573
+ * <fold-date label="Date de livraison" [formField]="form.date" />
4574
+ *
4575
+ * <!-- A month field, standalone two-way -->
4576
+ * <fold-date type="month" [(value)]="billingMonth" />
4577
+ * ```
4578
+ */
4579
+ declare class FoldDateComponent implements FormValueControl<string> {
4580
+ /** The bound value — the native input string (`YYYY-MM-DD`, `HH:mm`, …). A
4581
+ * `model()` so `FormField` and `[(value)]` both stay in sync. */
4582
+ readonly value: _angular_core.ModelSignal<string>;
4583
+ /** Disabled state — bound automatically by `FormField` from the field. */
4584
+ readonly disabled: _angular_core.InputSignal<boolean>;
4585
+ /** Two-way touched state — set on blur, kept in sync with the field. */
4586
+ readonly touched: _angular_core.ModelSignal<boolean>;
4587
+ /** Validation errors — bound by `FormField` from the field. */
4588
+ readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
4589
+ /** Which native temporal picker to render. @default 'date' */
4590
+ readonly type: _angular_core.InputSignal<FoldDateType>;
4591
+ /** Native `min` bound (e.g. `2026-01-01`) — passes through to the input. Typed
4592
+ * `string | undefined` (not `| null`) to stay assignable to the signal-forms
4593
+ * `FormValueControl` reserved `min` field-state binding. */
4594
+ readonly min: _angular_core.InputSignal<string | undefined>;
4595
+ /** Native `max` bound — passes through to the input (see {@link min}). */
4596
+ readonly max: _angular_core.InputSignal<string | undefined>;
4597
+ /** Native `step` (e.g. `60` for whole-minute time) — passes through. */
4598
+ readonly step: _angular_core.InputSignal<string | number | undefined>;
4599
+ /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
4600
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
4601
+ /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */
4602
+ readonly variant: _angular_core.InputSignal<"default" | "panel">;
4603
+ /** Optional label displayed above the control. */
4604
+ readonly label: _angular_core.InputSignal<string | undefined>;
4605
+ /** Show a required marker on the label (and set the native `required`). */
4606
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
4607
+ /** Show a lighter `(optional)` marker on the label (ignored when required). */
4608
+ readonly optional: _angular_core.InputSignalWithTransform<boolean, unknown>;
4609
+ /** The word inside the optional marker. @default 'optional' */
4610
+ readonly optionalLabel: _angular_core.InputSignal<string>;
4611
+ /** Optional helper text shown under the control. */
4612
+ readonly hint: _angular_core.InputSignal<string | undefined>;
4613
+ /** Render as read-only. Named `readOnly` (not `readonly`) to avoid the
4614
+ * signal-forms `FormField` reserved `readonly` field-state binding. */
4615
+ readonly readOnly: _angular_core.InputSignal<boolean>;
4616
+ /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
4617
+ readonly inputId: string;
4618
+ /** The message to show under the field: the first error, once touched. */
4619
+ protected readonly errorMessage: _angular_core.Signal<string | undefined>;
4620
+ /** `aria-describedby` target: the error when shown, else the hint, else none. */
4621
+ protected readonly describedBy: _angular_core.Signal<string | null>;
4622
+ /** Write the chosen native value back through the model. */
4623
+ onInputChange(event: Event): void;
4624
+ /** Mark the field touched on blur, so errors can surface. */
4625
+ protected onBlur(): void;
4626
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldDateComponent, never>;
4627
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldDateComponent, "fold-date", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
4628
+ }
4629
+
4630
+ /**
4631
+ * `<fold-time>` — the time-of-day sibling of {@link FoldDateComponent}: a thin
4632
+ * wrapper around a **native `<input type="time">`**, like `fold-select` wraps the
4633
+ * native `<select>`. It honours the project's Signal-Forms convention (native
4634
+ * `[value]` / `(input)`) and gives back a **typed `[(value)]`** (the native value
4635
+ * string, `HH:mm`, or `HH:mm:ss` when a sub-minute `step` is set) — so consumers
4636
+ * stop hand-writing an `inputValue($event)` reader on a bare `<input type="time">`.
4637
+ *
4638
+ * A separate control from `fold-date` (rather than a `type="time"` on it) so each
4639
+ * reads for what it is at the call site — the same "one control, one job" split as
4640
+ * {@link FoldInputComponent} vs {@link FoldNumberInputComponent}. Shares the exact
4641
+ * box chrome (tokens, sizes, `panel` variant) via `input-shell.scss` and the label
4642
+ * / required / hint / error chrome via {@link FoldInputBaseComponent}.
2592
4643
  *
2593
- * @selector `fold-number-input`
4644
+ * @selector `fold-time`
2594
4645
  *
2595
4646
  * @example
2596
4647
  * ```html
2597
- * <!-- Signal-forms field (form.bpm: number) -->
2598
- * <fold-number-input placeholder="BPM" [min]="0" [formField]="form.bpm" />
4648
+ * <!-- Signal-forms bound -->
4649
+ * <fold-time label="Heure de retrait" [formField]="form.time" />
2599
4650
  *
2600
- * <!-- Standalone two-way -->
2601
- * <fold-number-input align="center" [step]="0.5" [(value)]="gain" />
4651
+ * <!-- Standalone two-way, whole-minute steps -->
4652
+ * <fold-time [step]="60" [(value)]="pickupTime" />
2602
4653
  * ```
2603
4654
  */
2604
- declare class FoldNumberInputComponent implements FormValueControl<number | null> {
2605
- /** The bound value — `null` when the field is empty. A `model()` so signal
2606
- * forms' `FormField` and `[(value)]` both keep it in sync. */
2607
- readonly value: _angular_core.ModelSignal<number | null>;
4655
+ declare class FoldTimeComponent implements FormValueControl<string> {
4656
+ /** The bound value — the native input string (`HH:mm` / `HH:mm:ss`). A
4657
+ * `model()` so `FormField` and `[(value)]` both stay in sync. */
4658
+ readonly value: _angular_core.ModelSignal<string>;
2608
4659
  /** Disabled state — bound automatically by `FormField` from the field. */
2609
4660
  readonly disabled: _angular_core.InputSignal<boolean>;
2610
- /** Two-way touched state — set on blur (so `FormField` marks the field
2611
- * touched), and kept in sync with the field's touched state. */
4661
+ /** Two-way touched state — set on blur, kept in sync with the field. */
2612
4662
  readonly touched: _angular_core.ModelSignal<boolean>;
2613
4663
  /** Validation errors — bound by `FormField` from the field. */
2614
4664
  readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
4665
+ /** Native `min` bound (e.g. `09:00`) — passes through to the input. Typed
4666
+ * `string | undefined` (not `| null`) to stay assignable to the signal-forms
4667
+ * `FormValueControl` reserved `min` field-state binding. */
4668
+ readonly min: _angular_core.InputSignal<string | undefined>;
4669
+ /** Native `max` bound (e.g. `18:00`) — passes through (see {@link min}). */
4670
+ readonly max: _angular_core.InputSignal<string | undefined>;
4671
+ /** Native `step` in seconds (e.g. `60` whole-minute, `1` seconds field). */
4672
+ readonly step: _angular_core.InputSignal<string | number | undefined>;
2615
4673
  /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */
2616
4674
  readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
2617
- /** Text alignment inside the box. @default 'start' */
2618
- readonly align: _angular_core.InputSignal<"center" | "start">;
2619
4675
  /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */
2620
4676
  readonly variant: _angular_core.InputSignal<"default" | "panel">;
2621
- /** Optional label displayed above the input. */
4677
+ /** Optional label displayed above the control. */
2622
4678
  readonly label: _angular_core.InputSignal<string | undefined>;
2623
4679
  /** Show a required marker on the label (and set the native `required`). */
2624
4680
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -2626,92 +4682,23 @@ declare class FoldNumberInputComponent implements FormValueControl<number | null
2626
4682
  readonly optional: _angular_core.InputSignalWithTransform<boolean, unknown>;
2627
4683
  /** The word inside the optional marker. @default 'optional' */
2628
4684
  readonly optionalLabel: _angular_core.InputSignal<string>;
2629
- /** Optional helper text shown under the input. */
4685
+ /** Optional helper text shown under the control. */
2630
4686
  readonly hint: _angular_core.InputSignal<string | undefined>;
2631
- /** Placeholder text. */
2632
- readonly placeholder: _angular_core.InputSignal<string>;
2633
- /** Render as read-only. Named `readOnly` to avoid the `FormField` reserved binding. */
4687
+ /** Render as read-only. Named `readOnly` (not `readonly`) to avoid the
4688
+ * signal-forms `FormField` reserved `readonly` field-state binding. */
2634
4689
  readonly readOnly: _angular_core.InputSignal<boolean>;
2635
- /** Minimum value — passthrough + bound by a field's `min` validator. */
2636
- readonly min: _angular_core.InputSignal<number | undefined>;
2637
- /** Maximum value — passthrough + bound by a field's `max` validator. */
2638
- readonly max: _angular_core.InputSignal<number | undefined>;
2639
- /** Increment applied by the spinner buttons / arrow keys. @default 1 */
2640
- readonly step: _angular_core.InputSignal<number | undefined>;
2641
- /** The step glyph — `plusminus` (`−`/`+`, default), `arrows` (chevrons), `none`. */
2642
- readonly spinner: _angular_core.InputSignal<FoldNumberSpinner>;
2643
- /** Where the buttons sit — `inside` the box (default) or `outside`, flanking it. */
2644
- readonly controls: _angular_core.InputSignal<FoldNumberControls>;
2645
- /** Show the {@link step} as a small suffix, so the increment is visible. */
2646
- readonly showStep: _angular_core.InputSignalWithTransform<boolean, unknown>;
2647
- /**
2648
- * Keep the value on the step grid. When on, a manually typed value snaps to
2649
- * the nearest valid `base + n·step` **on blur** (base is {@link min}, else 0),
2650
- * then clamps to min/max — so free typing is allowed while editing, and the
2651
- * settled value always respects the step. Off by default.
2652
- */
2653
- readonly snapToStep: _angular_core.InputSignalWithTransform<boolean, unknown>;
2654
- /**
2655
- * Cap the number of decimal places on the settled value: it is rounded to this
2656
- * many decimals when stepping and on blur. `undefined` = unconstrained (any
2657
- * decimals allowed). See {@link integer} for the `0` shorthand.
2658
- */
2659
- readonly decimals: _angular_core.InputSignal<number | undefined>;
2660
- /** Shorthand for `decimals = 0` — integers only. Takes precedence over {@link decimals}. */
2661
- readonly integer: _angular_core.InputSignalWithTransform<boolean, unknown>;
2662
4690
  /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
2663
4691
  readonly inputId: string;
2664
- /** The effective step (defaults to 1 when unset). */
2665
- protected readonly effectiveStep: _angular_core.Signal<number>;
2666
- /** The resolved decimal cap: `0` when {@link integer}, else {@link decimals}. */
2667
- private readonly maxDecimals;
2668
- /** The active numeric constraints — shared by settling and the alignment check. */
2669
- private readonly constraints;
2670
- /** The native `step` attribute — `1` for integers with no explicit step. */
2671
- protected readonly nativeStep: _angular_core.Signal<number | undefined>;
2672
- /** At/below the min bound — the decrement button is disabled. */
2673
- protected readonly atMin: _angular_core.Signal<boolean>;
2674
- /** At/above the max bound — the increment button is disabled. */
2675
- protected readonly atMax: _angular_core.Signal<boolean>;
2676
- /** Whether any spinner button renders. */
2677
- protected readonly hasControls: _angular_core.Signal<boolean>;
2678
- /** Non-interactive (disabled or read-only) → both buttons off. */
2679
- private readonly frozen;
2680
- /** The increment button is disabled. */
2681
- protected readonly incDisabled: _angular_core.Signal<boolean>;
2682
- /** The decrement button is disabled. */
2683
- protected readonly decDisabled: _angular_core.Signal<boolean>;
2684
4692
  /** The message to show under the field: the first error, once touched. */
2685
4693
  protected readonly errorMessage: _angular_core.Signal<string | undefined>;
2686
4694
  /** `aria-describedby` target: the error when shown, else the hint, else none. */
2687
4695
  protected readonly describedBy: _angular_core.Signal<string | null>;
2688
- constructor();
2689
- /** Parses the native value: empty or unparseable → `null`, otherwise a `number`. */
4696
+ /** Write the chosen native value back through the model. */
2690
4697
  onInputChange(event: Event): void;
2691
- /** On blur: mark touched; settle the value onto its constraints when any apply. */
4698
+ /** Mark the field touched on blur, so errors can surface. */
2692
4699
  protected onBlur(): void;
2693
- /** Keyboard-only click (Enter/Space have `detail === 0`); pointer presses are
2694
- * driven by {@link FoldRepeatPressDirective} so they don't double-step. */
2695
- protected onButtonClick(direction: 1 | -1, event: MouseEvent): void;
2696
- /** Own the ↑/↓ arrows so keyboard stepping obeys snap/clamp/precision, not the
2697
- * native `step` (which would only reconcile on blur). */
2698
- protected onArrow(direction: 1 | -1, event: Event): void;
2699
- /** A focused number field changes value on scroll — blur so the page scrolls
2700
- * instead (blur on an unfocused input is a no-op). */
2701
- protected onWheel(event: WheelEvent): void;
2702
- /** The glyph for a step button in the given direction (arrows vs `− / +`). */
2703
- protected iconFor(direction: 1 | -1): FoldIconName;
2704
- /** Nudge the value by ±step, then settle it onto its constraints. */
2705
- protected stepBy(direction: 1 | -1): void;
2706
- /**
2707
- * Resolve a raw number to a valid settled value — the single source of truth
2708
- * for "what counts as valid", so blur and stepping never diverge. Delegates to
2709
- * the pure {@link settleNumber} with the current constraints.
2710
- */
2711
- private settle;
2712
- private warnStepMisaligned;
2713
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldNumberInputComponent, never>;
2714
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldNumberInputComponent, "fold-number-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "spinner": { "alias": "spinner"; "required": false; "isSignal": true; }; "controls": { "alias": "controls"; "required": false; "isSignal": true; }; "showStep": { "alias": "showStep"; "required": false; "isSignal": true; }; "snapToStep": { "alias": "snapToStep"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "integer": { "alias": "integer"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
4700
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldTimeComponent, never>;
4701
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldTimeComponent, "fold-time", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
2715
4702
  }
2716
4703
 
2717
4704
  /**
@@ -2906,6 +4893,22 @@ interface FoldSelectOption<T> {
2906
4893
  /** Skip in keyboard nav and block selection. @default false */
2907
4894
  readonly disabled?: boolean;
2908
4895
  }
4896
+ /**
4897
+ * A labelled group of options for the array API — the data-driven counterpart to
4898
+ * a projected `<fold-optgroup>`. Put groups (and/or plain options) in the
4899
+ * `[options]` array; the control renders each group's `options` under its
4900
+ * `label`, and keyboard nav still roves the flattened list in order.
4901
+ */
4902
+ interface FoldSelectOptionGroup<T> {
4903
+ /** The group heading — its accessible name; not selectable. */
4904
+ readonly label: string;
4905
+ /** The options under this heading. */
4906
+ readonly options: readonly FoldSelectOption<T>[];
4907
+ }
4908
+ /** One entry of the `[options]` array: a plain option or a labelled group. */
4909
+ type FoldSelectItem<T> = FoldSelectOption<T> | FoldSelectOptionGroup<T>;
4910
+ /** True when an `[options]` entry is a group (has nested `options`), not a leaf. */
4911
+ declare function isFoldSelectOptionGroup<T>(item: FoldSelectItem<T>): item is FoldSelectOptionGroup<T>;
2909
4912
 
2910
4913
  /**
2911
4914
  * The contract a `fold-option` needs from whatever owns it — the single-select
@@ -2957,8 +4960,10 @@ declare class FoldListboxComponent<T> implements FormValueControl<T | null>, Fol
2957
4960
  readonly compareWith: _angular_core.InputSignal<((a: T, b: T) => boolean) | undefined>;
2958
4961
  /** Data-driven options — the alternative to projecting `<fold-option>`. When
2959
4962
  * set, the value type is linked to the options at compile time (no projection
2960
- * seam). For rich rows, project `<ng-template #option let-o>`. */
2961
- readonly options: _angular_core.InputSignal<readonly FoldSelectOption<T>[] | undefined>;
4963
+ * seam). Entries can be plain options or labelled {@link FoldSelectOptionGroup}s
4964
+ * (the array counterpart to `<fold-optgroup>`). For rich rows, project
4965
+ * `<ng-template #option let-o>`. */
4966
+ readonly options: _angular_core.InputSignal<readonly FoldSelectItem<T>[] | undefined>;
2962
4967
  /** Disabled state — bound automatically by `FormField`. */
2963
4968
  readonly disabled: _angular_core.InputSignal<boolean>;
2964
4969
  /** Two-way touched state — set on selection / blur, kept in sync with the field. */
@@ -3032,6 +5037,11 @@ declare class FoldListboxComponent<T> implements FormValueControl<T | null>, Fol
3032
5037
  constructor();
3033
5038
  /** A value is selected when it equals the current one (via `compareWith`). */
3034
5039
  isSelected(value: T): boolean;
5040
+ /** Narrow an `[options]` entry to a group, or `null` — lets the template
5041
+ * branch on the two shapes with each side fully typed (no `any`). */
5042
+ protected asGroup(item: FoldSelectItem<T>): FoldSelectOptionGroup<T> | null;
5043
+ /** Narrow an `[options]` entry to a plain option, or `null`. */
5044
+ protected asOption(item: FoldSelectItem<T>): FoldSelectOption<T> | null;
3035
5045
  /** Clear the selection (the `allowClear` ×). */
3036
5046
  protected clear(event: Event): void;
3037
5047
  /** Open with the keys a native select opens on; otherwise type-ahead picks
@@ -3083,9 +5093,11 @@ declare class FoldMultiselectComponent<T> implements FormValueControl<readonly T
3083
5093
  * values; primitives don't need it. @default `Object.is` */
3084
5094
  readonly compareWith: _angular_core.InputSignal<((a: T, b: T) => boolean) | undefined>;
3085
5095
  /** Data-driven options — the alternative to projecting `<fold-option>`. When
3086
- * set, the value type is linked to the options at compile time. For rich rows,
3087
- * project `<ng-template #option let-o>`. */
3088
- readonly options: _angular_core.InputSignal<readonly FoldSelectOption<T>[] | undefined>;
5096
+ * set, the value type is linked to the options at compile time. Entries can be
5097
+ * plain options or labelled {@link FoldSelectOptionGroup}s (the array
5098
+ * counterpart to `<fold-optgroup>`). For rich rows, project
5099
+ * `<ng-template #option let-o>`. */
5100
+ readonly options: _angular_core.InputSignal<readonly FoldSelectItem<T>[] | undefined>;
3089
5101
  /** Disabled state — bound automatically by `FormField`. */
3090
5102
  readonly disabled: _angular_core.InputSignal<boolean>;
3091
5103
  /** Two-way touched state — set on the first toggle, kept in sync with the field. */
@@ -3112,6 +5124,16 @@ declare class FoldMultiselectComponent<T> implements FormValueControl<readonly T
3112
5124
  readonly placeholder: _angular_core.InputSignal<string | undefined>;
3113
5125
  /** Preferred popup placement. @default 'bottom-start' */
3114
5126
  readonly placement: _angular_core.InputSignal<FoldPopoverPlacement>;
5127
+ /** Offer a **Select all** bulk action at the top of the panel (adds every
5128
+ * enabled option to the set). @default false */
5129
+ readonly allowSelectAll: _angular_core.InputSignalWithTransform<boolean, unknown>;
5130
+ /** Offer a **Clear** bulk action at the top of the panel (empties the set). The
5131
+ * multiselect counterpart to `fold-listbox`'s trigger `allowClear`. @default false */
5132
+ readonly allowClear: _angular_core.InputSignalWithTransform<boolean, unknown>;
5133
+ /** Label of the select-all action. @default 'Select all' */
5134
+ readonly selectAllLabel: _angular_core.InputSignal<string>;
5135
+ /** Label of the clear action. @default 'Clear' */
5136
+ readonly clearLabel: _angular_core.InputSignal<string>;
3115
5137
  /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */
3116
5138
  readonly inputId: string;
3117
5139
  /** Id of the `role="listbox"` element (own, distinct from the popover panel). */
@@ -3142,12 +5164,22 @@ declare class FoldMultiselectComponent<T> implements FormValueControl<readonly T
3142
5164
  protected readonly errorMessage: _angular_core.Signal<string | undefined>;
3143
5165
  /** `aria-describedby` target: the error when shown, else the hint, else none. */
3144
5166
  protected readonly describedBy: _angular_core.Signal<string | null>;
5167
+ /** Whether the bulk-action bar shows at all (either affordance enabled, and
5168
+ * there is at least one option to act on). */
5169
+ protected readonly showBulk: _angular_core.Signal<boolean>;
5170
+ /** Every enabled option is already selected — nothing left for "Select all". */
5171
+ protected readonly allEnabledSelected: _angular_core.Signal<boolean>;
3145
5172
  /** Has the popup been opened this lifetime — so any close marks touched (blur
3146
5173
  * parity), even one that picked nothing. */
3147
5174
  private hasOpened;
3148
5175
  constructor();
3149
5176
  /** A value is selected when it's in the current set (via `compareWith`). */
3150
5177
  isSelected(value: T): boolean;
5178
+ /** Narrow an `[options]` entry to a group, or `null` — lets the template
5179
+ * branch on the two shapes with each side fully typed (no `any`). */
5180
+ protected asGroup(item: FoldSelectItem<T>): FoldSelectOptionGroup<T> | null;
5181
+ /** Narrow an `[options]` entry to a plain option, or `null`. */
5182
+ protected asOption(item: FoldSelectItem<T>): FoldSelectOption<T> | null;
3151
5183
  /** Open with the keys a native select opens on. */
3152
5184
  protected onTriggerKeydown(event: KeyboardEvent): void;
3153
5185
  /** Keyboard while the list is open and focused — delegated to the core. */
@@ -3160,10 +5192,15 @@ declare class FoldMultiselectComponent<T> implements FormValueControl<readonly T
3160
5192
  private firstSelectedIndex;
3161
5193
  /** Index of the enabled option under an event target, or -1. */
3162
5194
  private enabledIndexFrom;
5195
+ /** Add every enabled option to the set (keeps already-picked disabled ones);
5196
+ * the panel stays open. */
5197
+ protected selectAll(): void;
5198
+ /** Empty the set (the bulk "Clear"). */
5199
+ protected clearAll(): void;
3163
5200
  /** Add or remove the option's value from the set; the panel stays open. */
3164
5201
  private toggle;
3165
5202
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldMultiselectComponent<any>, never>;
3166
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldMultiselectComponent<any>, "fold-multiselect", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "open": "openChange"; }, ["optionTemplate", "projectedOptions"], ["*"], true, never>;
5203
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldMultiselectComponent<any>, "fold-multiselect", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "optionalLabel": { "alias": "optionalLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "allowSelectAll": { "alias": "allowSelectAll"; "required": false; "isSignal": true; }; "allowClear": { "alias": "allowClear"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "open": "openChange"; }, ["optionTemplate", "projectedOptions"], ["*"], true, never>;
3167
5204
  }
3168
5205
 
3169
5206
  /**
@@ -3205,6 +5242,40 @@ declare class FoldOptionComponent<T> {
3205
5242
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldOptionComponent<any>, "fold-option", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3206
5243
  }
3207
5244
 
5245
+ /**
5246
+ * `<fold-optgroup>` — a labelled group of `<fold-option>`s inside a
5247
+ * {@link FoldListboxComponent} / {@link FoldMultiselectComponent}, the styleable
5248
+ * counterpart to the native `<optgroup>`. Purely presentational: it renders a
5249
+ * non-selectable header and projects its options, which the owning listbox still
5250
+ * discovers (it queries options with `descendants: true`) and roves across in
5251
+ * document order — so grouping changes the layout, never the keyboard model.
5252
+ *
5253
+ * `role="group"` + `aria-labelledby` names the group for assistive tech; the
5254
+ * header carries no `role="option"`, so keyboard nav skips straight over it.
5255
+ *
5256
+ * ```html
5257
+ * <fold-listbox [(value)]="city">
5258
+ * <fold-optgroup label="France">
5259
+ * <fold-option value="paris">Paris</fold-option>
5260
+ * <fold-option value="lyon">Lyon</fold-option>
5261
+ * </fold-optgroup>
5262
+ * <fold-optgroup label="Italia">
5263
+ * <fold-option value="roma">Roma</fold-option>
5264
+ * </fold-optgroup>
5265
+ * </fold-listbox>
5266
+ * ```
5267
+ *
5268
+ * @selector `fold-optgroup`
5269
+ */
5270
+ declare class FoldOptgroupComponent {
5271
+ /** The group's visible heading — also its accessible name (`aria-labelledby`). */
5272
+ readonly label: _angular_core.InputSignal<string>;
5273
+ /** Stable, SSR-safe id the group's `aria-labelledby` points at. */
5274
+ readonly labelId: string;
5275
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldOptgroupComponent, never>;
5276
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldOptgroupComponent, "fold-optgroup", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
5277
+ }
5278
+
3208
5279
  /**
3209
5280
  * One password requirement shown as a live-validating dot in
3210
5281
  * {@link FoldPasswordFieldComponent}. The predicate is deliberately just a
@@ -3639,7 +5710,7 @@ declare class FoldCalloutComponent {
3639
5710
  protected readonly iconName: _angular_core.Signal<FoldIconName>;
3640
5711
  /** The resolved ARIA role — public so a consumer (or the gallery) can show
3641
5712
  * what `announce` actually did, since it changes nothing visually. */
3642
- readonly role: _angular_core.Signal<"alert" | "note" | "status">;
5713
+ readonly role: _angular_core.Signal<"alert" | "status" | "note">;
3643
5714
  /** The resolved live-region politeness, or `null` when passive. */
3644
5715
  readonly ariaLive: _angular_core.Signal<"assertive" | "polite" | null>;
3645
5716
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalloutComponent, never>;
@@ -3971,6 +6042,10 @@ declare class FoldIconRegistry {
3971
6042
  resolve(name: string): string | undefined;
3972
6043
  /** Whether a name is registered. Reactive. */
3973
6044
  has(name: string): boolean;
6045
+ /** Every registered icon name (built-ins + runtime additions), sorted.
6046
+ * Reactive — recomputes when an icon is registered. Powers tooling that
6047
+ * browses the live catalogue (e.g. the `fold-icon-devtool`). */
6048
+ names(): string[];
3974
6049
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldIconRegistry, never>;
3975
6050
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FoldIconRegistry>;
3976
6051
  }
@@ -4248,6 +6323,20 @@ declare class FoldPageTitleDirective {
4248
6323
  * </fold-page-layout>
4249
6324
  * ```
4250
6325
  *
6326
+ * ## Who owns the scroll
6327
+ * The `scroll` input decides whether the page is its own scroll box:
6328
+ * - **`flow` (default)** — the page owns **no** scroll; it flows inside its
6329
+ * host's scroll region (typically the `fold-app-shell` content, which owns the
6330
+ * scroll). This is the "never manage scroll again" default — the page just
6331
+ * grows and the shell scrolls, so a shell footer at the end of the content is
6332
+ * always reachable and there is never a page-inside-shell double scrollbar.
6333
+ * - **`own`** — the page is its own scroll box (the legacy behaviour):
6334
+ * `overflow-y: auto` + `overscroll-behavior: contain`, filling the height its
6335
+ * frame gives it. Reach for it only when the page must scroll as a self-
6336
+ * contained unit — dropped into a `stage` shell (whose content region does not
6337
+ * scroll) or a bare fixed-height container. See the shell's `scroll` knob and
6338
+ * `docs/scroll.md`.
6339
+ *
4251
6340
  * @selector `fold-page-layout`
4252
6341
  */
4253
6342
  declare class FoldPageLayoutComponent {
@@ -4257,11 +6346,19 @@ declare class FoldPageLayoutComponent {
4257
6346
  readonly title: _angular_core.InputSignal<string | undefined>;
4258
6347
  /** An optional leading icon shown beside the title. */
4259
6348
  readonly icon: _angular_core.InputSignal<FoldIconName | undefined>;
6349
+ /**
6350
+ * Who owns the page's scroll:
6351
+ * - `"flow"` (default) — the page flows inside its host's scroll (the shell
6352
+ * owns the scroll); the page has no scroll box of its own.
6353
+ * - `"own"` — the page is its own scroll box (`overflow-y: auto`), for a page
6354
+ * dropped into a non-scrolling `stage` shell or a bare fixed-height frame.
6355
+ */
6356
+ readonly scroll: _angular_core.InputSignal<"flow" | "own">;
4260
6357
  /** A projected `[pageTitle]`, if any — switches the header on for a custom
4261
6358
  * title even without the `title` input. */
4262
6359
  protected readonly customTitle: _angular_core.Signal<FoldPageTitleDirective | undefined>;
4263
6360
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldPageLayoutComponent, never>;
4264
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPageLayoutComponent, "fold-page-layout", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, ["customTitle"], ["[pageTitle]", "[titleBadge]", "p[description]", "[pageActions]", "*"], true, never>;
6361
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPageLayoutComponent, "fold-page-layout", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "scroll": { "alias": "scroll"; "required": false; "isSignal": true; }; }, {}, ["customTitle"], ["[pageTitle]", "[titleBadge]", "p[description]", "[pageActions]", "*"], true, never>;
4265
6362
  }
4266
6363
 
4267
6364
  /**
@@ -4640,12 +6737,98 @@ declare class FoldViewNavComponent {
4640
6737
  readonly background: _angular_core.InputSignal<"transparent" | "surface">;
4641
6738
  /** The nearest layout, if any — lets `direction="auto"` follow it. */
4642
6739
  private readonly layout;
6740
+ /**
6741
+ * No wrapping `fold-nav-layout`. Standalone, the bar owns its gap to the
6742
+ * following content; inside a layout, the layout owns it (avoiding a double
6743
+ * gap).
6744
+ */
6745
+ protected readonly isStandalone: _angular_core.Signal<boolean>;
4643
6746
  /** `direction` with `auto` resolved against the wrapping layout. */
4644
6747
  protected readonly resolvedDirection: _angular_core.Signal<"vertical" | "horizontal">;
4645
6748
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldViewNavComponent, never>;
4646
6749
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldViewNavComponent, "fold-view-nav", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "activeKey": { "alias": "activeKey"; "required": false; "isSignal": true; }; "activeStyle": { "alias": "activeStyle"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; }, { "activeKey": "activeKeyChange"; }, never, never, true, never>;
4647
6750
  }
4648
6751
 
6752
+ /**
6753
+ * One crumb in a {@link FoldBreadcrumbComponent} trail. A crumb links via **either**
6754
+ * an Angular `routerLink` (in-app) **or** a plain `href` (external / a non-router
6755
+ * app); give neither for a non-interactive step. The **last** item is always
6756
+ * rendered as the current page (never a link), whatever it carries.
6757
+ */
6758
+ interface FoldBreadcrumbItem {
6759
+ /** The crumb's visible text. */
6760
+ readonly label: string;
6761
+ /** Angular router target — a `routerLink` commands string or array. Takes
6762
+ * precedence over {@link href}. */
6763
+ readonly routerLink?: string | unknown[];
6764
+ /** Plain URL — for an external crumb, or an app that doesn't use the router. */
6765
+ readonly href?: string;
6766
+ }
6767
+ /**
6768
+ * `<fold-breadcrumb>` — a hierarchical trail of links to the current page. Data
6769
+ * driven: pass `[items]`; each crumb links by `routerLink` **or** `href`, so it
6770
+ * works in a router app and degrades to plain anchors without one (importing it
6771
+ * never forces `@angular/router` — `RouterLink` is only instantiated on a crumb
6772
+ * that actually sets `routerLink`). The last item renders as the current page
6773
+ * (`aria-current="page"`), not a link. Chevron separators are decorative.
6774
+ *
6775
+ * ```html
6776
+ * <fold-breadcrumb
6777
+ * [items]="[
6778
+ * { label: 'Accueil', routerLink: '/' },
6779
+ * { label: 'Catalogue', routerLink: '/catalogue' },
6780
+ * { label: 'Café d’Isère' },
6781
+ * ]"
6782
+ * />
6783
+ * ```
6784
+ *
6785
+ * @selector `fold-breadcrumb`
6786
+ */
6787
+ declare class FoldBreadcrumbComponent {
6788
+ /** The trail, root first; the last item is the current page. */
6789
+ readonly items: _angular_core.InputSignal<readonly FoldBreadcrumbItem[]>;
6790
+ /** Accessible name of the navigation landmark. @default 'Breadcrumb' */
6791
+ readonly ariaLabel: _angular_core.InputSignal<string>;
6792
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldBreadcrumbComponent, never>;
6793
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldBreadcrumbComponent, "fold-breadcrumb", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6794
+ }
6795
+
6796
+ /**
6797
+ * `<fold-back-link>` — the “← Back” affordance for a detail page. Three modes,
6798
+ * picked by which input is set:
6799
+ * - `routerLink` — an in-app `<a routerLink>` to a specific parent route.
6800
+ * - `href` — a plain `<a href>` (external, or a non-router app).
6801
+ * - neither — a `<button>` that goes **back in history** (`Location.back()`).
6802
+ *
6803
+ * Router-coupled but degradable: importing it never forces `@angular/router`
6804
+ * (`RouterLink` only instantiates on a `routerLink`), and the history-back mode
6805
+ * needs no router at all.
6806
+ *
6807
+ * ```html
6808
+ * <fold-back-link routerLink="/contrats" label="Tous les contrats" />
6809
+ * <fold-back-link href="/dashboard" />
6810
+ * <fold-back-link /> <!-- history back -->
6811
+ * ```
6812
+ *
6813
+ * @selector `fold-back-link`
6814
+ */
6815
+ declare class FoldBackLinkComponent {
6816
+ private readonly location;
6817
+ /** The link text. @default 'Back' */
6818
+ readonly label: _angular_core.InputSignal<string>;
6819
+ /** Angular router target — takes precedence over {@link href}. When both this
6820
+ * and `href` are unset, the control is a history-back button. */
6821
+ readonly routerLink: _angular_core.InputSignal<string | unknown[] | undefined>;
6822
+ /** Plain URL target (external, or a non-router app). */
6823
+ readonly href: _angular_core.InputSignal<string | undefined>;
6824
+ /** Leading icon. @default 'chevron-left' */
6825
+ readonly icon: _angular_core.InputSignal<FoldIconName>;
6826
+ /** History-back navigation, for the button mode. */
6827
+ protected goBack(): void;
6828
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldBackLinkComponent, never>;
6829
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldBackLinkComponent, "fold-back-link", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "routerLink": { "alias": "routerLink"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6830
+ }
6831
+
4649
6832
  /** A tab in a {@link FoldTabsComponent} bar. */
4650
6833
  type FoldTabItem = {
4651
6834
  /** Unique key — identifies the tab / its panel, emitted on change. */
@@ -4892,8 +7075,17 @@ declare const FOLD_TOAST_CONFIG: InjectionToken<FoldToastConfig>;
4892
7075
  */
4893
7076
  declare function provideFoldToasts(config: FoldToastConfig): Provider;
4894
7077
 
4895
- /** Which layout edge the panel slides in from. */
4896
- type FoldPanelSide = "left" | "right";
7078
+ /**
7079
+ * Which layout edge the panel slides in from.
7080
+ * - `right` (default) / `left` — a vertical side sheet, full height.
7081
+ * - `bottom` — a bottom sheet: full width, height driven by content up to a
7082
+ * max-height with internal scroll; slides up. The mobile-native shape, with a
7083
+ * top grabber that taps to dismiss.
7084
+ * - `auto` — **right on a wide container, bottom on a narrow one**. The switch is
7085
+ * container-driven (keyed off the panel host's own width via `@container`, not
7086
+ * the viewport), honouring fold's "responsive on its own width" contract.
7087
+ */
7088
+ type FoldPanelSide = "left" | "right" | "bottom" | "auto";
4897
7089
  /**
4898
7090
  * Panel surface treatment.
4899
7091
  * - `glass` (default) — frosted, translucent; the page shows through.
@@ -5009,9 +7201,15 @@ type FoldPanelDescriptor = FoldTemplatePanelDescriptor | FoldComponentPanelDescr
5009
7201
  /**
5010
7202
  * A component opened imperatively. Data-carrying panels declare a typed `data`
5011
7203
  * input; data-less panels (e.g. a help panel) simply omit it.
7204
+ *
7205
+ * `data` is typed as the **read** side (`Signal`), covariant, not the invariant
7206
+ * `InputSignal` — so a panel whose data input is *optional* (`data = input<T>()`
7207
+ * → `InputSignal<T | undefined>`) satisfies `FoldPanelContent<T>` just as a
7208
+ * required one (`input.required<T>()`) does. That's what lets `open(Cmp, { data })`
7209
+ * infer `T` from the value without the caller widening to `<T | undefined>`.
5012
7210
  */
5013
7211
  interface FoldPanelContent<TData> {
5014
- readonly data?: InputSignal<TData>;
7212
+ readonly data?: Signal<TData | undefined>;
5015
7213
  }
5016
7214
  /** Options for `FoldPanelHostService.open()`. */
5017
7215
  interface FoldPanelConfig<TData> {
@@ -5079,6 +7277,7 @@ interface FoldPanelHandle {
5079
7277
  declare class FoldPanelHostComponent {
5080
7278
  private readonly host;
5081
7279
  private readonly scrollLock;
7280
+ private readonly scrollRegions;
5082
7281
  private readonly element;
5083
7282
  private readonly document;
5084
7283
  readonly panels: _angular_core.Signal<readonly FoldPanelDescriptor[]>;
@@ -5102,6 +7301,16 @@ declare class FoldPanelHostComponent {
5102
7301
  shouldTrap(panel: FoldPanelDescriptor): boolean;
5103
7302
  /** Surface treatment for the panel shell; defaults to `glass`. */
5104
7303
  panelSurface(panel: FoldPanelDescriptor): FoldPanelSurface;
7304
+ /** The edge the panel docks to; defaults to `right`. `auto` is resolved to
7305
+ * right/bottom by the CSS `@container` on the host's own width, not here. */
7306
+ panelSide(panel: FoldPanelDescriptor): FoldPanelSide;
7307
+ /** A bottom sheet (`bottom`, or `auto` which can become one on a narrow host)
7308
+ * gets a top grabber. Hidden by CSS when `auto` resolves to a side sheet. */
7309
+ hasGrabber(panel: FoldPanelDescriptor): boolean;
7310
+ /** Accessible label for the bottom-sheet grabber — the app-wide close label. */
7311
+ protected readonly dismissLabel: string;
7312
+ /** Tapping the grabber dismisses the sheet, unless it guards implicit close. */
7313
+ onGrabber(panel: FoldPanelDescriptor): void;
5105
7314
  /**
5106
7315
  * The implicit dismiss gestures (Escape, backdrop) are suppressed when a panel
5107
7316
  * sets `disableClose` — the header close button and `FoldPanelRef.close()`
@@ -5208,6 +7417,46 @@ declare class FoldPanelHeaderComponent {
5208
7417
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPanelHeaderComponent, "fold-panel-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*", "[actions]"], true, never>;
5209
7418
  }
5210
7419
 
7420
+ /**
7421
+ * `<fold-panel-footer>` — the action bar that pairs with {@link
7422
+ * FoldPanelHeaderComponent} at the bottom of an imperative panel (or a future
7423
+ * `fold-dialog`). It carries the tokenised top border + padding and the button
7424
+ * alignment, so a panel no longer hand-rolls a `<footer class="foot">` with a
7425
+ * copied flex row. Project the buttons (and any leading content) as children.
7426
+ *
7427
+ * It sits at the panel's bottom edge with `flex: none`, so in the standard
7428
+ * flex-column panel — a scrolling body above it — it stays pinned there with no
7429
+ * `position: sticky` needed; the body scrolls, the footer doesn't.
7430
+ *
7431
+ * `align`:
7432
+ * - `end` (default) — buttons pushed to the trailing edge (the Annuler/Confirmer
7433
+ * pair). Multiple children are separated by the token gap.
7434
+ * - `between` — space between the first and last child: a leading block (e.g. a
7435
+ * running total) at the start, the actions at the end.
7436
+ * - `start` — everything at the leading edge.
7437
+ *
7438
+ * ```html
7439
+ * <fold-panel-footer>
7440
+ * <button foldButton emphasis="outline" intent="neutral" (click)="cancel()">Annuler</button>
7441
+ * <button foldButton (click)="save()">Enregistrer</button>
7442
+ * </fold-panel-footer>
7443
+ *
7444
+ * <!-- a running total on the left, actions on the right -->
7445
+ * <fold-panel-footer align="between">
7446
+ * <span class="total">Total {{ total }}</span>
7447
+ * <button foldButton (click)="checkout()">Commander</button>
7448
+ * </fold-panel-footer>
7449
+ * ```
7450
+ *
7451
+ * @selector `fold-panel-footer`
7452
+ */
7453
+ declare class FoldPanelFooterComponent {
7454
+ /** Button alignment along the bar. @default 'end' */
7455
+ readonly align: _angular_core.InputSignal<"start" | "end" | "between">;
7456
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldPanelFooterComponent, never>;
7457
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldPanelFooterComponent, "fold-panel-footer", never, { "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
7458
+ }
7459
+
5211
7460
  /**
5212
7461
  * Handle to an imperatively-opened panel. The opener gets it back from
5213
7462
  * `FoldPanelHostService.open()`; the panel component gets the same instance via
@@ -5639,6 +7888,395 @@ declare class FoldPaletteRegistry {
5639
7888
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FoldPaletteRegistry>;
5640
7889
  }
5641
7890
 
5642
- export { FOLD_AUTO_PALETTES, FOLD_BLUR_TOKENS, FOLD_BUILTIN_ICONS, FOLD_DATA_TABLE_DEFAULT_LABELS, FOLD_DATA_TABLE_LABELS, FOLD_INLINE_CONFIRM_DEFAULT_LABELS, FOLD_INLINE_CONFIRM_LABELS, FOLD_MOTION_TOKENS, FOLD_PAGINATOR_DEFAULT_LABELS, FOLD_PAGINATOR_LABELS, FOLD_PALETTE_DEFAULT, FOLD_PANEL_CLOSE_LABEL, FOLD_PANEL_DEFAULTS, FOLD_RADIUS_TOKENS, FOLD_SEMANTIC_COLOR_TOKENS, FOLD_SHADOW_TOKENS, FOLD_SPACE_TOKENS, FOLD_TEXT_TOKENS, FOLD_TOAST_CONFIG, FoldAppShellComponent, FoldAsideLayoutComponent, FoldAvatarComponent, FoldAvatarDetailComponent, FoldAvatarListComponent, FoldBadgeComponent, FoldButtonComponent, FoldButtonIconComponent, FoldCalloutComponent, FoldCardComponent, FoldCheckboxComponent, FoldChoiceRowComponent, FoldContextCardComponent, FoldDataTableCellDirective, FoldDataTableComponent, FoldDataTableRowCardDirective, FoldDisclosureComponent, FoldDropdownComponent, FoldDropdownItemComponent, FoldElementTitleComponent, FoldElevatedDirective, FoldEmptyStateComponent, FoldFieldComponent, FoldFieldIdDirective, FoldFieldListComponent, FoldFileDropzoneComponent, FoldHeroCardComponent, FoldHeroSectionComponent, FoldIconComponent, FoldIconRegistry, FoldIdService, FoldInlineConfirmComponent, FoldInputComponent, FoldLinkComponent, FoldListboxComponent, FoldLoadingStateComponent, FoldMenuComponent, FoldMenuItemComponent, FoldMenuSectionComponent, FoldMenuSeparatorComponent, FoldMultiselectComponent, FoldNavLauncherComponent, FoldNavLayoutComponent, FoldNavTileComponent, FoldNumberInputComponent, FoldOptionComponent, FoldPageLayoutComponent, FoldPageSectionComponent, FoldPageTitleDirective, FoldPaginatorComponent, FoldPaletteRegistry, FoldPanelComponentOutletDirective, FoldPanelHeaderComponent, FoldPanelHostComponent, FoldPanelHostService, FoldPanelRef, FoldPanelToggle, FoldPasswordFieldComponent, FoldPopoverComponent, FoldPopoverTriggerDirective, FoldRangeSliderComponent, FoldRepeatPressDirective, FoldSearchComponent, FoldSelectComponent, FoldSliderComponent, FoldSpinnerComponent, FoldStatusBadgeComponent, FoldStickyColumnDirective, FoldSurfaceDirective, FoldTabPanelComponent, FoldTabsComponent, FoldTimelineComponent, FoldToastComponent, FoldToastContainerComponent, FoldToastService, FoldToggleIconComponent, FoldViewNavComponent, FoldViewToggleComponent, autoUpdate, computePlacement, foldBlurVar, foldCardBandChrome, foldColorProperty, foldColorVar, foldDefaultPasswordRules, foldHashSeed, foldMotionVar, foldRadiusVar, foldRegexRule, foldResolvePalette, foldShadowVar, foldSpaceVar, foldTextVar, observeElementWidth, provideFoldDataTableLabels, provideFoldIcons, provideFoldInlineConfirmLabels, provideFoldPaginatorLabels, provideFoldPalette, provideFoldPanelDefaults, provideFoldPanelLabels, provideFoldToasts };
5643
- export type { FoldAutoPaletteName, FoldAvatarListItem, FoldAvatarRing, FoldAvatarRingStyle, FoldAvatarVariant, FoldBadgeVariant, FoldBlurToken, FoldBuiltinIconName, FoldButtonEmphasis, FoldButtonIconShape, FoldButtonIconSize, FoldButtonIconTone, FoldButtonIntent, FoldButtonShape, FoldButtonSize, FoldCalloutAppearance, FoldCalloutVariant, FoldCardBandChrome, FoldCardBandChromeInput, FoldChoiceOption, FoldComponentPanelDescriptor, FoldDataTableLabels, FoldIconName, FoldIconSet, FoldIconSize, FoldIconTone, FoldInlineConfirmLabels, FoldMenuItemBadgeTone, FoldMenuLevel, FoldMenuTint, FoldMenuTogglePlacement, FoldMotionToken, FoldNumberControls, FoldNumberSpinner, FoldPageItem, FoldPaginatorLabels, FoldPaletteInput, FoldPanelConfig, FoldPanelContent, FoldPanelDefaults, FoldPanelDefaultsProvider, FoldPanelDescriptor, FoldPanelHandle, FoldPanelLabels, FoldPanelSide, FoldPanelSize, FoldPanelSurface, FoldPasswordRule, FoldPlacementInput, FoldPlacementResult, FoldPopoverAlign, FoldPopoverPlacement, FoldPopoverSide, FoldRadiusToken, FoldRangeValue, FoldRect, FoldSelectOption, FoldSemanticColorToken, FoldShadowToken, FoldSpaceToken, FoldSpinnerSize, FoldStickyColumnAnchor, FoldSurfaceName, FoldTabItem, FoldTableColumn, FoldTableEmpty, FoldTableSort, FoldTableSortDir, FoldTableTone, FoldTabsContext, FoldTemplatePanelDescriptor, FoldTextToken, FoldTimelineDatePlacement, FoldTimelineNode, FoldToast, FoldToastConfig, FoldToastVariant, FoldViewNavItem, FoldViewToggleOption };
7891
+ /**
7892
+ * What "next" means, and what the period on display is called — the two
7893
+ * questions a calendar toolbar asks. Both depend on the view, so they live
7894
+ * here as pure functions rather than as a switch inside a component.
7895
+ */
7896
+ /** The four readings the family ships. */
7897
+ type FoldCalendarBuiltInView = "month" | "week" | "day" | "list";
7898
+ /**
7899
+ * Which reading is on screen.
7900
+ *
7901
+ * The four built-ins **autocomplete**, but the type is open: an app can put its
7902
+ * own reading (a resource grid, a timeline) in the same switch without the
7903
+ * library having to know about it. Paging and titling an unknown view falls
7904
+ * back to month semantics — see {@link foldShiftDate}.
7905
+ */
7906
+ type FoldCalendarView = FoldCalendarBuiltInView | (string & Record<never, never>);
7907
+ /** A view the toolbar offers, when its name is the app's own. */
7908
+ interface FoldCalendarViewOption {
7909
+ /** What `view` is set to when this one is picked. */
7910
+ readonly value: string;
7911
+ /** What the switch shows. */
7912
+ readonly label: string;
7913
+ }
7914
+ /** An inclusive span of days. */
7915
+ interface FoldCalendarRange {
7916
+ readonly from: FoldCalendarDate;
7917
+ readonly to: FoldCalendarDate;
7918
+ }
7919
+ /**
7920
+ * `date` moved by `delta` periods **in the units the view reads in** — a month
7921
+ * at a time in the month view, a week in the week view, a day in the day view.
7922
+ * The list view follows the month, since that is the window it lists.
7923
+ *
7924
+ * An unrecognised view pages by month, the safest of the four to be wrong
7925
+ * about: it always lands on a real date the other views can also show.
7926
+ */
7927
+ declare function foldShiftDate(view: FoldCalendarView, date: FoldCalendarDate, delta: number, weekStartsOn?: FoldWeekday): FoldCalendarDate;
7928
+ /**
7929
+ * The days `view` covers around `date` — what a caller passes to its data
7930
+ * source, and what the list view scopes itself to.
7931
+ *
7932
+ * The **month** view's range is wider than its month: the grid paints the days
7933
+ * either side of it, and they carry their events too. The **list** view's is
7934
+ * not, because a list has no padding days — an April row in a May list is an
7935
+ * event the reader did not ask for.
7936
+ */
7937
+ declare function foldRangeForView(view: FoldCalendarView, date: FoldCalendarDate, weekStartsOn?: FoldWeekday): FoldCalendarRange;
7938
+ /**
7939
+ * The heading for the period on display, localised through `Intl` — "May 2026",
7940
+ * "18–24 May 2026", "Monday 18 May 2026". A week spanning two months or two
7941
+ * years names both ends, which `Intl`'s range formatter handles per locale.
7942
+ */
7943
+ declare function foldViewTitle(view: FoldCalendarView, date: FoldCalendarDate, locale?: string, weekStartsOn?: FoldWeekday): string;
7944
+
7945
+ /**
7946
+ * `<fold-calendar-toolbar>` — the chrome above a calendar: jump to today, page
7947
+ * back and forward, the period's name, and the view switch.
7948
+ *
7949
+ * It owns no data. Both pieces of state it touches are two-way `model`s, so
7950
+ * the page binds the same `date` and `view` it hands to whichever view is on
7951
+ * screen, and paging keeps working without a single output handler.
7952
+ *
7953
+ * The step matches the reading: a month at a time under the month view, a week
7954
+ * under the week view, a day under the day view — see `foldShiftDate`.
7955
+ *
7956
+ * ## Inputs
7957
+ * | Input | Type | Default | Meaning |
7958
+ * |----------------|--------------------------|---------|---------|
7959
+ * | `date` | `FoldCalendarDate` | — | **Two-way.** The period on display. |
7960
+ * | `view` | `FoldCalendarView` | `'month'` | **Two-way.** Which reading is on screen. |
7961
+ * | `views` | `(FoldCalendarView \| FoldCalendarViewOption)[]` | all four | Which switches to offer; pass fewer to drop one, or `{ value, label }` to add your own. |
7962
+ * | `today` | `FoldCalendarDate` | local clock | Where the "today" button jumps to. |
7963
+ * | `weekStartsOn` | `FoldWeekday` | the locale's | How the week view snaps and names itself. |
7964
+ * | `locale` | `string` | runtime | Drives the title through `Intl`. |
7965
+ * | `labels` | `Partial<FoldCalendarLabels>` | — | Per-instance label overrides. |
7966
+ *
7967
+ * ## Slots & templates
7968
+ * | Selector | Region |
7969
+ * |------------------------|--------|
7970
+ * | `[actions]` | Trailing edge — the page's own buttons ("New event", filters). |
7971
+ * | `ng-template[foldCalendarTitle]` | Replaces the `<h2>` title — reword it, or give it the heading level the page's outline needs. |
7972
+ *
7973
+ * ## Theming
7974
+ * | CSS variable | Default | Sets |
7975
+ * |------------------------------------|---------|------|
7976
+ * | `--fold-calendar-toolbar-step-size`| `28px` | The back/forward buttons. |
7977
+ *
7978
+ * ## Extending
7979
+ * `views` accepts an app's own reading — `[views]="['month', {value: 'rooms', label: 'Rooms'}]"`.
7980
+ * Paging and titling an unrecognised view fall back to month semantics, so a
7981
+ * custom view still lands on real dates.
7982
+ *
7983
+ * ## Accessibility
7984
+ * The title is the toolbar's live heading: it carries `aria-live="polite"`, so
7985
+ * paging announces the period a keyboard user just moved to instead of leaving
7986
+ * the change silent.
7987
+ *
7988
+ * @selector `fold-calendar-toolbar`
7989
+ *
7990
+ * @example
7991
+ * ```html
7992
+ * <fold-calendar-toolbar [(date)]="date" [(view)]="view" [today]="today">
7993
+ * <button actions foldButton (click)="create()">New event</button>
7994
+ * </fold-calendar-toolbar>
7995
+ * ```
7996
+ */
7997
+ declare class FoldCalendarToolbarComponent {
7998
+ /** The period on display. */
7999
+ readonly date: _angular_core.ModelSignal<string>;
8000
+ /** Which reading is on screen. @default 'month' */
8001
+ readonly view: _angular_core.ModelSignal<FoldCalendarView>;
8002
+ /**
8003
+ * Which switches to offer — a built-in name, or `{ value, label }` for a view
8004
+ * the app owns. @default every built-in view
8005
+ */
8006
+ readonly views: _angular_core.InputSignal<readonly (FoldCalendarView | FoldCalendarViewOption)[]>;
8007
+ /** The day the "today" button jumps to; defaults to the local clock. */
8008
+ readonly today: _angular_core.InputSignal<string | undefined>;
8009
+ /** Day the week starts on. @default the locale's own first day */
8010
+ readonly weekStartsOn: _angular_core.InputSignal<FoldWeekday | undefined>;
8011
+ /** Labels and locale — see the directive. */
8012
+ protected readonly chrome: FoldCalendarChromeDirective;
8013
+ /** The anchor in force: the caller's, else the one the locale declares. */
8014
+ private readonly anchor;
8015
+ private readonly projectedTitle;
8016
+ /** The custom title template, when one is projected. */
8017
+ protected readonly titleContent: _angular_core.Signal<_angular_core.TemplateRef<fold_ng.FoldCalendarTitleContext> | null>;
8018
+ /** The period's name — "May 2026", "18–24 May 2026", "Wednesday 20 May 2026". */
8019
+ protected readonly title: _angular_core.Signal<string>;
8020
+ /** The period the title stands for — handed to a projected title template. */
8021
+ protected readonly range: _angular_core.Signal<fold_ng.FoldCalendarRange>;
8022
+ protected readonly options: _angular_core.Signal<readonly FoldViewToggleOption[]>;
8023
+ /** Pages by one period in the units the current view reads in. */
8024
+ protected shift(delta: number): void;
8025
+ protected goToday(): void;
8026
+ /** The switch emits a bare `string`; only a view it actually offers is kept. */
8027
+ protected onViewChange(value: string): void;
8028
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarToolbarComponent, never>;
8029
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarToolbarComponent, "fold-calendar-toolbar", never, { "date": { "alias": "date"; "required": true; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "weekStartsOn": { "alias": "weekStartsOn"; "required": false; "isSignal": true; }; }, { "date": "dateChange"; "view": "viewChange"; }, ["projectedTitle"], ["[actions]"], true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
8030
+ }
8031
+
8032
+ /**
8033
+ * The "what's next" reading: everything still ahead, grouped by the day it
8034
+ * lands on. Pure, so the rule for *what counts as ahead* — and what counts as
8035
+ * needing attention — can be tested without rendering a rail.
8036
+ */
8037
+ /** Which slice of what is ahead the agenda shows. */
8038
+ type FoldCalendarAgendaMode = "todo" | "all";
8039
+ /** Whether an event is asking for something — the `todo` slice's test. */
8040
+ type FoldCalendarActionable<T = unknown> = (event: FoldCalendarEvent<T>) => boolean;
8041
+ /** One day of the agenda, with what falls on it. */
8042
+ interface FoldCalendarAgendaGroup<T = unknown> {
8043
+ readonly date: FoldCalendarDate;
8044
+ /** Events opening on {@link date}, earliest first. */
8045
+ readonly events: readonly FoldCalendarEvent<T>[];
8046
+ }
8047
+ /** How to build the agenda. */
8048
+ interface FoldAgendaOptions<T = unknown> {
8049
+ /** The day "ahead" starts from — anything ending before it is past. */
8050
+ readonly from: FoldCalendarDate;
8051
+ /** `todo` keeps only what asks for attention. @default 'all' */
8052
+ readonly mode?: FoldCalendarAgendaMode;
8053
+ /** Days to return at most, so a long horizon cannot flood a rail. @default 8 */
8054
+ readonly limit?: number;
8055
+ /** What counts as asking for attention. @default foldIsActionable */
8056
+ readonly isActionable?: FoldCalendarActionable<T>;
8057
+ }
8058
+ /** What the agenda produced, and whether it had to stop short. */
8059
+ interface FoldCalendarAgenda<T = unknown> {
8060
+ /** The days shown, earliest first. */
8061
+ readonly groups: readonly FoldCalendarAgendaGroup<T>[];
8062
+ /**
8063
+ * Days that exist beyond `limit`. Non-zero means "there is more", which is a
8064
+ * different thing to say than "there is nothing" — and the two used to render
8065
+ * identically.
8066
+ */
8067
+ readonly truncated: number;
8068
+ }
8069
+ /**
8070
+ * Whether an event is asking for something.
8071
+ *
8072
+ * `warning` and `alert` are the two tones that mean "attention" in this
8073
+ * system, so they are what `todo` keeps — the agenda reads the same semantic
8074
+ * scale the chips paint with, rather than inventing a second one. Pass
8075
+ * `isActionable` to define it otherwise.
8076
+ */
8077
+ declare function foldIsActionable<T>(event: FoldCalendarEvent<T>): boolean;
8078
+ /**
8079
+ * Events still ahead of `from`, grouped by day and capped to `limit` days.
8080
+ *
8081
+ * An event already running is grouped under `from` rather than its real start:
8082
+ * a three-week absence that began last Monday belongs at the top of "what's
8083
+ * next", not buried in a past day the rail never shows.
8084
+ */
8085
+ declare function foldBuildAgenda<T>(events: readonly FoldCalendarEvent<T>[], options: FoldAgendaOptions<T>): FoldCalendarAgenda<T>;
8086
+ /**
8087
+ * How many events are asking for attention from `from` on — the rail's badge.
8088
+ *
8089
+ * Takes the same `isActionable` the agenda does, so a badge can never disagree
8090
+ * with the list under it.
8091
+ */
8092
+ declare function foldCountActionable<T>(events: readonly FoldCalendarEvent<T>[], from: FoldCalendarDate, isActionable?: FoldCalendarActionable<T>): number;
8093
+
8094
+ /**
8095
+ * `<fold-calendar-agenda>` — a rail of what is still ahead, grouped by day.
8096
+ *
8097
+ * The counterpart to the grids: they answer "what does this month look like",
8098
+ * this answers "what do I do next". It carries a **`todo` slice** that keeps
8099
+ * only the events asking for attention (the `warning` and `alert` tones — the
8100
+ * same scale the chips paint with), so the rail doubles as a work queue with a
8101
+ * count.
8102
+ *
8103
+ * ## Inputs
8104
+ * | Input | Type | Default | Meaning |
8105
+ * |-------------|--------------------------|---------|---------|
8106
+ * | `from` | `FoldCalendarDate` | — | Where "ahead" starts; anything ending before it is past. |
8107
+ * | `events` | `FoldCalendarEvent<T>[]` | `[]` | Source events. |
8108
+ * | `mode` | `'todo' \| 'all'` | `'todo'` | **Two-way.** Which slice is shown. |
8109
+ * | `collapsed` | `boolean` | `false` | **Two-way.** Collapsed to a spine — persist it if you want it to stick. |
8110
+ * | `limit` | `number` | `8` | Days to show at most; what it cuts off is announced, not swallowed. |
8111
+ * | `isActionable` | `(event) => boolean` | tones | What the `todo` slice and the badge both count. |
8112
+ * | `locale` | `string` | runtime | Drives the day names through `Intl`. |
8113
+ * | `labels` | `Partial<FoldCalendarLabels>` | — | Per-instance label overrides. |
8114
+ *
8115
+ * ## Outputs
8116
+ * | Output | Payload | Fires on |
8117
+ * |--------------|------------------------|----------|
8118
+ * | `dayClick` | `FoldCalendarDate` | A day heading activated. |
8119
+ * | `eventClick` | `FoldCalendarEvent<T>` | A row activated. |
8120
+ *
8121
+ * ## Templates
8122
+ * | Directive | Replaces |
8123
+ * |-----------------------|----------|
8124
+ * | `foldCalendarEvent` | The inside of a row. |
8125
+ * | `foldCalendarHeading` | The day heading — where a per-day count or action goes. |
8126
+ *
8127
+ * ## Theming
8128
+ * | CSS variable | Default | Sets |
8129
+ * |-----------------------------------------|---------|------|
8130
+ * | `--fold-calendar-agenda-width` | `320px` | Width of the expanded rail. |
8131
+ * | `--fold-calendar-agenda-height` | `100%` | Height — match a grid beside it, or pin it. |
8132
+ * | `--fold-calendar-agenda-spine-width` | `44px` | Width once collapsed. |
8133
+ * | `--fold-calendar-agenda-badge-size` | `20px` | The count badge. |
8134
+ * | `--fold-calendar-agenda-control-size` | `26px` | The collapse control. |
8135
+ *
8136
+ * A day within the next week is named relatively — "Today", "Tomorrow", then
8137
+ * its weekday — because that reads faster than a date at this distance.
8138
+ *
8139
+ * @selector `fold-calendar-agenda`
8140
+ *
8141
+ * @example
8142
+ * ```html
8143
+ * <fold-calendar-agenda
8144
+ * [from]="today"
8145
+ * [events]="events()"
8146
+ * [(mode)]="agendaMode"
8147
+ * [(collapsed)]="agendaCollapsed"
8148
+ * (eventClick)="open($event)"
8149
+ * />
8150
+ * ```
8151
+ */
8152
+ declare class FoldCalendarAgendaComponent<T = unknown> {
8153
+ /** The day "ahead" starts from. */
8154
+ readonly from: _angular_core.InputSignal<string>;
8155
+ /** Source events. */
8156
+ readonly events: _angular_core.InputSignal<readonly FoldCalendarEvent<T>[]>;
8157
+ /** Which slice is shown. @default 'todo' */
8158
+ readonly mode: _angular_core.ModelSignal<FoldCalendarAgendaMode>;
8159
+ /** Collapsed to a spine. @default false */
8160
+ readonly collapsed: _angular_core.ModelSignal<boolean>;
8161
+ /** Days to show at most. @default 8 */
8162
+ readonly limit: _angular_core.InputSignalWithTransform<number, unknown>;
8163
+ /**
8164
+ * What counts as asking for attention — the `todo` slice **and** the badge,
8165
+ * from one definition, so the two can never disagree.
8166
+ * @default the `warning` and `alert` tones
8167
+ */
8168
+ readonly isActionable: _angular_core.InputSignal<FoldCalendarActionable<T>>;
8169
+ /** A day heading was activated. */
8170
+ readonly dayClick: _angular_core.OutputEmitterRef<string>;
8171
+ /** A row was activated. */
8172
+ readonly eventClick: _angular_core.OutputEmitterRef<FoldCalendarEvent<T>>;
8173
+ /** Labels, locale and the projected chip template — see the directive. */
8174
+ protected readonly chrome: FoldCalendarChromeDirective;
8175
+ private readonly projectedHeading;
8176
+ /** The custom day-heading template, when one is projected. */
8177
+ protected readonly headingContent: _angular_core.Signal<_angular_core.TemplateRef<fold_ng.FoldCalendarHeadingContext<any>> | null>;
8178
+ private readonly agenda;
8179
+ protected readonly groups: _angular_core.Signal<readonly FoldCalendarAgendaGroup<T>[]>;
8180
+ /** Days `limit` cut off — "there is more" is not the same as "there is none". */
8181
+ protected readonly truncated: _angular_core.Signal<number>;
8182
+ /** How much is asking for attention — the rail's badge, in either mode. */
8183
+ protected readonly todoCount: _angular_core.Signal<number>;
8184
+ /** The rail's own name, and the one the collapsed spine repeats. */
8185
+ protected readonly title: _angular_core.Signal<string>;
8186
+ protected readonly emptyMessage: _angular_core.Signal<string>;
8187
+ /** Day of the month, for the rail's number. */
8188
+ protected dayNumber(group: FoldCalendarAgendaGroup<T>): string;
8189
+ /**
8190
+ * "Today", "Tomorrow", then the weekday for the rest of the week — a name
8191
+ * beats a date while the day is still near.
8192
+ */
8193
+ protected relativeName(group: FoldCalendarAgendaGroup<T>): string;
8194
+ /** The month, shown only once the weekday alone stops being enough. */
8195
+ protected monthName(group: FoldCalendarAgendaGroup<T>): string;
8196
+ protected toggleMode(mode: FoldCalendarAgendaMode): void;
8197
+ protected toggleCollapsed(): void;
8198
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarAgendaComponent<any>, never>;
8199
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarAgendaComponent<any>, "fold-calendar-agenda", never, { "from": { "alias": "from"; "required": true; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "isActionable": { "alias": "isActionable"; "required": false; "isSignal": true; }; }, { "mode": "modeChange"; "collapsed": "collapsedChange"; "dayClick": "dayClick"; "eventClick": "eventClick"; }, ["projectedHeading"], never, true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
8200
+ }
8201
+
8202
+ /** A source, with what it currently contributes and whether it is showing. */
8203
+ interface SourceChip {
8204
+ readonly source: FoldCalendarSource;
8205
+ readonly count: number;
8206
+ readonly shown: boolean;
8207
+ }
8208
+ /**
8209
+ * `<fold-calendar-source-filter>` — the chips that switch each feed of a
8210
+ * merged calendar on and off.
8211
+ *
8212
+ * A calendar usually shows several feeds at once (a programme, staff leave,
8213
+ * contracts). This owns the **selection** only: it counts what each feed
8214
+ * contributes and toggles it, and the caller runs `foldFilterBySource()` over
8215
+ * its own events. Keeping the two apart means the chips never need to know how
8216
+ * the events are fetched, and the filtering stays a pure function.
8217
+ *
8218
+ * ## Inputs
8219
+ * | Input | Type | Default | Meaning |
8220
+ * |-----------|--------------------------|---------|---------|
8221
+ * | `sources` | `FoldCalendarSource[]` | `[]` | The feeds to offer. |
8222
+ * | `events` | `FoldCalendarEvent[]` | `[]` | Counted per feed — pass the window on screen for live counts. |
8223
+ * | `active` | `ReadonlySet<string> \| null` | `null` | **Two-way.** The keys currently shown; `null` means "all". |
8224
+ * | `labels` | `Partial<FoldCalendarLabels>` | — | Per-instance label overrides. |
8225
+ *
8226
+ * ## Outputs
8227
+ * | Output | Payload | Fires on |
8228
+ * |-------------------|-----------------------|----------|
8229
+ * | `selectionChange` | `ReadonlySet<string>` | A chip toggled — never `null`. |
8230
+ *
8231
+ * `null` and an empty `Set` mean opposite things — "nothing switched off yet"
8232
+ * versus "every feed switched off" — which is why they are not collapsed.
8233
+ * `foldFilterBySource()` takes either.
8234
+ *
8235
+ * ## Accessibility
8236
+ * Each chip is a **toggle**, so it carries `aria-pressed` in both states, and
8237
+ * its accessible name says which feed and whether it is showing — the tick and
8238
+ * the dot are colour, which cannot be the only carrier.
8239
+ *
8240
+ * @selector `fold-calendar-source-filter`
8241
+ *
8242
+ * @example
8243
+ * ```html
8244
+ * <fold-calendar-source-filter
8245
+ * [sources]="sources"
8246
+ * [events]="events()"
8247
+ * [(active)]="activeSources"
8248
+ * />
8249
+ * <fold-calendar-month [events]="visibleEvents()" [(month)]="month" />
8250
+ * ```
8251
+ */
8252
+ declare class FoldCalendarSourceFilterComponent {
8253
+ /** The feeds to offer. */
8254
+ readonly sources: _angular_core.InputSignal<readonly FoldCalendarSource[]>;
8255
+ /** Events to count per feed; pass the window on screen for live counts. */
8256
+ readonly events: _angular_core.InputSignal<readonly FoldCalendarEvent<unknown>[]>;
8257
+ /**
8258
+ * The keys currently shown. Left unset every feed shows, so the filter is
8259
+ * useful before the caller has any selection state of its own.
8260
+ */
8261
+ readonly active: _angular_core.ModelSignal<ReadonlySet<string> | null>;
8262
+ /**
8263
+ * The selection after a chip was toggled — **never `null`**, unlike `active`,
8264
+ * whose unset state exists only as a starting value. Handle this one and you
8265
+ * never have to eliminate a case that cannot happen.
8266
+ */
8267
+ readonly selectionChange: _angular_core.OutputEmitterRef<ReadonlySet<string>>;
8268
+ /** Labels and locale — see the directive. */
8269
+ protected readonly chrome: FoldCalendarChromeDirective;
8270
+ /** The effective selection — every key while `active` is unset. */
8271
+ private readonly shownKeys;
8272
+ protected readonly chips: _angular_core.Signal<readonly SourceChip[]>;
8273
+ protected chipLabel(chip: SourceChip): string;
8274
+ /** Writes the next selection rather than mutating the set in place. */
8275
+ protected toggle(chip: SourceChip): void;
8276
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCalendarSourceFilterComponent, never>;
8277
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCalendarSourceFilterComponent, "fold-calendar-source-filter", never, { "sources": { "alias": "sources"; "required": false; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "selectionChange": "selectionChange"; }, never, never, true, [{ directive: typeof FoldCalendarChromeDirective; inputs: { "locale": "locale"; "labels": "labels"; "formats": "formats"; }; outputs: {}; }]>;
8278
+ }
8279
+
8280
+ export { FOLD_AUTO_PALETTES, FOLD_BLUR_TOKENS, FOLD_BUILTIN_ICONS, FOLD_BUILTIN_ICON_CATEGORIES, FOLD_CALENDAR_DEFAULT_LABELS, FOLD_CALENDAR_FORMATS, FOLD_CALENDAR_LABELS, FOLD_DATA_TABLE_DEFAULT_LABELS, FOLD_DATA_TABLE_LABELS, FOLD_DEFAULT_WEEKEND_DAYS, FOLD_FALLBACK_WEEK_INFO, FOLD_INLINE_CONFIRM_DEFAULT_LABELS, FOLD_INLINE_CONFIRM_LABELS, FOLD_MINUTES_PER_DAY, FOLD_MOTION_TOKENS, FOLD_PAGINATOR_DEFAULT_LABELS, FOLD_PAGINATOR_LABELS, FOLD_PALETTE_DEFAULT, FOLD_PANEL_CLOSE_LABEL, FOLD_PANEL_DEFAULTS, FOLD_RADIUS_TOKENS, FOLD_SEMANTIC_COLOR_TOKENS, FOLD_SHADOW_TOKENS, FOLD_SPACE_TOKENS, FOLD_TEXT_TOKENS, FOLD_TOAST_CONFIG, FoldAppShellComponent, FoldAsideLayoutComponent, FoldAvatarComponent, FoldAvatarDetailComponent, FoldAvatarListComponent, FoldBackLinkComponent, FoldBadgeComponent, FoldBreadcrumbComponent, FoldButtonComponent, FoldButtonIconComponent, FoldCalendarAgendaComponent, FoldCalendarChromeDirective, FoldCalendarDayComponent, FoldCalendarDayDirective, FoldCalendarEventDirective, FoldCalendarHeadingDirective, FoldCalendarListComponent, FoldCalendarMonthComponent, FoldCalendarOverflowDirective, FoldCalendarSourceFilterComponent, FoldCalendarTimegridComponent, FoldCalendarTitleDirective, FoldCalendarToolbarComponent, FoldCalendarWeekComponent, FoldCalloutComponent, FoldCardComponent, FoldCheckboxComponent, FoldChoiceRowComponent, FoldContextCardComponent, FoldDangerZoneComponent, FoldDataTableCellDirective, FoldDataTableComponent, FoldDataTableRowCardDirective, FoldDateComponent, FoldDisclosureComponent, FoldDropdownComponent, FoldDropdownItemComponent, FoldElementTitleComponent, FoldElevatedDirective, FoldEmptyStateComponent, FoldFieldComponent, FoldFieldIdDirective, FoldFieldListComponent, FoldFileDropzoneComponent, FoldHeroCardComponent, FoldHeroSectionComponent, FoldIconComponent, FoldIconRegistry, FoldIdService, FoldInlineConfirmComponent, FoldInputComponent, FoldLinkComponent, FoldListboxComponent, FoldLoadingStateComponent, FoldMenuComponent, FoldMenuItemComponent, FoldMenuSectionComponent, FoldMenuSeparatorComponent, FoldMultiselectComponent, FoldNavLauncherComponent, FoldNavLayoutComponent, FoldNavTileComponent, FoldNumberInputComponent, FoldOptgroupComponent, FoldOptionComponent, FoldPageLayoutComponent, FoldPageSectionComponent, FoldPageTitleDirective, FoldPaginatorComponent, FoldPaletteRegistry, FoldPanelComponentOutletDirective, FoldPanelFooterComponent, FoldPanelHeaderComponent, FoldPanelHostComponent, FoldPanelHostService, FoldPanelRef, FoldPanelToggle, FoldPasswordFieldComponent, FoldPopoverComponent, FoldPopoverTriggerDirective, FoldRangeSliderComponent, FoldRepeatPressDirective, FoldScrollRegionDirective, FoldSearchComponent, FoldSelectComponent, FoldSliderComponent, FoldSpinnerComponent, FoldStatusBadgeComponent, FoldStickyColumnDirective, FoldSurfaceDirective, FoldTabPanelComponent, FoldTabsComponent, FoldTextareaComponent, FoldTimeComponent, FoldTimelineComponent, FoldToastComponent, FoldToastContainerComponent, FoldToastService, FoldToggleIconComponent, FoldViewNavComponent, FoldViewToggleComponent, ScrollRegionRegistry, autoUpdate, computePlacement, foldAddDays, foldAddMinutes, foldAddMonths, foldBlurVar, foldBuildAgenda, foldBuildDay, foldBuildMonthGrid, foldBuildTimeGrid, foldBuildWeek, foldCalendarNextFocus, foldCardBandChrome, foldColorProperty, foldColorVar, foldCountActionable, foldDaysBetween, foldDefaultPasswordRules, foldEndOfMonth, foldEventsInRange, foldEventsOnDay, foldFilterBySource, foldFromMinutes, foldFromNativeDate, foldFromTemporal, foldHashSeed, foldIsActionable, foldIsCalendarDate, foldIsCalendarTime, foldIsTimed, foldIsWeekend, foldIsoWeek, foldIsoWeekYear, foldLayOutOverlaps, foldLocaleWeekInfo, foldMotionVar, foldRadiusVar, foldRangeForView, foldRegexRule, foldResolvePalette, foldShadowVar, foldShiftDate, foldSpaceVar, foldStartOfMonth, foldStartOfWeek, foldTextVar, foldToMinutes, foldToNativeDate, foldToday, foldViewTitle, foldWeekdayIndex, foldWeekdayOf, isFoldSelectOptionGroup, observeElementWidth, provideFoldCalendarLabels, provideFoldDataTableLabels, provideFoldIcons, provideFoldInlineConfirmLabels, provideFoldPaginatorLabels, provideFoldPalette, provideFoldPanelDefaults, provideFoldPanelLabels, provideFoldToasts };
8281
+ export type { FoldAgendaOptions, FoldAutoPaletteName, FoldAvatarListItem, FoldAvatarRing, FoldAvatarRingStyle, FoldAvatarVariant, FoldBadgeVariant, FoldBlurToken, FoldBreadcrumbItem, FoldBuiltinIconName, FoldButtonEmphasis, FoldButtonIconShape, FoldButtonIconSize, FoldButtonIconTone, FoldButtonIntent, FoldButtonShape, FoldButtonSize, FoldCalendarActionable, FoldCalendarAgenda, FoldCalendarAgendaGroup, FoldCalendarAgendaMode, FoldCalendarBand, FoldCalendarBlock, FoldCalendarBuiltInView, FoldCalendarDate, FoldCalendarDay, FoldCalendarDayContext, FoldCalendarDayEvents, FoldCalendarDayModifiers, FoldCalendarEvent, FoldCalendarEventContext, FoldCalendarFormat, FoldCalendarHalfDay, FoldCalendarHeadingContext, FoldCalendarLabels, FoldCalendarOverflowContext, FoldCalendarRange, FoldCalendarSource, FoldCalendarTime, FoldCalendarTitleContext, FoldCalendarTone, FoldCalendarView, FoldCalendarViewOption, FoldCalendarWeek, FoldCalloutAppearance, FoldCalloutVariant, FoldCardBandChrome, FoldCardBandChromeInput, FoldChoiceOption, FoldComponentPanelDescriptor, FoldDataTableLabels, FoldDateType, FoldDayColumnsOptions, FoldIconCategoryId, FoldIconName, FoldIconSet, FoldIconSize, FoldIconTone, FoldInlineConfirmLabels, FoldIsoDateLike, FoldMenuItemBadgeTone, FoldMenuLevel, FoldMenuTint, FoldMenuTogglePlacement, FoldMonthGridOptions, FoldMotionToken, FoldNumberControls, FoldNumberSpinner, FoldOverlapInput, FoldOverlapSlot, FoldPageItem, FoldPaginatorLabels, FoldPaletteInput, FoldPanelConfig, FoldPanelContent, FoldPanelDefaults, FoldPanelDefaultsProvider, FoldPanelDescriptor, FoldPanelHandle, FoldPanelLabels, FoldPanelSide, FoldPanelSize, FoldPanelSurface, FoldPasswordRule, FoldPlacementInput, FoldPlacementResult, FoldPopoverAlign, FoldPopoverPlacement, FoldPopoverSide, FoldRadiusToken, FoldRangeValue, FoldRect, FoldScrollAxis, FoldSelectItem, FoldSelectOption, FoldSelectOptionGroup, FoldSemanticColorToken, FoldShadowToken, FoldSpaceToken, FoldSpinnerSize, FoldStickyColumnAnchor, FoldSurfaceName, FoldTabItem, FoldTableColumn, FoldTableEmpty, FoldTableSort, FoldTableSortDir, FoldTableTone, FoldTabsContext, FoldTemplatePanelDescriptor, FoldTextToken, FoldTimeGrid, FoldTimeGridColumn, FoldTimeGridOptions, FoldTimelineDatePlacement, FoldTimelineNode, FoldToast, FoldToastConfig, FoldToastVariant, FoldViewNavItem, FoldViewToggleOption, FoldWeekInfo, FoldWeekday };
5644
8282
  //# sourceMappingURL=fold-ng.d.ts.map