fold-ng 0.3.0 → 0.4.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/llms.txt CHANGED
@@ -19,7 +19,7 @@ with a `@selector` and an `@example`.
19
19
 
20
20
  - [Install & quickstart](https://github.com/hugoheynard/fold-ng#readme): `npm install fold-ng`, import tokens, use standalone components.
21
21
  - [Design tokens](https://github.com/hugoheynard/fold-ng#the-two-tier-model): two-tier model — primitives (`--fold-ref-*`) → semantic (`--fold-color-*`); components consume the semantic layer only.
22
- - [Theming](https://github.com/hugoheynard/fold-ng#consuming-the-tokens): `data-theme="umbra|lumen|bubbly|navi"`; re-theme by re-pointing the semantic layer, never touching a component.
22
+ - [Theming](https://github.com/hugoheynard/fold-ng#consuming-the-tokens): `data-theme="umbra|lumen|bubbly|navi|titan"`; re-theme by re-pointing the semantic layer, never touching a component.
23
23
 
24
24
  ## Components
25
25
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fold-ng",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Accessible, dark-first Angular 22 UI component library & design system — signals-first, standalone, zoneless, SSR-ready. Design tokens + WCAG-minded components, themeable to the bone.",
5
5
  "keywords": [
6
6
  "angular",
@@ -108,6 +108,25 @@
108
108
  --fold-ref-grape-600: #9333ea; /* hover / strong */
109
109
  --fold-ref-grape-700: #7e22ce; /* readable brand text */
110
110
 
111
+ /* ── Steel / Titanium — the TITAN theme families ──────────────
112
+ Brushed titanium, light: a cool near-neutral steel ramp for the
113
+ brushed silver page, the header + rails at its own tint, and the
114
+ bright polished cards that float on it — plus a HEAT-anodized
115
+ titanium brand, the copper-orange the metal takes when torched. */
116
+ --fold-ref-steel-900: #1b1f24; /* graphite body text */
117
+ --fold-ref-steel-600: #566069; /* secondary text */
118
+ --fold-ref-steel-500: #7c8894; /* muted text */
119
+ --fold-ref-steel-400: #9aa6b1; /* faded text */
120
+ --fold-ref-steel-300: #c0c8d0; /* solid brushed-steel border */
121
+ --fold-ref-steel-200: #d4dae1; /* brushed page ground */
122
+ --fold-ref-steel-150: #e2e7ec; /* header · rail 2 · hover · divider */
123
+ --fold-ref-steel-100: #eef1f5; /* raised rail plate · sunken */
124
+ --fold-ref-steel-50: #f8fafc; /* bright polished card */
125
+
126
+ --fold-ref-titanium-700: #863810; /* brand text (burnt copper) */
127
+ --fold-ref-titanium-600: #a5451a; /* hover / strong */
128
+ --fold-ref-titanium-500: #c2521b; /* brand base (copper-orange · AA w/ white) */
129
+
111
130
  /* ── Pure black — pairs with white for neutral alpha overlays */
112
131
  --fold-ref-black: #000000;
113
132
  }
package/tokens/scales.css CHANGED
@@ -112,3 +112,14 @@
112
112
  --fold-radius-md: 16px;
113
113
  --fold-radius-lg: 24px;
114
114
  }
115
+
116
+ /* ── Theme shape override: TITAN ──────────────────────────────
117
+ Softened, iPhone-premium: corners rounded a step past the base so a
118
+ polished-steel card reads like a device, not a slab — but short of
119
+ bubbly's pill. `pill` and `round` stay: shapes, not scale steps. */
120
+ [data-theme="titan"] {
121
+ --fold-radius-xs: 5px;
122
+ --fold-radius-sm: 10px;
123
+ --fold-radius-md: 14px;
124
+ --fold-radius-lg: 20px;
125
+ }
@@ -186,6 +186,99 @@
186
186
  color: var(--fold-color-text);
187
187
  }
188
188
 
189
+ /* ── Accent surface — an auto-inverting region ────────────────────────────────
190
+ `[data-surface="accent"]` (stamped by fold-card's `surface="accent"`, or the
191
+ `foldSurface` directive) fills with the brand accent and re-points its whole
192
+ content sub-tree to an on-accent palette — text, borders, band gradation and
193
+ even nested buttons / links / icon-tiles read on the accent, with no
194
+ per-component code.
195
+
196
+ The move that makes this both theme-agnostic AND able to *swap* the brand pair
197
+ (`primary` ↔ `on-primary`, needed for a solid button or a filled icon tile)
198
+ without a CSS custom-property cycle: the accent + its ink are CAPTURED on the
199
+ surface element (where the tokens still hold their normal values), then the
200
+ inverted role-set is applied to DESCENDANTS from those captures — so a role can
201
+ reference the pre-inversion value it is replacing. Every value is a `color-mix`
202
+ of the captured pair, so it holds on every theme, and the surface and band
203
+ steps stay a lighter shade of the accent (gradation kept in-hue).
204
+
205
+ A theme that needs to diverge overrides any role by nesting a rule for its own
206
+ `[data-theme=…]` under `[data-surface="accent"]` — the same seam as chrome. */
207
+ [data-surface="accent"] {
208
+ color: var(--fold-color-on-primary);
209
+ --_accent-ink: var(--fold-color-on-primary);
210
+ --_accent-fill: var(--fold-color-primary);
211
+ }
212
+ [data-surface="accent"] * {
213
+ /* text ramp → the light ink. COMPRESSED vs a normal surface: an accent ground
214
+ has little contrast headroom (a mid-bright accent caps white text near 3:1),
215
+ so the accent card is an emphasis surface — its text clears AA-large (3:1),
216
+ asserted by accent-contrast.spec.ts, and secondary/muted keep more ink than
217
+ they would on the page. A light accent that still reads thin overrides the
218
+ ramp per theme (surfaces.md). */
219
+ --fold-color-text: var(--_accent-ink);
220
+ --fold-color-text-secondary: color-mix(
221
+ in srgb,
222
+ var(--_accent-ink) 96%,
223
+ transparent
224
+ );
225
+ --fold-color-text-muted: color-mix(
226
+ in srgb,
227
+ var(--_accent-ink) 74%,
228
+ transparent
229
+ );
230
+ --fold-color-text-faded: color-mix(
231
+ in srgb,
232
+ var(--_accent-ink) 58%,
233
+ transparent
234
+ );
235
+ /* borders + separators → thin ink lines */
236
+ --fold-color-border: color-mix(in srgb, var(--_accent-ink) 24%, transparent);
237
+ --fold-color-border-subtle: color-mix(
238
+ in srgb,
239
+ var(--_accent-ink) 15%,
240
+ transparent
241
+ );
242
+ /* nested surfaces + raised tiles/bands → a lighter step of the ACCENT itself */
243
+ --fold-color-surface-card: color-mix(
244
+ in srgb,
245
+ var(--_accent-ink) 12%,
246
+ var(--_accent-fill)
247
+ );
248
+ --fold-color-surface-raised: color-mix(
249
+ in srgb,
250
+ var(--_accent-ink) 16%,
251
+ var(--_accent-fill)
252
+ );
253
+ --fold-color-surface-hover: color-mix(
254
+ in srgb,
255
+ var(--_accent-ink) 18%,
256
+ var(--_accent-fill)
257
+ );
258
+ --fold-color-surface-sunken: color-mix(
259
+ in srgb,
260
+ var(--_accent-ink) 8%,
261
+ var(--_accent-fill)
262
+ );
263
+ /* the brand pair, SWAPPED from the captures (no cycle): the fill becomes the
264
+ light ink (link text, glass button, chip ground) and its on-colour becomes
265
+ the accent — so a filled icon tile or solid button reads accent-on-light. */
266
+ --fold-color-primary: var(--_accent-ink);
267
+ --fold-color-on-primary: var(--_accent-fill);
268
+ --fold-color-primary-text: var(--_accent-ink);
269
+ --fold-color-primary-strong: var(--_accent-ink);
270
+ --fold-color-primary-surface: color-mix(
271
+ in srgb,
272
+ var(--_accent-ink) 16%,
273
+ transparent
274
+ );
275
+ --fold-color-primary-border: color-mix(
276
+ in srgb,
277
+ var(--_accent-ink) 32%,
278
+ transparent
279
+ );
280
+ }
281
+
189
282
  /* ── Elevated surfaces ────────────────────────────────────────
190
283
  A `[data-elevated]` (stamped by the `[foldElevated]` directive) is a raised
191
284
  card: radius + shadow, riding on the element's own background so its colour
@@ -702,3 +795,148 @@
702
795
  transparent
703
796
  );
704
797
  }
798
+
799
+ /* ── Extra theme: TITAN ───────────────────────────────────────
800
+ Brushed titanium, light + warm. A cool brushed-steel ground — the
801
+ header + rails sit at the page's own tint, so the top reads frameless
802
+ — with bright polished cards that float off it on the shared elevation
803
+ shadow (that lift is the "raised metal piece", no per-theme shadow
804
+ needed). The brand is HEAT-anodized titanium: the copper-orange the
805
+ metal takes when torched, warming the whole steel read. Content borders
806
+ re-point to a SOLID steel primitive (a palpable machined seam, where
807
+ the light themes use an alpha hairline); corners soften in scales.css.
808
+ Status families hold at the lumen (light) tints — only ground + brand
809
+ move. Uniform-polarity, so no chrome override is needed. */
810
+ [data-theme="titan"] {
811
+ /* Surfaces — header + rails at the page's own tint (a frameless top) */
812
+ --fold-color-bg-page: var(--fold-ref-steel-200);
813
+ --fold-color-bg-header: var(--fold-ref-steel-150);
814
+ --fold-color-bg-rail-primary: var(--fold-ref-steel-100);
815
+ --fold-color-bg-rail-secondary: var(--fold-ref-steel-150);
816
+ --fold-color-bg-rail-tertiary: color-mix(
817
+ in srgb,
818
+ var(--fold-ref-black) 3%,
819
+ transparent
820
+ );
821
+
822
+ /* Primary / accent — heat-anodized copper-orange, deep enough for white */
823
+ --fold-color-primary: var(--fold-ref-titanium-500);
824
+ --fold-color-primary-strong: var(--fold-ref-titanium-600);
825
+ --fold-color-on-primary: var(--fold-ref-white);
826
+ --fold-color-primary-text: var(--fold-ref-titanium-700);
827
+ --fold-color-primary-surface: color-mix(
828
+ in srgb,
829
+ var(--fold-ref-titanium-500) 10%,
830
+ transparent
831
+ );
832
+ --fold-color-primary-border: color-mix(
833
+ in srgb,
834
+ var(--fold-ref-titanium-500) 28%,
835
+ transparent
836
+ );
837
+
838
+ /* Info (purple) — lumen tint */
839
+ --fold-color-info: var(--fold-ref-purple-600);
840
+ --fold-color-info-text: var(--fold-ref-purple-500);
841
+ --fold-color-info-surface: color-mix(
842
+ in srgb,
843
+ var(--fold-ref-purple-600) 8%,
844
+ transparent
845
+ );
846
+ --fold-color-info-border: color-mix(
847
+ in srgb,
848
+ var(--fold-ref-purple-600) 22%,
849
+ transparent
850
+ );
851
+
852
+ /* Warning (amber) */
853
+ --fold-color-warning: var(--fold-ref-amber-600);
854
+ --fold-color-warning-text: var(--fold-ref-amber-550);
855
+ --fold-color-warning-surface: color-mix(
856
+ in srgb,
857
+ var(--fold-ref-amber-600) 8%,
858
+ transparent
859
+ );
860
+ --fold-color-warning-border: color-mix(
861
+ in srgb,
862
+ var(--fold-ref-amber-600) 22%,
863
+ transparent
864
+ );
865
+
866
+ /* Alert (red) */
867
+ --fold-color-alert: var(--fold-ref-red-600);
868
+ --fold-color-alert-text: var(--fold-ref-red-450);
869
+ --fold-color-alert-surface: color-mix(
870
+ in srgb,
871
+ var(--fold-ref-red-600) 8%,
872
+ transparent
873
+ );
874
+ --fold-color-alert-border: color-mix(
875
+ in srgb,
876
+ var(--fold-ref-red-600) 22%,
877
+ transparent
878
+ );
879
+
880
+ /* Success (green) */
881
+ --fold-color-success: var(--fold-ref-green-500);
882
+ --fold-color-success-text: var(--fold-ref-green-550);
883
+ --fold-color-success-surface: color-mix(
884
+ in srgb,
885
+ var(--fold-ref-green-500) 10%,
886
+ transparent
887
+ );
888
+ --fold-color-success-border: color-mix(
889
+ in srgb,
890
+ var(--fold-ref-green-500) 25%,
891
+ transparent
892
+ );
893
+
894
+ /* Text — graphite on the light page (high contrast) */
895
+ --fold-color-text: var(--fold-ref-steel-900);
896
+ --fold-color-text-secondary: var(--fold-ref-steel-600);
897
+ --fold-color-text-muted: var(--fold-ref-steel-500);
898
+ --fold-color-text-faded: var(--fold-ref-steel-400);
899
+
900
+ /* Card — a bright polished-steel plate that floats off the silver ground */
901
+ --fold-color-surface-card: var(--fold-ref-steel-50);
902
+ --fold-color-surface-sunken: var(--fold-ref-steel-100);
903
+
904
+ /* Neutral surfaces — faint black overlays for hover/raise cues on light */
905
+ --fold-color-surface-subtle: color-mix(
906
+ in srgb,
907
+ var(--fold-ref-black) 3%,
908
+ transparent
909
+ );
910
+ --fold-color-surface-raised: color-mix(
911
+ in srgb,
912
+ var(--fold-ref-black) 5%,
913
+ transparent
914
+ );
915
+ --fold-color-surface-hover: var(
916
+ --fold-ref-steel-150
917
+ ); /* solid raised hover */
918
+
919
+ /* Borders — SOLID brushed-steel seams (the palpable metal edge), where the
920
+ light themes use an alpha hairline. */
921
+ --fold-color-border: var(--fold-ref-steel-300);
922
+ --fold-color-border-subtle: var(--fold-ref-steel-150);
923
+
924
+ /* Glass — frosted brushed steel */
925
+ --fold-color-glass: color-mix(
926
+ in srgb,
927
+ var(--fold-ref-steel-50) 66%,
928
+ transparent
929
+ );
930
+ --fold-color-glass-border: color-mix(
931
+ in srgb,
932
+ var(--fold-ref-black) 12%,
933
+ transparent
934
+ );
935
+
936
+ /* Scrim — a darkening veil behind the mobile nav drawer. */
937
+ --fold-color-scrim: color-mix(
938
+ in srgb,
939
+ var(--fold-ref-black) 45%,
940
+ transparent
941
+ );
942
+ }
@@ -238,11 +238,17 @@ type FoldAvatarRingStyle = "solid" | "dotted";
238
238
  * (so the same seed is the same colour everywhere, and one `registry.use(...)`
239
239
  * recolours every avatar).
240
240
  *
241
+ * A broken `imageUrl` falls back to the initials rather than the browser's
242
+ * broken-image glyph (and retries when the URL changes).
243
+ *
241
244
  * Three orthogonal state axes compose: `variant` (fill), `muted` (presence —
242
245
  * dim for an absence/inactive person), and `ring` + `ringStyle` (a status
243
246
  * outline). The component stays domain-agnostic: a screen maps its own states
244
247
  * (e.g. absent → `[muted]`, a scheduled arrival → `ring="accent"`
245
- * `ringStyle="dotted"`), the avatar just draws the primitives.
248
+ * `ringStyle="dotted"`), the avatar just draws the primitives. The ring is a
249
+ * redundant emphasis cue — never the sole carrier of a state — because on a
250
+ * light page a soft status hue (amber/green) can't clear WCAG 3:1 as a thin
251
+ * line (status-ring-contrast.spec.ts).
246
252
  *
247
253
  * ## Inputs
248
254
  *
@@ -253,12 +259,19 @@ type FoldAvatarRingStyle = "solid" | "dotted";
253
259
  * | `colorSeed` | `string` | `name` | String used to pick the deterministic colour. |
254
260
  * | `variant` | `'solid' \| 'ghost'` | `'solid'` | `'ghost'` renders a dashed border (for guests). |
255
261
  * | `square` | `boolean` | `false` | Square shape with a small radius (for orgs). |
256
- * | `imageUrl` | `string` | — | Image/logo URL. Replaces initials when set. |
262
+ * | `imageUrl` | `string` | — | Image/logo URL. Replaces initials when set; falls back to initials if it fails to load. |
257
263
  * | `muted` | `boolean` | `false` | Dim the avatar (same hue, less intense) — absence / inactive. |
258
264
  * | `ring` | `FoldAvatarRing` | `'none'` | A status outline (`accent`/`info`/`warning`/`alert`/`success`). |
259
265
  * | `ringStyle` | `'solid' \| 'dotted'` | `'solid'` | Ring line style — `dotted` for scheduled/tentative states. |
260
266
  *
261
267
  * @selector `fold-avatar`
268
+ *
269
+ * @example
270
+ * ```html
271
+ * <fold-avatar name="Clément Aubry" size="lg" />
272
+ * <fold-avatar name="Léa Petit" ring="accent" ringStyle="dotted" />
273
+ * <fold-avatar name="Acme Corp" square imageUrl="/logo.svg" />
274
+ * ```
262
275
  */
263
276
  declare class FoldAvatarComponent {
264
277
  private readonly palette;
@@ -274,7 +287,14 @@ declare class FoldAvatarComponent {
274
287
  readonly ring: _angular_core.InputSignal<FoldAvatarRing>;
275
288
  /** Ring line style — `'dotted'` for scheduled / tentative states. */
276
289
  readonly ringStyle: _angular_core.InputSignal<FoldAvatarRingStyle>;
277
- /** Readable ink for the initials, derived from the fill's luminance. */
290
+ /** True once the `<img>` fails to load. Resets whenever `imageUrl` changes,
291
+ * so a corrected URL is retried rather than staying on the fallback. */
292
+ protected readonly imageFailed: _angular_core.WritableSignal<boolean>;
293
+ /** Show the image only when a URL is set AND it has not failed — a broken URL
294
+ * falls back to the initials instead of the browser's broken-image glyph. */
295
+ protected readonly showImage: _angular_core.Signal<boolean>;
296
+ /** Readable ink for the initials — the higher-contrast of dark/light ink on
297
+ * the fill, so a custom palette stays legible. */
278
298
  protected readonly onColor: _angular_core.Signal<string>;
279
299
  readonly initials: _angular_core.Signal<string>;
280
300
  /** Deterministic fill from the active palette (via the shared registry). */
@@ -308,6 +328,12 @@ declare class FoldAvatarComponent {
308
328
  * | `ringStyle` | `'solid' \| 'dotted'` | `'solid'` | Ring line style (`dotted` = scheduled). |
309
329
  *
310
330
  * @selector `fold-avatar-detail`
331
+ *
332
+ * @example
333
+ * ```html
334
+ * <fold-avatar-detail primary="Alex Rivers" secondary="alex@sh3pherd.dev" />
335
+ * <fold-avatar-detail primary="Acme Corp" secondary="Organisation" square />
336
+ * ```
311
337
  */
312
338
  declare class FoldAvatarDetailComponent {
313
339
  readonly primary: _angular_core.InputSignal<string>;
@@ -821,6 +847,9 @@ declare class FoldToggleIconComponent {
821
847
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldToggleIconComponent, "fold-toggle-icon", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "toggled": "toggled"; }, never, never, true, never>;
822
848
  }
823
849
 
850
+ /** Which band(s) carry a chrome treatment (a separator hairline or a raised
851
+ * tint): neither, just the header, just the footer, or both. */
852
+ type FoldCardBandChrome = "none" | "header" | "footer" | "both";
824
853
  /**
825
854
  * `<fold-card>` — the canonical raised content surface: a solid
826
855
  * `surface-card` background, a hairline border and a consistent radius. Use it
@@ -829,14 +858,19 @@ declare class FoldToggleIconComponent {
829
858
  *
830
859
  * - `surface` — `card` (the raised card tint, default) · `sunken` (a deeper
831
860
  * surface for large containers, below the card — the ref's second card tint;
832
- * pairs with a fainter `border-subtle` hairline).
861
+ * pairs with a fainter `border-subtle` hairline) · `accent` (an accent-filled
862
+ * card whose content sub-tree auto-inverts to a compatible on-accent palette).
833
863
  * - `radius` — `lg` (14px, default) · `md` · `sm`.
834
864
  * - `padding` — `md` (16px, default) · `none` · `sm` · `lg`. Sets the *body*
835
865
  * padding; override with a custom value via `--fold-card-padding`.
836
- * - `interactive` — adds a hover lift (for clickable cards).
837
- * - `separators` — draw a hairline between a projected header/footer and the body.
838
- * - `raisedBands` — tint the header/footer bands a step above the surface
839
- * (fainter on `sunken`).
866
+ * - `interactive` — makes the whole card a clickable control (see below).
867
+ * - `separators` — which bands get a hairline against the body:
868
+ * `none` (default) · `header` · `footer` · `both`.
869
+ * - `raisedBands` — which bands are tinted a step above the surface (fainter on
870
+ * `sunken`): `none` (default) · `header` · `footer` · `both`.
871
+ *
872
+ * `separators` and `raisedBands` are per-band and independent axes, so a card can
873
+ * have (say) a raised, un-separated header over a flush footer.
840
874
  *
841
875
  * Content projection:
842
876
  * - default slot → the card body.
@@ -848,10 +882,18 @@ declare class FoldToggleIconComponent {
848
882
  * never pads. So the content padding is identical whether or not the bands show —
849
883
  * toggling a header/footer never shifts the body.
850
884
  *
885
+ * **Interactive cards.** `interactive` turns the whole card into a real control:
886
+ * the host gains `role="button"`, `tabindex="0"`, a focus ring and a hover lift,
887
+ * and Enter / Space (or a click) emit `(activated)`. Give it an accessible name
888
+ * with `ariaLabel` when the card's text isn't a sufficient label.
889
+ * A `role="button"` must not wrap other interactive controls — so an interactive
890
+ * card must NOT contain buttons/links. For a card with its own inner actions,
891
+ * keep it non-interactive and put a single primary `<a>`/`<button>` inside.
892
+ *
851
893
  * ```html
852
894
  * <fold-card>Static content</fold-card>
853
895
  * <fold-card surface="sunken" padding="lg">Deep container</fold-card>
854
- * <fold-card separators>
896
+ * <fold-card separators="both">
855
897
  * <h3 cardHeader>Title</h3>
856
898
  * Body content
857
899
  * <div cardFooter>Actions</div>
@@ -863,24 +905,49 @@ declare class FoldToggleIconComponent {
863
905
  * (default `clip`) lets content escape the rounded corners.
864
906
  *
865
907
  * @selector `fold-card`
908
+ *
909
+ * @example
910
+ * ```html
911
+ * <fold-card interactive ariaLabel="Open Acme Records" (activated)="open()">
912
+ * <h3>Acme Records</h3>
913
+ * <p>128 contracts · 96 active</p>
914
+ * </fold-card>
915
+ * ```
866
916
  */
867
917
  declare class FoldCardComponent {
868
- /** Surface tint — `card` (raised, default) or `sunken` (deeper container). */
869
- readonly surface: _angular_core.InputSignal<"card" | "sunken">;
918
+ /** Surface tint — `card` (raised, default), `sunken` (deeper container), or
919
+ * `accent` (an **accent-filled** card: the accent colour as ground, with the
920
+ * whole content sub-tree auto-inverted to a compatible on-accent role-set —
921
+ * text, borders, band gradation, and even nested buttons/links/icon-tiles
922
+ * convert automatically). Use it to make a card in a grid stand out. */
923
+ readonly surface: _angular_core.InputSignal<"accent" | "card" | "sunken">;
870
924
  /** Corner radius — `lg` (default), `md`, or `sm`. */
871
925
  readonly radius: _angular_core.InputSignal<"sm" | "md" | "lg">;
872
926
  /** Body padding — `md` (default), `none`, `sm`, or `lg`; a custom value can be
873
927
  * set with the `--fold-card-padding` CSS variable. */
874
928
  readonly padding: _angular_core.InputSignal<"none" | "sm" | "md" | "lg">;
875
- /** Add a hover lift for clickable cards. */
876
- readonly interactive: _angular_core.InputSignal<boolean>;
877
- /** Draw a hairline between a projected header/footer and the body. */
878
- readonly separators: _angular_core.InputSignalWithTransform<boolean, unknown>;
879
- /** Lift the header/footer bands with a subtle raised tint over the card
880
- * surface (fainter on `sunken`), to set the chrome apart from the body. */
881
- readonly raisedBands: _angular_core.InputSignalWithTransform<boolean, unknown>;
929
+ /** Make the whole card a clickable control: `role="button"` + `tabindex`, a
930
+ * focus ring, a hover lift, and Enter/Space/click → `(activated)`. Must not
931
+ * wrap other interactive controls (see the class docs). */
932
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
933
+ /** Accessible name for the interactive card, when its content isn't enough. */
934
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
935
+ /** Which bands get a hairline against the body — `none` (default), `header`,
936
+ * `footer`, or `both`. */
937
+ readonly separators: _angular_core.InputSignal<FoldCardBandChrome>;
938
+ /** Which bands are lifted with a subtle raised tint over the card surface
939
+ * (fainter on `sunken`) — `none` (default), `header`, `footer`, or `both`. */
940
+ readonly raisedBands: _angular_core.InputSignal<FoldCardBandChrome>;
941
+ /** Fires when an `interactive` card is activated (click, Enter, or Space). */
942
+ readonly activated: _angular_core.OutputEmitterRef<Event>;
943
+ /** Whether a per-band chrome value applies to the given band. */
944
+ protected hasBand(value: FoldCardBandChrome, band: "header" | "footer"): boolean;
945
+ protected onActivate(event: Event): void;
946
+ /** Enter/Space activate the card, matching the native button keyboard contract
947
+ * (Space is prevented from scrolling the page). */
948
+ protected onKeydown(event: KeyboardEvent): void;
882
949
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldCardComponent, never>;
883
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCardComponent, "fold-card", never, { "surface": { "alias": "surface"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "raisedBands": { "alias": "raisedBands"; "required": false; "isSignal": true; }; }, {}, never, ["[cardHeader]", "*", "[cardFooter]"], true, never>;
950
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldCardComponent, "fold-card", never, { "surface": { "alias": "surface"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "raisedBands": { "alias": "raisedBands"; "required": false; "isSignal": true; }; }, { "activated": "activated"; }, never, ["[cardHeader]", "*", "[cardFooter]"], true, never>;
884
951
  }
885
952
 
886
953
  /**
@@ -1117,6 +1184,9 @@ declare class FoldFieldComponent {
1117
1184
  * - `tone` — `accent` (default, brand link) · `muted` (secondary).
1118
1185
  * - `icon` / `trailingIcon` — optional glyphs around the label.
1119
1186
  * - `disabled` — button mode only.
1187
+ * - `target` / `rel` — anchor mode only. Setting `target="_blank"` auto-applies
1188
+ * `rel="noopener noreferrer"` (safe by default); override with an explicit
1189
+ * `rel`.
1120
1190
  *
1121
1191
  * @selector `fold-link`
1122
1192
  *
@@ -1125,7 +1195,9 @@ declare class FoldFieldComponent {
1125
1195
  * <fold-link icon="company" trailingIcon="chevron-right" (clicked)="openOrg()">
1126
1196
  * Voir l'organigramme
1127
1197
  * </fold-link>
1128
- * <fold-link href="https://sh3pherd.dev/docs" tone="muted">Documentation</fold-link>
1198
+ * <fold-link href="https://sh3pherd.dev/docs" target="_blank" tone="muted">
1199
+ * Documentation
1200
+ * </fold-link>
1129
1201
  * ```
1130
1202
  */
1131
1203
  declare class FoldLinkComponent {
@@ -1137,12 +1209,19 @@ declare class FoldLinkComponent {
1137
1209
  readonly tone: _angular_core.InputSignal<"accent" | "muted">;
1138
1210
  /** When set, the link renders as an `<a href>` instead of a button. */
1139
1211
  readonly href: _angular_core.InputSignal<string | undefined>;
1212
+ /** Anchor target (e.g. `_blank`). Anchor mode only. */
1213
+ readonly target: _angular_core.InputSignal<string | undefined>;
1214
+ /** Anchor `rel`. Anchor mode only. Defaults to `noopener noreferrer` when
1215
+ * `target="_blank"`; set explicitly to override. */
1216
+ readonly rel: _angular_core.InputSignal<string | undefined>;
1140
1217
  /** Disable the button form (no effect on the `href` form). */
1141
1218
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1142
- /** Fires on click in the button form. */
1143
- readonly clicked: _angular_core.OutputEmitterRef<void>;
1219
+ /** Fires on click in the button form; carries the `MouseEvent`. */
1220
+ readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
1221
+ /** Resolved `rel` — the explicit value, or a safe default for a new tab. */
1222
+ protected readonly resolvedRel: _angular_core.Signal<string | null>;
1144
1223
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FoldLinkComponent, never>;
1145
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldLinkComponent, "fold-link", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "trailingIcon": { "alias": "trailingIcon"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
1224
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FoldLinkComponent, "fold-link", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "trailingIcon": { "alias": "trailingIcon"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "rel": { "alias": "rel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
1146
1225
  }
1147
1226
 
1148
1227
  /**
@@ -1918,10 +1997,12 @@ declare function observeElementWidth(element?: ElementRef<HTMLElement> | HTMLEle
1918
1997
 
1919
1998
  /**
1920
1999
  * A named surface — the ground a subtree paints itself on. `page` is the
1921
- * document body; `chrome` is application furniture (rails, header) that a
1922
- * theme may colour differently from the page.
2000
+ * document body; `chrome` is application furniture (rails, header) that a theme
2001
+ * may colour differently from the page; `accent` is an **auto-inverting** region
2002
+ * filled with the brand accent, whose content re-points to a compatible
2003
+ * on-accent palette (see the `[data-surface="accent"]` block in `semantic.css`).
1923
2004
  */
1924
- type FoldSurfaceName = "page" | "chrome";
2005
+ type FoldSurfaceName = "page" | "chrome" | "accent";
1925
2006
  /**
1926
2007
  * `[foldSurface]` — declares the element a **named surface**, so a theme can
1927
2008
  * re-colour it without knowing anything about the component it lives in.
@@ -4065,5 +4146,5 @@ declare class FoldPaletteRegistry {
4065
4146
  }
4066
4147
 
4067
4148
  export { FOLD_AUTO_PALETTES, FOLD_BLUR_TOKENS, FOLD_BUILTIN_ICONS, FOLD_MOTION_TOKENS, FOLD_PALETTE_DEFAULT, FOLD_PANEL_CLOSE_LABEL, FOLD_RADIUS_TOKENS, FOLD_SEMANTIC_COLOR_TOKENS, FOLD_SHADOW_TOKENS, FOLD_SPACE_TOKENS, FOLD_TEXT_TOKENS, FOLD_TOAST_CONFIG, FoldAppShellComponent, FoldAsideLayoutComponent, FoldAvatarComponent, FoldAvatarDetailComponent, FoldAvatarListComponent, FoldBadgeComponent, FoldButtonComponent, FoldButtonIconComponent, FoldCalloutComponent, FoldCardComponent, FoldChoiceRowComponent, FoldContextCardComponent, FoldDataTableCellDirective, FoldDataTableComponent, FoldDisclosureComponent, FoldElementTitleComponent, FoldElevatedDirective, FoldEmptyStateComponent, FoldFieldComponent, FoldFieldIdDirective, FoldFieldListComponent, FoldFileDropzoneComponent, FoldHeroCardComponent, FoldHeroSectionComponent, FoldIconComponent, FoldIconRegistry, FoldIdService, FoldInputComponent, FoldLinkComponent, FoldLoadingStateComponent, FoldMenuComponent, FoldMenuItemComponent, FoldMenuSectionComponent, FoldMenuSeparatorComponent, FoldNavLauncherComponent, FoldNavLayoutComponent, FoldNavTileComponent, FoldNumberInputComponent, FoldPageLayoutComponent, FoldPageSectionComponent, FoldPageTitleDirective, FoldPaginatorComponent, FoldPaletteRegistry, FoldPanelComponentOutletDirective, FoldPanelHeaderComponent, FoldPanelHostComponent, FoldPanelHostService, FoldPanelRef, FoldPanelToggle, FoldRangeSliderComponent, FoldRepeatPressDirective, FoldSearchComponent, FoldSelectComponent, FoldSliderComponent, FoldSpinnerComponent, FoldStatusBadgeComponent, FoldStickyColumnDirective, FoldSurfaceDirective, FoldTabPanelComponent, FoldTabsComponent, FoldTimelineComponent, FoldToastComponent, FoldToastContainerComponent, FoldToastService, FoldToggleIconComponent, FoldViewNavComponent, foldBlurVar, foldColorProperty, foldColorVar, foldHashSeed, foldMotionVar, foldRadiusVar, foldResolvePalette, foldShadowVar, foldSpaceVar, foldTextVar, observeElementWidth, provideFoldIcons, provideFoldPalette, provideFoldPanelLabels, provideFoldToasts };
4068
- export type { FoldAutoPaletteName, FoldAvatarListItem, FoldAvatarRing, FoldAvatarRingStyle, FoldAvatarVariant, FoldBadgeVariant, FoldBlurToken, FoldBuiltinIconName, FoldButtonEmphasis, FoldButtonIconShape, FoldButtonIconSize, FoldButtonIconTone, FoldButtonIntent, FoldButtonShape, FoldButtonSize, FoldCalloutAppearance, FoldCalloutVariant, FoldChoiceOption, FoldComponentPanelDescriptor, FoldIconName, FoldIconSet, FoldIconSize, FoldMenuItemBadgeTone, FoldMenuLevel, FoldMenuTint, FoldMenuTogglePlacement, FoldMotionToken, FoldNumberControls, FoldNumberSpinner, FoldPageItem, FoldPaletteInput, FoldPanelConfig, FoldPanelContent, FoldPanelDescriptor, FoldPanelHandle, FoldPanelLabels, FoldPanelSide, FoldRadiusToken, FoldRangeValue, FoldSemanticColorToken, FoldShadowToken, FoldSpaceToken, FoldSpinnerSize, FoldStickyColumnAnchor, FoldSurfaceName, FoldTabItem, FoldTableColumn, FoldTableEmpty, FoldTableSort, FoldTableSortDir, FoldTableTone, FoldTabsContext, FoldTemplatePanelDescriptor, FoldTextToken, FoldTimelineDatePlacement, FoldTimelineNode, FoldToast, FoldToastConfig, FoldToastVariant, FoldViewNavItem };
4149
+ export type { FoldAutoPaletteName, FoldAvatarListItem, FoldAvatarRing, FoldAvatarRingStyle, FoldAvatarVariant, FoldBadgeVariant, FoldBlurToken, FoldBuiltinIconName, FoldButtonEmphasis, FoldButtonIconShape, FoldButtonIconSize, FoldButtonIconTone, FoldButtonIntent, FoldButtonShape, FoldButtonSize, FoldCalloutAppearance, FoldCalloutVariant, FoldCardBandChrome, FoldChoiceOption, FoldComponentPanelDescriptor, FoldIconName, FoldIconSet, FoldIconSize, FoldMenuItemBadgeTone, FoldMenuLevel, FoldMenuTint, FoldMenuTogglePlacement, FoldMotionToken, FoldNumberControls, FoldNumberSpinner, FoldPageItem, FoldPaletteInput, FoldPanelConfig, FoldPanelContent, FoldPanelDescriptor, FoldPanelHandle, FoldPanelLabels, FoldPanelSide, FoldRadiusToken, FoldRangeValue, FoldSemanticColorToken, FoldShadowToken, FoldSpaceToken, FoldSpinnerSize, FoldStickyColumnAnchor, FoldSurfaceName, FoldTabItem, FoldTableColumn, FoldTableEmpty, FoldTableSort, FoldTableSortDir, FoldTableTone, FoldTabsContext, FoldTemplatePanelDescriptor, FoldTextToken, FoldTimelineDatePlacement, FoldTimelineNode, FoldToast, FoldToastConfig, FoldToastVariant, FoldViewNavItem };
4069
4150
  //# sourceMappingURL=fold-ng.d.ts.map