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.
- package/CHANGELOG.md +552 -1
- package/README.md +103 -4
- package/devtools/package.json +4 -0
- package/fesm2022/fold-ng-src-devtools.mjs +218 -0
- package/fesm2022/fold-ng-src-devtools.mjs.map +1 -0
- package/fesm2022/fold-ng.mjs +3988 -208
- package/fesm2022/fold-ng.mjs.map +1 -1
- package/llms.txt +14 -3
- package/package.json +12 -2
- package/tmp-esm2022/tsconfig.lib.tsbuildinfo +1 -0
- package/tokens/semantic.css +57 -0
- package/types/fold-ng-src-devtools.d.ts +86 -0
- package/types/fold-ng-src-devtools.d.ts.map +1 -0
- package/types/fold-ng.d.ts +2949 -311
- package/types/fold-ng.d.ts.map +1 -1
package/types/fold-ng.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { InjectionToken, Provider, TemplateRef, ElementRef, Signal, Type, Injector,
|
|
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)
|
|
65
|
-
* | `
|
|
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
|
-
* - `"
|
|
149
|
-
* (
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
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
|
|
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; }; "
|
|
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<"
|
|
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
|
-
*
|
|
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
|
-
*
|
|
2116
|
-
*
|
|
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
|
-
*
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
2126
|
-
*
|
|
2127
|
-
*
|
|
2128
|
-
*
|
|
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
|
-
*
|
|
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
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
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
|
-
*
|
|
2377
|
+
* A `Temporal` value read as the plain date it starts with.
|
|
2159
2378
|
*
|
|
2160
|
-
*
|
|
2161
|
-
*
|
|
2162
|
-
* `
|
|
2163
|
-
*
|
|
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
|
-
*
|
|
2168
|
-
*
|
|
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
|
|
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
|
-
*
|
|
2192
|
-
*
|
|
2193
|
-
*
|
|
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
|
|
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
|
-
*
|
|
2219
|
-
*
|
|
2220
|
-
*
|
|
2221
|
-
*
|
|
2222
|
-
*
|
|
2223
|
-
*
|
|
2224
|
-
*
|
|
2225
|
-
* `
|
|
2226
|
-
*
|
|
2227
|
-
*
|
|
2228
|
-
*
|
|
2229
|
-
*
|
|
2230
|
-
*
|
|
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
|
-
*
|
|
2233
|
-
*
|
|
2234
|
-
*
|
|
2235
|
-
*
|
|
2236
|
-
*
|
|
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
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
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
|
-
*
|
|
2252
|
-
*
|
|
2253
|
-
*
|
|
2254
|
-
*
|
|
2255
|
-
*
|
|
2256
|
-
*
|
|
2257
|
-
*
|
|
2258
|
-
*
|
|
2259
|
-
*
|
|
2260
|
-
*
|
|
2261
|
-
*
|
|
2262
|
-
*
|
|
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
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
2287
|
-
*
|
|
2288
|
-
*
|
|
2289
|
-
*
|
|
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
|
-
|
|
2293
|
-
/**
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
2310
|
-
*
|
|
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
|
-
*
|
|
2602
|
+
* Internal — a view exposes it, it is never applied by hand.
|
|
2313
2603
|
*
|
|
2314
2604
|
* @example
|
|
2315
|
-
* ```
|
|
2316
|
-
*
|
|
2317
|
-
*
|
|
2318
|
-
*
|
|
2319
|
-
*
|
|
2320
|
-
*
|
|
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
|
|
2324
|
-
/**
|
|
2325
|
-
readonly
|
|
2326
|
-
/**
|
|
2327
|
-
readonly
|
|
2328
|
-
/**
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
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-
|
|
4644
|
+
* @selector `fold-time`
|
|
2594
4645
|
*
|
|
2595
4646
|
* @example
|
|
2596
4647
|
* ```html
|
|
2597
|
-
* <!-- Signal-forms
|
|
2598
|
-
* <fold-
|
|
4648
|
+
* <!-- Signal-forms bound -->
|
|
4649
|
+
* <fold-time label="Heure de retrait" [formField]="form.time" />
|
|
2599
4650
|
*
|
|
2600
|
-
* <!-- Standalone two-way -->
|
|
2601
|
-
* <fold-
|
|
4651
|
+
* <!-- Standalone two-way, whole-minute steps -->
|
|
4652
|
+
* <fold-time [step]="60" [(value)]="pickupTime" />
|
|
2602
4653
|
* ```
|
|
2603
4654
|
*/
|
|
2604
|
-
declare class
|
|
2605
|
-
/** The bound value —
|
|
2606
|
-
*
|
|
2607
|
-
readonly value: _angular_core.ModelSignal<
|
|
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
|
|
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
|
|
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
|
|
4685
|
+
/** Optional helper text shown under the control. */
|
|
2630
4686
|
readonly hint: _angular_core.InputSignal<string | undefined>;
|
|
2631
|
-
/**
|
|
2632
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
4698
|
+
/** Mark the field touched on blur, so errors can surface. */
|
|
2692
4699
|
protected onBlur(): void;
|
|
2693
|
-
|
|
2694
|
-
|
|
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).
|
|
2961
|
-
|
|
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.
|
|
3087
|
-
*
|
|
3088
|
-
|
|
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" | "
|
|
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
|
-
/**
|
|
4896
|
-
|
|
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?:
|
|
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
|
-
|
|
5643
|
-
|
|
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
|