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/CHANGELOG.md +67 -1
- package/README.md +127 -50
- package/fesm2022/fold-ng.mjs +202 -51
- package/fesm2022/fold-ng.mjs.map +1 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/tokens/primitives.css +19 -0
- package/tokens/scales.css +11 -0
- package/tokens/semantic.css +238 -0
- package/types/fold-ng.d.ts +108 -27
- package/types/fold-ng.d.ts.map +1 -1
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
|
+
"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",
|
package/tokens/primitives.css
CHANGED
|
@@ -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
|
+
}
|
package/tokens/semantic.css
CHANGED
|
@@ -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
|
+
}
|
package/types/fold-ng.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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` —
|
|
837
|
-
* - `separators` —
|
|
838
|
-
*
|
|
839
|
-
*
|
|
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)
|
|
869
|
-
|
|
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
|
-
/**
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
readonly
|
|
879
|
-
/**
|
|
880
|
-
|
|
881
|
-
|
|
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">
|
|
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<
|
|
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
|
-
*
|
|
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
|