fold-ng 0.2.0 → 0.2.1
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 +14 -1
- package/README.md +8 -1
- package/fesm2022/fold-ng.mjs +2 -2
- package/fesm2022/fold-ng.mjs.map +1 -1
- package/package.json +1 -1
- package/tsconfig.lib.tsbuildinfo +0 -1
package/fesm2022/fold-ng.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fold-ng.mjs","sources":["../../src/a11y/focus-trap.directive.ts","../../src/a11y/id.service.ts","../../src/dom/observe-element-width.ts","../../src/directives/surface.directive.ts","../../src/components/layout/app-shell/app-shell.component.ts","../../src/components/layout/app-shell/app-shell.component.html","../../src/color/palettes.ts","../../src/color/palette-registry.service.ts","../../src/components/content/avatar/avatar.component.ts","../../src/components/content/avatar/avatar.component.html","../../src/components/content/avatar-detail/avatar-detail.component.ts","../../src/components/content/avatar-detail/avatar-detail.component.html","../../src/components/content/avatar-list/avatar-list.component.ts","../../src/components/content/avatar-list/avatar-list.component.html","../../src/components/content/badge/badge.component.ts","../../src/components/content/badge/badge.component.html","../../src/components/foundations/icon/icons/ui.icons.ts","../../src/components/foundations/icon/icons/nav.icons.ts","../../src/components/foundations/icon/icons/music.icons.ts","../../src/components/foundations/icon/icons/status.icons.ts","../../src/components/foundations/icon/icons/people.icons.ts","../../src/components/foundations/icon/icons/brands.icons.ts","../../src/components/foundations/icon/builtin-icons.ts","../../src/components/foundations/icon/icon-safety.ts","../../src/components/foundations/icon/icon-registry.service.ts","../../src/components/foundations/icon/icon-sprite.ts","../../src/components/foundations/icon/icon-sprite.service.ts","../../src/components/foundations/icon/icon.component.ts","../../src/components/foundations/icon/icon.component.html","../../src/tokens/tokens.catalog.ts","../../src/components/foundations/spinner/spinner.component.ts","../../src/components/foundations/spinner/spinner.component.html","../../src/components/actions/button/button.component.ts","../../src/components/actions/button/button.component.html","../../src/components/actions/button-icon/button-icon.component.ts","../../src/components/actions/button-icon/button-icon.component.html","../../src/components/actions/toggle-icon/toggle-icon.component.ts","../../src/components/actions/toggle-icon/toggle-icon.component.html","../../src/components/content/card/card.component.ts","../../src/components/content/card/card.component.html","../../src/components/content/element-title/element-title.component.ts","../../src/components/content/element-title/element-title.component.html","../../src/components/content/context-card/context-card.component.ts","../../src/components/content/context-card/context-card.component.html","../../src/a11y/field-id.directive.ts","../../src/components/forms/file-dropzone/file-dropzone.component.ts","../../src/components/forms/file-dropzone/file-dropzone.component.html","../../src/components/content/field/field-list.component.ts","../../src/components/content/field/field-list.component.html","../../src/components/content/field/field.component.ts","../../src/components/content/field/field.component.html","../../src/components/actions/link/link.component.ts","../../src/components/actions/link/link.component.html","../../src/components/navigation/menu/menu.component.ts","../../src/components/navigation/menu/menu.component.html","../../src/components/navigation/menu/menu-item.component.ts","../../src/components/navigation/menu/menu-item.component.html","../../src/components/navigation/menu/menu-separator.component.ts","../../src/components/navigation/menu/menu-separator.component.html","../../src/components/navigation/menu/menu-section.component.ts","../../src/components/navigation/menu/menu-section.component.html","../../src/a11y/scroll-lock.service.ts","../../src/components/navigation/nav-launcher/nav-tile.component.ts","../../src/components/navigation/nav-launcher/nav-tile.component.html","../../src/components/navigation/nav-launcher/nav-launcher.component.ts","../../src/components/navigation/nav-launcher/nav-launcher.component.html","../../src/components/content/hero-card/hero-card.component.ts","../../src/components/content/hero-card/hero-card.component.html","../../src/components/content/data-table/data-table-cell.directive.ts","../../src/components/content/data-table/data-table.component.ts","../../src/components/content/data-table/data-table.component.html","../../src/directives/sticky-column.directive.ts","../../src/components/content/choice-row/choice-row.component.ts","../../src/components/content/choice-row/choice-row.component.html","../../src/directives/repeat-press.directive.ts","../../src/directives/elevated.directive.ts","../../src/components/forms/input/label.component.ts","../../src/components/forms/input/input-base.component.ts","../../src/components/forms/input/input-base.component.html","../../src/components/forms/input/input-value.ts","../../src/components/forms/input/input.component.ts","../../src/components/forms/input/input.component.html","../../src/components/forms/input/number-settle.ts","../../src/components/forms/input/number-input.component.ts","../../src/components/forms/input/number-input.component.html","../../src/components/forms/input/search.component.ts","../../src/components/forms/input/select.component.ts","../../src/components/forms/input/select.component.html","../../src/components/forms/slider/slider.component.ts","../../src/components/forms/slider/slider.component.html","../../src/components/forms/slider/range-slider.component.ts","../../src/components/forms/slider/range-slider.component.html","../../src/components/feedback/callout/callout.component.ts","../../src/components/feedback/callout/callout.component.html","../../src/components/feedback/disclosure/disclosure.component.ts","../../src/components/feedback/disclosure/disclosure.component.html","../../src/components/content/status-badge/status-badge.component.ts","../../src/components/content/status-badge/status-badge.component.html","../../src/components/content/timeline/timeline.component.ts","../../src/components/content/timeline/timeline.component.html","../../src/components/feedback/state/loading-state.component.ts","../../src/components/feedback/state/loading-state.component.html","../../src/components/feedback/state/empty-state.component.ts","../../src/components/feedback/state/empty-state.component.html","../../src/components/layout/aside-layout/aside-layout.component.ts","../../src/components/layout/aside-layout/aside-layout.component.html","../../src/components/layout/tab-layout/tab-layout.component.ts","../../src/components/layout/tab-layout/tab-layout.component.html","../../src/components/layout/page-layout/page-layout.component.ts","../../src/components/layout/page-layout/page-layout.component.html","../../src/components/layout/page-section/page-section.component.ts","../../src/components/layout/page-section/page-section.component.html","../../src/components/layout/hero-section/hero-section.component.ts","../../src/components/layout/hero-section/hero-section.component.html","../../src/components/content/paginator/paginator.component.ts","../../src/components/content/paginator/paginator.component.html","../../src/components/navigation/tab-nav/tab-nav.component.ts","../../src/components/navigation/tab-nav/tab-nav.component.html","../../src/components/feedback/toast/toast.component.ts","../../src/components/feedback/toast/toast.component.html","../../src/components/feedback/toast/toast.config.ts","../../src/components/feedback/toast/toast.service.ts","../../src/components/feedback/toast/toast-container.component.ts","../../src/components/feedback/toast/toast-container.component.html","../../src/components/overlays/panel/panel-component-outlet.directive.ts","../../src/components/overlays/panel/panel-ref.ts","../../src/components/overlays/panel/panel-labels.ts","../../src/components/overlays/panel/panel.types.ts","../../src/components/overlays/panel/panel-header.component.ts","../../src/components/overlays/panel/panel-header.component.html","../../src/components/overlays/panel/panel-host.service.ts","../../src/components/overlays/panel/panel-host.component.ts","../../src/components/overlays/panel/panel-host.component.html","../../src/components/overlays/panel/panel-toggle.ts","../../src/public-api.ts","../../src/fold-ng.ts"],"sourcesContent":["import { DOCUMENT } from \"@angular/common\";\nimport { Directive, ElementRef, effect, inject, input } from \"@angular/core\";\n\n/**\n * A matched element is only truly focusable if it's rendered — `display:none`\n * and `visibility:hidden` descendants match the selector but can't take focus,\n * and focusing one would drop focus to the body. `offsetParent === null` catches\n * `display:none`; the size check catches a zero-box element still in flow.\n */\nfunction isVisible(el: HTMLElement): boolean {\n if (el.hidden) {\n return false;\n }\n const rects = el.getClientRects();\n return el.offsetParent !== null || rects.length > 0;\n}\n\n/** Elements that can receive keyboard focus, minus explicitly-skipped ones. */\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(\",\");\n\n/**\n * Traps keyboard focus inside the host element while enabled — the a11y\n * contract every overlay must honour but which panels historically skipped.\n *\n * On enable it remembers the currently-focused element and moves focus to the\n * first focusable descendant (or the host itself). `Tab`/`Shift+Tab` wrap at\n * the boundaries so focus never escapes to the page behind. On disable or\n * destroy it restores focus to wherever it was before — so closing a panel\n * returns the user to the control that opened it.\n *\n * The host must be focusable as a fallback (`tabindex=\"-1\"`).\n */\n@Directive({\n selector: \"[foldFocusTrap]\",\n host: { \"(keydown)\": \"onKeydown($event)\" },\n})\nexport class FocusTrapDirective {\n /** Bind `[foldFocusTrap]=\"open()\"` — the trap is live only while true. */\n readonly enabled = input(true, { alias: \"foldFocusTrap\" });\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private previouslyFocused: HTMLElement | null = null;\n\n constructor() {\n effect((onCleanup) => {\n if (!this.enabled()) {\n return;\n }\n this.activate();\n onCleanup(() => this.restore());\n });\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key !== \"Tab\" || !this.enabled()) {\n return;\n }\n const focusables = this.focusable();\n if (focusables.length === 0) {\n event.preventDefault();\n this.host.nativeElement.focus();\n return;\n }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n if (!first || !last) {\n return;\n }\n const active = this.document.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n private activate(): void {\n const active = this.document.activeElement;\n this.previouslyFocused = active instanceof HTMLElement ? active : null;\n (this.focusable()[0] ?? this.host.nativeElement).focus();\n }\n\n private restore(): void {\n this.previouslyFocused?.focus();\n this.previouslyFocused = null;\n }\n\n private focusable(): HTMLElement[] {\n const all = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n );\n const visible = all.filter(isVisible);\n // A non-rendering environment (SSR / jsdom) reports every element as\n // zero-box; don't over-filter there — fall back to the raw matches.\n return visible.length > 0 ? visible : all;\n }\n}\n","import { Injectable } from \"@angular/core\";\n\n/**\n * Generates unique, SSR-safe element ids.\n *\n * A per-injector counter (`providedIn: 'root'` → one instance per application,\n * and a fresh one per request on the server) so the sequence is deterministic\n * in render order and therefore matches between server and client. That's the\n * point: `crypto.randomUUID()` returns a different value on the server than on\n * the client for the same element, which trips Angular hydration; a counter\n * reset per request does not, and can't collide across requests or grow\n * unbounded.\n *\n * Used by the labelled controls that own their id ({@link FoldInputComponent},\n * `fold-select`) and by {@link FoldFieldIdDirective} for loose native controls.\n */\n@Injectable({ providedIn: \"root\" })\nexport class FoldIdService {\n private counter = 0;\n\n /**\n * The next unique id, e.g. `fold-input-3`.\n * @param prefix a short, human-readable namespace for the id.\n */\n next(prefix = \"fold\"): string {\n this.counter += 1;\n return `${prefix}-${this.counter}`;\n }\n}\n","import {\n DestroyRef,\n ElementRef,\n type Signal,\n inject,\n signal,\n} from \"@angular/core\";\n\n/**\n * A signal of an element's content-box **width** in px, kept live by a\n * `ResizeObserver`. Call it in an **injection context** (a component/directive\n * constructor or field initialiser); it wires the observer to the current\n * `ElementRef` — or an element you pass — and tears it down on destroy.\n *\n * This is the reusable half of container-responsiveness: the `ResizeObserver`\n * wiring, the SSR guard and the teardown, in one place. Each caller derives\n * whatever breakpoint policy it needs on top — a plain `computed(() => w() <=\n * 768)`, or a hysteretic state machine — instead of re-writing the observer.\n *\n * SSR / no-DOM safe: where `ResizeObserver` is undefined the signal stays at\n * its initial `0`, which every caller reads as \"not yet measured\" — and, for a\n * breakpoint, as the wide/default branch, the SSR-correct first paint. The\n * observer also ignores a `0` reading, so a detached or hidden element keeps\n * its last real width rather than flipping.\n *\n * @param element the element to observe; defaults to the injected host.\n * @returns a read-only signal of the current width in px (`0` until measured).\n */\nexport function observeElementWidth(\n element?: ElementRef<HTMLElement> | HTMLElement,\n): Signal<number> {\n const host =\n element instanceof ElementRef\n ? element.nativeElement\n : (element ?? inject<ElementRef<HTMLElement>>(ElementRef).nativeElement);\n const width = signal(0);\n if (typeof ResizeObserver !== \"undefined\") {\n const observer = new ResizeObserver((entries) => {\n const measured = entries[0]?.contentRect.width ?? 0;\n if (measured > 0) {\n width.set(measured);\n }\n });\n observer.observe(host);\n inject(DestroyRef).onDestroy(() => observer.disconnect());\n }\n return width.asReadonly();\n}\n","import { Directive, input } from \"@angular/core\";\n\n/**\n * A named surface — the ground a subtree paints itself on. `page` is the\n * document body; `chrome` is application furniture (rails, header) that a\n * theme may colour differently from the page.\n */\nexport type FoldSurfaceName = \"page\" | \"chrome\";\n\n/**\n * `[foldSurface]` — declares the element a **named surface**, so a theme can\n * re-colour it without knowing anything about the component it lives in.\n *\n * It exists to let one theme mean two things by \"the same\" role. A uniform\n * theme (umbra, light) needs none of this — `text` is one colour everywhere.\n * But a theme that mixes a **light page with dark chrome** (navi) needs `text`,\n * `surface` and the brand to differ *per region*, which a single set of roles\n * cannot express. The surface is the seam a theme overrides across:\n *\n * ```css\n * [data-theme=\"navi\"] [data-surface=\"chrome\"] {\n * --fold-color-text: var(--fold-ref-slate-50); / * light text on the dark rail * /\n * }\n * ```\n *\n * The directive only stamps `data-surface`; the theme owns the colours. Two\n * rules make it work, both in the token layer, neither in a component:\n * - `[data-surface] { color: var(--fold-color-text); }` — every surface resolves\n * its own text, so a per-surface override actually lands (a custom-property\n * override reaches only properties *resolved inside* the subtree, never a\n * colour already inherited from an ancestor).\n * - a theme adds `[data-theme=\"…\"] [data-surface=\"chrome\"] { … }` for the\n * surfaces it wants to diverge on.\n *\n * This replaces reaching into `fold-app-shell`'s internal class names from the\n * theme file — a coupling that pointed the wrong way (a renamed rail class\n * would have broken a theme silently). Any element can now be a chrome surface:\n * a shell rail, a dark hero on a light page, a footer, a preview pane.\n *\n * @selector `[foldSurface]`\n *\n * @example\n * ```html\n * <aside foldSurface=\"chrome\">…dark furniture on a light page…</aside>\n * ```\n */\n@Directive({\n selector: \"[foldSurface]\",\n standalone: true,\n host: { \"[attr.data-surface]\": \"foldSurface()\" },\n})\nexport class FoldSurfaceDirective {\n /** The surface this element is. Defaults to `page`, including a bare\n * `foldSurface` attribute (which the template binds as an empty string). */\n readonly foldSurface = input<FoldSurfaceName, FoldSurfaceName | \"\">(\"page\", {\n transform: (value) => (value === \"\" ? \"page\" : value),\n });\n}\n","import { DOCUMENT, NgTemplateOutlet } from \"@angular/common\";\nimport {\n Component,\n HostListener,\n computed,\n effect,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport { FocusTrapDirective } from \"../../../a11y/focus-trap.directive\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { observeElementWidth } from \"../../../dom/observe-element-width\";\nimport { FoldSurfaceDirective } from \"../../../directives/surface.directive\";\n\n/** Width (px) at or below which the rails collapse and the primary rail becomes\n * a mobile drawer. Kept in lockstep with the `@media`/`@container` breakpoint\n * in the stylesheet. */\nconst MOBILE_BREAKPOINT = 768;\n\n/**\n * `<fold-app-shell>` — the responsive application skeleton.\n *\n * A pure structural grid with four content slots: it owns the layout and the\n * responsive collapse, the app owns what fills the slots (nav, header, routed\n * content, overlays) and all state/routing. Rail visibility is driven from the\n * projected rail component itself (an empty `railSecondary` self-collapses).\n *\n * Sizing has two ergonomic paths that compose:\n * - **Typed inputs** (`railWidth`, `headerHeight`, `headerHeightMobile`) for the\n * common case — plain px numbers, discoverable and type-checked in the\n * template.\n * - **CSS variables** for the theming case — set `--fold-shell-*` on any ancestor\n * to compose tokens (`var(--w-appMenu)`) or drive it from a media query. An\n * unset input inherits the variable, so the two never fight.\n *\n * ```\n * ┌────────┬──────────────┬─────────────────────┐\n * │ rail │ rail │ header │ ← header row (fixed height)\n * │ primary│ secondary ├─────────────────────┤\n * │ (auto, │ (auto width, │ content │ ← content row (1fr)\n * │ self- │ self- │ (position: relative │\n * │ sized)│ collapsing) │ anchor for panels) │\n * │ │ ├─────────────────────┤\n * │ │ │ footer │ ← footer row (auto — 0 when empty)\n * └────────┴──────────────┴─────────────────────┘\n * ```\n *\n * At ≤768px it becomes a single header + content + footer column and the rails\n * drop out. How the nav comes back is `mobileNav`:\n * - `\"drawer\"` (default) — the **primary** rail turns into an off-canvas drawer;\n * bind `[(mobileNavOpen)]` and give the app a mobile-only hamburger to slide\n * it in over a scrim (`Escape` / scrim / widening close it). Render the\n * projected rail expanded in the drawer, since the collapsed icon rail is the\n * desktop chrome.\n * - `\"none\"` — no built-in mobile nav; compose an `fold-nav-launcher` (a\n * full-screen tile grid) bound to the same `mobileNavOpen`.\n *\n * ## Slots\n * | Attribute | Region |\n * |------------------|-------------------------------------------|\n * | `railPrimary` | Left rail (intrinsic width — the rail component sizes itself; `railWidth` sets its base via `--fold-shell-rail-width`). At ≤768px it becomes the mobile drawer (see `mobileNavOpen`). |\n * | `railSecondary` | Second rail (intrinsic width; a component that collapses to `0` hides itself). |\n * | `header` | Top bar (content column, or full-width — see `headerLayout`). Rendered as `<header>` — project plain elements into it, not another `<header>`. |\n * | *(default)* | The content region — routed pages, floating panels, overlays, banners. Rendered as the document's single `<main>`. **Full-bleed**: the shell adds no gutter, so a page can paint edge-to-edge (a full-width banner, a hero, a bleeding panel). Want the themed page gutter? Wrap the page in `fold-page-layout` — padding is *its* job, not the shell's. |\n * | `footer` | Bottom bar — a player / status strip (`footerBehavior=\"pinned\"`, always in sight) or a legal / support footer (`footerBehavior=\"scroll\"`, revealed at the end of the content). Rendered as `<footer>` (the document's `contentinfo` landmark). **Content-sized and self-collapsing**: an empty slot takes no space (unlike the fixed-height header). Content column, or full-width — see `footerLayout`. |\n *\n * ## Sizing knobs\n * | Input | CSS variable | Default | Meaning |\n * |----------------------|------------------------------------|---------|----------------------------|\n * | `railWidth` | `--fold-shell-rail-width` | `64px` | Base width the primary rail reads (column is intrinsic). |\n * | `headerHeight` | `--fold-shell-header-height` | `56px` | Header row height. |\n * | `headerHeightMobile` | `--fold-shell-header-height-mobile` | `52px` | Header height at ≤768px. |\n *\n * ## Layout knobs\n * | Input | Values | Default | Meaning |\n * |----------------|-----------------------|-----------|--------------------------------------------|\n * | `headerLayout` | `\"inset\" \\| \"full\"` | `\"inset\"` | `inset` = header sits over the content column (rails climb its side); `full` = header spans the full width, above the rails. |\n * | `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\"`. |\n * | `footerBehavior`| `\"pinned\" \\| \"scroll\"`| `\"pinned\"`| `pinned` = the footer is a fixed row, **always in sight** (a player / status bar) — supports `inset` and `full`. `scroll` = the footer flows at the **end of the content**, revealed when you scroll to the bottom (a legal / support footer) — it lives in the content column (inset), and the shell owns the content scroll, so project *flow* content, not a page that manages its own full-height scroll. |\n * | `contentScroll`| `\"clip\" \\| \"auto\"` | `\"clip\"` | `clip` = the shell clips the content region; the page inside owns its scroll (`fold-page-layout`). `auto` = the content region scrolls itself, for plain content. Ignored under `footerBehavior=\"scroll\"`. |\n *\n * ## Elevation (the floating look)\n * The shell owns **structure**, not skin — it drives no `floating` flag. To lift\n * a region into a rounded, shadowed card, put `foldElevated` on the element that\n * paints that region's background (a projected `fold-menu`, an `app-header`, a\n * content wrapper). It composes **per region** — float the rail while the main\n * stays flat, or float them all for an inset dashboard. The shell's only part is\n * the moat: a cell whose content is elevated **pads itself** (`:has`), revealing\n * the page-gutter around the card — padding, so a `height: 100%` region fits\n * with no overflow. `--fold-surface-inset` tunes the gutter. See\n * {@link FoldElevatedDirective}.\n *\n * ## Accessibility\n * The shell renders a **skip-link** as its first Tab stop — jumping keyboard\n * users past the rails straight to the `<main>` content (`skipLinkLabel` sets\n * its text). The `<main>` is focusable (`tabindex=\"-1\"`) so the jump lands; the\n * link moves focus directly rather than following the fragment, so it works\n * under hash routing too.\n *\n * The mobile **drawer is a real modal**, matching the panel host's bar: while\n * open it is a named `role=\"dialog\"` + `aria-modal=\"true\"` (`drawerLabel`), the\n * focus-trap moves focus in and restores it to the trigger on close, and every\n * other region (header, content, footer, second rail) is `inert` — so a\n * screen-reader's virtual cursor can't wander behind the open drawer.\n *\n * **Trigger contract (app-owned).** The shell owns the drawer/dialog; the app\n * owns the hamburger that opens it, so the shell can't set ARIA on that button —\n * it exposes what's needed and documents the wiring. For the pairing to be fully\n * announced, the hamburger should carry `[attr.aria-expanded]=\"navOpen()\"`,\n * `aria-haspopup=\"dialog\"`, and `[attr.aria-controls]=\"shell.drawerId\"` (read the\n * shell via a template ref, `#shell=\"foldAppShell\"`):\n *\n * ```html\n * <fold-app-shell #shell=\"foldAppShell\" [(mobileNavOpen)]=\"navOpen\">\n * <app-menu railPrimary />\n * <header header>\n * <button\n * class=\"hamburger\"\n * aria-haspopup=\"dialog\"\n * [attr.aria-expanded]=\"navOpen()\"\n * [attr.aria-controls]=\"shell.drawerId\"\n * (click)=\"navOpen.set(!navOpen())\"\n * >☰</button>\n * </header>\n * <router-outlet />\n * </fold-app-shell>\n * ```\n *\n * @selector `fold-app-shell`\n *\n * @example\n * ```html\n * <fold-app-shell\n * [railWidth]=\"72\"\n * headerLayout=\"full\"\n * [(mobileNavOpen)]=\"navOpen\"\n * >\n * <app-menu railPrimary foldElevated /><!-- a floating rail; drop it for flat -->\n * <app-workspace-rail railSecondary />\n * <app-header header /><!-- its hamburger toggles navOpen at ≤768px -->\n * <router-outlet />\n * <!-- panels / overlays / banners also go in the default slot -->\n * <app-player footer /><!-- optional; omit it and the footer row collapses -->\n * </fold-app-shell>\n * ```\n */\n@Component({\n selector: \"fold-app-shell\",\n standalone: true,\n exportAs: \"foldAppShell\",\n imports: [FoldSurfaceDirective, NgTemplateOutlet, FocusTrapDirective],\n host: {\n \"[style.--fold-shell-rail-width]\": \"railWidthVar()\",\n \"[style.--fold-shell-header-height]\": \"headerHeightVar()\",\n \"[style.--fold-shell-header-height-mobile]\": \"headerHeightMobileVar()\",\n \"[class.header-full]\": 'headerLayout() === \"full\"',\n \"[class.footer-full]\": 'footerLayout() === \"full\"',\n \"[class.footer-scroll]\": 'footerBehavior() === \"scroll\"',\n \"[class.mobile-drawer]\": 'mobileNav() === \"drawer\"',\n \"[class.mobile-nav-open]\": \"drawerOpen()\",\n \"[class.content-auto]\": 'contentScroll() === \"auto\"',\n },\n templateUrl: \"./app-shell.component.html\",\n styleUrl: \"./app-shell.component.scss\",\n})\nexport class FoldAppShellComponent {\n /** Base width the primary rail reads in px (the column is intrinsic — the rail\n * component sizes itself). Omit to inherit `--fold-shell-rail-width` (64). */\n readonly railWidth = input<number>();\n /** Header row height in px. Omit to inherit `--fold-shell-header-height` (56). */\n readonly headerHeight = input<number>();\n /** Header height at ≤768px in px. Omit to inherit `--fold-shell-header-height-mobile` (52). */\n readonly headerHeightMobile = input<number>();\n\n /** `\"full\"` spans the header across every column, above the rails; `\"inset\"` (default) keeps it over the content column. */\n readonly headerLayout = input<\"inset\" | \"full\">(\"inset\");\n /** `\"full\"` spans the footer across every column, below the rails (the usual player-bar look); `\"inset\"` (default) keeps it under the content column. The footer row is content-sized and collapses to `0` when the slot is empty. Ignored when `footerBehavior=\"scroll\"`. */\n readonly footerLayout = input<\"inset\" | \"full\">(\"inset\");\n /** `\"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. */\n readonly footerBehavior = input<\"pinned\" | \"scroll\">(\"pinned\");\n /**\n * Who owns the content region's scroll:\n * - `\"clip\"` (default) — the shell clips it; the page inside owns its scroll\n * (an `fold-page-layout` is its own scroll box). A full-bleed page paints to\n * the edges and never double-scrolls.\n * - `\"auto\"` — the shell's content region scrolls itself. For plain content\n * that isn't wrapped in a self-scrolling page. Ignored under\n * `footerBehavior=\"scroll\"` (which already makes the region scroll).\n */\n readonly contentScroll = input<\"clip\" | \"auto\">(\"clip\");\n\n /** The skip-link's label — the first Tab stop, jumping keyboard users past the\n * rails straight to `<main>`. Override for a non-English app. */\n readonly skipLinkLabel = input(\"Skip to content\");\n\n /** The mobile drawer's accessible name — it becomes a `role=\"dialog\"` while\n * open, so it must be named. `\"Menu\"` by default (not `\"Navigation\"`, which\n * would echo the `<nav>` landmark inside). Override for a non-English app. */\n readonly drawerLabel = input(\"Menu\");\n\n private readonly document = inject(DOCUMENT);\n\n /** SSR-safe id linking the skip-link to the `<main>` it targets. */\n protected readonly contentId =\n inject(FoldIdService).next(\"fold-shell-content\");\n\n /**\n * SSR-safe id on the mobile drawer (the primary rail). Public and reachable\n * via `exportAs=\"foldAppShell\"` so the app's hamburger can point\n * `aria-controls` at the dialog it opens — see the trigger contract in the\n * class docs.\n */\n readonly drawerId = inject(FoldIdService).next(\"fold-shell-drawer\");\n\n /**\n * How the primary rail's navigation is reached on mobile:\n * - `\"drawer\"` (default) — the built-in off-canvas drawer slides the projected\n * `[railPrimary]` in over a scrim (driven by `mobileNavOpen`).\n * - `\"none\"` — the shell renders **no** mobile nav; the rails just drop out.\n * Compose your own, typically an {@link FoldNavLauncherComponent} bound to the\n * same `mobileNavOpen`, when a curated full-screen tile grid fits better than\n * sliding the desktop rail in.\n */\n readonly mobileNav = input<\"drawer\" | \"none\">(\"drawer\");\n\n /**\n * Two-way: is the mobile nav open?\n *\n * Below the mobile breakpoint the rails drop out; instead of vanishing, the\n * **primary** rail becomes an off-canvas drawer this flag slides in. The app\n * owns the trigger — a mobile-only hamburger in its header, bound\n * `[(mobileNavOpen)]` — and typically flips it back to `false` on navigation;\n * the shell owns the mechanics (slide-in, scrim, `Escape`, focus-trap). It is\n * a no-op above the breakpoint (the rails are always in view there), and it\n * resets to `false` on the way back to a wide viewport so a widened window\n * never keeps a stuck drawer.\n */\n readonly mobileNavOpen = model(false);\n\n /** The shell's own width, kept live by a shared `ResizeObserver` primitive. */\n private readonly width = observeElementWidth();\n\n /** Whether the shell is narrow enough to collapse — tracked from its **own**\n * width, not the viewport, so the drawer engages in step with the CSS\n * collapse whether that fires on `@media` (the shell fills the viewport) or\n * `@container` (an embedded preview). `0` (unmeasured / SSR) reads as wide —\n * the SSR-safe first paint. */\n private readonly isNarrow = computed(() => {\n const w = this.width();\n return w > 0 && w <= MOBILE_BREAKPOINT;\n });\n\n /** The drawer is live only in `drawer` mode, when the shell is narrow **and**\n * open — so the focus-trap and scrim never engage over a full-width rail, nor\n * when a `none`-mode shell defers the mobile nav to a launcher. */\n protected readonly drawerOpen = computed(\n () =>\n this.mobileNav() === \"drawer\" && this.isNarrow() && this.mobileNavOpen(),\n );\n\n constructor() {\n // Widening past the breakpoint closes the drawer so it can't linger as a\n // stuck off-canvas panel once the rails are back in view.\n effect(() => {\n if (!this.isNarrow() && this.mobileNavOpen()) {\n this.mobileNavOpen.set(false);\n }\n });\n }\n\n /** `Escape` closes the drawer — the same contract as the panel host. */\n @HostListener(\"document:keydown.escape\")\n protected onEscape(): void {\n if (this.drawerOpen()) {\n this.mobileNavOpen.set(false);\n }\n }\n\n /** Dismiss the drawer — the scrim's click target. */\n protected closeMobileNav(): void {\n this.mobileNavOpen.set(false);\n }\n\n /**\n * Skip-link activation. Moves focus to `<main>` directly instead of letting\n * the browser follow the `#id` fragment — a hash-routing app (`withHashLocation`)\n * would treat that fragment as a route change. `preventDefault` keeps the URL\n * clean; the anchor keeps its `href` for link semantics and no-JS fallback.\n */\n protected skipToContent(event: Event): void {\n event.preventDefault();\n this.document.getElementById(this.contentId)?.focus();\n }\n\n /* Map each input to its CSS var — `null` when unset so the stylesheet\n variable (or its fallback default) keeps winning; a set input overrides it. */\n protected readonly railWidthVar = computed(() => pxVar(this.railWidth()));\n protected readonly headerHeightVar = computed(() =>\n pxVar(this.headerHeight()),\n );\n protected readonly headerHeightMobileVar = computed(() =>\n pxVar(this.headerHeightMobile()),\n );\n}\n\n/** A px length for a host CSS-var binding, or `null` to leave the var unset. */\nfunction pxVar(value: number | undefined): string | null {\n return value === undefined ? null : `${value}px`;\n}\n","<!-- Skip-link: the first Tab stop — visually hidden until focused, then jumps\n keyboard users past the rails to <main> (which is focusable, tabindex=-1). -->\n<a class=\"skip-link\" [href]=\"'#' + contentId\" (click)=\"skipToContent($event)\">{{\n skipLinkLabel()\n}}</a>\n\n<!-- The primary rail. While the mobile drawer is open it is a real modal dialog\n (named, aria-modal, focus-trapped) and every sibling region is inert — the\n same bar the panel host holds; on desktop it's a plain nav rail. -->\n<div\n class=\"rail-primary\"\n [id]=\"drawerId\"\n foldSurface=\"chrome\"\n [foldFocusTrap]=\"drawerOpen()\"\n [attr.role]=\"drawerOpen() ? 'dialog' : null\"\n [attr.aria-modal]=\"drawerOpen() ? 'true' : null\"\n [attr.aria-label]=\"drawerOpen() ? drawerLabel() : null\"\n tabindex=\"-1\"\n>\n <ng-content select=\"[railPrimary]\" />\n</div>\n<div class=\"rail-secondary\" foldSurface=\"chrome\" [inert]=\"drawerOpen()\">\n <ng-content select=\"[railSecondary]\" />\n</div>\n\n<!-- Mobile drawer scrim — only rendered while the drawer is actually open (the\n shell is narrow AND mobileNavOpen). A darkening veil that dismisses on\n click; Escape and widening close it too. aria-hidden: the focus-trapped\n drawer + Escape are the accessible path, the scrim is a mouse convenience. -->\n@if (drawerOpen()) {\n <div class=\"mobile-scrim\" (click)=\"closeMobileNav()\" aria-hidden=\"true\"></div>\n}\n<header class=\"header\" foldSurface=\"chrome\" [inert]=\"drawerOpen()\">\n <ng-content select=\"[header]\" />\n</header>\n\n<!-- One footer, stamped in one of two positions — a grid row (pinned, always in\n sight) or inside the content scroll (revealed on the way down). A single\n <ng-content> in a template avoids duplicate-selector projection loss. -->\n<ng-template #footerTpl>\n <footer\n class=\"footer\"\n [class.footer-inflow]=\"footerBehavior() === 'scroll'\"\n foldSurface=\"chrome\"\n [inert]=\"drawerOpen()\"\n >\n <ng-content select=\"[footer]\" />\n </footer>\n</ng-template>\n\n<main\n class=\"content\"\n foldSurface=\"page\"\n [id]=\"contentId\"\n tabindex=\"-1\"\n [inert]=\"drawerOpen()\"\n>\n <ng-content />\n @if (footerBehavior() === \"scroll\") {\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n }\n</main>\n@if (footerBehavior() !== \"scroll\") {\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n}\n","/**\n * Categorical auto-colour palettes + the seed→index hash.\n *\n * These are **data**, not semantic tokens: qualitative hues to tell entities\n * apart (avatars, org nodes…), theme-invariant, never a role. They live in TS\n * because a hash consumes them — they don't belong in the token CSS.\n *\n * The active palette is chosen once, app-wide, via {@link FoldPaletteRegistry} so a\n * given seed maps to the SAME colour everywhere (recognition). Consumers never\n * touch these arrays directly — they call `registry.colorFor(seed)`.\n */\n\n/**\n * The seed→hash used to pick a palette index. Kept byte-identical to the app's\n * historical avatar/org-member hash so migrating changes no existing colour.\n */\nexport function foldHashSeed(seed: string): number {\n let hash = 0;\n for (let i = 0; i < seed.length; i += 1) {\n hash = seed.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hash;\n}\n\n/** 10 vivid hues — the default. */\nconst VIVID = [\n \"#63b3ed\",\n \"#68d391\",\n \"#f6ad55\",\n \"#fc8181\",\n \"#b794f4\",\n \"#76e4f7\",\n \"#fbb6ce\",\n \"#f6e05e\",\n \"#4fd1c5\",\n \"#a3bffa\",\n] as const;\n\n/** 10 more, appended after VIVID to form the 20-colour `extended` palette. */\nconst VIVID_EXTRA = [\n \"#f687b3\",\n \"#9ae6b4\",\n \"#fbd38d\",\n \"#feb2b2\",\n \"#d6bcfa\",\n \"#81e6d9\",\n \"#e9d8fd\",\n \"#fefcbf\",\n \"#bee3f8\",\n \"#c6f6d5\",\n] as const;\n\n/** 10 soft, low-saturation hues (same hue order as VIVID). */\nconst PASTEL = [\n \"#a8d8ea\",\n \"#b5ead7\",\n \"#ffdac1\",\n \"#ffb7b2\",\n \"#c7b6e8\",\n \"#b2ebf2\",\n \"#ffc8dd\",\n \"#fdf6a8\",\n \"#a0e7e5\",\n \"#c5cae9\",\n] as const;\n\n/**\n * The curated named palettes. Add an entry → it becomes a usable, typed\n * {@link FoldAutoPaletteName} everywhere. `extended` deliberately starts with the\n * full `vivid` set so switching between them never recolours the first 10.\n */\nexport const FOLD_AUTO_PALETTES = {\n vivid: VIVID,\n extended: [...VIVID, ...VIVID_EXTRA],\n pastel: PASTEL,\n} as const satisfies Record<string, readonly string[]>;\n\n/** A built-in palette name. */\nexport type FoldAutoPaletteName = keyof typeof FOLD_AUTO_PALETTES;\n\n/** A palette to apply: a built-in name, or a consumer's own colour list. */\nexport type FoldPaletteInput = FoldAutoPaletteName | readonly string[];\n\n/** Resolve a name or a raw list to a colour array (empty lists fall back to vivid). */\nexport function foldResolvePalette(input: FoldPaletteInput): readonly string[] {\n const palette = typeof input === \"string\" ? FOLD_AUTO_PALETTES[input] : input;\n return palette.length > 0 ? palette : FOLD_AUTO_PALETTES.vivid;\n}\n","import {\n InjectionToken,\n type Provider,\n Service,\n inject,\n signal,\n} from \"@angular/core\";\nimport {\n foldHashSeed,\n foldResolvePalette,\n type FoldPaletteInput,\n} from \"./palettes\";\n\n/** Bootstrap default for {@link FoldPaletteRegistry} — set via {@link provideFoldPalette}. */\nexport const FOLD_PALETTE_DEFAULT = new InjectionToken<FoldPaletteInput>(\n \"fold.palette.default\",\n);\n\n/**\n * Configure the app-wide auto-colour palette at bootstrap (idiomatic, like\n * `provideRouter`). Accepts a built-in name OR a consumer's own colour list.\n *\n * ```ts\n * // app.config.ts\n * providers: [provideFoldPalette(\"pastel\")] // a built-in\n * providers: [provideFoldPalette(MY_BRAND_COLORS)] // your own list\n * ```\n */\nexport function provideFoldPalette(palette: FoldPaletteInput): Provider {\n return { provide: FOLD_PALETTE_DEFAULT, useValue: palette };\n}\n\n/**\n * The single source of truth for auto-colouring. Root singleton: every consumer\n * reads the SAME active palette, so a given seed (name/id) maps to the same\n * colour everywhere — that is the whole point (recognition). Switch the palette\n * app-wide with {@link use}; each `colorFor` reader recolours reactively.\n */\n@Service()\nexport class FoldPaletteRegistry {\n private readonly _current = signal<readonly string[]>(\n foldResolvePalette(\n inject(FOLD_PALETTE_DEFAULT, { optional: true }) ?? \"vivid\",\n ),\n );\n\n /** The active palette. Reading this in a reactive context tracks switches. */\n readonly current = this._current.asReadonly();\n\n /**\n * Switch the whole app's palette — a built-in name or a custom colour list.\n * Every `colorFor` reader updates in the same frame.\n */\n use(palette: FoldPaletteInput): void {\n this._current.set(foldResolvePalette(palette));\n }\n\n /** Deterministic colour for a seed, from the active palette. Reactive. */\n colorFor(seed: string): string {\n const palette = this._current();\n const idx = Math.abs(foldHashSeed(seed)) % palette.length;\n // `_current` always holds a non-empty palette (foldResolvePalette falls back\n // to `vivid`), so the modulo index resolves; the fallbacks are for the type.\n return palette[idx] ?? palette[0] ?? \"transparent\";\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n} from \"@angular/core\";\nimport { FoldPaletteRegistry } from \"../../../color/palette-registry.service\";\n\n/** Ink for text on a light vs dark categorical fill. */\nconst DARK_INK = \"#1a202c\";\nconst LIGHT_INK = \"#ffffff\";\n\n/**\n * Pick a readable ink for text drawn on `fill`, from its relative luminance —\n * so a custom (dark) palette supplied via `provideFoldPalette` still gets legible\n * initials instead of the fixed dark ink. Non-hex fills fall back to dark ink.\n */\nfunction readableInk(fill: string): string {\n const hex = fill.trim().replace(/^#/, \"\");\n const full =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) {\n return DARK_INK;\n }\n const channel = (i: number): number => {\n const c = parseInt(full.slice(i, i + 2), 16) / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n const luminance =\n 0.2126 * channel(0) + 0.7152 * channel(2) + 0.0722 * channel(4);\n return luminance > 0.4 ? DARK_INK : LIGHT_INK;\n}\n\n/** Fill style — `ghost` dashes the outline (guests). */\nexport type FoldAvatarVariant = \"solid\" | \"ghost\";\n/** Status-ring colour — reuses the `fold-badge` status vocabulary. */\nexport type FoldAvatarRing =\n \"none\" | \"accent\" | \"info\" | \"warning\" | \"alert\" | \"success\";\n/** Status-ring line style — `dotted` reads as scheduled / tentative. */\nexport type FoldAvatarRingStyle = \"solid\" | \"dotted\";\n\n/**\n * `<fold-avatar>` — a user/entity avatar with initials or an image.\n *\n * With `imageUrl` it shows the image; otherwise it shows initials on a\n * deterministic background colour taken from the app-wide {@link FoldPaletteRegistry}\n * (so the same seed is the same colour everywhere, and one `registry.use(...)`\n * recolours every avatar).\n *\n * Three orthogonal state axes compose: `variant` (fill), `muted` (presence —\n * dim for an absence/inactive person), and `ring` + `ringStyle` (a status\n * outline). The component stays domain-agnostic: a screen maps its own states\n * (e.g. absent → `[muted]`, a scheduled arrival → `ring=\"accent\"`\n * `ringStyle=\"dotted\"`), the avatar just draws the primitives.\n *\n * ## Inputs\n *\n * | Input | Type | Default | Description |\n * |-------------|------------------------|-----------|-------------------------------------------------|\n * | `name` | `string` (required) | — | Full name — initials are derived automatically. |\n * | `size` | `'sm' \\| 'md' \\| 'lg'` | `'md'` | Avatar size (20px / 32px / 44px). |\n * | `colorSeed` | `string` | `name` | String used to pick the deterministic colour. |\n * | `variant` | `'solid' \\| 'ghost'` | `'solid'` | `'ghost'` renders a dashed border (for guests). |\n * | `square` | `boolean` | `false` | Square shape with a small radius (for orgs). |\n * | `imageUrl` | `string` | — | Image/logo URL. Replaces initials when set. |\n * | `muted` | `boolean` | `false` | Dim the avatar (same hue, less intense) — absence / inactive. |\n * | `ring` | `FoldAvatarRing` | `'none'` | A status outline (`accent`/`info`/`warning`/`alert`/`success`). |\n * | `ringStyle` | `'solid' \\| 'dotted'` | `'solid'` | Ring line style — `dotted` for scheduled/tentative states. |\n *\n * @selector `fold-avatar`\n */\n@Component({\n selector: \"fold-avatar\",\n standalone: true,\n templateUrl: \"./avatar.component.html\",\n styleUrl: \"./avatar.component.scss\",\n})\nexport class FoldAvatarComponent {\n private readonly palette = inject(FoldPaletteRegistry);\n\n readonly name = input.required<string>();\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n readonly colorSeed = input<string | undefined>(undefined);\n readonly variant = input<FoldAvatarVariant>(\"solid\");\n readonly square = input(false, { transform: booleanAttribute });\n readonly imageUrl = input<string | undefined>(undefined);\n /** Dim the avatar (same hue, less intense) — for an absent / inactive person. */\n readonly muted = input(false, { transform: booleanAttribute });\n /** A status outline; `'none'` draws nothing. */\n readonly ring = input<FoldAvatarRing>(\"none\");\n /** Ring line style — `'dotted'` for scheduled / tentative states. */\n readonly ringStyle = input<FoldAvatarRingStyle>(\"solid\");\n\n /** Readable ink for the initials, derived from the fill's luminance. */\n protected readonly onColor = computed(() => readableInk(this.color()));\n\n readonly initials = computed(() => {\n const n = this.name().trim();\n if (!n) {\n return \"?\";\n }\n const [first = \"\", second = \"\"] = n.split(/\\s+/);\n if (second) {\n return (first.charAt(0) + second.charAt(0)).toUpperCase();\n }\n return n.substring(0, 2).toUpperCase();\n });\n\n /** Deterministic fill from the active palette (via the shared registry). */\n readonly color = computed(() =>\n this.palette.colorFor(this.colorSeed() ?? this.name()),\n );\n}\n","@if (imageUrl()) {\n <div\n class=\"avatar has-image\"\n [class.size-sm]=\"size() === 'sm'\"\n [class.size-md]=\"size() === 'md'\"\n [class.size-lg]=\"size() === 'lg'\"\n [class.shape-square]=\"square()\"\n [class.is-muted]=\"muted()\"\n [attr.data-ring]=\"ring() === 'none' ? null : ring()\"\n [attr.data-ring-style]=\"ringStyle()\"\n [attr.title]=\"name()\"\n >\n <img [src]=\"imageUrl()\" [alt]=\"name()\" class=\"avatar-img\" />\n </div>\n} @else {\n <div\n class=\"avatar\"\n [class.size-sm]=\"size() === 'sm'\"\n [class.size-md]=\"size() === 'md'\"\n [class.size-lg]=\"size() === 'lg'\"\n [class.variant-ghost]=\"variant() === 'ghost'\"\n [class.shape-square]=\"square()\"\n [class.is-muted]=\"muted()\"\n [attr.data-ring]=\"ring() === 'none' ? null : ring()\"\n [attr.data-ring-style]=\"ringStyle()\"\n [style.background]=\"variant() === 'solid' ? color() : ''\"\n [style.color]=\"variant() === 'solid' ? onColor() : ''\"\n [attr.title]=\"name()\"\n >\n {{ initials() }}\n </div>\n}\n","import { booleanAttribute, Component, computed, input } from \"@angular/core\";\nimport {\n FoldAvatarComponent,\n type FoldAvatarRing,\n type FoldAvatarRingStyle,\n} from \"../../content/avatar/avatar.component\";\n\n/**\n * `<fold-avatar-detail>` — an avatar next to one or two lines of text: the\n * canonical \"identity cell\". A bold `primary` line and an optional faded\n * `secondary` line (name + email, entity + subtitle, …). One line centres\n * against the avatar; two lines stack and centre as a block.\n *\n * The avatar's initials/colour derive from `avatarName` when set, else from\n * `primary` — so the common \"same text\" case needs no extra input.\n *\n * ## Inputs\n *\n * | Input | Type | Default | Description |\n * |--------------|------------------------|-----------|----------------------------------------------|\n * | `primary` | `string` (required) | — | Bold first line; default avatar name. |\n * | `secondary` | `string` | `''` | Faded second line; empty → single line. |\n * | `avatarName` | `string` | `primary` | Overrides the name used for initials/colour. |\n * | `size` | `'sm' \\| 'md' \\| 'lg'` | `'md'` | Avatar size. |\n * | `variant` | `'solid' \\| 'ghost'` | `'solid'` | `'ghost'` dashes the avatar (guests). |\n * | `square` | `boolean` | `false` | Square avatar (orgs). |\n * | `imageUrl` | `string` | — | Avatar image; replaces initials when set. |\n * | `muted` | `boolean` | `false` | Dim the avatar (absence / inactive). |\n * | `ring` | `FoldAvatarRing` | `'none'` | Status outline on the avatar. |\n * | `ringStyle` | `'solid' \\| 'dotted'` | `'solid'` | Ring line style (`dotted` = scheduled). |\n *\n * @selector `fold-avatar-detail`\n */\n@Component({\n selector: \"fold-avatar-detail\",\n standalone: true,\n imports: [FoldAvatarComponent],\n templateUrl: \"./avatar-detail.component.html\",\n styleUrl: \"./avatar-detail.component.scss\",\n})\nexport class FoldAvatarDetailComponent {\n readonly primary = input.required<string>();\n readonly secondary = input<string>(\"\");\n readonly avatarName = input<string>(\"\");\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n readonly variant = input<\"solid\" | \"ghost\">(\"solid\");\n readonly square = input(false, { transform: booleanAttribute });\n readonly imageUrl = input<string | undefined>(undefined);\n /** Dim the avatar — absence / inactive (forwarded to `fold-avatar`). */\n readonly muted = input(false, { transform: booleanAttribute });\n /** Status outline colour (forwarded to `fold-avatar`). */\n readonly ring = input<FoldAvatarRing>(\"none\");\n /** Ring line style (forwarded to `fold-avatar`). */\n readonly ringStyle = input<FoldAvatarRingStyle>(\"solid\");\n\n /** Falls back to the primary line when no explicit avatar name is given. */\n readonly resolvedAvatarName = computed(\n () => this.avatarName().trim() || this.primary(),\n );\n\n readonly hasSecondary = computed(() => this.secondary().trim().length > 0);\n}\n","<fold-avatar\n [name]=\"resolvedAvatarName()\"\n [size]=\"size()\"\n [variant]=\"variant()\"\n [square]=\"square()\"\n [imageUrl]=\"imageUrl()\"\n [muted]=\"muted()\"\n [ring]=\"ring()\"\n [ringStyle]=\"ringStyle()\"\n/>\n<span class=\"lines\">\n <span class=\"primary\">{{ primary() }}</span>\n @if (hasSecondary()) {\n <span class=\"secondary\">{{ secondary() }}</span>\n }\n</span>\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n numberAttribute,\n} from \"@angular/core\";\nimport {\n FoldAvatarComponent,\n type FoldAvatarVariant,\n type FoldAvatarRing,\n type FoldAvatarRingStyle,\n} from \"../../content/avatar/avatar.component\";\n\n/** One face in an {@link FoldAvatarListComponent} — the minimum an avatar needs,\n * plus optional per-face identity/state. `variant` lives here (not on the list)\n * because a single member can be a guest among members. */\nexport interface FoldAvatarListItem {\n /** Full name — initials + deterministic colour derive from it. */\n readonly name: string;\n /** Image/logo URL. Replaces the initials when set. */\n readonly imageUrl?: string;\n /** Overrides the string used to pick the deterministic colour (else `name`). */\n readonly colorSeed?: string;\n /** Fill style — `ghost` for a guest among members. */\n readonly variant?: FoldAvatarVariant;\n /** Dim this face — absence / inactive. */\n readonly muted?: boolean;\n /** A status outline on this face. */\n readonly ring?: FoldAvatarRing;\n /** Ring line style for this face (`dotted` = scheduled / tentative). */\n readonly ringStyle?: FoldAvatarRingStyle;\n}\n\n/**\n * `<fold-avatar-list>` — a row of slightly-overlapping avatars (the org-chart\n * \"who sits on this node\" cluster). Past `limit`, the remainder collapses into a\n * trailing `+N` chip (N = total − shown).\n *\n * Each face wears a ring in the surface colour so the overlap reads cleanly;\n * override `--fold-avatar-list-ring` when the list sits on a non-card surface.\n *\n * ## Inputs\n *\n * | Input | Type | Default | Description |\n * |-----------|-------------------------|-----------|----------------------------------------------------------|\n * | `avatars` | `FoldAvatarListItem[]` (required) | — | The faces, in order. |\n * | `limit` | `number` | `0` | Max faces on the line (`0` = all). Extra → a `+N` chip. |\n * | `top` | `'first' \\| 'last'` | `'first'` | Which end stacks on top — the overlap direction. |\n * | `size` | `'sm' \\| 'md' \\| 'lg'` | `'md'` | Avatar size (shared by every face + the chip). |\n * | `square` | `boolean` | `false` | Square faces (orgs) — uniform across the cluster. |\n *\n * Per-face traits (`variant`/`muted`/`ring`/`ringStyle`) live on each\n * `FoldAvatarListItem`, since they vary member-by-member (a guest among members,\n * one person absent, another arriving).\n *\n * @selector `fold-avatar-list`\n *\n * @example\n * ```html\n * <fold-avatar-list [avatars]=\"occupants\" [limit]=\"4\" top=\"first\" />\n * ```\n */\n@Component({\n selector: \"fold-avatar-list\",\n standalone: true,\n imports: [FoldAvatarComponent],\n host: {\n \"[class.size-sm]\": \"size() === 'sm'\",\n \"[class.size-md]\": \"size() === 'md'\",\n \"[class.size-lg]\": \"size() === 'lg'\",\n \"[class.is-square]\": \"square()\",\n },\n templateUrl: \"./avatar-list.component.html\",\n styleUrl: \"./avatar-list.component.scss\",\n})\nexport class FoldAvatarListComponent {\n readonly avatars = input.required<readonly FoldAvatarListItem[]>();\n /** Max faces shown; `0` shows them all. Past it, a `+N` chip closes the row. */\n readonly limit = input(0, { transform: numberAttribute });\n /** `'first'` = the leading face sits on top; `'last'` = the trailing one does. */\n readonly top = input<\"first\" | \"last\">(\"first\");\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n readonly square = input(false, { transform: booleanAttribute });\n\n /** The faces actually rendered (capped at `limit` when it bites). */\n readonly visible = computed(() => {\n const limit = this.limit();\n const all = this.avatars();\n return limit > 0 && all.length > limit ? all.slice(0, limit) : all;\n });\n\n /** How many faces the `+N` chip stands in for (`0` → no chip). */\n readonly overflow = computed(\n () => this.avatars().length - this.visible().length,\n );\n\n /** Paint order: the \"top\" end gets the highest z-index. */\n protected z(index: number): number {\n const count = this.visible().length;\n return this.top() === \"first\" ? count - index : index + 1;\n }\n}\n","@for (a of visible(); track $index) {\n <span class=\"al-item\" [style.z-index]=\"z($index)\">\n <fold-avatar\n [name]=\"a.name\"\n [imageUrl]=\"a.imageUrl\"\n [colorSeed]=\"a.colorSeed\"\n [size]=\"size()\"\n [square]=\"square()\"\n [variant]=\"a.variant ?? 'solid'\"\n [muted]=\"a.muted ?? false\"\n [ring]=\"a.ring ?? 'none'\"\n [ringStyle]=\"a.ringStyle ?? 'solid'\"\n />\n </span>\n}\n@if (overflow() > 0) {\n <span class=\"al-more\" [attr.title]=\"overflow() + ' more'\"\n >+{{ overflow() }}</span\n >\n}\n","import { Component, input } from \"@angular/core\";\n\n/**\n * Semantic colour variants for {@link FoldBadgeComponent}, mapped to design\n * tokens. Shared so other components (e.g. `fold-menu-item`'s badge) can tint a\n * badge from the same vocabulary.\n * - `accent` — teal, general purpose\n * - `info` — purple, informative / categorical\n * - `warning` — amber, attention needed\n * - `alert` — red, critical / error\n * - `success` — green, positive / complete\n */\nexport type FoldBadgeVariant =\n \"neutral\" | \"accent\" | \"info\" | \"warning\" | \"alert\" | \"success\";\n\n/**\n * Badge / tag for labels, statuses, and categories.\n *\n * @selector `fold-badge`\n *\n * @example\n * ```html\n * <fold-badge content=\"In repertoire\" />\n * <fold-badge content=\"Jazz\" radius=\"square\" variant=\"info\" />\n * <fold-badge content=\"Pending\" variant=\"warning\" />\n * ```\n */\n@Component({\n selector: \"fold-badge\",\n standalone: true,\n templateUrl: \"./badge.component.html\",\n // Inline so the component is fully self-contained — no external asset to\n // resolve or ship. Colours/sizes come entirely from fold-ng tokens.\n styleUrl: \"./badge.component.scss\",\n host: {\n \"[class]\": 'variant() + \" \" + radius()',\n },\n})\nexport class FoldBadgeComponent {\n /** Text displayed inside the badge. */\n readonly content = input.required<string>();\n\n /**\n * Border-radius preset.\n * - `pill` — fully rounded (default)\n * - `square` — small radius (like genre tags)\n */\n readonly radius = input<\"pill\" | \"square\">(\"pill\");\n\n /**\n * Semantic colour variant, mapped to design tokens.\n * - `neutral` — dim + unsaturated, for counts and non-semantic tags\n * - `accent` (default) — teal, general purpose\n * - `info` — purple, informative / categorical\n * - `warning` — amber, attention needed\n * - `alert` — red, critical / error\n * - `success` — green, positive / complete\n */\n readonly variant = input<FoldBadgeVariant>(\"accent\");\n}\n","{{ content() }}\n","// The UI icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const UI_ICONS = {\n \"add-doc\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m21.414 5h-4.414v-4.414zm.586 2v17h-20v-21a3 3 0 0 1 3-3h10v7zm-6 7h-3v-3h-2v3h-3v2h3v3h2v-3h3z\"/></svg>',\n \"arrow-back\":\n '<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 12H5M12 19l-7-7 7-7\"/></svg>',\n \"arrow-right\":\n '<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 12h14M12 5l7 7-7 7\"/></svg>',\n bin: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22,4H17V2a2,2,0,0,0-2-2H9A2,2,0,0,0,7,2V4H2V6H4V21a3,3,0,0,0,3,3H17a3,3,0,0,0,3-3V6h2ZM9,2h6V4H9Zm9,19a1,1,0,0,1-1,1H7a1,1,0,0,1-1-1V6H18Z\"/><rect x=\"9\" y=\"10\" width=\"2\" height=\"8\"/><rect x=\"13\" y=\"10\" width=\"2\" height=\"8\"/></svg>',\n calendar:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3.25\" y=\"4.75\" width=\"17.5\" height=\"16\" rx=\"2.25\"/><path d=\"M3.25 9.5h17.5\"/><path d=\"M8 3.25v3\"/><path d=\"M16 3.25v3\"/><path d=\"M7.5 13.25h2\"/><path d=\"M11 13.25h2\"/><path d=\"M14.5 13.25h2\"/><path d=\"M7.5 16.75h2\"/><path d=\"M11 16.75h2\"/></svg>',\n chat: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"/></svg>',\n \"check-circle\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" fill=\"none\"><circle cx=\"24\" cy=\"24\" r=\"24\" fill=\"currentColor\" opacity=\"0.12\"/><path d=\"M16 24l6 6 10-12\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n check:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>',\n \"chevron-down\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M5,9H19l-6.293,6.293a1,1,0,0,1-1.414,0Z\"/></svg>',\n \"chevron-left\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>',\n \"chevron-right\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"/></svg>',\n \"chevron-up\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19,15.293H5L11.293,9a1,1,0,0,1,1.414,0Z\"/></svg>',\n close:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>',\n 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\"><path d=\"M16 18l6-6-6-6M8 6l-6 6 6 6\"/></svg>',\n \"collapse-all\":\n '<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=\"M17 11l-5-5-5 5M17 18l-5-5-5 5\"/></svg>',\n copy: '<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=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>',\n door: '<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 21V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16\"/><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/><circle cx=\"14.5\" cy=\"12.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/></svg>',\n download:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.878,18.122a3,3,0,0,0,4.244,0l3.211-3.211A1,1,0,0,0,15.919,13.5l-2.926,2.927L13,1a1,1,0,0,0-1-1h0a1,1,0,0,0-1,1l-.009,15.408L8.081,13.5a1,1,0,0,0-1.414,1.415Z\"/><path d=\"M23,16h0a1,1,0,0,0-1,1v4a1,1,0,0,1-1,1H3a1,1,0,0,1-1-1V17a1,1,0,0,0-1-1H1a1,1,0,0,0-1,1v4a3,3,0,0,0,3,3H21a3,3,0,0,0,3-3V17A1,1,0,0,0,23,16Z\"/></svg>',\n edit: '<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=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 1 1 3 3L7 19l-4 1 1-4z\"/></svg>',\n \"expand-all\":\n '<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=\"M7 13l5 5 5-5M7 6l5 5 5-5\"/></svg>',\n \"eye-off\":\n '<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=\"M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 11-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/></svg>',\n eye: '<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=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>',\n \"file-add\":\n '<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 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\"/><line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\"/></svg>',\n \"folder-open\":\n '<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 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"/></svg>',\n folder:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M21,3H12.236l-4-2H3A3,3,0,0,0,0,4V23H24V6A3,3,0,0,0,21,3ZM3,3H7.764l4,2H21a1,1,0,0,1,1,1v.881L2,6.994V4A1,1,0,0,1,3,3ZM2,21V8.994l20-.113V21Z\"/></svg>',\n globe:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 3C6.5 3 2 9 2 12s4.5 9 10 9 10-6 10-9-4.5-9-10-9z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>',\n grid: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/></svg>',\n list: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M3 6h18M3 10h18M3 14h18M3 18h18\"/></svg>',\n lock: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/></svg>',\n mail: '<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=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"m3 7 9 6 9-6\"/></svg>',\n menu: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 7h16a1 1 0 0 0 0-2H4a1 1 0 0 0 0 2zm16 4H4a1 1 0 0 0 0 2h16a1 1 0 0 0 0-2zm0 6H4a1 1 0 0 0 0 2h16a1 1 0 0 0 0-2z\"/></svg>',\n \"more-vertical\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><circle cx=\"12\" cy=\"5\" r=\"1.8\"/><circle cx=\"12\" cy=\"12\" r=\"1.8\"/><circle cx=\"12\" cy=\"19\" r=\"1.8\"/></svg>',\n palette:\n '<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=\"M12 2a10 10 0 1 0 3 19.5c-.5-.5-.7-1.3-.5-2 .3-1 1.3-1.5 2.3-1.5H19a3 3 0 0 0 3-3c0-6.6-4.5-13-10-13z\"/><circle cx=\"7.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.5\" cy=\"7.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"13.5\" cy=\"7.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"16.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/></svg>',\n \"playlist-add\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 10H3v2h11v-2zm0-4H3v2h11V6zM3 16h7v-2H3v2zm12 0h2v-3h3v-2h-3v-3h-2v3h-3v2h3v3z\"/></svg>',\n plus: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>',\n minus:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M5 12h14\"/></svg>',\n redo: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.5 7.5h-10a6 6 0 0 0 0 12H17\"/><path d=\"M16.5 3.5l4 4-4 4\"/></svg>',\n reload:\n '<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=\"M1 4v6h6\"/><path d=\"M3.51 15a9 9 0 102.13-9.36L1 10\"/></svg>',\n reset:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>',\n save: '<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 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"/><polyline points=\"17 21 17 13 7 13 7 21\"/><polyline points=\"7 3 7 8 15 8\"/></svg>',\n search:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"></line></svg>',\n sliders:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"/><line x1=\"11\" y1=\"18\" x2=\"13\" y2=\"18\"/></svg>',\n undo: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3.5 7.5h10a6 6 0 0 1 0 12H7\"/><path d=\"M7.5 3.5 3.5 7.5l4 4\"/></svg>',\n ungroup:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 9l-6-6-6 6\"/><path d=\"M12 3v18\"/><path d=\"M3 21h18\"/></svg>',\n upload:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22,16v5a1,1,0,0,1-1,1H3a1,1,0,0,1-1-1V16H0v5a3,3,0,0,0,3,3H21a3,3,0,0,0,3-3V16Z\"/><path d=\"M11.967,0A2.993,2.993,0,0,0,9.845.874L5.926,4.793,7.34,6.207l3.634-3.633L11,19l2,0L12.974,2.588l3.619,3.619,1.414-1.414L14.088.874A2.991,2.991,0,0,0,11.967,0Z\"/></svg>',\n 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>',\n wrench:\n '<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>',\n} as const;\n","// The Navigation icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const NAV_ICONS = {\n absence:\n '<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>',\n 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>',\n company:\n '<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>',\n contracts:\n '<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=\"2.5\" y=\"2.5\" width=\"12\" height=\"17\" rx=\"2\"/><path d=\"M5.5 6.5h3M5.5 9.5h5.5M5.5 12.5h5.5\"/><path d=\"M5.5 15.8l1.6 1.6 3-3.4\"/><path d=\"M12 20.5 14.59 19.16 21.28 8.29 18.72 6.71 12.03 17.58Z\"/><path d=\"M12.03 17.58 14.59 19.16M17.94 7.99 20.49 9.56\"/></svg>',\n help: '<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=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>',\n home: '<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=\"M3 11l9-8 9 8v10a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1z\"/></svg>',\n logout:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M24,1.5V22.5c0,.83-.67,1.5-1.5,1.5s-1.5-.67-1.5-1.5V1.5c0-.83,.67-1.5,1.5-1.5s1.5,.67,1.5,1.5Zm-6.5,9H4.25l3.33-3.46c.57-.6,.56-1.55-.04-2.12-.6-.58-1.55-.56-2.12,.04L1.03,9.52c-.66,.66-1.03,1.54-1.03,2.48s.36,1.81,1.01,2.45l4.41,4.59c.29,.31,.69,.46,1.08,.46s.75-.14,1.04-.42c.6-.57,.62-1.52,.04-2.12l-3.33-3.46h13.25c.83,0,1.5-.67,1.5-1.5s-.67-1.5-1.5-1.5Z\"/></svg>',\n music:\n '<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 17V5l10-2v12\"/><circle cx=\"7\" cy=\"17\" r=\"2.5\"/><circle cx=\"17\" cy=\"15\" r=\"2.5\"/></svg>',\n \"org-chart\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22 11V3h-7v3H9V3H2v8h7V8h2v10h4v3h7v-8h-7v3h-2V8h2v3h7zM7 9H4V5h3v4zm10 6h3v4h-3v-4zm0-10v4h3V5h-3z\"/></svg>',\n planning:\n '<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.25\" y=\"5\" width=\"17.5\" height=\"15.5\" rx=\"2.25\"/><path d=\"M3.25 9h17.5\"/><path d=\"M7.5 5V3.2M12 5V3.2M16.5 5V3.2\"/><circle cx=\"7.5\" cy=\"2.5\" r=\"1.1\"/><circle cx=\"12\" cy=\"2.5\" r=\"1.1\"/><circle cx=\"16.5\" cy=\"2.5\" r=\"1.1\"/><path d=\"M7.9 11.05 10.6 13.75M10.6 11.05 7.9 13.75\"/><rect x=\"13.15\" y=\"10.8\" width=\"3.2\" height=\"3.2\" rx=\"0.6\"/><rect x=\"7.65\" y=\"15.4\" width=\"3.2\" height=\"3.2\" rx=\"0.6\"/><path d=\"M13.4 15.65 16.1 18.35M16.1 15.65 13.4 18.35\"/></svg>',\n program:\n '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m20 0h-16c-2.206 0-4 1.794-4 4v16c0 2.206 1.794 4 4 4h16c2.206 0 4-1.794 4-4v-16c0-2.206-1.794-4-4-4zm-3 6v5h-5v-5zm6 0v5h-5v-5zm-12 5h-5v-5h5zm-5 1h5v5h-5zm0 6h5v5h-5zm6 0h5v5h-5zm0-1v-5h5v5zm6-5h5v5h-5zm5-8v1h-17v-4h14c1.654 0 3 1.346 3 3zm-19-3h1v4h-4v-1c0-1.654 1.346-3 3-3zm-3 19v-14h4v17h-1c-1.654 0-3-1.346-3-3zm19 3h-2v-5h5v2c0 1.654-1.346 3-3 3zm-13.392-14.814c.189-.202.507-.21.707-.021l.853.804c.038.038.084.037.112.01l1.381-1.332c.199-.192.516-.186.707.013.192.199.186.516-.013.707l-1.375 1.325c-.205.205-.477.308-.749.308-.274 0-.55-.104-.76-.314l-.842-.794c-.201-.189-.21-.506-.021-.707zm15.759 11.475c.192.199.186.516-.013.707l-1.375 1.325c-.205.205-.477.308-.749.308-.274 0-.55-.104-.76-.314l-.842-.794c-.201-.189-.21-.506-.021-.707s.507-.21.707-.021l.853.804c.039.037.083.038.112.01l1.381-1.332c.2-.191.516-.185.707.013zm-6.013-5.293-1.375 1.325c-.205.205-.477.308-.749.308-.274 0-.55-.104-.76-.314l-.842-.794c-.201-.189-.21-.506-.021-.707.188-.201.506-.211.707-.021l.853.804c.039.038.083.037.112.01l1.381-1.332c.199-.191.516-.186.707.013.192.199.186.516-.013.707z\"/></svg>',\n settings:\n '<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\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.6 1.6 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.6 1.6 0 0 0-1.8-.3 1.6 1.6 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.6 1.6 0 0 0-1-1.5 1.6 1.6 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.6 1.6 0 0 0 .3-1.8 1.6 1.6 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1A1.6 1.6 0 0 0 4.6 9a1.6 1.6 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.6 1.6 0 0 0 1.8.3H9a1.6 1.6 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.6 1.6 0 0 0 1 1.5 1.6 1.6 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.6 1.6 0 0 0-.3 1.8V9a1.6 1.6 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.6 1.6 0 0 0-1.5 1z\"/></svg>',\n show: '<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=\"4\" width=\"18\" height=\"13\" rx=\"2\"/><path d=\"M8 21h8M12 17v4\"/></svg>',\n stats:\n '<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=\"M3 20h18\"/><rect x=\"5\" y=\"10\" width=\"3\" height=\"10\"/><rect x=\"10.5\" y=\"6\" width=\"3\" height=\"14\"/><rect x=\"16\" y=\"13\" width=\"3\" height=\"7\"/></svg>',\n \"theme-dark\":\n '<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 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></svg>',\n \"theme-light\":\n '<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=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></svg>',\n timeline:\n '<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=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"M3 10h18M8 5v14M13 10v9\"/></svg>',\n library:\n '<svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"32\" y=\"96\" width=\"64\" height=\"368\" rx=\"16\" ry=\"16\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/><line x1=\"112\" y1=\"224\" x2=\"240\" y2=\"224\" style=\"fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px\"/><line x1=\"112\" y1=\"400\" x2=\"240\" y2=\"400\" style=\"fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px\"/><rect x=\"112\" y=\"160\" width=\"128\" height=\"304\" rx=\"16\" ry=\"16\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/><rect x=\"256\" y=\"48\" width=\"96\" height=\"416\" rx=\"16\" ry=\"16\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/><path d=\"M422.46,96.11l-40.4,4.25c-11.12,1.17-19.18,11.57-17.93,23.1l34.92,321.59c1.26,11.53,11.37,20,22.49,18.84l40.4-4.25c11.12-1.17,19.18-11.57,17.93-23.1L445,115C443.69,103.42,433.58,94.94,422.46,96.11Z\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/></svg>',\n} as const;\n","// The Music / transport icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const MUSIC_ICONS = {\n \"fast-forward\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\"/></svg>',\n fire: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M16.074,3.781c-1.39-1.106-2.703-2.152-3.691-3.333L12.006-.002l-.384,.444c-1.491,1.722-1.905,3.821-2.238,5.508-.405,2.051-.654,3.037-1.884,3.037-.198,0-.35-.069-.492-.224-.607-.663-.687-2.586-.594-3.643l.123-1.403-.98,1.011c-1.418,1.463-4.057,4.186-4.057,8.771,0,5.79,4.71,10.5,10.5,10.5s10.5-4.71,10.5-10.5c0-4.603-3.267-7.204-6.426-9.719Zm-6.902,18.048c-1.56-1.562-1.56-4.101-.022-5.639l2.851-2.522,2.828,2.502c1.559,1.561,1.559,4.1,0,5.659-1.559,1.559-4.097,1.561-5.657,0Zm6.643,.365c1.642-1.962,1.563-4.888-.301-6.752l-3.513-3.11-3.536,3.13c-1.843,1.842-1.921,4.766-.279,6.731-3.343-1.473-5.685-4.813-5.685-8.694,0-3.233,1.37-5.396,2.888-7.122,.036,1.015,.221,2.338,.882,3.06,.329,.359,.753,.549,1.229,.549,2.107,0,2.476-1.867,2.865-3.844,.294-1.492,.624-3.164,1.655-4.595,.984,1.066,2.177,2.016,3.431,3.014,2.974,2.368,6.049,4.816,6.049,8.937,0,3.882-2.343,7.222-5.686,8.695Z\"/></svg>',\n \"heart-border\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z\"/></svg>',\n heart:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M17.5.917a6.4,6.4,0,0,0-5.5,3.3A6.4,6.4,0,0,0,6.5.917,6.8,6.8,0,0,0,0,7.967c0,6.775,10.956,14.6,11.422,14.932l.578.409.578-.409C13.044,22.569,24,14.742,24,7.967A6.8,6.8,0,0,0,17.5.917ZM12,20.846c-3.253-2.43-10-8.4-10-12.879a4.8,4.8,0,0,1,4.5-5.05A4.8,4.8,0,0,1,11,7.967h2a4.8,4.8,0,0,1,4.5-5.05A4.8,4.8,0,0,1,22,7.967C22,12.448,15.253,18.416,12,20.846Z\"/></svg>',\n metronome:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m23.532,22.142c-.649,1.164-1.828,1.858-3.154,1.858H3.622c-1.326,0-2.505-.694-3.154-1.858-.655-1.173-.624-2.556.082-3.698L9.017,4.722c.578-.937,1.466-1.533,2.483-1.683V0h1v3.039c1.02.152,1.906.747,2.483,1.683l1.131,1.833-.589.949-1.392-2.256c-.494-.799-1.252-1.242-2.136-1.247-.878.005-1.636.448-2.13,1.247L1.4,18.969c-.512.83-.534,1.834-.059,2.687.47.842,1.323,1.345,2.281,1.345h16.756c.958,0,1.812-.503,2.281-1.345.475-.853.453-1.856-.059-2.687l-4.142-6.712.589-.949,4.403,7.135c.706,1.143.736,2.525.082,3.698Zm-9.247-8.852l6.462-10.401.85.527-6.491,10.449c.552.544.895,1.3.895,2.135,0,1.654-1.346,3-3,3s-3-1.346-3-3,1.346-3,3-3c.46,0,.895.104,1.285.29Zm.715,2.71c0-1.103-.897-2-2-2s-2,.897-2,2,.897,2,2,2,2-.897,2-2Z\"/></svg>',\n microphone:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/></svg>',\n \"music-file\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m14.707,0H4.5c-1.379,0-2.5,1.121-2.5,2.5v21.5h20V7.293L14.707,0Zm.293,1.707l5.293,5.293h-5.293V1.707ZM3,23V2.5c0-.827.673-1.5,1.5-1.5h9.5v7h7v15H3Zm9-10.5v3.001c-.418-.314-.938-.501-1.5-.501-1.379,0-2.5,1.121-2.5,2.5s1.121,2.5,2.5,2.5,2.5-1.121,2.5-2.5v-5c0-.275.225-.5.5-.5h2.5v-1h-2.5c-.827,0-1.5.673-1.5,1.5Zm-1.5,6.5c-.827,0-1.5-.673-1.5-1.5s.673-1.5,1.5-1.5,1.5.673,1.5,1.5-.673,1.5-1.5,1.5Z\"/></svg>',\n \"music-note\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18V5l12-2v13\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><circle cx=\"18\" cy=\"16\" r=\"3\"/></svg>',\n mute: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.796 8.796 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06a8.99 8.99 0 0 0 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"/></svg>',\n \"next-track\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16 6h2v12h-2zM6 18l8.5-6L6 6z\"/></svg>',\n pause:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 4h4v16H6zM14 4h4v16h-4z\"/></svg>',\n \"play-circle\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 14.5v-9l6 4.5-6 4.5z\"/></svg>',\n play: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19.765,9.458,4.98.019v24l14.779-9.473a3.007,3.007,0,0,0,.006-5.088Zm-1.08,3.395-11.7,7.5V3.677l11.707,7.474a1,1,0,0,1-.007,1.7Z\"/></svg>',\n \"prev-track\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/></svg>',\n repeat:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z\"/></svg>',\n rewind:\n '<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>',\n volume:\n '<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>',\n waveform:\n '<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>',\n} as const;\n","// The Status icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const STATUS_ICONS = {\n award:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m23.664,0h-8.475l-2.97,6.003c-.073-.002-.146-.003-.22-.003-.076,0-.152,0-.228.003L8.811,0H.324l4.637,9.399c-1.227,1.538-1.961,3.486-1.961,5.601,0,4.962,4.038,9,9,9s9-4.038,9-9c0-2.121-.738-4.072-1.97-5.612L23.664,0Zm-7.854,1h6.243l-3.751,7.582c-1.334-1.311-3.074-2.209-5.011-2.489l2.52-5.093ZM1.933,1h6.256l2.513,5.094c-1.943.282-3.686,1.186-5.021,2.504L1.933,1Zm18.067,14c0,4.411-3.589,8-8,8s-8-3.589-8-8S7.589,7,12,7s8,3.589,8,8Zm-7.244-5.135h-1.494l-.897,3.135h-3.365v1.453l2.318,1.336-1.081,2.955,1.158.86,2.614-2.074,2.609,2.093,1.205-.831-1.171-2.969,2.347-1.377v-1.445h-3.347l-.896-3.135Zm.652,5.528l1.14,2.892-2.536-2.034-2.535,2.011,1.067-2.919-2.328-1.343h2.902l.89-3.11.89,3.11h2.884l-2.375,1.393Z\"/></svg>',\n clock:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12,24C5.383,24,0,18.617,0,12S5.383,0,12,0s12,5.383,12,12-5.383,12-12,12ZM12,1C5.935,1,1,5.935,1,12s4.935,11,11,11,11-4.935,11-11S18.065,1,12,1Zm5,11.5c0-.276-.224-.5-.5-.5h-4.5V5.5c0-.276-.224-.5-.5-.5s-.5,.224-.5,.5v7c0,.276,.224,.5,.5,.5h5c.276,0,.5-.224,.5-.5Z\"/></svg>',\n completed:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m13,11h4v1h-4v-1ZM21,2v19.5c0,1.378-1.121,2.5-2.5,2.5H5.5c-1.379,0-2.5-1.122-2.5-2.5V2h5.05c.232-1.14,1.243-2,2.45-2h3c1.207,0,2.218.86,2.45,2h5.05Zm-1,1h-5v-.5c0-.827-.673-1.5-1.5-1.5h-3c-.827,0-1.5.673-1.5,1.5v.5h-5v18.5c0,.827.673,1.5,1.5,1.5h13c.827,0,1.5-.673,1.5-1.5V3Zm-11.216,7.952c-.056.056-.18.055-.241-.006l-1.778-1.721-.695.719,1.772,1.716c.221.22.514.341.825.341s.604-.122.821-.339l3.362-3.305-.701-.713-3.365,3.308Zm4.216,7.048h4v-1h-4v1Zm-4.216-1.048c-.056.057-.18.055-.241-.006l-1.778-1.721-.695.719,1.772,1.716c.221.22.514.341.825.341s.604-.122.821-.339l3.362-3.305-.701-.713-3.365,3.308Z\"/></svg>',\n diamond:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m23.517,6.252l-3.691-5.167c-.485-.679-1.273-1.085-2.108-1.085H6.282c-.835,0-1.623.406-2.108,1.085L.483,6.252c-.665.931-.636,2.208.07,3.105l11.447,14.657,11.446-14.655c.707-.899.736-2.177.071-3.107Zm-4.504-4.585s3.764,5.276,3.795,5.333h-5.951l-2.065-6h2.926c.513,0,.997.249,1.295.667Zm-10.812,5.333l2.065-6h3.468l2.065,6h-7.598Zm7.626,1l-3.827,12.675-3.827-12.675h7.653ZM4.987,1.667c.298-.418.782-.667,1.295-.667h2.926l-2.065,6H1.193c.031-.057,3.795-5.333,3.795-5.333Zm-3.967,6.333h6.108l4.013,13.29L1.34,8.74c-.173-.219-.279-.475-.319-.74Zm11.838,13.291l4.013-13.291h6.108c-.04.265-.147.522-.32.742l-9.801,12.548Z\"/></svg>',\n info: '<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=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"11\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>',\n lightning:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M11.762,24h-3.493l3.5-9H5c-.659,0-1.262-.304-1.655-.833-.393-.529-.509-1.195-.318-1.826L8.39,0h8.875l-3.5,8h5.201c.761,0,1.43,.4,1.79,1.071s.324,1.45-.097,2.084l-8.897,12.845Zm-2.031-1h1.507l8.593-12.406c.208-.314,.227-.71,.043-1.05-.183-.341-.522-.544-.909-.544h-6.73L15.735,1h-6.69L3.964,12.686c-.078,.271-.019,.613,.184,.886,.203,.272,.513,.429,.853,.429H13.231l-3.5,9Z\"/></svg>',\n \"offline-bolt\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2.02c-5.51 0-9.98 4.47-9.98 9.98s4.47 9.98 9.98 9.98 9.98-4.47 9.98-9.98S17.51 2.02 12 2.02zM11.48 20v-6.26H8L13 4v6.26h3.35L11.48 20z\"/></svg>',\n shield:\n '<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=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>',\n warning:\n '<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=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>',\n \"x-circle\":\n '<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=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>',\n star: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 .587l3.668 7.431 8.2 1.192-5.934 5.783 1.401 8.169L12 18.897l-7.335 3.855 1.401-8.169L.132 9.21l8.2-1.192z\"/></svg>',\n} as const;\n","// The People icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const PEOPLE_ICONS = {\n briefcase:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/></svg>',\n \"give-rights\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m11,11c0-1.654-1.346-3-3-3H3c-1.654,0-3,1.346-3,3v2h11v-2Zm-5.5-4c1.93,0,3.5-1.57,3.5-3.5S7.43,0,5.5,0s-3.5,1.57-3.5,3.5,1.57,3.5,3.5,3.5Zm18.5,14v3h-13v-3c0-1.654,1.346-3,3-3h7c1.654,0,3,1.346,3,3Zm-6.5-4c2.481,0,4.5-2.019,4.5-4.5s-2.019-4.5-4.5-4.5-4.5,2.019-4.5,4.5,2.019,4.5,4.5,4.5Zm-9.081,1.594c.774.775.774,2.037,0,2.812l-2.507,2.507-1.414-1.414,1.498-1.498h-2.997c-1.654,0-3-1.346-3-3v-3h2v3c0,.552.449,1,1,1h3.006l-1.508-1.498,1.414-1.414,2.506,2.506Z\"/></svg>',\n \"graduation-cap\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2.5 9.5 12 5l9.5 4.5L12 14 2.5 9.5Z\"/><path d=\"M6 11.5v4.25c0 1.5 2.7 2.75 6 2.75s6-1.25 6-2.75V11.5\"/><path d=\"M21 9.5v5\"/></svg>',\n \"group-lead\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7,14c-2.21,0-4-1.79-4-4s1.79-4,4-4,4,1.79,4,4-1.79,4-4,4Zm7,10H0v-5c0-1.65,1.35-3,3-3H11c1.65,0,3,1.35,3,3v5ZM21,0H8c-1.65,0-3,1.35-3,3v1.35c.63-.22,1.3-.35,2-.35,2.74,0,5.05,1.84,5.77,4.35l2.23,2.23,3.59-3.59h-2.59v-2h4c1.1,0,2,.9,2,2v4h-2v-2.59l-5,5-2.15-2.15c-.23,1.06-.74,2.01-1.44,2.78,2.23,.18,4.05,1.81,4.49,3.96h8.1V3c0-1.65-1.35-3-3-3Z\"/></svg>',\n king: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m21,24H3v-3.5c0-2.481,2.019-4.5,4.5-4.5h9c2.481,0,4.5,2.019,4.5,4.5v3.5Zm-3-16H6c0,3.309,2.691,6,6,6s6-2.691,6-6Zm-3-5l-3-3-3,3L6,0v6h12V0l-3,3Z\"/></svg>',\n leader:\n '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m12 14c2.206 0 4-1.794 4-4s-1.794-4-4-4-4 1.794-4 4 1.794 4 4 4zm0-6c1.103 0 2 .897 2 2s-.897 2-2 2-2-.897-2-2 .897-2 2-2zm4-3h-8v-5l2 2.231 2-2.231 2 2.231 2-2.231zm2-3.376v2.396c2.423 1.827 4 4.719 4 7.981s-1.577 6.154-4 7.981v-.981c0-1.654-1.346-3-3-3h-6c-1.654 0-3 1.346-3 3v.981c-2.423-1.827-4-4.719-4-7.981s1.577-6.154 4-7.981v-2.396c-3.581 2.078-6 5.946-6 10.376 0 6.617 5.383 12 12 12s12-5.383 12-12c0-4.43-2.419-8.298-6-10.376zm-10 19.535v-2.159c0-.551.448-1 1-1h6c.552 0 1 .449 1 1v2.159c-1.226.538-2.578.841-4 .841s-2.774-.303-4-.841z\"/></svg>',\n referral:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m16.664,11.497l-3.94,3.503,3.94,3.503-1.328,1.494-4.497-3.997h-1.838v-2h1.838l4.497-3.997,1.328,1.494Zm-13.164-.497c1.381,0,2.5-1.119,2.5-2.5s-1.119-2.5-2.5-2.5-2.5,1.119-2.5,2.5,1.119,2.5,2.5,2.5Zm1.5,1h-3c-1.103,0-2,.897-2,2v2h7v-2c0-1.103-.897-2-2-2Zm15.5-7c1.381,0,2.5-1.119,2.5-2.5s-1.119-2.5-2.5-2.5-2.5,1.119-2.5,2.5,1.119,2.5,2.5,2.5Zm1.5,1h-3c-1.103,0-2,.897-2,2v2h7v-2c0-1.103-.897-2-2-2Zm1,10.5c0-1.381-1.119-2.5-2.5-2.5s-2.5,1.119-2.5,2.5,1.119,2.5,2.5,2.5,2.5-1.119,2.5-2.5Zm-1,3.5h-3c-1.103,0-2,.897-2,2v2h7v-2c0-1.103-.897-2-2-2Z\"/></svg>',\n user: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/></svg>',\n team: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18,8c-2.206,0-4-1.794-4-4S15.794,0,18,0s4,1.794,4,4-1.794,4-4,4Zm-6,7c-2.206,0-4-1.794-4-4s1.794-4,4-4,4,1.794,4,4-1.794,4-4,4Zm-6-7c-2.206,0-4-1.794-4-4S3.794,0,6,0s4,1.794,4,4-1.794,4-4,4Zm12,14v-2.5c0-1.93-1.57-3.5-3.5-3.5h-5c-1.93,0-3.5,1.57-3.5,3.5v2.5H0v2H24v-2h-6ZM7.157,14.532c-.726-.991-1.157-2.211-1.157-3.532,0-.341,.035-.674,.09-1H3.5c-1.933,0-3.5,1.567-3.5,3.5v2.5H5.261c.513-.62,1.161-1.12,1.896-1.468Zm13.343-4.532h-2.59c.055,.326,.09,.659,.09,1,0,1.321-.431,2.54-1.157,3.532,.734,.348,1.383,.849,1.896,1.468h5.261v-2.5c0-1.933-1.567-3.5-3.5-3.5Z\"/></svg>',\n work: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z\"/></svg>',\n} as const;\n","// The Brand icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const BRANDS_ICONS = {\n discord:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028 14.09 14.09 0 001.226-1.994.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z\"/></svg>',\n slack:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z\"/></svg>',\n teams:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19.404 4.5a2.25 2.25 0 110 4.5 2.25 2.25 0 010-4.5zM12 3a3.75 3.75 0 110 7.5A3.75 3.75 0 0112 3zm-9.404 1.5a2.25 2.25 0 110 4.5 2.25 2.25 0 010-4.5zM21 11.25h-3.75a1.5 1.5 0 00-1.5 1.5v6.75A4.5 4.5 0 0020.25 24a3.75 3.75 0 003.75-3.75v-7.5A1.5 1.5 0 0021 11.25zM14.25 12.75v6.75A4.5 4.5 0 019.75 24h-.5A4.5 4.5 0 014.75 19.5v-6.75a1.5 1.5 0 011.5-1.5h6.5a1.5 1.5 0 011.5 1.5z\"/></svg>',\n telegram:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M11.944 0A12 12 0 000 12a12 12 0 0012 12 12 12 0 0012-12A12 12 0 0012 0a12 12 0 00-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 01.171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\"/></svg>',\n whatsapp:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413Z\"/></svg>',\n github:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0 1 12 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"/></svg>',\n linkedin:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.225 0z\"/></svg>',\n fold: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 511 511\" fill=\"currentColor\"><path d=\"M509.807,159.545c0.016-0.026,0.036-0.047,0.052-0.073c0.033-0.053,0.058-0.108,0.09-0.162 c0.078-0.131,0.153-0.263,0.222-0.399c0.047-0.091,0.09-0.183,0.132-0.275c0.06-0.129,0.116-0.259,0.169-0.391 c0.042-0.105,0.08-0.211,0.116-0.317c0.041-0.121,0.081-0.242,0.116-0.366c0.035-0.122,0.066-0.244,0.094-0.367 c0.026-0.111,0.05-0.223,0.071-0.336c0.025-0.138,0.046-0.275,0.063-0.413c0.013-0.103,0.026-0.207,0.034-0.312 c0.013-0.149,0.019-0.298,0.023-0.447c0.002-0.064,0.01-0.126,0.01-0.19c0-0.038-0.005-0.076-0.006-0.114 c-0.002-0.141-0.011-0.282-0.021-0.423c-0.008-0.114-0.015-0.228-0.029-0.341c-0.014-0.116-0.034-0.231-0.053-0.346 c-0.022-0.132-0.043-0.265-0.071-0.394c-0.021-0.094-0.048-0.187-0.072-0.28c-0.038-0.144-0.075-0.288-0.12-0.428 c-0.028-0.086-0.062-0.17-0.093-0.255c-0.052-0.141-0.102-0.281-0.162-0.418c-0.041-0.095-0.089-0.186-0.135-0.279 c-0.059-0.12-0.115-0.241-0.18-0.358c-0.062-0.112-0.131-0.219-0.199-0.328c-0.058-0.093-0.113-0.187-0.175-0.276 c-0.082-0.119-0.172-0.234-0.261-0.349c-0.058-0.075-0.113-0.151-0.174-0.224c-0.093-0.111-0.193-0.216-0.293-0.322 c-0.068-0.072-0.134-0.146-0.205-0.216c-0.093-0.091-0.192-0.177-0.29-0.264c-0.09-0.08-0.18-0.16-0.274-0.235 c-0.086-0.069-0.176-0.133-0.265-0.198c-0.117-0.086-0.234-0.169-0.356-0.248c-0.031-0.02-0.059-0.044-0.091-0.063l-64-40 c-0.044-0.027-0.089-0.048-0.133-0.074c-0.089-0.053-0.176-0.107-0.267-0.156c-0.056-0.03-0.112-0.058-0.168-0.086 c-0.09-0.046-0.181-0.088-0.273-0.13c-0.073-0.034-0.145-0.069-0.22-0.101c-0.052-0.022-0.104-0.041-0.156-0.061 c-0.122-0.048-0.244-0.092-0.367-0.133c-0.045-0.015-0.087-0.035-0.133-0.049c-0.014-0.004-0.028-0.007-0.041-0.011 c-0.044-0.013-0.088-0.024-0.132-0.037c-0.143-0.042-0.286-0.077-0.43-0.11c-0.055-0.012-0.109-0.029-0.164-0.04 c-0.036-0.007-0.072-0.01-0.108-0.017c-0.146-0.027-0.292-0.049-0.439-0.068c-0.105-0.013-0.21-0.026-0.316-0.035 c-0.129-0.011-0.257-0.017-0.386-0.021c-0.123-0.004-0.246-0.007-0.368-0.005c-0.112,0.002-0.223,0.008-0.335,0.015 c-0.044,0.003-0.088,0.003-0.132,0.006c-0.029,0.002-0.058,0.001-0.087,0.004c-0.061,0.006-0.121,0.017-0.181,0.024 c-0.103,0.012-0.206,0.028-0.309,0.044c-0.034,0.005-0.068,0.009-0.101,0.015c-0.046,0.008-0.092,0.011-0.137,0.02 c-0.056,0.011-0.11,0.027-0.165,0.039c-0.103,0.022-0.205,0.049-0.308,0.075c-0.128,0.033-0.255,0.067-0.38,0.107 c-0.11,0.035-0.218,0.074-0.326,0.114c-0.08,0.029-0.161,0.054-0.239,0.086c-0.033,0.013-0.065,0.031-0.098,0.045 c-0.117,0.049-0.231,0.104-0.345,0.159c-0.078,0.038-0.158,0.073-0.235,0.113c-0.008,0.004-0.017,0.007-0.025,0.012l-114.566,61.102 l-68.1-83.234c-0.003-0.004-0.007-0.007-0.01-0.011c-0.021-0.026-0.043-0.051-0.065-0.077c-0.053-0.063-0.111-0.12-0.166-0.181 c-0.106-0.118-0.212-0.237-0.326-0.348c-0.066-0.065-0.139-0.124-0.208-0.186c-0.109-0.099-0.216-0.199-0.331-0.292 c-0.109-0.087-0.225-0.166-0.338-0.248c-0.009-0.006-0.017-0.013-0.026-0.019c-0.075-0.053-0.147-0.111-0.224-0.162 c-0.115-0.076-0.238-0.142-0.358-0.212c-0.091-0.053-0.18-0.11-0.273-0.159c-0.112-0.059-0.23-0.108-0.346-0.161 c-0.107-0.049-0.212-0.103-0.321-0.147c-0.104-0.042-0.212-0.075-0.319-0.112c-0.127-0.045-0.253-0.092-0.382-0.13 c-0.016-0.005-0.032-0.012-0.048-0.016c-0.114-0.033-0.228-0.053-0.342-0.08c-0.103-0.024-0.205-0.052-0.31-0.072 c-0.044-0.008-0.087-0.018-0.131-0.026L24.818,44.114c-0.074-0.013-0.147-0.017-0.221-0.028c-0.135-0.02-0.269-0.039-0.404-0.052 c-0.124-0.012-0.246-0.018-0.369-0.023c-0.117-0.005-0.234-0.009-0.351-0.009c-0.134,0-0.267,0.005-0.4,0.013 c-0.108,0.006-0.217,0.014-0.325,0.024c-0.134,0.013-0.267,0.031-0.399,0.052c-0.11,0.017-0.219,0.036-0.328,0.057 c-0.126,0.025-0.25,0.054-0.374,0.086c-0.115,0.029-0.23,0.061-0.344,0.096c-0.115,0.035-0.227,0.073-0.34,0.114 c-0.119,0.043-0.236,0.088-0.353,0.137c-0.108,0.045-0.213,0.094-0.319,0.144c-0.114,0.054-0.227,0.11-0.339,0.17 c-0.109,0.059-0.215,0.121-0.32,0.185c-0.101,0.061-0.202,0.123-0.301,0.189c-0.116,0.078-0.228,0.16-0.339,0.244 c-0.058,0.044-0.12,0.082-0.177,0.128c-0.027,0.021-0.049,0.045-0.076,0.067c-0.112,0.092-0.219,0.19-0.326,0.289 c-0.077,0.071-0.156,0.141-0.23,0.215c-0.096,0.096-0.185,0.198-0.276,0.299c-0.075,0.084-0.152,0.166-0.222,0.252 c-0.08,0.098-0.154,0.202-0.229,0.305c-0.07,0.095-0.142,0.189-0.207,0.286c-0.068,0.103-0.129,0.21-0.192,0.317 c-0.062,0.104-0.126,0.206-0.182,0.312c-0.056,0.106-0.105,0.217-0.156,0.326c-0.053,0.113-0.108,0.225-0.155,0.34 c-0.044,0.106-0.08,0.216-0.119,0.325c-0.044,0.124-0.09,0.248-0.127,0.374c-0.031,0.104-0.056,0.212-0.083,0.319 c-0.034,0.136-0.068,0.271-0.094,0.408c-0.007,0.035-0.018,0.069-0.024,0.104c-0.014,0.076-0.018,0.151-0.029,0.227 c-0.019,0.132-0.038,0.264-0.05,0.397c-0.012,0.124-0.018,0.247-0.023,0.37c-0.005,0.118-0.009,0.236-0.009,0.354 c0,0.132,0.006,0.263,0.013,0.394c0.006,0.111,0.014,0.221,0.025,0.332c0.013,0.132,0.031,0.262,0.051,0.392 c0.017,0.112,0.037,0.224,0.059,0.335c0.025,0.124,0.053,0.246,0.085,0.368c0.03,0.117,0.062,0.233,0.097,0.349 c0.035,0.113,0.073,0.225,0.113,0.336c0.043,0.119,0.088,0.238,0.137,0.355c0.045,0.107,0.093,0.213,0.143,0.318 c0.054,0.114,0.11,0.227,0.17,0.339c0.058,0.109,0.121,0.214,0.184,0.32c0.061,0.102,0.123,0.203,0.19,0.302 c0.077,0.115,0.159,0.226,0.242,0.336c0.044,0.059,0.082,0.121,0.129,0.179l47.852,59.815H7.5c-0.068,0-0.133,0.008-0.2,0.01 c-0.138,0.004-0.276,0.01-0.414,0.021c-0.121,0.01-0.241,0.024-0.36,0.039c-0.117,0.015-0.234,0.033-0.35,0.053 c-0.132,0.023-0.262,0.051-0.391,0.081c-0.104,0.024-0.207,0.051-0.31,0.08c-0.133,0.037-0.263,0.077-0.393,0.122 c-0.101,0.034-0.201,0.071-0.301,0.11c-0.123,0.048-0.244,0.098-0.363,0.152c-0.106,0.048-0.211,0.099-0.315,0.152 c-0.107,0.055-0.213,0.111-0.317,0.171c-0.111,0.063-0.22,0.13-0.328,0.199c-0.093,0.06-0.184,0.121-0.274,0.184 c-0.11,0.077-0.217,0.158-0.323,0.242c-0.086,0.068-0.169,0.137-0.251,0.208c-0.099,0.086-0.197,0.174-0.292,0.265 c-0.087,0.083-0.17,0.168-0.253,0.255c-0.082,0.086-0.162,0.174-0.24,0.265c-0.091,0.106-0.178,0.215-0.263,0.326 c-0.041,0.053-0.085,0.1-0.125,0.154c-0.023,0.032-0.041,0.065-0.063,0.097c-0.086,0.122-0.165,0.247-0.244,0.373 c-0.053,0.086-0.108,0.172-0.157,0.259c-0.069,0.123-0.132,0.249-0.195,0.376c-0.048,0.097-0.097,0.194-0.141,0.292 c-0.052,0.118-0.097,0.239-0.143,0.36c-0.042,0.111-0.086,0.222-0.123,0.335c-0.036,0.111-0.066,0.225-0.097,0.339 c-0.035,0.126-0.07,0.252-0.097,0.379c-0.023,0.105-0.039,0.212-0.058,0.318c-0.024,0.139-0.048,0.278-0.064,0.418 c-0.012,0.101-0.018,0.203-0.025,0.306c-0.011,0.147-0.02,0.295-0.022,0.442C0.005,123.419,0,123.457,0,123.497 c0,0.068,0.008,0.133,0.01,0.2c0.004,0.138,0.009,0.276,0.021,0.414c0.01,0.121,0.024,0.24,0.039,0.36 c0.015,0.118,0.033,0.235,0.054,0.351c0.023,0.131,0.051,0.261,0.081,0.39c0.025,0.105,0.051,0.209,0.08,0.312 c0.037,0.132,0.077,0.261,0.121,0.39c0.035,0.103,0.072,0.204,0.112,0.305c0.047,0.121,0.097,0.241,0.15,0.359 c0.049,0.108,0.101,0.215,0.154,0.321c0.054,0.105,0.109,0.209,0.167,0.311c0.064,0.113,0.133,0.224,0.203,0.334 c0.058,0.091,0.118,0.181,0.18,0.269c0.078,0.111,0.16,0.22,0.245,0.327c0.067,0.084,0.135,0.167,0.205,0.248 c0.086,0.1,0.175,0.198,0.268,0.294c0.082,0.086,0.167,0.169,0.254,0.251c0.087,0.082,0.174,0.163,0.266,0.242 c0.106,0.091,0.215,0.177,0.325,0.262c0.053,0.041,0.1,0.085,0.155,0.125l172.304,125.312l-31.29,203.386 c-0.004,0.024-0.007,0.048-0.011,0.073l-0.004,0.024c-0.005,0.031-0.005,0.061-0.009,0.092c-0.03,0.213-0.054,0.426-0.066,0.638 c-0.005,0.084-0.002,0.166-0.004,0.249c-0.003,0.159-0.007,0.318-0.001,0.476c0.005,0.124,0.019,0.245,0.03,0.367 c0.011,0.116,0.018,0.232,0.034,0.347c0.02,0.143,0.049,0.284,0.077,0.425c0.019,0.094,0.034,0.189,0.057,0.282 c0.034,0.144,0.077,0.284,0.119,0.425c0.027,0.091,0.052,0.182,0.083,0.272c0.045,0.13,0.097,0.257,0.149,0.385 c0.04,0.099,0.078,0.199,0.123,0.296c0.05,0.109,0.106,0.215,0.161,0.321c0.058,0.112,0.114,0.224,0.177,0.333 c0.051,0.088,0.108,0.172,0.162,0.258c0.076,0.12,0.152,0.24,0.236,0.356c0.053,0.073,0.11,0.143,0.165,0.214 c0.093,0.12,0.186,0.239,0.287,0.354c0.06,0.068,0.125,0.132,0.187,0.199c0.102,0.108,0.203,0.216,0.312,0.318 c0.081,0.076,0.168,0.147,0.253,0.22c0.096,0.083,0.191,0.167,0.292,0.245c0.123,0.096,0.253,0.183,0.383,0.271 c0.071,0.048,0.138,0.099,0.21,0.144c0.181,0.114,0.369,0.218,0.561,0.317c0.027,0.014,0.051,0.03,0.078,0.044 c0.003,0.001,0.006,0.002,0.009,0.004c0.253,0.126,0.514,0.238,0.783,0.336c0.067,0.024,0.135,0.041,0.202,0.063 c0.184,0.061,0.37,0.119,0.561,0.166c0.126,0.031,0.252,0.053,0.378,0.078c0.094,0.018,0.185,0.043,0.281,0.058 c0.032,0.005,0.063,0.003,0.095,0.007c0.347,0.049,0.694,0.082,1.04,0.082c0.004,0,0.008-0.001,0.011-0.001c0.001,0,0.003,0,0.004,0 c0.31,0,0.615-0.026,0.918-0.064c0.06-0.008,0.119-0.015,0.179-0.024c0.619-0.092,1.217-0.261,1.783-0.498 c0.055-0.023,0.109-0.045,0.163-0.069c0.274-0.122,0.541-0.258,0.798-0.412c0.047-0.028,0.091-0.06,0.137-0.089 c0.216-0.136,0.424-0.283,0.625-0.439c0.06-0.046,0.12-0.091,0.178-0.139c0.223-0.185,0.435-0.384,0.636-0.595 c0.05-0.053,0.098-0.108,0.147-0.162c0.202-0.224,0.394-0.458,0.569-0.706c0.005-0.008,0.012-0.015,0.017-0.022 c0.189-0.272,0.356-0.56,0.509-0.858c0.012-0.024,0.029-0.045,0.041-0.069l54.781-109.563l181.501-78.913 c0.049-0.021,0.093-0.048,0.141-0.07c0.145-0.067,0.288-0.137,0.429-0.213c0.013-0.007,0.027-0.013,0.041-0.02 c0.023-0.012,0.046-0.021,0.069-0.034c0.052-0.029,0.1-0.064,0.152-0.094c0.113-0.067,0.225-0.137,0.334-0.21 c0.072-0.048,0.145-0.093,0.215-0.143c0.027-0.019,0.052-0.041,0.079-0.061c0.082-0.06,0.162-0.123,0.241-0.187 c0.019-0.015,0.041-0.025,0.06-0.041c0.019-0.016,0.036-0.034,0.055-0.05c0.07-0.058,0.137-0.117,0.204-0.178 c0.066-0.06,0.13-0.122,0.194-0.183c0.004-0.004,0.008-0.007,0.012-0.011c0.028-0.027,0.058-0.05,0.086-0.078 c0.021-0.021,0.04-0.043,0.061-0.064c0.05-0.052,0.099-0.104,0.148-0.157c0.062-0.068,0.121-0.138,0.181-0.208 c0.058-0.067,0.118-0.133,0.173-0.202c0.032-0.04,0.062-0.08,0.093-0.12c0.025-0.032,0.05-0.064,0.074-0.096 c0.026-0.036,0.049-0.074,0.075-0.11c0.008-0.011,0.015-0.023,0.023-0.034c0.058-0.082,0.118-0.163,0.172-0.247 c0.017-0.027,0.034-0.053,0.051-0.08c0.058-0.093,0.111-0.189,0.165-0.284c0.051-0.09,0.104-0.178,0.151-0.269 c0.002-0.004,0.005-0.008,0.007-0.013c0.007-0.014,0.014-0.028,0.021-0.042c0.054-0.107,0.102-0.219,0.151-0.329 c0.04-0.09,0.083-0.179,0.119-0.271c0.006-0.015,0.013-0.03,0.019-0.045c0.046-0.118,0.084-0.239,0.124-0.36 c0.006-0.017,0.012-0.034,0.018-0.051c0.007-0.022,0.019-0.042,0.026-0.064l0.03-0.096c0.001-0.002,0.001-0.004,0.002-0.006 l33.681-106.656h71.113c0.005,0,0.01,0.001,0.014,0.001c0.017,0,0.034-0.003,0.051-0.003c0.277-0.002,0.549-0.02,0.818-0.051 c0.076-0.009,0.151-0.023,0.226-0.034c0.218-0.032,0.432-0.071,0.643-0.121c0.078-0.018,0.155-0.039,0.232-0.06 c0.216-0.058,0.427-0.126,0.634-0.203c0.065-0.024,0.131-0.046,0.196-0.072c0.269-0.108,0.532-0.227,0.785-0.364 c0.006-0.003,0.012-0.008,0.018-0.011c0.239-0.131,0.468-0.277,0.691-0.433c0.084-0.059,0.165-0.122,0.246-0.184 c0.149-0.113,0.293-0.231,0.432-0.354c0.08-0.071,0.16-0.141,0.237-0.216c0.185-0.178,0.361-0.364,0.526-0.56 c0.019-0.022,0.039-0.041,0.058-0.063C509.476,160.039,509.646,159.795,509.807,159.545z M426.814,130.763l-38.29,121.253 l-57.435-70.199L426.814,130.763z M41.816,62.386l195.301,34.875l-55.8,139.5L41.816,62.386z M374.591,258.674l-180.335-13.872 l55.488-138.719L374.591,258.674z M212.629,337.089L193.3,259.773l167.518,12.886L212.629,337.089z M199.551,346.624l-33.364,66.728 l19.065-123.924L199.551,346.624z M142.792,212.618L30.564,130.997h46.932L142.792,212.618z M443.736,126.989l33.613,21.008h-40.247 L443.736,126.989z\"/></svg>',\n paypal:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M7.076 21.337H2.47a.641.641 0 0 1-.633-.74L4.944.901C5.026.382 5.474 0 5.998 0h7.46c2.57 0 4.578.543 5.69 1.81 1.01 1.15 1.304 2.42 1.012 4.287-.023.143-.047.288-.077.437-.983 5.05-4.349 6.797-8.647 6.797h-2.19c-.524 0-.968.382-1.05.9l-1.12 7.106zm14.146-14.42a3.35 3.35 0 0 0-.607-.541c-.013.076-.026.175-.041.254-.93 4.778-4.005 7.201-9.138 7.201h-2.19a.563.563 0 0 0-.556.479l-1.187 7.527h-.506l-.24 1.516a.56.56 0 0 0 .554.647h3.882c.46 0 .85-.334.922-.788.06-.26.76-4.852.816-5.09a.932.932 0 0 1 .923-.788h.58c3.76 0 6.705-1.528 7.565-5.946.36-1.847.174-3.388-.777-4.471z\"/></svg>',\n x: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/></svg>',\n} as const;\n","import { UI_ICONS } from \"./icons/ui.icons\";\nimport { NAV_ICONS } from \"./icons/nav.icons\";\nimport { MUSIC_ICONS } from \"./icons/music.icons\";\nimport { STATUS_ICONS } from \"./icons/status.icons\";\nimport { PEOPLE_ICONS } from \"./icons/people.icons\";\nimport { BRANDS_ICONS } from \"./icons/brands.icons\";\n\n/**\n * The package's built-in icon set — the shared, reusable catalogue. Keys are\n * **kebab-case** and unique across categories; values are single-colour SVG\n * markup using `currentColor`, so an icon inherits `color` from its host.\n *\n * The SVGs are inlined (not `.svg` file imports) so the package is fully\n * self-contained — no build-tool loader config leaks to a consumer.\n *\n * A consumer extends this set at runtime — never by editing this file — through\n * {@link FoldIconRegistry} (`provideFoldIcons()` at bootstrap, or `register()` later).\n */\nexport const FOLD_BUILTIN_ICONS = {\n ...UI_ICONS,\n ...NAV_ICONS,\n ...MUSIC_ICONS,\n ...STATUS_ICONS,\n ...PEOPLE_ICONS,\n ...BRANDS_ICONS,\n} as const;\n\n/** Every built-in icon name — derived from the registry keys (autocompletes). */\nexport type FoldBuiltinIconName = keyof typeof FOLD_BUILTIN_ICONS;\n\n/**\n * The `name` a `fold-icon` accepts: a built-in (autocompleted + type-checked) or\n * any custom string a consumer has registered. `(string & {})` keeps the\n * built-in literals in autocomplete while still admitting a bare `string`.\n */\nexport type FoldIconName = FoldBuiltinIconName | (string & {});\n","import type { FoldIconSet } from \"./icon-registry.service\";\n\n/**\n * The trust contract for icon markup.\n *\n * A registered icon's markup is injected into the shared sprite **unsanitised**\n * (`insertAdjacentHTML` of the authored `<svg>`, so its `stroke` / `fill` /\n * `viewBox` survive intact). That trust is only sound for **static, authored**\n * markup: never register a string derived from user input.\n *\n * This guard is the backstop, not the sanitiser it cannot be. It rejects the\n * two shapes that have no place in a static icon — a non-`<svg>` root, and\n * `<script>` / inline `on*=` event handlers — so an obvious mistake fails loud\n * at registration instead of silently shipping a stored-XSS sink. It runs on\n * consumer input only; the built-in catalogue is authored in-package.\n */\nconst SVG_ROOT = /^\\s*<svg[\\s>]/i;\nconst UNSAFE = /<script[\\s/>]|\\son\\w+\\s*=/i;\n\n/** Assert a single icon's markup is a static, trusted `<svg>` string. */\nexport function assertSvgIcon(name: string, svg: string): void {\n if (!SVG_ROOT.test(svg)) {\n throw new Error(\n `[fold-icon] icon \"${name}\" must be a literal <svg …> string — ` +\n `icon markup is rendered unsanitised, so it must be static and trusted.`,\n );\n }\n if (UNSAFE.test(svg)) {\n throw new Error(\n `[fold-icon] icon \"${name}\" must not contain <script> or inline event ` +\n `handlers (on*=) — icon markup must be static and trusted.`,\n );\n }\n}\n\n/** Assert every entry of a consumer-supplied icon set passes {@link assertSvgIcon}. */\nexport function assertIconSet(icons: FoldIconSet): void {\n for (const [name, svg] of Object.entries(icons)) {\n assertSvgIcon(name, svg);\n }\n}\n","import {\n InjectionToken,\n type Provider,\n Service,\n type WritableSignal,\n inject,\n signal,\n} from \"@angular/core\";\nimport { FOLD_BUILTIN_ICONS } from \"./builtin-icons\";\nimport { assertIconSet, assertSvgIcon } from \"./icon-safety\";\n\n/** A `name → SVG markup` map — the shape both built-in and custom icons take. */\nexport type FoldIconSet = Readonly<Record<string, string>>;\n\n/** Consumer icons merged in at bootstrap — set via {@link provideFoldIcons}. */\nexport const ICON_OVERRIDES = new InjectionToken<FoldIconSet>(\n \"fold.icons.overrides\",\n);\n\n/**\n * Register app-specific icons at bootstrap (idiomatic, like `provideRouter`).\n * They merge on top of the built-in set — a custom entry with a built-in key\n * overrides it.\n *\n * ```ts\n * // app.config.ts\n * providers: [provideFoldIcons({ \"my-logo\": \"<svg …>…</svg>\" })]\n * ```\n *\n * **Trust contract:** icon markup is rendered unsanitised (see `fold-icon`), so\n * every value must be a static, authored `<svg>` string — never derived from\n * user input. The registry asserts this at seed time and throws on obviously\n * unsafe markup, but it is a backstop, not a sanitiser.\n */\nexport function provideFoldIcons(icons: FoldIconSet): Provider {\n return { provide: ICON_OVERRIDES, useValue: icons };\n}\n\n/**\n * The single source of truth for icon lookup. Root singleton seeded with the\n * package's {@link FOLD_BUILTIN_ICONS}; a consumer adds its own via\n * {@link provideFoldIcons} (bootstrap) or {@link register}/{@link registerMany}\n * (runtime). `fold-icon` resolves every `name` through here.\n *\n * Consumer-supplied markup passes the {@link assertSvgIcon} trust guard on the\n * way in (seed, `register`, `registerMany`); the built-in catalogue is authored\n * in-package and trusted as-is.\n */\n@Service()\nexport class FoldIconRegistry {\n private readonly _icons: WritableSignal<FoldIconSet>;\n\n constructor() {\n const overrides = inject(ICON_OVERRIDES, { optional: true }) ?? {};\n assertIconSet(overrides);\n this._icons = signal<FoldIconSet>({ ...FOLD_BUILTIN_ICONS, ...overrides });\n }\n\n /** Register (or override) a single icon at runtime. */\n register(name: string, svg: string): void {\n assertSvgIcon(name, svg);\n this._icons.update((icons) => ({ ...icons, [name]: svg }));\n }\n\n /** Register (or override) several icons at once. */\n registerMany(icons: FoldIconSet): void {\n assertIconSet(icons);\n this._icons.update((current) => ({ ...current, ...icons }));\n }\n\n /** The SVG markup for a name, or `undefined` if unknown. Reactive. */\n resolve(name: string): string | undefined {\n return this._icons()[name];\n }\n\n /** Whether a name is registered. Reactive. */\n has(name: string): boolean {\n return name in this._icons();\n }\n}\n","/**\n * Shared-sprite plumbing for `fold-icon`.\n *\n * Instead of injecting an icon's markup into every `<fold-icon>` (N copies of\n * the same paths for N instances), each unique icon is added **once** to a\n * hidden document-level sprite as a `<symbol>`, and every instance renders a\n * lightweight `<svg><use href=\"#…\"/></svg>` that references it. The DOM holds\n * one copy of the paths no matter how many times the icon renders.\n */\n\n/** The id prefix shared by every symbol in the sprite. */\nexport const FOLD_ICON_SYMBOL_PREFIX = \"fold-icon-\";\n\n/** The id of the single hidden sprite `<svg>` appended to the document. */\nexport const FOLD_ICON_SPRITE_ID = \"fold-icon-sprite\";\n\n/** The symbol id for an icon name — what a `<use href>` points at. */\nexport function foldIconSymbolId(name: string): string {\n return `${FOLD_ICON_SYMBOL_PREFIX}${name}`;\n}\n\n/**\n * Convert an authored `<svg>…</svg>` string into a `<symbol id=…>…</symbol>`\n * for the sprite. The root `<svg>`'s presentation attributes (`viewBox`,\n * `fill`, `stroke`, `stroke-*`) carry onto the symbol so a `<use>` renders it\n * identically; `xmlns` / `width` / `height` are dropped — the instance `<svg>`\n * owns the rendered size, and `xmlns` is redundant inside an HTML-parsed SVG.\n *\n * Runs on markup already vetted by the registry's trust guard, so the input is\n * a static, well-formed `<svg>`.\n */\nexport function foldIconToSymbol(name: string, svg: string): string {\n const open = /<svg\\b([^>]*)>/i.exec(svg);\n const attrs = (open?.[1] ?? \"\")\n .replace(/\\s+xmlns(:\\w+)?\\s*=\\s*([\"'])[\\s\\S]*?\\2/gi, \"\")\n .replace(/\\s+(width|height)\\s*=\\s*([\"'])[\\s\\S]*?\\2/gi, \"\")\n .trim();\n const inner = svg\n .replace(/^[\\s\\S]*?<svg\\b[^>]*>/i, \"\")\n .replace(/<\\/svg\\s*>\\s*$/i, \"\");\n return `<symbol id=\"${foldIconSymbolId(name)}\"${attrs ? ` ${attrs}` : \"\"}>${inner}</symbol>`;\n}\n","import { DOCUMENT } from \"@angular/common\";\nimport { Service, inject } from \"@angular/core\";\nimport {\n FOLD_ICON_SPRITE_ID,\n foldIconSymbolId,\n foldIconToSymbol,\n} from \"./icon-sprite\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/**\n * The single hidden SVG sprite that backs every `fold-icon`.\n *\n * Root singleton. Each unique icon is added once as a `<symbol>`; instances\n * reference it by id through `<use>`, so the DOM holds one copy of an icon's\n * paths however many times it renders (the win over per-instance `[innerHTML]`).\n *\n * **Lazy:** only icons actually rendered are added, so an SSR page ships just\n * the icons it uses — each once — not the whole catalogue.\n *\n * **SSR + hydration:** on the server the sprite is appended to `<body>` during\n * render and serialised into the HTML, so `<use>` resolves on first paint (no\n * icon flash before hydration). On the client the service adopts that existing\n * sprite instead of creating a second one, and seeds its added-set from the\n * symbols already present — so hydration never double-adds.\n */\n@Service()\nexport class FoldIconSprite {\n private readonly document = inject(DOCUMENT);\n private readonly added = new Set<string>();\n private sprite: Element | null = null;\n\n /** Ensure `name`'s symbol is in the sprite; idempotent. `markup` is the raw,\n * trust-guarded SVG string from the registry. */\n ensure(name: string, markup: string): void {\n const id = foldIconSymbolId(name);\n if (this.added.has(id)) {\n return;\n }\n const sprite = this.resolveSprite();\n if (!sprite) {\n return; // no document body (non-DOM host) — instance renders nothing\n }\n // resolveSprite may have just seeded `added` from an SSR-serialised sprite.\n if (this.added.has(id)) {\n return;\n }\n sprite.insertAdjacentHTML(\"beforeend\", foldIconToSymbol(name, markup));\n this.added.add(id);\n }\n\n /** The mounted sprite, creating it (or adopting the SSR one) on first use. */\n private resolveSprite(): Element | null {\n if (this.sprite) {\n return this.sprite;\n }\n const body = this.document.body;\n if (!body) {\n return null;\n }\n const existing = this.document.getElementById(FOLD_ICON_SPRITE_ID);\n if (existing) {\n existing\n .querySelectorAll(\"symbol[id]\")\n .forEach((symbol) => this.added.add(symbol.id));\n this.sprite = existing;\n return existing;\n }\n const svg = this.document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"id\", FOLD_ICON_SPRITE_ID);\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\n \"style\",\n \"position:absolute;width:0;height:0;overflow:hidden\",\n );\n body.appendChild(svg);\n this.sprite = svg;\n return svg;\n }\n}\n","import { Component, computed, effect, inject, input } from \"@angular/core\";\nimport { FoldIconRegistry } from \"./icon-registry.service\";\nimport { FoldIconSprite } from \"./icon-sprite.service\";\nimport { foldIconSymbolId } from \"./icon-sprite\";\nimport type { FoldIconName } from \"./builtin-icons\";\n\n/** Size presets map to an icon-size token; a number is interpreted as pixels. */\nexport type FoldIconSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n\n/** Preset → `--fold-icon-size-*` token, with a px fallback so an icon still\n * renders if a consumer loads the component without the token layer. */\nconst SIZE_VAR: Record<Exclude<FoldIconSize, number>, string> = {\n xs: \"var(--fold-icon-size-xs, 12px)\",\n sm: \"var(--fold-icon-size-sm, 16px)\",\n md: \"var(--fold-icon-size-md, 20px)\",\n lg: \"var(--fold-icon-size-lg, 24px)\",\n xl: \"var(--fold-icon-size-xl, 32px)\",\n};\n\n/**\n * `fold-icon` — the single surface for all SVG icons.\n *\n * Icons resolve through the {@link FoldIconRegistry} (built-in set + any the\n * consumer registered), keyed by a typed {@link FoldIconName}. Each unique icon\n * is added once to a shared hidden sprite (see {@link FoldIconSprite}); the\n * component itself renders a lightweight `<svg><use href=\"#…\"/></svg>` that\n * references it, so the DOM holds one copy of an icon's paths however many times\n * it renders. Colour + size come from CSS (`currentColor` + a `--icon-size`\n * custom property) and inherit across the `<use>` into the symbol, so the SVG\n * takes its `color` from the host.\n *\n * @selector `fold-icon`\n *\n * @example\n * ```html\n * <fold-icon name=\"search\" />\n * <fold-icon name=\"bin\" size=\"lg\" />\n * <fold-icon name=\"heart\" [size]=\"18\" />\n * <fold-icon name=\"edit\" title=\"Edit track\" /> <!-- a11y label -->\n * ```\n */\n@Component({\n selector: \"fold-icon\",\n standalone: true,\n templateUrl: \"./icon.component.html\",\n styleUrl: \"./icon.component.scss\",\n})\nexport class FoldIconComponent {\n /** Icon name — a built-in (autocompleted) or a consumer-registered string. */\n readonly name = input.required<FoldIconName>();\n\n /** Size — token (`xs…xl`) or explicit pixel number. Defaults to `md`. */\n readonly size = input<FoldIconSize>(\"md\");\n\n /** Optional accessible label. Set → `aria-label`; unset → `aria-hidden`. */\n readonly title = input<string>();\n\n private readonly registry = inject(FoldIconRegistry);\n private readonly sprite = inject(FoldIconSprite);\n\n /** The `#symbol` reference for `<use>`, or null when the name is unknown\n * (renders nothing). Pure — sprite population lives in the effect below. */\n readonly href = computed<string | null>(() =>\n this.registry.has(this.name()) ? `#${foldIconSymbolId(this.name())}` : null,\n );\n\n /** Resolves the size input to a CSS length string for `--icon-size`. */\n readonly sizeVar = computed<string>(() => {\n const s = this.size();\n return typeof s === \"number\" ? `${s}px` : SIZE_VAR[s];\n });\n\n constructor() {\n // Mount the shown icon's symbol in the shared sprite (a DOM side effect, so\n // it lives here and not in `href`), and warn on an unknown name. Reactive:\n // registering an icon later both mounts its symbol and resolves the `<use>`.\n effect(() => {\n const name = this.name();\n const markup = this.registry.resolve(name);\n if (markup) {\n this.sprite.ensure(name, markup);\n } else {\n console.warn(`[fold-icon] unknown icon: \"${name}\"`);\n }\n });\n }\n}\n","<svg\n class=\"icon-root\"\n role=\"img\"\n [attr.aria-label]=\"title() || null\"\n [attr.aria-hidden]=\"title() ? null : 'true'\"\n [style.--icon-size]=\"sizeVar()\"\n>\n @if (href(); as ref) {\n <use [attr.href]=\"ref\" />\n }\n</svg>\n","/**\n * The design tokens, as a typed source-of-truth.\n *\n * These lists are the CONTRACT. The token contract test asserts that the CSS\n * declares exactly these tokens — for colours, that the `:root` (dark) and\n * `[data-theme=\"lumen\"]` blocks each declare exactly the colour set (parity);\n * for scales, that `scales.css` declares exactly the radius/type steps. Add a\n * token here and to the CSS in the same change, or the test fails. That is how\n * the theme stays complete and drift-free.\n *\n * They also power typed `fold*Var` helpers so call sites get autocomplete and a\n * compile error on a misspelt token.\n */\nexport const FOLD_SEMANTIC_COLOR_TOKENS = [\n /* ── Surfaces ─────────────────────────────────────────────── */\n /** Page background — the surface behind everything. */\n \"bg-page\",\n /** Top header bar. */\n \"bg-header\",\n /** Rail 1 — the app menu. */\n \"bg-rail-primary\",\n /** Rail 2 — the workspace menu. */\n \"bg-rail-secondary\",\n /** Rail 3 — tertiary nav (e.g. a `fold-tab-nav` section sidebar). */\n \"bg-rail-tertiary\",\n\n /* ── Primary / accent ─────────────────────────────────────── */\n /** Primary / accent — brand teal (solid). */\n \"primary\",\n /** Primary in a hover/active state. */\n \"primary-strong\",\n /** Text or icon rendered on top of a solid `primary` fill. */\n \"on-primary\",\n /** Readable primary tint for text on a `primary-surface`. */\n \"primary-text\",\n /** Faint primary-tinted background (chips, highlights). */\n \"primary-surface\",\n /** Border for a `primary-surface`. */\n \"primary-border\",\n\n /* ── Info (purple) ────────────────────────────────────────── */\n \"info\",\n \"info-text\",\n \"info-surface\",\n \"info-border\",\n\n /* ── Warning (amber) ──────────────────────────────────────── */\n \"warning\",\n \"warning-text\",\n \"warning-surface\",\n \"warning-border\",\n\n /* ── Alert (red) ──────────────────────────────────────────── */\n \"alert\",\n \"alert-text\",\n \"alert-surface\",\n \"alert-border\",\n\n /* ── Success (green) ──────────────────────────────────────── */\n \"success\",\n \"success-text\",\n \"success-surface\",\n \"success-border\",\n\n /* ── Text ─────────────────────────────────────────────────── */\n /** Default body text. */\n \"text\",\n /** De-emphasised text. */\n \"text-secondary\",\n /** Faint / hint text. */\n \"text-muted\",\n /** Dimmest text — counts, hints. */\n \"text-faded\",\n\n /* ── Neutral surfaces + border ────────────────────────────── */\n /** Solid raised content surface (cards, panels). */\n \"surface-card\",\n /** Deeper solid surface for large containers (tables, page-level cards). */\n \"surface-sunken\",\n /** Faint tinted fill (idle chips, subtle rows). */\n \"surface-subtle\",\n /** Slightly stronger fill (raised). */\n \"surface-raised\",\n /** Solid raised hover surface (list rows, menu/tab items). */\n \"surface-hover\",\n /** Neutral hairline border. */\n \"border\",\n /** Fainter hairline — row dividers, subtle edges (below `border`). */\n \"border-subtle\",\n\n /* ── Glass ────────────────────────────────────────────────── */\n /** Translucent frosted overlay (panels, floating menus). */\n \"glass\",\n /** Hairline border on a glass surface. */\n \"glass-border\",\n\n /* ── Scrim ────────────────────────────────────────────────── */\n /** Darkening veil behind a modal layer (the mobile nav drawer). */\n \"scrim\",\n] as const;\n\nexport type FoldSemanticColorToken =\n (typeof FOLD_SEMANTIC_COLOR_TOKENS)[number];\n\n/** Border-radius scale. `lg` is a real large radius; `pill` is the capsule. */\nexport const FOLD_RADIUS_TOKENS = [\n \"xs\",\n \"sm\",\n \"md\",\n \"lg\",\n \"pill\",\n \"round\",\n] as const;\n\nexport type FoldRadiusToken = (typeof FOLD_RADIUS_TOKENS)[number];\n\n/** Type (font-size) scale. */\nexport const FOLD_TEXT_TOKENS = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nexport type FoldTextToken = (typeof FOLD_TEXT_TOKENS)[number];\n\n/** Icon-size scale — the length a `fold-icon` renders at, per size preset. */\nexport const FOLD_ICON_SIZE_TOKENS = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nexport type FoldIconSizeToken = (typeof FOLD_ICON_SIZE_TOKENS)[number];\n\n/** Space (gap / padding / margin) scale. */\nexport const FOLD_SPACE_TOKENS = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nexport type FoldSpaceToken = (typeof FOLD_SPACE_TOKENS)[number];\n\n/** Motion scale — `transition` shorthands (duration + easing). */\nexport const FOLD_MOTION_TOKENS = [\"fast\", \"base\", \"slow\"] as const;\n\nexport type FoldMotionToken = (typeof FOLD_MOTION_TOKENS)[number];\n\n/** Backdrop-blur radii (`--fold-blur-*`). */\nexport const FOLD_BLUR_TOKENS = [\"glass\"] as const;\n\nexport type FoldBlurToken = (typeof FOLD_BLUR_TOKENS)[number];\n\n/**\n * Elevation scale — full `box-shadow` values. The shared depth language: a\n * component never spells its own shadow, it names a level. Theme-invariant\n * (black ink via `color-mix`, which reads acceptably on both themes), so they\n * live with the scales. `panel-*` are the directional side-panel shadows.\n */\nexport const FOLD_SHADOW_TOKENS = [\n \"sm\",\n \"md\",\n \"lg\",\n \"panel-right\",\n \"panel-left\",\n] as const;\n\nexport type FoldShadowToken = (typeof FOLD_SHADOW_TOKENS)[number];\n\n/** The full custom-property name for a semantic colour token. */\nexport function foldColorProperty(token: FoldSemanticColorToken): string {\n return `--fold-color-${token}`;\n}\n\n/** A ready-to-use `var(--fold-color-…)` reference for a semantic colour token. */\nexport function foldColorVar(token: FoldSemanticColorToken): string {\n return `var(${foldColorProperty(token)})`;\n}\n\n/** A ready-to-use `var(--fold-radius-…)` reference. */\nexport function foldRadiusVar(token: FoldRadiusToken): string {\n return `var(--fold-radius-${token})`;\n}\n\n/** A ready-to-use `var(--fold-text-…)` reference. */\nexport function foldTextVar(token: FoldTextToken): string {\n return `var(--fold-text-${token})`;\n}\n\n/** A ready-to-use `var(--fold-icon-size-…)` reference. */\nexport function foldIconSizeVar(token: FoldIconSizeToken): string {\n return `var(--fold-icon-size-${token})`;\n}\n\n/** A ready-to-use `var(--fold-space-…)` reference. */\nexport function foldSpaceVar(token: FoldSpaceToken): string {\n return `var(--fold-space-${token})`;\n}\n\n/** A ready-to-use `var(--fold-motion-…)` reference. */\nexport function foldMotionVar(token: FoldMotionToken): string {\n return `var(--fold-motion-${token})`;\n}\n\n/** A ready-to-use `var(--fold-blur-…)` reference. */\nexport function foldBlurVar(token: FoldBlurToken): string {\n return `var(--fold-blur-${token})`;\n}\n\n/** A ready-to-use `var(--fold-shadow-…)` reference. */\nexport function foldShadowVar(token: FoldShadowToken): string {\n return `var(--fold-shadow-${token})`;\n}\n","import { Component, computed, input } from \"@angular/core\";\nimport { foldIconSizeVar } from \"../../../tokens/tokens.catalog\";\nimport type { FoldIconSizeToken } from \"../../../tokens/tokens.catalog\";\n\n/** Spinner size — an icon-size token (`xs…xl`) or an explicit pixel number. */\nexport type FoldSpinnerSize = FoldIconSizeToken | number;\n\n/**\n * `fold-spinner` — an indeterminate loading indicator: a rotating arc drawn in\n * `currentColor`, sized off the same scale as `fold-icon` so it drops into a\n * button in place of its glyph without shifting layout.\n *\n * Give it a `label` when it stands alone (it becomes `role=\"status\"` +\n * `aria-label`, so assistive tech announces the wait). Leave `label` unset when\n * it lives inside something that already announces busy-ness (a button with\n * `aria-busy`) — it then renders `aria-hidden`, purely decorative.\n *\n * Honours `prefers-reduced-motion`: the rotation stops and a fuller static ring\n * is shown instead, so the indicator still reads as \"busy\" without animating.\n *\n * @selector `fold-spinner`\n *\n * @example\n * ```html\n * <fold-spinner label=\"Loading contracts\" />\n * <fold-spinner size=\"sm\" /> <!-- decorative, inside a busy control -->\n * <fold-spinner [size]=\"18\" />\n * ```\n */\n@Component({\n selector: \"fold-spinner\",\n standalone: true,\n templateUrl: \"./spinner.component.html\",\n styleUrl: \"./spinner.component.scss\",\n host: {\n \"[style.--fold-spinner-size]\": \"sizeVar()\",\n \"[attr.role]\": \"label() ? 'status' : null\",\n \"[attr.aria-label]\": \"label() ?? null\",\n \"[attr.aria-hidden]\": \"label() ? null : 'true'\",\n },\n})\nexport class FoldSpinnerComponent {\n /** Size — an icon-size token (`xs…xl`, default `md`) or a pixel number. */\n readonly size = input<FoldSpinnerSize>(\"md\");\n\n /** Accessible label. Set → `role=\"status\"` + `aria-label`; unset → decorative. */\n readonly label = input<string>();\n\n /** Resolves the size to a CSS length for `--fold-spinner-size`. */\n readonly sizeVar = computed<string>(() => {\n const s = this.size();\n return typeof s === \"number\" ? `${s}px` : foldIconSizeVar(s);\n });\n}\n","<svg class=\"fold-spinner-svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle class=\"fold-spinner-track\" cx=\"12\" cy=\"12\" r=\"9\" />\n <circle class=\"fold-spinner-head\" cx=\"12\" cy=\"12\" r=\"9\" />\n</svg>\n","import {\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldIconSize } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type {\n FoldButtonEmphasis,\n FoldButtonIntent,\n FoldButtonShape,\n FoldButtonSize,\n} from \"./button.types\";\n\n/** Leading/trailing icon size, derived from the button `size`. */\nconst ICON_SIZE: Record<FoldButtonSize, FoldIconSize> = {\n sm: 14,\n md: 16,\n lg: 18,\n};\n\n/**\n * `[foldButton]` — the design-system button, applied to a **real** `<button>`\n * or `<a>` (never a custom tag). The host element stays a native control, so it\n * keeps everything the platform gives it: a `<button>` gets `type`/`disabled`\n * and form submission; an `<a>` gets `href`/`routerLink`/`target`. This mirrors\n * how Angular Material ships `matButton`, and it's why a \"link that looks like a\n * button\" needs no second component.\n *\n * The label is projected (text, icons, or both). `variant` + `size` + `shape`\n * apply as host classes so the surface stays token-only. Use native `(click)` —\n * on a disabled button the platform blocks it; on a disabled anchor the surface\n * is `pointer-events: none` and activation is prevented.\n *\n * @example\n * ```html\n * <button foldButton (click)=\"save()\">Save</button>\n * <button foldButton emphasis=\"outline\" intent=\"neutral\" size=\"sm\" (click)=\"cancel()\">Cancel</button>\n * <button foldButton emphasis=\"solid\" intent=\"danger\" (click)=\"delete()\">Delete</button>\n * <button foldButton [disabled]=\"!form.valid\" type=\"submit\">Submit</button>\n * <a foldButton emphasis=\"outline\" intent=\"neutral\" routerLink=\"/contracts\">Contracts</a>\n * ```\n *\n * A `foldButton` expects a **text label** (projected) for its accessible name.\n * For an icon-only affordance use `fold-button-icon` (which takes a `tooltip`);\n * the leading/trailing `icon` inputs here are decorations beside a label.\n *\n * @selector `button[foldButton], a[foldButton]`\n */\n@Component({\n selector: \"button[foldButton], a[foldButton]\",\n standalone: true,\n imports: [FoldIconComponent, FoldSpinnerComponent],\n templateUrl: \"./button.component.html\",\n styleUrl: \"./button.component.scss\",\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n \"[class]\":\n '\"fold-button \" + emphasis() + \" \" + intent() + \" \" + size() + \" \" + shape()',\n \"[class.block]\": \"block()\",\n \"[class.is-disabled]\": \"disabled()\",\n \"[class.is-loading]\": \"loading()\",\n // Loading blocks interaction like disabled, but keeps the surface lit (spinner\n // shown) rather than dimmed. <button> takes native disabled + type; <a> can't,\n // so it gets the ARIA equivalents (the surface is pointer-events:none either way).\n \"[attr.disabled]\": \"isButton && blocked() ? true : null\",\n \"[attr.type]\": \"isButton ? type() : null\",\n \"[attr.aria-disabled]\": \"!isButton && blocked() ? true : null\",\n \"[attr.aria-busy]\": \"loading() ? true : null\",\n \"[attr.tabindex]\": \"!isButton && blocked() ? -1 : null\",\n \"(click)\": \"onClick($event)\",\n },\n})\nexport class FoldButtonComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** True when the host is a `<button>` (vs an `<a>`) — fixed for the element's life. */\n protected readonly isButton =\n this.host.nativeElement.tagName.toLowerCase() === \"button\";\n\n /**\n * Fill level — `soft` (default, tinted surface) · `solid` (filled) · `outline`\n * (transparent + hairline). The *how loud* axis; pair with {@link intent}.\n */\n readonly emphasis = input<FoldButtonEmphasis>(\"soft\");\n\n /**\n * Semantic intent — `primary` (default, accent) · `neutral` · `warning` ·\n * `danger`. The *what it means* axis. Orthogonal to {@link emphasis}, so e.g.\n * `emphasis=\"solid\" intent=\"danger\"` is a filled destructive button.\n */\n readonly intent = input<FoldButtonIntent>(\"primary\");\n\n /** Size preset controlling font-size, padding, and radius. */\n readonly size = input<FoldButtonSize>(\"md\");\n\n /** Corner shape — `rounded` (default) or `pill` (fully rounded). */\n readonly shape = input<FoldButtonShape>(\"rounded\");\n\n /** Stretch to fill the container's width (block-level) instead of hugging its label. */\n readonly block = input(false, { transform: booleanAttribute });\n\n /**\n * Leading icon — a shorthand for the common \"icon + label\" button. The size\n * is derived from {@link size}, so it stays consistent. For anything else\n * (trailing content, custom markup) project it instead.\n */\n readonly icon = input<FoldIconName>();\n /** Trailing icon (after the label). */\n readonly iconTrailing = input<FoldIconName>();\n\n /** Icon size for {@link icon} / {@link iconTrailing}, from the button size. */\n readonly iconSize = computed<FoldIconSize>(() => ICON_SIZE[this.size()]);\n\n /**\n * Native `type` of the host — only meaningful on a `<button>` (ignored on an\n * `<a>`). Defaults to `button` so a form-embedded button never submits by\n * accident.\n */\n readonly type = input<\"button\" | \"submit\" | \"reset\">(\"button\");\n\n /** Disable the control — dims it and blocks activation (native on a button, ARIA on an anchor). */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Show a spinner in place of the leading icon and go busy: blocks activation\n * and sets `aria-busy`, but keeps the surface lit (not dimmed like `disabled`).\n * The spinner is icon-sized, so the button width doesn't jump.\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Interaction is blocked while disabled OR loading. */\n protected readonly blocked = computed(\n () => this.disabled() || this.loading(),\n );\n\n /** Swallow activation while blocked (covers keyboard-activated anchors). */\n onClick(event: Event): void {\n if (this.blocked()) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n","@if (loading()) {\n <fold-spinner [size]=\"iconSize()\" aria-hidden=\"true\" />\n} @else if (icon(); as ic) {\n <fold-icon [name]=\"ic\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n}\n<ng-content />\n@if (iconTrailing(); as ic) {\n <fold-icon [name]=\"ic\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n}\n","import {\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldIconSize } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type {\n FoldButtonIconShape,\n FoldButtonIconSize,\n FoldButtonIconTone,\n} from \"./button-icon.types\";\n\n/**\n * `<fold-button-icon>` — the icon-only **momentary** button: a one-shot action\n * whose label is the icon (toolbars, transport, inline row actions, carets, …).\n * It never claims a pressed state — no `aria-pressed` — so assistive tech reads\n * it as a plain button. For a binary on/off control (mute, mask, pin), use\n * `fold-toggle-icon`. For a button with text, use `fold-button`.\n *\n * `shape` / `size` / `tone` surface as `data-*` attributes so the token-only\n * SCSS targets them (the surface is shared with `fold-toggle-icon`). A `tooltip`\n * sets both `title` and `aria-label` — strongly recommended, since there is no\n * visible label.\n *\n * @example\n * ```html\n * <fold-button-icon icon=\"edit\" tooltip=\"Edit\" (clicked)=\"edit()\" />\n * <fold-button-icon icon=\"play\" shape=\"round\" tone=\"accent\" size=\"lg\" (clicked)=\"play()\" />\n * <fold-button-icon icon=\"bin\" tone=\"critical\" tooltip=\"Delete\" (clicked)=\"delete()\" />\n * ```\n *\n * @selector `fold-button-icon`\n */\n@Component({\n selector: \"fold-button-icon\",\n standalone: true,\n imports: [FoldIconComponent, FoldSpinnerComponent],\n templateUrl: \"./button-icon.component.html\",\n styleUrl: \"./button-icon.component.scss\",\n host: {\n \"[attr.data-shape]\": \"shape()\",\n \"[attr.data-size]\": \"size()\",\n \"[attr.data-tone]\": \"tone()\",\n \"[attr.data-loading]\": \"loading() ? '' : null\",\n },\n})\nexport class FoldButtonIconComponent {\n /** Icon to render (typed against the registry). */\n readonly icon = input.required<FoldIconName>();\n\n /** Surface shape — `square` (default) or `round` (transport, big actions). */\n readonly shape = input<FoldButtonIconShape>(\"square\");\n\n /** Hit-area preset — `xs` 22px · `sm` 28px · `md` 32px (default) · `lg` 38px. */\n readonly size = input<FoldButtonIconSize>(\"md\");\n\n /** Visual tone — `ghost` (default) · `accent` (filled) · `critical` (alert). */\n readonly tone = input<FoldButtonIconTone>(\"ghost\");\n\n /** Disable the button — dims it and blocks pointer events. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Swap the icon for a spinner and go busy — blocks activation, stays lit. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Tooltip text — sets both `title` and `aria-label`. Strongly recommended. */\n readonly tooltip = input<string>();\n\n /** Native `type` of the inner `<button>`. */\n readonly type = input<\"button\" | \"submit\">(\"button\");\n\n /** Emitted on click (passes the native `MouseEvent`). */\n readonly clicked = output<MouseEvent>();\n\n /** Resolves the icon size from the button size preset. */\n readonly iconSize = computed<FoldIconSize>(() => {\n switch (this.size()) {\n case \"xs\":\n return \"xs\"; // 12px\n case \"sm\":\n return \"sm\"; // 16px\n case \"md\":\n return \"sm\"; // 16px in a 32px hit-area\n case \"lg\":\n return \"md\"; // 20px in a 38px hit-area\n }\n });\n\n onClick(e: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n return;\n }\n this.clicked.emit(e);\n }\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.title]=\"tooltip() || null\"\n [attr.aria-label]=\"tooltip() || null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (click)=\"onClick($event)\"\n>\n @if (loading()) {\n <fold-spinner [size]=\"iconSize()\" aria-hidden=\"true\" />\n } @else {\n <fold-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n }\n</button>\n","import {\n Component,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldIconSize } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type {\n FoldButtonIconShape,\n FoldButtonIconSize,\n FoldButtonIconTone,\n} from \"../button-icon/button-icon.types\";\n\n/**\n * `<fold-toggle-icon>` — the icon-only **toggle** button: a binary on/off\n * control whose label is the icon (mute, mask, pin, loop, show/hide). It renders\n * a pressed surface while on and **always** carries `aria-pressed` (`true`/\n * `false`), so assistive tech announces it as a toggle. Two-way bind the state\n * with `[(active)]`. For a one-shot action (delete, play-once, open), use\n * `fold-button-icon` — a momentary button that never claims a pressed state.\n *\n * Shares the icon-button surface (shape / size / tone) with `fold-button-icon`;\n * the two differ only in semantics, so their `shape` / `size` / `tone` inputs\n * and types are identical.\n *\n * @example\n * ```html\n * <fold-toggle-icon icon=\"eye\" tooltip=\"Toggle mask\" [(active)]=\"masked\" />\n * <fold-toggle-icon icon=\"repeat\" tooltip=\"Loop\" [(active)]=\"looping\" />\n * ```\n *\n * @selector `fold-toggle-icon`\n */\n@Component({\n selector: \"fold-toggle-icon\",\n standalone: true,\n imports: [FoldIconComponent, FoldSpinnerComponent],\n templateUrl: \"./toggle-icon.component.html\",\n styleUrl: \"./toggle-icon.component.scss\",\n host: {\n \"[attr.data-shape]\": \"shape()\",\n \"[attr.data-size]\": \"size()\",\n \"[attr.data-tone]\": \"tone()\",\n \"[attr.data-active]\": 'active() ? \"\" : null',\n \"[attr.data-loading]\": \"loading() ? '' : null\",\n },\n})\nexport class FoldToggleIconComponent {\n /** Icon to render (typed against the registry). */\n readonly icon = input.required<FoldIconName>();\n\n /** Surface shape — `square` (default) or `round`. */\n readonly shape = input<FoldButtonIconShape>(\"square\");\n\n /** Hit-area preset — `xs` 22px · `sm` 28px · `md` 32px (default) · `lg` 38px. */\n readonly size = input<FoldButtonIconSize>(\"md\");\n\n /** Visual tone — `ghost` (default) · `accent` · `critical`. */\n readonly tone = input<FoldButtonIconTone>(\"ghost\");\n\n /** Two-way toggle state — renders pressed and drives `aria-pressed`. */\n readonly active = model<boolean>(false);\n\n /** Disable the button — dims it and blocks pointer events. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Swap the icon for a spinner and go busy — blocks toggling, stays lit. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Tooltip text — sets both `title` and `aria-label`. Strongly recommended. */\n readonly tooltip = input<string>();\n\n /** Native `type` of the inner `<button>`. */\n readonly type = input<\"button\" | \"submit\">(\"button\");\n\n /** Emitted on toggle (passes the native `MouseEvent`), after `active` flips. */\n readonly toggled = output<MouseEvent>();\n\n /** Resolves the icon size from the button size preset. */\n readonly iconSize = computed<FoldIconSize>(() => {\n switch (this.size()) {\n case \"xs\":\n return \"xs\"; // 12px\n case \"sm\":\n return \"sm\"; // 16px\n case \"md\":\n return \"sm\"; // 16px in a 32px hit-area\n case \"lg\":\n return \"md\"; // 20px in a 38px hit-area\n }\n });\n\n onClick(e: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n return;\n }\n this.active.update((v) => !v);\n this.toggled.emit(e);\n }\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.title]=\"tooltip() || null\"\n [attr.aria-label]=\"tooltip() || null\"\n [attr.aria-pressed]=\"active() ? 'true' : 'false'\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (click)=\"onClick($event)\"\n>\n @if (loading()) {\n <fold-spinner [size]=\"iconSize()\" aria-hidden=\"true\" />\n } @else {\n <fold-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n }\n</button>\n","import { booleanAttribute, Component, input } from \"@angular/core\";\n\n/**\n * `<fold-card>` — the canonical raised content surface: a solid\n * `surface-card` background, a hairline border and a consistent radius. Use it\n * anywhere the app would otherwise hand-roll a `background + border +\n * border-radius` block, so cards never drift on colour or corner.\n *\n * - `surface` — `card` (the raised card tint, default) · `sunken` (a deeper\n * surface for large containers, below the card — the ref's second card tint;\n * pairs with a fainter `border-subtle` hairline).\n * - `radius` — `lg` (14px, default) · `md` · `sm`.\n * - `padding` — `md` (16px, default) · `none` · `sm` · `lg`. Sets the *body*\n * padding; override with a custom value via `--fold-card-padding`.\n * - `interactive` — adds a hover lift (for clickable cards).\n * - `separators` — draw a hairline between a projected header/footer and the body.\n * - `raisedBands` — tint the header/footer bands a step above the surface\n * (fainter on `sunken`).\n *\n * Content projection:\n * - default slot → the card body.\n * - `[cardHeader]` → an optional header band above the body.\n * - `[cardFooter]` → an optional footer band below the body.\n *\n * The card is a flex column of three regions: the body always owns the `padding`,\n * the header/footer carry their own (independent) chrome padding, and the host\n * never pads. So the content padding is identical whether or not the bands show —\n * toggling a header/footer never shifts the body.\n *\n * ```html\n * <fold-card>Static content</fold-card>\n * <fold-card surface=\"sunken\" padding=\"lg\">Deep container</fold-card>\n * <fold-card separators>\n * <h3 cardHeader>Title</h3>\n * Body content\n * <div cardFooter>Actions</div>\n * </fold-card>\n * ```\n *\n * Sizing / escape hatches (CSS custom properties):\n * `--fold-card-padding` overrides the body padding; `--fold-card-overflow`\n * (default `clip`) lets content escape the rounded corners.\n *\n * @selector `fold-card`\n */\n@Component({\n selector: \"fold-card\",\n standalone: true,\n host: {\n \"[class.s-sunken]\": \"surface() === 'sunken'\",\n \"[class.r-sm]\": \"radius() === 'sm'\",\n \"[class.r-md]\": \"radius() === 'md'\",\n \"[class.p-none]\": \"padding() === 'none'\",\n \"[class.p-sm]\": \"padding() === 'sm'\",\n \"[class.p-lg]\": \"padding() === 'lg'\",\n \"[class.is-interactive]\": \"interactive()\",\n \"[class.has-sep]\": \"separators()\",\n \"[class.raised-bands]\": \"raisedBands()\",\n },\n templateUrl: \"./card.component.html\",\n styleUrl: \"./card.component.scss\",\n})\nexport class FoldCardComponent {\n /** Surface tint — `card` (raised, default) or `sunken` (deeper container). */\n readonly surface = input<\"card\" | \"sunken\">(\"card\");\n /** Corner radius — `lg` (default), `md`, or `sm`. */\n readonly radius = input<\"sm\" | \"md\" | \"lg\">(\"lg\");\n /** Body padding — `md` (default), `none`, `sm`, or `lg`; a custom value can be\n * set with the `--fold-card-padding` CSS variable. */\n readonly padding = input<\"none\" | \"sm\" | \"md\" | \"lg\">(\"md\");\n /** Add a hover lift for clickable cards. */\n readonly interactive = input(false);\n /** Draw a hairline between a projected header/footer and the body. */\n readonly separators = input(false, { transform: booleanAttribute });\n /** Lift the header/footer bands with a subtle raised tint over the card\n * surface (fainter on `sunken`), to set the chrome apart from the body. */\n readonly raisedBands = input(false, { transform: booleanAttribute });\n}\n","<header class=\"card-header\"><ng-content select=\"[cardHeader]\" /></header>\n<div class=\"card-body\"><ng-content /></div>\n<footer class=\"card-footer\"><ng-content select=\"[cardFooter]\" /></footer>\n","import { Component, computed, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-element-title>` — the label that heads a section, card or panel. Fully\n * input-driven (title / subtitle / icon), so a header is never hand-rolled and\n * the common case is a self-closing tag.\n *\n * Variants (emphasis):\n * - `eyebrow` (default) — 10px, muted, uppercase. Inline section label.\n * - `bar` — 11px, secondary, uppercase. For a divider header bar.\n * - `title` — normal-case, `text-md`, primary. A card/panel heading; a leading\n * `icon` renders in a tile whose tone is set by `iconTone`\n * (`neutral` raised · `primary` filled brand · `faded` dim).\n *\n * A trailing action (edit/add button, lock badge) projects into `[titleAction]`,\n * right-aligned. The title — not the action — is the heading for assistive tech.\n *\n * @selector `fold-element-title`\n *\n * @example\n * ```html\n * <fold-element-title title=\"Documents\" variant=\"bar\" />\n * <fold-element-title variant=\"title\" icon=\"company\" title=\"Contexte\" subtitle=\"Activité de l'espace\" />\n * <fold-element-title title=\"Poste\">\n * <button titleAction (click)=\"edit()\">✎</button>\n * </fold-element-title>\n * ```\n */\n@Component({\n selector: \"fold-element-title\",\n standalone: true,\n imports: [FoldIconComponent],\n host: {\n \"[class.v-bar]\": \"variant() === 'bar'\",\n \"[class.v-title]\": \"variant() === 'title'\",\n \"[class.it-primary]\": \"iconTone() === 'primary'\",\n \"[class.it-faded]\": \"iconTone() === 'faded'\",\n },\n templateUrl: \"./element-title.component.html\",\n styleUrl: \"./element-title.component.scss\",\n})\nexport class FoldElementTitleComponent {\n /** Leading icon glyph (raised tile in the `title` variant). */\n readonly icon = input<FoldIconName>();\n /** Icon tile tone (title variant) — `neutral` (raised), `primary` (filled brand), `faded` (dim). */\n readonly iconTone = input<\"neutral\" | \"primary\" | \"faded\">(\"neutral\");\n /** The heading text. */\n readonly title = input.required<string>();\n /** Optional secondary line under the title. */\n readonly subtitle = input<string>();\n /** Emphasis — `eyebrow` (10px muted), `bar` (11px secondary), `title` (text-md, normal-case). */\n readonly variant = input<\"eyebrow\" | \"bar\" | \"title\">(\"eyebrow\");\n /** Heading outline depth exposed to assistive tech (`aria-level`). */\n readonly level = input(2);\n /** Optional `id` on the heading span, so a container can name a region with\n * `aria-labelledby` (e.g. a `fold-page-section`'s `<section>`). */\n readonly headingId = input<string>();\n\n protected readonly iconSize = computed(() =>\n this.variant() === \"title\" ? \"md\" : \"sm\",\n );\n}\n","@if (icon(); as ic) {\n <span class=\"et-icon\"><fold-icon [name]=\"ic\" [size]=\"iconSize()\" /></span>\n}\n<span class=\"et-main\">\n <span class=\"et-row\">\n <span\n class=\"et-label\"\n role=\"heading\"\n [attr.id]=\"headingId()\"\n [attr.aria-level]=\"level()\"\n >{{ title() }}</span\n >\n <span class=\"et-action\"><ng-content select=\"[titleAction]\" /></span>\n </span>\n @if (subtitle(); as s) {\n <span class=\"et-sub\">{{ s }}</span>\n }\n</span>\n","import { Component, input } from \"@angular/core\";\nimport { FoldCardComponent } from \"../../content/card/card.component\";\nimport { FoldElementTitleComponent } from \"../../content/element-title/element-title.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-context-card>` — a titled info card in three zones: a **header** (a\n * raised icon tile + title + subtitle), a **body** (the projected content — e.g.\n * label/value rows), and an optional **footer** action. Composes\n * {@link FoldCardComponent} for the surface, so it never re-rolls a card.\n *\n * - `icon` / `title` / `subtitle` — the header. `title` is required.\n * - default slot → the body.\n * - `[footer]` slot → a footer action (e.g. an `<fold-link>`); the footer and its\n * divider are hidden when nothing is projected.\n *\n * @selector `fold-context-card`\n *\n * @example\n * ```html\n * <fold-context-card icon=\"company\" title=\"Contexte\" subtitle=\"Activité de l'espace\">\n * <div class=\"row\">…</div>\n * <fold-link footer icon=\"company\" (clicked)=\"openOrg()\">Voir l'organigramme</fold-link>\n * </fold-context-card>\n * ```\n */\n@Component({\n selector: \"fold-context-card\",\n standalone: true,\n imports: [FoldCardComponent, FoldElementTitleComponent],\n templateUrl: \"./context-card.component.html\",\n styleUrl: \"./context-card.component.scss\",\n})\nexport class FoldContextCardComponent {\n /** Header icon glyph. */\n readonly icon = input<FoldIconName>();\n /** Icon tile tone — `primary` (filled brand, default), `neutral` (raised), `faded` (dim). */\n readonly iconTone = input<\"neutral\" | \"primary\" | \"faded\">(\"primary\");\n /** Header title. */\n readonly title = input.required<string>();\n /** Optional line under the title. */\n readonly subtitle = input<string>();\n}\n","<fold-card padding=\"none\">\n <div class=\"cc-head\">\n <fold-element-title\n variant=\"title\"\n [level]=\"3\"\n [icon]=\"icon()\"\n [iconTone]=\"iconTone()\"\n [title]=\"title()\"\n [subtitle]=\"subtitle()\"\n />\n </div>\n <div class=\"cc-body\"><ng-content /></div>\n <div class=\"cc-foot\"><ng-content select=\"[footer]\" /></div>\n</fold-card>\n","import { Directive, inject } from \"@angular/core\";\nimport { FoldIdService } from \"./id.service\";\n\n/**\n * Auto-assigns a unique, SSR-safe `id` to any native form control (`<input>`,\n * `<select>`, `<textarea>`) that has neither an `id` nor a `name`.\n *\n * You don't write `foldFieldId` on elements — the directive **auto-applies** by\n * selector. Add it to a component's `imports` once and every unidentified native\n * control in that component's template is fixed in one go, with no per-element\n * edit. It silences the browser's *\"A form field element should have an id or\n * name attribute\"* warning (autofill + accessibility), and the id it sets can be\n * targeted by a `<label for>`.\n *\n * The selector matches only controls missing **both** `id` and `name` — static\n * or bound (`[id]`/`[attr.id]`/`[name]` all count as present) — so it never\n * fights a control you've already identified. Components that render their own\n * labelled control ({@link FoldInputComponent}, `fold-select`) own their id\n * explicitly and are unaffected.\n */\n@Directive({\n selector:\n \"input:not([id]):not([name]),select:not([id]):not([name]),textarea:not([id]):not([name])\",\n standalone: true,\n host: { \"[id]\": \"autoId\" },\n})\nexport class FoldFieldIdDirective {\n /** Assigned once at construction, in deterministic render order (SSR-safe). */\n protected readonly autoId = inject(FoldIdService).next(\"fold-field\");\n}\n","import type { ElementRef } from \"@angular/core\";\nimport { Component, input, output, signal, viewChild } from \"@angular/core\";\nimport { FoldFieldIdDirective } from \"../../../a11y/field-id.directive\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * `<fold-file-dropzone>` — a file-picker dropzone: drag-over visuals, keyboard\n * activation, the hidden `<input type=\"file\">` plumbing, and it emits the picked\n * `File[]`. Presentational — it never talks to the network; the consumer decides\n * what to do with the files (upload now, buffer locally, …).\n *\n * Belongs to the **form** family, not the text-input family: it's a whole\n * drop-target affordance, not a labelled box, so it doesn't compose\n * `fold-input-base`.\n *\n * @selector `fold-file-dropzone`\n *\n * @example\n * ```html\n * <fold-file-dropzone\n * accept=\".pdf,.png\"\n * [hint]=\"'Max 5 Mo'\"\n * (filesPicked)=\"onFiles($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-file-dropzone\",\n standalone: true,\n imports: [FoldFieldIdDirective, FoldIconComponent],\n templateUrl: \"./file-dropzone.component.html\",\n styleUrl: \"./file-dropzone.component.scss\",\n})\nexport class FoldFileDropzoneComponent {\n /** Comma-separated MIME or extension filter passed to the input. */\n readonly accept = input<string>(\"\");\n /** Multi-file pick. Defaults to true — the consumer can cap on its end. */\n readonly multiple = input<boolean>(true);\n /** Primary line of copy. */\n readonly label = input<string>(\"Glissez un fichier ou parcourez\");\n /** Smaller helper line under the label (size limit, count remaining, …). */\n readonly hint = input<string | null>(null);\n /** Pending state — disables interaction and swaps the copy for a loading message. */\n readonly busy = input<boolean>(false);\n /** Loading message displayed while `busy` is true. */\n readonly busyLabel = input<string>(\"Téléversement en cours…\");\n /** Fully disable the dropzone (e.g. cap reached). */\n readonly disabled = input<boolean>(false);\n\n /** Emits the picked files (from browse or drop). */\n readonly filesPicked = output<File[]>();\n\n private readonly fileInput =\n viewChild.required<ElementRef<HTMLInputElement>>(\"fileInput\");\n\n /** Whether a drag is currently hovering the zone (drives the `.over` state). */\n readonly isDragOver = signal(false);\n\n openFilePicker(): void {\n if (this.disabled() || this.busy()) {\n return;\n }\n this.fileInput().nativeElement.click();\n }\n\n onFilesSelected(target: EventTarget | null): void {\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n if (!target.files || target.files.length === 0) {\n return;\n }\n this.filesPicked.emit(Array.from(target.files));\n // Reset so re-picking the same file fires `change` again.\n target.value = \"\";\n }\n\n onDragOver(event: DragEvent): void {\n if (this.disabled() || this.busy()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n onDragLeave(): void {\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver.set(false);\n if (this.disabled() || this.busy()) {\n return;\n }\n const files = event.dataTransfer?.files;\n if (!files || files.length === 0) {\n return;\n }\n this.filesPicked.emit(Array.from(files));\n }\n}\n","<div\n class=\"dropzone\"\n [class.over]=\"isDragOver()\"\n [class.busy]=\"busy()\"\n [class.disabled]=\"disabled()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-disabled]=\"disabled() || busy()\"\n (click)=\"openFilePicker()\"\n (keydown.enter)=\"openFilePicker()\"\n (keydown.space)=\"openFilePicker(); $event.preventDefault()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave()\"\n (drop)=\"onDrop($event)\"\n>\n <fold-icon name=\"upload\" [size]=\"22\" />\n @if (busy()) {\n <span class=\"label\">{{ busyLabel() }}</span>\n } @else {\n <span class=\"label\">{{ label() }}</span>\n @if (hint(); as h) {\n <small class=\"hint\">{{ h }}</small>\n }\n }\n <input\n #fileInput\n type=\"file\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled() || busy()\"\n hidden\n (change)=\"onFilesSelected($event.target)\"\n />\n</div>\n","import { Component } from \"@angular/core\";\n\n/**\n * `<fold-field-list>` — the read-only counterpart of a form: a description list\n * (`<dl>`) of label/value pairs. It's what fills the *display* side of a detail\n * page (the recap), where `fold-input` fills the *edit* side. Nothing here is\n * interactive — it renders values you already know, not fields you type into.\n *\n * Put {@link FoldFieldComponent} children inside it:\n *\n * ```html\n * <fold-field-list>\n * <fold-field label=\"Contract type\">CDI</fold-field>\n * <fold-field label=\"Job title\" [empty]=\"!c.jobTitle\">{{ c.jobTitle }}</fold-field>\n * <fold-field label=\"Compensation\">\n * <span class=\"chip\">{{ c.salary }}</span>\n * </fold-field>\n * </fold-field-list>\n * ```\n *\n * **Why a component and not a mixin:** it guarantees the real semantics —\n * `dl > dt > dd`, so screen readers announce each value as the definition of its\n * label. A copy-pasted `div > span + span` (what every detail page hand-rolls)\n * looks the same but is an accessibility dead end; a mixin can't fix the markup.\n *\n * **How the encapsulation is kept clean (no `::ng-deep`):** the list owns *all*\n * the layout — the `<dl>` is a two-column grid (`label | value`), and a grid\n * positions its items *by their place in the box tree*, not by a selector that\n * has to match them. The `dt`/`dd` are contributed by each `fold-field`\n * (`display: contents`), yet the grid still lays them out. Appearance (type,\n * colour, the empty state) lives on the field, where the elements are declared.\n * Layout at the container, style at the cell — neither reaches across the wall.\n *\n * Zero-input theming via CSS custom properties on the host:\n * `--fold-field-list-label-width` (160px — the fixed label column) ·\n * `--fold-field-list-col-gap` (16px, label→value) ·\n * `--fold-field-list-row-gap` (10px, between rows). Shrink the label width when\n * the list sits in a narrow rail.\n *\n * @selector `fold-field-list`\n */\n@Component({\n selector: \"fold-field-list\",\n standalone: true,\n templateUrl: \"./field-list.component.html\",\n styleUrl: \"./field-list.component.scss\",\n})\nexport class FoldFieldListComponent {}\n","<dl class=\"fl\">\n <ng-content />\n</dl>\n","import { booleanAttribute, Component, input } from \"@angular/core\";\n\n/**\n * `<fold-field>` — one read-only label/value pair inside a\n * {@link FoldFieldListComponent}. It renders a `<dt>` (the {@link label}) and a\n * `<dd>` (the value, projected), so the pair is a real term/definition a screen\n * reader announces together.\n *\n * **This is not `fold-input`.** They are the two opposite halves of a record:\n * `fold-input` is *edit* mode — a control you focus and type into, bound to a\n * Signal Form field. `fold-field` is *read* mode — a value already known, shown\n * as text. A read-only input would still be a heavyweight control (border,\n * focus, keyboard) pretending to be static; a field is just `dt`/`dd`.\n *\n * The value is the default slot, so it takes rich content (chips, links, an\n * icon), not only a string:\n *\n * ```html\n * <fold-field label=\"Job title\">{{ c.jobTitle }}</fold-field>\n * <fold-field label=\"Status\"><span class=\"chip\">Active</span></fold-field>\n * <fold-field label=\"End date\" [empty]=\"!c.endDate\">{{ c.endDate | date }}</fold-field>\n * ```\n *\n * Missing values are a first-class state: set {@link empty} and the field shows\n * the {@link placeholder} (`—` by default) in a muted italic instead of the\n * projected content — so the caller writes the toggle once (`[empty]=\"!value\"`)\n * rather than repeating a `{{ value || '—' }}` fallback and a class binding at\n * every site.\n *\n * The host is `display: contents`: the `dt`/`dd` it renders become direct\n * children of the list's `<dl>` grid, which is what lets the list lay them out\n * without reaching through view encapsulation. Appearance (type scale, colour,\n * the empty style) is owned here; the grid geometry is owned by the list.\n *\n * @selector `fold-field`\n */\n@Component({\n selector: \"fold-field\",\n standalone: true,\n templateUrl: \"./field.component.html\",\n styleUrl: \"./field.component.scss\",\n})\nexport class FoldFieldComponent {\n /** The term — rendered as the `<dt>` label (small, uppercase, muted). */\n readonly label = input.required<string>();\n\n /**\n * Mark the value as absent. When `true`, the field shows {@link placeholder}\n * in a muted italic and ignores the projected content — the single source of\n * truth for \"no value\" so callers don't hand-roll a fallback + a class each\n * time.\n */\n readonly empty = input(false, { transform: booleanAttribute });\n\n /** What to show in place of an {@link empty} value. */\n readonly placeholder = input(\"—\");\n}\n","<dt class=\"fl-key\">{{ label() }}</dt>\n@if (empty()) {\n <dd class=\"fl-val fl-empty\">{{ placeholder() }}</dd>\n} @else {\n <dd class=\"fl-val\"><ng-content /></dd>\n}\n","import { booleanAttribute, Component, input, output } from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-link>` — an inline text link / link-button: accent-coloured, underline\n * on hover, with optional leading + trailing icons (a nav chevron, an external\n * glyph). Renders an `<a>` when given `href`, otherwise a `<button>` that emits\n * `(clicked)` — so the same look serves both navigation and in-app actions.\n *\n * - `tone` — `accent` (default, brand link) · `muted` (secondary).\n * - `icon` / `trailingIcon` — optional glyphs around the label.\n * - `disabled` — button mode only.\n *\n * @selector `fold-link`\n *\n * @example\n * ```html\n * <fold-link icon=\"company\" trailingIcon=\"chevron-right\" (clicked)=\"openOrg()\">\n * Voir l'organigramme\n * </fold-link>\n * <fold-link href=\"https://sh3pherd.dev/docs\" tone=\"muted\">Documentation</fold-link>\n * ```\n */\n@Component({\n selector: \"fold-link\",\n standalone: true,\n imports: [NgTemplateOutlet, FoldIconComponent],\n host: { \"[class.tone-muted]\": \"tone() === 'muted'\" },\n templateUrl: \"./link.component.html\",\n styleUrl: \"./link.component.scss\",\n})\nexport class FoldLinkComponent {\n /** Leading icon glyph. */\n readonly icon = input<FoldIconName>();\n /** Trailing icon glyph (e.g. a nav chevron). */\n readonly trailingIcon = input<FoldIconName>();\n /** Colour role — `accent` (default) or `muted`. */\n readonly tone = input<\"accent\" | \"muted\">(\"accent\");\n /** When set, the link renders as an `<a href>` instead of a button. */\n readonly href = input<string>();\n /** Disable the button form (no effect on the `href` form). */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Fires on click in the button form. */\n readonly clicked = output();\n}\n","<ng-template #inner>\n @if (icon(); as i) {\n <fold-icon [name]=\"i\" size=\"sm\" />\n }\n <span class=\"lnk-label\"><ng-content /></span>\n @if (trailingIcon(); as t) {\n <fold-icon [name]=\"t\" size=\"sm\" />\n }\n</ng-template>\n@if (href(); as h) {\n <a class=\"lnk\" [href]=\"h\">\n <ng-container [ngTemplateOutlet]=\"inner\" />\n </a>\n} @else {\n <button\n type=\"button\"\n class=\"lnk\"\n [disabled]=\"disabled()\"\n (click)=\"clicked.emit()\"\n >\n <ng-container [ngTemplateOutlet]=\"inner\" />\n </button>\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * How menu items colour on hover and when active:\n * - `follow` — take the enclosing section's colour (falls back to neutral for\n * section-less items, e.g. the footer).\n * - `neutral` — a plain grey tint, no accent.\n * - `primary` — the app's primary accent.\n */\nexport type FoldMenuTint = \"follow\" | \"neutral\" | \"primary\";\n\n/**\n * The rail's depth in the shell hierarchy — picks its background tint so a\n * primary rail and a secondary (e.g. workspace) rail read as different layers:\n * `primary` (default) · `secondary` · `tertiary`.\n */\nexport type FoldMenuLevel = \"primary\" | \"secondary\" | \"tertiary\";\n\n/**\n * Where the collapse toggle sits. `auto` follows band presence (first in the\n * footer, else last in the header, else last in the body); the others pin it to\n * a specific band.\n */\nexport type FoldMenuTogglePlacement = \"auto\" | \"footer\" | \"header\" | \"body\";\n\n/**\n * `<fold-menu>` — a vertical icon navigation rail (the app's primary menu shell).\n *\n * Structural + presentational: it owns the rail column, its top/body/bottom\n * bands and the tooltip escape (`overflow: visible`); the app fills the slots\n * and keeps all routing, auth and data. Sits inside the shell's `railPrimary`.\n *\n * ## Options\n * - `collapsible` — render a chevron toggle that flips `expanded`.\n * - `expanded` (two-way) — `false` (default) is the icon rail: items are\n * icon-only with hover tooltips. `true` widens the rail and items + separators\n * show their labels inline. Drive it yourself (`[expanded]`) or let the toggle.\n *\n * ## Slots\n * | Attribute | Band |\n * |-------------|-------------------------------------------------------------|\n * | `header` | Top — brand, workspace launcher, dividers. |\n * | *(default)* | The nav items — `[fold-menu-item]` + `<fold-menu-separator>`. |\n * | `footer` | Bottom (pinned) — secondary actions, account. Hidden when empty. |\n *\n * @selector `fold-menu`\n *\n * @example\n * ```html\n * <fold-menu collapsible [(expanded)]=\"open()\">\n * <div header>…brand…</div>\n * <fold-menu-separator label=\"Workspace\" color=\"#7c5bbf\" />\n * <a fold-menu-item [icon]=\"i.icon\" [label]=\"i.label\"\n * [routerLink]=\"i.route\" routerLinkActive #r=\"routerLinkActive\"\n * [active]=\"r.isActive\"></a>\n * <div footer>…account…</div>\n * </fold-menu>\n * ```\n */\n@Component({\n selector: \"fold-menu\",\n standalone: true,\n imports: [FoldIconComponent, NgTemplateOutlet],\n templateUrl: \"./menu.component.html\",\n styleUrl: \"./menu.component.scss\",\n host: {\n \"[class.expanded]\": \"expanded()\",\n \"[attr.data-tint]\": \"tint()\",\n \"[attr.data-level]\": \"level()\",\n },\n})\nexport class FoldMenuComponent {\n /** Show a chevron toggle that flips `expanded`. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /**\n * Two-way: `true` widens the rail and reveals inline labels. A standalone\n * state — a menu can be statically expanded (a labelled sidebar) without\n * `collapsible`; `collapsible` only adds the toggle that flips it.\n */\n readonly expanded = model(false);\n /** How items tint on hover / when active (`follow` = section colour). */\n readonly tint = input<FoldMenuTint>(\"follow\");\n /** Rail depth → background tint (`primary` default / `secondary` / `tertiary`). */\n readonly level = input<FoldMenuLevel>(\"primary\");\n /** Pin the collapse toggle to a band, or `auto` to follow band presence. */\n readonly togglePlacement = input<FoldMenuTogglePlacement>(\"auto\");\n\n private readonly headRef =\n viewChild.required<ElementRef<HTMLElement>>(\"head\");\n private readonly footRef =\n viewChild.required<ElementRef<HTMLElement>>(\"foot\");\n private readonly hasHeader = signal(false);\n private readonly hasFooter = signal(false);\n\n /**\n * The band the toggle renders into: the `togglePlacement` override when set,\n * else auto — first in the footer, else last in the header, else the body.\n */\n protected readonly resolvedPlacement = computed<\"footer\" | \"header\" | \"body\">(\n () => {\n const forced = this.togglePlacement();\n if (forced !== \"auto\") {\n return forced;\n }\n return this.hasFooter() ? \"footer\" : this.hasHeader() ? \"header\" : \"body\";\n },\n );\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n const head = this.headRef().nativeElement;\n const foot = this.footRef().nativeElement;\n const sync = (): void => {\n this.hasHeader.set(this.slotFilled(head));\n this.hasFooter.set(this.slotFilled(foot));\n };\n sync();\n const observer = new MutationObserver(sync);\n observer.observe(head, { childList: true });\n observer.observe(foot, { childList: true });\n destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n /** True when a band holds projected content (ignoring the toggle itself). */\n private slotFilled(band: HTMLElement): boolean {\n for (const child of Array.from(band.children)) {\n if (!child.classList.contains(\"menu-toggle\")) {\n return true;\n }\n }\n return false;\n }\n\n protected toggle(): void {\n this.expanded.update((v) => !v);\n }\n}\n","<div\n class=\"menu-head\"\n [class.head-has-toggle]=\"collapsible() && resolvedPlacement() === 'header'\"\n #head\n>\n <ng-content select=\"[header]\" />\n @if (collapsible() && resolvedPlacement() === \"header\") {\n <ng-container [ngTemplateOutlet]=\"toggleTpl\" />\n }\n</div>\n\n<nav class=\"menu-body\">\n <ng-content />\n @if (collapsible() && resolvedPlacement() === \"body\") {\n <ng-container [ngTemplateOutlet]=\"toggleTpl\" />\n }\n</nav>\n\n<div\n class=\"menu-foot\"\n [class.foot-has-toggle]=\"collapsible() && resolvedPlacement() === 'footer'\"\n #foot\n>\n @if (collapsible() && resolvedPlacement() === \"footer\") {\n <ng-container [ngTemplateOutlet]=\"toggleTpl\" />\n }\n <ng-content select=\"[footer]\" />\n</div>\n\n<ng-template #toggleTpl>\n <button\n type=\"button\"\n class=\"menu-toggle\"\n [attr.aria-label]=\"expanded() ? 'Collapse menu' : 'Expand menu'\"\n (click)=\"toggle()\"\n >\n <fold-icon\n [name]=\"expanded() ? 'chevron-left' : 'chevron-right'\"\n [size]=\"14\"\n />\n </button>\n</ng-template>\n","import { Component, booleanAttribute, computed, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport {\n FoldBadgeComponent,\n type FoldBadgeVariant,\n} from \"../../content/badge/badge.component\";\n\n/**\n * Badge tone for a menu item. `follow` (the default) tints the badge with the\n * item's own accent — i.e. the section colour, or whatever the menu's `tint`\n * resolves to — so it matches the item's hover/active look. The rest are the\n * shared {@link FoldBadgeVariant} semantic colours.\n */\nexport type FoldMenuItemBadgeTone = \"follow\" | FoldBadgeVariant;\n\n/** Solid accent colour per semantic tone (drives the dot + follow-pill). */\nconst TONE_ACCENT: Record<FoldBadgeVariant, string> = {\n neutral: \"var(--fold-color-text-muted)\",\n accent: \"var(--fold-color-primary)\",\n info: \"var(--fold-color-info)\",\n warning: \"var(--fold-color-warning)\",\n alert: \"var(--fold-color-alert)\",\n success: \"var(--fold-color-success)\",\n};\n\n/**\n * `[fold-menu-item]` — an icon rail item. It is an **attribute** component, put\n * on the caller's own `<a>`/`<button>` so routing stays theirs (`routerLink` +\n * `routerLinkActive`). It renders the icon + a hover tooltip (`label`); `active`\n * lights the accent indicator (bind it from `routerLinkActive`'s `isActive`).\n *\n * A {@link badge} adds a status tag / count that renders in both rail modes:\n * a corner dot (or count bubble, for a number) when the rail is collapsed to\n * icons, and the full badge pill after the label when expanded. It stays an\n * input (not projected content) because only this component knows its rail\n * mode, and that mode dictates where the badge belongs. {@link badgeTone}\n * colours both modes from a single accent — `follow` (default) matches the\n * item's own tint, the semantic tones reuse the `fold-badge` palette.\n *\n * @selector `a[fold-menu-item]`, `button[fold-menu-item]`\n *\n * @example\n * ```html\n * <a fold-menu-item [icon]=\"'home'\" [label]=\"'Home'\"\n * routerLink=\"/home\" routerLinkActive #r=\"routerLinkActive\"\n * [active]=\"r.isActive\"></a>\n *\n * <a fold-menu-item icon=\"bell\" label=\"Alerts\" [badge]=\"3\"></a>\n * <a fold-menu-item icon=\"star\" label=\"Directive\" badge=\"new\" badgeTone=\"info\"></a>\n * ```\n */\n@Component({\n selector: \"a[fold-menu-item], button[fold-menu-item]\",\n standalone: true,\n imports: [FoldIconComponent, FoldBadgeComponent],\n templateUrl: \"./menu-item.component.html\",\n styleUrl: \"./menu-item.component.scss\",\n host: {\n \"[class.is-active]\": \"active()\",\n \"[attr.aria-label]\": \"ariaLabel()\",\n \"[style.--mi-badge-accent]\": \"badgeAccent()\",\n },\n})\nexport class FoldMenuItemComponent {\n readonly icon = input.required<FoldIconName>();\n /** The label shown in the hover tooltip (also the accessible name). */\n readonly label = input.required<string>();\n /** Lights the active indicator — bind from `routerLinkActive`. */\n readonly active = input(false, { transform: booleanAttribute });\n /**\n * Optional badge: a text tag (`\"new\"`, `\"beta\"`) or a count (`3`). Empty\n * string / nullish renders nothing; a count of `0` is treated as nothing.\n */\n readonly badge = input<string | number>();\n /** Badge colour — `follow` (default) tracks the item's tint, or a semantic tone. */\n readonly badgeTone = input<FoldMenuItemBadgeTone>(\"follow\");\n\n /** Whether the badge is a numeric count (drives the collapsed bubble). */\n protected readonly isCount = computed(() => typeof this.badge() === \"number\");\n\n /** Whether a badge should render at all (non-empty text / non-zero count). */\n protected readonly hasBadge = computed(() => {\n const b = this.badge();\n return b !== undefined && b !== \"\" && b !== 0;\n });\n\n /** Whether the tone tracks the item's accent (vs a semantic `fold-badge`). */\n protected readonly isFollowTone = computed(\n () => this.badgeTone() === \"follow\",\n );\n\n /** The badge's accent colour — the item's tint, or the semantic tone's. */\n protected readonly badgeAccent = computed(() => {\n const tone = this.badgeTone();\n return tone === \"follow\" ? \"var(--mi-accent)\" : TONE_ACCENT[tone];\n });\n\n /** Semantic variant for the expanded `fold-badge` (unused when following). */\n protected readonly badgeVariant = computed<FoldBadgeVariant>(() => {\n const tone = this.badgeTone();\n return tone === \"follow\" ? \"accent\" : tone;\n });\n\n /** Badge text for the expanded pill (`fold-badge` needs a string). */\n protected readonly badgeText = computed(() => {\n const b = this.badge();\n return b === undefined ? \"\" : String(b);\n });\n\n /** Collapsed corner label: the (capped) count, or empty for a text tag dot. */\n protected readonly dotText = computed(() => {\n const b = this.badge();\n if (typeof b !== \"number\") {\n return \"\";\n }\n return b > 99 ? \"99+\" : String(b);\n });\n\n /** Accessible name folding the badge in, so both rail modes announce it. */\n protected readonly ariaLabel = computed(() =>\n this.hasBadge() ? `${this.label()}, ${this.badgeText()}` : null,\n );\n}\n","<fold-icon [name]=\"icon()\" [size]=\"18\" class=\"mi-icon\" />\n\n<!-- Collapsed rail: a corner dot, or a count bubble for a number. -->\n@if (hasBadge()) {\n <span class=\"mi-dot\" [class.mi-dot-count]=\"isCount()\" aria-hidden=\"true\">{{\n dotText()\n }}</span>\n}\n\n<span class=\"mi-tip\">{{ label() }}</span>\n\n<!-- Expanded rail: the badge pill, pushed to the row's trailing edge. `follow`\n tints from the item's own accent; the semantic tones reuse fold-badge. -->\n@if (hasBadge()) {\n @if (isFollowTone()) {\n <span class=\"mi-badge mi-badge-follow\">{{ badgeText() }}</span>\n } @else {\n <fold-badge\n class=\"mi-badge\"\n [content]=\"badgeText()\"\n [variant]=\"badgeVariant()\"\n />\n }\n}\n","import { Component, input } from \"@angular/core\";\n\n/**\n * `<fold-menu-separator>` — a section break inside `<fold-menu>`.\n *\n * Collapsed (icon rail): a short mark centered between items — a plain divider,\n * or a colour bar when `color` is set. Expanded: a section header — the colour\n * dot + the uppercase `label`. It follows the menu's state via `:host-context`.\n *\n * @selector `fold-menu-separator`\n *\n * @example\n * ```html\n * <fold-menu-separator label=\"Workspace\" color=\"#7c5bbf\" />\n * ```\n */\n@Component({\n selector: \"fold-menu-separator\",\n standalone: true,\n templateUrl: \"./menu-separator.component.html\",\n styleUrl: \"./menu-separator.component.scss\",\n})\nexport class FoldMenuSeparatorComponent {\n /** Section label — shown only when the menu is expanded. */\n readonly label = input<string>();\n /** Accent colour for the mark/dot (any CSS colour); omit for a neutral line. */\n readonly color = input<string>();\n}\n","<span class=\"sep-mark\" [style.background]=\"color() || null\"></span>\n@if (label()) {\n <span class=\"sep-label\">{{ label() }}</span>\n}\n","import {\n Component,\n booleanAttribute,\n computed,\n contentChildren,\n input,\n model,\n} from \"@angular/core\";\nimport { FoldMenuSeparatorComponent } from \"./menu-separator.component\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldMenuItemComponent } from \"./menu-item.component\";\n\n/** Distinct ids for the header → items `aria-controls` link. */\nlet sectionUid = 0;\n\n/**\n * `<fold-menu-section>` — a labelled group inside `<fold-menu>`. It renders a\n * `<fold-menu-separator>` (same `label` / `color` inputs) then projects the\n * section's `fold-menu-item`s beneath it.\n *\n * The `color` is published as the `--fold-menu-section-color` custom property on\n * the host, so it cascades to the projected items: they pick the section's tint\n * up on hover (see `menu-item.component.scss`). Omit `color` for a neutral\n * section.\n *\n * Set `collapsible` to turn the header into a fold toggle (chevron) — a long\n * grouped nav can then be tidied down to the sections that matter. The\n * {@link collapsed} state is two-way bindable and starts open; a section that\n * holds the **active** item always shows regardless, so the current page is\n * never hidden. Folding only applies in the expanded rail — collapsed (icon\n * only) there is no header to click, so every item stays visible.\n *\n * @selector `fold-menu-section`\n *\n * @example\n * ```html\n * <fold-menu-section label=\"Workspace\" color=\"#7c5bbf\" collapsible>\n * <button fold-menu-item icon=\"home\" label=\"Home\"></button>\n * <button fold-menu-item icon=\"music\" label=\"Music\"></button>\n * </fold-menu-section>\n * ```\n */\n@Component({\n selector: \"fold-menu-section\",\n standalone: true,\n imports: [FoldMenuSeparatorComponent, FoldIconComponent],\n templateUrl: \"./menu-section.component.html\",\n styleUrl: \"./menu-section.component.scss\",\n host: { \"[style.--fold-menu-section-color]\": \"color() ?? null\" },\n})\nexport class FoldMenuSectionComponent {\n /** Section label — shown only when the menu is expanded. */\n readonly label = input<string>();\n /** Accent colour tinting the separator and the items' hover state. */\n readonly color = input<string>();\n /** Turn the header into a fold toggle for the section's items. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /** Fold state (two-way). Starts open; ignored while the section is active. */\n readonly collapsed = model(false);\n\n /** Projected items — read to keep the active one's section always open. */\n private readonly items = contentChildren(FoldMenuItemComponent, {\n descendants: true,\n });\n private readonly hasActiveItem = computed(() =>\n this.items().some((item) => item.active()),\n );\n\n /** Effective open state: not collapsed, or force-open for the active item. */\n protected readonly open = computed(\n () => !this.collapsed() || this.hasActiveItem(),\n );\n\n /** Stable id linking the toggle's `aria-controls` to the items region. */\n protected readonly bodyId = `fold-menu-section-${(sectionUid += 1)}`;\n\n protected toggle(): void {\n this.collapsed.update((v) => !v);\n }\n}\n","@if (collapsible()) {\n <button\n type=\"button\"\n class=\"section-head\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"bodyId\"\n (click)=\"toggle()\"\n >\n <fold-menu-separator [label]=\"label()\" [color]=\"color()\" />\n <fold-icon\n class=\"section-chevron\"\n [class.is-open]=\"open()\"\n name=\"chevron-right\"\n [size]=\"12\"\n aria-hidden=\"true\"\n />\n </button>\n} @else {\n <fold-menu-separator [label]=\"label()\" [color]=\"color()\" />\n}\n\n<div\n class=\"section-items\"\n [id]=\"bodyId\"\n [class.foldable]=\"collapsible()\"\n [class.is-collapsed]=\"!open()\"\n>\n <ng-content />\n</div>\n","import { DOCUMENT } from \"@angular/common\";\nimport { Service, inject } from \"@angular/core\";\n\n/**\n * Reference-counted body scroll lock for overlays (panels, modals).\n *\n * Multiple overlays can be open at once (e.g. a panel over a page that also\n * locked). Each `lock()` bumps a counter; the body's `overflow` is only frozen\n * on the first lock and restored on the last `unlock()`, so nested overlays\n * never fight over the style or restore it prematurely. The pre-lock value is\n * captured and put back verbatim (not hardcoded to `''`).\n *\n * SSR-safe: `DOCUMENT` is always provided; on the server the style write is a\n * harmless no-op against a detached document.\n */\n@Service()\nexport class ScrollLockService {\n private readonly document = inject(DOCUMENT);\n private locks = 0;\n private previousOverflow = \"\";\n\n /** Freeze body scroll (idempotent per matching `unlock()`). */\n lock(): void {\n if (this.locks === 0) {\n this.previousOverflow = this.document.body.style.overflow;\n this.document.body.style.overflow = \"hidden\";\n }\n this.locks += 1;\n }\n\n /** Release one lock; restores scroll only when the last lock is released. */\n unlock(): void {\n if (this.locks === 0) {\n return;\n }\n this.locks -= 1;\n if (this.locks === 0) {\n this.document.body.style.overflow = this.previousOverflow;\n }\n }\n\n /** True while at least one lock is held. */\n get isLocked(): boolean {\n return this.locks > 0;\n }\n}\n","import { booleanAttribute, Component, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `[fold-nav-tile]` — one square tile in a {@link FoldNavLauncherComponent} grid:\n * a large icon over a label, a generous touch target. An **attribute** component\n * on the caller's own `<a>`/`<button>`, so routing + activation stay theirs\n * (`routerLink`, `(click)`) — mirroring {@link FoldMenuItemComponent}.\n *\n * It stages its **own** entrance — a cascade keyed to its position in the grid\n * (`:host(:nth-child)`) — so a launcher's tiles animate in without the launcher\n * having to thread an index down to projected content.\n *\n * Two looks via `variant`:\n * - `\"surface\"` (default) — a subtle raised tile (faint fill, hairline border).\n * - `\"filled\"` — a solid brand tile: `primary` fill, `on-primary` icon + label.\n * The flat, \"app-icon\" look — a navy tile with a white glyph under `navi`, a\n * teal one under umbra — since it names the brand roles, not a colour.\n *\n * @selector `a[fold-nav-tile]`, `button[fold-nav-tile]`\n *\n * @example\n * ```html\n * <a fold-nav-tile icon=\"home\" label=\"Home\" routerLink=\"/\"></a>\n * <button fold-nav-tile icon=\"music\" label=\"Music\" variant=\"filled\"></button>\n * ```\n */\n@Component({\n selector: \"a[fold-nav-tile], button[fold-nav-tile]\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./nav-tile.component.html\",\n styleUrl: \"./nav-tile.component.scss\",\n host: {\n class: \"fold-nav-tile\",\n \"[class.is-filled]\": \"variant() === 'filled'\",\n \"[class.is-active]\": \"active()\",\n \"[attr.aria-current]\": \"active() ? 'page' : null\",\n },\n})\nexport class FoldNavTileComponent {\n /** The tile's icon (large, centred). */\n readonly icon = input.required<FoldIconName>();\n /** The label under the icon (also the accessible name of the control). */\n readonly label = input.required<string>();\n /** `\"surface\"` (default, subtle raised) or `\"filled\"` (solid brand fill). */\n readonly variant = input<\"surface\" | \"filled\">(\"surface\");\n /** Lights the active indicator — the current destination. */\n readonly active = input(false, { transform: booleanAttribute });\n}\n","<fold-icon [name]=\"icon()\" [size]=\"26\" class=\"nt-icon\" />\n<span class=\"nt-label\">{{ label() }}</span>\n","import {\n Component,\n DestroyRef,\n HostListener,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport { FocusTrapDirective } from \"../../../a11y/focus-trap.directive\";\nimport { ScrollLockService } from \"../../../a11y/scroll-lock.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldNavTileComponent } from \"./nav-tile.component\";\n\n/**\n * `<fold-nav-launcher>` — a full-screen mobile navigation launcher: a centred\n * grid of large {@link FoldNavTileComponent} tiles over a blurred scrim. The\n * \"app-grid\" alternative to a slide-in {@link FoldAppShellComponent} drawer — a\n * curated set of top-level destinations, deliberately distinct from the desktop\n * rail (you pick which handful of places matter on a phone).\n *\n * Project `fold-nav-tile`s (or any controls) into the default slot. It owns the\n * whole overlay contract itself: a blurred scrim, dismissal on `Escape` / scrim\n * / the close button, a focus-trap, and a body scroll-lock while open.\n *\n * `open` is two-way — pair it with the shell's `mobileNavOpen` (set on the shell\n * to `mobileNav=\"none\"` so it renders no drawer) and a header hamburger:\n *\n * ```html\n * <fold-app-shell mobileNav=\"none\" [(mobileNavOpen)]=\"navOpen\">…</fold-app-shell>\n *\n * <fold-nav-launcher [(open)]=\"navOpen\" label=\"Go to\">\n * <a fold-nav-tile icon=\"home\" label=\"Home\" routerLink=\"/\"\n * (click)=\"navOpen.set(false)\"></a>\n * <a fold-nav-tile icon=\"music\" label=\"Music\" routerLink=\"/music\"\n * (click)=\"navOpen.set(false)\"></a>\n * </fold-nav-launcher>\n * ```\n *\n * @selector `fold-nav-launcher`\n */\n@Component({\n selector: \"fold-nav-launcher\",\n standalone: true,\n imports: [FocusTrapDirective, FoldIconComponent],\n templateUrl: \"./nav-launcher.component.html\",\n styleUrl: \"./nav-launcher.component.scss\",\n})\nexport class FoldNavLauncherComponent {\n /** Two-way open state — bind to the shell's `mobileNavOpen`. */\n readonly open = model(false);\n /** Accessible name for the launcher dialog. */\n readonly label = input(\"Navigation\");\n /**\n * Grid column count. `\"auto\"` (default) scales to the number of tiles so a few\n * destinations read as large flat tiles and many stay compact: ≤4 → 2 columns,\n * more → 3. Pass a number to pin it.\n */\n readonly columns = input<number | \"auto\">(\"auto\");\n\n /** The projected tiles — their count drives `auto` column sizing. */\n private readonly tiles = contentChildren(FoldNavTileComponent);\n\n /** The resolved column count (always a number for the grid var). */\n protected readonly resolvedCols = computed(() => {\n const cols = this.columns();\n if (cols !== \"auto\") {\n return cols;\n }\n return this.tiles().length <= 4 ? 2 : 3;\n });\n\n private readonly scrollLock = inject(ScrollLockService);\n private locked = false;\n\n constructor() {\n // Freeze the page scroll behind the full-screen launcher while it is open.\n effect(() => {\n const shouldLock = this.open();\n if (shouldLock && !this.locked) {\n this.scrollLock.lock();\n this.locked = true;\n } else if (!shouldLock && this.locked) {\n this.scrollLock.unlock();\n this.locked = false;\n }\n });\n inject(DestroyRef).onDestroy(() => {\n if (this.locked) {\n this.scrollLock.unlock();\n this.locked = false;\n }\n });\n }\n\n /** `Escape` closes the launcher. */\n @HostListener(\"document:keydown.escape\")\n protected onEscape(): void {\n if (this.open()) {\n this.open.set(false);\n }\n }\n\n /** Dismiss — the scrim + close-button target. */\n protected close(): void {\n this.open.set(false);\n }\n}\n","@if (open()) {\n <div class=\"nl-scrim\" (click)=\"close()\" aria-hidden=\"true\"></div>\n <div\n class=\"nl-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"label()\"\n [foldFocusTrap]=\"open()\"\n tabindex=\"-1\"\n >\n <button\n type=\"button\"\n class=\"nl-close\"\n (click)=\"close()\"\n aria-label=\"Close navigation\"\n >\n <fold-icon name=\"close\" size=\"md\" />\n </button>\n <div class=\"nl-grid\" [style.--nav-cols]=\"resolvedCols()\">\n <ng-content />\n </div>\n </div>\n}\n","import { Component, booleanAttribute, input } from \"@angular/core\";\n\n/**\n * `<fold-hero-card>` — a prominent header **card** (bordered surface). Same base\n * as {@link FoldCardComponent} (surface + border + radius + padding); lay the\n * content out inside however you like and project it via `<ng-content>`. For a\n * full-bleed, borderless page splash use `<fold-hero-section>` instead.\n *\n * Two orthogonal axes decide the look — a **base surface** and an optional\n * decorative **accent** painted on top of it (so any base can carry any accent):\n *\n * **`surface`** — the base fill:\n * - `card` (default) — the standard raised card (`surface-card`).\n * - `sunken` — the deep container tint (`surface-sunken` + fainter border).\n * - `primary` — a solid primary fill; text flips to `on-primary`.\n *\n * **`accent`** — a transparent gradient + glow overlay:\n * - `none` (default) — no overlay.\n * - `subtle` — a faint diagonal wash toward the deep tint + a soft corner glow.\n * - `gradient` — a primary-tinted wash + primary border + a stronger corner glow.\n *\n * **`accentBar`** — orthogonal: a primary accent bar down the left edge.\n *\n * ```html\n * <fold-hero-card surface=\"sunken\" accent=\"subtle\" accentBar>…</fold-hero-card>\n * <fold-hero-card accent=\"gradient\">…</fold-hero-card>\n * ```\n *\n * @selector `fold-hero-card`\n */\n@Component({\n selector: \"fold-hero-card\",\n standalone: true,\n host: {\n \"[class.s-sunken]\": \"surface() === 'sunken'\",\n \"[class.s-primary]\": \"surface() === 'primary'\",\n \"[class.a-subtle]\": \"accent() === 'subtle'\",\n \"[class.a-gradient]\": \"accent() === 'gradient'\",\n \"[class.has-bar]\": \"accentBar()\",\n \"[class.p-sm]\": \"padding() === 'sm'\",\n \"[class.p-md]\": \"padding() === 'md'\",\n },\n templateUrl: \"./hero-card.component.html\",\n styleUrl: \"./hero-card.component.scss\",\n})\nexport class FoldHeroCardComponent {\n /** Base fill — `card` (default) · `sunken` (deep tint) · `primary` (solid fill). */\n readonly surface = input<\"card\" | \"sunken\" | \"primary\">(\"card\");\n /** Decorative overlay — `none` (default) · `subtle` (diagonal + glow) · `gradient` (primary wash + glow). */\n readonly accent = input<\"none\" | \"subtle\" | \"gradient\">(\"none\");\n /** Inner padding — `lg` (default) · `md` · `sm`. */\n readonly padding = input<\"sm\" | \"md\" | \"lg\">(\"lg\");\n /** Add a primary accent bar down the left edge (composable with any surface). */\n readonly accentBar = input(false, { transform: booleanAttribute });\n}\n","<ng-content />\n","import { Directive, TemplateRef, inject, input } from \"@angular/core\";\n\n/**\n * Marks an `<ng-template>` as the cell renderer for a column key inside\n * `<fold-data-table>`:\n *\n * ```html\n * <ng-template foldCell=\"status\" let-row let-i=\"index\"> … </ng-template>\n * ```\n *\n * The template context is `{ $implicit: row, index }`. Rows are typed via the\n * table's `[rows]`; the projected template's `let-row` is untyped by design (a\n * generic content-projected template can't carry the row type without heavy\n * machinery), so annotate through the parent component's typed helper methods.\n */\n@Directive({ selector: \"ng-template[foldCell]\", standalone: true })\nexport class FoldDataTableCellDirective {\n /** The column `key` this template renders. */\n readonly foldCell = input.required<string>();\n readonly template = inject(TemplateRef);\n}\n","import {\n Component,\n type TemplateRef,\n booleanAttribute,\n computed,\n contentChildren,\n input,\n output,\n} from \"@angular/core\";\nimport { NgClass, NgTemplateOutlet } from \"@angular/common\";\nimport { FoldDataTableCellDirective } from \"./data-table-cell.directive\";\nimport type {\n FoldTableColumn,\n FoldTableEmpty,\n FoldTableSort,\n FoldTableTone,\n} from \"./data-table.types\";\n\n/**\n * `fold-data-table` — a controlled, presentational roster table. The parent\n * supplies already-paged/sorted `rows`, a `columns` definition, and a\n * `<ng-template foldCell=\"<key>\">` per column for the cell content; the table\n * owns the chrome (sticky sortable header, row tone accents, focus/click, the\n * mobile card layout, the empty state).\n *\n * Generic over the row type `T` so `rowKey`/`rowTone`/`rowClick` stay typed.\n * Cell templates are untyped (`let-row` is `any`) — render through the parent's\n * typed helpers.\n */\n@Component({\n selector: \"fold-data-table\",\n standalone: true,\n imports: [NgClass, NgTemplateOutlet],\n templateUrl: \"./data-table.component.html\",\n styleUrl: \"./data-table.component.scss\",\n})\nexport class FoldDataTableComponent<T> {\n readonly columns = input.required<readonly FoldTableColumn[]>();\n readonly rows = input.required<readonly T[]>();\n /** Stable row identity — defaults to the row index. */\n readonly rowKey = input<(row: T, index: number) => string | number>();\n /** Optional per-row semantic tone (left accent + tint). */\n readonly rowTone = input<(row: T) => FoldTableTone>();\n readonly sort = input<FoldTableSort | null>(null);\n readonly empty = input<FoldTableEmpty>();\n /** Makes rows focusable + clickable (emits `rowClick`). */\n readonly clickable = input(false, { transform: booleanAttribute });\n readonly zebra = input(false, { transform: booleanAttribute });\n readonly hover = input(true, { transform: booleanAttribute });\n readonly mobileCards = input(true, { transform: booleanAttribute });\n\n /** Emits the clicked sortable column's `key`. */\n readonly sortChange = output<string>();\n readonly rowClick = output<T>();\n\n private readonly cells = contentChildren(FoldDataTableCellDirective);\n private readonly cellMap = computed(() => {\n const map = new Map<string, TemplateRef<unknown>>();\n for (const cell of this.cells()) {\n map.set(cell.foldCell(), cell.template);\n }\n return map;\n });\n\n /** The first column is the identity/primary cell (full-width on mobile). */\n readonly primaryKey = computed(() => this.columns()[0]?.key ?? \"\");\n\n cellTemplate(key: string): TemplateRef<unknown> | null {\n return this.cellMap().get(key) ?? null;\n }\n\n keyOf(row: T, index: number): string | number {\n return this.rowKey()?.(row, index) ?? index;\n }\n\n toneOf(row: T): FoldTableTone {\n return this.rowTone()?.(row) ?? null;\n }\n\n isSorted(key: string): boolean {\n return this.sort()?.key === key;\n }\n\n /** The sort glyph for a column: neutral `↕`, or the active direction. */\n sortArrow(key: string): string {\n const sort = this.sort();\n if (sort?.key !== key) {\n return \"↕\";\n }\n return sort.dir === \"asc\" ? \"↑\" : \"↓\";\n }\n\n ariaSort(key: string): \"ascending\" | \"descending\" | \"none\" {\n const sort = this.sort();\n if (sort?.key !== key) {\n return \"none\";\n }\n return sort.dir === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n onRowActivate(row: T): void {\n if (this.clickable()) {\n this.rowClick.emit(row);\n }\n }\n}\n","<div\n class=\"folddt-wrap\"\n [class.folddt--zebra]=\"zebra()\"\n [class.folddt--hover]=\"hover()\"\n [class.folddt--cards]=\"mobileCards()\"\n>\n <table class=\"folddt\">\n <thead>\n <tr>\n @for (col of columns(); track col.key) {\n <th\n scope=\"col\"\n [style.width]=\"col.width || null\"\n [attr.aria-sort]=\"col.sortable ? ariaSort(col.key) : null\"\n >\n @if (col.sortable) {\n <button\n type=\"button\"\n class=\"folddt-th-sort\"\n [class.right]=\"col.align === 'right'\"\n (click)=\"sortChange.emit(col.key)\"\n >\n <span>{{ col.label }}</span>\n <span class=\"folddt-arrow\" [class.on]=\"isSorted(col.key)\">{{\n sortArrow(col.key)\n }}</span>\n </button>\n } @else {\n <span\n class=\"folddt-th-plain\"\n [class.right]=\"col.align === 'right'\"\n >{{ col.label }}</span\n >\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track keyOf(row, $index); let i = $index) {\n @let tone = toneOf(row);\n <tr\n class=\"folddt-row\"\n [class.tone-warning]=\"tone === 'warning'\"\n [class.tone-alert]=\"tone === 'alert'\"\n [class.tone-success]=\"tone === 'success'\"\n [class.clickable]=\"clickable()\"\n [attr.tabindex]=\"clickable() ? 0 : null\"\n (click)=\"onRowActivate(row)\"\n (keydown.enter)=\"onRowActivate(row)\"\n >\n @for (col of columns(); track col.key) {\n <td\n class=\"folddt-cell\"\n [class.is-primary]=\"col.key === primaryKey()\"\n [class.right]=\"col.align === 'right'\"\n [ngClass]=\"col.cellClass || ''\"\n [attr.data-label]=\"col.label\"\n >\n @if (cellTemplate(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n\n @if (rows().length === 0 && empty(); as e) {\n <div class=\"folddt-empty\">\n <div class=\"folddt-empty-t\">{{ e.title }}</div>\n @if (e.subtitle) {\n <div class=\"folddt-empty-s\">{{ e.subtitle }}</div>\n }\n </div>\n }\n</div>\n","import { Directive, computed, input } from \"@angular/core\";\n\n/** Where the column pins while the main content scrolls past it. */\nexport type FoldStickyColumnAnchor = \"top\" | \"center\" | \"bottom\";\n\n/**\n * `[foldStickyColumn]` — turns its host into a sticky side column: a vertical\n * flex stack that sticks while the main content scrolls past it. Meant for an\n * `<aside>` so the semantics stay (`<aside foldStickyColumn>…</aside>`), dropping\n * the hand-rolled `.sidebar { display:flex; … position:sticky }` boilerplate\n * every page was repeating.\n *\n * Layout only — no template, no wrapper element (it can't add one; grouping\n * still needs the `<aside>`).\n *\n * Anchor + offset are inputs; the rest stays tunable via CSS custom properties\n * so a page keeps control of what varies:\n * - `sticky` (default `top`) — pin to `top`, `center`, or `bottom` of the\n * scroll viewport.\n * - `stickyOffset` — distance from the pinned edge (a number = px, or any CSS\n * length). Defaults to `var(--fold-sticky-column-offset, 84px)` (the header\n * clearance); for `center` it nudges off dead-centre.\n * - `--fold-sticky-column-gap` (default `14px`) — the gap between stacked blocks.\n * - `--fold-sticky-column-position` (default `sticky`) — set to `static` in the\n * page's own responsive breakpoint to un-stick when the layout stacks.\n *\n * @example\n * ```html\n * <aside foldStickyColumn>…</aside> <!-- top, header offset -->\n * <aside foldStickyColumn sticky=\"bottom\">…</aside>\n * <aside foldStickyColumn sticky=\"center\">…</aside>\n * <aside foldStickyColumn [stickyOffset]=\"24\">…</aside>\n * ```\n * ```scss\n * // in the page, at its own stacking breakpoint:\n * @media (max-width: 1040px) {\n * aside[foldStickyColumn] { --fold-sticky-column-position: static; }\n * }\n * ```\n *\n * @selector `[foldStickyColumn]`\n */\n@Directive({\n selector: \"[foldStickyColumn]\",\n standalone: true,\n host: {\n \"[style.display]\": '\"flex\"',\n \"[style.flexDirection]\": '\"column\"',\n \"[style.alignSelf]\": \"alignSelfStyle()\",\n \"[style.gap]\": '\"var(--fold-sticky-column-gap, 14px)\"',\n \"[style.position]\": '\"var(--fold-sticky-column-position, sticky)\"',\n \"[style.top]\": \"topStyle()\",\n \"[style.bottom]\": \"bottomStyle()\",\n \"[style.transform]\": \"transformStyle()\",\n },\n})\nexport class FoldStickyColumnDirective {\n /** Which viewport edge (or centre) the column pins to. */\n readonly sticky = input<FoldStickyColumnAnchor>(\"top\");\n /** Distance from the pinned edge — a number (px) or any CSS length. */\n readonly stickyOffset = input<number | string>();\n\n /** The offset as a CSS length; falls back to the header-clearance var. */\n private readonly offsetCss = computed(() => {\n const o = this.stickyOffset();\n if (o === undefined) {\n return \"var(--fold-sticky-column-offset, 84px)\";\n }\n return typeof o === \"number\" ? `${o}px` : o;\n });\n\n protected readonly topStyle = computed(() => {\n switch (this.sticky()) {\n case \"bottom\":\n return \"auto\";\n case \"center\":\n return this.stickyOffset() === undefined\n ? \"50%\"\n : `calc(50% + ${this.offsetCss()})`;\n default:\n return this.offsetCss();\n }\n });\n\n protected readonly bottomStyle = computed(() =>\n this.sticky() === \"bottom\" ? this.offsetCss() : \"auto\",\n );\n\n /** The in-flow start position that makes `sticky` engage from scroll 0.\n * `sticky` pins only once the constraint is active at the element's natural\n * flow position: `top`/`center` (which pin the top edge, at 0 / 50%) need the\n * column at the *top* of its tall row (`start`); `bottom` needs it at the\n * *bottom* (`end`), else it starts off-screen and only catches mid-scroll. */\n protected readonly alignSelfStyle = computed(() =>\n this.sticky() === \"bottom\" ? \"end\" : \"start\",\n );\n\n /** Centre anchoring pins the top edge at 50%, then pulls back half its height. */\n protected readonly transformStyle = computed(() =>\n this.sticky() === \"center\" ? \"translateY(-50%)\" : \"none\",\n );\n}\n","import { Component, input, output } from \"@angular/core\";\n\nexport type FoldChoiceOption = {\n key: string;\n label: string;\n /** Optional trailing count badge (e.g. how many rows match this filter). */\n count?: number;\n};\n\n/**\n * `<fold-choice-row>` — a horizontal single-select control.\n *\n * One row, one active option, emits the chosen `key`; the parent owns the\n * state and feeds it back via `activeKey`. Two layouts:\n *\n * - `segmented` (default) — equal-width buttons that fill the row, no wrap.\n * The right shape for a small mode/segment toggle (2–4 options).\n * - `chips` — auto-width rounded chips that wrap. The right shape for a\n * status/category filter above a table or list.\n *\n * @selector `fold-choice-row`\n *\n * @example\n * ```html\n * <fold-choice-row\n * [options]=\"[{ key: 'manager', label: 'Manager' }, { key: 'member', label: 'Member' }]\"\n * [activeKey]=\"role()\"\n * (selected)=\"role.set($event)\"\n * />\n *\n * <fold-choice-row\n * layout=\"chips\"\n * [options]=\"statuses\"\n * [activeKey]=\"status()\"\n * ariaLabel=\"Filter by status\"\n * (selected)=\"setStatus($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-choice-row\",\n standalone: true,\n templateUrl: \"./choice-row.component.html\",\n // Inline + token-driven. Colours theme via fold-ng; the layout constants\n // (gaps, motion) are literals for now — a spacing/motion scale lands when a\n // second component needs one.\n styleUrl: \"./choice-row.component.scss\",\n})\nexport class FoldChoiceRowComponent {\n /** The selectable options, in display order. */\n readonly options = input.required<readonly FoldChoiceOption[]>();\n\n /** The `key` of the currently selected option. */\n readonly activeKey = input.required<string>();\n\n /** `segmented` (equal-width, default) or `chips` (auto-width, wraps). */\n readonly layout = input<\"segmented\" | \"chips\">(\"segmented\");\n\n /** Accessible label for the group. */\n readonly ariaLabel = input<string>(\"\");\n\n /** Emits the `key` of the clicked option. */\n readonly selected = output<string>();\n}\n","<div\n class=\"choice-row\"\n role=\"group\"\n [class.segmented]=\"layout() === 'segmented'\"\n [class.chips]=\"layout() === 'chips'\"\n [attr.aria-label]=\"ariaLabel() || null\"\n>\n @for (opt of options(); track opt.key) {\n <button\n type=\"button\"\n class=\"choice\"\n [class.is-active]=\"activeKey() === opt.key\"\n [attr.aria-pressed]=\"activeKey() === opt.key\"\n (click)=\"selected.emit(opt.key)\"\n >\n <span>{{ opt.label }}</span>\n @if (opt.count !== undefined) {\n <span class=\"choice-count\">{{ opt.count }}</span>\n }\n </button>\n }\n</div>\n","import {\n booleanAttribute,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n output,\n} from \"@angular/core\";\n\n/**\n * `[foldRepeatPress]` — press-and-hold auto-repeat.\n *\n * Fires `(foldRepeatPress)` once immediately on pointer press, then keeps firing\n * on a fixed cadence while the pointer is held, stopping on release, leave,\n * cancel or destroy. Bind `[foldRepeatPressDisabled]` to a reactive bound (e.g.\n * \"at max\") so the repeat also stops the instant the action becomes unavailable\n * mid-hold — a plain `pointerup` is unreliable once the host button disables\n * itself under the finger.\n *\n * Keyboard activation is intentionally out of scope: it produces `click`, not\n * `pointerdown`, so wire a separate `(click)` handler for Enter/Space.\n *\n * @selector `[foldRepeatPress]`\n *\n * @example\n * ```html\n * <button\n * foldRepeatPress\n * [foldRepeatPressDisabled]=\"atMax()\"\n * (foldRepeatPress)=\"step(1)\"\n * >+</button>\n * ```\n */\n@Directive({\n selector: \"[foldRepeatPress]\",\n standalone: true,\n host: {\n \"(pointerdown)\": \"start()\",\n \"(pointerup)\": \"stop()\",\n \"(pointerleave)\": \"stop()\",\n \"(pointercancel)\": \"stop()\",\n },\n})\nexport class FoldRepeatPressDirective {\n /** Fires immediately on press, then repeatedly while the pointer is held. */\n readonly repeat = output({ alias: \"foldRepeatPress\" });\n\n /** When true, a press does nothing and any running repeat stops at once. */\n readonly disabled = input(false, {\n transform: booleanAttribute,\n alias: \"foldRepeatPressDisabled\",\n });\n\n /** Delay before the auto-repeat begins, in ms. @default 350 */\n readonly delay = input(350, { alias: \"foldRepeatPressDelay\" });\n\n /** Cadence of the auto-repeat once started, in ms. @default 60 */\n readonly period = input(60, { alias: \"foldRepeatPressPeriod\" });\n\n private startTimer: ReturnType<typeof setTimeout> | null = null;\n private tick: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.stop());\n effect(() => {\n if (this.disabled()) {\n this.stop();\n }\n });\n }\n\n protected start(): void {\n if (this.disabled()) {\n return;\n }\n this.stop(); // never stack two hold cycles\n this.repeat.emit();\n this.startTimer = setTimeout(() => {\n this.tick = setInterval(() => this.repeat.emit(), this.period());\n }, this.delay());\n }\n\n protected stop(): void {\n if (this.startTimer !== null) {\n clearTimeout(this.startTimer);\n this.startTimer = null;\n }\n if (this.tick !== null) {\n clearInterval(this.tick);\n this.tick = null;\n }\n }\n}\n","import { Directive, booleanAttribute, input } from \"@angular/core\";\n\n/**\n * `[foldElevated]` — raise a surface into a **rounded, shadowed card**.\n *\n * It stamps `data-elevated`; the token layer styles it (radius + shadow). It\n * rides on whatever background the element already paints — so a chrome rail\n * stays chrome-coloured, just lifted. Put it on the element that owns the\n * surface's background (a projected `fold-menu`, an `app-header`, a content\n * wrapper), never on a transparent wrapper (which would raise an invisible card).\n *\n * **Elevate ≠ inset.** The directive only *raises* (radius + shadow); it does\n * not inset itself. The gutter around a floating region is the **container's**\n * job — padding on the slot, never a child margin, so a `height: 100%` region\n * fits with no overflow (an `fold-app-shell` pads a cell whose content is\n * elevated). Radius/shadow are tokenised (`--fold-surface-radius` /\n * `--fold-surface-shadow`), so a scope can dial the elevation without a new input.\n *\n * @selector `[foldElevated]`\n * @example\n * ```html\n * <fold-menu railPrimary foldElevated /> <!-- always raised -->\n * <app-header header [foldElevated]=\"dense()\" /> <!-- conditional -->\n * ```\n */\n@Directive({\n selector: \"[foldElevated]\",\n standalone: true,\n host: { \"[attr.data-elevated]\": \"foldElevated() ? '' : null\" },\n})\nexport class FoldElevatedDirective {\n /** Raise this surface (a bare `foldElevated` attribute → `true`). */\n readonly foldElevated = input(true, { transform: booleanAttribute });\n}\n","import { booleanAttribute, Component, input } from \"@angular/core\";\n\n/**\n * `<fold-label>` — the label element for a form control: the text plus an optional\n * required marker. Package-internal; the input controls render it through\n * {@link FoldInputBaseComponent}, so consumers never place it themselves. Kept\n * separate so the label + asterisk styling lives in one place (reusable later by\n * checkbox / radio groups).\n *\n * @selector `fold-label`\n */\n@Component({\n selector: \"fold-label\",\n standalone: true,\n template: `<label [attr.for]=\"for()\"\n >{{ text() }}\n @if (required()) {\n <span class=\"req\" aria-hidden=\"true\">*</span>\n } @else if (optional()) {\n <span class=\"opt\">({{ optionalLabel() }})</span>\n }\n </label>`,\n styleUrl: \"./label.component.scss\",\n})\nexport class FoldLabelComponent {\n /** The label text. */\n readonly text = input.required<string>();\n /** The id of the control this labels (`<label for>`). */\n readonly for = input<string>();\n /** Show the required marker (`*`). Takes precedence over {@link optional}. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter, parenthesised optional marker after the label. */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker's parentheses. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n}\n","import { booleanAttribute, Component, input } from \"@angular/core\";\nimport { FoldLabelComponent } from \"./label.component\";\n\n/**\n * `<fold-input-base>` — the shared field chrome around a form control: an optional\n * label (with required marker) above, the projected control, and an optional hint\n * below. Package-internal — each control ({@link FoldInputComponent},\n * `fold-number-input`, `fold-select`) composes it in its own template and projects\n * its native element in, so the label / required / hint (and, later, error)\n * markup lives in exactly one place instead of being duplicated per control.\n *\n * The control owns its id and passes it as {@link for} so the label associates\n * with it — no cross-encapsulation wiring, because the label and the control sit\n * in the same component template.\n *\n * @selector `fold-input-base`\n */\n@Component({\n selector: \"fold-input-base\",\n standalone: true,\n imports: [FoldLabelComponent],\n templateUrl: \"./input-base.component.html\",\n styleUrl: \"./input-base.component.scss\",\n})\nexport class FoldInputBaseComponent {\n /** Label text; omit for no label. */\n readonly label = input<string>();\n /** Id of the projected control, for the `<label for>` association. */\n readonly for = input<string>();\n /** Show the required marker on the label. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n /** Helper text shown under the control. */\n readonly hint = input<string>();\n /** Error message shown under the control; when set, it replaces the hint. */\n readonly error = input<string>();\n}\n","@if (label(); as labelText) {\n <fold-label\n [text]=\"labelText\"\n [for]=\"for()\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n />\n}\n\n<ng-content />\n\n@if (error(); as errorText) {\n <p\n class=\"ib-msg ib-error\"\n role=\"alert\"\n [attr.id]=\"for() ? for() + '-error' : null\"\n >\n {{ errorText }}\n </p>\n} @else if (hint(); as hintText) {\n <p class=\"ib-msg ib-hint\" [attr.id]=\"for() ? for() + '-hint' : null\">\n {{ hintText }}\n </p>\n}\n","/** Read `.value` off an input/select event target as a string, without `$any()`. */\nexport function readInputValue(event: Event): string {\n const target = event.target;\n if (target instanceof HTMLInputElement) {\n return target.value;\n }\n if (target instanceof HTMLSelectElement) {\n return target.value;\n }\n return \"\";\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldInputBaseComponent } from \"./input-base.component\";\nimport { readInputValue } from \"./input-value\";\n\n/**\n * `<fold-input>` — the text-input control (`value: string`): the *edit* half of a\n * record, where {@link FoldFieldComponent} is the *read* half. It renders an\n * optional label + a native `<input>` styled to the tokens, plus the field\n * chrome from {@link FoldInputBaseComponent} (label / required / hint / error).\n * When bound via `[formField]`, it surfaces the field's first validation error\n * under the input once touched. For numeric fields use {@link\n * FoldNumberInputComponent} — a separate control so each keeps its true value\n * type instead of a `string | number` union.\n *\n * Integrates with signal forms via the `FormValueControl` contract (bind with\n * `[formField]`), or drive it standalone with `[(value)]` / `(valueChange)`.\n * Variant, size and alignment are applied as host classes (`:host(.sm.center)`).\n *\n * @selector `fold-input`\n *\n * @example\n * ```html\n * <!-- Signal-forms field -->\n * <fold-input placeholder=\"Version name…\" [formField]=\"form.label\" />\n *\n * <!-- Standalone two-way -->\n * <fold-input size=\"sm\" placeholder=\"Filter…\" [(value)]=\"term\" />\n *\n * <!-- Read-only display -->\n * <fold-input [value]=\"title\" [readOnly]=\"true\" />\n * ```\n */\n@Component({\n selector: \"fold-input\",\n standalone: true,\n imports: [FoldInputBaseComponent],\n templateUrl: \"./input.component.html\",\n styleUrl: \"./input.component.scss\",\n host: {\n \"[class]\": 'size() + \" \" + align() + \" \" + variant()',\n },\n})\nexport class FoldInputComponent implements FormValueControl<string> {\n /** The bound value — a `model()` so signal forms' `FormField` and `[(value)]`\n * both keep it in sync. */\n readonly value = model<string>(\"\");\n /** Disabled state — bound automatically by `FormField` from the field. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on blur (so `FormField` marks the field\n * touched), and kept in sync with the field's touched state. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField` from the field. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /**\n * Native input type (text-like only; use {@link FoldNumberInputComponent} for numbers).\n * @default 'text'\n */\n readonly type = input<\"text\" | \"email\" | \"password\" | \"tel\" | \"url\">(\"text\");\n\n /**\n * Size preset controlling height, font-size, padding and border-radius.\n * - `sm` — compact (text-sm, tight padding) — inline table edits, compact forms\n * - `md` — standard (text-md) — default form fields\n * - `lg` — large (text-lg, generous padding) — prominent inputs\n * @default 'md'\n */\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n\n /**\n * Text alignment inside the input.\n * - `start` — left-aligned (default for text)\n * - `center` — centered (useful for short number fields like BPM, duration)\n * @default 'start'\n */\n readonly align = input<\"start\" | \"center\">(\"start\");\n\n /**\n * Visual variant.\n * - `default` — solid `--fold-color-surface-card` fill + focus glow ring;\n * standalone forms (auth, profile, dialogs).\n * - `panel` — flatter `--fold-color-surface-raised` fill, no focus glow, roomier\n * box (own padding / `radius-sm` / content-height, so `size` only drives the\n * font); reproduces the legacy side-panel `.field-input`.\n * @default 'default'\n */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n\n /** Optional label displayed above the input. */\n readonly label = input<string>();\n\n /** Show a required marker on the label (and set the native `required`). */\n readonly required = input(false, { transform: booleanAttribute });\n\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n\n /** Optional helper text shown under the input. */\n readonly hint = input<string>();\n\n /** Placeholder text. */\n readonly placeholder = input(\"\");\n\n /** Render as read-only. Named `readOnly` (not `readonly`) to avoid the\n * signal-forms `FormField` reserved `readonly` field-state binding. */\n readonly readOnly = input(false);\n\n /** Whether to autofocus on mount. */\n readonly autofocus = input(false);\n\n /**\n * Native `autocomplete` attribute — passes through to the `<input>`.\n *\n * Recommended values for auth forms:\n * - login email → `email` (or `username`)\n * - login password → `current-password`\n * - register email → `email`\n * - register password → `new-password`\n * - given / family names → `given-name` / `family-name`\n *\n * Browsers and password managers (Dashlane, 1Password, etc.) rely on\n * this to fill credentials correctly and silence DOM warnings.\n */\n readonly autocomplete = input<string | null>(null);\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-input\");\n\n /** The message to show under the field: the first error, once touched. */\n protected readonly errorMessage = computed<string | undefined>(() => {\n if (!this.touched()) {\n return undefined;\n }\n const first = this.errors()[0];\n return first ? (first.message ?? first.kind) : undefined;\n });\n\n /** `aria-describedby` target: the error when shown, else the hint, else none. */\n protected readonly describedBy = computed<string | null>(() => {\n if (this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.hint() ? `${this.inputId}-hint` : null;\n });\n\n /** Handles native input event. `value.set()` also fires the model's\n * auto `valueChange` output for standalone `(valueChange)` consumers. */\n onInputChange(event: Event): void {\n this.value.set(readInputValue(event));\n }\n\n /** Mark the field touched on blur, so errors can surface. */\n protected onBlur(): void {\n this.touched.set(true);\n }\n}\n","<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <input\n [id]=\"inputId\"\n [attr.type]=\"type()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.readonly]=\"readOnly() || null\"\n [attr.disabled]=\"disabled() || null\"\n [attr.required]=\"required() || null\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.autocomplete]=\"autocomplete()\"\n [value]=\"value()\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onBlur()\"\n />\n</fold-input-base>\n","/**\n * Pure numeric-settling helpers for {@link FoldNumberInputComponent}.\n *\n * Kept out of the component so \"what counts as a valid value\" is one small,\n * deterministic, independently-tested unit — blur and stepping both route\n * through {@link settleNumber}, so they can never diverge.\n */\nexport interface FoldNumberConstraints {\n /** The effective step (> 0); also the grid spacing and the default precision. */\n readonly step: number;\n /** Lower bound, if any (the constraints object always carries the key). */\n readonly min?: number | undefined;\n /** Upper bound, if any (the constraints object always carries the key). */\n readonly max?: number | undefined;\n /** Decimal-place cap; when omitted, precision is derived from {@link step}. */\n readonly decimals?: number | undefined;\n /** Whether the value must land on the step grid. */\n readonly snapToStep: boolean;\n}\n\n/** Decimal places carried by a finite number, robust to exponent form (`1e-7`). */\nexport function decimalsOf(n: number): number {\n if (!Number.isFinite(n)) {\n return 0;\n }\n const s = n.toString();\n const eIndex = s.indexOf(\"e-\");\n if (eIndex !== -1) {\n const mantissa = s.slice(0, eIndex);\n const dot = mantissa.indexOf(\".\");\n const mantissaDecimals = dot === -1 ? 0 : mantissa.length - dot - 1;\n return Number(s.slice(eIndex + 2)) + mantissaDecimals;\n }\n const dot = s.indexOf(\".\");\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\n/** Snap to the nearest grid point `base + k·step` (base = `min` ?? 0). */\nfunction snapToGrid(n: number, c: FoldNumberConstraints): number {\n const base = c.min ?? 0;\n return base + Math.round((n - base) / c.step) * c.step;\n}\n\n/** Round to the effective precision (kills float drift like 0.1 + 0.2). */\nfunction round(n: number, c: FoldNumberConstraints): number {\n const raw = c.decimals ?? decimalsOf(c.step);\n const places = Math.min(100, Math.max(0, raw));\n return Number(n.toFixed(places));\n}\n\n/** Clamp into the min/max bounds (each optional). */\nfunction clamp(n: number, c: FoldNumberConstraints): number {\n let out = n;\n if (c.min !== undefined) {\n out = Math.max(c.min, out);\n }\n if (c.max !== undefined) {\n out = Math.min(c.max, out);\n }\n return out;\n}\n\n/**\n * Resolve a raw number to a valid settled value: snap to the step grid (when\n * enabled) → round to the precision → clamp into `[min, max]`.\n */\nexport function settleNumber(n: number, c: FoldNumberConstraints): number {\n const snapped = c.snapToStep ? snapToGrid(n, c) : n;\n return clamp(round(snapped, c), c);\n}\n\n/**\n * Is `max` reachable on the step grid? False when `(max − base) % step ≠ 0`\n * (base = `min` ?? 0), i.e. the top bound sits between two grid points — with\n * snapping on, `max` is then only reachable off-grid via the clamp. No `max`\n * ⇒ nothing to misalign ⇒ true.\n */\nexport function isStepAligned(c: FoldNumberConstraints): boolean {\n if (c.max === undefined) {\n return true;\n }\n const steps = (c.max - (c.min ?? 0)) / c.step;\n return Math.abs(steps - Math.round(steps)) < 1e-9;\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n booleanAttribute,\n Component,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n model,\n} from \"@angular/core\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldRepeatPressDirective } from \"../../../directives/repeat-press.directive\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FoldInputBaseComponent } from \"./input-base.component\";\nimport { readInputValue } from \"./input-value\";\nimport {\n isStepAligned,\n settleNumber,\n type FoldNumberConstraints,\n} from \"./number-settle\";\n\n/** The increment/decrement glyph: chevrons, `− / +`, or no buttons. */\nexport type FoldNumberSpinner = \"none\" | \"arrows\" | \"plusminus\";\n/** Where the spinner buttons sit: stacked inside the box, or flanking it. */\nexport type FoldNumberControls = \"inside\" | \"outside\";\n\n/**\n * `<fold-number-input>` — the numeric sibling of {@link FoldInputComponent}. Split\n * out on purpose: a number field's value is a `number`, not a string, so keeping\n * it separate lets each control carry its true type (`FormValueControl<number |\n * null>` here, `FormValueControl<string>` for text) instead of the leaky\n * `string | number` union one shared control would force onto every Signal Forms\n * field. It also keeps the number-only knobs ({@link min} / {@link max} /\n * {@link step}) off the text input.\n *\n * Empty is a first-class value: clearing the field sets `null` (not `0`, not\n * `NaN`), so an optional number reads correctly. Shares the exact visual shell as\n * `fold-input` (same tokens, sizes, variants) via `input-shell.scss`.\n *\n * @selector `fold-number-input`\n *\n * @example\n * ```html\n * <!-- Signal-forms field (form.bpm: number) -->\n * <fold-number-input placeholder=\"BPM\" [min]=\"0\" [formField]=\"form.bpm\" />\n *\n * <!-- Standalone two-way -->\n * <fold-number-input align=\"center\" [step]=\"0.5\" [(value)]=\"gain\" />\n * ```\n */\n@Component({\n selector: \"fold-number-input\",\n standalone: true,\n imports: [\n FoldInputBaseComponent,\n FoldIconComponent,\n FoldRepeatPressDirective,\n NgTemplateOutlet,\n ],\n templateUrl: \"./number-input.component.html\",\n styleUrl: \"./number-input.component.scss\",\n host: {\n \"[class]\": 'size() + \" \" + align() + \" \" + variant()',\n },\n})\nexport class FoldNumberInputComponent implements FormValueControl<\n number | null\n> {\n /** The bound value — `null` when the field is empty. A `model()` so signal\n * forms' `FormField` and `[(value)]` both keep it in sync. */\n readonly value = model<number | null>(null);\n /** Disabled state — bound automatically by `FormField` from the field. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on blur (so `FormField` marks the field\n * touched), and kept in sync with the field's touched state. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField` from the field. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n\n /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n /** Text alignment inside the box. @default 'start' */\n readonly align = input<\"start\" | \"center\">(\"start\");\n /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n\n /** Optional label displayed above the input. */\n readonly label = input<string>();\n /** Show a required marker on the label (and set the native `required`). */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n /** Optional helper text shown under the input. */\n readonly hint = input<string>();\n /** Placeholder text. */\n readonly placeholder = input(\"\");\n /** Render as read-only. Named `readOnly` to avoid the `FormField` reserved binding. */\n readonly readOnly = input(false);\n\n /** Minimum value — passthrough + bound by a field's `min` validator. */\n readonly min = input<number | undefined>(undefined);\n /** Maximum value — passthrough + bound by a field's `max` validator. */\n readonly max = input<number | undefined>(undefined);\n /** Increment applied by the spinner buttons / arrow keys. @default 1 */\n readonly step = input<number | undefined>(undefined);\n\n /** The step glyph — `plusminus` (`−`/`+`, default), `arrows` (chevrons), `none`. */\n readonly spinner = input<FoldNumberSpinner>(\"plusminus\");\n /** Where the buttons sit — `inside` the box (default) or `outside`, flanking it. */\n readonly controls = input<FoldNumberControls>(\"inside\");\n\n /** Show the {@link step} as a small suffix, so the increment is visible. */\n readonly showStep = input(false, { transform: booleanAttribute });\n\n /**\n * Keep the value on the step grid. When on, a manually typed value snaps to\n * the nearest valid `base + n·step` **on blur** (base is {@link min}, else 0),\n * then clamps to min/max — so free typing is allowed while editing, and the\n * settled value always respects the step. Off by default.\n */\n readonly snapToStep = input(false, { transform: booleanAttribute });\n\n /**\n * Cap the number of decimal places on the settled value: it is rounded to this\n * many decimals when stepping and on blur. `undefined` = unconstrained (any\n * decimals allowed). See {@link integer} for the `0` shorthand.\n */\n readonly decimals = input<number | undefined>(undefined);\n\n /** Shorthand for `decimals = 0` — integers only. Takes precedence over {@link decimals}. */\n readonly integer = input(false, { transform: booleanAttribute });\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-number-input\");\n\n /** The effective step (defaults to 1 when unset). */\n protected readonly effectiveStep = computed(() => this.step() ?? 1);\n\n /** The resolved decimal cap: `0` when {@link integer}, else {@link decimals}. */\n private readonly maxDecimals = computed<number | undefined>(() =>\n this.integer() ? 0 : this.decimals(),\n );\n\n /** The active numeric constraints — shared by settling and the alignment check. */\n private readonly constraints = computed<FoldNumberConstraints>(() => ({\n step: this.effectiveStep(),\n min: this.min(),\n max: this.max(),\n decimals: this.maxDecimals(),\n snapToStep: this.snapToStep(),\n }));\n\n /** The native `step` attribute — `1` for integers with no explicit step. */\n protected readonly nativeStep = computed<number | undefined>(\n () => this.step() ?? (this.integer() ? 1 : undefined),\n );\n\n /** At/below the min bound — the decrement button is disabled. */\n protected readonly atMin = computed(() => {\n const min = this.min();\n const v = this.value();\n return min !== undefined && v !== null && v <= min;\n });\n\n /** At/above the max bound — the increment button is disabled. */\n protected readonly atMax = computed(() => {\n const max = this.max();\n const v = this.value();\n return max !== undefined && v !== null && v >= max;\n });\n\n /** Whether any spinner button renders. */\n protected readonly hasControls = computed(() => this.spinner() !== \"none\");\n /** Non-interactive (disabled or read-only) → both buttons off. */\n private readonly frozen = computed(() => this.disabled() || this.readOnly());\n /** The increment button is disabled. */\n protected readonly incDisabled = computed(\n () => this.frozen() || this.atMax(),\n );\n /** The decrement button is disabled. */\n protected readonly decDisabled = computed(\n () => this.frozen() || this.atMin(),\n );\n\n /** The message to show under the field: the first error, once touched. */\n protected readonly errorMessage = computed<string | undefined>(() => {\n if (!this.touched()) {\n return undefined;\n }\n const first = this.errors()[0];\n return first ? (first.message ?? first.kind) : undefined;\n });\n\n /** `aria-describedby` target: the error when shown, else the hint, else none. */\n protected readonly describedBy = computed<string | null>(() => {\n if (this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.hint() ? `${this.inputId}-hint` : null;\n });\n\n constructor() {\n // Dev-only nudge: with snapping on, an off-grid `max` is only reachable via\n // the clamp — usually a step/min/max mismatch the author wants to know about.\n effect(() => {\n if (this.snapToStep() && !isStepAligned(this.constraints())) {\n this.warnStepMisaligned();\n }\n });\n }\n\n /** Parses the native value: empty or unparseable → `null`, otherwise a `number`. */\n onInputChange(event: Event): void {\n const raw = readInputValue(event);\n if (raw === \"\") {\n this.value.set(null);\n return;\n }\n const parsed = Number(raw);\n this.value.set(Number.isNaN(parsed) ? null : parsed);\n }\n\n /** On blur: mark touched; settle the value onto its constraints when any apply. */\n protected onBlur(): void {\n this.touched.set(true);\n const v = this.value();\n if (v === null || !Number.isFinite(v)) {\n return;\n }\n if (this.snapToStep() || this.maxDecimals() !== undefined) {\n this.value.set(this.settle(v));\n }\n }\n\n /** Keyboard-only click (Enter/Space have `detail === 0`); pointer presses are\n * driven by {@link FoldRepeatPressDirective} so they don't double-step. */\n protected onButtonClick(direction: 1 | -1, event: MouseEvent): void {\n if (event.detail === 0) {\n this.stepBy(direction);\n }\n }\n\n /** Own the ↑/↓ arrows so keyboard stepping obeys snap/clamp/precision, not the\n * native `step` (which would only reconcile on blur). */\n protected onArrow(direction: 1 | -1, event: Event): void {\n event.preventDefault();\n this.stepBy(direction);\n }\n\n /** A focused number field changes value on scroll — blur so the page scrolls\n * instead (blur on an unfocused input is a no-op). */\n protected onWheel(event: WheelEvent): void {\n if (event.target instanceof HTMLElement) {\n event.target.blur();\n }\n }\n\n /** The glyph for a step button in the given direction (arrows vs `− / +`). */\n protected iconFor(direction: 1 | -1): FoldIconName {\n if (this.spinner() === \"arrows\") {\n return direction === 1 ? \"chevron-up\" : \"chevron-down\";\n }\n return direction === 1 ? \"plus\" : \"minus\";\n }\n\n /** Nudge the value by ±step, then settle it onto its constraints. */\n protected stepBy(direction: 1 | -1): void {\n if (this.disabled() || this.readOnly()) {\n return;\n }\n const raw = (this.value() ?? 0) + direction * this.effectiveStep();\n this.value.set(this.settle(raw));\n this.touched.set(true);\n }\n\n /**\n * Resolve a raw number to a valid settled value — the single source of truth\n * for \"what counts as valid\", so blur and stepping never diverge. Delegates to\n * the pure {@link settleNumber} with the current constraints.\n */\n private settle(n: number): number {\n return settleNumber(n, this.constraints());\n }\n\n private warnStepMisaligned(): void {\n if (isDevMode()) {\n console.warn(\n `[fold-number-input] max ${String(this.max())} is off the step grid ` +\n `(${this.min() ?? 0} + k·${this.effectiveStep()}); with snapToStep it ` +\n `is only reachable via the clamp, not by stepping.`,\n );\n }\n }\n}\n","<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <ng-template\n #stepBtn\n let-dir=\"dir\"\n let-size=\"size\"\n let-cls=\"cls\"\n let-off=\"off\"\n >\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [class]=\"cls\"\n [disabled]=\"off\"\n [attr.aria-label]=\"dir === 1 ? 'Increment' : 'Decrement'\"\n foldRepeatPress\n [foldRepeatPressDisabled]=\"off\"\n (foldRepeatPress)=\"stepBy(dir)\"\n (click)=\"onButtonClick(dir, $event)\"\n >\n <fold-icon [name]=\"iconFor(dir)\" [size]=\"size\" />\n </button>\n </ng-template>\n\n <div\n class=\"ni-field\"\n [class.ni-inside]=\"controls() === 'inside'\"\n [class.ni-outside]=\"controls() === 'outside'\"\n >\n @if (hasControls() && controls() === \"outside\") {\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: -1,\n size: 'sm',\n cls: 'ni-btn ni-dec',\n off: decDisabled(),\n }\n \"\n />\n }\n\n <div class=\"ni-box\">\n <input\n [id]=\"inputId\"\n type=\"number\"\n [attr.min]=\"min()\"\n [attr.max]=\"max()\"\n [attr.step]=\"nativeStep()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.readonly]=\"readOnly() || null\"\n [attr.disabled]=\"disabled() || null\"\n [attr.required]=\"required() || null\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [value]=\"value()\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onBlur()\"\n (keydown.arrowUp)=\"onArrow(1, $event)\"\n (keydown.arrowDown)=\"onArrow(-1, $event)\"\n (wheel)=\"onWheel($event)\"\n />\n\n @if (showStep() && step() != null) {\n <span class=\"ni-step\" aria-hidden=\"true\">{{ step() }}</span>\n }\n\n @if (hasControls() && controls() === \"inside\") {\n <span class=\"ni-stack\">\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: 1,\n size: 'xs',\n cls: 'ni-stack-btn ni-inc',\n off: incDisabled(),\n }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: -1,\n size: 'xs',\n cls: 'ni-stack-btn ni-dec',\n off: decDisabled(),\n }\n \"\n />\n </span>\n }\n </div>\n\n @if (hasControls() && controls() === \"outside\") {\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: 1,\n size: 'sm',\n cls: 'ni-btn ni-inc',\n off: incDisabled(),\n }\n \"\n />\n }\n </div>\n</fold-input-base>\n","import { Component, DestroyRef, inject, input, output } from \"@angular/core\";\nimport { FoldInputComponent } from \"./input.component\";\n\n/**\n * `<fold-search>` — an {@link FoldInputComponent} that **debounces its emit**: it\n * fires `searchChange` only once typing pauses for `delayMs`, so a fast typer\n * triggers one query instead of one per keystroke. The delay is adjustable; the\n * emitted term is trimmed and de-duplicated (no emit when the settled value is\n * unchanged). A thin wrapper over the text input — the search *behaviour*, not a\n * new control.\n *\n * @selector `fold-search`\n *\n * @example\n * ```html\n * <fold-search\n * placeholder=\"Search name, email, job…\"\n * (searchChange)=\"store.setSearch($event)\" />\n * ```\n */\n@Component({\n selector: \"fold-search\",\n standalone: true,\n imports: [FoldInputComponent],\n template: `\n <fold-input\n type=\"text\"\n [placeholder]=\"placeholder()\"\n [size]=\"size()\"\n [variant]=\"variant()\"\n (valueChange)=\"onInput($event)\"\n />\n `,\n styles: `\n :host {\n display: block;\n }\n `,\n})\nexport class FoldSearchComponent {\n readonly placeholder = input(\"\");\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n /** Visual variant, forwarded to the inner `fold-input` (`panel` for side-panel\n * forms; `default` elsewhere). */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n /** Quiet period after the last keystroke before emitting, in ms. */\n readonly delayMs = input(300);\n /** Emits the trimmed term once typing pauses for `delayMs` (deduped). */\n readonly searchChange = output<string>();\n\n private timer: ReturnType<typeof setTimeout> | null = null;\n private lastEmitted = \"\";\n\n constructor() {\n // A pending timer that outlives the view would fire a stray emit.\n inject(DestroyRef).onDestroy(() => this.clear());\n }\n\n protected onInput(value: string): void {\n const term = value.trim();\n this.clear();\n this.timer = setTimeout(() => {\n if (term !== this.lastEmitted) {\n this.lastEmitted = term;\n this.searchChange.emit(term);\n }\n }, this.delayMs());\n }\n\n private clear(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldInputBaseComponent } from \"./input-base.component\";\nimport { readInputValue } from \"./input-value\";\n\n/**\n * `<fold-select>` — the dropdown sibling of {@link FoldInputComponent} and\n * `fold-number-input`. A thin wrapper around a **native `<select>`** (like\n * `fold-slider` wraps the native range), so it honours the project's Signal-Forms\n * convention (native `[value]` / `(change)`) rather than a bespoke ARIA listbox.\n *\n * Options are **projected** as real `<option>` elements, matching how the app\n * already writes them, so migrating a raw `<select>` is a mechanical wrap:\n *\n * ```html\n * <fold-select label=\"Devise\" [(value)]=\"currency\" placeholder=\"Choisir…\">\n * @for (c of currencies; track c) {\n * <option [value]=\"c\">{{ c }}</option>\n * }\n * </fold-select>\n * ```\n *\n * Shares the exact box chrome (tokens, sizes, `panel` variant) as `fold-input`\n * via `input-shell.scss`, and the label / required / hint / error chrome via\n * {@link FoldInputBaseComponent}. The value is the native string; parse to a\n * number/id in the consumer (as with a raw `<select>`).\n *\n * @selector `fold-select`\n */\n@Component({\n selector: \"fold-select\",\n standalone: true,\n imports: [FoldInputBaseComponent, FoldIconComponent],\n templateUrl: \"./select.component.html\",\n styleUrl: \"./select.component.scss\",\n host: {\n \"[class]\": 'size() + \" \" + variant()',\n },\n})\nexport class FoldSelectComponent implements FormValueControl<string> {\n /** The selected value (the native option string). A `model()` so `FormField`\n * and `[(value)]` both stay in sync. */\n readonly value = model<string>(\"\");\n /** Disabled state — bound automatically by `FormField`. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on blur, kept in sync with the field. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField`. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n\n /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n\n /** Optional label displayed above the control. */\n readonly label = input<string>();\n /** Show a required marker on the label (and set the native `required`). */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n /** Optional helper text shown under the control. */\n readonly hint = input<string>();\n /** Optional placeholder — a leading, disabled option shown while empty. */\n readonly placeholder = input<string>();\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-select\");\n\n /** The message to show under the field: the first error, once touched. */\n protected readonly errorMessage = computed<string | undefined>(() => {\n if (!this.touched()) {\n return undefined;\n }\n const first = this.errors()[0];\n return first ? (first.message ?? first.kind) : undefined;\n });\n\n /** `aria-describedby` target: the error when shown, else the hint, else none. */\n protected readonly describedBy = computed<string | null>(() => {\n if (this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.hint() ? `${this.inputId}-hint` : null;\n });\n\n /** Write the chosen native value back through the model. */\n onChange(event: Event): void {\n this.value.set(readInputValue(event));\n }\n\n /** Mark the field touched on blur, so errors can surface. */\n protected onBlur(): void {\n this.touched.set(true);\n }\n}\n","<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <div class=\"sel-wrap\">\n <select\n [id]=\"inputId\"\n class=\"sel\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() || null\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [value]=\"value()\"\n (change)=\"onChange($event)\"\n (blur)=\"onBlur()\"\n >\n @if (placeholder(); as ph) {\n <option value=\"\" disabled hidden>{{ ph }}</option>\n }\n <ng-content />\n </select>\n <fold-icon\n name=\"chevron-down\"\n size=\"sm\"\n class=\"sel-caret\"\n aria-hidden=\"true\"\n />\n </div>\n</fold-input-base>\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { readInputValue } from \"../../forms/input/input-value\";\n\n/**\n * `<fold-slider>` — a single-value range slider with the design-system track,\n * fill and thumb (a styled native `<input type=\"range\">`). Two-way bound via\n * `[(value)]`.\n *\n * The fill is driven by a `--sl-pct` custom property computed from the value, so\n * there is no overlay markup. For a min↔max pair, use {@link FoldRangeSliderComponent}.\n *\n * @selector `fold-slider`\n *\n * @example\n * ```html\n * <fold-slider label=\"railWidth\" [min]=\"48\" [max]=\"120\" [(value)]=\"width\" />\n * <fold-slider label=\"min\" [max]=\"10\" [valueText]=\"min() || 'off'\" [(value)]=\"min\" />\n * ```\n */\n@Component({\n selector: \"fold-slider\",\n standalone: true,\n templateUrl: \"./slider.component.html\",\n styleUrl: \"./slider.component.scss\",\n})\nexport class FoldSliderComponent {\n /** The bound value. A `model()` so `[(value)]` keeps it in sync. */\n readonly value = model<number>(0);\n /** Minimum value. @default 0 */\n readonly min = input<number>(0);\n /** Maximum value. @default 100 */\n readonly max = input<number>(100);\n /** Increment granularity. @default 1 */\n readonly step = input<number>(1);\n /** Optional label shown above the track (also the `aria-label`). */\n readonly label = input<string>();\n /** Override the displayed value text — e.g. `'off'` when the value means \"no bound\". */\n readonly valueText = input<string>();\n /** Show the current value next to the label. @default true */\n readonly showValue = input(true, { transform: booleanAttribute });\n /** Disable interaction. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-slider\");\n\n /** Fill percentage (0–100) of the track, from the value within [min, max]. */\n protected readonly percent = computed<number>(() => {\n const range = this.max() - this.min();\n if (range <= 0) {\n return 0;\n }\n const pct = ((this.value() - this.min()) / range) * 100;\n return Math.max(0, Math.min(100, pct));\n });\n\n /** The value text to display: the explicit {@link valueText} override, else the number. */\n protected readonly display = computed<string>(\n () => this.valueText() ?? String(this.value()),\n );\n\n protected onInput(event: Event): void {\n this.value.set(Number(readInputValue(event)));\n }\n}\n","<div class=\"sl\">\n @if (label() || showValue()) {\n <div class=\"sl-head\">\n @if (label()) {\n <span class=\"sl-label\">{{ label() }}</span>\n }\n @if (showValue()) {\n <span class=\"sl-value\">{{ display() }}</span>\n }\n </div>\n }\n <input\n [id]=\"inputId\"\n class=\"sl-input\"\n type=\"range\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [style.--sl-pct]=\"percent() + '%'\"\n [attr.aria-label]=\"label()\"\n (input)=\"onInput($event)\"\n />\n</div>\n","import { Component, computed, input, output } from \"@angular/core\";\nimport { readInputValue } from \"../../forms/input/input-value\";\n\n/** A min↔max pair emitted by {@link FoldRangeSliderComponent}. */\nexport type FoldRangeValue = { min: number; max: number };\n\n/**\n * `<fold-range-slider>` — a dual-thumb range slider selecting a `{ min, max }`\n * window over `[min, max]`. Shares the design-system track / fill / thumb with\n * {@link FoldSliderComponent}. For a single value, use `fold-slider`.\n *\n * @selector `fold-range-slider`\n *\n * @example\n * ```html\n * <fold-range-slider label=\"BPM\" [min]=\"60\" [max]=\"220\" [step]=\"5\"\n * [value]=\"bpm()\" (valueChange)=\"onBpm($event)\" />\n * ```\n */\n@Component({\n selector: \"fold-range-slider\",\n standalone: true,\n templateUrl: \"./range-slider.component.html\",\n styleUrl: \"./range-slider.component.scss\",\n})\nexport class FoldRangeSliderComponent {\n /** Label shown above the track. */\n readonly label = input.required<string>();\n /** Lower bound of the selectable range. @default 0 */\n readonly min = input<number>(0);\n /** Upper bound of the selectable range. @default 100 */\n readonly max = input<number>(100);\n /** Increment granularity. @default 1 */\n readonly step = input<number>(1);\n /** The current `{ min, max }` window; falls back to the full range when unset. */\n readonly value = input<FoldRangeValue | undefined>(undefined);\n /** How the values are formatted for display. @default 'number' */\n readonly unit = input<\"number\" | \"duration\">(\"number\");\n\n /** Emits the new window whenever either thumb moves. */\n readonly valueChange = output<FoldRangeValue>();\n\n protected readonly currentMin = computed(\n () => this.value()?.min ?? this.min(),\n );\n protected readonly currentMax = computed(\n () => this.value()?.max ?? this.max(),\n );\n\n protected readonly fillLeft = computed(() => {\n const range = this.max() - this.min();\n return range === 0 ? 0 : ((this.currentMin() - this.min()) / range) * 100;\n });\n\n protected readonly fillWidth = computed(() => {\n const range = this.max() - this.min();\n if (range === 0) {\n return 100;\n }\n return ((this.currentMax() - this.currentMin()) / range) * 100;\n });\n\n protected formatValue(val: number): string {\n if (this.unit() === \"duration\") {\n const m = Math.floor(val / 60);\n const s = val % 60;\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n }\n return String(val);\n }\n\n protected onMinChange(event: Event): void {\n const val = Number(readInputValue(event));\n this.valueChange.emit({\n min: Math.min(val, this.currentMax()),\n max: this.currentMax(),\n });\n }\n\n protected onMaxChange(event: Event): void {\n const val = Number(readInputValue(event));\n this.valueChange.emit({\n min: this.currentMin(),\n max: Math.max(val, this.currentMin()),\n });\n }\n}\n","<div class=\"rs\">\n <span class=\"rs-label\">{{ label() }}</span>\n <div class=\"rs-track-wrap\">\n <div class=\"rs-track\">\n <div\n class=\"rs-fill\"\n [style.left.%]=\"fillLeft()\"\n [style.width.%]=\"fillWidth()\"\n ></div>\n </div>\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--min\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMin()\"\n [attr.aria-label]=\"label() + ' minimum'\"\n (input)=\"onMinChange($event)\"\n />\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--max\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMax()\"\n [attr.aria-label]=\"label() + ' maximum'\"\n (input)=\"onMaxChange($event)\"\n />\n </div>\n <span class=\"rs-values\"\n >{{ formatValue(currentMin()) }} – {{ formatValue(currentMax()) }}</span\n >\n</div>\n","import { booleanAttribute, Component, computed, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/** Severity of a {@link FoldCalloutComponent} — colour + default icon. */\nexport type FoldCalloutVariant =\n \"neutral\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"alert\";\n\n/** How the callout meets its container. */\nexport type FoldCalloutAppearance = \"inset\" | \"flat\";\n\n/** Default glyph per variant — overridable with the `icon` input. */\nconst DEFAULT_ICON: Record<FoldCalloutVariant, FoldIconName> = {\n neutral: \"info\",\n accent: \"lightning\",\n info: \"info\",\n success: \"completed\",\n warning: \"warning\",\n alert: \"warning\",\n};\n\n/**\n * `<fold-callout>` — a tinted message row: a status colour, an icon, a short\n * message, and optional actions on the trailing edge.\n *\n * Two appearances, and the difference is where it sits rather than how loud it\n * is:\n * - `inset` (default) — a bordered, rounded row **in** the flow, like a card.\n * - `flat` — a full-bleed band: no radius, no side borders, hairlines top and\n * bottom only, so it reads as a strip **of** its container (drop one into a\n * `<fold-card padding=\"none\">` and it spans the card edge to edge).\n *\n * The message is projected, so it can carry `<strong>`, links or a second\n * sentence. Colour comes from the status token families, so every theme is\n * handled without the callout knowing any of them. `accent` is the odd one:\n * it states no severity, it tints with the brand — for a callout that promotes\n * rather than warns (a new capability, a tip). Same name as `fold-badge`'s\n * brand tint, on purpose.\n *\n * ## Inputs\n * | Input | Type | Default |\n * |--------------|------------------------------------------------------|-------------|\n * | `variant` | `neutral \\| accent \\| info \\| success \\| warning \\| alert` | `neutral` |\n * | `appearance` | `inset \\| flat` | `inset` |\n * | `icon` | `FoldIconName` — overrides the variant's glyph | — |\n * | `announce` | `boolean` — see below | `false` |\n *\n * `announce` is for a callout that **appears in response to something** (a\n * failed save, a quota just crossed): it turns the host into a live region so\n * a screen reader reads it out — assertively for `alert`, politely otherwise.\n * A callout that is simply part of the page stays a passive `note`; announcing\n * static content is noise, not accessibility.\n *\n * ## Slots\n * - default → the message.\n * - `[actions]` → trailing controls. Project a small control (`size=\"sm\"`) —\n * a callout is a line of text, and a full-size button turns it into a bar.\n * The callout cannot enforce it: view encapsulation puts projected content\n * out of its reach.\n *\n * The resolved {@link role} and {@link ariaLive} are exposed (`exportAs:\n * \"foldCallout\"`) because `announce` changes nothing on screen — reading them\n * back is the only way to see it work.\n *\n * @selector `fold-callout`\n *\n * @example\n * ```html\n * <fold-callout variant=\"warning\">\n * This contract is <strong>locked</strong> — no more edits.\n * </fold-callout>\n *\n * <fold-card padding=\"none\">\n * <fold-callout variant=\"alert\" appearance=\"flat\" announce>\n * Quota exceeded.\n * <button foldButton actions size=\"sm\" variant=\"ghost\">Upgrade</button>\n * </fold-callout>\n * </fold-card>\n * ```\n */\n@Component({\n selector: \"fold-callout\",\n standalone: true,\n exportAs: \"foldCallout\",\n imports: [FoldIconComponent],\n host: {\n \"[attr.role]\": \"role()\",\n \"[attr.aria-live]\": \"ariaLive()\",\n \"[class.v-neutral]\": \"variant() === 'neutral'\",\n \"[class.v-accent]\": \"variant() === 'accent'\",\n \"[class.v-info]\": \"variant() === 'info'\",\n \"[class.v-success]\": \"variant() === 'success'\",\n \"[class.v-warning]\": \"variant() === 'warning'\",\n \"[class.v-alert]\": \"variant() === 'alert'\",\n \"[class.is-flat]\": \"appearance() === 'flat'\",\n },\n templateUrl: \"./callout.component.html\",\n styleUrl: \"./callout.component.scss\",\n})\nexport class FoldCalloutComponent {\n readonly variant = input<FoldCalloutVariant>(\"neutral\");\n readonly appearance = input<FoldCalloutAppearance>(\"inset\");\n /** Override the variant's default glyph. */\n readonly icon = input<FoldIconName>();\n /** Announce this callout when it appears — see the class doc. */\n readonly announce = input(false, { transform: booleanAttribute });\n\n protected readonly iconName = computed<FoldIconName>(\n () => this.icon() ?? DEFAULT_ICON[this.variant()],\n );\n\n /** The resolved ARIA role — public so a consumer (or the gallery) can show\n * what `announce` actually did, since it changes nothing visually. */\n readonly role = computed(() => {\n if (!this.announce()) {\n return \"note\";\n }\n return this.variant() === \"alert\" ? \"alert\" : \"status\";\n });\n\n /** The resolved live-region politeness, or `null` when passive. */\n readonly ariaLive = computed(() => {\n if (!this.announce()) {\n return null;\n }\n return this.variant() === \"alert\" ? \"assertive\" : \"polite\";\n });\n}\n","<fold-icon class=\"callout-icon\" [name]=\"iconName()\" [size]=\"15\" />\n<span class=\"callout-body\"><ng-content /></span>\n<span class=\"callout-actions\"><ng-content select=\"[actions]\" /></span>\n","import { Component, inject, model } from \"@angular/core\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * `<fold-disclosure>` — one summary that toggles one collapsible panel. The\n * single primitive; an accordion is a *set* of these (one open at a time is the\n * consumer's job — bind each `open` and clear the others), so the library ships\n * the piece, not the policy.\n *\n * Not `<details>`: native `<details>` display-none's its content when closed,\n * which cannot animate. This drives the panel with a `grid-template-rows`\n * `0fr → 1fr` transition (the content stays in flow, just clipped to zero\n * height), and wires the disclosure ARIA by hand — the summary is a `button`\n * with `aria-expanded` pointing at the panel via `aria-controls`.\n *\n * Content projection:\n * - `[summary]` → the always-visible trigger label (text, or a richer row).\n * - default slot → the collapsible panel.\n *\n * Two-way `open` (`[(open)]`) reflects and controls the state; a one-way\n * `[open]=\"true\"` starts it expanded; `toggle()` on the host (`exportAs:\n * \"foldDisclosure\"`) flips it from a template.\n *\n * Colour is CSS custom properties so a plain disclosure and a loud call-to-open\n * are the same component: `--fold-disclosure-summary-bg` (transparent) and\n * `--fold-disclosure-summary-color` (text) tint the summary bar — set them to a\n * primary fill for a CTA.\n *\n * @selector `fold-disclosure`\n *\n * @example\n * ```html\n * <fold-disclosure>\n * <span summary>How it works</span>\n * <p>The panel, revealed on click.</p>\n * </fold-disclosure>\n * ```\n */\n@Component({\n selector: \"fold-disclosure\",\n standalone: true,\n imports: [FoldIconComponent],\n exportAs: \"foldDisclosure\",\n host: { \"[class.is-open]\": \"open()\" },\n templateUrl: \"./disclosure.component.html\",\n styleUrl: \"./disclosure.component.scss\",\n})\nexport class FoldDisclosureComponent {\n /** Whether the panel is expanded. Two-way: `[(open)]`. */\n readonly open = model(false);\n\n /** Panel id, so the summary button can point `aria-controls` at it. */\n protected readonly panelId = inject(FoldIdService).next(\"fold-disclosure\");\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n}\n","<button\n type=\"button\"\n class=\"disc-summary\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"toggle()\"\n>\n <span class=\"disc-label\"><ng-content select=\"[summary]\" /></span>\n <fold-icon class=\"disc-chevron\" name=\"chevron-down\" size=\"sm\" />\n</button>\n<div\n class=\"disc-panel\"\n [id]=\"panelId\"\n role=\"region\"\n [attr.aria-hidden]=\"!open()\"\n>\n <div class=\"disc-panel-clip\">\n <div class=\"disc-panel-content\"><ng-content /></div>\n </div>\n</div>\n","import { Component, computed, input } from \"@angular/core\";\n\n/**\n * `<fold-status-badge>` — a coloured badge indicating a status. Unlike the\n * generic {@link FoldBadgeComponent}, this maps a **status key** to a colour, so\n * call sites pass a domain status rather than choosing a variant.\n *\n * **Supported statuses**\n * - `active` / `connected` — success (green)\n * - `draft` / `pending` — warning (amber)\n * - `suspended` / `error` — alert (red)\n * - `coming-soon` / `not_connected` — muted grey\n * - any other value (e.g. `terminated`) — neutral grey\n *\n * ```html\n * <fold-status-badge status=\"active\" />\n * <fold-status-badge status=\"pending\" label=\"En attente\" />\n * ```\n *\n * @selector `fold-status-badge`\n */\n@Component({\n selector: \"fold-status-badge\",\n standalone: true,\n templateUrl: \"./status-badge.component.html\",\n styleUrl: \"./status-badge.component.scss\",\n})\nexport class FoldStatusBadgeComponent {\n /** The status key that determines the colour. */\n readonly status = input.required<string>();\n /** Display text — defaults to the raw `status` value. */\n readonly label = input<string>(\"\");\n\n /** Collapses synonym keys onto the canonical colour states. */\n readonly normalizedStatus = computed(() => {\n const s = this.status();\n if (s === \"connected\") {\n return \"active\";\n }\n if (s === \"error\") {\n return \"suspended\";\n }\n if (s === \"not_connected\") {\n return \"coming-soon\";\n }\n return s;\n });\n}\n","<span class=\"badge\" [attr.data-status]=\"normalizedStatus()\">{{\n label() || status()\n}}</span>\n","import {\n booleanAttribute,\n Component,\n computed,\n contentChild,\n input,\n output,\n type TemplateRef,\n} from \"@angular/core\";\nimport { DatePipe, NgTemplateOutlet } from \"@angular/common\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/** Where a node's date renders relative to its label. */\nexport type FoldTimelineDatePlacement = \"above\" | \"below\" | \"inline\" | \"hidden\";\n\n/** One node of a {@link FoldTimelineComponent}. */\nexport interface FoldTimelineNode {\n /** Stable track key. Also the click payload when {@link id} is `null`. */\n readonly key: string;\n /** Click payload; `null` means no id (see {@link clickable}). */\n readonly id: string | null;\n /**\n * Force the node interactive (a `<button>`) or not, in either orientation.\n * When omitted it defaults to `id !== null`. A clickable node emits `id ?? key`\n * on click. Lets a horizontal step be clickable without a routing id, or an\n * id-bearing node stay presentational.\n */\n readonly clickable?: boolean;\n /** Primary label. */\n readonly label: string;\n /** Optional date, formatted with the `date` pipe (`mediumDate`). */\n readonly date?: Date | null;\n /** Pre-formatted date text — takes precedence over {@link date} when set. */\n readonly displayDate?: string;\n /** Optional dot icon. */\n readonly icon?: FoldIconName;\n /**\n * Completion state (progress steppers). When set, it drives the accent\n * (\"filled\") dot; when omitted, a non-clickable (`id === null`) node fills as\n * an origin/anchor. So `done` and the inert-anchor rule are the same accent.\n */\n readonly done?: boolean;\n /**\n * Per-node dot style — **overrides** the timeline's {@link\n * FoldTimelineComponent.variant}. `plain` fills the accent dot solid; `hollow`\n * shows it as a ring (the outlined look of the vertical rail's clickable dots).\n */\n readonly variant?: \"plain\" | \"hollow\";\n /**\n * Opaque per-node metadata for a custom node template (see the projected\n * `#node` template). The component never reads it — it's yours to branch on,\n * e.g. `state: 'pending'` → render an \"en attente\" badge.\n */\n readonly state?: string;\n}\n\n/**\n * `<fold-timeline>` — a connected rail of nodes (dot + optional date + label),\n * in two orientations that share one primitive:\n *\n * - `orientation=\"vertical\"` (default) — a **navigable history**: a dot rail on\n * the left; clickable nodes emit their id, a `null`-id node is an inert\n * accented anchor.\n * - `orientation=\"horizontal\"` — a **progress stepper**: an optional `progress`\n * fill line under the dots; each node's `done` drives its accent. Collapses to\n * a vertical list on narrow viewports.\n *\n * Interactivity is per node, not per component, and works the same in both\n * orientations: a node renders as a `<button>` when it is clickable — by default\n * that means `id !== null`, but each node can force it via `clickable`. A\n * non-clickable node renders as a plain presentational element (never a disabled\n * button — so a purely-presentational timeline, e.g. a signature stepper, carries\n * no button semantics). The container is a `<nav>` landmark only when at least one\n * node is clickable; otherwise a labelled `role=\"group\"`.\n *\n * The accent (\"filled\") dot is `done ?? (id === null)`, so the inert anchor and a\n * `done` step are the same rule. Dots are round by default (`square` for\n * rounded-square), and each node's `icon` names its glyph. A node's date can be a\n * `Date` (formatted with the `date` pipe) or a pre-formatted `displayDate`, placed\n * above or below the label via `datePlacement`.\n *\n * **Surface-agnostic** — it renders content only (a labelled `<nav>` of nodes),\n * no card of its own, so the consumer places it inside whatever surface fits.\n * Presentational + generic: the consumer maps its domain data to\n * {@link FoldTimelineNode}s and owns the click meaning.\n *\n * **Custom node content** — project an `<ng-template #node let-n>` to replace a\n * node's label with arbitrary content (a badge, a status line, an action). The\n * timeline keeps ownership of the dot, date, layout and the derived progressbar;\n * the template only styles the label region. This is the escape hatch for\n * heterogeneous nodes without exploding the node interface into props.\n *\n * @selector `fold-timeline`\n *\n * @example\n * ```html\n * <fold-card surface=\"sunken\">\n * <fold-timeline ariaLabel=\"History\" [nodes]=\"nodes()\" (nodeClick)=\"scrollTo($event)\" />\n * </fold-card>\n * <fold-timeline\n * orientation=\"horizontal\"\n * ariaLabel=\"Signature progress\"\n * [progress]=\"pct()\"\n * [nodes]=\"steps()\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-timeline\",\n standalone: true,\n imports: [DatePipe, NgTemplateOutlet, FoldIconComponent],\n templateUrl: \"./timeline.component.html\",\n styleUrl: \"./timeline.component.scss\",\n})\nexport class FoldTimelineComponent {\n /** The ordered nodes to render. */\n readonly nodes = input.required<readonly FoldTimelineNode[]>();\n /** Rail direction — vertical history rail vs horizontal progress stepper. */\n readonly orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\n /**\n * Progress-fill width (%) for the horizontal rail — an **override**. When\n * `null` (default) the fill is derived from the ratio of `done` nodes, so the\n * bar and the completed dots can never disagree. Ignored in vertical mode.\n */\n readonly progress = input<number | null>(null);\n /** Accessible name for the timeline's `<nav>` landmark (screen-reader only). */\n readonly ariaLabel = input<string>();\n /** Tooltip (`title`) on the clickable nodes. */\n readonly nodeTitle = input<string>(\"\");\n /** Render the dots as rounded squares instead of circles. */\n readonly square = input(false, { transform: booleanAttribute });\n /** Default dot style for every node — a node's own `variant` overrides it. */\n readonly variant = input<\"plain\" | \"hollow\">(\"plain\");\n /**\n * Where a node's date renders relative to its label — `above`/`below`\n * (stacked), `inline` (on the same row), or `hidden` (not shown). Default\n * `below`.\n */\n readonly datePlacement = input<FoldTimelineDatePlacement>(\"below\");\n\n /** Emits a clicked node's `id ?? key` (never fires for non-clickable nodes). */\n readonly nodeClick = output<string>();\n\n /** Optional consumer template that renders a node's label region. */\n protected readonly nodeTemplate =\n contentChild<TemplateRef<{ $implicit: FoldTimelineNode }>>(\"node\");\n\n /** Resolved interactivity: explicit `clickable`, else `id !== null`. */\n protected isClickable(node: FoldTimelineNode): boolean {\n return node.clickable ?? node.id !== null;\n }\n\n /** True when any node is clickable — the container is a `<nav>` only then. */\n protected readonly interactive = computed(() =>\n this.nodes().some((n) => this.isClickable(n)),\n );\n\n /** Count of completed nodes (drives the derived fill + the progressbar text). */\n protected readonly doneCount = computed(\n () => this.nodes().filter((n) => n.done).length,\n );\n\n /**\n * Horizontal fill width (%): the explicit `progress` override when given, else\n * derived so the fill reaches the last completed dot.\n */\n protected readonly fillPct = computed(() => {\n const override = this.progress();\n if (override !== null) {\n return override;\n }\n const total = this.nodes().length;\n const done = this.doneCount();\n return total > 1 && done > 0 ? ((done - 1) / (total - 1)) * 100 : 0;\n });\n\n /** `aria-valuenow` for the progressbar — a clean integer. */\n protected readonly fillNow = computed(() => Math.round(this.fillPct()));\n\n /** `aria-valuetext` (\"2 / 4\") when completion is tracked via `done`. */\n protected readonly stepText = computed(() => {\n const done = this.doneCount();\n return done > 0 ? `${done} / ${this.nodes().length}` : null;\n });\n\n /** Accent (\"filled\") dot: an explicit `done`, else the inert-anchor rule. */\n protected isFilled(node: FoldTimelineNode): boolean {\n return node.done ?? node.id === null;\n }\n\n /** Resolved dot style: the node's `variant` overrides the timeline default. */\n protected isHollow(node: FoldTimelineNode): boolean {\n return (node.variant ?? this.variant()) === \"hollow\";\n }\n\n protected onNode(node: FoldTimelineNode): void {\n if (this.isClickable(node)) {\n this.nodeClick.emit(node.id ?? node.key);\n }\n }\n}\n","<!-- Shared inner content of a node (dot + date + label). -->\n<ng-template #dot let-n>\n <span class=\"dot\">\n @if (n.icon; as ic) {\n <fold-icon [name]=\"ic\" [size]=\"11\" />\n }\n </span>\n <span class=\"txt\">\n @if (datePlacement() !== \"hidden\") {\n @if (n.displayDate; as dd) {\n <span class=\"date\">{{ dd }}</span>\n } @else if (n.date; as d) {\n <span class=\"date\">{{ d | date: \"mediumDate\" }}</span>\n }\n }\n @if (nodeTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: n }\"\n />\n } @else {\n <span class=\"nlabel\">{{ n.label }}</span>\n }\n </span>\n</ng-template>\n\n<!-- The progress rail + the nodes — reused in both containers. -->\n<ng-template #body>\n @if (orientation() === \"horizontal\") {\n <span\n class=\"rail\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"fillNow()\"\n [attr.aria-valuetext]=\"stepText()\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <span class=\"rail-fill\" [style.width.%]=\"fillPct()\"></span>\n </span>\n }\n @for (n of nodes(); track n.key) {\n @if (isClickable(n)) {\n <button\n type=\"button\"\n class=\"node\"\n [class.filled]=\"isFilled(n)\"\n [class.hollow]=\"isHollow(n)\"\n [title]=\"nodeTitle()\"\n (click)=\"onNode(n)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dot\"\n [ngTemplateOutletContext]=\"{ $implicit: n }\"\n />\n </button>\n } @else {\n <div\n class=\"node inert\"\n [class.filled]=\"isFilled(n)\"\n [class.hollow]=\"isHollow(n)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dot\"\n [ngTemplateOutletContext]=\"{ $implicit: n }\"\n />\n </div>\n }\n }\n</ng-template>\n\n@if (interactive()) {\n <nav\n class=\"tlv\"\n [class.h]=\"orientation() === 'horizontal'\"\n [class.square]=\"square()\"\n [class.date-above]=\"datePlacement() === 'above'\"\n [class.date-inline]=\"datePlacement() === 'inline'\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <ng-container [ngTemplateOutlet]=\"body\" />\n </nav>\n} @else {\n <div\n class=\"tlv\"\n role=\"group\"\n [class.h]=\"orientation() === 'horizontal'\"\n [class.square]=\"square()\"\n [class.date-above]=\"datePlacement() === 'above'\"\n [class.date-inline]=\"datePlacement() === 'inline'\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n}\n","import { Component, input } from \"@angular/core\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldSpinnerSize } from \"../../foundations/spinner/spinner.component\";\n\n/**\n * `<fold-loading>` — a centered loading placeholder: a spinner over a muted\n * message. The host is a `role=\"status\"` / `aria-live=\"polite\"` region, so the\n * message is announced to assistive tech; the spinner is decorative. Drop it\n * anywhere a section is waiting on data — it stretches to fill (`flex: 1`).\n *\n * @selector `fold-loading`\n *\n * @example\n * ```html\n * <fold-loading />\n * <fold-loading message=\"Loading company…\" />\n * <fold-loading size=\"lg\" message=\"Crunching numbers…\" />\n * ```\n */\n@Component({\n selector: \"fold-loading\",\n standalone: true,\n imports: [FoldSpinnerComponent],\n templateUrl: \"./loading-state.component.html\",\n // Inline + tokens only, so the component is fully self-contained.\n styleUrl: \"./loading-state.component.scss\",\n host: {\n role: \"status\",\n \"aria-live\": \"polite\",\n },\n})\nexport class FoldLoadingStateComponent {\n /** Text to display. Defaults to \"Loading...\". */\n readonly message = input(\"Loading...\");\n\n /** Spinner size — an icon-size token (`xs…xl`, default `md`) or a pixel number. */\n readonly size = input<FoldSpinnerSize>(\"md\");\n}\n","<div class=\"loading\">\n <fold-spinner [size]=\"size()\" aria-hidden=\"true\" />\n @if (message()) {\n <span>{{ message() }}</span>\n }\n</div>\n","import { Component, input } from \"@angular/core\";\n\n/**\n * `<fold-empty-state>` — centered empty state with an optional icon, a title, an\n * optional subtitle and an optional action.\n *\n * Content projection carries the icon and the action:\n * - `[empty-icon]` — projected above the title (typically an SVG)\n * - default `ng-content` — projected below the subtitle (typically a button)\n *\n * `tone=\"alert\"` turns it into an error state (red title + icon); the default\n * `neutral` tone is the plain empty state.\n *\n * @selector `fold-empty-state`\n *\n * @example\n * ```html\n * <fold-empty-state\n * title=\"No company yet\"\n * subtitle=\"Create your company space to manage artists, teams and contracts.\"\n * >\n * <svg empty-icon width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n * <path d=\"M19,3H5C3.346…\" />\n * </svg>\n * <button foldButton (click)=\"create()\">+ Create</button>\n * </fold-empty-state>\n *\n * <fold-empty-state tone=\"alert\" title=\"Failed to load\" />\n * ```\n */\n@Component({\n selector: \"fold-empty-state\",\n standalone: true,\n host: { \"[class.alert]\": \"tone() === 'alert'\" },\n templateUrl: \"./empty-state.component.html\",\n styleUrl: \"./empty-state.component.scss\",\n})\nexport class FoldEmptyStateComponent {\n /** The bold primary line. */\n readonly title = input.required<string>();\n /** Optional muted secondary line. */\n readonly subtitle = input(\"\");\n /** `alert` renders an error state (red title + icon); `neutral` is default. */\n readonly tone = input<\"neutral\" | \"alert\">(\"neutral\");\n}\n","<div class=\"empty\">\n <div class=\"empty-icon\">\n <ng-content select=\"[empty-icon]\" />\n </div>\n <p class=\"empty-title\">{{ title() }}</p>\n @if (subtitle()) {\n <p class=\"empty-sub\">{{ subtitle() }}</p>\n }\n <div class=\"empty-action\">\n <ng-content />\n </div>\n</div>\n","import { booleanAttribute, Component, computed, input } from \"@angular/core\";\n\n/**\n * `<fold-aside-layout>` — a centered, self-scrolling content column flanked by\n * up to two sticky side rails. The detail-page archetype: a stack of\n * `fold-page-section`s in the middle, sticky asides beside it, collapsing to a\n * single column on narrow viewports.\n *\n * Content goes in three slots; the grid adapts to whichever rails are filled\n * (via `:has()`), so an omitted rail simply drops its column (reactively, even\n * if the rail appears/disappears at runtime):\n * - default slot — the centre content column (the scroll-length driver): every\n * element that isn't tagged as a rail. Its blocks are stacked for you.\n * - `[asideLeft]` — optional left rail (e.g. a timeline); its presence turns on\n * the third column. Tag each element that belongs in it.\n * - `[asideRight]` — the right rail (history, actions…). Tag each element.\n *\n * Rail content is tagged per-element (not wrapped in one node) so the layout\n * stacks it directly — that's what lets it style the projected blocks without\n * reaching through view encapsulation.\n *\n * Scroll-agnostic: the asides stick relative to the page's own scroll\n * container (its ancestor), so a page keeps whatever scroll it already owns —\n * the layout just drops the grid + `position: sticky` + responsive boilerplate\n * every detail page was hand-rolling. It inlines the same sticky flow as\n * `foldStickyColumn` (top anchor) because it owns its columns, and pairs with a\n * `fold-page-section` stack in the centre.\n *\n * Inputs are kept minimal: optional a11y labels ({@link asideLeftLabel} /\n * {@link asideRightLabel}) — set one and that rail becomes a labelled\n * `complementary` landmark, leave it unset and the rail is a plain container\n * (no anonymous landmark noise) — plus {@link topOffset}, a convenience over the\n * sticky-offset var. Everything else is CSS custom properties on the host. Each\n * of the three tracks is a var: `--fold-aside-layout-rail-width`\n * (220px) · `--fold-aside-layout-center-width` (`minmax(0, 1fr)`) ·\n * `--fold-aside-layout-side-width` (300px). Rails default to a fixed width and\n * the centre flexes; set all three to `minmax(0, 1fr)` for **equal columns**.\n * Also `--fold-aside-layout-gap` (28px) · `--fold-aside-layout-max` (1240px) ·\n * `--fold-aside-layout-top` (24px, the sticky offset — override per rail with\n * `--fold-aside-layout-left-top` / `--fold-aside-layout-right-top`) ·\n * `--fold-aside-layout-rail-max` (the cap above which a taller-than-viewport rail\n * scrolls internally instead of being clipped by `sticky`). The page still owns\n * the scroll container the asides stick within.\n *\n * ```scss\n * // three equal columns\n * fold-aside-layout {\n * --fold-aside-layout-rail-width: minmax(0, 1fr);\n * --fold-aside-layout-center-width: minmax(0, 1fr);\n * --fold-aside-layout-side-width: minmax(0, 1fr);\n * }\n * ```\n *\n * @selector `fold-aside-layout`\n *\n * @example\n * ```html\n * <fold-aside-layout>\n * <app-timeline asideLeft />\n *\n * <app-header />\n * <fold-page-section title=\"…\">…</fold-page-section>\n *\n * <app-history asideRight />\n * <app-actions asideRight />\n * </fold-aside-layout>\n * ```\n */\n@Component({\n selector: \"fold-aside-layout\",\n standalone: true,\n templateUrl: \"./aside-layout.component.html\",\n styleUrl: \"./aside-layout.component.scss\",\n host: {\n \"[style.--fold-aside-layout-top]\": \"topOffsetCss()\",\n \"[class.stack-left-first]\": \"stackLeftFirst()\",\n },\n})\nexport class FoldAsideLayoutComponent {\n /**\n * When the layout collapses to one column, place the left rail **above** the\n * centre instead of below it. Use it when the rail is navigation (a tab-nav),\n * so the menu still precedes the content it drives; leave it off for a\n * companion rail (a timeline, history) where the content should come first.\n */\n readonly stackLeftFirst = input(false, { transform: booleanAttribute });\n /**\n * Accessible label for the left rail. Set it and the rail is exposed as a\n * labelled `complementary` landmark; leave it unset and the rail is a plain\n * container (no landmark), so screen readers aren't given an anonymous region.\n */\n readonly asideLeftLabel = input<string>();\n /** Accessible label for the right rail — same rule as {@link asideLeftLabel}. */\n readonly asideRightLabel = input<string>();\n\n /**\n * The rails' sticky offset — a number (px) or any CSS length. A convenience\n * over the `--fold-aside-layout-top` var (which it sets); leave it unset to keep\n * the 24px default or a per-rail `--fold-aside-layout-left-top` /\n * `-right-top` override.\n *\n * It's the gap the rail keeps from the top **once it sticks** (i.e. after you\n * scroll). At rest the rail already lines up with the centre via the shared\n * grid padding, and `sticky` only ever pushes down, never up — so an offset\n * *below* the grid's top padding has no visible effect until you scroll (a\n * value like `0`–`20` looks inert on a page padded by 28px). Raise the offset\n * past the padding to push the resting rail down; to pull it up, shrink\n * `--fold-aside-layout-pad` instead.\n */\n readonly topOffset = input<number | string>();\n\n /** The offset as a CSS length, or `null` to leave the var untouched. */\n protected readonly topOffsetCss = computed(() => {\n const o = this.topOffset();\n if (o === undefined) {\n return null;\n }\n return typeof o === \"number\" ? `${o}px` : o;\n });\n}\n","<div class=\"al-grid\">\n <div\n class=\"al-aside al-aside-left\"\n [attr.role]=\"asideLeftLabel() ? 'complementary' : null\"\n [attr.aria-label]=\"asideLeftLabel() || null\"\n >\n <ng-content select=\"[asideLeft]\" />\n </div>\n <div class=\"al-center\"><ng-content /></div>\n <div\n class=\"al-aside al-aside-right\"\n [attr.role]=\"asideRightLabel() ? 'complementary' : null\"\n [attr.aria-label]=\"asideRightLabel() || null\"\n >\n <ng-content select=\"[asideRight]\" />\n </div>\n</div>\n","import {\n computed,\n Component,\n effect,\n input,\n numberAttribute,\n signal,\n} from \"@angular/core\";\nimport { observeElementWidth } from \"../../../dom/observe-element-width\";\n\n/**\n * Dead band (px) between folding and unfolding. Wider than any scrollbar, so the\n * width a fold gives back can never flip the layout straight back.\n */\nconst HYSTERESIS = 32;\n\n/**\n * `<fold-tab-layout>` — pairs a tab bar with the content it drives, and owns the\n * one thing every tabbed page hand-rolls: where the nav sits.\n *\n * - `placement=\"top\"` (default) — the nav above the content.\n * - `placement=\"side\"` — the nav as a rail beside the content, folding back on\n * top when the layout gets narrower than {@link foldAt} (so the menu always\n * precedes the content it drives, never below it).\n *\n * Content projection — the nav stays yours (tabs, active key, events):\n * - `[tabNav]` → the tab bar (an `fold-tab-nav`, or anything else).\n * - default slot → the content for the active tab.\n *\n * **A11y — this owns placement, not the ARIA tabs pattern.** The projected bar\n * carries the `tablist`/`tab` roles; the content is yours. If the tabs switch\n * in-page panels, give that content `role=\"tabpanel\"` named by the active tab;\n * if they navigate between routes, keep plain nav semantics and add no tab\n * roles (the tabs pattern is for panel-switching, not navigation).\n *\n * A side rail needs a *vertical* bar, a folded one a *horizontal* bar. Rather\n * than guess, the layout exposes {@link stacked} (`exportAs`) so the projected\n * nav follows the layout in one binding:\n *\n * ```html\n * <fold-tab-layout placement=\"side\" #tl=\"foldTabLayout\">\n * <fold-tab-nav\n * tabNav\n * [direction]=\"tl.stacked() ? 'horizontal' : 'vertical'\"\n * [tabs]=\"tabs\"\n * [activeKey]=\"tab()\"\n * (tabChange)=\"tab.set($event)\"\n * />\n * <app-tab-content />\n * </fold-tab-layout>\n * ```\n *\n * Sizing is CSS custom properties: `--fold-tab-layout-gap` (16px) and\n * `--fold-tab-layout-nav-width` (200px, the side rail track).\n *\n * @selector `fold-tab-layout`\n */\n@Component({\n selector: \"fold-tab-layout\",\n standalone: true,\n exportAs: \"foldTabLayout\",\n host: { \"[class.is-row]\": \"!stacked()\" },\n templateUrl: \"./tab-layout.component.html\",\n styleUrl: \"./tab-layout.component.scss\",\n})\nexport class FoldTabLayoutComponent {\n /** Where the nav sits: above the content, or as a rail beside it. */\n readonly placement = input<\"top\" | \"side\">(\"top\");\n /** Width (px) at or below which a `side` nav folds back on top. */\n readonly foldAt = input(720, { transform: numberAttribute });\n\n /** Whether a `side` rail has folded. Hysteretic — see {@link HYSTERESIS}. */\n private readonly folded = signal(false);\n\n /**\n * Whether the nav currently sits **above** the content — always true for\n * `top`, and true for `side` once the layout has folded.\n * Bind a projected bar's `direction` to it.\n */\n readonly stacked = computed(\n () => this.placement() === \"top\" || this.folded(),\n );\n\n /** The layout's own width, kept live by the shared `ResizeObserver` primitive. */\n private readonly width = observeElementWidth();\n\n constructor() {\n // Re-run the hysteretic fold decision on every width change.\n effect(() => this.measure(this.width()));\n }\n\n /**\n * Fold at `foldAt`, but only unfold once we are clearly past it.\n *\n * Folding makes the content taller, which can bring a scrollbar in and take\n * ~15px of width back — enough to cross a single threshold again and flip\n * forever. A dead band wider than any scrollbar breaks that loop.\n */\n private measure(width: number): void {\n if (width === 0) {\n return;\n }\n const fold = this.foldAt();\n if (!this.folded() && width <= fold) {\n this.folded.set(true);\n } else if (this.folded() && width > fold + HYSTERESIS) {\n this.folded.set(false);\n }\n }\n}\n","<div class=\"tl-nav\"><ng-content select=\"[tabNav]\" /></div>\n<div class=\"tl-body\"><ng-content /></div>\n","import { Component, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-page-layout>` — the vertical scaffold for a settings/admin-style page:\n * an optional `icon` + `title` header with a description slot, an optional\n * top-right actions slot, and a body that stacks its children with a consistent\n * rhythm. Pair it with {@link FoldPageSectionComponent} for grouped sub-sections.\n *\n * **It owns the page gutter, not the width.** The `fold-app-shell` content region\n * is full-bleed (so a page can paint edge-to-edge); this component supplies the\n * themed margins via its own padding, and otherwise **fills whatever width it is\n * given**. It does *not* cap the column — narrowing a block to a readable measure\n * is the content's job (wrap that block in your own max-width container), never\n * the page scaffold's. The *horizontal* gutter is a single token,\n * `--fold-page-gutter` (default `32px`) — retune it per page/theme, or set it to\n * `0` for a bleeding dashboard. A {@link FoldPageSectionComponent} with `bleed`\n * cancels exactly that token to span the page edge-to-edge (a full-width band\n * amid padded content), so the two never desync — including on a responsive gutter.\n * The *vertical* rhythm between stacked elements is its own token,\n * `--fold-page-gap` (default `32px`), retunable the same way.\n *\n * Content projection:\n * - default slot → the page body (sections, cards, banners…).\n * - `[titleBadge]` → an inline pill beside the title (e.g. a status/kind badge).\n * - `p[description]` → the intro under the title. A **slot**, not a string\n * input: a description that needs a `<code>`, a link or a second sentence is\n * the common case, not the exception. It must be a `<p description>` — the\n * selector is tag-qualified on purpose, so a body child that carries its own\n * `description` input (e.g. `<fold-page-section description=\"…\">`) is not\n * swallowed into the header. The layout styles what you project (muted, small,\n * full column width) so the markup stays yours. Project nothing and the header\n * is just the title. Cap the line with `--fold-page-desc-measure` on a fluid page.\n * - `[pageActions]` → the top-right header slot (e.g. an export button).\n *\n * ```html\n * <fold-page-layout icon=\"grid\" title=\"Facturation\">\n * <p description>Abonnement de l'entreprise et gestion des paiements.</p>\n * <button pageActions>Exporter</button>\n * <fold-page-section title=\"Moyens de paiement\">…</fold-page-section>\n * </fold-page-layout>\n * ```\n *\n * @selector `fold-page-layout`\n */\n@Component({\n selector: \"fold-page-layout\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./page-layout.component.html\",\n styleUrl: \"./page-layout.component.scss\",\n})\nexport class FoldPageLayoutComponent {\n /** The page heading (`<h1>`). Omit for a header-less page — or when the page\n * already carries its `<h1>` elsewhere (e.g. a leading `fold-hero-section`),\n * so a page never ends up with two top-level headings. */\n readonly title = input<string>();\n /** An optional leading icon shown beside the title. */\n readonly icon = input<FoldIconName>();\n}\n","@if (title()) {\n <header class=\"page-head\">\n <div class=\"page-head-text\">\n @if (title()) {\n <h1 class=\"page-title\">\n @if (icon(); as ic) {\n <fold-icon class=\"page-icon\" [name]=\"ic\" [size]=\"22\" />\n }\n <span>{{ title() }}</span>\n <span class=\"page-title-badge\"\n ><ng-content select=\"[titleBadge]\"\n /></span>\n </h1>\n }\n <div class=\"page-desc\"><ng-content select=\"p[description]\" /></div>\n </div>\n <div class=\"page-actions\"><ng-content select=\"[pageActions]\" /></div>\n </header>\n}\n<div class=\"page-body\"><ng-content /></div>\n","import { booleanAttribute, Component, inject, input } from \"@angular/core\";\nimport { FoldElementTitleComponent } from \"../../content/element-title/element-title.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\n\n/**\n * `<fold-page-section>` — a titled, semantic **`<section>`** grouping of page\n * content inside a {@link FoldPageLayoutComponent}: an eyebrow `title` + optional\n * `description`, a right-aligned actions slot, and the content below.\n *\n * **It is structure, not a box.** The title is a real heading and the region is\n * a `<section>` named by that heading (`aria-labelledby`) — so a page reads as\n * an outline to assistive tech, and the DOM is self-documenting. It paints\n * nothing: transparent, no border, no radius. For a **visual box**, wrap the\n * content in a {@link FoldCardComponent} — the two are orthogonal and compose (a\n * section can hold a card; a card never needs to know about the page).\n *\n * Content projection:\n * - default slot → the section content.\n * - `[sectionActions]` → the right-aligned header slot (re-projected into the\n * heading row).\n *\n * Two orthogonal helpers, both independent of the title:\n * - `stack` — lay the body out as an evenly-spaced vertical stack (form fields).\n * - `bleed` — break the section out of the page gutter to span the layout\n * edge-to-edge (a full-width band amid padded sections). It cancels exactly\n * `--fold-page-gutter` — the same token {@link FoldPageLayoutComponent} pads\n * with — so it stays flush at every breakpoint and never overflows. As the\n * **first** band it also swallows the page's top padding (a hero flush to the\n * top); as the **last**, the bottom padding (a footer band). A band in the\n * middle keeps the vertical rhythm. Only meaningful inside an `fold-page-layout`.\n *\n * ```html\n * <fold-page-section title=\"Moyens de paiement\" description=\"Le moyen par défaut…\">\n * <button sectionActions>Ajouter</button>\n * …\n * </fold-page-section>\n *\n * <!-- need a box? compose with fold-card -->\n * <fold-page-section title=\"Documents\">\n * <fold-card surface=\"sunken\">…</fold-card>\n * </fold-page-section>\n * ```\n *\n * @selector `fold-page-section`\n */\n@Component({\n selector: \"fold-page-section\",\n standalone: true,\n imports: [FoldElementTitleComponent],\n host: {\n \"[class.stack]\": \"stack()\",\n \"[class.is-bleed]\": \"bleed()\",\n },\n templateUrl: \"./page-section.component.html\",\n styleUrl: \"./page-section.component.scss\",\n})\nexport class FoldPageSectionComponent {\n /** The section heading (rendered small + uppercase; the region's a11y name). */\n readonly title = input<string>();\n /** An optional leading icon beside the title. */\n readonly icon = input<FoldIconName>();\n /** A one-line description under the title. */\n readonly description = input<string>();\n /** Heading depth exposed to assistive tech (`aria-level`) — set it so sections\n * nest correctly under the page's `<h1>` (2 by default). */\n readonly headingLevel = input(2);\n /** Lay the body out as an evenly-spaced vertical stack of form fields. */\n readonly stack = input(false, { transform: booleanAttribute });\n /** Break out of the page gutter to span the layout edge-to-edge — cancels\n * `--fold-page-gutter` exactly, so it stays flush at every breakpoint. As the\n * first/last band it also flushes to the page's top/bottom edge. Only\n * meaningful inside an `fold-page-layout`. */\n readonly bleed = input(false, { transform: booleanAttribute });\n\n /** SSR-safe id on the heading, so the `<section>` names its region with\n * `aria-labelledby` (only when there's a title). */\n protected readonly headingId =\n inject(FoldIdService).next(\"fold-page-section\");\n}\n","<section class=\"ps-root\" [attr.aria-labelledby]=\"title() ? headingId : null\">\n @if (title() || description()) {\n <div class=\"section-head\">\n @if (title(); as t) {\n <fold-element-title\n [title]=\"t\"\n [icon]=\"icon()\"\n [headingId]=\"headingId\"\n [level]=\"headingLevel()\"\n >\n <ng-content select=\"[sectionActions]\" titleAction />\n </fold-element-title>\n }\n @if (description()) {\n <p class=\"section-desc\">{{ description() }}</p>\n }\n </div>\n }\n <div class=\"section-body\"><ng-content /></div>\n</section>\n","import { Component, booleanAttribute, input } from \"@angular/core\";\n\n/**\n * `<fold-hero-section>` — a full-bleed **page splash**: the borderless intro\n * band at the top of a page (wordmark, title, lede, call-to-action). Unlike\n * {@link FoldHeroCardComponent} (a bordered card you drop anywhere), this is a\n * layout primitive — it breaks the page gutter to span edge-to-edge and carries\n * the page's `<h1>`.\n *\n * Meant as a **direct child of `fold-page-layout`**: it cancels exactly the\n * gutter + top padding the layout applies (the same `--fold-page-gutter` /\n * `--fold-page-pad-top` tokens), so the band sits flush to the edges. A soft\n * brand-tinted wash reads it as the hero, closed by a hairline at the bottom.\n *\n * Two content lanes:\n * - default slot — the centred column (eyebrow · title · lede · actions).\n * - `[heroBackdrop]` — decorative layer painted *behind* the content\n * (a watermark, a glow); rendered `aria-hidden`, so keep it purely visual.\n *\n * ```html\n * <fold-hero-section>\n * <span heroBackdrop class=\"watermark\">v1</span>\n * <fold-badge content=\"Angular 22\" />\n * <h1>Fold</h1>\n * <p>A signals-first design system.</p>\n * </fold-hero-section>\n * ```\n *\n * @selector `fold-hero-section`\n */\n@Component({\n selector: \"fold-hero-section\",\n standalone: true,\n host: {\n \"[class.align-start]\": \"align() === 'start'\",\n \"[class.no-wash]\": \"!wash()\",\n },\n templateUrl: \"./hero-section.component.html\",\n styleUrl: \"./hero-section.component.scss\",\n})\nexport class FoldHeroSectionComponent {\n /** Column alignment — `center` (default) · `start` (left-aligned). */\n readonly align = input<\"center\" | \"start\">(\"center\");\n /** Paint the brand-tinted gradient wash (default). Set `false` for a plain surface band. */\n readonly wash = input(true, { transform: booleanAttribute });\n}\n","<div class=\"hs-backdrop\" aria-hidden=\"true\">\n <ng-content select=\"[heroBackdrop]\" />\n</div>\n<div class=\"hs-content\">\n <ng-content />\n</div>\n","import { Component, computed, input, output } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * Item representing one slot in the page navigation bar.\n * Either a concrete page number (1-indexed) or an ellipsis gap.\n */\nexport type FoldPageItem = { kind: \"page\"; page: number } | { kind: \"gap\" };\n\n/**\n * `fold-paginator` — presentational, fully controlled.\n *\n * Designed for **server-side pagination** (offset/limit): the parent owns\n * `currentPage`, `pageSize` and `totalItems`, fires the HTTP call on\n * `(pageChange)` / `(pageSizeChange)`, then feeds the new values back in.\n *\n * Renders: `[page size selector] [items range] [‹ 1 2 3 … N ›]`.\n *\n * @example\n * ```html\n * <fold-paginator\n * [currentPage]=\"page()\"\n * [pageSize]=\"size()\"\n * [totalItems]=\"total()\"\n * (pageChange)=\"loadPage($event)\"\n * (pageSizeChange)=\"changeSize($event)\" />\n * ```\n */\n@Component({\n selector: \"fold-paginator\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./paginator.component.html\",\n styleUrl: \"./paginator.component.scss\",\n})\nexport class FoldPaginatorComponent {\n /** 1-indexed current page. */\n readonly currentPage = input.required<number>();\n\n /** Total number of items across all pages (drives `totalPages` + range label). */\n readonly totalItems = input.required<number>();\n\n /** Number of items per page. Must be > 0. */\n readonly pageSize = input.required<number>();\n\n /** Selectable page sizes. Set `[]` to hide the size selector entirely. */\n readonly pageSizeOptions = input<readonly number[]>([10, 25, 50, 100]);\n\n /**\n * How many page buttons to render on each side of the current page\n * between the first/last anchors. Example with `siblingCount: 1`:\n * `1 … 4 [5] 6 … 10`.\n * @default 1\n */\n readonly siblingCount = input<number>(1);\n\n /** Disables all controls (both page nav and size selector). */\n readonly disabled = input<boolean>(false);\n\n /** Fires with the new 1-indexed page number. */\n readonly pageChange = output<number>();\n\n /** Fires with the newly selected page size. */\n readonly pageSizeChange = output<number>();\n\n // ─── Derived state ────────────────────────────────────────────\n\n /** Total pages, minimum 1 so the UI always shows at least \"1 of 1\". */\n readonly totalPages = computed<number>(() => {\n const size = this.pageSize();\n const total = this.totalItems();\n if (size <= 0 || total <= 0) {\n return 1;\n }\n return Math.ceil(total / size);\n });\n\n /** Zero-indexed start / end of the currently visible range (for the label). */\n readonly rangeStart = computed<number>(() => {\n if (this.totalItems() === 0) {\n return 0;\n }\n return (this.currentPage() - 1) * this.pageSize() + 1;\n });\n\n readonly rangeEnd = computed<number>(() =>\n Math.min(this.currentPage() * this.pageSize(), this.totalItems()),\n );\n\n readonly canGoPrev = computed<boolean>(\n () => !this.disabled() && this.currentPage() > 1,\n );\n readonly canGoNext = computed<boolean>(\n () => !this.disabled() && this.currentPage() < this.totalPages(),\n );\n\n /**\n * Page buttons to render, with ellipsis gaps.\n *\n * Algorithm: always render page 1 and page N; render `siblingCount`\n * pages on each side of the current page; insert a single `gap` between\n * any two non-contiguous blocks.\n */\n readonly pageItems = computed<FoldPageItem[]>(() => {\n const total = this.totalPages();\n const current = this.currentPage();\n const sibs = Math.max(0, this.siblingCount());\n\n // Small enough to show every page — no ellipsis needed.\n // `5 + 2*sibs` = first + last + current + 2*sibs around current + 2 gap slots.\n if (total <= 5 + 2 * sibs) {\n return Array.from({ length: total }, (_, i) => ({\n kind: \"page\" as const,\n page: i + 1,\n }));\n }\n\n const leftSibling = Math.max(current - sibs, 2);\n const rightSibling = Math.min(current + sibs, total - 1);\n\n const showLeftGap = leftSibling > 2;\n const showRightGap = rightSibling < total - 1;\n\n const items: FoldPageItem[] = [{ kind: \"page\", page: 1 }];\n\n if (showLeftGap) {\n items.push({ kind: \"gap\" });\n }\n\n for (let p = leftSibling; p <= rightSibling; p++) {\n items.push({ kind: \"page\", page: p });\n }\n\n if (showRightGap) {\n items.push({ kind: \"gap\" });\n }\n\n items.push({ kind: \"page\", page: total });\n return items;\n });\n\n // ─── Handlers ─────────────────────────────────────────────────\n\n goToPage(page: number): void {\n if (this.disabled()) {\n return;\n }\n const clamped = Math.max(1, Math.min(page, this.totalPages()));\n if (clamped === this.currentPage()) {\n return;\n }\n this.pageChange.emit(clamped);\n }\n\n prev(): void {\n if (this.canGoPrev()) {\n this.goToPage(this.currentPage() - 1);\n }\n }\n\n next(): void {\n if (this.canGoNext()) {\n this.goToPage(this.currentPage() + 1);\n }\n }\n\n onPageSizeChange(raw: string): void {\n const size = Number(raw);\n if (Number.isFinite(size) && size > 0 && size !== this.pageSize()) {\n this.pageSizeChange.emit(size);\n }\n }\n}\n","@let options = pageSizeOptions();\n\n<div class=\"paginator-left\">\n @if (options.length > 0) {\n <label class=\"page-size\">\n <select\n #pageSizeSelect\n class=\"page-size__select\"\n [value]=\"pageSize()\"\n [disabled]=\"disabled()\"\n (change)=\"onPageSizeChange(pageSizeSelect.value)\"\n aria-label=\"Éléments par page\"\n >\n @for (opt of options; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n <span class=\"page-size__label\">par page</span>\n </label>\n }\n\n @if (totalItems() > 0) {\n <span class=\"range\"\n >{{ rangeStart() }}–{{ rangeEnd() }} sur {{ totalItems() }}</span\n >\n } @else {\n <span class=\"range range--empty\">Aucun élément</span>\n }\n</div>\n\n<nav class=\"pages\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"nav-btn\"\n [disabled]=\"!canGoPrev()\"\n (click)=\"prev()\"\n aria-label=\"Page précédente\"\n >\n <fold-icon name=\"chevron-left\" [size]=\"15\" />\n </button>\n\n @for (item of pageItems(); track $index) {\n @if (item.kind === \"page\") {\n <button\n type=\"button\"\n class=\"page-btn\"\n [class.is-active]=\"item.page === currentPage()\"\n [attr.aria-current]=\"item.page === currentPage() ? 'page' : null\"\n [attr.aria-label]=\"'Page ' + item.page\"\n [disabled]=\"disabled()\"\n (click)=\"goToPage(item.page)\"\n >\n {{ item.page }}\n </button>\n } @else {\n <span class=\"gap\" aria-hidden=\"true\">…</span>\n }\n }\n\n <button\n type=\"button\"\n class=\"nav-btn\"\n [disabled]=\"!canGoNext()\"\n (click)=\"next()\"\n aria-label=\"Page suivante\"\n >\n <fold-icon name=\"chevron-right\" [size]=\"15\" />\n </button>\n</nav>\n","import { Component, input, output } from \"@angular/core\";\nimport { FoldBadgeComponent } from \"../../content/badge/badge.component\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\nexport type FoldTabNavItem = {\n /** Unique key — identifies the tab and is emitted on click. */\n key: string;\n /** Display label. */\n label: string;\n /** Optional leading icon, by registry name (rendered as an `fold-icon`). */\n icon?: FoldIconName;\n /** Optional trailing badge (e.g. a count). `undefined`/`null` hides it. */\n badge?: string | number | null;\n};\n\n/**\n * `<fold-tab-nav>` — a tab navigation bar (buttons only; the parent renders the\n * content for the active key).\n *\n * - `activeStyle` — `underline` (accent border on the active tab) or `fill`\n * (accent background pill, good for sidebars).\n * - `direction` — `horizontal` (row, equal-width) or `vertical` (stacked\n * sidebar; auto-collapses to a horizontal icon-accordion at ≤768px).\n *\n * @selector `fold-tab-nav`\n *\n * @example\n * ```html\n * <fold-tab-nav\n * [tabs]=\"[{ key: 'members', label: 'Members', badge: 3 }, { key: 'settings', label: 'Settings' }]\"\n * [activeKey]=\"tab()\"\n * activeStyle=\"underline\"\n * direction=\"horizontal\"\n * (tabChange)=\"tab.set($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-tab-nav\",\n standalone: true,\n imports: [FoldIconComponent, FoldBadgeComponent],\n templateUrl: \"./tab-nav.component.html\",\n // Inline + token-driven. Neutral 1px lines use --fold-color-border /\n // -surface-raised so they flip correctly in light mode (the app original\n // hard-coded white-alpha, which would vanish on a light background).\n styleUrl: \"./tab-nav.component.scss\",\n})\nexport class FoldTabNavComponent {\n /** The tabs to render, in order. */\n readonly tabs = input.required<FoldTabNavItem[]>();\n\n /** The `key` of the currently active tab. */\n readonly activeKey = input.required<string>();\n\n /** How the active tab reads: accent underline, or accent fill. */\n readonly activeStyle = input<\"underline\" | \"fill\">(\"underline\");\n\n /** Bar orientation (vertical auto-collapses to horizontal on mobile). */\n readonly direction = input<\"horizontal\" | \"vertical\">(\"horizontal\");\n\n /**\n * Density, from tightest to roomiest:\n * - `reduce` — an icon accordion: every tab but the active one drops its label\n * (and badge) to just its icon, while the active tab keeps its label and\n * takes the remaining room. A tab with no icon keeps its label, so nothing\n * is left unlabelled. Swap to it from your own breakpoint when the bar is\n * too tight for every label.\n * - `compact` (default) — inline / popover bars.\n * - `comfortable` — a prominent, page-level bar.\n */\n readonly size = input<\"reduce\" | \"compact\" | \"comfortable\">(\"compact\");\n\n /** `surface` (filled bar, default) or `transparent` (blends with the app). */\n readonly background = input<\"transparent\" | \"surface\">(\"surface\");\n\n /** Emits the `key` of the clicked tab. */\n readonly tabChange = output<string>();\n}\n","<nav\n class=\"tab-nav\"\n [class.style-underline]=\"activeStyle() === 'underline'\"\n [class.style-fill]=\"activeStyle() === 'fill'\"\n [class.dir-vertical]=\"direction() === 'vertical'\"\n [class.size-comfortable]=\"size() === 'comfortable'\"\n [class.size-reduce]=\"size() === 'reduce'\"\n [class.bg-surface]=\"background() === 'surface'\"\n>\n @for (tab of tabs(); track tab.key) {\n <button\n type=\"button\"\n class=\"tab-nav-item\"\n [class.is-active]=\"activeKey() === tab.key\"\n (click)=\"tabChange.emit(tab.key)\"\n >\n @if (tab.icon; as ic) {\n <fold-icon class=\"tab-nav-icon\" [name]=\"ic\" size=\"sm\" />\n }\n <span class=\"tab-nav-label\">{{ tab.label }}</span>\n @if (tab.badge !== undefined && tab.badge !== null) {\n <fold-badge\n class=\"tab-nav-badge\"\n [content]=\"tab.badge + ''\"\n [variant]=\"activeKey() === tab.key ? 'accent' : 'neutral'\"\n />\n }\n </button>\n }\n</nav>\n","import {\n Component,\n booleanAttribute,\n computed,\n effect,\n input,\n numberAttribute,\n output,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type { FoldToastVariant } from \"./toast.types\";\n\n/** Variant → leading status icon. */\nconst VARIANT_ICON: Record<FoldToastVariant, FoldIconName> = {\n success: \"check-circle\",\n info: \"info\",\n warning: \"warning\",\n error: \"x-circle\",\n};\n\n/**\n * `<fold-toast>` — a single frosted-glass snackbar: a variant status icon, the\n * message (projected), and an optional dismiss button. The stacking + queue\n * belong to `fold-toast-container` + {@link FoldToastService}; the toast itself\n * owns its **lifecycle** — it emits {@link dismiss} on its close button and, if\n * given a `duration`, auto-emits `dismiss` after it elapses (the timer is\n * cleared on destroy). `duration = 0` (the default) is sticky — it stays until\n * dismissed, so a standalone toast never vanishes unexpectedly.\n *\n * The surface is the shared **glass** language; a left accent stripe + the icon\n * take the variant's `-text` tint (`info` uses the brand `primary` tint). It is\n * an `alert` (assertive) for `error`, a `status` (polite) otherwise.\n *\n * ```html\n * <fold-toast variant=\"success\" duration=\"3000\" (dismiss)=\"…\">Track uploaded</fold-toast>\n * ```\n *\n * @selector `fold-toast`\n */\n@Component({\n selector: \"fold-toast\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./toast.component.html\",\n styleUrl: \"./toast.component.scss\",\n host: {\n \"[attr.data-variant]\": \"variant()\",\n \"[attr.role]\": 'variant() === \"error\" ? \"alert\" : \"status\"',\n \"[attr.aria-live]\": 'variant() === \"error\" ? \"assertive\" : \"polite\"',\n },\n})\nexport class FoldToastComponent {\n /** The tone — drives the accent stripe, icon, and live-region politeness. */\n readonly variant = input<FoldToastVariant>(\"info\");\n /** Show the dismiss button. */\n readonly dismissible = input(true, { transform: booleanAttribute });\n /** Auto-dismiss after this many ms. `0` (default) is sticky — no timer. */\n readonly duration = input(0, { transform: numberAttribute });\n\n /** Emitted on the close button, or when `duration` elapses. */\n readonly dismiss = output();\n\n /** The leading status icon for the current variant. */\n readonly icon = computed<FoldIconName>(() => VARIANT_ICON[this.variant()]);\n\n constructor() {\n // The toast owns its own expiry: (re)arm a timer whenever `duration` is a\n // positive value, and clear it on change / destroy so it can't outlive the\n // toast or double-fire. `duration <= 0` stays sticky.\n effect((onCleanup) => {\n const ms = this.duration();\n if (ms <= 0) {\n return;\n }\n const timer = setTimeout(() => this.dismiss.emit(), ms);\n onCleanup(() => clearTimeout(timer));\n });\n }\n}\n","<fold-icon class=\"toast-icon\" [name]=\"icon()\" [size]=\"16\" aria-hidden=\"true\" />\n\n<span class=\"toast-message\"><ng-content /></span>\n\n@if (dismissible()) {\n <button\n class=\"toast-close\"\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"dismiss.emit()\"\n >\n <fold-icon name=\"close\" [size]=\"14\" aria-hidden=\"true\" />\n </button>\n}\n","import { InjectionToken, type Provider } from \"@angular/core\";\nimport type { FoldToastVariant } from \"./toast.types\";\n\n/**\n * App-level toast duration policy. A `show()` call with no explicit duration\n * resolves through it (see {@link resolveToastDuration}).\n */\nexport type FoldToastConfig = {\n /** Fallback for any variant without a per-variant entry. */\n defaultDurationMs?: number;\n /** Per-variant duration (ms) overrides. `0` = sticky (no auto-dismiss). */\n durationByVariant?: Partial<Record<FoldToastVariant, number>>;\n};\n\n/** DI token carrying the app's {@link FoldToastConfig}. Set via {@link provideFoldToasts}. */\nexport const FOLD_TOAST_CONFIG = new InjectionToken<FoldToastConfig>(\n \"FOLD_TOAST_CONFIG\",\n);\n\n/**\n * Configure the toast duration policy at bootstrap (idiomatic, like\n * `provideFoldIcons` / `provideFoldPalette`):\n *\n * ```ts\n * providers: [\n * provideFoldToasts({\n * defaultDurationMs: 4000,\n * durationByVariant: { success: 2000, error: 0 }, // 0 = sticky\n * }),\n * ];\n * ```\n */\nexport function provideFoldToasts(config: FoldToastConfig): Provider {\n return { provide: FOLD_TOAST_CONFIG, useValue: config };\n}\n\n/**\n * Package defaults when nothing is configured or passed — dwell scales with\n * severity, and an `error` is sticky (it must be dismissed, not missed). All\n * overridable via {@link provideFoldToasts} or an explicit `show()` argument.\n */\nexport const FOLD_BAKED_TOAST_DURATION_MS: Record<FoldToastVariant, number> = {\n success: 3000,\n info: 4000,\n warning: 6000,\n error: 0,\n};\n\n/**\n * Duration for a variant, most-specific first: `durationByVariant[variant]` →\n * `defaultDurationMs` → the baked default. A configured `0` stays sticky (`??`\n * only falls through on null/undefined).\n */\nexport function resolveToastDuration(\n config: FoldToastConfig | null,\n variant: FoldToastVariant,\n): number {\n return (\n config?.durationByVariant?.[variant] ??\n config?.defaultDurationMs ??\n FOLD_BAKED_TOAST_DURATION_MS[variant]\n );\n}\n","import { Service, inject, signal } from \"@angular/core\";\nimport { FOLD_TOAST_CONFIG, resolveToastDuration } from \"./toast.config\";\nimport type { FoldToast, FoldToastVariant } from \"./toast.types\";\n\n/**\n * Lightweight toast/snackbar service — the source of truth for the queue that\n * `fold-toast-container` renders. Fire-and-forget: `durationMs` rides on the\n * queued toast and the rendered `fold-toast` owns the auto-dismiss timer (it\n * emits back into {@link dismiss}); a click on its close button does the same.\n * `durationMs = 0` is sticky (no auto-dismiss — the user closes it).\n *\n * A `show()` with no explicit duration resolves it through the app's\n * {@link FoldToastConfig} (see {@link resolveToastDuration}); an explicit\n * argument always wins.\n *\n * ```ts\n * const toast = inject(FoldToastService);\n * toast.show(\"Track uploaded\", \"success\"); // policy duration\n * toast.show(\"Analysis failed\", \"error\", 5000); // explicit override\n * toast.show(\"Action required\", \"warning\", 0); // sticky\n * ```\n */\n@Service()\nexport class FoldToastService {\n private readonly config = inject(FOLD_TOAST_CONFIG, { optional: true });\n private readonly _toasts = signal<FoldToast[]>([]);\n\n /** The active toasts, oldest first. Read by the container. */\n readonly toasts = this._toasts.asReadonly();\n\n show(\n message: string,\n variant: FoldToastVariant = \"info\",\n durationMs?: number,\n ): void {\n const toast: FoldToast = {\n id: crypto.randomUUID(),\n message,\n variant,\n durationMs: durationMs ?? resolveToastDuration(this.config, variant),\n };\n\n this._toasts.update((list) => [...list, toast]);\n }\n\n dismiss(id: string): void {\n this._toasts.update((list) => list.filter((t) => t.id !== id));\n }\n}\n","import { Component, inject } from \"@angular/core\";\nimport { FoldToastComponent } from \"./toast.component\";\nimport { FoldToastService } from \"./toast.service\";\n\n/**\n * `<fold-toast-container>` — renders the {@link FoldToastService} queue as a stack\n * of `fold-toast` snackbars, bottom-right, above everything. Mount it **once**\n * (typically in the app shell's content region). It owns only the stacking and\n * positioning; each {@link FoldToastComponent} owns its own surface, and the\n * service handles auto-expiry. A toast's dismiss button removes it from the queue.\n *\n * @selector `fold-toast-container`\n */\n@Component({\n selector: \"fold-toast-container\",\n standalone: true,\n imports: [FoldToastComponent],\n host: { class: \"toast-host\" },\n templateUrl: \"./toast-container.component.html\",\n styleUrl: \"./toast-container.component.scss\",\n})\nexport class FoldToastContainerComponent {\n readonly toastService = inject(FoldToastService);\n}\n","@for (toast of toastService.toasts(); track toast.id) {\n <fold-toast\n [variant]=\"toast.variant\"\n [duration]=\"toast.durationMs\"\n animate.leave=\"toast-leaving\"\n (dismiss)=\"toastService.dismiss(toast.id)\"\n >{{ toast.message }}</fold-toast\n >\n}\n","import {\n Directive,\n ViewContainerRef,\n effect,\n inject,\n input,\n} from \"@angular/core\";\nimport type { FoldComponentPanelDescriptor } from \"./panel.types\";\n\n/**\n * Mounts an imperatively-opened panel component inside the host: creates it with\n * the descriptor's injector (which provides its `FoldPanelRef`) and pushes the typed\n * `data` in via `setInput`. The component owns its own header/body/footer.\n */\n@Directive({ selector: \"[foldPanelComponentOutlet]\" })\nexport class FoldPanelComponentOutletDirective {\n readonly descriptor = input.required<FoldComponentPanelDescriptor>({\n alias: \"foldPanelComponentOutlet\",\n });\n\n private readonly viewContainer = inject(ViewContainerRef);\n\n constructor() {\n effect(() => {\n const descriptor = this.descriptor();\n this.viewContainer.clear();\n const ref = this.viewContainer.createComponent(descriptor.component, {\n injector: descriptor.injector,\n });\n if (descriptor.data !== undefined) {\n ref.setInput(\"data\", descriptor.data);\n }\n });\n }\n}\n","/**\n * Handle to an imperatively-opened panel. The opener gets it back from\n * `FoldPanelHostService.open()`; the panel component gets the same instance via\n * `inject(FoldPanelRef)`. Either side calls `close(result)` — the panel is\n * dismissed and `closed` resolves with the (typed) result.\n */\nexport class FoldPanelRef<TResult = unknown> {\n /** Resolves with the close result (or `undefined` if closed without one). */\n readonly closed: Promise<TResult | undefined>;\n\n private resolveClosed!: (result: TResult | undefined) => void;\n private settled = false;\n\n /**\n * @param id the panel's stable id — used to wire the dialog's accessible\n * name (`aria-labelledby` → the header's title `id`).\n * @param dismiss removes the panel from the host.\n */\n constructor(\n readonly id: number,\n private readonly dismiss: (result: TResult | undefined) => void,\n ) {\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n }\n\n /** Dismiss the panel, returning an optional result to the opener. */\n close(result?: TResult): void {\n if (this.settled) {\n return;\n }\n this.settled = true;\n this.dismiss(result);\n this.resolveClosed(result);\n }\n}\n","import { InjectionToken, type Provider } from \"@angular/core\";\n\n/**\n * App-wide default for a panel header's close-button label. Lets a non-English\n * app set the label **once** — every `fold-panel-header` (the host's template\n * panels and each feature's component panel) reads it, so there is no per-panel\n * wiring. A `closeLabel` input on a specific header still wins.\n */\nexport const FOLD_PANEL_CLOSE_LABEL = new InjectionToken<string>(\n \"FOLD_PANEL_CLOSE_LABEL\",\n { factory: () => \"Close\" },\n);\n\n/** Overridable panel labels. */\nexport interface FoldPanelLabels {\n /** Close-button accessible label. */\n readonly close: string;\n}\n\n/**\n * Provide app-wide panel labels once at bootstrap.\n *\n * @example\n * ```ts\n * // app.config.ts\n * providers: [provideFoldPanelLabels({ close: \"Fermer\" })];\n * ```\n */\nexport function provideFoldPanelLabels(labels: FoldPanelLabels): Provider {\n return { provide: FOLD_PANEL_CLOSE_LABEL, useValue: labels.close };\n}\n","import type {\n InputSignal,\n Injector,\n Provider,\n Signal,\n TemplateRef,\n Type,\n} from \"@angular/core\";\n\n/** Which layout edge the panel slides in from. */\nexport type FoldPanelSide = \"left\" | \"right\";\n\n/** Fields common to every panel the host renders. */\ninterface PanelBase {\n readonly id: number;\n readonly side: FoldPanelSide;\n readonly width: Signal<number>;\n /** Invoked on Escape, backdrop click, or the header close button. */\n readonly onClose: () => void;\n}\n\n/**\n * Declarative panel: a projected `TemplateRef` plus reactive header metadata.\n * Title/subtitle are `Signal`s so the shared header stays in sync with the\n * caller's `title()`/`subtitle()` inputs with zero manual wiring.\n */\nexport interface FoldTemplatePanelDescriptor extends PanelBase {\n readonly kind: \"template\";\n readonly templateRef: TemplateRef<unknown>;\n readonly title: Signal<string>;\n readonly subtitle: Signal<string>;\n}\n\n/**\n * Imperative panel: a component the host mounts. The component owns its own\n * header/body/footer (so rich panels like the org-chart node settings keep\n * their exact design); the host provides only the shell + a {@link FoldPanelRef}.\n */\nexport interface FoldComponentPanelDescriptor extends PanelBase {\n readonly kind: \"component\";\n readonly component: Type<unknown>;\n /** Typed at the `open()` boundary; set via `setInput` when present. */\n readonly data?: unknown;\n /** Injector that provides the panel's `FoldPanelRef` (+ any config providers). */\n readonly injector: Injector;\n /**\n * Explicit accessible name. Optional: a panel that renders `fold-panel-header`\n * is named automatically (the dialog's `aria-labelledby` points at the\n * header's title). Set this only for a component panel that has no\n * `fold-panel-header` to label it. (Carried straight from `config.ariaLabel`,\n * hence the explicit `| undefined`.)\n */\n readonly ariaLabel?: string | undefined;\n}\n\nexport type FoldPanelDescriptor =\n FoldTemplatePanelDescriptor | FoldComponentPanelDescriptor;\n\n/**\n * A component opened imperatively. Data-carrying panels declare a typed `data`\n * input; data-less panels (e.g. a help panel) simply omit it.\n */\nexport interface FoldPanelContent<TData> {\n readonly data?: InputSignal<TData>;\n}\n\n/** Options for `FoldPanelHostService.open()`. */\nexport interface FoldPanelConfig<TData> {\n /** Type-checked against the component's `data` input; omit for data-less panels. */\n readonly data?: TData;\n readonly side?: FoldPanelSide;\n readonly width?: number;\n /** Extra providers added to the panel's injector (panel-scoped data bus, etc.). */\n readonly providers?: Provider[];\n /**\n * Keep any already-open panels instead of replacing them. Default `false`:\n * one panel at a time — opening a new panel closes the current one.\n */\n readonly stack?: boolean;\n /**\n * Explicit accessible name for the dialog. Only needed when the panel does\n * **not** render `fold-panel-header` (which names the dialog automatically).\n */\n readonly ariaLabel?: string;\n}\n\n/** The DOM `id` of a panel's title, referenced by the dialog's `aria-labelledby`. */\nexport function foldPanelTitleId(panelId: number): string {\n return `fold-panel-title-${panelId}`;\n}\n\n/** Handle returned by `present()`; the caller dismisses via `dismiss()`. */\nexport interface FoldPanelHandle {\n readonly id: number;\n dismiss(): void;\n}\n","import { Component, computed, inject, input, output } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FoldPanelRef } from \"./panel-ref\";\nimport { FOLD_PANEL_CLOSE_LABEL } from \"./panel-labels\";\nimport { foldPanelTitleId } from \"./panel.types\";\n\n/**\n * Standard header for an **imperative** panel component (`panels.open()`), which\n * owns its own header/body/footer — the chrome renders no header for it. This\n * reproduces the chrome's declarative-panel header (title + optional subtitle +\n * close) so every component panel gets the same look without hand-rolling it.\n *\n * **Two variants.**\n * - `title` (default) — a large descriptive title for *editor* panels (a form,\n * an entity's settings): `title` + optional `subtitle` + projected description.\n * - `eyebrow` — a compact, uppercased, muted *category label* for *viewer*\n * panels (a page-like entity with cross-navigation): `icon` + short label,\n * with header actions sitting inline before the close.\n *\n * **Icon.** Optional leading `icon` (an {@link FoldIconComponent} name), shown in\n * both variants — muted in `eyebrow`.\n *\n * **Actions slot.** Project buttons into `[actions]` to sit left of the close\n * button (e.g. a cross-page-nav, an \"open full page\" button). The default,\n * unselected slot still feeds the description line (backwards compatible).\n *\n * **Self-closing.** The header injects its panel's {@link FoldPanelRef} (optional,\n * so it stays a pure presentational component in tests/storybook) and dismisses\n * the panel itself on close — no `(closed)=\"ref.close()\"` wiring needed. The\n * `(closed)` output still fires *before* the dismiss, for side-effects\n * (analytics, cleanup); it does **not** veto the close.\n *\n * **Layout.** Left-aligned. A title-only header (no subtitle, no projected\n * description) is *vertically* centred against the close button; add a subtitle\n * and/or project a description and the row switches to top-aligned. The\n * `eyebrow` variant is always vertically centred.\n *\n * Usage:\n * ```html\n * <!-- editor panel: title only → vertically centred, self-closes -->\n * <fold-panel-header title=\"Titre\" />\n *\n * <!-- editor panel: subtitle + a parent-filled description -->\n * <fold-panel-header title=\"Titre\" subtitle=\"Sous-titre\">\n * <span>Texte d'aide fourni par le parent…</span>\n * </fold-panel-header>\n *\n * <!-- viewer panel: eyebrow label + icon + projected actions -->\n * <fold-panel-header variant=\"eyebrow\" icon=\"playlist-add\" title=\"Playlist\">\n * <app-cross-page-nav actions … />\n * </fold-panel-header>\n * ```\n */\n@Component({\n selector: \"fold-panel-header\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./panel-header.component.html\",\n styleUrl: \"./panel-header.component.scss\",\n})\nexport class FoldPanelHeaderComponent {\n readonly title = input.required<string>();\n readonly subtitle = input<string>(\"\");\n /** Optional leading icon (an {@link FoldIconComponent} name). */\n readonly icon = input<FoldIconName | undefined>(undefined);\n /** `title` (large descriptive) or `eyebrow` (compact uppercased label). */\n readonly variant = input<\"title\" | \"eyebrow\">(\"title\");\n /**\n * Accessible label for the close button. Falls back to the app-wide\n * {@link FOLD_PANEL_CLOSE_LABEL} (default `\"Close\"`) when unset — so a\n * non-English app sets it once via `provideFoldPanelLabels`.\n */\n readonly closeLabel = input<string>();\n\n private readonly defaultCloseLabel = inject(FOLD_PANEL_CLOSE_LABEL);\n\n /** The label actually rendered — the input if given, else the app default. */\n protected readonly effectiveCloseLabel = computed(\n () => this.closeLabel() ?? this.defaultCloseLabel,\n );\n /**\n * Fires just before the panel is dismissed — bind it for side-effects only\n * (the header self-closes regardless; it is not a veto hook).\n */\n readonly closed = output();\n\n protected readonly iconSize = computed(() =>\n this.variant() === \"eyebrow\" ? 14 : 18,\n );\n\n /**\n * The panel this header lives in. Optional: outside a panel (tests,\n * storybook) it resolves to `null` and the header simply emits `(closed)`.\n */\n private readonly panelRef = inject(FoldPanelRef, { optional: true });\n\n /**\n * The title's DOM `id`, so the dialog's `aria-labelledby` can point at it —\n * this is what gives a component panel its accessible name. `null` outside a\n * panel (no ref to key the id on).\n */\n protected readonly titleId = computed<string | null>(() =>\n this.panelRef ? foldPanelTitleId(this.panelRef.id) : null,\n );\n\n protected onClose(): void {\n this.closed.emit();\n this.panelRef?.close();\n }\n}\n","<header class=\"ph\" [class.ph--eyebrow]=\"variant() === 'eyebrow'\">\n <div class=\"ph__titles\">\n <div class=\"ph__titleRow\">\n @if (icon(); as ic) {\n <fold-icon class=\"ph__icon\" [name]=\"ic\" [size]=\"iconSize()\" />\n }\n <h2 class=\"ph__title\" [attr.id]=\"titleId()\">{{ title() }}</h2>\n </div>\n @if (subtitle()) {\n <p class=\"ph__subtitle\">{{ subtitle() }}</p>\n }\n <div class=\"ph__desc\"><ng-content /></div>\n </div>\n <div class=\"ph__actions\">\n <ng-content select=\"[actions]\" />\n <button\n type=\"button\"\n class=\"ph__close\"\n [attr.aria-label]=\"effectiveCloseLabel()\"\n (click)=\"onClose()\"\n >\n <fold-icon name=\"close\" size=\"sm\" />\n </button>\n </div>\n</header>\n","import { Injector, Service, type Type, inject, signal } from \"@angular/core\";\nimport { FoldPanelRef } from \"./panel-ref\";\nimport type {\n FoldComponentPanelDescriptor,\n FoldPanelConfig,\n FoldPanelContent,\n FoldPanelDescriptor,\n FoldPanelHandle,\n FoldTemplatePanelDescriptor,\n} from \"./panel.types\";\n\n/**\n * Single source of truth for the layout-owned side-panel region.\n *\n * Two ways to hand a panel to the one host, both rendered through the same\n * `FoldPanelHostComponent` (backdrop, z-index, animation, scroll-lock, focus-trap):\n *\n * - **`open()` — the canonical, imperative API.** Open a component with a typed\n * `data` input; get a {@link FoldPanelRef} back for the result. No opaque token.\n * - **`present()` — declarative sugar** used by a `<side-panel>` wrapper to\n * teleport a projected template. Kept for page-coupled form drawers.\n */\n@Service()\nexport class FoldPanelHostService {\n private readonly rootInjector = inject(Injector);\n private nextId = 1;\n private readonly _panels = signal<readonly FoldPanelDescriptor[]>([]);\n\n /** The active panels, oldest first. Read by the layout host. */\n readonly panels = this._panels.asReadonly();\n\n // Data-carrying panel: `config.data` is type-checked against the component's\n // `data` input.\n open<TData, TResult = unknown>(\n component: Type<FoldPanelContent<TData>>,\n config: FoldPanelConfig<TData> & { data: TData },\n ): FoldPanelRef<TResult>;\n // Data-less panel (its data, if any, comes via `config.providers`).\n open<TResult = unknown>(\n component: Type<unknown>,\n config?: Omit<FoldPanelConfig<never>, \"data\">,\n ): FoldPanelRef<TResult>;\n open<TResult = unknown>(\n component: Type<unknown>,\n config: FoldPanelConfig<unknown> = {},\n ): FoldPanelRef<TResult> {\n const id = this.takeId();\n const ref = new FoldPanelRef<TResult>(id, () => this.dismiss(id));\n const injector = Injector.create({\n parent: this.rootInjector,\n providers: [\n { provide: FoldPanelRef, useValue: ref },\n ...(config.providers ?? []),\n ],\n });\n const descriptor: FoldComponentPanelDescriptor = {\n kind: \"component\",\n id,\n component,\n data: config.data,\n side: config.side ?? \"right\",\n width: signal(config.width ?? 490),\n injector,\n ariaLabel: config.ariaLabel,\n onClose: () => ref.close(),\n };\n if (!config.stack) {\n this.closeExisting();\n }\n this.add(descriptor);\n return ref;\n }\n\n /**\n * Register a declarative (projected-template) panel; returns a handle. These\n * are self-managed by their `<fold-side-panel>`'s `[open]` binding, so they are\n * not subject to the imperative single-panel replacement.\n */\n present(\n descriptor: Omit<FoldTemplatePanelDescriptor, \"id\" | \"kind\">,\n ): FoldPanelHandle {\n const id = this.takeId();\n this.add({ ...descriptor, kind: \"template\", id });\n return { id, dismiss: () => this.dismiss(id) };\n }\n\n /**\n * Close every open panel through its own `onClose` — so each opener's\n * `FoldPanelRef`/toggle settles — before a new single panel takes over. Iterates\n * a snapshot, so the `onClose`-driven removals don't disturb the loop.\n */\n private closeExisting(): void {\n for (const panel of this._panels()) {\n panel.onClose();\n }\n }\n\n /** Remove a panel by id (idempotent — dismissing twice is safe). */\n dismiss(id: number): void {\n this._panels.update((list) => list.filter((panel) => panel.id !== id));\n }\n\n /** Dismiss every open panel (e.g. on a hard navigation / logout). */\n dismissAll(): void {\n this._panels.set([]);\n }\n\n private takeId(): number {\n const id = this.nextId;\n this.nextId += 1;\n return id;\n }\n\n private add(descriptor: FoldPanelDescriptor): void {\n this._panels.update((list) => [...list, descriptor]);\n }\n}\n","import { DOCUMENT, NgTemplateOutlet } from \"@angular/common\";\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n effect,\n inject,\n} from \"@angular/core\";\nimport { FocusTrapDirective } from \"../../../a11y/focus-trap.directive\";\nimport { ScrollLockService } from \"../../../a11y/scroll-lock.service\";\nimport { FoldPanelComponentOutletDirective } from \"./panel-component-outlet.directive\";\nimport { FoldPanelHeaderComponent } from \"./panel-header.component\";\nimport { FoldPanelHostService } from \"./panel-host.service\";\nimport { foldPanelTitleId } from \"./panel.types\";\nimport type { FoldPanelDescriptor } from \"./panel.types\";\n\n/**\n * `<fold-panel-host>` — the single, layout-owned chrome for every side panel.\n *\n * Rendered **once** in the content region (typically inside the app shell). It\n * reads the {@link FoldPanelHostService} panels and wraps each in a **glass**\n * slide-in `<aside>` (no dark scrim — the surface itself is frosted),\n * `z-index: 50` stacking, focus-trap and body scroll-lock.\n *\n * Two content shapes:\n * - **template** — a projected `<side-panel>` body; the host supplies the shared\n * header (title/subtitle/close).\n * - **component** — an imperatively-opened component that owns its whole\n * header/body/footer; the host supplies only the shell.\n *\n * **Modal barrier.** While any panel is open, everything outside the panel is\n * marked `inert` (a `hideOthers` walk from the host up to `<body>`), so the\n * background is unreachable by pointer, Tab **and** the screen-reader virtual\n * cursor — the completion of the `aria-modal=\"true\"` promise. Only the\n * top-most panel traps focus; the page scroll is frozen once, not per panel.\n *\n * @selector `fold-panel-host`\n */\n@Component({\n selector: \"fold-panel-host\",\n standalone: true,\n imports: [\n NgTemplateOutlet,\n FocusTrapDirective,\n FoldPanelComponentOutletDirective,\n FoldPanelHeaderComponent,\n ],\n templateUrl: \"./panel-host.component.html\",\n styleUrl: \"./panel-host.component.scss\",\n})\nexport class FoldPanelHostComponent {\n private readonly host = inject(FoldPanelHostService);\n private readonly scrollLock = inject(ScrollLockService);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n\n readonly panels = this.host.panels;\n\n private locked = false;\n /** Elements this host made `inert`, so it removes exactly those on close. */\n private inerted: HTMLElement[] = [];\n\n constructor() {\n // Freeze page scroll + inert the background while any panel is open — once,\n // driven by whether the panel list is non-empty.\n effect(() => {\n const open = this.panels().length > 0;\n if (open && !this.locked) {\n this.scrollLock.lock();\n this.applyBackgroundBarrier();\n this.locked = true;\n } else if (!open && this.locked) {\n this.scrollLock.unlock();\n this.removeBackgroundBarrier();\n this.locked = false;\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n if (this.locked) {\n this.scrollLock.unlock();\n this.removeBackgroundBarrier();\n this.locked = false;\n }\n });\n }\n\n /** Explicit `aria-label`, or null when the name comes from `aria-labelledby`. */\n ariaLabel(panel: FoldPanelDescriptor): string | null {\n if (panel.kind === \"template\") {\n return panel.title();\n }\n return panel.ariaLabel ?? null;\n }\n\n /**\n * `aria-labelledby` id for a component panel with no explicit label — points\n * at the `fold-panel-header` title. Null for template panels (they use\n * `aria-label`) and for component panels given an explicit `ariaLabel`.\n */\n ariaLabelledby(panel: FoldPanelDescriptor): string | null {\n if (panel.kind === \"component\" && !panel.ariaLabel) {\n return foldPanelTitleId(panel.id);\n }\n return null;\n }\n\n /** Only the last-opened panel traps focus, so stacked panels don't fight. */\n isTopMost(panel: FoldPanelDescriptor): boolean {\n const panels = this.panels();\n const top = panels[panels.length - 1];\n return top?.id === panel.id;\n }\n\n /** Escape closes the top-most (last-opened) panel. */\n @HostListener(\"document:keydown.escape\")\n onEscape(): void {\n const top = this.panels().at(-1);\n top?.onClose();\n }\n\n onBackdrop(event: MouseEvent, panel: FoldPanelDescriptor): void {\n if (event.target === event.currentTarget) {\n panel.onClose();\n }\n }\n\n /**\n * Mark every branch of the DOM that doesn't contain this host as `inert`, from\n * the host up to `<body>`. Skips elements already inert (so a nested overlay's\n * barrier isn't torn down here). The panels live inside this host, so they\n * stay interactive.\n */\n private applyBackgroundBarrier(): void {\n let node: HTMLElement | null = this.element.nativeElement;\n const body = this.document.body;\n while (node && node !== body && node.parentElement) {\n for (const sibling of Array.from(node.parentElement.children)) {\n if (\n sibling !== node &&\n sibling instanceof HTMLElement &&\n !sibling.hasAttribute(\"inert\")\n ) {\n sibling.setAttribute(\"inert\", \"\");\n this.inerted.push(sibling);\n }\n }\n node = node.parentElement;\n }\n }\n\n private removeBackgroundBarrier(): void {\n for (const el of this.inerted) {\n el.removeAttribute(\"inert\");\n }\n this.inerted = [];\n }\n}\n","@for (panel of panels(); track panel.id) {\n <div\n class=\"panel-dock\"\n [class.panel-dock--left]=\"panel.side === 'left'\"\n (click)=\"onBackdrop($event, panel)\"\n >\n <aside\n class=\"panel\"\n [class.panel--left]=\"panel.side === 'left'\"\n [style.--panel-width.px]=\"panel.width()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"ariaLabel(panel)\"\n [attr.aria-labelledby]=\"ariaLabelledby(panel)\"\n tabindex=\"-1\"\n [foldFocusTrap]=\"isTopMost(panel)\"\n (click)=\"$event.stopPropagation()\"\n >\n @if (panel.kind === \"template\") {\n <fold-panel-header\n [title]=\"panel.title()\"\n [subtitle]=\"panel.subtitle()\"\n (closed)=\"panel.onClose()\"\n />\n <div class=\"panel-body\">\n <ng-container [ngTemplateOutlet]=\"panel.templateRef\" />\n </div>\n } @else {\n <ng-container [foldPanelComponentOutlet]=\"panel\" />\n }\n </aside>\n </div>\n}\n","import { type Type, type WritableSignal, signal } from \"@angular/core\";\nimport type { FoldPanelHostService } from \"./panel-host.service\";\nimport type { FoldPanelRef } from \"./panel-ref\";\nimport type { FoldPanelContent, FoldPanelSide } from \"./panel.types\";\n\n/**\n * A single open-or-close panel button's worth of state. Wraps\n * `FoldPanelHostService.open()` so a page can `toggle(data)` without hand-tracking\n * the `FoldPanelRef` and re-syncing when the panel closes from the inside.\n *\n * `isOpen` stays truthful whether the panel is closed by a second toggle, its\n * own close button, or Escape — it mirrors the ref's `closed` promise.\n */\nexport class FoldPanelToggle<TData> {\n /** Reactive open-state, safe to bind in a template (e.g. an active pill). */\n readonly isOpen: WritableSignal<boolean> = signal(false);\n\n private ref: FoldPanelRef | null = null;\n\n constructor(\n private readonly host: FoldPanelHostService,\n private readonly component: Type<FoldPanelContent<TData>>,\n private readonly side: FoldPanelSide = \"right\",\n ) {}\n\n /** Open with `data`, or close if already open. */\n toggle(data: TData): void {\n if (this.ref) {\n this.ref.close();\n return;\n }\n const ref = this.host.open<TData>(this.component, {\n data,\n side: this.side,\n });\n this.ref = ref;\n this.isOpen.set(true);\n void ref.closed.then(() => {\n this.ref = null;\n this.isOpen.set(false);\n });\n }\n\n /** Close if open (no-op otherwise). */\n close(): void {\n this.ref?.close();\n }\n}\n","// Public TypeScript API for fold-ng.\n//\n// The tokens themselves ship as CSS (import 'fold-ng/tokens.css').\n// This entry point exposes the typed token catalogue + helpers so call\n// sites get autocomplete and a compile error on a misspelt token.\n\nexport { FoldAppShellComponent } from \"./components/layout/app-shell/app-shell.component\";\nexport {\n FoldAvatarComponent,\n type FoldAvatarVariant,\n type FoldAvatarRing,\n type FoldAvatarRingStyle,\n} from \"./components/content/avatar/avatar.component\";\nexport { FoldAvatarDetailComponent } from \"./components/content/avatar-detail/avatar-detail.component\";\nexport {\n FoldAvatarListComponent,\n type FoldAvatarListItem,\n} from \"./components/content/avatar-list/avatar-list.component\";\nexport {\n FoldBadgeComponent,\n type FoldBadgeVariant,\n} from \"./components/content/badge/badge.component\";\nexport { FoldButtonComponent } from \"./components/actions/button/button.component\";\nexport type {\n FoldButtonEmphasis,\n FoldButtonIntent,\n FoldButtonSize,\n FoldButtonShape,\n} from \"./components/actions/button/button.types\";\nexport { FoldButtonIconComponent } from \"./components/actions/button-icon/button-icon.component\";\nexport type {\n FoldButtonIconShape,\n FoldButtonIconSize,\n FoldButtonIconTone,\n} from \"./components/actions/button-icon/button-icon.types\";\nexport { FoldToggleIconComponent } from \"./components/actions/toggle-icon/toggle-icon.component\";\nexport { FoldCardComponent } from \"./components/content/card/card.component\";\nexport { FoldContextCardComponent } from \"./components/content/context-card/context-card.component\";\nexport { FoldElementTitleComponent } from \"./components/content/element-title/element-title.component\";\nexport { FoldFileDropzoneComponent } from \"./components/forms/file-dropzone/file-dropzone.component\";\nexport { FoldFieldListComponent } from \"./components/content/field/field-list.component\";\nexport { FoldFieldComponent } from \"./components/content/field/field.component\";\nexport { FoldLinkComponent } from \"./components/actions/link/link.component\";\nexport { FoldMenuComponent } from \"./components/navigation/menu/menu.component\";\nexport type {\n FoldMenuTint,\n FoldMenuTogglePlacement,\n FoldMenuLevel,\n} from \"./components/navigation/menu/menu.component\";\nexport {\n FoldMenuItemComponent,\n type FoldMenuItemBadgeTone,\n} from \"./components/navigation/menu/menu-item.component\";\nexport { FoldMenuSeparatorComponent } from \"./components/navigation/menu/menu-separator.component\";\nexport { FoldMenuSectionComponent } from \"./components/navigation/menu/menu-section.component\";\nexport { FoldNavLauncherComponent } from \"./components/navigation/nav-launcher/nav-launcher.component\";\nexport { FoldNavTileComponent } from \"./components/navigation/nav-launcher/nav-tile.component\";\nexport { FoldHeroCardComponent } from \"./components/content/hero-card/hero-card.component\";\nexport { FoldDataTableComponent } from \"./components/content/data-table/data-table.component\";\nexport { FoldDataTableCellDirective } from \"./components/content/data-table/data-table-cell.directive\";\nexport {\n FoldStickyColumnDirective,\n type FoldStickyColumnAnchor,\n} from \"./directives/sticky-column.directive\";\nexport type {\n FoldTableColumn,\n FoldTableEmpty,\n FoldTableSort,\n FoldTableSortDir,\n FoldTableTone,\n} from \"./components/content/data-table/data-table.types\";\nexport { FoldChoiceRowComponent } from \"./components/content/choice-row/choice-row.component\";\nexport type { FoldChoiceOption } from \"./components/content/choice-row/choice-row.component\";\nexport { FoldIconComponent } from \"./components/foundations/icon/icon.component\";\nexport { FoldSpinnerComponent } from \"./components/foundations/spinner/spinner.component\";\nexport type { FoldSpinnerSize } from \"./components/foundations/spinner/spinner.component\";\nexport { FoldIdService } from \"./a11y/id.service\";\nexport { FoldFieldIdDirective } from \"./a11y/field-id.directive\";\nexport { FoldRepeatPressDirective } from \"./directives/repeat-press.directive\";\nexport { observeElementWidth } from \"./dom/observe-element-width\";\nexport { FoldSurfaceDirective } from \"./directives/surface.directive\";\nexport type { FoldSurfaceName } from \"./directives/surface.directive\";\nexport { FoldElevatedDirective } from \"./directives/elevated.directive\";\nexport { FoldInputComponent } from \"./components/forms/input/input.component\";\nexport {\n FoldNumberInputComponent,\n type FoldNumberSpinner,\n type FoldNumberControls,\n} from \"./components/forms/input/number-input.component\";\nexport { FoldSearchComponent } from \"./components/forms/input/search.component\";\nexport { FoldSelectComponent } from \"./components/forms/input/select.component\";\nexport { FoldSliderComponent } from \"./components/forms/slider/slider.component\";\nexport { FoldRangeSliderComponent } from \"./components/forms/slider/range-slider.component\";\nexport type { FoldRangeValue } from \"./components/forms/slider/range-slider.component\";\nexport { FoldCalloutComponent } from \"./components/feedback/callout/callout.component\";\nexport type {\n FoldCalloutVariant,\n FoldCalloutAppearance,\n} from \"./components/feedback/callout/callout.component\";\nexport { FoldDisclosureComponent } from \"./components/feedback/disclosure/disclosure.component\";\nexport { FoldStatusBadgeComponent } from \"./components/content/status-badge/status-badge.component\";\nexport { FoldTimelineComponent } from \"./components/content/timeline/timeline.component\";\nexport type {\n FoldTimelineNode,\n FoldTimelineDatePlacement,\n} from \"./components/content/timeline/timeline.component\";\nexport { FoldLoadingStateComponent } from \"./components/feedback/state/loading-state.component\";\nexport { FoldEmptyStateComponent } from \"./components/feedback/state/empty-state.component\";\nexport type { FoldIconSize } from \"./components/foundations/icon/icon.component\";\nexport {\n FoldIconRegistry,\n provideFoldIcons,\n} from \"./components/foundations/icon/icon-registry.service\";\nexport type { FoldIconSet } from \"./components/foundations/icon/icon-registry.service\";\nexport { FOLD_BUILTIN_ICONS } from \"./components/foundations/icon/builtin-icons\";\nexport type {\n FoldIconName,\n FoldBuiltinIconName,\n} from \"./components/foundations/icon/builtin-icons\";\nexport { FoldAsideLayoutComponent } from \"./components/layout/aside-layout/aside-layout.component\";\nexport { FoldTabLayoutComponent } from \"./components/layout/tab-layout/tab-layout.component\";\nexport { FoldPageLayoutComponent } from \"./components/layout/page-layout/page-layout.component\";\nexport { FoldPageSectionComponent } from \"./components/layout/page-section/page-section.component\";\nexport { FoldHeroSectionComponent } from \"./components/layout/hero-section/hero-section.component\";\nexport { FoldPaginatorComponent } from \"./components/content/paginator/paginator.component\";\nexport type { FoldPageItem } from \"./components/content/paginator/paginator.component\";\nexport { FoldTabNavComponent } from \"./components/navigation/tab-nav/tab-nav.component\";\nexport type { FoldTabNavItem } from \"./components/navigation/tab-nav/tab-nav.component\";\nexport { FoldToastComponent } from \"./components/feedback/toast/toast.component\";\nexport { FoldToastContainerComponent } from \"./components/feedback/toast/toast-container.component\";\nexport { FoldToastService } from \"./components/feedback/toast/toast.service\";\nexport {\n provideFoldToasts,\n FOLD_TOAST_CONFIG,\n} from \"./components/feedback/toast/toast.config\";\nexport type { FoldToastConfig } from \"./components/feedback/toast/toast.config\";\nexport type {\n FoldToast,\n FoldToastVariant,\n} from \"./components/feedback/toast/toast.types\";\n\n// ── Panels (overlay system) ──────────────────────────────────\nexport { FoldPanelHostComponent } from \"./components/overlays/panel/panel-host.component\";\nexport { FoldPanelHeaderComponent } from \"./components/overlays/panel/panel-header.component\";\nexport { FoldPanelHostService } from \"./components/overlays/panel/panel-host.service\";\nexport { FoldPanelRef } from \"./components/overlays/panel/panel-ref\";\nexport { FoldPanelToggle } from \"./components/overlays/panel/panel-toggle\";\nexport { FoldPanelComponentOutletDirective } from \"./components/overlays/panel/panel-component-outlet.directive\";\nexport {\n provideFoldPanelLabels,\n FOLD_PANEL_CLOSE_LABEL,\n} from \"./components/overlays/panel/panel-labels\";\nexport type { FoldPanelLabels } from \"./components/overlays/panel/panel-labels\";\nexport type {\n FoldPanelSide,\n FoldPanelContent,\n FoldPanelConfig,\n FoldPanelHandle,\n FoldPanelDescriptor,\n FoldTemplatePanelDescriptor,\n FoldComponentPanelDescriptor,\n} from \"./components/overlays/panel/panel.types\";\n\n// NB: FocusTrapDirective + ScrollLockService stay package-internal — the panel\n// host is their only consumer. Promote to the public API when one appears.\n\n// ── Auto-colour (categorical palettes + the app-wide registry) ─\nexport {\n FoldPaletteRegistry,\n provideFoldPalette,\n FOLD_PALETTE_DEFAULT,\n} from \"./color/palette-registry.service\";\nexport {\n FOLD_AUTO_PALETTES,\n foldHashSeed,\n foldResolvePalette,\n} from \"./color/palettes\";\nexport type { FoldAutoPaletteName, FoldPaletteInput } from \"./color/palettes\";\n\nexport {\n FOLD_SEMANTIC_COLOR_TOKENS,\n FOLD_RADIUS_TOKENS,\n FOLD_TEXT_TOKENS,\n FOLD_SPACE_TOKENS,\n FOLD_MOTION_TOKENS,\n FOLD_BLUR_TOKENS,\n FOLD_SHADOW_TOKENS,\n foldColorProperty,\n foldColorVar,\n foldRadiusVar,\n foldTextVar,\n foldSpaceVar,\n foldMotionVar,\n foldBlurVar,\n foldShadowVar,\n} from \"./tokens/tokens.catalog\";\nexport type {\n FoldSemanticColorToken,\n FoldRadiusToken,\n FoldTextToken,\n FoldSpaceToken,\n FoldMotionToken,\n FoldBlurToken,\n FoldShadowToken,\n} from \"./tokens/tokens.catalog\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fold-ng.mjs","sources":["../../src/a11y/focus-trap.directive.ts","../../src/a11y/id.service.ts","../../src/dom/observe-element-width.ts","../../src/directives/surface.directive.ts","../../src/components/layout/app-shell/app-shell.component.ts","../../src/components/layout/app-shell/app-shell.component.html","../../src/color/palettes.ts","../../src/color/palette-registry.service.ts","../../src/components/content/avatar/avatar.component.ts","../../src/components/content/avatar/avatar.component.html","../../src/components/content/avatar-detail/avatar-detail.component.ts","../../src/components/content/avatar-detail/avatar-detail.component.html","../../src/components/content/avatar-list/avatar-list.component.ts","../../src/components/content/avatar-list/avatar-list.component.html","../../src/components/content/badge/badge.component.ts","../../src/components/content/badge/badge.component.html","../../src/components/foundations/icon/icons/ui.icons.ts","../../src/components/foundations/icon/icons/nav.icons.ts","../../src/components/foundations/icon/icons/music.icons.ts","../../src/components/foundations/icon/icons/status.icons.ts","../../src/components/foundations/icon/icons/people.icons.ts","../../src/components/foundations/icon/icons/brands.icons.ts","../../src/components/foundations/icon/builtin-icons.ts","../../src/components/foundations/icon/icon-safety.ts","../../src/components/foundations/icon/icon-registry.service.ts","../../src/components/foundations/icon/icon-sprite.ts","../../src/components/foundations/icon/icon-sprite.service.ts","../../src/components/foundations/icon/icon.component.ts","../../src/components/foundations/icon/icon.component.html","../../src/tokens/tokens.catalog.ts","../../src/components/foundations/spinner/spinner.component.ts","../../src/components/foundations/spinner/spinner.component.html","../../src/components/actions/button/button.component.ts","../../src/components/actions/button/button.component.html","../../src/components/actions/button-icon/button-icon.component.ts","../../src/components/actions/button-icon/button-icon.component.html","../../src/components/actions/toggle-icon/toggle-icon.component.ts","../../src/components/actions/toggle-icon/toggle-icon.component.html","../../src/components/content/card/card.component.ts","../../src/components/content/card/card.component.html","../../src/components/content/element-title/element-title.component.ts","../../src/components/content/element-title/element-title.component.html","../../src/components/content/context-card/context-card.component.ts","../../src/components/content/context-card/context-card.component.html","../../src/a11y/field-id.directive.ts","../../src/components/forms/file-dropzone/file-dropzone.component.ts","../../src/components/forms/file-dropzone/file-dropzone.component.html","../../src/components/content/field/field-list.component.ts","../../src/components/content/field/field-list.component.html","../../src/components/content/field/field.component.ts","../../src/components/content/field/field.component.html","../../src/components/actions/link/link.component.ts","../../src/components/actions/link/link.component.html","../../src/components/navigation/menu/menu.component.ts","../../src/components/navigation/menu/menu.component.html","../../src/components/navigation/menu/menu-item.component.ts","../../src/components/navigation/menu/menu-item.component.html","../../src/components/navigation/menu/menu-separator.component.ts","../../src/components/navigation/menu/menu-separator.component.html","../../src/components/navigation/menu/menu-section.component.ts","../../src/components/navigation/menu/menu-section.component.html","../../src/a11y/scroll-lock.service.ts","../../src/components/navigation/nav-launcher/nav-tile.component.ts","../../src/components/navigation/nav-launcher/nav-tile.component.html","../../src/components/navigation/nav-launcher/nav-launcher.component.ts","../../src/components/navigation/nav-launcher/nav-launcher.component.html","../../src/components/content/hero-card/hero-card.component.ts","../../src/components/content/hero-card/hero-card.component.html","../../src/components/content/data-table/data-table-cell.directive.ts","../../src/components/content/data-table/data-table.component.ts","../../src/components/content/data-table/data-table.component.html","../../src/directives/sticky-column.directive.ts","../../src/components/content/choice-row/choice-row.component.ts","../../src/components/content/choice-row/choice-row.component.html","../../src/directives/repeat-press.directive.ts","../../src/directives/elevated.directive.ts","../../src/components/forms/input/label.component.ts","../../src/components/forms/input/input-base.component.ts","../../src/components/forms/input/input-base.component.html","../../src/components/forms/input/input-value.ts","../../src/components/forms/input/input.component.ts","../../src/components/forms/input/input.component.html","../../src/components/forms/input/number-settle.ts","../../src/components/forms/input/number-input.component.ts","../../src/components/forms/input/number-input.component.html","../../src/components/forms/input/search.component.ts","../../src/components/forms/input/select.component.ts","../../src/components/forms/input/select.component.html","../../src/components/forms/slider/slider.component.ts","../../src/components/forms/slider/slider.component.html","../../src/components/forms/slider/range-slider.component.ts","../../src/components/forms/slider/range-slider.component.html","../../src/components/feedback/callout/callout.component.ts","../../src/components/feedback/callout/callout.component.html","../../src/components/feedback/disclosure/disclosure.component.ts","../../src/components/feedback/disclosure/disclosure.component.html","../../src/components/content/status-badge/status-badge.component.ts","../../src/components/content/status-badge/status-badge.component.html","../../src/components/content/timeline/timeline.component.ts","../../src/components/content/timeline/timeline.component.html","../../src/components/feedback/state/loading-state.component.ts","../../src/components/feedback/state/loading-state.component.html","../../src/components/feedback/state/empty-state.component.ts","../../src/components/feedback/state/empty-state.component.html","../../src/components/layout/aside-layout/aside-layout.component.ts","../../src/components/layout/aside-layout/aside-layout.component.html","../../src/components/layout/tab-layout/tab-layout.component.ts","../../src/components/layout/tab-layout/tab-layout.component.html","../../src/components/layout/page-layout/page-layout.component.ts","../../src/components/layout/page-layout/page-layout.component.html","../../src/components/layout/page-section/page-section.component.ts","../../src/components/layout/page-section/page-section.component.html","../../src/components/layout/hero-section/hero-section.component.ts","../../src/components/layout/hero-section/hero-section.component.html","../../src/components/content/paginator/paginator.component.ts","../../src/components/content/paginator/paginator.component.html","../../src/components/navigation/tab-nav/tab-nav.component.ts","../../src/components/navigation/tab-nav/tab-nav.component.html","../../src/components/feedback/toast/toast.component.ts","../../src/components/feedback/toast/toast.component.html","../../src/components/feedback/toast/toast.config.ts","../../src/components/feedback/toast/toast.service.ts","../../src/components/feedback/toast/toast-container.component.ts","../../src/components/feedback/toast/toast-container.component.html","../../src/components/overlays/panel/panel-component-outlet.directive.ts","../../src/components/overlays/panel/panel-ref.ts","../../src/components/overlays/panel/panel-labels.ts","../../src/components/overlays/panel/panel.types.ts","../../src/components/overlays/panel/panel-header.component.ts","../../src/components/overlays/panel/panel-header.component.html","../../src/components/overlays/panel/panel-host.service.ts","../../src/components/overlays/panel/panel-host.component.ts","../../src/components/overlays/panel/panel-host.component.html","../../src/components/overlays/panel/panel-toggle.ts","../../src/public-api.ts","../../src/fold-ng.ts"],"sourcesContent":["import { DOCUMENT } from \"@angular/common\";\nimport { Directive, ElementRef, effect, inject, input } from \"@angular/core\";\n\n/**\n * A matched element is only truly focusable if it's rendered — `display:none`\n * and `visibility:hidden` descendants match the selector but can't take focus,\n * and focusing one would drop focus to the body. `offsetParent === null` catches\n * `display:none`; the size check catches a zero-box element still in flow.\n */\nfunction isVisible(el: HTMLElement): boolean {\n if (el.hidden) {\n return false;\n }\n const rects = el.getClientRects();\n return el.offsetParent !== null || rects.length > 0;\n}\n\n/** Elements that can receive keyboard focus, minus explicitly-skipped ones. */\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(\",\");\n\n/**\n * Traps keyboard focus inside the host element while enabled — the a11y\n * contract every overlay must honour but which panels historically skipped.\n *\n * On enable it remembers the currently-focused element and moves focus to the\n * first focusable descendant (or the host itself). `Tab`/`Shift+Tab` wrap at\n * the boundaries so focus never escapes to the page behind. On disable or\n * destroy it restores focus to wherever it was before — so closing a panel\n * returns the user to the control that opened it.\n *\n * The host must be focusable as a fallback (`tabindex=\"-1\"`).\n */\n@Directive({\n selector: \"[foldFocusTrap]\",\n host: { \"(keydown)\": \"onKeydown($event)\" },\n})\nexport class FocusTrapDirective {\n /** Bind `[foldFocusTrap]=\"open()\"` — the trap is live only while true. */\n readonly enabled = input(true, { alias: \"foldFocusTrap\" });\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private previouslyFocused: HTMLElement | null = null;\n\n constructor() {\n effect((onCleanup) => {\n if (!this.enabled()) {\n return;\n }\n this.activate();\n onCleanup(() => this.restore());\n });\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key !== \"Tab\" || !this.enabled()) {\n return;\n }\n const focusables = this.focusable();\n if (focusables.length === 0) {\n event.preventDefault();\n this.host.nativeElement.focus();\n return;\n }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n if (!first || !last) {\n return;\n }\n const active = this.document.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n private activate(): void {\n const active = this.document.activeElement;\n this.previouslyFocused = active instanceof HTMLElement ? active : null;\n (this.focusable()[0] ?? this.host.nativeElement).focus();\n }\n\n private restore(): void {\n this.previouslyFocused?.focus();\n this.previouslyFocused = null;\n }\n\n private focusable(): HTMLElement[] {\n const all = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n );\n const visible = all.filter(isVisible);\n // A non-rendering environment (SSR / jsdom) reports every element as\n // zero-box; don't over-filter there — fall back to the raw matches.\n return visible.length > 0 ? visible : all;\n }\n}\n","import { Injectable } from \"@angular/core\";\n\n/**\n * Generates unique, SSR-safe element ids.\n *\n * A per-injector counter (`providedIn: 'root'` → one instance per application,\n * and a fresh one per request on the server) so the sequence is deterministic\n * in render order and therefore matches between server and client. That's the\n * point: `crypto.randomUUID()` returns a different value on the server than on\n * the client for the same element, which trips Angular hydration; a counter\n * reset per request does not, and can't collide across requests or grow\n * unbounded.\n *\n * Used by the labelled controls that own their id ({@link FoldInputComponent},\n * `fold-select`) and by {@link FoldFieldIdDirective} for loose native controls.\n */\n@Injectable({ providedIn: \"root\" })\nexport class FoldIdService {\n private counter = 0;\n\n /**\n * The next unique id, e.g. `fold-input-3`.\n * @param prefix a short, human-readable namespace for the id.\n */\n next(prefix = \"fold\"): string {\n this.counter += 1;\n return `${prefix}-${this.counter}`;\n }\n}\n","import {\n DestroyRef,\n ElementRef,\n type Signal,\n inject,\n signal,\n} from \"@angular/core\";\n\n/**\n * A signal of an element's content-box **width** in px, kept live by a\n * `ResizeObserver`. Call it in an **injection context** (a component/directive\n * constructor or field initialiser); it wires the observer to the current\n * `ElementRef` — or an element you pass — and tears it down on destroy.\n *\n * This is the reusable half of container-responsiveness: the `ResizeObserver`\n * wiring, the SSR guard and the teardown, in one place. Each caller derives\n * whatever breakpoint policy it needs on top — a plain `computed(() => w() <=\n * 768)`, or a hysteretic state machine — instead of re-writing the observer.\n *\n * SSR / no-DOM safe: where `ResizeObserver` is undefined the signal stays at\n * its initial `0`, which every caller reads as \"not yet measured\" — and, for a\n * breakpoint, as the wide/default branch, the SSR-correct first paint. The\n * observer also ignores a `0` reading, so a detached or hidden element keeps\n * its last real width rather than flipping.\n *\n * @param element the element to observe; defaults to the injected host.\n * @returns a read-only signal of the current width in px (`0` until measured).\n */\nexport function observeElementWidth(\n element?: ElementRef<HTMLElement> | HTMLElement,\n): Signal<number> {\n const host =\n element instanceof ElementRef\n ? element.nativeElement\n : (element ?? inject<ElementRef<HTMLElement>>(ElementRef).nativeElement);\n const width = signal(0);\n if (typeof ResizeObserver !== \"undefined\") {\n const observer = new ResizeObserver((entries) => {\n const measured = entries[0]?.contentRect.width ?? 0;\n if (measured > 0) {\n width.set(measured);\n }\n });\n observer.observe(host);\n inject(DestroyRef).onDestroy(() => observer.disconnect());\n }\n return width.asReadonly();\n}\n","import { Directive, input } from \"@angular/core\";\n\n/**\n * A named surface — the ground a subtree paints itself on. `page` is the\n * document body; `chrome` is application furniture (rails, header) that a\n * theme may colour differently from the page.\n */\nexport type FoldSurfaceName = \"page\" | \"chrome\";\n\n/**\n * `[foldSurface]` — declares the element a **named surface**, so a theme can\n * re-colour it without knowing anything about the component it lives in.\n *\n * It exists to let one theme mean two things by \"the same\" role. A uniform\n * theme (umbra, light) needs none of this — `text` is one colour everywhere.\n * But a theme that mixes a **light page with dark chrome** (navi) needs `text`,\n * `surface` and the brand to differ *per region*, which a single set of roles\n * cannot express. The surface is the seam a theme overrides across:\n *\n * ```css\n * [data-theme=\"navi\"] [data-surface=\"chrome\"] {\n * --fold-color-text: var(--fold-ref-slate-50); / * light text on the dark rail * /\n * }\n * ```\n *\n * The directive only stamps `data-surface`; the theme owns the colours. Two\n * rules make it work, both in the token layer, neither in a component:\n * - `[data-surface] { color: var(--fold-color-text); }` — every surface resolves\n * its own text, so a per-surface override actually lands (a custom-property\n * override reaches only properties *resolved inside* the subtree, never a\n * colour already inherited from an ancestor).\n * - a theme adds `[data-theme=\"…\"] [data-surface=\"chrome\"] { … }` for the\n * surfaces it wants to diverge on.\n *\n * This replaces reaching into `fold-app-shell`'s internal class names from the\n * theme file — a coupling that pointed the wrong way (a renamed rail class\n * would have broken a theme silently). Any element can now be a chrome surface:\n * a shell rail, a dark hero on a light page, a footer, a preview pane.\n *\n * @selector `[foldSurface]`\n *\n * @example\n * ```html\n * <aside foldSurface=\"chrome\">…dark furniture on a light page…</aside>\n * ```\n */\n@Directive({\n selector: \"[foldSurface]\",\n standalone: true,\n host: { \"[attr.data-surface]\": \"foldSurface()\" },\n})\nexport class FoldSurfaceDirective {\n /** The surface this element is. Defaults to `page`, including a bare\n * `foldSurface` attribute (which the template binds as an empty string). */\n readonly foldSurface = input<FoldSurfaceName, FoldSurfaceName | \"\">(\"page\", {\n transform: (value) => (value === \"\" ? \"page\" : value),\n });\n}\n","import { DOCUMENT, NgTemplateOutlet } from \"@angular/common\";\nimport {\n Component,\n HostListener,\n computed,\n effect,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport { FocusTrapDirective } from \"../../../a11y/focus-trap.directive\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { observeElementWidth } from \"../../../dom/observe-element-width\";\nimport { FoldSurfaceDirective } from \"../../../directives/surface.directive\";\n\n/** Width (px) at or below which the rails collapse and the primary rail becomes\n * a mobile drawer. Kept in lockstep with the `@media`/`@container` breakpoint\n * in the stylesheet. */\nconst MOBILE_BREAKPOINT = 768;\n\n/**\n * `<fold-app-shell>` — the responsive application skeleton.\n *\n * A pure structural grid with four content slots: it owns the layout and the\n * responsive collapse, the app owns what fills the slots (nav, header, routed\n * content, overlays) and all state/routing. Rail visibility is driven from the\n * projected rail component itself (an empty `railSecondary` self-collapses).\n *\n * Sizing has two ergonomic paths that compose:\n * - **Typed inputs** (`railWidth`, `headerHeight`, `headerHeightMobile`) for the\n * common case — plain px numbers, discoverable and type-checked in the\n * template.\n * - **CSS variables** for the theming case — set `--fold-shell-*` on any ancestor\n * to compose tokens (`var(--w-appMenu)`) or drive it from a media query. An\n * unset input inherits the variable, so the two never fight.\n *\n * ```\n * ┌────────┬──────────────┬─────────────────────┐\n * │ rail │ rail │ header │ ← header row (fixed height)\n * │ primary│ secondary ├─────────────────────┤\n * │ (auto, │ (auto width, │ content │ ← content row (1fr)\n * │ self- │ self- │ (position: relative │\n * │ sized)│ collapsing) │ anchor for panels) │\n * │ │ ├─────────────────────┤\n * │ │ │ footer │ ← footer row (auto — 0 when empty)\n * └────────┴──────────────┴─────────────────────┘\n * ```\n *\n * At ≤768px it becomes a single header + content + footer column and the rails\n * drop out. How the nav comes back is `mobileNav`:\n * - `\"drawer\"` (default) — the **primary** rail turns into an off-canvas drawer;\n * bind `[(mobileNavOpen)]` and give the app a mobile-only hamburger to slide\n * it in over a scrim (`Escape` / scrim / widening close it). Render the\n * projected rail expanded in the drawer, since the collapsed icon rail is the\n * desktop chrome.\n * - `\"none\"` — no built-in mobile nav; compose an `fold-nav-launcher` (a\n * full-screen tile grid) bound to the same `mobileNavOpen`.\n *\n * ## Slots\n * | Attribute | Region |\n * |------------------|-------------------------------------------|\n * | `railPrimary` | Left rail (intrinsic width — the rail component sizes itself; `railWidth` sets its base via `--fold-shell-rail-width`). At ≤768px it becomes the mobile drawer (see `mobileNavOpen`). |\n * | `railSecondary` | Second rail (intrinsic width; a component that collapses to `0` hides itself). |\n * | `header` | Top bar (content column, or full-width — see `headerLayout`). Rendered as `<header>` — project plain elements into it, not another `<header>`. |\n * | *(default)* | The content region — routed pages, floating panels, overlays, banners. Rendered as the document's single `<main>`. **Full-bleed**: the shell adds no gutter, so a page can paint edge-to-edge (a full-width banner, a hero, a bleeding panel). Want the themed page gutter? Wrap the page in `fold-page-layout` — padding is *its* job, not the shell's. |\n * | `footer` | Bottom bar — a player / status strip (`footerBehavior=\"pinned\"`, always in sight) or a legal / support footer (`footerBehavior=\"scroll\"`, revealed at the end of the content). Rendered as `<footer>` (the document's `contentinfo` landmark). **Content-sized and self-collapsing**: an empty slot takes no space (unlike the fixed-height header). Content column, or full-width — see `footerLayout`. |\n *\n * ## Sizing knobs\n * | Input | CSS variable | Default | Meaning |\n * |----------------------|------------------------------------|---------|----------------------------|\n * | `railWidth` | `--fold-shell-rail-width` | `64px` | Base width the primary rail reads (column is intrinsic). |\n * | `headerHeight` | `--fold-shell-header-height` | `56px` | Header row height. |\n * | `headerHeightMobile` | `--fold-shell-header-height-mobile` | `52px` | Header height at ≤768px. |\n *\n * ## Layout knobs\n * | Input | Values | Default | Meaning |\n * |----------------|-----------------------|-----------|--------------------------------------------|\n * | `headerLayout` | `\"inset\" \\| \"full\"` | `\"inset\"` | `inset` = header sits over the content column (rails climb its side); `full` = header spans the full width, above the rails. |\n * | `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\"`. |\n * | `footerBehavior`| `\"pinned\" \\| \"scroll\"`| `\"pinned\"`| `pinned` = the footer is a fixed row, **always in sight** (a player / status bar) — supports `inset` and `full`. `scroll` = the footer flows at the **end of the content**, revealed when you scroll to the bottom (a legal / support footer) — it lives in the content column (inset), and the shell owns the content scroll, so project *flow* content, not a page that manages its own full-height scroll. |\n * | `contentScroll`| `\"clip\" \\| \"auto\"` | `\"clip\"` | `clip` = the shell clips the content region; the page inside owns its scroll (`fold-page-layout`). `auto` = the content region scrolls itself, for plain content. Ignored under `footerBehavior=\"scroll\"`. |\n *\n * ## Elevation (the floating look)\n * The shell owns **structure**, not skin — it drives no `floating` flag. To lift\n * a region into a rounded, shadowed card, put `foldElevated` on the element that\n * paints that region's background (a projected `fold-menu`, an `app-header`, a\n * content wrapper). It composes **per region** — float the rail while the main\n * stays flat, or float them all for an inset dashboard. The shell's only part is\n * the moat: a cell whose content is elevated **pads itself** (`:has`), revealing\n * the page-gutter around the card — padding, so a `height: 100%` region fits\n * with no overflow. `--fold-surface-inset` tunes the gutter. See\n * {@link FoldElevatedDirective}.\n *\n * ## Accessibility\n * The shell renders a **skip-link** as its first Tab stop — jumping keyboard\n * users past the rails straight to the `<main>` content (`skipLinkLabel` sets\n * its text). The `<main>` is focusable (`tabindex=\"-1\"`) so the jump lands; the\n * link moves focus directly rather than following the fragment, so it works\n * under hash routing too.\n *\n * The mobile **drawer is a real modal**, matching the panel host's bar: while\n * open it is a named `role=\"dialog\"` + `aria-modal=\"true\"` (`drawerLabel`), the\n * focus-trap moves focus in and restores it to the trigger on close, and every\n * other region (header, content, footer, second rail) is `inert` — so a\n * screen-reader's virtual cursor can't wander behind the open drawer.\n *\n * **Trigger contract (app-owned).** The shell owns the drawer/dialog; the app\n * owns the hamburger that opens it, so the shell can't set ARIA on that button —\n * it exposes what's needed and documents the wiring. For the pairing to be fully\n * announced, the hamburger should carry `[attr.aria-expanded]=\"navOpen()\"`,\n * `aria-haspopup=\"dialog\"`, and `[attr.aria-controls]=\"shell.drawerId\"` (read the\n * shell via a template ref, `#shell=\"foldAppShell\"`):\n *\n * ```html\n * <fold-app-shell #shell=\"foldAppShell\" [(mobileNavOpen)]=\"navOpen\">\n * <app-menu railPrimary />\n * <header header>\n * <button\n * class=\"hamburger\"\n * aria-haspopup=\"dialog\"\n * [attr.aria-expanded]=\"navOpen()\"\n * [attr.aria-controls]=\"shell.drawerId\"\n * (click)=\"navOpen.set(!navOpen())\"\n * >☰</button>\n * </header>\n * <router-outlet />\n * </fold-app-shell>\n * ```\n *\n * @selector `fold-app-shell`\n *\n * @example\n * ```html\n * <fold-app-shell\n * [railWidth]=\"72\"\n * headerLayout=\"full\"\n * [(mobileNavOpen)]=\"navOpen\"\n * >\n * <app-menu railPrimary foldElevated /><!-- a floating rail; drop it for flat -->\n * <app-workspace-rail railSecondary />\n * <app-header header /><!-- its hamburger toggles navOpen at ≤768px -->\n * <router-outlet />\n * <!-- panels / overlays / banners also go in the default slot -->\n * <app-player footer /><!-- optional; omit it and the footer row collapses -->\n * </fold-app-shell>\n * ```\n */\n@Component({\n selector: \"fold-app-shell\",\n standalone: true,\n exportAs: \"foldAppShell\",\n imports: [FoldSurfaceDirective, NgTemplateOutlet, FocusTrapDirective],\n host: {\n \"[style.--fold-shell-rail-width]\": \"railWidthVar()\",\n \"[style.--fold-shell-header-height]\": \"headerHeightVar()\",\n \"[style.--fold-shell-header-height-mobile]\": \"headerHeightMobileVar()\",\n \"[class.header-full]\": 'headerLayout() === \"full\"',\n \"[class.footer-full]\": 'footerLayout() === \"full\"',\n \"[class.footer-scroll]\": 'footerBehavior() === \"scroll\"',\n \"[class.mobile-drawer]\": 'mobileNav() === \"drawer\"',\n \"[class.mobile-nav-open]\": \"drawerOpen()\",\n \"[class.content-auto]\": 'contentScroll() === \"auto\"',\n },\n templateUrl: \"./app-shell.component.html\",\n styleUrl: \"./app-shell.component.scss\",\n})\nexport class FoldAppShellComponent {\n /** Base width the primary rail reads in px (the column is intrinsic — the rail\n * component sizes itself). Omit to inherit `--fold-shell-rail-width` (64). */\n readonly railWidth = input<number>();\n /** Header row height in px. Omit to inherit `--fold-shell-header-height` (56). */\n readonly headerHeight = input<number>();\n /** Header height at ≤768px in px. Omit to inherit `--fold-shell-header-height-mobile` (52). */\n readonly headerHeightMobile = input<number>();\n\n /** `\"full\"` spans the header across every column, above the rails; `\"inset\"` (default) keeps it over the content column. */\n readonly headerLayout = input<\"inset\" | \"full\">(\"inset\");\n /** `\"full\"` spans the footer across every column, below the rails (the usual player-bar look); `\"inset\"` (default) keeps it under the content column. The footer row is content-sized and collapses to `0` when the slot is empty. Ignored when `footerBehavior=\"scroll\"`. */\n readonly footerLayout = input<\"inset\" | \"full\">(\"inset\");\n /** `\"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. */\n readonly footerBehavior = input<\"pinned\" | \"scroll\">(\"pinned\");\n /**\n * Who owns the content region's scroll:\n * - `\"clip\"` (default) — the shell clips it; the page inside owns its scroll\n * (an `fold-page-layout` is its own scroll box). A full-bleed page paints to\n * the edges and never double-scrolls.\n * - `\"auto\"` — the shell's content region scrolls itself. For plain content\n * that isn't wrapped in a self-scrolling page. Ignored under\n * `footerBehavior=\"scroll\"` (which already makes the region scroll).\n */\n readonly contentScroll = input<\"clip\" | \"auto\">(\"clip\");\n\n /** The skip-link's label — the first Tab stop, jumping keyboard users past the\n * rails straight to `<main>`. Override for a non-English app. */\n readonly skipLinkLabel = input(\"Skip to content\");\n\n /** The mobile drawer's accessible name — it becomes a `role=\"dialog\"` while\n * open, so it must be named. `\"Menu\"` by default (not `\"Navigation\"`, which\n * would echo the `<nav>` landmark inside). Override for a non-English app. */\n readonly drawerLabel = input(\"Menu\");\n\n private readonly document = inject(DOCUMENT);\n\n /** SSR-safe id linking the skip-link to the `<main>` it targets. */\n protected readonly contentId =\n inject(FoldIdService).next(\"fold-shell-content\");\n\n /**\n * SSR-safe id on the mobile drawer (the primary rail). Public and reachable\n * via `exportAs=\"foldAppShell\"` so the app's hamburger can point\n * `aria-controls` at the dialog it opens — see the trigger contract in the\n * class docs.\n */\n readonly drawerId = inject(FoldIdService).next(\"fold-shell-drawer\");\n\n /**\n * How the primary rail's navigation is reached on mobile:\n * - `\"drawer\"` (default) — the built-in off-canvas drawer slides the projected\n * `[railPrimary]` in over a scrim (driven by `mobileNavOpen`).\n * - `\"none\"` — the shell renders **no** mobile nav; the rails just drop out.\n * Compose your own, typically an {@link FoldNavLauncherComponent} bound to the\n * same `mobileNavOpen`, when a curated full-screen tile grid fits better than\n * sliding the desktop rail in.\n */\n readonly mobileNav = input<\"drawer\" | \"none\">(\"drawer\");\n\n /**\n * Two-way: is the mobile nav open?\n *\n * Below the mobile breakpoint the rails drop out; instead of vanishing, the\n * **primary** rail becomes an off-canvas drawer this flag slides in. The app\n * owns the trigger — a mobile-only hamburger in its header, bound\n * `[(mobileNavOpen)]` — and typically flips it back to `false` on navigation;\n * the shell owns the mechanics (slide-in, scrim, `Escape`, focus-trap). It is\n * a no-op above the breakpoint (the rails are always in view there), and it\n * resets to `false` on the way back to a wide viewport so a widened window\n * never keeps a stuck drawer.\n */\n readonly mobileNavOpen = model(false);\n\n /** The shell's own width, kept live by a shared `ResizeObserver` primitive. */\n private readonly width = observeElementWidth();\n\n /** Whether the shell is narrow enough to collapse — tracked from its **own**\n * width, not the viewport, so the drawer engages in step with the CSS\n * collapse whether that fires on `@media` (the shell fills the viewport) or\n * `@container` (an embedded preview). `0` (unmeasured / SSR) reads as wide —\n * the SSR-safe first paint. */\n private readonly isNarrow = computed(() => {\n const w = this.width();\n return w > 0 && w <= MOBILE_BREAKPOINT;\n });\n\n /** The drawer is live only in `drawer` mode, when the shell is narrow **and**\n * open — so the focus-trap and scrim never engage over a full-width rail, nor\n * when a `none`-mode shell defers the mobile nav to a launcher. */\n protected readonly drawerOpen = computed(\n () =>\n this.mobileNav() === \"drawer\" && this.isNarrow() && this.mobileNavOpen(),\n );\n\n constructor() {\n // Widening past the breakpoint closes the drawer so it can't linger as a\n // stuck off-canvas panel once the rails are back in view.\n effect(() => {\n if (!this.isNarrow() && this.mobileNavOpen()) {\n this.mobileNavOpen.set(false);\n }\n });\n }\n\n /** `Escape` closes the drawer — the same contract as the panel host. */\n @HostListener(\"document:keydown.escape\")\n protected onEscape(): void {\n if (this.drawerOpen()) {\n this.mobileNavOpen.set(false);\n }\n }\n\n /** Dismiss the drawer — the scrim's click target. */\n protected closeMobileNav(): void {\n this.mobileNavOpen.set(false);\n }\n\n /**\n * Skip-link activation. Moves focus to `<main>` directly instead of letting\n * the browser follow the `#id` fragment — a hash-routing app (`withHashLocation`)\n * would treat that fragment as a route change. `preventDefault` keeps the URL\n * clean; the anchor keeps its `href` for link semantics and no-JS fallback.\n */\n protected skipToContent(event: Event): void {\n event.preventDefault();\n this.document.getElementById(this.contentId)?.focus();\n }\n\n /* Map each input to its CSS var — `null` when unset so the stylesheet\n variable (or its fallback default) keeps winning; a set input overrides it. */\n protected readonly railWidthVar = computed(() => pxVar(this.railWidth()));\n protected readonly headerHeightVar = computed(() =>\n pxVar(this.headerHeight()),\n );\n protected readonly headerHeightMobileVar = computed(() =>\n pxVar(this.headerHeightMobile()),\n );\n}\n\n/** A px length for a host CSS-var binding, or `null` to leave the var unset. */\nfunction pxVar(value: number | undefined): string | null {\n return value === undefined ? null : `${value}px`;\n}\n","<!-- Skip-link: the first Tab stop — visually hidden until focused, then jumps\n keyboard users past the rails to <main> (which is focusable, tabindex=-1). -->\n<a class=\"skip-link\" [href]=\"'#' + contentId\" (click)=\"skipToContent($event)\">{{\n skipLinkLabel()\n}}</a>\n\n<!-- The primary rail. While the mobile drawer is open it is a real modal dialog\n (named, aria-modal, focus-trapped) and every sibling region is inert — the\n same bar the panel host holds; on desktop it's a plain nav rail. -->\n<div\n class=\"rail-primary\"\n [id]=\"drawerId\"\n foldSurface=\"chrome\"\n [foldFocusTrap]=\"drawerOpen()\"\n [attr.role]=\"drawerOpen() ? 'dialog' : null\"\n [attr.aria-modal]=\"drawerOpen() ? 'true' : null\"\n [attr.aria-label]=\"drawerOpen() ? drawerLabel() : null\"\n tabindex=\"-1\"\n>\n <ng-content select=\"[railPrimary]\" />\n</div>\n<div\n class=\"rail-secondary\"\n foldSurface=\"chrome\"\n [attr.inert]=\"drawerOpen() ? '' : null\"\n>\n <ng-content select=\"[railSecondary]\" />\n</div>\n\n<!-- Mobile drawer scrim — only rendered while the drawer is actually open (the\n shell is narrow AND mobileNavOpen). A darkening veil that dismisses on\n click; Escape and widening close it too. aria-hidden: the focus-trapped\n drawer + Escape are the accessible path, the scrim is a mouse convenience. -->\n@if (drawerOpen()) {\n <div class=\"mobile-scrim\" (click)=\"closeMobileNav()\" aria-hidden=\"true\"></div>\n}\n<header\n class=\"header\"\n foldSurface=\"chrome\"\n [attr.inert]=\"drawerOpen() ? '' : null\"\n>\n <ng-content select=\"[header]\" />\n</header>\n\n<!-- One footer, stamped in one of two positions — a grid row (pinned, always in\n sight) or inside the content scroll (revealed on the way down). A single\n <ng-content> in a template avoids duplicate-selector projection loss. -->\n<ng-template #footerTpl>\n <footer\n class=\"footer\"\n [class.footer-inflow]=\"footerBehavior() === 'scroll'\"\n foldSurface=\"chrome\"\n [attr.inert]=\"drawerOpen() ? '' : null\"\n >\n <ng-content select=\"[footer]\" />\n </footer>\n</ng-template>\n\n<main\n class=\"content\"\n foldSurface=\"page\"\n [id]=\"contentId\"\n tabindex=\"-1\"\n [attr.inert]=\"drawerOpen() ? '' : null\"\n>\n <ng-content />\n @if (footerBehavior() === \"scroll\") {\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n }\n</main>\n@if (footerBehavior() !== \"scroll\") {\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n}\n","/**\n * Categorical auto-colour palettes + the seed→index hash.\n *\n * These are **data**, not semantic tokens: qualitative hues to tell entities\n * apart (avatars, org nodes…), theme-invariant, never a role. They live in TS\n * because a hash consumes them — they don't belong in the token CSS.\n *\n * The active palette is chosen once, app-wide, via {@link FoldPaletteRegistry} so a\n * given seed maps to the SAME colour everywhere (recognition). Consumers never\n * touch these arrays directly — they call `registry.colorFor(seed)`.\n */\n\n/**\n * The seed→hash used to pick a palette index. Kept byte-identical to the app's\n * historical avatar/org-member hash so migrating changes no existing colour.\n */\nexport function foldHashSeed(seed: string): number {\n let hash = 0;\n for (let i = 0; i < seed.length; i += 1) {\n hash = seed.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hash;\n}\n\n/** 10 vivid hues — the default. */\nconst VIVID = [\n \"#63b3ed\",\n \"#68d391\",\n \"#f6ad55\",\n \"#fc8181\",\n \"#b794f4\",\n \"#76e4f7\",\n \"#fbb6ce\",\n \"#f6e05e\",\n \"#4fd1c5\",\n \"#a3bffa\",\n] as const;\n\n/** 10 more, appended after VIVID to form the 20-colour `extended` palette. */\nconst VIVID_EXTRA = [\n \"#f687b3\",\n \"#9ae6b4\",\n \"#fbd38d\",\n \"#feb2b2\",\n \"#d6bcfa\",\n \"#81e6d9\",\n \"#e9d8fd\",\n \"#fefcbf\",\n \"#bee3f8\",\n \"#c6f6d5\",\n] as const;\n\n/** 10 soft, low-saturation hues (same hue order as VIVID). */\nconst PASTEL = [\n \"#a8d8ea\",\n \"#b5ead7\",\n \"#ffdac1\",\n \"#ffb7b2\",\n \"#c7b6e8\",\n \"#b2ebf2\",\n \"#ffc8dd\",\n \"#fdf6a8\",\n \"#a0e7e5\",\n \"#c5cae9\",\n] as const;\n\n/**\n * The curated named palettes. Add an entry → it becomes a usable, typed\n * {@link FoldAutoPaletteName} everywhere. `extended` deliberately starts with the\n * full `vivid` set so switching between them never recolours the first 10.\n */\nexport const FOLD_AUTO_PALETTES = {\n vivid: VIVID,\n extended: [...VIVID, ...VIVID_EXTRA],\n pastel: PASTEL,\n} as const satisfies Record<string, readonly string[]>;\n\n/** A built-in palette name. */\nexport type FoldAutoPaletteName = keyof typeof FOLD_AUTO_PALETTES;\n\n/** A palette to apply: a built-in name, or a consumer's own colour list. */\nexport type FoldPaletteInput = FoldAutoPaletteName | readonly string[];\n\n/** Resolve a name or a raw list to a colour array (empty lists fall back to vivid). */\nexport function foldResolvePalette(input: FoldPaletteInput): readonly string[] {\n const palette = typeof input === \"string\" ? FOLD_AUTO_PALETTES[input] : input;\n return palette.length > 0 ? palette : FOLD_AUTO_PALETTES.vivid;\n}\n","import {\n InjectionToken,\n type Provider,\n Service,\n inject,\n signal,\n} from \"@angular/core\";\nimport {\n foldHashSeed,\n foldResolvePalette,\n type FoldPaletteInput,\n} from \"./palettes\";\n\n/** Bootstrap default for {@link FoldPaletteRegistry} — set via {@link provideFoldPalette}. */\nexport const FOLD_PALETTE_DEFAULT = new InjectionToken<FoldPaletteInput>(\n \"fold.palette.default\",\n);\n\n/**\n * Configure the app-wide auto-colour palette at bootstrap (idiomatic, like\n * `provideRouter`). Accepts a built-in name OR a consumer's own colour list.\n *\n * ```ts\n * // app.config.ts\n * providers: [provideFoldPalette(\"pastel\")] // a built-in\n * providers: [provideFoldPalette(MY_BRAND_COLORS)] // your own list\n * ```\n */\nexport function provideFoldPalette(palette: FoldPaletteInput): Provider {\n return { provide: FOLD_PALETTE_DEFAULT, useValue: palette };\n}\n\n/**\n * The single source of truth for auto-colouring. Root singleton: every consumer\n * reads the SAME active palette, so a given seed (name/id) maps to the same\n * colour everywhere — that is the whole point (recognition). Switch the palette\n * app-wide with {@link use}; each `colorFor` reader recolours reactively.\n */\n@Service()\nexport class FoldPaletteRegistry {\n private readonly _current = signal<readonly string[]>(\n foldResolvePalette(\n inject(FOLD_PALETTE_DEFAULT, { optional: true }) ?? \"vivid\",\n ),\n );\n\n /** The active palette. Reading this in a reactive context tracks switches. */\n readonly current = this._current.asReadonly();\n\n /**\n * Switch the whole app's palette — a built-in name or a custom colour list.\n * Every `colorFor` reader updates in the same frame.\n */\n use(palette: FoldPaletteInput): void {\n this._current.set(foldResolvePalette(palette));\n }\n\n /** Deterministic colour for a seed, from the active palette. Reactive. */\n colorFor(seed: string): string {\n const palette = this._current();\n const idx = Math.abs(foldHashSeed(seed)) % palette.length;\n // `_current` always holds a non-empty palette (foldResolvePalette falls back\n // to `vivid`), so the modulo index resolves; the fallbacks are for the type.\n return palette[idx] ?? palette[0] ?? \"transparent\";\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n} from \"@angular/core\";\nimport { FoldPaletteRegistry } from \"../../../color/palette-registry.service\";\n\n/** Ink for text on a light vs dark categorical fill. */\nconst DARK_INK = \"#1a202c\";\nconst LIGHT_INK = \"#ffffff\";\n\n/**\n * Pick a readable ink for text drawn on `fill`, from its relative luminance —\n * so a custom (dark) palette supplied via `provideFoldPalette` still gets legible\n * initials instead of the fixed dark ink. Non-hex fills fall back to dark ink.\n */\nfunction readableInk(fill: string): string {\n const hex = fill.trim().replace(/^#/, \"\");\n const full =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) {\n return DARK_INK;\n }\n const channel = (i: number): number => {\n const c = parseInt(full.slice(i, i + 2), 16) / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n const luminance =\n 0.2126 * channel(0) + 0.7152 * channel(2) + 0.0722 * channel(4);\n return luminance > 0.4 ? DARK_INK : LIGHT_INK;\n}\n\n/** Fill style — `ghost` dashes the outline (guests). */\nexport type FoldAvatarVariant = \"solid\" | \"ghost\";\n/** Status-ring colour — reuses the `fold-badge` status vocabulary. */\nexport type FoldAvatarRing =\n \"none\" | \"accent\" | \"info\" | \"warning\" | \"alert\" | \"success\";\n/** Status-ring line style — `dotted` reads as scheduled / tentative. */\nexport type FoldAvatarRingStyle = \"solid\" | \"dotted\";\n\n/**\n * `<fold-avatar>` — a user/entity avatar with initials or an image.\n *\n * With `imageUrl` it shows the image; otherwise it shows initials on a\n * deterministic background colour taken from the app-wide {@link FoldPaletteRegistry}\n * (so the same seed is the same colour everywhere, and one `registry.use(...)`\n * recolours every avatar).\n *\n * Three orthogonal state axes compose: `variant` (fill), `muted` (presence —\n * dim for an absence/inactive person), and `ring` + `ringStyle` (a status\n * outline). The component stays domain-agnostic: a screen maps its own states\n * (e.g. absent → `[muted]`, a scheduled arrival → `ring=\"accent\"`\n * `ringStyle=\"dotted\"`), the avatar just draws the primitives.\n *\n * ## Inputs\n *\n * | Input | Type | Default | Description |\n * |-------------|------------------------|-----------|-------------------------------------------------|\n * | `name` | `string` (required) | — | Full name — initials are derived automatically. |\n * | `size` | `'sm' \\| 'md' \\| 'lg'` | `'md'` | Avatar size (20px / 32px / 44px). |\n * | `colorSeed` | `string` | `name` | String used to pick the deterministic colour. |\n * | `variant` | `'solid' \\| 'ghost'` | `'solid'` | `'ghost'` renders a dashed border (for guests). |\n * | `square` | `boolean` | `false` | Square shape with a small radius (for orgs). |\n * | `imageUrl` | `string` | — | Image/logo URL. Replaces initials when set. |\n * | `muted` | `boolean` | `false` | Dim the avatar (same hue, less intense) — absence / inactive. |\n * | `ring` | `FoldAvatarRing` | `'none'` | A status outline (`accent`/`info`/`warning`/`alert`/`success`). |\n * | `ringStyle` | `'solid' \\| 'dotted'` | `'solid'` | Ring line style — `dotted` for scheduled/tentative states. |\n *\n * @selector `fold-avatar`\n */\n@Component({\n selector: \"fold-avatar\",\n standalone: true,\n templateUrl: \"./avatar.component.html\",\n styleUrl: \"./avatar.component.scss\",\n})\nexport class FoldAvatarComponent {\n private readonly palette = inject(FoldPaletteRegistry);\n\n readonly name = input.required<string>();\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n readonly colorSeed = input<string | undefined>(undefined);\n readonly variant = input<FoldAvatarVariant>(\"solid\");\n readonly square = input(false, { transform: booleanAttribute });\n readonly imageUrl = input<string | undefined>(undefined);\n /** Dim the avatar (same hue, less intense) — for an absent / inactive person. */\n readonly muted = input(false, { transform: booleanAttribute });\n /** A status outline; `'none'` draws nothing. */\n readonly ring = input<FoldAvatarRing>(\"none\");\n /** Ring line style — `'dotted'` for scheduled / tentative states. */\n readonly ringStyle = input<FoldAvatarRingStyle>(\"solid\");\n\n /** Readable ink for the initials, derived from the fill's luminance. */\n protected readonly onColor = computed(() => readableInk(this.color()));\n\n readonly initials = computed(() => {\n const n = this.name().trim();\n if (!n) {\n return \"?\";\n }\n const [first = \"\", second = \"\"] = n.split(/\\s+/);\n if (second) {\n return (first.charAt(0) + second.charAt(0)).toUpperCase();\n }\n return n.substring(0, 2).toUpperCase();\n });\n\n /** Deterministic fill from the active palette (via the shared registry). */\n readonly color = computed(() =>\n this.palette.colorFor(this.colorSeed() ?? this.name()),\n );\n}\n","@if (imageUrl()) {\n <div\n class=\"avatar has-image\"\n [class.size-sm]=\"size() === 'sm'\"\n [class.size-md]=\"size() === 'md'\"\n [class.size-lg]=\"size() === 'lg'\"\n [class.shape-square]=\"square()\"\n [class.is-muted]=\"muted()\"\n [attr.data-ring]=\"ring() === 'none' ? null : ring()\"\n [attr.data-ring-style]=\"ringStyle()\"\n [attr.title]=\"name()\"\n >\n <img [src]=\"imageUrl()\" [alt]=\"name()\" class=\"avatar-img\" />\n </div>\n} @else {\n <div\n class=\"avatar\"\n [class.size-sm]=\"size() === 'sm'\"\n [class.size-md]=\"size() === 'md'\"\n [class.size-lg]=\"size() === 'lg'\"\n [class.variant-ghost]=\"variant() === 'ghost'\"\n [class.shape-square]=\"square()\"\n [class.is-muted]=\"muted()\"\n [attr.data-ring]=\"ring() === 'none' ? null : ring()\"\n [attr.data-ring-style]=\"ringStyle()\"\n [style.background]=\"variant() === 'solid' ? color() : ''\"\n [style.color]=\"variant() === 'solid' ? onColor() : ''\"\n [attr.title]=\"name()\"\n >\n {{ initials() }}\n </div>\n}\n","import { booleanAttribute, Component, computed, input } from \"@angular/core\";\nimport {\n FoldAvatarComponent,\n type FoldAvatarRing,\n type FoldAvatarRingStyle,\n} from \"../../content/avatar/avatar.component\";\n\n/**\n * `<fold-avatar-detail>` — an avatar next to one or two lines of text: the\n * canonical \"identity cell\". A bold `primary` line and an optional faded\n * `secondary` line (name + email, entity + subtitle, …). One line centres\n * against the avatar; two lines stack and centre as a block.\n *\n * The avatar's initials/colour derive from `avatarName` when set, else from\n * `primary` — so the common \"same text\" case needs no extra input.\n *\n * ## Inputs\n *\n * | Input | Type | Default | Description |\n * |--------------|------------------------|-----------|----------------------------------------------|\n * | `primary` | `string` (required) | — | Bold first line; default avatar name. |\n * | `secondary` | `string` | `''` | Faded second line; empty → single line. |\n * | `avatarName` | `string` | `primary` | Overrides the name used for initials/colour. |\n * | `size` | `'sm' \\| 'md' \\| 'lg'` | `'md'` | Avatar size. |\n * | `variant` | `'solid' \\| 'ghost'` | `'solid'` | `'ghost'` dashes the avatar (guests). |\n * | `square` | `boolean` | `false` | Square avatar (orgs). |\n * | `imageUrl` | `string` | — | Avatar image; replaces initials when set. |\n * | `muted` | `boolean` | `false` | Dim the avatar (absence / inactive). |\n * | `ring` | `FoldAvatarRing` | `'none'` | Status outline on the avatar. |\n * | `ringStyle` | `'solid' \\| 'dotted'` | `'solid'` | Ring line style (`dotted` = scheduled). |\n *\n * @selector `fold-avatar-detail`\n */\n@Component({\n selector: \"fold-avatar-detail\",\n standalone: true,\n imports: [FoldAvatarComponent],\n templateUrl: \"./avatar-detail.component.html\",\n styleUrl: \"./avatar-detail.component.scss\",\n})\nexport class FoldAvatarDetailComponent {\n readonly primary = input.required<string>();\n readonly secondary = input<string>(\"\");\n readonly avatarName = input<string>(\"\");\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n readonly variant = input<\"solid\" | \"ghost\">(\"solid\");\n readonly square = input(false, { transform: booleanAttribute });\n readonly imageUrl = input<string | undefined>(undefined);\n /** Dim the avatar — absence / inactive (forwarded to `fold-avatar`). */\n readonly muted = input(false, { transform: booleanAttribute });\n /** Status outline colour (forwarded to `fold-avatar`). */\n readonly ring = input<FoldAvatarRing>(\"none\");\n /** Ring line style (forwarded to `fold-avatar`). */\n readonly ringStyle = input<FoldAvatarRingStyle>(\"solid\");\n\n /** Falls back to the primary line when no explicit avatar name is given. */\n readonly resolvedAvatarName = computed(\n () => this.avatarName().trim() || this.primary(),\n );\n\n readonly hasSecondary = computed(() => this.secondary().trim().length > 0);\n}\n","<fold-avatar\n [name]=\"resolvedAvatarName()\"\n [size]=\"size()\"\n [variant]=\"variant()\"\n [square]=\"square()\"\n [imageUrl]=\"imageUrl()\"\n [muted]=\"muted()\"\n [ring]=\"ring()\"\n [ringStyle]=\"ringStyle()\"\n/>\n<span class=\"lines\">\n <span class=\"primary\">{{ primary() }}</span>\n @if (hasSecondary()) {\n <span class=\"secondary\">{{ secondary() }}</span>\n }\n</span>\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n numberAttribute,\n} from \"@angular/core\";\nimport {\n FoldAvatarComponent,\n type FoldAvatarVariant,\n type FoldAvatarRing,\n type FoldAvatarRingStyle,\n} from \"../../content/avatar/avatar.component\";\n\n/** One face in an {@link FoldAvatarListComponent} — the minimum an avatar needs,\n * plus optional per-face identity/state. `variant` lives here (not on the list)\n * because a single member can be a guest among members. */\nexport interface FoldAvatarListItem {\n /** Full name — initials + deterministic colour derive from it. */\n readonly name: string;\n /** Image/logo URL. Replaces the initials when set. */\n readonly imageUrl?: string;\n /** Overrides the string used to pick the deterministic colour (else `name`). */\n readonly colorSeed?: string;\n /** Fill style — `ghost` for a guest among members. */\n readonly variant?: FoldAvatarVariant;\n /** Dim this face — absence / inactive. */\n readonly muted?: boolean;\n /** A status outline on this face. */\n readonly ring?: FoldAvatarRing;\n /** Ring line style for this face (`dotted` = scheduled / tentative). */\n readonly ringStyle?: FoldAvatarRingStyle;\n}\n\n/**\n * `<fold-avatar-list>` — a row of slightly-overlapping avatars (the org-chart\n * \"who sits on this node\" cluster). Past `limit`, the remainder collapses into a\n * trailing `+N` chip (N = total − shown).\n *\n * Each face wears a ring in the surface colour so the overlap reads cleanly;\n * override `--fold-avatar-list-ring` when the list sits on a non-card surface.\n *\n * ## Inputs\n *\n * | Input | Type | Default | Description |\n * |-----------|-------------------------|-----------|----------------------------------------------------------|\n * | `avatars` | `FoldAvatarListItem[]` (required) | — | The faces, in order. |\n * | `limit` | `number` | `0` | Max faces on the line (`0` = all). Extra → a `+N` chip. |\n * | `top` | `'first' \\| 'last'` | `'first'` | Which end stacks on top — the overlap direction. |\n * | `size` | `'sm' \\| 'md' \\| 'lg'` | `'md'` | Avatar size (shared by every face + the chip). |\n * | `square` | `boolean` | `false` | Square faces (orgs) — uniform across the cluster. |\n *\n * Per-face traits (`variant`/`muted`/`ring`/`ringStyle`) live on each\n * `FoldAvatarListItem`, since they vary member-by-member (a guest among members,\n * one person absent, another arriving).\n *\n * @selector `fold-avatar-list`\n *\n * @example\n * ```html\n * <fold-avatar-list [avatars]=\"occupants\" [limit]=\"4\" top=\"first\" />\n * ```\n */\n@Component({\n selector: \"fold-avatar-list\",\n standalone: true,\n imports: [FoldAvatarComponent],\n host: {\n \"[class.size-sm]\": \"size() === 'sm'\",\n \"[class.size-md]\": \"size() === 'md'\",\n \"[class.size-lg]\": \"size() === 'lg'\",\n \"[class.is-square]\": \"square()\",\n },\n templateUrl: \"./avatar-list.component.html\",\n styleUrl: \"./avatar-list.component.scss\",\n})\nexport class FoldAvatarListComponent {\n readonly avatars = input.required<readonly FoldAvatarListItem[]>();\n /** Max faces shown; `0` shows them all. Past it, a `+N` chip closes the row. */\n readonly limit = input(0, { transform: numberAttribute });\n /** `'first'` = the leading face sits on top; `'last'` = the trailing one does. */\n readonly top = input<\"first\" | \"last\">(\"first\");\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n readonly square = input(false, { transform: booleanAttribute });\n\n /** The faces actually rendered (capped at `limit` when it bites). */\n readonly visible = computed(() => {\n const limit = this.limit();\n const all = this.avatars();\n return limit > 0 && all.length > limit ? all.slice(0, limit) : all;\n });\n\n /** How many faces the `+N` chip stands in for (`0` → no chip). */\n readonly overflow = computed(\n () => this.avatars().length - this.visible().length,\n );\n\n /** Paint order: the \"top\" end gets the highest z-index. */\n protected z(index: number): number {\n const count = this.visible().length;\n return this.top() === \"first\" ? count - index : index + 1;\n }\n}\n","@for (a of visible(); track $index) {\n <span class=\"al-item\" [style.z-index]=\"z($index)\">\n <fold-avatar\n [name]=\"a.name\"\n [imageUrl]=\"a.imageUrl\"\n [colorSeed]=\"a.colorSeed\"\n [size]=\"size()\"\n [square]=\"square()\"\n [variant]=\"a.variant ?? 'solid'\"\n [muted]=\"a.muted ?? false\"\n [ring]=\"a.ring ?? 'none'\"\n [ringStyle]=\"a.ringStyle ?? 'solid'\"\n />\n </span>\n}\n@if (overflow() > 0) {\n <span class=\"al-more\" [attr.title]=\"overflow() + ' more'\"\n >+{{ overflow() }}</span\n >\n}\n","import { Component, input } from \"@angular/core\";\n\n/**\n * Semantic colour variants for {@link FoldBadgeComponent}, mapped to design\n * tokens. Shared so other components (e.g. `fold-menu-item`'s badge) can tint a\n * badge from the same vocabulary.\n * - `accent` — teal, general purpose\n * - `info` — purple, informative / categorical\n * - `warning` — amber, attention needed\n * - `alert` — red, critical / error\n * - `success` — green, positive / complete\n */\nexport type FoldBadgeVariant =\n \"neutral\" | \"accent\" | \"info\" | \"warning\" | \"alert\" | \"success\";\n\n/**\n * Badge / tag for labels, statuses, and categories.\n *\n * @selector `fold-badge`\n *\n * @example\n * ```html\n * <fold-badge content=\"In repertoire\" />\n * <fold-badge content=\"Jazz\" radius=\"square\" variant=\"info\" />\n * <fold-badge content=\"Pending\" variant=\"warning\" />\n * ```\n */\n@Component({\n selector: \"fold-badge\",\n standalone: true,\n templateUrl: \"./badge.component.html\",\n // Inline so the component is fully self-contained — no external asset to\n // resolve or ship. Colours/sizes come entirely from fold-ng tokens.\n styleUrl: \"./badge.component.scss\",\n host: {\n \"[class]\": 'variant() + \" \" + radius()',\n },\n})\nexport class FoldBadgeComponent {\n /** Text displayed inside the badge. */\n readonly content = input.required<string>();\n\n /**\n * Border-radius preset.\n * - `pill` — fully rounded (default)\n * - `square` — small radius (like genre tags)\n */\n readonly radius = input<\"pill\" | \"square\">(\"pill\");\n\n /**\n * Semantic colour variant, mapped to design tokens.\n * - `neutral` — dim + unsaturated, for counts and non-semantic tags\n * - `accent` (default) — teal, general purpose\n * - `info` — purple, informative / categorical\n * - `warning` — amber, attention needed\n * - `alert` — red, critical / error\n * - `success` — green, positive / complete\n */\n readonly variant = input<FoldBadgeVariant>(\"accent\");\n}\n","{{ content() }}\n","// The UI icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const UI_ICONS = {\n \"add-doc\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m21.414 5h-4.414v-4.414zm.586 2v17h-20v-21a3 3 0 0 1 3-3h10v7zm-6 7h-3v-3h-2v3h-3v2h3v3h2v-3h3z\"/></svg>',\n \"arrow-back\":\n '<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 12H5M12 19l-7-7 7-7\"/></svg>',\n \"arrow-right\":\n '<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 12h14M12 5l7 7-7 7\"/></svg>',\n bin: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22,4H17V2a2,2,0,0,0-2-2H9A2,2,0,0,0,7,2V4H2V6H4V21a3,3,0,0,0,3,3H17a3,3,0,0,0,3-3V6h2ZM9,2h6V4H9Zm9,19a1,1,0,0,1-1,1H7a1,1,0,0,1-1-1V6H18Z\"/><rect x=\"9\" y=\"10\" width=\"2\" height=\"8\"/><rect x=\"13\" y=\"10\" width=\"2\" height=\"8\"/></svg>',\n calendar:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3.25\" y=\"4.75\" width=\"17.5\" height=\"16\" rx=\"2.25\"/><path d=\"M3.25 9.5h17.5\"/><path d=\"M8 3.25v3\"/><path d=\"M16 3.25v3\"/><path d=\"M7.5 13.25h2\"/><path d=\"M11 13.25h2\"/><path d=\"M14.5 13.25h2\"/><path d=\"M7.5 16.75h2\"/><path d=\"M11 16.75h2\"/></svg>',\n chat: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"/></svg>',\n \"check-circle\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" fill=\"none\"><circle cx=\"24\" cy=\"24\" r=\"24\" fill=\"currentColor\" opacity=\"0.12\"/><path d=\"M16 24l6 6 10-12\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n check:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>',\n \"chevron-down\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M5,9H19l-6.293,6.293a1,1,0,0,1-1.414,0Z\"/></svg>',\n \"chevron-left\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>',\n \"chevron-right\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"/></svg>',\n \"chevron-up\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19,15.293H5L11.293,9a1,1,0,0,1,1.414,0Z\"/></svg>',\n close:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>',\n 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\"><path d=\"M16 18l6-6-6-6M8 6l-6 6 6 6\"/></svg>',\n \"collapse-all\":\n '<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=\"M17 11l-5-5-5 5M17 18l-5-5-5 5\"/></svg>',\n copy: '<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=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>',\n door: '<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 21V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16\"/><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/><circle cx=\"14.5\" cy=\"12.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/></svg>',\n download:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.878,18.122a3,3,0,0,0,4.244,0l3.211-3.211A1,1,0,0,0,15.919,13.5l-2.926,2.927L13,1a1,1,0,0,0-1-1h0a1,1,0,0,0-1,1l-.009,15.408L8.081,13.5a1,1,0,0,0-1.414,1.415Z\"/><path d=\"M23,16h0a1,1,0,0,0-1,1v4a1,1,0,0,1-1,1H3a1,1,0,0,1-1-1V17a1,1,0,0,0-1-1H1a1,1,0,0,0-1,1v4a3,3,0,0,0,3,3H21a3,3,0,0,0,3-3V17A1,1,0,0,0,23,16Z\"/></svg>',\n edit: '<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=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 1 1 3 3L7 19l-4 1 1-4z\"/></svg>',\n \"expand-all\":\n '<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=\"M7 13l5 5 5-5M7 6l5 5 5-5\"/></svg>',\n \"eye-off\":\n '<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=\"M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 11-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/></svg>',\n eye: '<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=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>',\n \"file-add\":\n '<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 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\"/><line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\"/></svg>',\n \"folder-open\":\n '<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 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"/></svg>',\n folder:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M21,3H12.236l-4-2H3A3,3,0,0,0,0,4V23H24V6A3,3,0,0,0,21,3ZM3,3H7.764l4,2H21a1,1,0,0,1,1,1v.881L2,6.994V4A1,1,0,0,1,3,3ZM2,21V8.994l20-.113V21Z\"/></svg>',\n globe:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 3C6.5 3 2 9 2 12s4.5 9 10 9 10-6 10-9-4.5-9-10-9z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>',\n grid: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/></svg>',\n list: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M3 6h18M3 10h18M3 14h18M3 18h18\"/></svg>',\n lock: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/></svg>',\n mail: '<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=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"m3 7 9 6 9-6\"/></svg>',\n menu: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 7h16a1 1 0 0 0 0-2H4a1 1 0 0 0 0 2zm16 4H4a1 1 0 0 0 0 2h16a1 1 0 0 0 0-2zm0 6H4a1 1 0 0 0 0 2h16a1 1 0 0 0 0-2z\"/></svg>',\n \"more-vertical\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><circle cx=\"12\" cy=\"5\" r=\"1.8\"/><circle cx=\"12\" cy=\"12\" r=\"1.8\"/><circle cx=\"12\" cy=\"19\" r=\"1.8\"/></svg>',\n palette:\n '<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=\"M12 2a10 10 0 1 0 3 19.5c-.5-.5-.7-1.3-.5-2 .3-1 1.3-1.5 2.3-1.5H19a3 3 0 0 0 3-3c0-6.6-4.5-13-10-13z\"/><circle cx=\"7.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10.5\" cy=\"7.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"13.5\" cy=\"7.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"16.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/></svg>',\n \"playlist-add\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 10H3v2h11v-2zm0-4H3v2h11V6zM3 16h7v-2H3v2zm12 0h2v-3h3v-2h-3v-3h-2v3h-3v2h3v3z\"/></svg>',\n plus: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>',\n minus:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M5 12h14\"/></svg>',\n redo: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.5 7.5h-10a6 6 0 0 0 0 12H17\"/><path d=\"M16.5 3.5l4 4-4 4\"/></svg>',\n reload:\n '<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=\"M1 4v6h6\"/><path d=\"M3.51 15a9 9 0 102.13-9.36L1 10\"/></svg>',\n reset:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>',\n save: '<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 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"/><polyline points=\"17 21 17 13 7 13 7 21\"/><polyline points=\"7 3 7 8 15 8\"/></svg>',\n search:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"></line></svg>',\n sliders:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"/><line x1=\"11\" y1=\"18\" x2=\"13\" y2=\"18\"/></svg>',\n undo: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3.5 7.5h10a6 6 0 0 1 0 12H7\"/><path d=\"M7.5 3.5 3.5 7.5l4 4\"/></svg>',\n ungroup:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 9l-6-6-6 6\"/><path d=\"M12 3v18\"/><path d=\"M3 21h18\"/></svg>',\n upload:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22,16v5a1,1,0,0,1-1,1H3a1,1,0,0,1-1-1V16H0v5a3,3,0,0,0,3,3H21a3,3,0,0,0,3-3V16Z\"/><path d=\"M11.967,0A2.993,2.993,0,0,0,9.845.874L5.926,4.793,7.34,6.207l3.634-3.633L11,19l2,0L12.974,2.588l3.619,3.619,1.414-1.414L14.088.874A2.991,2.991,0,0,0,11.967,0Z\"/></svg>',\n 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>',\n wrench:\n '<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>',\n} as const;\n","// The Navigation icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const NAV_ICONS = {\n absence:\n '<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>',\n 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>',\n company:\n '<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>',\n contracts:\n '<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=\"2.5\" y=\"2.5\" width=\"12\" height=\"17\" rx=\"2\"/><path d=\"M5.5 6.5h3M5.5 9.5h5.5M5.5 12.5h5.5\"/><path d=\"M5.5 15.8l1.6 1.6 3-3.4\"/><path d=\"M12 20.5 14.59 19.16 21.28 8.29 18.72 6.71 12.03 17.58Z\"/><path d=\"M12.03 17.58 14.59 19.16M17.94 7.99 20.49 9.56\"/></svg>',\n help: '<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=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>',\n home: '<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=\"M3 11l9-8 9 8v10a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1z\"/></svg>',\n logout:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M24,1.5V22.5c0,.83-.67,1.5-1.5,1.5s-1.5-.67-1.5-1.5V1.5c0-.83,.67-1.5,1.5-1.5s1.5,.67,1.5,1.5Zm-6.5,9H4.25l3.33-3.46c.57-.6,.56-1.55-.04-2.12-.6-.58-1.55-.56-2.12,.04L1.03,9.52c-.66,.66-1.03,1.54-1.03,2.48s.36,1.81,1.01,2.45l4.41,4.59c.29,.31,.69,.46,1.08,.46s.75-.14,1.04-.42c.6-.57,.62-1.52,.04-2.12l-3.33-3.46h13.25c.83,0,1.5-.67,1.5-1.5s-.67-1.5-1.5-1.5Z\"/></svg>',\n music:\n '<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 17V5l10-2v12\"/><circle cx=\"7\" cy=\"17\" r=\"2.5\"/><circle cx=\"17\" cy=\"15\" r=\"2.5\"/></svg>',\n \"org-chart\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22 11V3h-7v3H9V3H2v8h7V8h2v10h4v3h7v-8h-7v3h-2V8h2v3h7zM7 9H4V5h3v4zm10 6h3v4h-3v-4zm0-10v4h3V5h-3z\"/></svg>',\n planning:\n '<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.25\" y=\"5\" width=\"17.5\" height=\"15.5\" rx=\"2.25\"/><path d=\"M3.25 9h17.5\"/><path d=\"M7.5 5V3.2M12 5V3.2M16.5 5V3.2\"/><circle cx=\"7.5\" cy=\"2.5\" r=\"1.1\"/><circle cx=\"12\" cy=\"2.5\" r=\"1.1\"/><circle cx=\"16.5\" cy=\"2.5\" r=\"1.1\"/><path d=\"M7.9 11.05 10.6 13.75M10.6 11.05 7.9 13.75\"/><rect x=\"13.15\" y=\"10.8\" width=\"3.2\" height=\"3.2\" rx=\"0.6\"/><rect x=\"7.65\" y=\"15.4\" width=\"3.2\" height=\"3.2\" rx=\"0.6\"/><path d=\"M13.4 15.65 16.1 18.35M16.1 15.65 13.4 18.35\"/></svg>',\n program:\n '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m20 0h-16c-2.206 0-4 1.794-4 4v16c0 2.206 1.794 4 4 4h16c2.206 0 4-1.794 4-4v-16c0-2.206-1.794-4-4-4zm-3 6v5h-5v-5zm6 0v5h-5v-5zm-12 5h-5v-5h5zm-5 1h5v5h-5zm0 6h5v5h-5zm6 0h5v5h-5zm0-1v-5h5v5zm6-5h5v5h-5zm5-8v1h-17v-4h14c1.654 0 3 1.346 3 3zm-19-3h1v4h-4v-1c0-1.654 1.346-3 3-3zm-3 19v-14h4v17h-1c-1.654 0-3-1.346-3-3zm19 3h-2v-5h5v2c0 1.654-1.346 3-3 3zm-13.392-14.814c.189-.202.507-.21.707-.021l.853.804c.038.038.084.037.112.01l1.381-1.332c.199-.192.516-.186.707.013.192.199.186.516-.013.707l-1.375 1.325c-.205.205-.477.308-.749.308-.274 0-.55-.104-.76-.314l-.842-.794c-.201-.189-.21-.506-.021-.707zm15.759 11.475c.192.199.186.516-.013.707l-1.375 1.325c-.205.205-.477.308-.749.308-.274 0-.55-.104-.76-.314l-.842-.794c-.201-.189-.21-.506-.021-.707s.507-.21.707-.021l.853.804c.039.037.083.038.112.01l1.381-1.332c.2-.191.516-.185.707.013zm-6.013-5.293-1.375 1.325c-.205.205-.477.308-.749.308-.274 0-.55-.104-.76-.314l-.842-.794c-.201-.189-.21-.506-.021-.707.188-.201.506-.211.707-.021l.853.804c.039.038.083.037.112.01l1.381-1.332c.199-.191.516-.186.707.013.192.199.186.516-.013.707z\"/></svg>',\n settings:\n '<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\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.6 1.6 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.6 1.6 0 0 0-1.8-.3 1.6 1.6 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.6 1.6 0 0 0-1-1.5 1.6 1.6 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.6 1.6 0 0 0 .3-1.8 1.6 1.6 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1A1.6 1.6 0 0 0 4.6 9a1.6 1.6 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.6 1.6 0 0 0 1.8.3H9a1.6 1.6 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.6 1.6 0 0 0 1 1.5 1.6 1.6 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.6 1.6 0 0 0-.3 1.8V9a1.6 1.6 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.6 1.6 0 0 0-1.5 1z\"/></svg>',\n show: '<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=\"4\" width=\"18\" height=\"13\" rx=\"2\"/><path d=\"M8 21h8M12 17v4\"/></svg>',\n stats:\n '<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=\"M3 20h18\"/><rect x=\"5\" y=\"10\" width=\"3\" height=\"10\"/><rect x=\"10.5\" y=\"6\" width=\"3\" height=\"14\"/><rect x=\"16\" y=\"13\" width=\"3\" height=\"7\"/></svg>',\n \"theme-dark\":\n '<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 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></svg>',\n \"theme-light\":\n '<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=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></svg>',\n timeline:\n '<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=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"M3 10h18M8 5v14M13 10v9\"/></svg>',\n library:\n '<svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"32\" y=\"96\" width=\"64\" height=\"368\" rx=\"16\" ry=\"16\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/><line x1=\"112\" y1=\"224\" x2=\"240\" y2=\"224\" style=\"fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px\"/><line x1=\"112\" y1=\"400\" x2=\"240\" y2=\"400\" style=\"fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px\"/><rect x=\"112\" y=\"160\" width=\"128\" height=\"304\" rx=\"16\" ry=\"16\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/><rect x=\"256\" y=\"48\" width=\"96\" height=\"416\" rx=\"16\" ry=\"16\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/><path d=\"M422.46,96.11l-40.4,4.25c-11.12,1.17-19.18,11.57-17.93,23.1l34.92,321.59c1.26,11.53,11.37,20,22.49,18.84l40.4-4.25c11.12-1.17,19.18-11.57,17.93-23.1L445,115C443.69,103.42,433.58,94.94,422.46,96.11Z\" style=\"fill:none;stroke:currentColor;stroke-linejoin:round;stroke-width:32px\"/></svg>',\n} as const;\n","// The Music / transport icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const MUSIC_ICONS = {\n \"fast-forward\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\"/></svg>',\n fire: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M16.074,3.781c-1.39-1.106-2.703-2.152-3.691-3.333L12.006-.002l-.384,.444c-1.491,1.722-1.905,3.821-2.238,5.508-.405,2.051-.654,3.037-1.884,3.037-.198,0-.35-.069-.492-.224-.607-.663-.687-2.586-.594-3.643l.123-1.403-.98,1.011c-1.418,1.463-4.057,4.186-4.057,8.771,0,5.79,4.71,10.5,10.5,10.5s10.5-4.71,10.5-10.5c0-4.603-3.267-7.204-6.426-9.719Zm-6.902,18.048c-1.56-1.562-1.56-4.101-.022-5.639l2.851-2.522,2.828,2.502c1.559,1.561,1.559,4.1,0,5.659-1.559,1.559-4.097,1.561-5.657,0Zm6.643,.365c1.642-1.962,1.563-4.888-.301-6.752l-3.513-3.11-3.536,3.13c-1.843,1.842-1.921,4.766-.279,6.731-3.343-1.473-5.685-4.813-5.685-8.694,0-3.233,1.37-5.396,2.888-7.122,.036,1.015,.221,2.338,.882,3.06,.329,.359,.753,.549,1.229,.549,2.107,0,2.476-1.867,2.865-3.844,.294-1.492,.624-3.164,1.655-4.595,.984,1.066,2.177,2.016,3.431,3.014,2.974,2.368,6.049,4.816,6.049,8.937,0,3.882-2.343,7.222-5.686,8.695Z\"/></svg>',\n \"heart-border\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z\"/></svg>',\n heart:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M17.5.917a6.4,6.4,0,0,0-5.5,3.3A6.4,6.4,0,0,0,6.5.917,6.8,6.8,0,0,0,0,7.967c0,6.775,10.956,14.6,11.422,14.932l.578.409.578-.409C13.044,22.569,24,14.742,24,7.967A6.8,6.8,0,0,0,17.5.917ZM12,20.846c-3.253-2.43-10-8.4-10-12.879a4.8,4.8,0,0,1,4.5-5.05A4.8,4.8,0,0,1,11,7.967h2a4.8,4.8,0,0,1,4.5-5.05A4.8,4.8,0,0,1,22,7.967C22,12.448,15.253,18.416,12,20.846Z\"/></svg>',\n metronome:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m23.532,22.142c-.649,1.164-1.828,1.858-3.154,1.858H3.622c-1.326,0-2.505-.694-3.154-1.858-.655-1.173-.624-2.556.082-3.698L9.017,4.722c.578-.937,1.466-1.533,2.483-1.683V0h1v3.039c1.02.152,1.906.747,2.483,1.683l1.131,1.833-.589.949-1.392-2.256c-.494-.799-1.252-1.242-2.136-1.247-.878.005-1.636.448-2.13,1.247L1.4,18.969c-.512.83-.534,1.834-.059,2.687.47.842,1.323,1.345,2.281,1.345h16.756c.958,0,1.812-.503,2.281-1.345.475-.853.453-1.856-.059-2.687l-4.142-6.712.589-.949,4.403,7.135c.706,1.143.736,2.525.082,3.698Zm-9.247-8.852l6.462-10.401.85.527-6.491,10.449c.552.544.895,1.3.895,2.135,0,1.654-1.346,3-3,3s-3-1.346-3-3,1.346-3,3-3c.46,0,.895.104,1.285.29Zm.715,2.71c0-1.103-.897-2-2-2s-2,.897-2,2,.897,2,2,2,2-.897,2-2Z\"/></svg>',\n microphone:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/></svg>',\n \"music-file\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m14.707,0H4.5c-1.379,0-2.5,1.121-2.5,2.5v21.5h20V7.293L14.707,0Zm.293,1.707l5.293,5.293h-5.293V1.707ZM3,23V2.5c0-.827.673-1.5,1.5-1.5h9.5v7h7v15H3Zm9-10.5v3.001c-.418-.314-.938-.501-1.5-.501-1.379,0-2.5,1.121-2.5,2.5s1.121,2.5,2.5,2.5,2.5-1.121,2.5-2.5v-5c0-.275.225-.5.5-.5h2.5v-1h-2.5c-.827,0-1.5.673-1.5,1.5Zm-1.5,6.5c-.827,0-1.5-.673-1.5-1.5s.673-1.5,1.5-1.5,1.5.673,1.5,1.5-.673,1.5-1.5,1.5Z\"/></svg>',\n \"music-note\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18V5l12-2v13\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><circle cx=\"18\" cy=\"16\" r=\"3\"/></svg>',\n mute: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.796 8.796 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06a8.99 8.99 0 0 0 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"/></svg>',\n \"next-track\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16 6h2v12h-2zM6 18l8.5-6L6 6z\"/></svg>',\n pause:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 4h4v16H6zM14 4h4v16h-4z\"/></svg>',\n \"play-circle\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 14.5v-9l6 4.5-6 4.5z\"/></svg>',\n play: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19.765,9.458,4.98.019v24l14.779-9.473a3.007,3.007,0,0,0,.006-5.088Zm-1.08,3.395-11.7,7.5V3.677l11.707,7.474a1,1,0,0,1-.007,1.7Z\"/></svg>',\n \"prev-track\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/></svg>',\n repeat:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z\"/></svg>',\n rewind:\n '<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>',\n volume:\n '<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>',\n waveform:\n '<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>',\n} as const;\n","// The Status icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const STATUS_ICONS = {\n award:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m23.664,0h-8.475l-2.97,6.003c-.073-.002-.146-.003-.22-.003-.076,0-.152,0-.228.003L8.811,0H.324l4.637,9.399c-1.227,1.538-1.961,3.486-1.961,5.601,0,4.962,4.038,9,9,9s9-4.038,9-9c0-2.121-.738-4.072-1.97-5.612L23.664,0Zm-7.854,1h6.243l-3.751,7.582c-1.334-1.311-3.074-2.209-5.011-2.489l2.52-5.093ZM1.933,1h6.256l2.513,5.094c-1.943.282-3.686,1.186-5.021,2.504L1.933,1Zm18.067,14c0,4.411-3.589,8-8,8s-8-3.589-8-8S7.589,7,12,7s8,3.589,8,8Zm-7.244-5.135h-1.494l-.897,3.135h-3.365v1.453l2.318,1.336-1.081,2.955,1.158.86,2.614-2.074,2.609,2.093,1.205-.831-1.171-2.969,2.347-1.377v-1.445h-3.347l-.896-3.135Zm.652,5.528l1.14,2.892-2.536-2.034-2.535,2.011,1.067-2.919-2.328-1.343h2.902l.89-3.11.89,3.11h2.884l-2.375,1.393Z\"/></svg>',\n clock:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12,24C5.383,24,0,18.617,0,12S5.383,0,12,0s12,5.383,12,12-5.383,12-12,12ZM12,1C5.935,1,1,5.935,1,12s4.935,11,11,11,11-4.935,11-11S18.065,1,12,1Zm5,11.5c0-.276-.224-.5-.5-.5h-4.5V5.5c0-.276-.224-.5-.5-.5s-.5,.224-.5,.5v7c0,.276,.224,.5,.5,.5h5c.276,0,.5-.224,.5-.5Z\"/></svg>',\n completed:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m13,11h4v1h-4v-1ZM21,2v19.5c0,1.378-1.121,2.5-2.5,2.5H5.5c-1.379,0-2.5-1.122-2.5-2.5V2h5.05c.232-1.14,1.243-2,2.45-2h3c1.207,0,2.218.86,2.45,2h5.05Zm-1,1h-5v-.5c0-.827-.673-1.5-1.5-1.5h-3c-.827,0-1.5.673-1.5,1.5v.5h-5v18.5c0,.827.673,1.5,1.5,1.5h13c.827,0,1.5-.673,1.5-1.5V3Zm-11.216,7.952c-.056.056-.18.055-.241-.006l-1.778-1.721-.695.719,1.772,1.716c.221.22.514.341.825.341s.604-.122.821-.339l3.362-3.305-.701-.713-3.365,3.308Zm4.216,7.048h4v-1h-4v1Zm-4.216-1.048c-.056.057-.18.055-.241-.006l-1.778-1.721-.695.719,1.772,1.716c.221.22.514.341.825.341s.604-.122.821-.339l3.362-3.305-.701-.713-3.365,3.308Z\"/></svg>',\n diamond:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m23.517,6.252l-3.691-5.167c-.485-.679-1.273-1.085-2.108-1.085H6.282c-.835,0-1.623.406-2.108,1.085L.483,6.252c-.665.931-.636,2.208.07,3.105l11.447,14.657,11.446-14.655c.707-.899.736-2.177.071-3.107Zm-4.504-4.585s3.764,5.276,3.795,5.333h-5.951l-2.065-6h2.926c.513,0,.997.249,1.295.667Zm-10.812,5.333l2.065-6h3.468l2.065,6h-7.598Zm7.626,1l-3.827,12.675-3.827-12.675h7.653ZM4.987,1.667c.298-.418.782-.667,1.295-.667h2.926l-2.065,6H1.193c.031-.057,3.795-5.333,3.795-5.333Zm-3.967,6.333h6.108l4.013,13.29L1.34,8.74c-.173-.219-.279-.475-.319-.74Zm11.838,13.291l4.013-13.291h6.108c-.04.265-.147.522-.32.742l-9.801,12.548Z\"/></svg>',\n info: '<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=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"11\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>',\n lightning:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M11.762,24h-3.493l3.5-9H5c-.659,0-1.262-.304-1.655-.833-.393-.529-.509-1.195-.318-1.826L8.39,0h8.875l-3.5,8h5.201c.761,0,1.43,.4,1.79,1.071s.324,1.45-.097,2.084l-8.897,12.845Zm-2.031-1h1.507l8.593-12.406c.208-.314,.227-.71,.043-1.05-.183-.341-.522-.544-.909-.544h-6.73L15.735,1h-6.69L3.964,12.686c-.078,.271-.019,.613,.184,.886,.203,.272,.513,.429,.853,.429H13.231l-3.5,9Z\"/></svg>',\n \"offline-bolt\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2.02c-5.51 0-9.98 4.47-9.98 9.98s4.47 9.98 9.98 9.98 9.98-4.47 9.98-9.98S17.51 2.02 12 2.02zM11.48 20v-6.26H8L13 4v6.26h3.35L11.48 20z\"/></svg>',\n shield:\n '<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=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>',\n warning:\n '<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=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>',\n \"x-circle\":\n '<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=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>',\n star: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 .587l3.668 7.431 8.2 1.192-5.934 5.783 1.401 8.169L12 18.897l-7.335 3.855 1.401-8.169L.132 9.21l8.2-1.192z\"/></svg>',\n} as const;\n","// The People icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const PEOPLE_ICONS = {\n briefcase:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/></svg>',\n \"give-rights\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m11,11c0-1.654-1.346-3-3-3H3c-1.654,0-3,1.346-3,3v2h11v-2Zm-5.5-4c1.93,0,3.5-1.57,3.5-3.5S7.43,0,5.5,0s-3.5,1.57-3.5,3.5,1.57,3.5,3.5,3.5Zm18.5,14v3h-13v-3c0-1.654,1.346-3,3-3h7c1.654,0,3,1.346,3,3Zm-6.5-4c2.481,0,4.5-2.019,4.5-4.5s-2.019-4.5-4.5-4.5-4.5,2.019-4.5,4.5,2.019,4.5,4.5,4.5Zm-9.081,1.594c.774.775.774,2.037,0,2.812l-2.507,2.507-1.414-1.414,1.498-1.498h-2.997c-1.654,0-3-1.346-3-3v-3h2v3c0,.552.449,1,1,1h3.006l-1.508-1.498,1.414-1.414,2.506,2.506Z\"/></svg>',\n \"graduation-cap\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2.5 9.5 12 5l9.5 4.5L12 14 2.5 9.5Z\"/><path d=\"M6 11.5v4.25c0 1.5 2.7 2.75 6 2.75s6-1.25 6-2.75V11.5\"/><path d=\"M21 9.5v5\"/></svg>',\n \"group-lead\":\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7,14c-2.21,0-4-1.79-4-4s1.79-4,4-4,4,1.79,4,4-1.79,4-4,4Zm7,10H0v-5c0-1.65,1.35-3,3-3H11c1.65,0,3,1.35,3,3v5ZM21,0H8c-1.65,0-3,1.35-3,3v1.35c.63-.22,1.3-.35,2-.35,2.74,0,5.05,1.84,5.77,4.35l2.23,2.23,3.59-3.59h-2.59v-2h4c1.1,0,2,.9,2,2v4h-2v-2.59l-5,5-2.15-2.15c-.23,1.06-.74,2.01-1.44,2.78,2.23,.18,4.05,1.81,4.49,3.96h8.1V3c0-1.65-1.35-3-3-3Z\"/></svg>',\n king: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m21,24H3v-3.5c0-2.481,2.019-4.5,4.5-4.5h9c2.481,0,4.5,2.019,4.5,4.5v3.5Zm-3-16H6c0,3.309,2.691,6,6,6s6-2.691,6-6Zm-3-5l-3-3-3,3L6,0v6h12V0l-3,3Z\"/></svg>',\n leader:\n '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m12 14c2.206 0 4-1.794 4-4s-1.794-4-4-4-4 1.794-4 4 1.794 4 4 4zm0-6c1.103 0 2 .897 2 2s-.897 2-2 2-2-.897-2-2 .897-2 2-2zm4-3h-8v-5l2 2.231 2-2.231 2 2.231 2-2.231zm2-3.376v2.396c2.423 1.827 4 4.719 4 7.981s-1.577 6.154-4 7.981v-.981c0-1.654-1.346-3-3-3h-6c-1.654 0-3 1.346-3 3v.981c-2.423-1.827-4-4.719-4-7.981s1.577-6.154 4-7.981v-2.396c-3.581 2.078-6 5.946-6 10.376 0 6.617 5.383 12 12 12s12-5.383 12-12c0-4.43-2.419-8.298-6-10.376zm-10 19.535v-2.159c0-.551.448-1 1-1h6c.552 0 1 .449 1 1v2.159c-1.226.538-2.578.841-4 .841s-2.774-.303-4-.841z\"/></svg>',\n referral:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"m16.664,11.497l-3.94,3.503,3.94,3.503-1.328,1.494-4.497-3.997h-1.838v-2h1.838l4.497-3.997,1.328,1.494Zm-13.164-.497c1.381,0,2.5-1.119,2.5-2.5s-1.119-2.5-2.5-2.5-2.5,1.119-2.5,2.5,1.119,2.5,2.5,2.5Zm1.5,1h-3c-1.103,0-2,.897-2,2v2h7v-2c0-1.103-.897-2-2-2Zm15.5-7c1.381,0,2.5-1.119,2.5-2.5s-1.119-2.5-2.5-2.5-2.5,1.119-2.5,2.5,1.119,2.5,2.5,2.5Zm1.5,1h-3c-1.103,0-2,.897-2,2v2h7v-2c0-1.103-.897-2-2-2Zm1,10.5c0-1.381-1.119-2.5-2.5-2.5s-2.5,1.119-2.5,2.5,1.119,2.5,2.5,2.5,2.5-1.119,2.5-2.5Zm-1,3.5h-3c-1.103,0-2,.897-2,2v2h7v-2c0-1.103-.897-2-2-2Z\"/></svg>',\n user: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/></svg>',\n team: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18,8c-2.206,0-4-1.794-4-4S15.794,0,18,0s4,1.794,4,4-1.794,4-4,4Zm-6,7c-2.206,0-4-1.794-4-4s1.794-4,4-4,4,1.794,4,4-1.794,4-4,4Zm-6-7c-2.206,0-4-1.794-4-4S3.794,0,6,0s4,1.794,4,4-1.794,4-4,4Zm12,14v-2.5c0-1.93-1.57-3.5-3.5-3.5h-5c-1.93,0-3.5,1.57-3.5,3.5v2.5H0v2H24v-2h-6ZM7.157,14.532c-.726-.991-1.157-2.211-1.157-3.532,0-.341,.035-.674,.09-1H3.5c-1.933,0-3.5,1.567-3.5,3.5v2.5H5.261c.513-.62,1.161-1.12,1.896-1.468Zm13.343-4.532h-2.59c.055,.326,.09,.659,.09,1,0,1.321-.431,2.54-1.157,3.532,.734,.348,1.383,.849,1.896,1.468h5.261v-2.5c0-1.933-1.567-3.5-3.5-3.5Z\"/></svg>',\n work: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z\"/></svg>',\n} as const;\n","// The Brand icon set — inlined SVG (no .svg text-loader dependency) so the\n// package ships self-contained. Single-colour SVGs using `currentColor`, so\n// each icon inherits `color` from its host. Hand-maintained; keys are kebab-case.\nexport const BRANDS_ICONS = {\n discord:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028 14.09 14.09 0 001.226-1.994.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z\"/></svg>',\n slack:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z\"/></svg>',\n teams:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19.404 4.5a2.25 2.25 0 110 4.5 2.25 2.25 0 010-4.5zM12 3a3.75 3.75 0 110 7.5A3.75 3.75 0 0112 3zm-9.404 1.5a2.25 2.25 0 110 4.5 2.25 2.25 0 010-4.5zM21 11.25h-3.75a1.5 1.5 0 00-1.5 1.5v6.75A4.5 4.5 0 0020.25 24a3.75 3.75 0 003.75-3.75v-7.5A1.5 1.5 0 0021 11.25zM14.25 12.75v6.75A4.5 4.5 0 019.75 24h-.5A4.5 4.5 0 014.75 19.5v-6.75a1.5 1.5 0 011.5-1.5h6.5a1.5 1.5 0 011.5 1.5z\"/></svg>',\n telegram:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M11.944 0A12 12 0 000 12a12 12 0 0012 12 12 12 0 0012-12A12 12 0 0012 0a12 12 0 00-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 01.171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\"/></svg>',\n whatsapp:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413Z\"/></svg>',\n github:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0 1 12 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"/></svg>',\n linkedin:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.225 0z\"/></svg>',\n fold: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 511 511\" fill=\"currentColor\"><path d=\"M509.807,159.545c0.016-0.026,0.036-0.047,0.052-0.073c0.033-0.053,0.058-0.108,0.09-0.162 c0.078-0.131,0.153-0.263,0.222-0.399c0.047-0.091,0.09-0.183,0.132-0.275c0.06-0.129,0.116-0.259,0.169-0.391 c0.042-0.105,0.08-0.211,0.116-0.317c0.041-0.121,0.081-0.242,0.116-0.366c0.035-0.122,0.066-0.244,0.094-0.367 c0.026-0.111,0.05-0.223,0.071-0.336c0.025-0.138,0.046-0.275,0.063-0.413c0.013-0.103,0.026-0.207,0.034-0.312 c0.013-0.149,0.019-0.298,0.023-0.447c0.002-0.064,0.01-0.126,0.01-0.19c0-0.038-0.005-0.076-0.006-0.114 c-0.002-0.141-0.011-0.282-0.021-0.423c-0.008-0.114-0.015-0.228-0.029-0.341c-0.014-0.116-0.034-0.231-0.053-0.346 c-0.022-0.132-0.043-0.265-0.071-0.394c-0.021-0.094-0.048-0.187-0.072-0.28c-0.038-0.144-0.075-0.288-0.12-0.428 c-0.028-0.086-0.062-0.17-0.093-0.255c-0.052-0.141-0.102-0.281-0.162-0.418c-0.041-0.095-0.089-0.186-0.135-0.279 c-0.059-0.12-0.115-0.241-0.18-0.358c-0.062-0.112-0.131-0.219-0.199-0.328c-0.058-0.093-0.113-0.187-0.175-0.276 c-0.082-0.119-0.172-0.234-0.261-0.349c-0.058-0.075-0.113-0.151-0.174-0.224c-0.093-0.111-0.193-0.216-0.293-0.322 c-0.068-0.072-0.134-0.146-0.205-0.216c-0.093-0.091-0.192-0.177-0.29-0.264c-0.09-0.08-0.18-0.16-0.274-0.235 c-0.086-0.069-0.176-0.133-0.265-0.198c-0.117-0.086-0.234-0.169-0.356-0.248c-0.031-0.02-0.059-0.044-0.091-0.063l-64-40 c-0.044-0.027-0.089-0.048-0.133-0.074c-0.089-0.053-0.176-0.107-0.267-0.156c-0.056-0.03-0.112-0.058-0.168-0.086 c-0.09-0.046-0.181-0.088-0.273-0.13c-0.073-0.034-0.145-0.069-0.22-0.101c-0.052-0.022-0.104-0.041-0.156-0.061 c-0.122-0.048-0.244-0.092-0.367-0.133c-0.045-0.015-0.087-0.035-0.133-0.049c-0.014-0.004-0.028-0.007-0.041-0.011 c-0.044-0.013-0.088-0.024-0.132-0.037c-0.143-0.042-0.286-0.077-0.43-0.11c-0.055-0.012-0.109-0.029-0.164-0.04 c-0.036-0.007-0.072-0.01-0.108-0.017c-0.146-0.027-0.292-0.049-0.439-0.068c-0.105-0.013-0.21-0.026-0.316-0.035 c-0.129-0.011-0.257-0.017-0.386-0.021c-0.123-0.004-0.246-0.007-0.368-0.005c-0.112,0.002-0.223,0.008-0.335,0.015 c-0.044,0.003-0.088,0.003-0.132,0.006c-0.029,0.002-0.058,0.001-0.087,0.004c-0.061,0.006-0.121,0.017-0.181,0.024 c-0.103,0.012-0.206,0.028-0.309,0.044c-0.034,0.005-0.068,0.009-0.101,0.015c-0.046,0.008-0.092,0.011-0.137,0.02 c-0.056,0.011-0.11,0.027-0.165,0.039c-0.103,0.022-0.205,0.049-0.308,0.075c-0.128,0.033-0.255,0.067-0.38,0.107 c-0.11,0.035-0.218,0.074-0.326,0.114c-0.08,0.029-0.161,0.054-0.239,0.086c-0.033,0.013-0.065,0.031-0.098,0.045 c-0.117,0.049-0.231,0.104-0.345,0.159c-0.078,0.038-0.158,0.073-0.235,0.113c-0.008,0.004-0.017,0.007-0.025,0.012l-114.566,61.102 l-68.1-83.234c-0.003-0.004-0.007-0.007-0.01-0.011c-0.021-0.026-0.043-0.051-0.065-0.077c-0.053-0.063-0.111-0.12-0.166-0.181 c-0.106-0.118-0.212-0.237-0.326-0.348c-0.066-0.065-0.139-0.124-0.208-0.186c-0.109-0.099-0.216-0.199-0.331-0.292 c-0.109-0.087-0.225-0.166-0.338-0.248c-0.009-0.006-0.017-0.013-0.026-0.019c-0.075-0.053-0.147-0.111-0.224-0.162 c-0.115-0.076-0.238-0.142-0.358-0.212c-0.091-0.053-0.18-0.11-0.273-0.159c-0.112-0.059-0.23-0.108-0.346-0.161 c-0.107-0.049-0.212-0.103-0.321-0.147c-0.104-0.042-0.212-0.075-0.319-0.112c-0.127-0.045-0.253-0.092-0.382-0.13 c-0.016-0.005-0.032-0.012-0.048-0.016c-0.114-0.033-0.228-0.053-0.342-0.08c-0.103-0.024-0.205-0.052-0.31-0.072 c-0.044-0.008-0.087-0.018-0.131-0.026L24.818,44.114c-0.074-0.013-0.147-0.017-0.221-0.028c-0.135-0.02-0.269-0.039-0.404-0.052 c-0.124-0.012-0.246-0.018-0.369-0.023c-0.117-0.005-0.234-0.009-0.351-0.009c-0.134,0-0.267,0.005-0.4,0.013 c-0.108,0.006-0.217,0.014-0.325,0.024c-0.134,0.013-0.267,0.031-0.399,0.052c-0.11,0.017-0.219,0.036-0.328,0.057 c-0.126,0.025-0.25,0.054-0.374,0.086c-0.115,0.029-0.23,0.061-0.344,0.096c-0.115,0.035-0.227,0.073-0.34,0.114 c-0.119,0.043-0.236,0.088-0.353,0.137c-0.108,0.045-0.213,0.094-0.319,0.144c-0.114,0.054-0.227,0.11-0.339,0.17 c-0.109,0.059-0.215,0.121-0.32,0.185c-0.101,0.061-0.202,0.123-0.301,0.189c-0.116,0.078-0.228,0.16-0.339,0.244 c-0.058,0.044-0.12,0.082-0.177,0.128c-0.027,0.021-0.049,0.045-0.076,0.067c-0.112,0.092-0.219,0.19-0.326,0.289 c-0.077,0.071-0.156,0.141-0.23,0.215c-0.096,0.096-0.185,0.198-0.276,0.299c-0.075,0.084-0.152,0.166-0.222,0.252 c-0.08,0.098-0.154,0.202-0.229,0.305c-0.07,0.095-0.142,0.189-0.207,0.286c-0.068,0.103-0.129,0.21-0.192,0.317 c-0.062,0.104-0.126,0.206-0.182,0.312c-0.056,0.106-0.105,0.217-0.156,0.326c-0.053,0.113-0.108,0.225-0.155,0.34 c-0.044,0.106-0.08,0.216-0.119,0.325c-0.044,0.124-0.09,0.248-0.127,0.374c-0.031,0.104-0.056,0.212-0.083,0.319 c-0.034,0.136-0.068,0.271-0.094,0.408c-0.007,0.035-0.018,0.069-0.024,0.104c-0.014,0.076-0.018,0.151-0.029,0.227 c-0.019,0.132-0.038,0.264-0.05,0.397c-0.012,0.124-0.018,0.247-0.023,0.37c-0.005,0.118-0.009,0.236-0.009,0.354 c0,0.132,0.006,0.263,0.013,0.394c0.006,0.111,0.014,0.221,0.025,0.332c0.013,0.132,0.031,0.262,0.051,0.392 c0.017,0.112,0.037,0.224,0.059,0.335c0.025,0.124,0.053,0.246,0.085,0.368c0.03,0.117,0.062,0.233,0.097,0.349 c0.035,0.113,0.073,0.225,0.113,0.336c0.043,0.119,0.088,0.238,0.137,0.355c0.045,0.107,0.093,0.213,0.143,0.318 c0.054,0.114,0.11,0.227,0.17,0.339c0.058,0.109,0.121,0.214,0.184,0.32c0.061,0.102,0.123,0.203,0.19,0.302 c0.077,0.115,0.159,0.226,0.242,0.336c0.044,0.059,0.082,0.121,0.129,0.179l47.852,59.815H7.5c-0.068,0-0.133,0.008-0.2,0.01 c-0.138,0.004-0.276,0.01-0.414,0.021c-0.121,0.01-0.241,0.024-0.36,0.039c-0.117,0.015-0.234,0.033-0.35,0.053 c-0.132,0.023-0.262,0.051-0.391,0.081c-0.104,0.024-0.207,0.051-0.31,0.08c-0.133,0.037-0.263,0.077-0.393,0.122 c-0.101,0.034-0.201,0.071-0.301,0.11c-0.123,0.048-0.244,0.098-0.363,0.152c-0.106,0.048-0.211,0.099-0.315,0.152 c-0.107,0.055-0.213,0.111-0.317,0.171c-0.111,0.063-0.22,0.13-0.328,0.199c-0.093,0.06-0.184,0.121-0.274,0.184 c-0.11,0.077-0.217,0.158-0.323,0.242c-0.086,0.068-0.169,0.137-0.251,0.208c-0.099,0.086-0.197,0.174-0.292,0.265 c-0.087,0.083-0.17,0.168-0.253,0.255c-0.082,0.086-0.162,0.174-0.24,0.265c-0.091,0.106-0.178,0.215-0.263,0.326 c-0.041,0.053-0.085,0.1-0.125,0.154c-0.023,0.032-0.041,0.065-0.063,0.097c-0.086,0.122-0.165,0.247-0.244,0.373 c-0.053,0.086-0.108,0.172-0.157,0.259c-0.069,0.123-0.132,0.249-0.195,0.376c-0.048,0.097-0.097,0.194-0.141,0.292 c-0.052,0.118-0.097,0.239-0.143,0.36c-0.042,0.111-0.086,0.222-0.123,0.335c-0.036,0.111-0.066,0.225-0.097,0.339 c-0.035,0.126-0.07,0.252-0.097,0.379c-0.023,0.105-0.039,0.212-0.058,0.318c-0.024,0.139-0.048,0.278-0.064,0.418 c-0.012,0.101-0.018,0.203-0.025,0.306c-0.011,0.147-0.02,0.295-0.022,0.442C0.005,123.419,0,123.457,0,123.497 c0,0.068,0.008,0.133,0.01,0.2c0.004,0.138,0.009,0.276,0.021,0.414c0.01,0.121,0.024,0.24,0.039,0.36 c0.015,0.118,0.033,0.235,0.054,0.351c0.023,0.131,0.051,0.261,0.081,0.39c0.025,0.105,0.051,0.209,0.08,0.312 c0.037,0.132,0.077,0.261,0.121,0.39c0.035,0.103,0.072,0.204,0.112,0.305c0.047,0.121,0.097,0.241,0.15,0.359 c0.049,0.108,0.101,0.215,0.154,0.321c0.054,0.105,0.109,0.209,0.167,0.311c0.064,0.113,0.133,0.224,0.203,0.334 c0.058,0.091,0.118,0.181,0.18,0.269c0.078,0.111,0.16,0.22,0.245,0.327c0.067,0.084,0.135,0.167,0.205,0.248 c0.086,0.1,0.175,0.198,0.268,0.294c0.082,0.086,0.167,0.169,0.254,0.251c0.087,0.082,0.174,0.163,0.266,0.242 c0.106,0.091,0.215,0.177,0.325,0.262c0.053,0.041,0.1,0.085,0.155,0.125l172.304,125.312l-31.29,203.386 c-0.004,0.024-0.007,0.048-0.011,0.073l-0.004,0.024c-0.005,0.031-0.005,0.061-0.009,0.092c-0.03,0.213-0.054,0.426-0.066,0.638 c-0.005,0.084-0.002,0.166-0.004,0.249c-0.003,0.159-0.007,0.318-0.001,0.476c0.005,0.124,0.019,0.245,0.03,0.367 c0.011,0.116,0.018,0.232,0.034,0.347c0.02,0.143,0.049,0.284,0.077,0.425c0.019,0.094,0.034,0.189,0.057,0.282 c0.034,0.144,0.077,0.284,0.119,0.425c0.027,0.091,0.052,0.182,0.083,0.272c0.045,0.13,0.097,0.257,0.149,0.385 c0.04,0.099,0.078,0.199,0.123,0.296c0.05,0.109,0.106,0.215,0.161,0.321c0.058,0.112,0.114,0.224,0.177,0.333 c0.051,0.088,0.108,0.172,0.162,0.258c0.076,0.12,0.152,0.24,0.236,0.356c0.053,0.073,0.11,0.143,0.165,0.214 c0.093,0.12,0.186,0.239,0.287,0.354c0.06,0.068,0.125,0.132,0.187,0.199c0.102,0.108,0.203,0.216,0.312,0.318 c0.081,0.076,0.168,0.147,0.253,0.22c0.096,0.083,0.191,0.167,0.292,0.245c0.123,0.096,0.253,0.183,0.383,0.271 c0.071,0.048,0.138,0.099,0.21,0.144c0.181,0.114,0.369,0.218,0.561,0.317c0.027,0.014,0.051,0.03,0.078,0.044 c0.003,0.001,0.006,0.002,0.009,0.004c0.253,0.126,0.514,0.238,0.783,0.336c0.067,0.024,0.135,0.041,0.202,0.063 c0.184,0.061,0.37,0.119,0.561,0.166c0.126,0.031,0.252,0.053,0.378,0.078c0.094,0.018,0.185,0.043,0.281,0.058 c0.032,0.005,0.063,0.003,0.095,0.007c0.347,0.049,0.694,0.082,1.04,0.082c0.004,0,0.008-0.001,0.011-0.001c0.001,0,0.003,0,0.004,0 c0.31,0,0.615-0.026,0.918-0.064c0.06-0.008,0.119-0.015,0.179-0.024c0.619-0.092,1.217-0.261,1.783-0.498 c0.055-0.023,0.109-0.045,0.163-0.069c0.274-0.122,0.541-0.258,0.798-0.412c0.047-0.028,0.091-0.06,0.137-0.089 c0.216-0.136,0.424-0.283,0.625-0.439c0.06-0.046,0.12-0.091,0.178-0.139c0.223-0.185,0.435-0.384,0.636-0.595 c0.05-0.053,0.098-0.108,0.147-0.162c0.202-0.224,0.394-0.458,0.569-0.706c0.005-0.008,0.012-0.015,0.017-0.022 c0.189-0.272,0.356-0.56,0.509-0.858c0.012-0.024,0.029-0.045,0.041-0.069l54.781-109.563l181.501-78.913 c0.049-0.021,0.093-0.048,0.141-0.07c0.145-0.067,0.288-0.137,0.429-0.213c0.013-0.007,0.027-0.013,0.041-0.02 c0.023-0.012,0.046-0.021,0.069-0.034c0.052-0.029,0.1-0.064,0.152-0.094c0.113-0.067,0.225-0.137,0.334-0.21 c0.072-0.048,0.145-0.093,0.215-0.143c0.027-0.019,0.052-0.041,0.079-0.061c0.082-0.06,0.162-0.123,0.241-0.187 c0.019-0.015,0.041-0.025,0.06-0.041c0.019-0.016,0.036-0.034,0.055-0.05c0.07-0.058,0.137-0.117,0.204-0.178 c0.066-0.06,0.13-0.122,0.194-0.183c0.004-0.004,0.008-0.007,0.012-0.011c0.028-0.027,0.058-0.05,0.086-0.078 c0.021-0.021,0.04-0.043,0.061-0.064c0.05-0.052,0.099-0.104,0.148-0.157c0.062-0.068,0.121-0.138,0.181-0.208 c0.058-0.067,0.118-0.133,0.173-0.202c0.032-0.04,0.062-0.08,0.093-0.12c0.025-0.032,0.05-0.064,0.074-0.096 c0.026-0.036,0.049-0.074,0.075-0.11c0.008-0.011,0.015-0.023,0.023-0.034c0.058-0.082,0.118-0.163,0.172-0.247 c0.017-0.027,0.034-0.053,0.051-0.08c0.058-0.093,0.111-0.189,0.165-0.284c0.051-0.09,0.104-0.178,0.151-0.269 c0.002-0.004,0.005-0.008,0.007-0.013c0.007-0.014,0.014-0.028,0.021-0.042c0.054-0.107,0.102-0.219,0.151-0.329 c0.04-0.09,0.083-0.179,0.119-0.271c0.006-0.015,0.013-0.03,0.019-0.045c0.046-0.118,0.084-0.239,0.124-0.36 c0.006-0.017,0.012-0.034,0.018-0.051c0.007-0.022,0.019-0.042,0.026-0.064l0.03-0.096c0.001-0.002,0.001-0.004,0.002-0.006 l33.681-106.656h71.113c0.005,0,0.01,0.001,0.014,0.001c0.017,0,0.034-0.003,0.051-0.003c0.277-0.002,0.549-0.02,0.818-0.051 c0.076-0.009,0.151-0.023,0.226-0.034c0.218-0.032,0.432-0.071,0.643-0.121c0.078-0.018,0.155-0.039,0.232-0.06 c0.216-0.058,0.427-0.126,0.634-0.203c0.065-0.024,0.131-0.046,0.196-0.072c0.269-0.108,0.532-0.227,0.785-0.364 c0.006-0.003,0.012-0.008,0.018-0.011c0.239-0.131,0.468-0.277,0.691-0.433c0.084-0.059,0.165-0.122,0.246-0.184 c0.149-0.113,0.293-0.231,0.432-0.354c0.08-0.071,0.16-0.141,0.237-0.216c0.185-0.178,0.361-0.364,0.526-0.56 c0.019-0.022,0.039-0.041,0.058-0.063C509.476,160.039,509.646,159.795,509.807,159.545z M426.814,130.763l-38.29,121.253 l-57.435-70.199L426.814,130.763z M41.816,62.386l195.301,34.875l-55.8,139.5L41.816,62.386z M374.591,258.674l-180.335-13.872 l55.488-138.719L374.591,258.674z M212.629,337.089L193.3,259.773l167.518,12.886L212.629,337.089z M199.551,346.624l-33.364,66.728 l19.065-123.924L199.551,346.624z M142.792,212.618L30.564,130.997h46.932L142.792,212.618z M443.736,126.989l33.613,21.008h-40.247 L443.736,126.989z\"/></svg>',\n paypal:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M7.076 21.337H2.47a.641.641 0 0 1-.633-.74L4.944.901C5.026.382 5.474 0 5.998 0h7.46c2.57 0 4.578.543 5.69 1.81 1.01 1.15 1.304 2.42 1.012 4.287-.023.143-.047.288-.077.437-.983 5.05-4.349 6.797-8.647 6.797h-2.19c-.524 0-.968.382-1.05.9l-1.12 7.106zm14.146-14.42a3.35 3.35 0 0 0-.607-.541c-.013.076-.026.175-.041.254-.93 4.778-4.005 7.201-9.138 7.201h-2.19a.563.563 0 0 0-.556.479l-1.187 7.527h-.506l-.24 1.516a.56.56 0 0 0 .554.647h3.882c.46 0 .85-.334.922-.788.06-.26.76-4.852.816-5.09a.932.932 0 0 1 .923-.788h.58c3.76 0 6.705-1.528 7.565-5.946.36-1.847.174-3.388-.777-4.471z\"/></svg>',\n x: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/></svg>',\n} as const;\n","import { UI_ICONS } from \"./icons/ui.icons\";\nimport { NAV_ICONS } from \"./icons/nav.icons\";\nimport { MUSIC_ICONS } from \"./icons/music.icons\";\nimport { STATUS_ICONS } from \"./icons/status.icons\";\nimport { PEOPLE_ICONS } from \"./icons/people.icons\";\nimport { BRANDS_ICONS } from \"./icons/brands.icons\";\n\n/**\n * The package's built-in icon set — the shared, reusable catalogue. Keys are\n * **kebab-case** and unique across categories; values are single-colour SVG\n * markup using `currentColor`, so an icon inherits `color` from its host.\n *\n * The SVGs are inlined (not `.svg` file imports) so the package is fully\n * self-contained — no build-tool loader config leaks to a consumer.\n *\n * A consumer extends this set at runtime — never by editing this file — through\n * {@link FoldIconRegistry} (`provideFoldIcons()` at bootstrap, or `register()` later).\n */\nexport const FOLD_BUILTIN_ICONS = {\n ...UI_ICONS,\n ...NAV_ICONS,\n ...MUSIC_ICONS,\n ...STATUS_ICONS,\n ...PEOPLE_ICONS,\n ...BRANDS_ICONS,\n} as const;\n\n/** Every built-in icon name — derived from the registry keys (autocompletes). */\nexport type FoldBuiltinIconName = keyof typeof FOLD_BUILTIN_ICONS;\n\n/**\n * The `name` a `fold-icon` accepts: a built-in (autocompleted + type-checked) or\n * any custom string a consumer has registered. `(string & {})` keeps the\n * built-in literals in autocomplete while still admitting a bare `string`.\n */\nexport type FoldIconName = FoldBuiltinIconName | (string & {});\n","import type { FoldIconSet } from \"./icon-registry.service\";\n\n/**\n * The trust contract for icon markup.\n *\n * A registered icon's markup is injected into the shared sprite **unsanitised**\n * (`insertAdjacentHTML` of the authored `<svg>`, so its `stroke` / `fill` /\n * `viewBox` survive intact). That trust is only sound for **static, authored**\n * markup: never register a string derived from user input.\n *\n * This guard is the backstop, not the sanitiser it cannot be. It rejects the\n * two shapes that have no place in a static icon — a non-`<svg>` root, and\n * `<script>` / inline `on*=` event handlers — so an obvious mistake fails loud\n * at registration instead of silently shipping a stored-XSS sink. It runs on\n * consumer input only; the built-in catalogue is authored in-package.\n */\nconst SVG_ROOT = /^\\s*<svg[\\s>]/i;\nconst UNSAFE = /<script[\\s/>]|\\son\\w+\\s*=/i;\n\n/** Assert a single icon's markup is a static, trusted `<svg>` string. */\nexport function assertSvgIcon(name: string, svg: string): void {\n if (!SVG_ROOT.test(svg)) {\n throw new Error(\n `[fold-icon] icon \"${name}\" must be a literal <svg …> string — ` +\n `icon markup is rendered unsanitised, so it must be static and trusted.`,\n );\n }\n if (UNSAFE.test(svg)) {\n throw new Error(\n `[fold-icon] icon \"${name}\" must not contain <script> or inline event ` +\n `handlers (on*=) — icon markup must be static and trusted.`,\n );\n }\n}\n\n/** Assert every entry of a consumer-supplied icon set passes {@link assertSvgIcon}. */\nexport function assertIconSet(icons: FoldIconSet): void {\n for (const [name, svg] of Object.entries(icons)) {\n assertSvgIcon(name, svg);\n }\n}\n","import {\n InjectionToken,\n type Provider,\n Service,\n type WritableSignal,\n inject,\n signal,\n} from \"@angular/core\";\nimport { FOLD_BUILTIN_ICONS } from \"./builtin-icons\";\nimport { assertIconSet, assertSvgIcon } from \"./icon-safety\";\n\n/** A `name → SVG markup` map — the shape both built-in and custom icons take. */\nexport type FoldIconSet = Readonly<Record<string, string>>;\n\n/** Consumer icons merged in at bootstrap — set via {@link provideFoldIcons}. */\nexport const ICON_OVERRIDES = new InjectionToken<FoldIconSet>(\n \"fold.icons.overrides\",\n);\n\n/**\n * Register app-specific icons at bootstrap (idiomatic, like `provideRouter`).\n * They merge on top of the built-in set — a custom entry with a built-in key\n * overrides it.\n *\n * ```ts\n * // app.config.ts\n * providers: [provideFoldIcons({ \"my-logo\": \"<svg …>…</svg>\" })]\n * ```\n *\n * **Trust contract:** icon markup is rendered unsanitised (see `fold-icon`), so\n * every value must be a static, authored `<svg>` string — never derived from\n * user input. The registry asserts this at seed time and throws on obviously\n * unsafe markup, but it is a backstop, not a sanitiser.\n */\nexport function provideFoldIcons(icons: FoldIconSet): Provider {\n return { provide: ICON_OVERRIDES, useValue: icons };\n}\n\n/**\n * The single source of truth for icon lookup. Root singleton seeded with the\n * package's {@link FOLD_BUILTIN_ICONS}; a consumer adds its own via\n * {@link provideFoldIcons} (bootstrap) or {@link register}/{@link registerMany}\n * (runtime). `fold-icon` resolves every `name` through here.\n *\n * Consumer-supplied markup passes the {@link assertSvgIcon} trust guard on the\n * way in (seed, `register`, `registerMany`); the built-in catalogue is authored\n * in-package and trusted as-is.\n */\n@Service()\nexport class FoldIconRegistry {\n private readonly _icons: WritableSignal<FoldIconSet>;\n\n constructor() {\n const overrides = inject(ICON_OVERRIDES, { optional: true }) ?? {};\n assertIconSet(overrides);\n this._icons = signal<FoldIconSet>({ ...FOLD_BUILTIN_ICONS, ...overrides });\n }\n\n /** Register (or override) a single icon at runtime. */\n register(name: string, svg: string): void {\n assertSvgIcon(name, svg);\n this._icons.update((icons) => ({ ...icons, [name]: svg }));\n }\n\n /** Register (or override) several icons at once. */\n registerMany(icons: FoldIconSet): void {\n assertIconSet(icons);\n this._icons.update((current) => ({ ...current, ...icons }));\n }\n\n /** The SVG markup for a name, or `undefined` if unknown. Reactive. */\n resolve(name: string): string | undefined {\n return this._icons()[name];\n }\n\n /** Whether a name is registered. Reactive. */\n has(name: string): boolean {\n return name in this._icons();\n }\n}\n","/**\n * Shared-sprite plumbing for `fold-icon`.\n *\n * Instead of injecting an icon's markup into every `<fold-icon>` (N copies of\n * the same paths for N instances), each unique icon is added **once** to a\n * hidden document-level sprite as a `<symbol>`, and every instance renders a\n * lightweight `<svg><use href=\"#…\"/></svg>` that references it. The DOM holds\n * one copy of the paths no matter how many times the icon renders.\n */\n\n/** The id prefix shared by every symbol in the sprite. */\nexport const FOLD_ICON_SYMBOL_PREFIX = \"fold-icon-\";\n\n/** The id of the single hidden sprite `<svg>` appended to the document. */\nexport const FOLD_ICON_SPRITE_ID = \"fold-icon-sprite\";\n\n/** The symbol id for an icon name — what a `<use href>` points at. */\nexport function foldIconSymbolId(name: string): string {\n return `${FOLD_ICON_SYMBOL_PREFIX}${name}`;\n}\n\n/**\n * Convert an authored `<svg>…</svg>` string into a `<symbol id=…>…</symbol>`\n * for the sprite. The root `<svg>`'s presentation attributes (`viewBox`,\n * `fill`, `stroke`, `stroke-*`) carry onto the symbol so a `<use>` renders it\n * identically; `xmlns` / `width` / `height` are dropped — the instance `<svg>`\n * owns the rendered size, and `xmlns` is redundant inside an HTML-parsed SVG.\n *\n * Runs on markup already vetted by the registry's trust guard, so the input is\n * a static, well-formed `<svg>`.\n */\nexport function foldIconToSymbol(name: string, svg: string): string {\n const open = /<svg\\b([^>]*)>/i.exec(svg);\n const attrs = (open?.[1] ?? \"\")\n .replace(/\\s+xmlns(:\\w+)?\\s*=\\s*([\"'])[\\s\\S]*?\\2/gi, \"\")\n .replace(/\\s+(width|height)\\s*=\\s*([\"'])[\\s\\S]*?\\2/gi, \"\")\n .trim();\n const inner = svg\n .replace(/^[\\s\\S]*?<svg\\b[^>]*>/i, \"\")\n .replace(/<\\/svg\\s*>\\s*$/i, \"\");\n return `<symbol id=\"${foldIconSymbolId(name)}\"${attrs ? ` ${attrs}` : \"\"}>${inner}</symbol>`;\n}\n","import { DOCUMENT } from \"@angular/common\";\nimport { Service, inject } from \"@angular/core\";\nimport {\n FOLD_ICON_SPRITE_ID,\n foldIconSymbolId,\n foldIconToSymbol,\n} from \"./icon-sprite\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/**\n * The single hidden SVG sprite that backs every `fold-icon`.\n *\n * Root singleton. Each unique icon is added once as a `<symbol>`; instances\n * reference it by id through `<use>`, so the DOM holds one copy of an icon's\n * paths however many times it renders (the win over per-instance `[innerHTML]`).\n *\n * **Lazy:** only icons actually rendered are added, so an SSR page ships just\n * the icons it uses — each once — not the whole catalogue.\n *\n * **SSR + hydration:** on the server the sprite is appended to `<body>` during\n * render and serialised into the HTML, so `<use>` resolves on first paint (no\n * icon flash before hydration). On the client the service adopts that existing\n * sprite instead of creating a second one, and seeds its added-set from the\n * symbols already present — so hydration never double-adds.\n */\n@Service()\nexport class FoldIconSprite {\n private readonly document = inject(DOCUMENT);\n private readonly added = new Set<string>();\n private sprite: Element | null = null;\n\n /** Ensure `name`'s symbol is in the sprite; idempotent. `markup` is the raw,\n * trust-guarded SVG string from the registry. */\n ensure(name: string, markup: string): void {\n const id = foldIconSymbolId(name);\n if (this.added.has(id)) {\n return;\n }\n const sprite = this.resolveSprite();\n if (!sprite) {\n return; // no document body (non-DOM host) — instance renders nothing\n }\n // resolveSprite may have just seeded `added` from an SSR-serialised sprite.\n if (this.added.has(id)) {\n return;\n }\n sprite.insertAdjacentHTML(\"beforeend\", foldIconToSymbol(name, markup));\n this.added.add(id);\n }\n\n /** The mounted sprite, creating it (or adopting the SSR one) on first use. */\n private resolveSprite(): Element | null {\n if (this.sprite) {\n return this.sprite;\n }\n const body = this.document.body;\n if (!body) {\n return null;\n }\n const existing = this.document.getElementById(FOLD_ICON_SPRITE_ID);\n if (existing) {\n existing\n .querySelectorAll(\"symbol[id]\")\n .forEach((symbol) => this.added.add(symbol.id));\n this.sprite = existing;\n return existing;\n }\n const svg = this.document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"id\", FOLD_ICON_SPRITE_ID);\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\n \"style\",\n \"position:absolute;width:0;height:0;overflow:hidden\",\n );\n body.appendChild(svg);\n this.sprite = svg;\n return svg;\n }\n}\n","import { Component, computed, effect, inject, input } from \"@angular/core\";\nimport { FoldIconRegistry } from \"./icon-registry.service\";\nimport { FoldIconSprite } from \"./icon-sprite.service\";\nimport { foldIconSymbolId } from \"./icon-sprite\";\nimport type { FoldIconName } from \"./builtin-icons\";\n\n/** Size presets map to an icon-size token; a number is interpreted as pixels. */\nexport type FoldIconSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n\n/** Preset → `--fold-icon-size-*` token, with a px fallback so an icon still\n * renders if a consumer loads the component without the token layer. */\nconst SIZE_VAR: Record<Exclude<FoldIconSize, number>, string> = {\n xs: \"var(--fold-icon-size-xs, 12px)\",\n sm: \"var(--fold-icon-size-sm, 16px)\",\n md: \"var(--fold-icon-size-md, 20px)\",\n lg: \"var(--fold-icon-size-lg, 24px)\",\n xl: \"var(--fold-icon-size-xl, 32px)\",\n};\n\n/**\n * `fold-icon` — the single surface for all SVG icons.\n *\n * Icons resolve through the {@link FoldIconRegistry} (built-in set + any the\n * consumer registered), keyed by a typed {@link FoldIconName}. Each unique icon\n * is added once to a shared hidden sprite (see {@link FoldIconSprite}); the\n * component itself renders a lightweight `<svg><use href=\"#…\"/></svg>` that\n * references it, so the DOM holds one copy of an icon's paths however many times\n * it renders. Colour + size come from CSS (`currentColor` + a `--icon-size`\n * custom property) and inherit across the `<use>` into the symbol, so the SVG\n * takes its `color` from the host.\n *\n * @selector `fold-icon`\n *\n * @example\n * ```html\n * <fold-icon name=\"search\" />\n * <fold-icon name=\"bin\" size=\"lg\" />\n * <fold-icon name=\"heart\" [size]=\"18\" />\n * <fold-icon name=\"edit\" title=\"Edit track\" /> <!-- a11y label -->\n * ```\n */\n@Component({\n selector: \"fold-icon\",\n standalone: true,\n templateUrl: \"./icon.component.html\",\n styleUrl: \"./icon.component.scss\",\n})\nexport class FoldIconComponent {\n /** Icon name — a built-in (autocompleted) or a consumer-registered string. */\n readonly name = input.required<FoldIconName>();\n\n /** Size — token (`xs…xl`) or explicit pixel number. Defaults to `md`. */\n readonly size = input<FoldIconSize>(\"md\");\n\n /** Optional accessible label. Set → `aria-label`; unset → `aria-hidden`. */\n readonly title = input<string>();\n\n private readonly registry = inject(FoldIconRegistry);\n private readonly sprite = inject(FoldIconSprite);\n\n /** The `#symbol` reference for `<use>`, or null when the name is unknown\n * (renders nothing). Pure — sprite population lives in the effect below. */\n readonly href = computed<string | null>(() =>\n this.registry.has(this.name()) ? `#${foldIconSymbolId(this.name())}` : null,\n );\n\n /** Resolves the size input to a CSS length string for `--icon-size`. */\n readonly sizeVar = computed<string>(() => {\n const s = this.size();\n return typeof s === \"number\" ? `${s}px` : SIZE_VAR[s];\n });\n\n constructor() {\n // Mount the shown icon's symbol in the shared sprite (a DOM side effect, so\n // it lives here and not in `href`), and warn on an unknown name. Reactive:\n // registering an icon later both mounts its symbol and resolves the `<use>`.\n effect(() => {\n const name = this.name();\n const markup = this.registry.resolve(name);\n if (markup) {\n this.sprite.ensure(name, markup);\n } else {\n console.warn(`[fold-icon] unknown icon: \"${name}\"`);\n }\n });\n }\n}\n","<svg\n class=\"icon-root\"\n role=\"img\"\n [attr.aria-label]=\"title() || null\"\n [attr.aria-hidden]=\"title() ? null : 'true'\"\n [style.--icon-size]=\"sizeVar()\"\n>\n @if (href(); as ref) {\n <use [attr.href]=\"ref\" />\n }\n</svg>\n","/**\n * The design tokens, as a typed source-of-truth.\n *\n * These lists are the CONTRACT. The token contract test asserts that the CSS\n * declares exactly these tokens — for colours, that the `:root` (dark) and\n * `[data-theme=\"lumen\"]` blocks each declare exactly the colour set (parity);\n * for scales, that `scales.css` declares exactly the radius/type steps. Add a\n * token here and to the CSS in the same change, or the test fails. That is how\n * the theme stays complete and drift-free.\n *\n * They also power typed `fold*Var` helpers so call sites get autocomplete and a\n * compile error on a misspelt token.\n */\nexport const FOLD_SEMANTIC_COLOR_TOKENS = [\n /* ── Surfaces ─────────────────────────────────────────────── */\n /** Page background — the surface behind everything. */\n \"bg-page\",\n /** Top header bar. */\n \"bg-header\",\n /** Rail 1 — the app menu. */\n \"bg-rail-primary\",\n /** Rail 2 — the workspace menu. */\n \"bg-rail-secondary\",\n /** Rail 3 — tertiary nav (e.g. a `fold-tab-nav` section sidebar). */\n \"bg-rail-tertiary\",\n\n /* ── Primary / accent ─────────────────────────────────────── */\n /** Primary / accent — brand teal (solid). */\n \"primary\",\n /** Primary in a hover/active state. */\n \"primary-strong\",\n /** Text or icon rendered on top of a solid `primary` fill. */\n \"on-primary\",\n /** Readable primary tint for text on a `primary-surface`. */\n \"primary-text\",\n /** Faint primary-tinted background (chips, highlights). */\n \"primary-surface\",\n /** Border for a `primary-surface`. */\n \"primary-border\",\n\n /* ── Info (purple) ────────────────────────────────────────── */\n \"info\",\n \"info-text\",\n \"info-surface\",\n \"info-border\",\n\n /* ── Warning (amber) ──────────────────────────────────────── */\n \"warning\",\n \"warning-text\",\n \"warning-surface\",\n \"warning-border\",\n\n /* ── Alert (red) ──────────────────────────────────────────── */\n \"alert\",\n \"alert-text\",\n \"alert-surface\",\n \"alert-border\",\n\n /* ── Success (green) ──────────────────────────────────────── */\n \"success\",\n \"success-text\",\n \"success-surface\",\n \"success-border\",\n\n /* ── Text ─────────────────────────────────────────────────── */\n /** Default body text. */\n \"text\",\n /** De-emphasised text. */\n \"text-secondary\",\n /** Faint / hint text. */\n \"text-muted\",\n /** Dimmest text — counts, hints. */\n \"text-faded\",\n\n /* ── Neutral surfaces + border ────────────────────────────── */\n /** Solid raised content surface (cards, panels). */\n \"surface-card\",\n /** Deeper solid surface for large containers (tables, page-level cards). */\n \"surface-sunken\",\n /** Faint tinted fill (idle chips, subtle rows). */\n \"surface-subtle\",\n /** Slightly stronger fill (raised). */\n \"surface-raised\",\n /** Solid raised hover surface (list rows, menu/tab items). */\n \"surface-hover\",\n /** Neutral hairline border. */\n \"border\",\n /** Fainter hairline — row dividers, subtle edges (below `border`). */\n \"border-subtle\",\n\n /* ── Glass ────────────────────────────────────────────────── */\n /** Translucent frosted overlay (panels, floating menus). */\n \"glass\",\n /** Hairline border on a glass surface. */\n \"glass-border\",\n\n /* ── Scrim ────────────────────────────────────────────────── */\n /** Darkening veil behind a modal layer (the mobile nav drawer). */\n \"scrim\",\n] as const;\n\nexport type FoldSemanticColorToken =\n (typeof FOLD_SEMANTIC_COLOR_TOKENS)[number];\n\n/** Border-radius scale. `lg` is a real large radius; `pill` is the capsule. */\nexport const FOLD_RADIUS_TOKENS = [\n \"xs\",\n \"sm\",\n \"md\",\n \"lg\",\n \"pill\",\n \"round\",\n] as const;\n\nexport type FoldRadiusToken = (typeof FOLD_RADIUS_TOKENS)[number];\n\n/** Type (font-size) scale. */\nexport const FOLD_TEXT_TOKENS = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nexport type FoldTextToken = (typeof FOLD_TEXT_TOKENS)[number];\n\n/** Icon-size scale — the length a `fold-icon` renders at, per size preset. */\nexport const FOLD_ICON_SIZE_TOKENS = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nexport type FoldIconSizeToken = (typeof FOLD_ICON_SIZE_TOKENS)[number];\n\n/** Space (gap / padding / margin) scale. */\nexport const FOLD_SPACE_TOKENS = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nexport type FoldSpaceToken = (typeof FOLD_SPACE_TOKENS)[number];\n\n/** Motion scale — `transition` shorthands (duration + easing). */\nexport const FOLD_MOTION_TOKENS = [\"fast\", \"base\", \"slow\"] as const;\n\nexport type FoldMotionToken = (typeof FOLD_MOTION_TOKENS)[number];\n\n/** Backdrop-blur radii (`--fold-blur-*`). */\nexport const FOLD_BLUR_TOKENS = [\"glass\"] as const;\n\nexport type FoldBlurToken = (typeof FOLD_BLUR_TOKENS)[number];\n\n/**\n * Elevation scale — full `box-shadow` values. The shared depth language: a\n * component never spells its own shadow, it names a level. Theme-invariant\n * (black ink via `color-mix`, which reads acceptably on both themes), so they\n * live with the scales. `panel-*` are the directional side-panel shadows.\n */\nexport const FOLD_SHADOW_TOKENS = [\n \"sm\",\n \"md\",\n \"lg\",\n \"panel-right\",\n \"panel-left\",\n] as const;\n\nexport type FoldShadowToken = (typeof FOLD_SHADOW_TOKENS)[number];\n\n/** The full custom-property name for a semantic colour token. */\nexport function foldColorProperty(token: FoldSemanticColorToken): string {\n return `--fold-color-${token}`;\n}\n\n/** A ready-to-use `var(--fold-color-…)` reference for a semantic colour token. */\nexport function foldColorVar(token: FoldSemanticColorToken): string {\n return `var(${foldColorProperty(token)})`;\n}\n\n/** A ready-to-use `var(--fold-radius-…)` reference. */\nexport function foldRadiusVar(token: FoldRadiusToken): string {\n return `var(--fold-radius-${token})`;\n}\n\n/** A ready-to-use `var(--fold-text-…)` reference. */\nexport function foldTextVar(token: FoldTextToken): string {\n return `var(--fold-text-${token})`;\n}\n\n/** A ready-to-use `var(--fold-icon-size-…)` reference. */\nexport function foldIconSizeVar(token: FoldIconSizeToken): string {\n return `var(--fold-icon-size-${token})`;\n}\n\n/** A ready-to-use `var(--fold-space-…)` reference. */\nexport function foldSpaceVar(token: FoldSpaceToken): string {\n return `var(--fold-space-${token})`;\n}\n\n/** A ready-to-use `var(--fold-motion-…)` reference. */\nexport function foldMotionVar(token: FoldMotionToken): string {\n return `var(--fold-motion-${token})`;\n}\n\n/** A ready-to-use `var(--fold-blur-…)` reference. */\nexport function foldBlurVar(token: FoldBlurToken): string {\n return `var(--fold-blur-${token})`;\n}\n\n/** A ready-to-use `var(--fold-shadow-…)` reference. */\nexport function foldShadowVar(token: FoldShadowToken): string {\n return `var(--fold-shadow-${token})`;\n}\n","import { Component, computed, input } from \"@angular/core\";\nimport { foldIconSizeVar } from \"../../../tokens/tokens.catalog\";\nimport type { FoldIconSizeToken } from \"../../../tokens/tokens.catalog\";\n\n/** Spinner size — an icon-size token (`xs…xl`) or an explicit pixel number. */\nexport type FoldSpinnerSize = FoldIconSizeToken | number;\n\n/**\n * `fold-spinner` — an indeterminate loading indicator: a rotating arc drawn in\n * `currentColor`, sized off the same scale as `fold-icon` so it drops into a\n * button in place of its glyph without shifting layout.\n *\n * Give it a `label` when it stands alone (it becomes `role=\"status\"` +\n * `aria-label`, so assistive tech announces the wait). Leave `label` unset when\n * it lives inside something that already announces busy-ness (a button with\n * `aria-busy`) — it then renders `aria-hidden`, purely decorative.\n *\n * Honours `prefers-reduced-motion`: the rotation stops and a fuller static ring\n * is shown instead, so the indicator still reads as \"busy\" without animating.\n *\n * @selector `fold-spinner`\n *\n * @example\n * ```html\n * <fold-spinner label=\"Loading contracts\" />\n * <fold-spinner size=\"sm\" /> <!-- decorative, inside a busy control -->\n * <fold-spinner [size]=\"18\" />\n * ```\n */\n@Component({\n selector: \"fold-spinner\",\n standalone: true,\n templateUrl: \"./spinner.component.html\",\n styleUrl: \"./spinner.component.scss\",\n host: {\n \"[style.--fold-spinner-size]\": \"sizeVar()\",\n \"[attr.role]\": \"label() ? 'status' : null\",\n \"[attr.aria-label]\": \"label() ?? null\",\n \"[attr.aria-hidden]\": \"label() ? null : 'true'\",\n },\n})\nexport class FoldSpinnerComponent {\n /** Size — an icon-size token (`xs…xl`, default `md`) or a pixel number. */\n readonly size = input<FoldSpinnerSize>(\"md\");\n\n /** Accessible label. Set → `role=\"status\"` + `aria-label`; unset → decorative. */\n readonly label = input<string>();\n\n /** Resolves the size to a CSS length for `--fold-spinner-size`. */\n readonly sizeVar = computed<string>(() => {\n const s = this.size();\n return typeof s === \"number\" ? `${s}px` : foldIconSizeVar(s);\n });\n}\n","<svg class=\"fold-spinner-svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle class=\"fold-spinner-track\" cx=\"12\" cy=\"12\" r=\"9\" />\n <circle class=\"fold-spinner-head\" cx=\"12\" cy=\"12\" r=\"9\" />\n</svg>\n","import {\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldIconSize } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type {\n FoldButtonEmphasis,\n FoldButtonIntent,\n FoldButtonShape,\n FoldButtonSize,\n} from \"./button.types\";\n\n/** Leading/trailing icon size, derived from the button `size`. */\nconst ICON_SIZE: Record<FoldButtonSize, FoldIconSize> = {\n sm: 14,\n md: 16,\n lg: 18,\n};\n\n/**\n * `[foldButton]` — the design-system button, applied to a **real** `<button>`\n * or `<a>` (never a custom tag). The host element stays a native control, so it\n * keeps everything the platform gives it: a `<button>` gets `type`/`disabled`\n * and form submission; an `<a>` gets `href`/`routerLink`/`target`. This mirrors\n * how Angular Material ships `matButton`, and it's why a \"link that looks like a\n * button\" needs no second component.\n *\n * The label is projected (text, icons, or both). `variant` + `size` + `shape`\n * apply as host classes so the surface stays token-only. Use native `(click)` —\n * on a disabled button the platform blocks it; on a disabled anchor the surface\n * is `pointer-events: none` and activation is prevented.\n *\n * @example\n * ```html\n * <button foldButton (click)=\"save()\">Save</button>\n * <button foldButton emphasis=\"outline\" intent=\"neutral\" size=\"sm\" (click)=\"cancel()\">Cancel</button>\n * <button foldButton emphasis=\"solid\" intent=\"danger\" (click)=\"delete()\">Delete</button>\n * <button foldButton [disabled]=\"!form.valid\" type=\"submit\">Submit</button>\n * <a foldButton emphasis=\"outline\" intent=\"neutral\" routerLink=\"/contracts\">Contracts</a>\n * ```\n *\n * A `foldButton` expects a **text label** (projected) for its accessible name.\n * For an icon-only affordance use `fold-button-icon` (which takes a `tooltip`);\n * the leading/trailing `icon` inputs here are decorations beside a label.\n *\n * @selector `button[foldButton], a[foldButton]`\n */\n@Component({\n selector: \"button[foldButton], a[foldButton]\",\n standalone: true,\n imports: [FoldIconComponent, FoldSpinnerComponent],\n templateUrl: \"./button.component.html\",\n styleUrl: \"./button.component.scss\",\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n \"[class]\":\n '\"fold-button \" + emphasis() + \" \" + intent() + \" \" + size() + \" \" + shape()',\n \"[class.block]\": \"block()\",\n \"[class.is-disabled]\": \"disabled()\",\n \"[class.is-loading]\": \"loading()\",\n // Loading blocks interaction like disabled, but keeps the surface lit (spinner\n // shown) rather than dimmed. <button> takes native disabled + type; <a> can't,\n // so it gets the ARIA equivalents (the surface is pointer-events:none either way).\n \"[attr.disabled]\": \"isButton && blocked() ? true : null\",\n \"[attr.type]\": \"isButton ? type() : null\",\n \"[attr.aria-disabled]\": \"!isButton && blocked() ? true : null\",\n \"[attr.aria-busy]\": \"loading() ? true : null\",\n \"[attr.tabindex]\": \"!isButton && blocked() ? -1 : null\",\n \"(click)\": \"onClick($event)\",\n },\n})\nexport class FoldButtonComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** True when the host is a `<button>` (vs an `<a>`) — fixed for the element's life. */\n protected readonly isButton =\n this.host.nativeElement.tagName.toLowerCase() === \"button\";\n\n /**\n * Fill level — `soft` (default, tinted surface) · `solid` (filled) · `outline`\n * (transparent + hairline). The *how loud* axis; pair with {@link intent}.\n */\n readonly emphasis = input<FoldButtonEmphasis>(\"soft\");\n\n /**\n * Semantic intent — `primary` (default, accent) · `neutral` · `warning` ·\n * `danger`. The *what it means* axis. Orthogonal to {@link emphasis}, so e.g.\n * `emphasis=\"solid\" intent=\"danger\"` is a filled destructive button.\n */\n readonly intent = input<FoldButtonIntent>(\"primary\");\n\n /** Size preset controlling font-size, padding, and radius. */\n readonly size = input<FoldButtonSize>(\"md\");\n\n /** Corner shape — `rounded` (default) or `pill` (fully rounded). */\n readonly shape = input<FoldButtonShape>(\"rounded\");\n\n /** Stretch to fill the container's width (block-level) instead of hugging its label. */\n readonly block = input(false, { transform: booleanAttribute });\n\n /**\n * Leading icon — a shorthand for the common \"icon + label\" button. The size\n * is derived from {@link size}, so it stays consistent. For anything else\n * (trailing content, custom markup) project it instead.\n */\n readonly icon = input<FoldIconName>();\n /** Trailing icon (after the label). */\n readonly iconTrailing = input<FoldIconName>();\n\n /** Icon size for {@link icon} / {@link iconTrailing}, from the button size. */\n readonly iconSize = computed<FoldIconSize>(() => ICON_SIZE[this.size()]);\n\n /**\n * Native `type` of the host — only meaningful on a `<button>` (ignored on an\n * `<a>`). Defaults to `button` so a form-embedded button never submits by\n * accident.\n */\n readonly type = input<\"button\" | \"submit\" | \"reset\">(\"button\");\n\n /** Disable the control — dims it and blocks activation (native on a button, ARIA on an anchor). */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Show a spinner in place of the leading icon and go busy: blocks activation\n * and sets `aria-busy`, but keeps the surface lit (not dimmed like `disabled`).\n * The spinner is icon-sized, so the button width doesn't jump.\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Interaction is blocked while disabled OR loading. */\n protected readonly blocked = computed(\n () => this.disabled() || this.loading(),\n );\n\n /** Swallow activation while blocked (covers keyboard-activated anchors). */\n onClick(event: Event): void {\n if (this.blocked()) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n","@if (loading()) {\n <fold-spinner [size]=\"iconSize()\" aria-hidden=\"true\" />\n} @else if (icon(); as ic) {\n <fold-icon [name]=\"ic\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n}\n<ng-content />\n@if (iconTrailing(); as ic) {\n <fold-icon [name]=\"ic\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n}\n","import {\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldIconSize } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type {\n FoldButtonIconShape,\n FoldButtonIconSize,\n FoldButtonIconTone,\n} from \"./button-icon.types\";\n\n/**\n * `<fold-button-icon>` — the icon-only **momentary** button: a one-shot action\n * whose label is the icon (toolbars, transport, inline row actions, carets, …).\n * It never claims a pressed state — no `aria-pressed` — so assistive tech reads\n * it as a plain button. For a binary on/off control (mute, mask, pin), use\n * `fold-toggle-icon`. For a button with text, use `fold-button`.\n *\n * `shape` / `size` / `tone` surface as `data-*` attributes so the token-only\n * SCSS targets them (the surface is shared with `fold-toggle-icon`). A `tooltip`\n * sets both `title` and `aria-label` — strongly recommended, since there is no\n * visible label.\n *\n * @example\n * ```html\n * <fold-button-icon icon=\"edit\" tooltip=\"Edit\" (clicked)=\"edit()\" />\n * <fold-button-icon icon=\"play\" shape=\"round\" tone=\"accent\" size=\"lg\" (clicked)=\"play()\" />\n * <fold-button-icon icon=\"bin\" tone=\"critical\" tooltip=\"Delete\" (clicked)=\"delete()\" />\n * ```\n *\n * @selector `fold-button-icon`\n */\n@Component({\n selector: \"fold-button-icon\",\n standalone: true,\n imports: [FoldIconComponent, FoldSpinnerComponent],\n templateUrl: \"./button-icon.component.html\",\n styleUrl: \"./button-icon.component.scss\",\n host: {\n \"[attr.data-shape]\": \"shape()\",\n \"[attr.data-size]\": \"size()\",\n \"[attr.data-tone]\": \"tone()\",\n \"[attr.data-loading]\": \"loading() ? '' : null\",\n },\n})\nexport class FoldButtonIconComponent {\n /** Icon to render (typed against the registry). */\n readonly icon = input.required<FoldIconName>();\n\n /** Surface shape — `square` (default) or `round` (transport, big actions). */\n readonly shape = input<FoldButtonIconShape>(\"square\");\n\n /** Hit-area preset — `xs` 22px · `sm` 28px · `md` 32px (default) · `lg` 38px. */\n readonly size = input<FoldButtonIconSize>(\"md\");\n\n /** Visual tone — `ghost` (default) · `accent` (filled) · `critical` (alert). */\n readonly tone = input<FoldButtonIconTone>(\"ghost\");\n\n /** Disable the button — dims it and blocks pointer events. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Swap the icon for a spinner and go busy — blocks activation, stays lit. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Tooltip text — sets both `title` and `aria-label`. Strongly recommended. */\n readonly tooltip = input<string>();\n\n /** Native `type` of the inner `<button>`. */\n readonly type = input<\"button\" | \"submit\">(\"button\");\n\n /** Emitted on click (passes the native `MouseEvent`). */\n readonly clicked = output<MouseEvent>();\n\n /** Resolves the icon size from the button size preset. */\n readonly iconSize = computed<FoldIconSize>(() => {\n switch (this.size()) {\n case \"xs\":\n return \"xs\"; // 12px\n case \"sm\":\n return \"sm\"; // 16px\n case \"md\":\n return \"sm\"; // 16px in a 32px hit-area\n case \"lg\":\n return \"md\"; // 20px in a 38px hit-area\n }\n });\n\n onClick(e: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n return;\n }\n this.clicked.emit(e);\n }\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.title]=\"tooltip() || null\"\n [attr.aria-label]=\"tooltip() || null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (click)=\"onClick($event)\"\n>\n @if (loading()) {\n <fold-spinner [size]=\"iconSize()\" aria-hidden=\"true\" />\n } @else {\n <fold-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n }\n</button>\n","import {\n Component,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldIconSize } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type {\n FoldButtonIconShape,\n FoldButtonIconSize,\n FoldButtonIconTone,\n} from \"../button-icon/button-icon.types\";\n\n/**\n * `<fold-toggle-icon>` — the icon-only **toggle** button: a binary on/off\n * control whose label is the icon (mute, mask, pin, loop, show/hide). It renders\n * a pressed surface while on and **always** carries `aria-pressed` (`true`/\n * `false`), so assistive tech announces it as a toggle. Two-way bind the state\n * with `[(active)]`. For a one-shot action (delete, play-once, open), use\n * `fold-button-icon` — a momentary button that never claims a pressed state.\n *\n * Shares the icon-button surface (shape / size / tone) with `fold-button-icon`;\n * the two differ only in semantics, so their `shape` / `size` / `tone` inputs\n * and types are identical.\n *\n * @example\n * ```html\n * <fold-toggle-icon icon=\"eye\" tooltip=\"Toggle mask\" [(active)]=\"masked\" />\n * <fold-toggle-icon icon=\"repeat\" tooltip=\"Loop\" [(active)]=\"looping\" />\n * ```\n *\n * @selector `fold-toggle-icon`\n */\n@Component({\n selector: \"fold-toggle-icon\",\n standalone: true,\n imports: [FoldIconComponent, FoldSpinnerComponent],\n templateUrl: \"./toggle-icon.component.html\",\n styleUrl: \"./toggle-icon.component.scss\",\n host: {\n \"[attr.data-shape]\": \"shape()\",\n \"[attr.data-size]\": \"size()\",\n \"[attr.data-tone]\": \"tone()\",\n \"[attr.data-active]\": 'active() ? \"\" : null',\n \"[attr.data-loading]\": \"loading() ? '' : null\",\n },\n})\nexport class FoldToggleIconComponent {\n /** Icon to render (typed against the registry). */\n readonly icon = input.required<FoldIconName>();\n\n /** Surface shape — `square` (default) or `round`. */\n readonly shape = input<FoldButtonIconShape>(\"square\");\n\n /** Hit-area preset — `xs` 22px · `sm` 28px · `md` 32px (default) · `lg` 38px. */\n readonly size = input<FoldButtonIconSize>(\"md\");\n\n /** Visual tone — `ghost` (default) · `accent` · `critical`. */\n readonly tone = input<FoldButtonIconTone>(\"ghost\");\n\n /** Two-way toggle state — renders pressed and drives `aria-pressed`. */\n readonly active = model<boolean>(false);\n\n /** Disable the button — dims it and blocks pointer events. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Swap the icon for a spinner and go busy — blocks toggling, stays lit. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Tooltip text — sets both `title` and `aria-label`. Strongly recommended. */\n readonly tooltip = input<string>();\n\n /** Native `type` of the inner `<button>`. */\n readonly type = input<\"button\" | \"submit\">(\"button\");\n\n /** Emitted on toggle (passes the native `MouseEvent`), after `active` flips. */\n readonly toggled = output<MouseEvent>();\n\n /** Resolves the icon size from the button size preset. */\n readonly iconSize = computed<FoldIconSize>(() => {\n switch (this.size()) {\n case \"xs\":\n return \"xs\"; // 12px\n case \"sm\":\n return \"sm\"; // 16px\n case \"md\":\n return \"sm\"; // 16px in a 32px hit-area\n case \"lg\":\n return \"md\"; // 20px in a 38px hit-area\n }\n });\n\n onClick(e: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n return;\n }\n this.active.update((v) => !v);\n this.toggled.emit(e);\n }\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.title]=\"tooltip() || null\"\n [attr.aria-label]=\"tooltip() || null\"\n [attr.aria-pressed]=\"active() ? 'true' : 'false'\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (click)=\"onClick($event)\"\n>\n @if (loading()) {\n <fold-spinner [size]=\"iconSize()\" aria-hidden=\"true\" />\n } @else {\n <fold-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n }\n</button>\n","import { booleanAttribute, Component, input } from \"@angular/core\";\n\n/**\n * `<fold-card>` — the canonical raised content surface: a solid\n * `surface-card` background, a hairline border and a consistent radius. Use it\n * anywhere the app would otherwise hand-roll a `background + border +\n * border-radius` block, so cards never drift on colour or corner.\n *\n * - `surface` — `card` (the raised card tint, default) · `sunken` (a deeper\n * surface for large containers, below the card — the ref's second card tint;\n * pairs with a fainter `border-subtle` hairline).\n * - `radius` — `lg` (14px, default) · `md` · `sm`.\n * - `padding` — `md` (16px, default) · `none` · `sm` · `lg`. Sets the *body*\n * padding; override with a custom value via `--fold-card-padding`.\n * - `interactive` — adds a hover lift (for clickable cards).\n * - `separators` — draw a hairline between a projected header/footer and the body.\n * - `raisedBands` — tint the header/footer bands a step above the surface\n * (fainter on `sunken`).\n *\n * Content projection:\n * - default slot → the card body.\n * - `[cardHeader]` → an optional header band above the body.\n * - `[cardFooter]` → an optional footer band below the body.\n *\n * The card is a flex column of three regions: the body always owns the `padding`,\n * the header/footer carry their own (independent) chrome padding, and the host\n * never pads. So the content padding is identical whether or not the bands show —\n * toggling a header/footer never shifts the body.\n *\n * ```html\n * <fold-card>Static content</fold-card>\n * <fold-card surface=\"sunken\" padding=\"lg\">Deep container</fold-card>\n * <fold-card separators>\n * <h3 cardHeader>Title</h3>\n * Body content\n * <div cardFooter>Actions</div>\n * </fold-card>\n * ```\n *\n * Sizing / escape hatches (CSS custom properties):\n * `--fold-card-padding` overrides the body padding; `--fold-card-overflow`\n * (default `clip`) lets content escape the rounded corners.\n *\n * @selector `fold-card`\n */\n@Component({\n selector: \"fold-card\",\n standalone: true,\n host: {\n \"[class.s-sunken]\": \"surface() === 'sunken'\",\n \"[class.r-sm]\": \"radius() === 'sm'\",\n \"[class.r-md]\": \"radius() === 'md'\",\n \"[class.p-none]\": \"padding() === 'none'\",\n \"[class.p-sm]\": \"padding() === 'sm'\",\n \"[class.p-lg]\": \"padding() === 'lg'\",\n \"[class.is-interactive]\": \"interactive()\",\n \"[class.has-sep]\": \"separators()\",\n \"[class.raised-bands]\": \"raisedBands()\",\n },\n templateUrl: \"./card.component.html\",\n styleUrl: \"./card.component.scss\",\n})\nexport class FoldCardComponent {\n /** Surface tint — `card` (raised, default) or `sunken` (deeper container). */\n readonly surface = input<\"card\" | \"sunken\">(\"card\");\n /** Corner radius — `lg` (default), `md`, or `sm`. */\n readonly radius = input<\"sm\" | \"md\" | \"lg\">(\"lg\");\n /** Body padding — `md` (default), `none`, `sm`, or `lg`; a custom value can be\n * set with the `--fold-card-padding` CSS variable. */\n readonly padding = input<\"none\" | \"sm\" | \"md\" | \"lg\">(\"md\");\n /** Add a hover lift for clickable cards. */\n readonly interactive = input(false);\n /** Draw a hairline between a projected header/footer and the body. */\n readonly separators = input(false, { transform: booleanAttribute });\n /** Lift the header/footer bands with a subtle raised tint over the card\n * surface (fainter on `sunken`), to set the chrome apart from the body. */\n readonly raisedBands = input(false, { transform: booleanAttribute });\n}\n","<header class=\"card-header\"><ng-content select=\"[cardHeader]\" /></header>\n<div class=\"card-body\"><ng-content /></div>\n<footer class=\"card-footer\"><ng-content select=\"[cardFooter]\" /></footer>\n","import { Component, computed, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-element-title>` — the label that heads a section, card or panel. Fully\n * input-driven (title / subtitle / icon), so a header is never hand-rolled and\n * the common case is a self-closing tag.\n *\n * Variants (emphasis):\n * - `eyebrow` (default) — 10px, muted, uppercase. Inline section label.\n * - `bar` — 11px, secondary, uppercase. For a divider header bar.\n * - `title` — normal-case, `text-md`, primary. A card/panel heading; a leading\n * `icon` renders in a tile whose tone is set by `iconTone`\n * (`neutral` raised · `primary` filled brand · `faded` dim).\n *\n * A trailing action (edit/add button, lock badge) projects into `[titleAction]`,\n * right-aligned. The title — not the action — is the heading for assistive tech.\n *\n * @selector `fold-element-title`\n *\n * @example\n * ```html\n * <fold-element-title title=\"Documents\" variant=\"bar\" />\n * <fold-element-title variant=\"title\" icon=\"company\" title=\"Contexte\" subtitle=\"Activité de l'espace\" />\n * <fold-element-title title=\"Poste\">\n * <button titleAction (click)=\"edit()\">✎</button>\n * </fold-element-title>\n * ```\n */\n@Component({\n selector: \"fold-element-title\",\n standalone: true,\n imports: [FoldIconComponent],\n host: {\n \"[class.v-bar]\": \"variant() === 'bar'\",\n \"[class.v-title]\": \"variant() === 'title'\",\n \"[class.it-primary]\": \"iconTone() === 'primary'\",\n \"[class.it-faded]\": \"iconTone() === 'faded'\",\n },\n templateUrl: \"./element-title.component.html\",\n styleUrl: \"./element-title.component.scss\",\n})\nexport class FoldElementTitleComponent {\n /** Leading icon glyph (raised tile in the `title` variant). */\n readonly icon = input<FoldIconName>();\n /** Icon tile tone (title variant) — `neutral` (raised), `primary` (filled brand), `faded` (dim). */\n readonly iconTone = input<\"neutral\" | \"primary\" | \"faded\">(\"neutral\");\n /** The heading text. */\n readonly title = input.required<string>();\n /** Optional secondary line under the title. */\n readonly subtitle = input<string>();\n /** Emphasis — `eyebrow` (10px muted), `bar` (11px secondary), `title` (text-md, normal-case). */\n readonly variant = input<\"eyebrow\" | \"bar\" | \"title\">(\"eyebrow\");\n /** Heading outline depth exposed to assistive tech (`aria-level`). */\n readonly level = input(2);\n /** Optional `id` on the heading span, so a container can name a region with\n * `aria-labelledby` (e.g. a `fold-page-section`'s `<section>`). */\n readonly headingId = input<string>();\n\n protected readonly iconSize = computed(() =>\n this.variant() === \"title\" ? \"md\" : \"sm\",\n );\n}\n","@if (icon(); as ic) {\n <span class=\"et-icon\"><fold-icon [name]=\"ic\" [size]=\"iconSize()\" /></span>\n}\n<span class=\"et-main\">\n <span class=\"et-row\">\n <span\n class=\"et-label\"\n role=\"heading\"\n [attr.id]=\"headingId()\"\n [attr.aria-level]=\"level()\"\n >{{ title() }}</span\n >\n <span class=\"et-action\"><ng-content select=\"[titleAction]\" /></span>\n </span>\n @if (subtitle(); as s) {\n <span class=\"et-sub\">{{ s }}</span>\n }\n</span>\n","import { Component, input } from \"@angular/core\";\nimport { FoldCardComponent } from \"../../content/card/card.component\";\nimport { FoldElementTitleComponent } from \"../../content/element-title/element-title.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-context-card>` — a titled info card in three zones: a **header** (a\n * raised icon tile + title + subtitle), a **body** (the projected content — e.g.\n * label/value rows), and an optional **footer** action. Composes\n * {@link FoldCardComponent} for the surface, so it never re-rolls a card.\n *\n * - `icon` / `title` / `subtitle` — the header. `title` is required.\n * - default slot → the body.\n * - `[footer]` slot → a footer action (e.g. an `<fold-link>`); the footer and its\n * divider are hidden when nothing is projected.\n *\n * @selector `fold-context-card`\n *\n * @example\n * ```html\n * <fold-context-card icon=\"company\" title=\"Contexte\" subtitle=\"Activité de l'espace\">\n * <div class=\"row\">…</div>\n * <fold-link footer icon=\"company\" (clicked)=\"openOrg()\">Voir l'organigramme</fold-link>\n * </fold-context-card>\n * ```\n */\n@Component({\n selector: \"fold-context-card\",\n standalone: true,\n imports: [FoldCardComponent, FoldElementTitleComponent],\n templateUrl: \"./context-card.component.html\",\n styleUrl: \"./context-card.component.scss\",\n})\nexport class FoldContextCardComponent {\n /** Header icon glyph. */\n readonly icon = input<FoldIconName>();\n /** Icon tile tone — `primary` (filled brand, default), `neutral` (raised), `faded` (dim). */\n readonly iconTone = input<\"neutral\" | \"primary\" | \"faded\">(\"primary\");\n /** Header title. */\n readonly title = input.required<string>();\n /** Optional line under the title. */\n readonly subtitle = input<string>();\n}\n","<fold-card padding=\"none\">\n <div class=\"cc-head\">\n <fold-element-title\n variant=\"title\"\n [level]=\"3\"\n [icon]=\"icon()\"\n [iconTone]=\"iconTone()\"\n [title]=\"title()\"\n [subtitle]=\"subtitle()\"\n />\n </div>\n <div class=\"cc-body\"><ng-content /></div>\n <div class=\"cc-foot\"><ng-content select=\"[footer]\" /></div>\n</fold-card>\n","import { Directive, inject } from \"@angular/core\";\nimport { FoldIdService } from \"./id.service\";\n\n/**\n * Auto-assigns a unique, SSR-safe `id` to any native form control (`<input>`,\n * `<select>`, `<textarea>`) that has neither an `id` nor a `name`.\n *\n * You don't write `foldFieldId` on elements — the directive **auto-applies** by\n * selector. Add it to a component's `imports` once and every unidentified native\n * control in that component's template is fixed in one go, with no per-element\n * edit. It silences the browser's *\"A form field element should have an id or\n * name attribute\"* warning (autofill + accessibility), and the id it sets can be\n * targeted by a `<label for>`.\n *\n * The selector matches only controls missing **both** `id` and `name` — static\n * or bound (`[id]`/`[attr.id]`/`[name]` all count as present) — so it never\n * fights a control you've already identified. Components that render their own\n * labelled control ({@link FoldInputComponent}, `fold-select`) own their id\n * explicitly and are unaffected.\n */\n@Directive({\n selector:\n \"input:not([id]):not([name]),select:not([id]):not([name]),textarea:not([id]):not([name])\",\n standalone: true,\n host: { \"[id]\": \"autoId\" },\n})\nexport class FoldFieldIdDirective {\n /** Assigned once at construction, in deterministic render order (SSR-safe). */\n protected readonly autoId = inject(FoldIdService).next(\"fold-field\");\n}\n","import type { ElementRef } from \"@angular/core\";\nimport { Component, input, output, signal, viewChild } from \"@angular/core\";\nimport { FoldFieldIdDirective } from \"../../../a11y/field-id.directive\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * `<fold-file-dropzone>` — a file-picker dropzone: drag-over visuals, keyboard\n * activation, the hidden `<input type=\"file\">` plumbing, and it emits the picked\n * `File[]`. Presentational — it never talks to the network; the consumer decides\n * what to do with the files (upload now, buffer locally, …).\n *\n * Belongs to the **form** family, not the text-input family: it's a whole\n * drop-target affordance, not a labelled box, so it doesn't compose\n * `fold-input-base`.\n *\n * @selector `fold-file-dropzone`\n *\n * @example\n * ```html\n * <fold-file-dropzone\n * accept=\".pdf,.png\"\n * [hint]=\"'Max 5 Mo'\"\n * (filesPicked)=\"onFiles($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-file-dropzone\",\n standalone: true,\n imports: [FoldFieldIdDirective, FoldIconComponent],\n templateUrl: \"./file-dropzone.component.html\",\n styleUrl: \"./file-dropzone.component.scss\",\n})\nexport class FoldFileDropzoneComponent {\n /** Comma-separated MIME or extension filter passed to the input. */\n readonly accept = input<string>(\"\");\n /** Multi-file pick. Defaults to true — the consumer can cap on its end. */\n readonly multiple = input<boolean>(true);\n /** Primary line of copy. */\n readonly label = input<string>(\"Glissez un fichier ou parcourez\");\n /** Smaller helper line under the label (size limit, count remaining, …). */\n readonly hint = input<string | null>(null);\n /** Pending state — disables interaction and swaps the copy for a loading message. */\n readonly busy = input<boolean>(false);\n /** Loading message displayed while `busy` is true. */\n readonly busyLabel = input<string>(\"Téléversement en cours…\");\n /** Fully disable the dropzone (e.g. cap reached). */\n readonly disabled = input<boolean>(false);\n\n /** Emits the picked files (from browse or drop). */\n readonly filesPicked = output<File[]>();\n\n private readonly fileInput =\n viewChild.required<ElementRef<HTMLInputElement>>(\"fileInput\");\n\n /** Whether a drag is currently hovering the zone (drives the `.over` state). */\n readonly isDragOver = signal(false);\n\n openFilePicker(): void {\n if (this.disabled() || this.busy()) {\n return;\n }\n this.fileInput().nativeElement.click();\n }\n\n onFilesSelected(target: EventTarget | null): void {\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n if (!target.files || target.files.length === 0) {\n return;\n }\n this.filesPicked.emit(Array.from(target.files));\n // Reset so re-picking the same file fires `change` again.\n target.value = \"\";\n }\n\n onDragOver(event: DragEvent): void {\n if (this.disabled() || this.busy()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n onDragLeave(): void {\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver.set(false);\n if (this.disabled() || this.busy()) {\n return;\n }\n const files = event.dataTransfer?.files;\n if (!files || files.length === 0) {\n return;\n }\n this.filesPicked.emit(Array.from(files));\n }\n}\n","<div\n class=\"dropzone\"\n [class.over]=\"isDragOver()\"\n [class.busy]=\"busy()\"\n [class.disabled]=\"disabled()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-disabled]=\"disabled() || busy()\"\n (click)=\"openFilePicker()\"\n (keydown.enter)=\"openFilePicker()\"\n (keydown.space)=\"openFilePicker(); $event.preventDefault()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave()\"\n (drop)=\"onDrop($event)\"\n>\n <fold-icon name=\"upload\" [size]=\"22\" />\n @if (busy()) {\n <span class=\"label\">{{ busyLabel() }}</span>\n } @else {\n <span class=\"label\">{{ label() }}</span>\n @if (hint(); as h) {\n <small class=\"hint\">{{ h }}</small>\n }\n }\n <input\n #fileInput\n type=\"file\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled() || busy()\"\n hidden\n (change)=\"onFilesSelected($event.target)\"\n />\n</div>\n","import { Component } from \"@angular/core\";\n\n/**\n * `<fold-field-list>` — the read-only counterpart of a form: a description list\n * (`<dl>`) of label/value pairs. It's what fills the *display* side of a detail\n * page (the recap), where `fold-input` fills the *edit* side. Nothing here is\n * interactive — it renders values you already know, not fields you type into.\n *\n * Put {@link FoldFieldComponent} children inside it:\n *\n * ```html\n * <fold-field-list>\n * <fold-field label=\"Contract type\">CDI</fold-field>\n * <fold-field label=\"Job title\" [empty]=\"!c.jobTitle\">{{ c.jobTitle }}</fold-field>\n * <fold-field label=\"Compensation\">\n * <span class=\"chip\">{{ c.salary }}</span>\n * </fold-field>\n * </fold-field-list>\n * ```\n *\n * **Why a component and not a mixin:** it guarantees the real semantics —\n * `dl > dt > dd`, so screen readers announce each value as the definition of its\n * label. A copy-pasted `div > span + span` (what every detail page hand-rolls)\n * looks the same but is an accessibility dead end; a mixin can't fix the markup.\n *\n * **How the encapsulation is kept clean (no `::ng-deep`):** the list owns *all*\n * the layout — the `<dl>` is a two-column grid (`label | value`), and a grid\n * positions its items *by their place in the box tree*, not by a selector that\n * has to match them. The `dt`/`dd` are contributed by each `fold-field`\n * (`display: contents`), yet the grid still lays them out. Appearance (type,\n * colour, the empty state) lives on the field, where the elements are declared.\n * Layout at the container, style at the cell — neither reaches across the wall.\n *\n * Zero-input theming via CSS custom properties on the host:\n * `--fold-field-list-label-width` (160px — the fixed label column) ·\n * `--fold-field-list-col-gap` (16px, label→value) ·\n * `--fold-field-list-row-gap` (10px, between rows). Shrink the label width when\n * the list sits in a narrow rail.\n *\n * @selector `fold-field-list`\n */\n@Component({\n selector: \"fold-field-list\",\n standalone: true,\n templateUrl: \"./field-list.component.html\",\n styleUrl: \"./field-list.component.scss\",\n})\nexport class FoldFieldListComponent {}\n","<dl class=\"fl\">\n <ng-content />\n</dl>\n","import { booleanAttribute, Component, input } from \"@angular/core\";\n\n/**\n * `<fold-field>` — one read-only label/value pair inside a\n * {@link FoldFieldListComponent}. It renders a `<dt>` (the {@link label}) and a\n * `<dd>` (the value, projected), so the pair is a real term/definition a screen\n * reader announces together.\n *\n * **This is not `fold-input`.** They are the two opposite halves of a record:\n * `fold-input` is *edit* mode — a control you focus and type into, bound to a\n * Signal Form field. `fold-field` is *read* mode — a value already known, shown\n * as text. A read-only input would still be a heavyweight control (border,\n * focus, keyboard) pretending to be static; a field is just `dt`/`dd`.\n *\n * The value is the default slot, so it takes rich content (chips, links, an\n * icon), not only a string:\n *\n * ```html\n * <fold-field label=\"Job title\">{{ c.jobTitle }}</fold-field>\n * <fold-field label=\"Status\"><span class=\"chip\">Active</span></fold-field>\n * <fold-field label=\"End date\" [empty]=\"!c.endDate\">{{ c.endDate | date }}</fold-field>\n * ```\n *\n * Missing values are a first-class state: set {@link empty} and the field shows\n * the {@link placeholder} (`—` by default) in a muted italic instead of the\n * projected content — so the caller writes the toggle once (`[empty]=\"!value\"`)\n * rather than repeating a `{{ value || '—' }}` fallback and a class binding at\n * every site.\n *\n * The host is `display: contents`: the `dt`/`dd` it renders become direct\n * children of the list's `<dl>` grid, which is what lets the list lay them out\n * without reaching through view encapsulation. Appearance (type scale, colour,\n * the empty style) is owned here; the grid geometry is owned by the list.\n *\n * @selector `fold-field`\n */\n@Component({\n selector: \"fold-field\",\n standalone: true,\n templateUrl: \"./field.component.html\",\n styleUrl: \"./field.component.scss\",\n})\nexport class FoldFieldComponent {\n /** The term — rendered as the `<dt>` label (small, uppercase, muted). */\n readonly label = input.required<string>();\n\n /**\n * Mark the value as absent. When `true`, the field shows {@link placeholder}\n * in a muted italic and ignores the projected content — the single source of\n * truth for \"no value\" so callers don't hand-roll a fallback + a class each\n * time.\n */\n readonly empty = input(false, { transform: booleanAttribute });\n\n /** What to show in place of an {@link empty} value. */\n readonly placeholder = input(\"—\");\n}\n","<dt class=\"fl-key\">{{ label() }}</dt>\n@if (empty()) {\n <dd class=\"fl-val fl-empty\">{{ placeholder() }}</dd>\n} @else {\n <dd class=\"fl-val\"><ng-content /></dd>\n}\n","import { booleanAttribute, Component, input, output } from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-link>` — an inline text link / link-button: accent-coloured, underline\n * on hover, with optional leading + trailing icons (a nav chevron, an external\n * glyph). Renders an `<a>` when given `href`, otherwise a `<button>` that emits\n * `(clicked)` — so the same look serves both navigation and in-app actions.\n *\n * - `tone` — `accent` (default, brand link) · `muted` (secondary).\n * - `icon` / `trailingIcon` — optional glyphs around the label.\n * - `disabled` — button mode only.\n *\n * @selector `fold-link`\n *\n * @example\n * ```html\n * <fold-link icon=\"company\" trailingIcon=\"chevron-right\" (clicked)=\"openOrg()\">\n * Voir l'organigramme\n * </fold-link>\n * <fold-link href=\"https://sh3pherd.dev/docs\" tone=\"muted\">Documentation</fold-link>\n * ```\n */\n@Component({\n selector: \"fold-link\",\n standalone: true,\n imports: [NgTemplateOutlet, FoldIconComponent],\n host: { \"[class.tone-muted]\": \"tone() === 'muted'\" },\n templateUrl: \"./link.component.html\",\n styleUrl: \"./link.component.scss\",\n})\nexport class FoldLinkComponent {\n /** Leading icon glyph. */\n readonly icon = input<FoldIconName>();\n /** Trailing icon glyph (e.g. a nav chevron). */\n readonly trailingIcon = input<FoldIconName>();\n /** Colour role — `accent` (default) or `muted`. */\n readonly tone = input<\"accent\" | \"muted\">(\"accent\");\n /** When set, the link renders as an `<a href>` instead of a button. */\n readonly href = input<string>();\n /** Disable the button form (no effect on the `href` form). */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Fires on click in the button form. */\n readonly clicked = output();\n}\n","<ng-template #inner>\n @if (icon(); as i) {\n <fold-icon [name]=\"i\" size=\"sm\" />\n }\n <span class=\"lnk-label\"><ng-content /></span>\n @if (trailingIcon(); as t) {\n <fold-icon [name]=\"t\" size=\"sm\" />\n }\n</ng-template>\n@if (href(); as h) {\n <a class=\"lnk\" [href]=\"h\">\n <ng-container [ngTemplateOutlet]=\"inner\" />\n </a>\n} @else {\n <button\n type=\"button\"\n class=\"lnk\"\n [disabled]=\"disabled()\"\n (click)=\"clicked.emit()\"\n >\n <ng-container [ngTemplateOutlet]=\"inner\" />\n </button>\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * How menu items colour on hover and when active:\n * - `follow` — take the enclosing section's colour (falls back to neutral for\n * section-less items, e.g. the footer).\n * - `neutral` — a plain grey tint, no accent.\n * - `primary` — the app's primary accent.\n */\nexport type FoldMenuTint = \"follow\" | \"neutral\" | \"primary\";\n\n/**\n * The rail's depth in the shell hierarchy — picks its background tint so a\n * primary rail and a secondary (e.g. workspace) rail read as different layers:\n * `primary` (default) · `secondary` · `tertiary`.\n */\nexport type FoldMenuLevel = \"primary\" | \"secondary\" | \"tertiary\";\n\n/**\n * Where the collapse toggle sits. `auto` follows band presence (first in the\n * footer, else last in the header, else last in the body); the others pin it to\n * a specific band.\n */\nexport type FoldMenuTogglePlacement = \"auto\" | \"footer\" | \"header\" | \"body\";\n\n/**\n * `<fold-menu>` — a vertical icon navigation rail (the app's primary menu shell).\n *\n * Structural + presentational: it owns the rail column, its top/body/bottom\n * bands and the tooltip escape (`overflow: visible`); the app fills the slots\n * and keeps all routing, auth and data. Sits inside the shell's `railPrimary`.\n *\n * ## Options\n * - `collapsible` — render a chevron toggle that flips `expanded`.\n * - `expanded` (two-way) — `false` (default) is the icon rail: items are\n * icon-only with hover tooltips. `true` widens the rail and items + separators\n * show their labels inline. Drive it yourself (`[expanded]`) or let the toggle.\n *\n * ## Slots\n * | Attribute | Band |\n * |-------------|-------------------------------------------------------------|\n * | `header` | Top — brand, workspace launcher, dividers. |\n * | *(default)* | The nav items — `[fold-menu-item]` + `<fold-menu-separator>`. |\n * | `footer` | Bottom (pinned) — secondary actions, account. Hidden when empty. |\n *\n * @selector `fold-menu`\n *\n * @example\n * ```html\n * <fold-menu collapsible [(expanded)]=\"open()\">\n * <div header>…brand…</div>\n * <fold-menu-separator label=\"Workspace\" color=\"#7c5bbf\" />\n * <a fold-menu-item [icon]=\"i.icon\" [label]=\"i.label\"\n * [routerLink]=\"i.route\" routerLinkActive #r=\"routerLinkActive\"\n * [active]=\"r.isActive\"></a>\n * <div footer>…account…</div>\n * </fold-menu>\n * ```\n */\n@Component({\n selector: \"fold-menu\",\n standalone: true,\n imports: [FoldIconComponent, NgTemplateOutlet],\n templateUrl: \"./menu.component.html\",\n styleUrl: \"./menu.component.scss\",\n host: {\n \"[class.expanded]\": \"expanded()\",\n \"[attr.data-tint]\": \"tint()\",\n \"[attr.data-level]\": \"level()\",\n },\n})\nexport class FoldMenuComponent {\n /** Show a chevron toggle that flips `expanded`. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /**\n * Two-way: `true` widens the rail and reveals inline labels. A standalone\n * state — a menu can be statically expanded (a labelled sidebar) without\n * `collapsible`; `collapsible` only adds the toggle that flips it.\n */\n readonly expanded = model(false);\n /** How items tint on hover / when active (`follow` = section colour). */\n readonly tint = input<FoldMenuTint>(\"follow\");\n /** Rail depth → background tint (`primary` default / `secondary` / `tertiary`). */\n readonly level = input<FoldMenuLevel>(\"primary\");\n /** Pin the collapse toggle to a band, or `auto` to follow band presence. */\n readonly togglePlacement = input<FoldMenuTogglePlacement>(\"auto\");\n\n private readonly headRef =\n viewChild.required<ElementRef<HTMLElement>>(\"head\");\n private readonly footRef =\n viewChild.required<ElementRef<HTMLElement>>(\"foot\");\n private readonly hasHeader = signal(false);\n private readonly hasFooter = signal(false);\n\n /**\n * The band the toggle renders into: the `togglePlacement` override when set,\n * else auto — first in the footer, else last in the header, else the body.\n */\n protected readonly resolvedPlacement = computed<\"footer\" | \"header\" | \"body\">(\n () => {\n const forced = this.togglePlacement();\n if (forced !== \"auto\") {\n return forced;\n }\n return this.hasFooter() ? \"footer\" : this.hasHeader() ? \"header\" : \"body\";\n },\n );\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n const head = this.headRef().nativeElement;\n const foot = this.footRef().nativeElement;\n const sync = (): void => {\n this.hasHeader.set(this.slotFilled(head));\n this.hasFooter.set(this.slotFilled(foot));\n };\n sync();\n const observer = new MutationObserver(sync);\n observer.observe(head, { childList: true });\n observer.observe(foot, { childList: true });\n destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n /** True when a band holds projected content (ignoring the toggle itself). */\n private slotFilled(band: HTMLElement): boolean {\n for (const child of Array.from(band.children)) {\n if (!child.classList.contains(\"menu-toggle\")) {\n return true;\n }\n }\n return false;\n }\n\n protected toggle(): void {\n this.expanded.update((v) => !v);\n }\n}\n","<div\n class=\"menu-head\"\n [class.head-has-toggle]=\"collapsible() && resolvedPlacement() === 'header'\"\n #head\n>\n <ng-content select=\"[header]\" />\n @if (collapsible() && resolvedPlacement() === \"header\") {\n <ng-container [ngTemplateOutlet]=\"toggleTpl\" />\n }\n</div>\n\n<nav class=\"menu-body\">\n <ng-content />\n @if (collapsible() && resolvedPlacement() === \"body\") {\n <ng-container [ngTemplateOutlet]=\"toggleTpl\" />\n }\n</nav>\n\n<div\n class=\"menu-foot\"\n [class.foot-has-toggle]=\"collapsible() && resolvedPlacement() === 'footer'\"\n #foot\n>\n @if (collapsible() && resolvedPlacement() === \"footer\") {\n <ng-container [ngTemplateOutlet]=\"toggleTpl\" />\n }\n <ng-content select=\"[footer]\" />\n</div>\n\n<ng-template #toggleTpl>\n <button\n type=\"button\"\n class=\"menu-toggle\"\n [attr.aria-label]=\"expanded() ? 'Collapse menu' : 'Expand menu'\"\n (click)=\"toggle()\"\n >\n <fold-icon\n [name]=\"expanded() ? 'chevron-left' : 'chevron-right'\"\n [size]=\"14\"\n />\n </button>\n</ng-template>\n","import { Component, booleanAttribute, computed, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport {\n FoldBadgeComponent,\n type FoldBadgeVariant,\n} from \"../../content/badge/badge.component\";\n\n/**\n * Badge tone for a menu item. `follow` (the default) tints the badge with the\n * item's own accent — i.e. the section colour, or whatever the menu's `tint`\n * resolves to — so it matches the item's hover/active look. The rest are the\n * shared {@link FoldBadgeVariant} semantic colours.\n */\nexport type FoldMenuItemBadgeTone = \"follow\" | FoldBadgeVariant;\n\n/** Solid accent colour per semantic tone (drives the dot + follow-pill). */\nconst TONE_ACCENT: Record<FoldBadgeVariant, string> = {\n neutral: \"var(--fold-color-text-muted)\",\n accent: \"var(--fold-color-primary)\",\n info: \"var(--fold-color-info)\",\n warning: \"var(--fold-color-warning)\",\n alert: \"var(--fold-color-alert)\",\n success: \"var(--fold-color-success)\",\n};\n\n/**\n * `[fold-menu-item]` — an icon rail item. It is an **attribute** component, put\n * on the caller's own `<a>`/`<button>` so routing stays theirs (`routerLink` +\n * `routerLinkActive`). It renders the icon + a hover tooltip (`label`); `active`\n * lights the accent indicator (bind it from `routerLinkActive`'s `isActive`).\n *\n * A {@link badge} adds a status tag / count that renders in both rail modes:\n * a corner dot (or count bubble, for a number) when the rail is collapsed to\n * icons, and the full badge pill after the label when expanded. It stays an\n * input (not projected content) because only this component knows its rail\n * mode, and that mode dictates where the badge belongs. {@link badgeTone}\n * colours both modes from a single accent — `follow` (default) matches the\n * item's own tint, the semantic tones reuse the `fold-badge` palette.\n *\n * @selector `a[fold-menu-item]`, `button[fold-menu-item]`\n *\n * @example\n * ```html\n * <a fold-menu-item [icon]=\"'home'\" [label]=\"'Home'\"\n * routerLink=\"/home\" routerLinkActive #r=\"routerLinkActive\"\n * [active]=\"r.isActive\"></a>\n *\n * <a fold-menu-item icon=\"bell\" label=\"Alerts\" [badge]=\"3\"></a>\n * <a fold-menu-item icon=\"star\" label=\"Directive\" badge=\"new\" badgeTone=\"info\"></a>\n * ```\n */\n@Component({\n selector: \"a[fold-menu-item], button[fold-menu-item]\",\n standalone: true,\n imports: [FoldIconComponent, FoldBadgeComponent],\n templateUrl: \"./menu-item.component.html\",\n styleUrl: \"./menu-item.component.scss\",\n host: {\n \"[class.is-active]\": \"active()\",\n \"[attr.aria-label]\": \"ariaLabel()\",\n \"[style.--mi-badge-accent]\": \"badgeAccent()\",\n },\n})\nexport class FoldMenuItemComponent {\n readonly icon = input.required<FoldIconName>();\n /** The label shown in the hover tooltip (also the accessible name). */\n readonly label = input.required<string>();\n /** Lights the active indicator — bind from `routerLinkActive`. */\n readonly active = input(false, { transform: booleanAttribute });\n /**\n * Optional badge: a text tag (`\"new\"`, `\"beta\"`) or a count (`3`). Empty\n * string / nullish renders nothing; a count of `0` is treated as nothing.\n */\n readonly badge = input<string | number>();\n /** Badge colour — `follow` (default) tracks the item's tint, or a semantic tone. */\n readonly badgeTone = input<FoldMenuItemBadgeTone>(\"follow\");\n\n /** Whether the badge is a numeric count (drives the collapsed bubble). */\n protected readonly isCount = computed(() => typeof this.badge() === \"number\");\n\n /** Whether a badge should render at all (non-empty text / non-zero count). */\n protected readonly hasBadge = computed(() => {\n const b = this.badge();\n return b !== undefined && b !== \"\" && b !== 0;\n });\n\n /** Whether the tone tracks the item's accent (vs a semantic `fold-badge`). */\n protected readonly isFollowTone = computed(\n () => this.badgeTone() === \"follow\",\n );\n\n /** The badge's accent colour — the item's tint, or the semantic tone's. */\n protected readonly badgeAccent = computed(() => {\n const tone = this.badgeTone();\n return tone === \"follow\" ? \"var(--mi-accent)\" : TONE_ACCENT[tone];\n });\n\n /** Semantic variant for the expanded `fold-badge` (unused when following). */\n protected readonly badgeVariant = computed<FoldBadgeVariant>(() => {\n const tone = this.badgeTone();\n return tone === \"follow\" ? \"accent\" : tone;\n });\n\n /** Badge text for the expanded pill (`fold-badge` needs a string). */\n protected readonly badgeText = computed(() => {\n const b = this.badge();\n return b === undefined ? \"\" : String(b);\n });\n\n /** Collapsed corner label: the (capped) count, or empty for a text tag dot. */\n protected readonly dotText = computed(() => {\n const b = this.badge();\n if (typeof b !== \"number\") {\n return \"\";\n }\n return b > 99 ? \"99+\" : String(b);\n });\n\n /** Accessible name folding the badge in, so both rail modes announce it. */\n protected readonly ariaLabel = computed(() =>\n this.hasBadge() ? `${this.label()}, ${this.badgeText()}` : null,\n );\n}\n","<fold-icon [name]=\"icon()\" [size]=\"18\" class=\"mi-icon\" />\n\n<!-- Collapsed rail: a corner dot, or a count bubble for a number. -->\n@if (hasBadge()) {\n <span class=\"mi-dot\" [class.mi-dot-count]=\"isCount()\" aria-hidden=\"true\">{{\n dotText()\n }}</span>\n}\n\n<span class=\"mi-tip\">{{ label() }}</span>\n\n<!-- Expanded rail: the badge pill, pushed to the row's trailing edge. `follow`\n tints from the item's own accent; the semantic tones reuse fold-badge. -->\n@if (hasBadge()) {\n @if (isFollowTone()) {\n <span class=\"mi-badge mi-badge-follow\">{{ badgeText() }}</span>\n } @else {\n <fold-badge\n class=\"mi-badge\"\n [content]=\"badgeText()\"\n [variant]=\"badgeVariant()\"\n />\n }\n}\n","import { Component, input } from \"@angular/core\";\n\n/**\n * `<fold-menu-separator>` — a section break inside `<fold-menu>`.\n *\n * Collapsed (icon rail): a short mark centered between items — a plain divider,\n * or a colour bar when `color` is set. Expanded: a section header — the colour\n * dot + the uppercase `label`. It follows the menu's state via `:host-context`.\n *\n * @selector `fold-menu-separator`\n *\n * @example\n * ```html\n * <fold-menu-separator label=\"Workspace\" color=\"#7c5bbf\" />\n * ```\n */\n@Component({\n selector: \"fold-menu-separator\",\n standalone: true,\n templateUrl: \"./menu-separator.component.html\",\n styleUrl: \"./menu-separator.component.scss\",\n})\nexport class FoldMenuSeparatorComponent {\n /** Section label — shown only when the menu is expanded. */\n readonly label = input<string>();\n /** Accent colour for the mark/dot (any CSS colour); omit for a neutral line. */\n readonly color = input<string>();\n}\n","<span class=\"sep-mark\" [style.background]=\"color() || null\"></span>\n@if (label()) {\n <span class=\"sep-label\">{{ label() }}</span>\n}\n","import {\n Component,\n booleanAttribute,\n computed,\n contentChildren,\n input,\n model,\n} from \"@angular/core\";\nimport { FoldMenuSeparatorComponent } from \"./menu-separator.component\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldMenuItemComponent } from \"./menu-item.component\";\n\n/** Distinct ids for the header → items `aria-controls` link. */\nlet sectionUid = 0;\n\n/**\n * `<fold-menu-section>` — a labelled group inside `<fold-menu>`. It renders a\n * `<fold-menu-separator>` (same `label` / `color` inputs) then projects the\n * section's `fold-menu-item`s beneath it.\n *\n * The `color` is published as the `--fold-menu-section-color` custom property on\n * the host, so it cascades to the projected items: they pick the section's tint\n * up on hover (see `menu-item.component.scss`). Omit `color` for a neutral\n * section.\n *\n * Set `collapsible` to turn the header into a fold toggle (chevron) — a long\n * grouped nav can then be tidied down to the sections that matter. The\n * {@link collapsed} state is two-way bindable and starts open; a section that\n * holds the **active** item always shows regardless, so the current page is\n * never hidden. Folding only applies in the expanded rail — collapsed (icon\n * only) there is no header to click, so every item stays visible.\n *\n * @selector `fold-menu-section`\n *\n * @example\n * ```html\n * <fold-menu-section label=\"Workspace\" color=\"#7c5bbf\" collapsible>\n * <button fold-menu-item icon=\"home\" label=\"Home\"></button>\n * <button fold-menu-item icon=\"music\" label=\"Music\"></button>\n * </fold-menu-section>\n * ```\n */\n@Component({\n selector: \"fold-menu-section\",\n standalone: true,\n imports: [FoldMenuSeparatorComponent, FoldIconComponent],\n templateUrl: \"./menu-section.component.html\",\n styleUrl: \"./menu-section.component.scss\",\n host: { \"[style.--fold-menu-section-color]\": \"color() ?? null\" },\n})\nexport class FoldMenuSectionComponent {\n /** Section label — shown only when the menu is expanded. */\n readonly label = input<string>();\n /** Accent colour tinting the separator and the items' hover state. */\n readonly color = input<string>();\n /** Turn the header into a fold toggle for the section's items. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /** Fold state (two-way). Starts open; ignored while the section is active. */\n readonly collapsed = model(false);\n\n /** Projected items — read to keep the active one's section always open. */\n private readonly items = contentChildren(FoldMenuItemComponent, {\n descendants: true,\n });\n private readonly hasActiveItem = computed(() =>\n this.items().some((item) => item.active()),\n );\n\n /** Effective open state: not collapsed, or force-open for the active item. */\n protected readonly open = computed(\n () => !this.collapsed() || this.hasActiveItem(),\n );\n\n /** Stable id linking the toggle's `aria-controls` to the items region. */\n protected readonly bodyId = `fold-menu-section-${(sectionUid += 1)}`;\n\n protected toggle(): void {\n this.collapsed.update((v) => !v);\n }\n}\n","@if (collapsible()) {\n <button\n type=\"button\"\n class=\"section-head\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"bodyId\"\n (click)=\"toggle()\"\n >\n <fold-menu-separator [label]=\"label()\" [color]=\"color()\" />\n <fold-icon\n class=\"section-chevron\"\n [class.is-open]=\"open()\"\n name=\"chevron-right\"\n [size]=\"12\"\n aria-hidden=\"true\"\n />\n </button>\n} @else {\n <fold-menu-separator [label]=\"label()\" [color]=\"color()\" />\n}\n\n<div\n class=\"section-items\"\n [id]=\"bodyId\"\n [class.foldable]=\"collapsible()\"\n [class.is-collapsed]=\"!open()\"\n>\n <ng-content />\n</div>\n","import { DOCUMENT } from \"@angular/common\";\nimport { Service, inject } from \"@angular/core\";\n\n/**\n * Reference-counted body scroll lock for overlays (panels, modals).\n *\n * Multiple overlays can be open at once (e.g. a panel over a page that also\n * locked). Each `lock()` bumps a counter; the body's `overflow` is only frozen\n * on the first lock and restored on the last `unlock()`, so nested overlays\n * never fight over the style or restore it prematurely. The pre-lock value is\n * captured and put back verbatim (not hardcoded to `''`).\n *\n * SSR-safe: `DOCUMENT` is always provided; on the server the style write is a\n * harmless no-op against a detached document.\n */\n@Service()\nexport class ScrollLockService {\n private readonly document = inject(DOCUMENT);\n private locks = 0;\n private previousOverflow = \"\";\n\n /** Freeze body scroll (idempotent per matching `unlock()`). */\n lock(): void {\n if (this.locks === 0) {\n this.previousOverflow = this.document.body.style.overflow;\n this.document.body.style.overflow = \"hidden\";\n }\n this.locks += 1;\n }\n\n /** Release one lock; restores scroll only when the last lock is released. */\n unlock(): void {\n if (this.locks === 0) {\n return;\n }\n this.locks -= 1;\n if (this.locks === 0) {\n this.document.body.style.overflow = this.previousOverflow;\n }\n }\n\n /** True while at least one lock is held. */\n get isLocked(): boolean {\n return this.locks > 0;\n }\n}\n","import { booleanAttribute, Component, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `[fold-nav-tile]` — one square tile in a {@link FoldNavLauncherComponent} grid:\n * a large icon over a label, a generous touch target. An **attribute** component\n * on the caller's own `<a>`/`<button>`, so routing + activation stay theirs\n * (`routerLink`, `(click)`) — mirroring {@link FoldMenuItemComponent}.\n *\n * It stages its **own** entrance — a cascade keyed to its position in the grid\n * (`:host(:nth-child)`) — so a launcher's tiles animate in without the launcher\n * having to thread an index down to projected content.\n *\n * Two looks via `variant`:\n * - `\"surface\"` (default) — a subtle raised tile (faint fill, hairline border).\n * - `\"filled\"` — a solid brand tile: `primary` fill, `on-primary` icon + label.\n * The flat, \"app-icon\" look — a navy tile with a white glyph under `navi`, a\n * teal one under umbra — since it names the brand roles, not a colour.\n *\n * @selector `a[fold-nav-tile]`, `button[fold-nav-tile]`\n *\n * @example\n * ```html\n * <a fold-nav-tile icon=\"home\" label=\"Home\" routerLink=\"/\"></a>\n * <button fold-nav-tile icon=\"music\" label=\"Music\" variant=\"filled\"></button>\n * ```\n */\n@Component({\n selector: \"a[fold-nav-tile], button[fold-nav-tile]\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./nav-tile.component.html\",\n styleUrl: \"./nav-tile.component.scss\",\n host: {\n class: \"fold-nav-tile\",\n \"[class.is-filled]\": \"variant() === 'filled'\",\n \"[class.is-active]\": \"active()\",\n \"[attr.aria-current]\": \"active() ? 'page' : null\",\n },\n})\nexport class FoldNavTileComponent {\n /** The tile's icon (large, centred). */\n readonly icon = input.required<FoldIconName>();\n /** The label under the icon (also the accessible name of the control). */\n readonly label = input.required<string>();\n /** `\"surface\"` (default, subtle raised) or `\"filled\"` (solid brand fill). */\n readonly variant = input<\"surface\" | \"filled\">(\"surface\");\n /** Lights the active indicator — the current destination. */\n readonly active = input(false, { transform: booleanAttribute });\n}\n","<fold-icon [name]=\"icon()\" [size]=\"26\" class=\"nt-icon\" />\n<span class=\"nt-label\">{{ label() }}</span>\n","import {\n Component,\n DestroyRef,\n HostListener,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport { FocusTrapDirective } from \"../../../a11y/focus-trap.directive\";\nimport { ScrollLockService } from \"../../../a11y/scroll-lock.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldNavTileComponent } from \"./nav-tile.component\";\n\n/**\n * `<fold-nav-launcher>` — a full-screen mobile navigation launcher: a centred\n * grid of large {@link FoldNavTileComponent} tiles over a blurred scrim. The\n * \"app-grid\" alternative to a slide-in {@link FoldAppShellComponent} drawer — a\n * curated set of top-level destinations, deliberately distinct from the desktop\n * rail (you pick which handful of places matter on a phone).\n *\n * Project `fold-nav-tile`s (or any controls) into the default slot. It owns the\n * whole overlay contract itself: a blurred scrim, dismissal on `Escape` / scrim\n * / the close button, a focus-trap, and a body scroll-lock while open.\n *\n * `open` is two-way — pair it with the shell's `mobileNavOpen` (set on the shell\n * to `mobileNav=\"none\"` so it renders no drawer) and a header hamburger:\n *\n * ```html\n * <fold-app-shell mobileNav=\"none\" [(mobileNavOpen)]=\"navOpen\">…</fold-app-shell>\n *\n * <fold-nav-launcher [(open)]=\"navOpen\" label=\"Go to\">\n * <a fold-nav-tile icon=\"home\" label=\"Home\" routerLink=\"/\"\n * (click)=\"navOpen.set(false)\"></a>\n * <a fold-nav-tile icon=\"music\" label=\"Music\" routerLink=\"/music\"\n * (click)=\"navOpen.set(false)\"></a>\n * </fold-nav-launcher>\n * ```\n *\n * @selector `fold-nav-launcher`\n */\n@Component({\n selector: \"fold-nav-launcher\",\n standalone: true,\n imports: [FocusTrapDirective, FoldIconComponent],\n templateUrl: \"./nav-launcher.component.html\",\n styleUrl: \"./nav-launcher.component.scss\",\n})\nexport class FoldNavLauncherComponent {\n /** Two-way open state — bind to the shell's `mobileNavOpen`. */\n readonly open = model(false);\n /** Accessible name for the launcher dialog. */\n readonly label = input(\"Navigation\");\n /**\n * Grid column count. `\"auto\"` (default) scales to the number of tiles so a few\n * destinations read as large flat tiles and many stay compact: ≤4 → 2 columns,\n * more → 3. Pass a number to pin it.\n */\n readonly columns = input<number | \"auto\">(\"auto\");\n\n /** The projected tiles — their count drives `auto` column sizing. */\n private readonly tiles = contentChildren(FoldNavTileComponent);\n\n /** The resolved column count (always a number for the grid var). */\n protected readonly resolvedCols = computed(() => {\n const cols = this.columns();\n if (cols !== \"auto\") {\n return cols;\n }\n return this.tiles().length <= 4 ? 2 : 3;\n });\n\n private readonly scrollLock = inject(ScrollLockService);\n private locked = false;\n\n constructor() {\n // Freeze the page scroll behind the full-screen launcher while it is open.\n effect(() => {\n const shouldLock = this.open();\n if (shouldLock && !this.locked) {\n this.scrollLock.lock();\n this.locked = true;\n } else if (!shouldLock && this.locked) {\n this.scrollLock.unlock();\n this.locked = false;\n }\n });\n inject(DestroyRef).onDestroy(() => {\n if (this.locked) {\n this.scrollLock.unlock();\n this.locked = false;\n }\n });\n }\n\n /** `Escape` closes the launcher. */\n @HostListener(\"document:keydown.escape\")\n protected onEscape(): void {\n if (this.open()) {\n this.open.set(false);\n }\n }\n\n /** Dismiss — the scrim + close-button target. */\n protected close(): void {\n this.open.set(false);\n }\n}\n","@if (open()) {\n <div class=\"nl-scrim\" (click)=\"close()\" aria-hidden=\"true\"></div>\n <div\n class=\"nl-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"label()\"\n [foldFocusTrap]=\"open()\"\n tabindex=\"-1\"\n >\n <button\n type=\"button\"\n class=\"nl-close\"\n (click)=\"close()\"\n aria-label=\"Close navigation\"\n >\n <fold-icon name=\"close\" size=\"md\" />\n </button>\n <div class=\"nl-grid\" [style.--nav-cols]=\"resolvedCols()\">\n <ng-content />\n </div>\n </div>\n}\n","import { Component, booleanAttribute, input } from \"@angular/core\";\n\n/**\n * `<fold-hero-card>` — a prominent header **card** (bordered surface). Same base\n * as {@link FoldCardComponent} (surface + border + radius + padding); lay the\n * content out inside however you like and project it via `<ng-content>`. For a\n * full-bleed, borderless page splash use `<fold-hero-section>` instead.\n *\n * Two orthogonal axes decide the look — a **base surface** and an optional\n * decorative **accent** painted on top of it (so any base can carry any accent):\n *\n * **`surface`** — the base fill:\n * - `card` (default) — the standard raised card (`surface-card`).\n * - `sunken` — the deep container tint (`surface-sunken` + fainter border).\n * - `primary` — a solid primary fill; text flips to `on-primary`.\n *\n * **`accent`** — a transparent gradient + glow overlay:\n * - `none` (default) — no overlay.\n * - `subtle` — a faint diagonal wash toward the deep tint + a soft corner glow.\n * - `gradient` — a primary-tinted wash + primary border + a stronger corner glow.\n *\n * **`accentBar`** — orthogonal: a primary accent bar down the left edge.\n *\n * ```html\n * <fold-hero-card surface=\"sunken\" accent=\"subtle\" accentBar>…</fold-hero-card>\n * <fold-hero-card accent=\"gradient\">…</fold-hero-card>\n * ```\n *\n * @selector `fold-hero-card`\n */\n@Component({\n selector: \"fold-hero-card\",\n standalone: true,\n host: {\n \"[class.s-sunken]\": \"surface() === 'sunken'\",\n \"[class.s-primary]\": \"surface() === 'primary'\",\n \"[class.a-subtle]\": \"accent() === 'subtle'\",\n \"[class.a-gradient]\": \"accent() === 'gradient'\",\n \"[class.has-bar]\": \"accentBar()\",\n \"[class.p-sm]\": \"padding() === 'sm'\",\n \"[class.p-md]\": \"padding() === 'md'\",\n },\n templateUrl: \"./hero-card.component.html\",\n styleUrl: \"./hero-card.component.scss\",\n})\nexport class FoldHeroCardComponent {\n /** Base fill — `card` (default) · `sunken` (deep tint) · `primary` (solid fill). */\n readonly surface = input<\"card\" | \"sunken\" | \"primary\">(\"card\");\n /** Decorative overlay — `none` (default) · `subtle` (diagonal + glow) · `gradient` (primary wash + glow). */\n readonly accent = input<\"none\" | \"subtle\" | \"gradient\">(\"none\");\n /** Inner padding — `lg` (default) · `md` · `sm`. */\n readonly padding = input<\"sm\" | \"md\" | \"lg\">(\"lg\");\n /** Add a primary accent bar down the left edge (composable with any surface). */\n readonly accentBar = input(false, { transform: booleanAttribute });\n}\n","<ng-content />\n","import { Directive, TemplateRef, inject, input } from \"@angular/core\";\n\n/**\n * Marks an `<ng-template>` as the cell renderer for a column key inside\n * `<fold-data-table>`:\n *\n * ```html\n * <ng-template foldCell=\"status\" let-row let-i=\"index\"> … </ng-template>\n * ```\n *\n * The template context is `{ $implicit: row, index }`. Rows are typed via the\n * table's `[rows]`; the projected template's `let-row` is untyped by design (a\n * generic content-projected template can't carry the row type without heavy\n * machinery), so annotate through the parent component's typed helper methods.\n */\n@Directive({ selector: \"ng-template[foldCell]\", standalone: true })\nexport class FoldDataTableCellDirective {\n /** The column `key` this template renders. */\n readonly foldCell = input.required<string>();\n readonly template = inject(TemplateRef);\n}\n","import {\n Component,\n type TemplateRef,\n booleanAttribute,\n computed,\n contentChildren,\n input,\n output,\n} from \"@angular/core\";\nimport { NgClass, NgTemplateOutlet } from \"@angular/common\";\nimport { FoldDataTableCellDirective } from \"./data-table-cell.directive\";\nimport type {\n FoldTableColumn,\n FoldTableEmpty,\n FoldTableSort,\n FoldTableTone,\n} from \"./data-table.types\";\n\n/**\n * `fold-data-table` — a controlled, presentational roster table. The parent\n * supplies already-paged/sorted `rows`, a `columns` definition, and a\n * `<ng-template foldCell=\"<key>\">` per column for the cell content; the table\n * owns the chrome (sticky sortable header, row tone accents, focus/click, the\n * mobile card layout, the empty state).\n *\n * Generic over the row type `T` so `rowKey`/`rowTone`/`rowClick` stay typed.\n * Cell templates are untyped (`let-row` is `any`) — render through the parent's\n * typed helpers.\n */\n@Component({\n selector: \"fold-data-table\",\n standalone: true,\n imports: [NgClass, NgTemplateOutlet],\n templateUrl: \"./data-table.component.html\",\n styleUrl: \"./data-table.component.scss\",\n})\nexport class FoldDataTableComponent<T> {\n readonly columns = input.required<readonly FoldTableColumn[]>();\n readonly rows = input.required<readonly T[]>();\n /** Stable row identity — defaults to the row index. */\n readonly rowKey = input<(row: T, index: number) => string | number>();\n /** Optional per-row semantic tone (left accent + tint). */\n readonly rowTone = input<(row: T) => FoldTableTone>();\n readonly sort = input<FoldTableSort | null>(null);\n readonly empty = input<FoldTableEmpty>();\n /** Makes rows focusable + clickable (emits `rowClick`). */\n readonly clickable = input(false, { transform: booleanAttribute });\n readonly zebra = input(false, { transform: booleanAttribute });\n readonly hover = input(true, { transform: booleanAttribute });\n readonly mobileCards = input(true, { transform: booleanAttribute });\n\n /** Emits the clicked sortable column's `key`. */\n readonly sortChange = output<string>();\n readonly rowClick = output<T>();\n\n private readonly cells = contentChildren(FoldDataTableCellDirective);\n private readonly cellMap = computed(() => {\n const map = new Map<string, TemplateRef<unknown>>();\n for (const cell of this.cells()) {\n map.set(cell.foldCell(), cell.template);\n }\n return map;\n });\n\n /** The first column is the identity/primary cell (full-width on mobile). */\n readonly primaryKey = computed(() => this.columns()[0]?.key ?? \"\");\n\n cellTemplate(key: string): TemplateRef<unknown> | null {\n return this.cellMap().get(key) ?? null;\n }\n\n keyOf(row: T, index: number): string | number {\n return this.rowKey()?.(row, index) ?? index;\n }\n\n toneOf(row: T): FoldTableTone {\n return this.rowTone()?.(row) ?? null;\n }\n\n isSorted(key: string): boolean {\n return this.sort()?.key === key;\n }\n\n /** The sort glyph for a column: neutral `↕`, or the active direction. */\n sortArrow(key: string): string {\n const sort = this.sort();\n if (sort?.key !== key) {\n return \"↕\";\n }\n return sort.dir === \"asc\" ? \"↑\" : \"↓\";\n }\n\n ariaSort(key: string): \"ascending\" | \"descending\" | \"none\" {\n const sort = this.sort();\n if (sort?.key !== key) {\n return \"none\";\n }\n return sort.dir === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n onRowActivate(row: T): void {\n if (this.clickable()) {\n this.rowClick.emit(row);\n }\n }\n}\n","<div\n class=\"folddt-wrap\"\n [class.folddt--zebra]=\"zebra()\"\n [class.folddt--hover]=\"hover()\"\n [class.folddt--cards]=\"mobileCards()\"\n>\n <table class=\"folddt\">\n <thead>\n <tr>\n @for (col of columns(); track col.key) {\n <th\n scope=\"col\"\n [style.width]=\"col.width || null\"\n [attr.aria-sort]=\"col.sortable ? ariaSort(col.key) : null\"\n >\n @if (col.sortable) {\n <button\n type=\"button\"\n class=\"folddt-th-sort\"\n [class.right]=\"col.align === 'right'\"\n (click)=\"sortChange.emit(col.key)\"\n >\n <span>{{ col.label }}</span>\n <span class=\"folddt-arrow\" [class.on]=\"isSorted(col.key)\">{{\n sortArrow(col.key)\n }}</span>\n </button>\n } @else {\n <span\n class=\"folddt-th-plain\"\n [class.right]=\"col.align === 'right'\"\n >{{ col.label }}</span\n >\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track keyOf(row, $index); let i = $index) {\n @let tone = toneOf(row);\n <tr\n class=\"folddt-row\"\n [class.tone-warning]=\"tone === 'warning'\"\n [class.tone-alert]=\"tone === 'alert'\"\n [class.tone-success]=\"tone === 'success'\"\n [class.clickable]=\"clickable()\"\n [attr.tabindex]=\"clickable() ? 0 : null\"\n (click)=\"onRowActivate(row)\"\n (keydown.enter)=\"onRowActivate(row)\"\n >\n @for (col of columns(); track col.key) {\n <td\n class=\"folddt-cell\"\n [class.is-primary]=\"col.key === primaryKey()\"\n [class.right]=\"col.align === 'right'\"\n [ngClass]=\"col.cellClass || ''\"\n [attr.data-label]=\"col.label\"\n >\n @if (cellTemplate(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n\n @if (rows().length === 0 && empty(); as e) {\n <div class=\"folddt-empty\">\n <div class=\"folddt-empty-t\">{{ e.title }}</div>\n @if (e.subtitle) {\n <div class=\"folddt-empty-s\">{{ e.subtitle }}</div>\n }\n </div>\n }\n</div>\n","import { Directive, computed, input } from \"@angular/core\";\n\n/** Where the column pins while the main content scrolls past it. */\nexport type FoldStickyColumnAnchor = \"top\" | \"center\" | \"bottom\";\n\n/**\n * `[foldStickyColumn]` — turns its host into a sticky side column: a vertical\n * flex stack that sticks while the main content scrolls past it. Meant for an\n * `<aside>` so the semantics stay (`<aside foldStickyColumn>…</aside>`), dropping\n * the hand-rolled `.sidebar { display:flex; … position:sticky }` boilerplate\n * every page was repeating.\n *\n * Layout only — no template, no wrapper element (it can't add one; grouping\n * still needs the `<aside>`).\n *\n * Anchor + offset are inputs; the rest stays tunable via CSS custom properties\n * so a page keeps control of what varies:\n * - `sticky` (default `top`) — pin to `top`, `center`, or `bottom` of the\n * scroll viewport.\n * - `stickyOffset` — distance from the pinned edge (a number = px, or any CSS\n * length). Defaults to `var(--fold-sticky-column-offset, 84px)` (the header\n * clearance); for `center` it nudges off dead-centre.\n * - `--fold-sticky-column-gap` (default `14px`) — the gap between stacked blocks.\n * - `--fold-sticky-column-position` (default `sticky`) — set to `static` in the\n * page's own responsive breakpoint to un-stick when the layout stacks.\n *\n * @example\n * ```html\n * <aside foldStickyColumn>…</aside> <!-- top, header offset -->\n * <aside foldStickyColumn sticky=\"bottom\">…</aside>\n * <aside foldStickyColumn sticky=\"center\">…</aside>\n * <aside foldStickyColumn [stickyOffset]=\"24\">…</aside>\n * ```\n * ```scss\n * // in the page, at its own stacking breakpoint:\n * @media (max-width: 1040px) {\n * aside[foldStickyColumn] { --fold-sticky-column-position: static; }\n * }\n * ```\n *\n * @selector `[foldStickyColumn]`\n */\n@Directive({\n selector: \"[foldStickyColumn]\",\n standalone: true,\n host: {\n \"[style.display]\": '\"flex\"',\n \"[style.flexDirection]\": '\"column\"',\n \"[style.alignSelf]\": \"alignSelfStyle()\",\n \"[style.gap]\": '\"var(--fold-sticky-column-gap, 14px)\"',\n \"[style.position]\": '\"var(--fold-sticky-column-position, sticky)\"',\n \"[style.top]\": \"topStyle()\",\n \"[style.bottom]\": \"bottomStyle()\",\n \"[style.transform]\": \"transformStyle()\",\n },\n})\nexport class FoldStickyColumnDirective {\n /** Which viewport edge (or centre) the column pins to. */\n readonly sticky = input<FoldStickyColumnAnchor>(\"top\");\n /** Distance from the pinned edge — a number (px) or any CSS length. */\n readonly stickyOffset = input<number | string>();\n\n /** The offset as a CSS length; falls back to the header-clearance var. */\n private readonly offsetCss = computed(() => {\n const o = this.stickyOffset();\n if (o === undefined) {\n return \"var(--fold-sticky-column-offset, 84px)\";\n }\n return typeof o === \"number\" ? `${o}px` : o;\n });\n\n protected readonly topStyle = computed(() => {\n switch (this.sticky()) {\n case \"bottom\":\n return \"auto\";\n case \"center\":\n return this.stickyOffset() === undefined\n ? \"50%\"\n : `calc(50% + ${this.offsetCss()})`;\n default:\n return this.offsetCss();\n }\n });\n\n protected readonly bottomStyle = computed(() =>\n this.sticky() === \"bottom\" ? this.offsetCss() : \"auto\",\n );\n\n /** The in-flow start position that makes `sticky` engage from scroll 0.\n * `sticky` pins only once the constraint is active at the element's natural\n * flow position: `top`/`center` (which pin the top edge, at 0 / 50%) need the\n * column at the *top* of its tall row (`start`); `bottom` needs it at the\n * *bottom* (`end`), else it starts off-screen and only catches mid-scroll. */\n protected readonly alignSelfStyle = computed(() =>\n this.sticky() === \"bottom\" ? \"end\" : \"start\",\n );\n\n /** Centre anchoring pins the top edge at 50%, then pulls back half its height. */\n protected readonly transformStyle = computed(() =>\n this.sticky() === \"center\" ? \"translateY(-50%)\" : \"none\",\n );\n}\n","import { Component, input, output } from \"@angular/core\";\n\nexport type FoldChoiceOption = {\n key: string;\n label: string;\n /** Optional trailing count badge (e.g. how many rows match this filter). */\n count?: number;\n};\n\n/**\n * `<fold-choice-row>` — a horizontal single-select control.\n *\n * One row, one active option, emits the chosen `key`; the parent owns the\n * state and feeds it back via `activeKey`. Two layouts:\n *\n * - `segmented` (default) — equal-width buttons that fill the row, no wrap.\n * The right shape for a small mode/segment toggle (2–4 options).\n * - `chips` — auto-width rounded chips that wrap. The right shape for a\n * status/category filter above a table or list.\n *\n * @selector `fold-choice-row`\n *\n * @example\n * ```html\n * <fold-choice-row\n * [options]=\"[{ key: 'manager', label: 'Manager' }, { key: 'member', label: 'Member' }]\"\n * [activeKey]=\"role()\"\n * (selected)=\"role.set($event)\"\n * />\n *\n * <fold-choice-row\n * layout=\"chips\"\n * [options]=\"statuses\"\n * [activeKey]=\"status()\"\n * ariaLabel=\"Filter by status\"\n * (selected)=\"setStatus($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-choice-row\",\n standalone: true,\n templateUrl: \"./choice-row.component.html\",\n // Inline + token-driven. Colours theme via fold-ng; the layout constants\n // (gaps, motion) are literals for now — a spacing/motion scale lands when a\n // second component needs one.\n styleUrl: \"./choice-row.component.scss\",\n})\nexport class FoldChoiceRowComponent {\n /** The selectable options, in display order. */\n readonly options = input.required<readonly FoldChoiceOption[]>();\n\n /** The `key` of the currently selected option. */\n readonly activeKey = input.required<string>();\n\n /** `segmented` (equal-width, default) or `chips` (auto-width, wraps). */\n readonly layout = input<\"segmented\" | \"chips\">(\"segmented\");\n\n /** Accessible label for the group. */\n readonly ariaLabel = input<string>(\"\");\n\n /** Emits the `key` of the clicked option. */\n readonly selected = output<string>();\n}\n","<div\n class=\"choice-row\"\n role=\"group\"\n [class.segmented]=\"layout() === 'segmented'\"\n [class.chips]=\"layout() === 'chips'\"\n [attr.aria-label]=\"ariaLabel() || null\"\n>\n @for (opt of options(); track opt.key) {\n <button\n type=\"button\"\n class=\"choice\"\n [class.is-active]=\"activeKey() === opt.key\"\n [attr.aria-pressed]=\"activeKey() === opt.key\"\n (click)=\"selected.emit(opt.key)\"\n >\n <span>{{ opt.label }}</span>\n @if (opt.count !== undefined) {\n <span class=\"choice-count\">{{ opt.count }}</span>\n }\n </button>\n }\n</div>\n","import {\n booleanAttribute,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n output,\n} from \"@angular/core\";\n\n/**\n * `[foldRepeatPress]` — press-and-hold auto-repeat.\n *\n * Fires `(foldRepeatPress)` once immediately on pointer press, then keeps firing\n * on a fixed cadence while the pointer is held, stopping on release, leave,\n * cancel or destroy. Bind `[foldRepeatPressDisabled]` to a reactive bound (e.g.\n * \"at max\") so the repeat also stops the instant the action becomes unavailable\n * mid-hold — a plain `pointerup` is unreliable once the host button disables\n * itself under the finger.\n *\n * Keyboard activation is intentionally out of scope: it produces `click`, not\n * `pointerdown`, so wire a separate `(click)` handler for Enter/Space.\n *\n * @selector `[foldRepeatPress]`\n *\n * @example\n * ```html\n * <button\n * foldRepeatPress\n * [foldRepeatPressDisabled]=\"atMax()\"\n * (foldRepeatPress)=\"step(1)\"\n * >+</button>\n * ```\n */\n@Directive({\n selector: \"[foldRepeatPress]\",\n standalone: true,\n host: {\n \"(pointerdown)\": \"start()\",\n \"(pointerup)\": \"stop()\",\n \"(pointerleave)\": \"stop()\",\n \"(pointercancel)\": \"stop()\",\n },\n})\nexport class FoldRepeatPressDirective {\n /** Fires immediately on press, then repeatedly while the pointer is held. */\n readonly repeat = output({ alias: \"foldRepeatPress\" });\n\n /** When true, a press does nothing and any running repeat stops at once. */\n readonly disabled = input(false, {\n transform: booleanAttribute,\n alias: \"foldRepeatPressDisabled\",\n });\n\n /** Delay before the auto-repeat begins, in ms. @default 350 */\n readonly delay = input(350, { alias: \"foldRepeatPressDelay\" });\n\n /** Cadence of the auto-repeat once started, in ms. @default 60 */\n readonly period = input(60, { alias: \"foldRepeatPressPeriod\" });\n\n private startTimer: ReturnType<typeof setTimeout> | null = null;\n private tick: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.stop());\n effect(() => {\n if (this.disabled()) {\n this.stop();\n }\n });\n }\n\n protected start(): void {\n if (this.disabled()) {\n return;\n }\n this.stop(); // never stack two hold cycles\n this.repeat.emit();\n this.startTimer = setTimeout(() => {\n this.tick = setInterval(() => this.repeat.emit(), this.period());\n }, this.delay());\n }\n\n protected stop(): void {\n if (this.startTimer !== null) {\n clearTimeout(this.startTimer);\n this.startTimer = null;\n }\n if (this.tick !== null) {\n clearInterval(this.tick);\n this.tick = null;\n }\n }\n}\n","import { Directive, booleanAttribute, input } from \"@angular/core\";\n\n/**\n * `[foldElevated]` — raise a surface into a **rounded, shadowed card**.\n *\n * It stamps `data-elevated`; the token layer styles it (radius + shadow). It\n * rides on whatever background the element already paints — so a chrome rail\n * stays chrome-coloured, just lifted. Put it on the element that owns the\n * surface's background (a projected `fold-menu`, an `app-header`, a content\n * wrapper), never on a transparent wrapper (which would raise an invisible card).\n *\n * **Elevate ≠ inset.** The directive only *raises* (radius + shadow); it does\n * not inset itself. The gutter around a floating region is the **container's**\n * job — padding on the slot, never a child margin, so a `height: 100%` region\n * fits with no overflow (an `fold-app-shell` pads a cell whose content is\n * elevated). Radius/shadow are tokenised (`--fold-surface-radius` /\n * `--fold-surface-shadow`), so a scope can dial the elevation without a new input.\n *\n * @selector `[foldElevated]`\n * @example\n * ```html\n * <fold-menu railPrimary foldElevated /> <!-- always raised -->\n * <app-header header [foldElevated]=\"dense()\" /> <!-- conditional -->\n * ```\n */\n@Directive({\n selector: \"[foldElevated]\",\n standalone: true,\n host: { \"[attr.data-elevated]\": \"foldElevated() ? '' : null\" },\n})\nexport class FoldElevatedDirective {\n /** Raise this surface (a bare `foldElevated` attribute → `true`). */\n readonly foldElevated = input(true, { transform: booleanAttribute });\n}\n","import { booleanAttribute, Component, input } from \"@angular/core\";\n\n/**\n * `<fold-label>` — the label element for a form control: the text plus an optional\n * required marker. Package-internal; the input controls render it through\n * {@link FoldInputBaseComponent}, so consumers never place it themselves. Kept\n * separate so the label + asterisk styling lives in one place (reusable later by\n * checkbox / radio groups).\n *\n * @selector `fold-label`\n */\n@Component({\n selector: \"fold-label\",\n standalone: true,\n template: `<label [attr.for]=\"for()\"\n >{{ text() }}\n @if (required()) {\n <span class=\"req\" aria-hidden=\"true\">*</span>\n } @else if (optional()) {\n <span class=\"opt\">({{ optionalLabel() }})</span>\n }\n </label>`,\n styleUrl: \"./label.component.scss\",\n})\nexport class FoldLabelComponent {\n /** The label text. */\n readonly text = input.required<string>();\n /** The id of the control this labels (`<label for>`). */\n readonly for = input<string>();\n /** Show the required marker (`*`). Takes precedence over {@link optional}. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter, parenthesised optional marker after the label. */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker's parentheses. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n}\n","import { booleanAttribute, Component, input } from \"@angular/core\";\nimport { FoldLabelComponent } from \"./label.component\";\n\n/**\n * `<fold-input-base>` — the shared field chrome around a form control: an optional\n * label (with required marker) above, the projected control, and an optional hint\n * below. Package-internal — each control ({@link FoldInputComponent},\n * `fold-number-input`, `fold-select`) composes it in its own template and projects\n * its native element in, so the label / required / hint (and, later, error)\n * markup lives in exactly one place instead of being duplicated per control.\n *\n * The control owns its id and passes it as {@link for} so the label associates\n * with it — no cross-encapsulation wiring, because the label and the control sit\n * in the same component template.\n *\n * @selector `fold-input-base`\n */\n@Component({\n selector: \"fold-input-base\",\n standalone: true,\n imports: [FoldLabelComponent],\n templateUrl: \"./input-base.component.html\",\n styleUrl: \"./input-base.component.scss\",\n})\nexport class FoldInputBaseComponent {\n /** Label text; omit for no label. */\n readonly label = input<string>();\n /** Id of the projected control, for the `<label for>` association. */\n readonly for = input<string>();\n /** Show the required marker on the label. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n /** Helper text shown under the control. */\n readonly hint = input<string>();\n /** Error message shown under the control; when set, it replaces the hint. */\n readonly error = input<string>();\n}\n","@if (label(); as labelText) {\n <fold-label\n [text]=\"labelText\"\n [for]=\"for()\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n />\n}\n\n<ng-content />\n\n@if (error(); as errorText) {\n <p\n class=\"ib-msg ib-error\"\n role=\"alert\"\n [attr.id]=\"for() ? for() + '-error' : null\"\n >\n {{ errorText }}\n </p>\n} @else if (hint(); as hintText) {\n <p class=\"ib-msg ib-hint\" [attr.id]=\"for() ? for() + '-hint' : null\">\n {{ hintText }}\n </p>\n}\n","/** Read `.value` off an input/select event target as a string, without `$any()`. */\nexport function readInputValue(event: Event): string {\n const target = event.target;\n if (target instanceof HTMLInputElement) {\n return target.value;\n }\n if (target instanceof HTMLSelectElement) {\n return target.value;\n }\n return \"\";\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldInputBaseComponent } from \"./input-base.component\";\nimport { readInputValue } from \"./input-value\";\n\n/**\n * `<fold-input>` — the text-input control (`value: string`): the *edit* half of a\n * record, where {@link FoldFieldComponent} is the *read* half. It renders an\n * optional label + a native `<input>` styled to the tokens, plus the field\n * chrome from {@link FoldInputBaseComponent} (label / required / hint / error).\n * When bound via `[formField]`, it surfaces the field's first validation error\n * under the input once touched. For numeric fields use {@link\n * FoldNumberInputComponent} — a separate control so each keeps its true value\n * type instead of a `string | number` union.\n *\n * Integrates with signal forms via the `FormValueControl` contract (bind with\n * `[formField]`), or drive it standalone with `[(value)]` / `(valueChange)`.\n * Variant, size and alignment are applied as host classes (`:host(.sm.center)`).\n *\n * @selector `fold-input`\n *\n * @example\n * ```html\n * <!-- Signal-forms field -->\n * <fold-input placeholder=\"Version name…\" [formField]=\"form.label\" />\n *\n * <!-- Standalone two-way -->\n * <fold-input size=\"sm\" placeholder=\"Filter…\" [(value)]=\"term\" />\n *\n * <!-- Read-only display -->\n * <fold-input [value]=\"title\" [readOnly]=\"true\" />\n * ```\n */\n@Component({\n selector: \"fold-input\",\n standalone: true,\n imports: [FoldInputBaseComponent],\n templateUrl: \"./input.component.html\",\n styleUrl: \"./input.component.scss\",\n host: {\n \"[class]\": 'size() + \" \" + align() + \" \" + variant()',\n },\n})\nexport class FoldInputComponent implements FormValueControl<string> {\n /** The bound value — a `model()` so signal forms' `FormField` and `[(value)]`\n * both keep it in sync. */\n readonly value = model<string>(\"\");\n /** Disabled state — bound automatically by `FormField` from the field. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on blur (so `FormField` marks the field\n * touched), and kept in sync with the field's touched state. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField` from the field. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /**\n * Native input type (text-like only; use {@link FoldNumberInputComponent} for numbers).\n * @default 'text'\n */\n readonly type = input<\"text\" | \"email\" | \"password\" | \"tel\" | \"url\">(\"text\");\n\n /**\n * Size preset controlling height, font-size, padding and border-radius.\n * - `sm` — compact (text-sm, tight padding) — inline table edits, compact forms\n * - `md` — standard (text-md) — default form fields\n * - `lg` — large (text-lg, generous padding) — prominent inputs\n * @default 'md'\n */\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n\n /**\n * Text alignment inside the input.\n * - `start` — left-aligned (default for text)\n * - `center` — centered (useful for short number fields like BPM, duration)\n * @default 'start'\n */\n readonly align = input<\"start\" | \"center\">(\"start\");\n\n /**\n * Visual variant.\n * - `default` — solid `--fold-color-surface-card` fill + focus glow ring;\n * standalone forms (auth, profile, dialogs).\n * - `panel` — flatter `--fold-color-surface-raised` fill, no focus glow, roomier\n * box (own padding / `radius-sm` / content-height, so `size` only drives the\n * font); reproduces the legacy side-panel `.field-input`.\n * @default 'default'\n */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n\n /** Optional label displayed above the input. */\n readonly label = input<string>();\n\n /** Show a required marker on the label (and set the native `required`). */\n readonly required = input(false, { transform: booleanAttribute });\n\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n\n /** Optional helper text shown under the input. */\n readonly hint = input<string>();\n\n /** Placeholder text. */\n readonly placeholder = input(\"\");\n\n /** Render as read-only. Named `readOnly` (not `readonly`) to avoid the\n * signal-forms `FormField` reserved `readonly` field-state binding. */\n readonly readOnly = input(false);\n\n /** Whether to autofocus on mount. */\n readonly autofocus = input(false);\n\n /**\n * Native `autocomplete` attribute — passes through to the `<input>`.\n *\n * Recommended values for auth forms:\n * - login email → `email` (or `username`)\n * - login password → `current-password`\n * - register email → `email`\n * - register password → `new-password`\n * - given / family names → `given-name` / `family-name`\n *\n * Browsers and password managers (Dashlane, 1Password, etc.) rely on\n * this to fill credentials correctly and silence DOM warnings.\n */\n readonly autocomplete = input<string | null>(null);\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-input\");\n\n /** The message to show under the field: the first error, once touched. */\n protected readonly errorMessage = computed<string | undefined>(() => {\n if (!this.touched()) {\n return undefined;\n }\n const first = this.errors()[0];\n return first ? (first.message ?? first.kind) : undefined;\n });\n\n /** `aria-describedby` target: the error when shown, else the hint, else none. */\n protected readonly describedBy = computed<string | null>(() => {\n if (this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.hint() ? `${this.inputId}-hint` : null;\n });\n\n /** Handles native input event. `value.set()` also fires the model's\n * auto `valueChange` output for standalone `(valueChange)` consumers. */\n onInputChange(event: Event): void {\n this.value.set(readInputValue(event));\n }\n\n /** Mark the field touched on blur, so errors can surface. */\n protected onBlur(): void {\n this.touched.set(true);\n }\n}\n","<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <input\n [id]=\"inputId\"\n [attr.type]=\"type()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.readonly]=\"readOnly() || null\"\n [attr.disabled]=\"disabled() || null\"\n [attr.required]=\"required() || null\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.autocomplete]=\"autocomplete()\"\n [value]=\"value()\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onBlur()\"\n />\n</fold-input-base>\n","/**\n * Pure numeric-settling helpers for {@link FoldNumberInputComponent}.\n *\n * Kept out of the component so \"what counts as a valid value\" is one small,\n * deterministic, independently-tested unit — blur and stepping both route\n * through {@link settleNumber}, so they can never diverge.\n */\nexport interface FoldNumberConstraints {\n /** The effective step (> 0); also the grid spacing and the default precision. */\n readonly step: number;\n /** Lower bound, if any (the constraints object always carries the key). */\n readonly min?: number | undefined;\n /** Upper bound, if any (the constraints object always carries the key). */\n readonly max?: number | undefined;\n /** Decimal-place cap; when omitted, precision is derived from {@link step}. */\n readonly decimals?: number | undefined;\n /** Whether the value must land on the step grid. */\n readonly snapToStep: boolean;\n}\n\n/** Decimal places carried by a finite number, robust to exponent form (`1e-7`). */\nexport function decimalsOf(n: number): number {\n if (!Number.isFinite(n)) {\n return 0;\n }\n const s = n.toString();\n const eIndex = s.indexOf(\"e-\");\n if (eIndex !== -1) {\n const mantissa = s.slice(0, eIndex);\n const dot = mantissa.indexOf(\".\");\n const mantissaDecimals = dot === -1 ? 0 : mantissa.length - dot - 1;\n return Number(s.slice(eIndex + 2)) + mantissaDecimals;\n }\n const dot = s.indexOf(\".\");\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\n/** Snap to the nearest grid point `base + k·step` (base = `min` ?? 0). */\nfunction snapToGrid(n: number, c: FoldNumberConstraints): number {\n const base = c.min ?? 0;\n return base + Math.round((n - base) / c.step) * c.step;\n}\n\n/** Round to the effective precision (kills float drift like 0.1 + 0.2). */\nfunction round(n: number, c: FoldNumberConstraints): number {\n const raw = c.decimals ?? decimalsOf(c.step);\n const places = Math.min(100, Math.max(0, raw));\n return Number(n.toFixed(places));\n}\n\n/** Clamp into the min/max bounds (each optional). */\nfunction clamp(n: number, c: FoldNumberConstraints): number {\n let out = n;\n if (c.min !== undefined) {\n out = Math.max(c.min, out);\n }\n if (c.max !== undefined) {\n out = Math.min(c.max, out);\n }\n return out;\n}\n\n/**\n * Resolve a raw number to a valid settled value: snap to the step grid (when\n * enabled) → round to the precision → clamp into `[min, max]`.\n */\nexport function settleNumber(n: number, c: FoldNumberConstraints): number {\n const snapped = c.snapToStep ? snapToGrid(n, c) : n;\n return clamp(round(snapped, c), c);\n}\n\n/**\n * Is `max` reachable on the step grid? False when `(max − base) % step ≠ 0`\n * (base = `min` ?? 0), i.e. the top bound sits between two grid points — with\n * snapping on, `max` is then only reachable off-grid via the clamp. No `max`\n * ⇒ nothing to misalign ⇒ true.\n */\nexport function isStepAligned(c: FoldNumberConstraints): boolean {\n if (c.max === undefined) {\n return true;\n }\n const steps = (c.max - (c.min ?? 0)) / c.step;\n return Math.abs(steps - Math.round(steps)) < 1e-9;\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n booleanAttribute,\n Component,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n model,\n} from \"@angular/core\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldRepeatPressDirective } from \"../../../directives/repeat-press.directive\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FoldInputBaseComponent } from \"./input-base.component\";\nimport { readInputValue } from \"./input-value\";\nimport {\n isStepAligned,\n settleNumber,\n type FoldNumberConstraints,\n} from \"./number-settle\";\n\n/** The increment/decrement glyph: chevrons, `− / +`, or no buttons. */\nexport type FoldNumberSpinner = \"none\" | \"arrows\" | \"plusminus\";\n/** Where the spinner buttons sit: stacked inside the box, or flanking it. */\nexport type FoldNumberControls = \"inside\" | \"outside\";\n\n/**\n * `<fold-number-input>` — the numeric sibling of {@link FoldInputComponent}. Split\n * out on purpose: a number field's value is a `number`, not a string, so keeping\n * it separate lets each control carry its true type (`FormValueControl<number |\n * null>` here, `FormValueControl<string>` for text) instead of the leaky\n * `string | number` union one shared control would force onto every Signal Forms\n * field. It also keeps the number-only knobs ({@link min} / {@link max} /\n * {@link step}) off the text input.\n *\n * Empty is a first-class value: clearing the field sets `null` (not `0`, not\n * `NaN`), so an optional number reads correctly. Shares the exact visual shell as\n * `fold-input` (same tokens, sizes, variants) via `input-shell.scss`.\n *\n * @selector `fold-number-input`\n *\n * @example\n * ```html\n * <!-- Signal-forms field (form.bpm: number) -->\n * <fold-number-input placeholder=\"BPM\" [min]=\"0\" [formField]=\"form.bpm\" />\n *\n * <!-- Standalone two-way -->\n * <fold-number-input align=\"center\" [step]=\"0.5\" [(value)]=\"gain\" />\n * ```\n */\n@Component({\n selector: \"fold-number-input\",\n standalone: true,\n imports: [\n FoldInputBaseComponent,\n FoldIconComponent,\n FoldRepeatPressDirective,\n NgTemplateOutlet,\n ],\n templateUrl: \"./number-input.component.html\",\n styleUrl: \"./number-input.component.scss\",\n host: {\n \"[class]\": 'size() + \" \" + align() + \" \" + variant()',\n },\n})\nexport class FoldNumberInputComponent implements FormValueControl<\n number | null\n> {\n /** The bound value — `null` when the field is empty. A `model()` so signal\n * forms' `FormField` and `[(value)]` both keep it in sync. */\n readonly value = model<number | null>(null);\n /** Disabled state — bound automatically by `FormField` from the field. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on blur (so `FormField` marks the field\n * touched), and kept in sync with the field's touched state. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField` from the field. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n\n /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n /** Text alignment inside the box. @default 'start' */\n readonly align = input<\"start\" | \"center\">(\"start\");\n /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n\n /** Optional label displayed above the input. */\n readonly label = input<string>();\n /** Show a required marker on the label (and set the native `required`). */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n /** Optional helper text shown under the input. */\n readonly hint = input<string>();\n /** Placeholder text. */\n readonly placeholder = input(\"\");\n /** Render as read-only. Named `readOnly` to avoid the `FormField` reserved binding. */\n readonly readOnly = input(false);\n\n /** Minimum value — passthrough + bound by a field's `min` validator. */\n readonly min = input<number | undefined>(undefined);\n /** Maximum value — passthrough + bound by a field's `max` validator. */\n readonly max = input<number | undefined>(undefined);\n /** Increment applied by the spinner buttons / arrow keys. @default 1 */\n readonly step = input<number | undefined>(undefined);\n\n /** The step glyph — `plusminus` (`−`/`+`, default), `arrows` (chevrons), `none`. */\n readonly spinner = input<FoldNumberSpinner>(\"plusminus\");\n /** Where the buttons sit — `inside` the box (default) or `outside`, flanking it. */\n readonly controls = input<FoldNumberControls>(\"inside\");\n\n /** Show the {@link step} as a small suffix, so the increment is visible. */\n readonly showStep = input(false, { transform: booleanAttribute });\n\n /**\n * Keep the value on the step grid. When on, a manually typed value snaps to\n * the nearest valid `base + n·step` **on blur** (base is {@link min}, else 0),\n * then clamps to min/max — so free typing is allowed while editing, and the\n * settled value always respects the step. Off by default.\n */\n readonly snapToStep = input(false, { transform: booleanAttribute });\n\n /**\n * Cap the number of decimal places on the settled value: it is rounded to this\n * many decimals when stepping and on blur. `undefined` = unconstrained (any\n * decimals allowed). See {@link integer} for the `0` shorthand.\n */\n readonly decimals = input<number | undefined>(undefined);\n\n /** Shorthand for `decimals = 0` — integers only. Takes precedence over {@link decimals}. */\n readonly integer = input(false, { transform: booleanAttribute });\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-number-input\");\n\n /** The effective step (defaults to 1 when unset). */\n protected readonly effectiveStep = computed(() => this.step() ?? 1);\n\n /** The resolved decimal cap: `0` when {@link integer}, else {@link decimals}. */\n private readonly maxDecimals = computed<number | undefined>(() =>\n this.integer() ? 0 : this.decimals(),\n );\n\n /** The active numeric constraints — shared by settling and the alignment check. */\n private readonly constraints = computed<FoldNumberConstraints>(() => ({\n step: this.effectiveStep(),\n min: this.min(),\n max: this.max(),\n decimals: this.maxDecimals(),\n snapToStep: this.snapToStep(),\n }));\n\n /** The native `step` attribute — `1` for integers with no explicit step. */\n protected readonly nativeStep = computed<number | undefined>(\n () => this.step() ?? (this.integer() ? 1 : undefined),\n );\n\n /** At/below the min bound — the decrement button is disabled. */\n protected readonly atMin = computed(() => {\n const min = this.min();\n const v = this.value();\n return min !== undefined && v !== null && v <= min;\n });\n\n /** At/above the max bound — the increment button is disabled. */\n protected readonly atMax = computed(() => {\n const max = this.max();\n const v = this.value();\n return max !== undefined && v !== null && v >= max;\n });\n\n /** Whether any spinner button renders. */\n protected readonly hasControls = computed(() => this.spinner() !== \"none\");\n /** Non-interactive (disabled or read-only) → both buttons off. */\n private readonly frozen = computed(() => this.disabled() || this.readOnly());\n /** The increment button is disabled. */\n protected readonly incDisabled = computed(\n () => this.frozen() || this.atMax(),\n );\n /** The decrement button is disabled. */\n protected readonly decDisabled = computed(\n () => this.frozen() || this.atMin(),\n );\n\n /** The message to show under the field: the first error, once touched. */\n protected readonly errorMessage = computed<string | undefined>(() => {\n if (!this.touched()) {\n return undefined;\n }\n const first = this.errors()[0];\n return first ? (first.message ?? first.kind) : undefined;\n });\n\n /** `aria-describedby` target: the error when shown, else the hint, else none. */\n protected readonly describedBy = computed<string | null>(() => {\n if (this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.hint() ? `${this.inputId}-hint` : null;\n });\n\n constructor() {\n // Dev-only nudge: with snapping on, an off-grid `max` is only reachable via\n // the clamp — usually a step/min/max mismatch the author wants to know about.\n effect(() => {\n if (this.snapToStep() && !isStepAligned(this.constraints())) {\n this.warnStepMisaligned();\n }\n });\n }\n\n /** Parses the native value: empty or unparseable → `null`, otherwise a `number`. */\n onInputChange(event: Event): void {\n const raw = readInputValue(event);\n if (raw === \"\") {\n this.value.set(null);\n return;\n }\n const parsed = Number(raw);\n this.value.set(Number.isNaN(parsed) ? null : parsed);\n }\n\n /** On blur: mark touched; settle the value onto its constraints when any apply. */\n protected onBlur(): void {\n this.touched.set(true);\n const v = this.value();\n if (v === null || !Number.isFinite(v)) {\n return;\n }\n if (this.snapToStep() || this.maxDecimals() !== undefined) {\n this.value.set(this.settle(v));\n }\n }\n\n /** Keyboard-only click (Enter/Space have `detail === 0`); pointer presses are\n * driven by {@link FoldRepeatPressDirective} so they don't double-step. */\n protected onButtonClick(direction: 1 | -1, event: MouseEvent): void {\n if (event.detail === 0) {\n this.stepBy(direction);\n }\n }\n\n /** Own the ↑/↓ arrows so keyboard stepping obeys snap/clamp/precision, not the\n * native `step` (which would only reconcile on blur). */\n protected onArrow(direction: 1 | -1, event: Event): void {\n event.preventDefault();\n this.stepBy(direction);\n }\n\n /** A focused number field changes value on scroll — blur so the page scrolls\n * instead (blur on an unfocused input is a no-op). */\n protected onWheel(event: WheelEvent): void {\n if (event.target instanceof HTMLElement) {\n event.target.blur();\n }\n }\n\n /** The glyph for a step button in the given direction (arrows vs `− / +`). */\n protected iconFor(direction: 1 | -1): FoldIconName {\n if (this.spinner() === \"arrows\") {\n return direction === 1 ? \"chevron-up\" : \"chevron-down\";\n }\n return direction === 1 ? \"plus\" : \"minus\";\n }\n\n /** Nudge the value by ±step, then settle it onto its constraints. */\n protected stepBy(direction: 1 | -1): void {\n if (this.disabled() || this.readOnly()) {\n return;\n }\n const raw = (this.value() ?? 0) + direction * this.effectiveStep();\n this.value.set(this.settle(raw));\n this.touched.set(true);\n }\n\n /**\n * Resolve a raw number to a valid settled value — the single source of truth\n * for \"what counts as valid\", so blur and stepping never diverge. Delegates to\n * the pure {@link settleNumber} with the current constraints.\n */\n private settle(n: number): number {\n return settleNumber(n, this.constraints());\n }\n\n private warnStepMisaligned(): void {\n if (isDevMode()) {\n console.warn(\n `[fold-number-input] max ${String(this.max())} is off the step grid ` +\n `(${this.min() ?? 0} + k·${this.effectiveStep()}); with snapToStep it ` +\n `is only reachable via the clamp, not by stepping.`,\n );\n }\n }\n}\n","<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <ng-template\n #stepBtn\n let-dir=\"dir\"\n let-size=\"size\"\n let-cls=\"cls\"\n let-off=\"off\"\n >\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [class]=\"cls\"\n [disabled]=\"off\"\n [attr.aria-label]=\"dir === 1 ? 'Increment' : 'Decrement'\"\n foldRepeatPress\n [foldRepeatPressDisabled]=\"off\"\n (foldRepeatPress)=\"stepBy(dir)\"\n (click)=\"onButtonClick(dir, $event)\"\n >\n <fold-icon [name]=\"iconFor(dir)\" [size]=\"size\" />\n </button>\n </ng-template>\n\n <div\n class=\"ni-field\"\n [class.ni-inside]=\"controls() === 'inside'\"\n [class.ni-outside]=\"controls() === 'outside'\"\n >\n @if (hasControls() && controls() === \"outside\") {\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: -1,\n size: 'sm',\n cls: 'ni-btn ni-dec',\n off: decDisabled(),\n }\n \"\n />\n }\n\n <div class=\"ni-box\">\n <input\n [id]=\"inputId\"\n type=\"number\"\n [attr.min]=\"min()\"\n [attr.max]=\"max()\"\n [attr.step]=\"nativeStep()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.readonly]=\"readOnly() || null\"\n [attr.disabled]=\"disabled() || null\"\n [attr.required]=\"required() || null\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [value]=\"value()\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onBlur()\"\n (keydown.arrowUp)=\"onArrow(1, $event)\"\n (keydown.arrowDown)=\"onArrow(-1, $event)\"\n (wheel)=\"onWheel($event)\"\n />\n\n @if (showStep() && step() != null) {\n <span class=\"ni-step\" aria-hidden=\"true\">{{ step() }}</span>\n }\n\n @if (hasControls() && controls() === \"inside\") {\n <span class=\"ni-stack\">\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: 1,\n size: 'xs',\n cls: 'ni-stack-btn ni-inc',\n off: incDisabled(),\n }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: -1,\n size: 'xs',\n cls: 'ni-stack-btn ni-dec',\n off: decDisabled(),\n }\n \"\n />\n </span>\n }\n </div>\n\n @if (hasControls() && controls() === \"outside\") {\n <ng-container\n *ngTemplateOutlet=\"\n stepBtn;\n context: {\n dir: 1,\n size: 'sm',\n cls: 'ni-btn ni-inc',\n off: incDisabled(),\n }\n \"\n />\n }\n </div>\n</fold-input-base>\n","import { Component, DestroyRef, inject, input, output } from \"@angular/core\";\nimport { FoldInputComponent } from \"./input.component\";\n\n/**\n * `<fold-search>` — an {@link FoldInputComponent} that **debounces its emit**: it\n * fires `searchChange` only once typing pauses for `delayMs`, so a fast typer\n * triggers one query instead of one per keystroke. The delay is adjustable; the\n * emitted term is trimmed and de-duplicated (no emit when the settled value is\n * unchanged). A thin wrapper over the text input — the search *behaviour*, not a\n * new control.\n *\n * @selector `fold-search`\n *\n * @example\n * ```html\n * <fold-search\n * placeholder=\"Search name, email, job…\"\n * (searchChange)=\"store.setSearch($event)\" />\n * ```\n */\n@Component({\n selector: \"fold-search\",\n standalone: true,\n imports: [FoldInputComponent],\n template: `\n <fold-input\n type=\"text\"\n [placeholder]=\"placeholder()\"\n [size]=\"size()\"\n [variant]=\"variant()\"\n (valueChange)=\"onInput($event)\"\n />\n `,\n styles: `\n :host {\n display: block;\n }\n `,\n})\nexport class FoldSearchComponent {\n readonly placeholder = input(\"\");\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n /** Visual variant, forwarded to the inner `fold-input` (`panel` for side-panel\n * forms; `default` elsewhere). */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n /** Quiet period after the last keystroke before emitting, in ms. */\n readonly delayMs = input(300);\n /** Emits the trimmed term once typing pauses for `delayMs` (deduped). */\n readonly searchChange = output<string>();\n\n private timer: ReturnType<typeof setTimeout> | null = null;\n private lastEmitted = \"\";\n\n constructor() {\n // A pending timer that outlives the view would fire a stray emit.\n inject(DestroyRef).onDestroy(() => this.clear());\n }\n\n protected onInput(value: string): void {\n const term = value.trim();\n this.clear();\n this.timer = setTimeout(() => {\n if (term !== this.lastEmitted) {\n this.lastEmitted = term;\n this.searchChange.emit(term);\n }\n }, this.delayMs());\n }\n\n private clear(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldInputBaseComponent } from \"./input-base.component\";\nimport { readInputValue } from \"./input-value\";\n\n/**\n * `<fold-select>` — the dropdown sibling of {@link FoldInputComponent} and\n * `fold-number-input`. A thin wrapper around a **native `<select>`** (like\n * `fold-slider` wraps the native range), so it honours the project's Signal-Forms\n * convention (native `[value]` / `(change)`) rather than a bespoke ARIA listbox.\n *\n * Options are **projected** as real `<option>` elements, matching how the app\n * already writes them, so migrating a raw `<select>` is a mechanical wrap:\n *\n * ```html\n * <fold-select label=\"Devise\" [(value)]=\"currency\" placeholder=\"Choisir…\">\n * @for (c of currencies; track c) {\n * <option [value]=\"c\">{{ c }}</option>\n * }\n * </fold-select>\n * ```\n *\n * Shares the exact box chrome (tokens, sizes, `panel` variant) as `fold-input`\n * via `input-shell.scss`, and the label / required / hint / error chrome via\n * {@link FoldInputBaseComponent}. The value is the native string; parse to a\n * number/id in the consumer (as with a raw `<select>`).\n *\n * @selector `fold-select`\n */\n@Component({\n selector: \"fold-select\",\n standalone: true,\n imports: [FoldInputBaseComponent, FoldIconComponent],\n templateUrl: \"./select.component.html\",\n styleUrl: \"./select.component.scss\",\n host: {\n \"[class]\": 'size() + \" \" + variant()',\n },\n})\nexport class FoldSelectComponent implements FormValueControl<string> {\n /** The selected value (the native option string). A `model()` so `FormField`\n * and `[(value)]` both stay in sync. */\n readonly value = model<string>(\"\");\n /** Disabled state — bound automatically by `FormField`. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on blur, kept in sync with the field. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField`. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n\n /** Size preset — see {@link FoldInputComponent.size}. @default 'md' */\n readonly size = input<\"sm\" | \"md\" | \"lg\">(\"md\");\n /** Visual variant — see {@link FoldInputComponent.variant}. @default 'default' */\n readonly variant = input<\"default\" | \"panel\">(\"default\");\n\n /** Optional label displayed above the control. */\n readonly label = input<string>();\n /** Show a required marker on the label (and set the native `required`). */\n readonly required = input(false, { transform: booleanAttribute });\n /** Show a lighter `(optional)` marker on the label (ignored when required). */\n readonly optional = input(false, { transform: booleanAttribute });\n /** The word inside the optional marker. @default 'optional' */\n readonly optionalLabel = input(\"optional\");\n /** Optional helper text shown under the control. */\n readonly hint = input<string>();\n /** Optional placeholder — a leading, disabled option shown while empty. */\n readonly placeholder = input<string>();\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-select\");\n\n /** The message to show under the field: the first error, once touched. */\n protected readonly errorMessage = computed<string | undefined>(() => {\n if (!this.touched()) {\n return undefined;\n }\n const first = this.errors()[0];\n return first ? (first.message ?? first.kind) : undefined;\n });\n\n /** `aria-describedby` target: the error when shown, else the hint, else none. */\n protected readonly describedBy = computed<string | null>(() => {\n if (this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.hint() ? `${this.inputId}-hint` : null;\n });\n\n /** Write the chosen native value back through the model. */\n onChange(event: Event): void {\n this.value.set(readInputValue(event));\n }\n\n /** Mark the field touched on blur, so errors can surface. */\n protected onBlur(): void {\n this.touched.set(true);\n }\n}\n","<fold-input-base\n [label]=\"label()\"\n [for]=\"inputId\"\n [required]=\"required()\"\n [optional]=\"optional()\"\n [optionalLabel]=\"optionalLabel()\"\n [hint]=\"hint()\"\n [error]=\"errorMessage()\"\n>\n <div class=\"sel-wrap\">\n <select\n [id]=\"inputId\"\n class=\"sel\"\n [disabled]=\"disabled()\"\n [attr.required]=\"required() || null\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [value]=\"value()\"\n (change)=\"onChange($event)\"\n (blur)=\"onBlur()\"\n >\n @if (placeholder(); as ph) {\n <option value=\"\" disabled hidden>{{ ph }}</option>\n }\n <ng-content />\n </select>\n <fold-icon\n name=\"chevron-down\"\n size=\"sm\"\n class=\"sel-caret\"\n aria-hidden=\"true\"\n />\n </div>\n</fold-input-base>\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n model,\n} from \"@angular/core\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { readInputValue } from \"../../forms/input/input-value\";\n\n/**\n * `<fold-slider>` — a single-value range slider with the design-system track,\n * fill and thumb (a styled native `<input type=\"range\">`). Two-way bound via\n * `[(value)]`.\n *\n * The fill is driven by a `--sl-pct` custom property computed from the value, so\n * there is no overlay markup. For a min↔max pair, use {@link FoldRangeSliderComponent}.\n *\n * @selector `fold-slider`\n *\n * @example\n * ```html\n * <fold-slider label=\"railWidth\" [min]=\"48\" [max]=\"120\" [(value)]=\"width\" />\n * <fold-slider label=\"min\" [max]=\"10\" [valueText]=\"min() || 'off'\" [(value)]=\"min\" />\n * ```\n */\n@Component({\n selector: \"fold-slider\",\n standalone: true,\n templateUrl: \"./slider.component.html\",\n styleUrl: \"./slider.component.scss\",\n})\nexport class FoldSliderComponent {\n /** The bound value. A `model()` so `[(value)]` keeps it in sync. */\n readonly value = model<number>(0);\n /** Minimum value. @default 0 */\n readonly min = input<number>(0);\n /** Maximum value. @default 100 */\n readonly max = input<number>(100);\n /** Increment granularity. @default 1 */\n readonly step = input<number>(1);\n /** Optional label shown above the track (also the `aria-label`). */\n readonly label = input<string>();\n /** Override the displayed value text — e.g. `'off'` when the value means \"no bound\". */\n readonly valueText = input<string>();\n /** Show the current value next to the label. @default true */\n readonly showValue = input(true, { transform: booleanAttribute });\n /** Disable interaction. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-slider\");\n\n /** Fill percentage (0–100) of the track, from the value within [min, max]. */\n protected readonly percent = computed<number>(() => {\n const range = this.max() - this.min();\n if (range <= 0) {\n return 0;\n }\n const pct = ((this.value() - this.min()) / range) * 100;\n return Math.max(0, Math.min(100, pct));\n });\n\n /** The value text to display: the explicit {@link valueText} override, else the number. */\n protected readonly display = computed<string>(\n () => this.valueText() ?? String(this.value()),\n );\n\n protected onInput(event: Event): void {\n this.value.set(Number(readInputValue(event)));\n }\n}\n","<div class=\"sl\">\n @if (label() || showValue()) {\n <div class=\"sl-head\">\n @if (label()) {\n <span class=\"sl-label\">{{ label() }}</span>\n }\n @if (showValue()) {\n <span class=\"sl-value\">{{ display() }}</span>\n }\n </div>\n }\n <input\n [id]=\"inputId\"\n class=\"sl-input\"\n type=\"range\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [style.--sl-pct]=\"percent() + '%'\"\n [attr.aria-label]=\"label()\"\n (input)=\"onInput($event)\"\n />\n</div>\n","import { Component, computed, input, output } from \"@angular/core\";\nimport { readInputValue } from \"../../forms/input/input-value\";\n\n/** A min↔max pair emitted by {@link FoldRangeSliderComponent}. */\nexport type FoldRangeValue = { min: number; max: number };\n\n/**\n * `<fold-range-slider>` — a dual-thumb range slider selecting a `{ min, max }`\n * window over `[min, max]`. Shares the design-system track / fill / thumb with\n * {@link FoldSliderComponent}. For a single value, use `fold-slider`.\n *\n * @selector `fold-range-slider`\n *\n * @example\n * ```html\n * <fold-range-slider label=\"BPM\" [min]=\"60\" [max]=\"220\" [step]=\"5\"\n * [value]=\"bpm()\" (valueChange)=\"onBpm($event)\" />\n * ```\n */\n@Component({\n selector: \"fold-range-slider\",\n standalone: true,\n templateUrl: \"./range-slider.component.html\",\n styleUrl: \"./range-slider.component.scss\",\n})\nexport class FoldRangeSliderComponent {\n /** Label shown above the track. */\n readonly label = input.required<string>();\n /** Lower bound of the selectable range. @default 0 */\n readonly min = input<number>(0);\n /** Upper bound of the selectable range. @default 100 */\n readonly max = input<number>(100);\n /** Increment granularity. @default 1 */\n readonly step = input<number>(1);\n /** The current `{ min, max }` window; falls back to the full range when unset. */\n readonly value = input<FoldRangeValue | undefined>(undefined);\n /** How the values are formatted for display. @default 'number' */\n readonly unit = input<\"number\" | \"duration\">(\"number\");\n\n /** Emits the new window whenever either thumb moves. */\n readonly valueChange = output<FoldRangeValue>();\n\n protected readonly currentMin = computed(\n () => this.value()?.min ?? this.min(),\n );\n protected readonly currentMax = computed(\n () => this.value()?.max ?? this.max(),\n );\n\n protected readonly fillLeft = computed(() => {\n const range = this.max() - this.min();\n return range === 0 ? 0 : ((this.currentMin() - this.min()) / range) * 100;\n });\n\n protected readonly fillWidth = computed(() => {\n const range = this.max() - this.min();\n if (range === 0) {\n return 100;\n }\n return ((this.currentMax() - this.currentMin()) / range) * 100;\n });\n\n protected formatValue(val: number): string {\n if (this.unit() === \"duration\") {\n const m = Math.floor(val / 60);\n const s = val % 60;\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n }\n return String(val);\n }\n\n protected onMinChange(event: Event): void {\n const val = Number(readInputValue(event));\n this.valueChange.emit({\n min: Math.min(val, this.currentMax()),\n max: this.currentMax(),\n });\n }\n\n protected onMaxChange(event: Event): void {\n const val = Number(readInputValue(event));\n this.valueChange.emit({\n min: this.currentMin(),\n max: Math.max(val, this.currentMin()),\n });\n }\n}\n","<div class=\"rs\">\n <span class=\"rs-label\">{{ label() }}</span>\n <div class=\"rs-track-wrap\">\n <div class=\"rs-track\">\n <div\n class=\"rs-fill\"\n [style.left.%]=\"fillLeft()\"\n [style.width.%]=\"fillWidth()\"\n ></div>\n </div>\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--min\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMin()\"\n [attr.aria-label]=\"label() + ' minimum'\"\n (input)=\"onMinChange($event)\"\n />\n <input\n type=\"range\"\n class=\"rs-thumb rs-thumb--max\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"currentMax()\"\n [attr.aria-label]=\"label() + ' maximum'\"\n (input)=\"onMaxChange($event)\"\n />\n </div>\n <span class=\"rs-values\"\n >{{ formatValue(currentMin()) }} – {{ formatValue(currentMax()) }}</span\n >\n</div>\n","import { booleanAttribute, Component, computed, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/** Severity of a {@link FoldCalloutComponent} — colour + default icon. */\nexport type FoldCalloutVariant =\n \"neutral\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"alert\";\n\n/** How the callout meets its container. */\nexport type FoldCalloutAppearance = \"inset\" | \"flat\";\n\n/** Default glyph per variant — overridable with the `icon` input. */\nconst DEFAULT_ICON: Record<FoldCalloutVariant, FoldIconName> = {\n neutral: \"info\",\n accent: \"lightning\",\n info: \"info\",\n success: \"completed\",\n warning: \"warning\",\n alert: \"warning\",\n};\n\n/**\n * `<fold-callout>` — a tinted message row: a status colour, an icon, a short\n * message, and optional actions on the trailing edge.\n *\n * Two appearances, and the difference is where it sits rather than how loud it\n * is:\n * - `inset` (default) — a bordered, rounded row **in** the flow, like a card.\n * - `flat` — a full-bleed band: no radius, no side borders, hairlines top and\n * bottom only, so it reads as a strip **of** its container (drop one into a\n * `<fold-card padding=\"none\">` and it spans the card edge to edge).\n *\n * The message is projected, so it can carry `<strong>`, links or a second\n * sentence. Colour comes from the status token families, so every theme is\n * handled without the callout knowing any of them. `accent` is the odd one:\n * it states no severity, it tints with the brand — for a callout that promotes\n * rather than warns (a new capability, a tip). Same name as `fold-badge`'s\n * brand tint, on purpose.\n *\n * ## Inputs\n * | Input | Type | Default |\n * |--------------|------------------------------------------------------|-------------|\n * | `variant` | `neutral \\| accent \\| info \\| success \\| warning \\| alert` | `neutral` |\n * | `appearance` | `inset \\| flat` | `inset` |\n * | `icon` | `FoldIconName` — overrides the variant's glyph | — |\n * | `announce` | `boolean` — see below | `false` |\n *\n * `announce` is for a callout that **appears in response to something** (a\n * failed save, a quota just crossed): it turns the host into a live region so\n * a screen reader reads it out — assertively for `alert`, politely otherwise.\n * A callout that is simply part of the page stays a passive `note`; announcing\n * static content is noise, not accessibility.\n *\n * ## Slots\n * - default → the message.\n * - `[actions]` → trailing controls. Project a small control (`size=\"sm\"`) —\n * a callout is a line of text, and a full-size button turns it into a bar.\n * The callout cannot enforce it: view encapsulation puts projected content\n * out of its reach.\n *\n * The resolved {@link role} and {@link ariaLive} are exposed (`exportAs:\n * \"foldCallout\"`) because `announce` changes nothing on screen — reading them\n * back is the only way to see it work.\n *\n * @selector `fold-callout`\n *\n * @example\n * ```html\n * <fold-callout variant=\"warning\">\n * This contract is <strong>locked</strong> — no more edits.\n * </fold-callout>\n *\n * <fold-card padding=\"none\">\n * <fold-callout variant=\"alert\" appearance=\"flat\" announce>\n * Quota exceeded.\n * <button foldButton actions size=\"sm\" variant=\"ghost\">Upgrade</button>\n * </fold-callout>\n * </fold-card>\n * ```\n */\n@Component({\n selector: \"fold-callout\",\n standalone: true,\n exportAs: \"foldCallout\",\n imports: [FoldIconComponent],\n host: {\n \"[attr.role]\": \"role()\",\n \"[attr.aria-live]\": \"ariaLive()\",\n \"[class.v-neutral]\": \"variant() === 'neutral'\",\n \"[class.v-accent]\": \"variant() === 'accent'\",\n \"[class.v-info]\": \"variant() === 'info'\",\n \"[class.v-success]\": \"variant() === 'success'\",\n \"[class.v-warning]\": \"variant() === 'warning'\",\n \"[class.v-alert]\": \"variant() === 'alert'\",\n \"[class.is-flat]\": \"appearance() === 'flat'\",\n },\n templateUrl: \"./callout.component.html\",\n styleUrl: \"./callout.component.scss\",\n})\nexport class FoldCalloutComponent {\n readonly variant = input<FoldCalloutVariant>(\"neutral\");\n readonly appearance = input<FoldCalloutAppearance>(\"inset\");\n /** Override the variant's default glyph. */\n readonly icon = input<FoldIconName>();\n /** Announce this callout when it appears — see the class doc. */\n readonly announce = input(false, { transform: booleanAttribute });\n\n protected readonly iconName = computed<FoldIconName>(\n () => this.icon() ?? DEFAULT_ICON[this.variant()],\n );\n\n /** The resolved ARIA role — public so a consumer (or the gallery) can show\n * what `announce` actually did, since it changes nothing visually. */\n readonly role = computed(() => {\n if (!this.announce()) {\n return \"note\";\n }\n return this.variant() === \"alert\" ? \"alert\" : \"status\";\n });\n\n /** The resolved live-region politeness, or `null` when passive. */\n readonly ariaLive = computed(() => {\n if (!this.announce()) {\n return null;\n }\n return this.variant() === \"alert\" ? \"assertive\" : \"polite\";\n });\n}\n","<fold-icon class=\"callout-icon\" [name]=\"iconName()\" [size]=\"15\" />\n<span class=\"callout-body\"><ng-content /></span>\n<span class=\"callout-actions\"><ng-content select=\"[actions]\" /></span>\n","import { Component, inject, model } from \"@angular/core\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * `<fold-disclosure>` — one summary that toggles one collapsible panel. The\n * single primitive; an accordion is a *set* of these (one open at a time is the\n * consumer's job — bind each `open` and clear the others), so the library ships\n * the piece, not the policy.\n *\n * Not `<details>`: native `<details>` display-none's its content when closed,\n * which cannot animate. This drives the panel with a `grid-template-rows`\n * `0fr → 1fr` transition (the content stays in flow, just clipped to zero\n * height), and wires the disclosure ARIA by hand — the summary is a `button`\n * with `aria-expanded` pointing at the panel via `aria-controls`.\n *\n * Content projection:\n * - `[summary]` → the always-visible trigger label (text, or a richer row).\n * - default slot → the collapsible panel.\n *\n * Two-way `open` (`[(open)]`) reflects and controls the state; a one-way\n * `[open]=\"true\"` starts it expanded; `toggle()` on the host (`exportAs:\n * \"foldDisclosure\"`) flips it from a template.\n *\n * Colour is CSS custom properties so a plain disclosure and a loud call-to-open\n * are the same component: `--fold-disclosure-summary-bg` (transparent) and\n * `--fold-disclosure-summary-color` (text) tint the summary bar — set them to a\n * primary fill for a CTA.\n *\n * @selector `fold-disclosure`\n *\n * @example\n * ```html\n * <fold-disclosure>\n * <span summary>How it works</span>\n * <p>The panel, revealed on click.</p>\n * </fold-disclosure>\n * ```\n */\n@Component({\n selector: \"fold-disclosure\",\n standalone: true,\n imports: [FoldIconComponent],\n exportAs: \"foldDisclosure\",\n host: { \"[class.is-open]\": \"open()\" },\n templateUrl: \"./disclosure.component.html\",\n styleUrl: \"./disclosure.component.scss\",\n})\nexport class FoldDisclosureComponent {\n /** Whether the panel is expanded. Two-way: `[(open)]`. */\n readonly open = model(false);\n\n /** Panel id, so the summary button can point `aria-controls` at it. */\n protected readonly panelId = inject(FoldIdService).next(\"fold-disclosure\");\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n}\n","<button\n type=\"button\"\n class=\"disc-summary\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"toggle()\"\n>\n <span class=\"disc-label\"><ng-content select=\"[summary]\" /></span>\n <fold-icon class=\"disc-chevron\" name=\"chevron-down\" size=\"sm\" />\n</button>\n<div\n class=\"disc-panel\"\n [id]=\"panelId\"\n role=\"region\"\n [attr.aria-hidden]=\"!open()\"\n>\n <div class=\"disc-panel-clip\">\n <div class=\"disc-panel-content\"><ng-content /></div>\n </div>\n</div>\n","import { Component, computed, input } from \"@angular/core\";\n\n/**\n * `<fold-status-badge>` — a coloured badge indicating a status. Unlike the\n * generic {@link FoldBadgeComponent}, this maps a **status key** to a colour, so\n * call sites pass a domain status rather than choosing a variant.\n *\n * **Supported statuses**\n * - `active` / `connected` — success (green)\n * - `draft` / `pending` — warning (amber)\n * - `suspended` / `error` — alert (red)\n * - `coming-soon` / `not_connected` — muted grey\n * - any other value (e.g. `terminated`) — neutral grey\n *\n * ```html\n * <fold-status-badge status=\"active\" />\n * <fold-status-badge status=\"pending\" label=\"En attente\" />\n * ```\n *\n * @selector `fold-status-badge`\n */\n@Component({\n selector: \"fold-status-badge\",\n standalone: true,\n templateUrl: \"./status-badge.component.html\",\n styleUrl: \"./status-badge.component.scss\",\n})\nexport class FoldStatusBadgeComponent {\n /** The status key that determines the colour. */\n readonly status = input.required<string>();\n /** Display text — defaults to the raw `status` value. */\n readonly label = input<string>(\"\");\n\n /** Collapses synonym keys onto the canonical colour states. */\n readonly normalizedStatus = computed(() => {\n const s = this.status();\n if (s === \"connected\") {\n return \"active\";\n }\n if (s === \"error\") {\n return \"suspended\";\n }\n if (s === \"not_connected\") {\n return \"coming-soon\";\n }\n return s;\n });\n}\n","<span class=\"badge\" [attr.data-status]=\"normalizedStatus()\">{{\n label() || status()\n}}</span>\n","import {\n booleanAttribute,\n Component,\n computed,\n contentChild,\n input,\n output,\n type TemplateRef,\n} from \"@angular/core\";\nimport { DatePipe, NgTemplateOutlet } from \"@angular/common\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/** Where a node's date renders relative to its label. */\nexport type FoldTimelineDatePlacement = \"above\" | \"below\" | \"inline\" | \"hidden\";\n\n/** One node of a {@link FoldTimelineComponent}. */\nexport interface FoldTimelineNode {\n /** Stable track key. Also the click payload when {@link id} is `null`. */\n readonly key: string;\n /** Click payload; `null` means no id (see {@link clickable}). */\n readonly id: string | null;\n /**\n * Force the node interactive (a `<button>`) or not, in either orientation.\n * When omitted it defaults to `id !== null`. A clickable node emits `id ?? key`\n * on click. Lets a horizontal step be clickable without a routing id, or an\n * id-bearing node stay presentational.\n */\n readonly clickable?: boolean;\n /** Primary label. */\n readonly label: string;\n /** Optional date, formatted with the `date` pipe (`mediumDate`). */\n readonly date?: Date | null;\n /** Pre-formatted date text — takes precedence over {@link date} when set. */\n readonly displayDate?: string;\n /** Optional dot icon. */\n readonly icon?: FoldIconName;\n /**\n * Completion state (progress steppers). When set, it drives the accent\n * (\"filled\") dot; when omitted, a non-clickable (`id === null`) node fills as\n * an origin/anchor. So `done` and the inert-anchor rule are the same accent.\n */\n readonly done?: boolean;\n /**\n * Per-node dot style — **overrides** the timeline's {@link\n * FoldTimelineComponent.variant}. `plain` fills the accent dot solid; `hollow`\n * shows it as a ring (the outlined look of the vertical rail's clickable dots).\n */\n readonly variant?: \"plain\" | \"hollow\";\n /**\n * Opaque per-node metadata for a custom node template (see the projected\n * `#node` template). The component never reads it — it's yours to branch on,\n * e.g. `state: 'pending'` → render an \"en attente\" badge.\n */\n readonly state?: string;\n}\n\n/**\n * `<fold-timeline>` — a connected rail of nodes (dot + optional date + label),\n * in two orientations that share one primitive:\n *\n * - `orientation=\"vertical\"` (default) — a **navigable history**: a dot rail on\n * the left; clickable nodes emit their id, a `null`-id node is an inert\n * accented anchor.\n * - `orientation=\"horizontal\"` — a **progress stepper**: an optional `progress`\n * fill line under the dots; each node's `done` drives its accent. Collapses to\n * a vertical list on narrow viewports.\n *\n * Interactivity is per node, not per component, and works the same in both\n * orientations: a node renders as a `<button>` when it is clickable — by default\n * that means `id !== null`, but each node can force it via `clickable`. A\n * non-clickable node renders as a plain presentational element (never a disabled\n * button — so a purely-presentational timeline, e.g. a signature stepper, carries\n * no button semantics). The container is a `<nav>` landmark only when at least one\n * node is clickable; otherwise a labelled `role=\"group\"`.\n *\n * The accent (\"filled\") dot is `done ?? (id === null)`, so the inert anchor and a\n * `done` step are the same rule. Dots are round by default (`square` for\n * rounded-square), and each node's `icon` names its glyph. A node's date can be a\n * `Date` (formatted with the `date` pipe) or a pre-formatted `displayDate`, placed\n * above or below the label via `datePlacement`.\n *\n * **Surface-agnostic** — it renders content only (a labelled `<nav>` of nodes),\n * no card of its own, so the consumer places it inside whatever surface fits.\n * Presentational + generic: the consumer maps its domain data to\n * {@link FoldTimelineNode}s and owns the click meaning.\n *\n * **Custom node content** — project an `<ng-template #node let-n>` to replace a\n * node's label with arbitrary content (a badge, a status line, an action). The\n * timeline keeps ownership of the dot, date, layout and the derived progressbar;\n * the template only styles the label region. This is the escape hatch for\n * heterogeneous nodes without exploding the node interface into props.\n *\n * @selector `fold-timeline`\n *\n * @example\n * ```html\n * <fold-card surface=\"sunken\">\n * <fold-timeline ariaLabel=\"History\" [nodes]=\"nodes()\" (nodeClick)=\"scrollTo($event)\" />\n * </fold-card>\n * <fold-timeline\n * orientation=\"horizontal\"\n * ariaLabel=\"Signature progress\"\n * [progress]=\"pct()\"\n * [nodes]=\"steps()\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-timeline\",\n standalone: true,\n imports: [DatePipe, NgTemplateOutlet, FoldIconComponent],\n templateUrl: \"./timeline.component.html\",\n styleUrl: \"./timeline.component.scss\",\n})\nexport class FoldTimelineComponent {\n /** The ordered nodes to render. */\n readonly nodes = input.required<readonly FoldTimelineNode[]>();\n /** Rail direction — vertical history rail vs horizontal progress stepper. */\n readonly orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\n /**\n * Progress-fill width (%) for the horizontal rail — an **override**. When\n * `null` (default) the fill is derived from the ratio of `done` nodes, so the\n * bar and the completed dots can never disagree. Ignored in vertical mode.\n */\n readonly progress = input<number | null>(null);\n /** Accessible name for the timeline's `<nav>` landmark (screen-reader only). */\n readonly ariaLabel = input<string>();\n /** Tooltip (`title`) on the clickable nodes. */\n readonly nodeTitle = input<string>(\"\");\n /** Render the dots as rounded squares instead of circles. */\n readonly square = input(false, { transform: booleanAttribute });\n /** Default dot style for every node — a node's own `variant` overrides it. */\n readonly variant = input<\"plain\" | \"hollow\">(\"plain\");\n /**\n * Where a node's date renders relative to its label — `above`/`below`\n * (stacked), `inline` (on the same row), or `hidden` (not shown). Default\n * `below`.\n */\n readonly datePlacement = input<FoldTimelineDatePlacement>(\"below\");\n\n /** Emits a clicked node's `id ?? key` (never fires for non-clickable nodes). */\n readonly nodeClick = output<string>();\n\n /** Optional consumer template that renders a node's label region. */\n protected readonly nodeTemplate =\n contentChild<TemplateRef<{ $implicit: FoldTimelineNode }>>(\"node\");\n\n /** Resolved interactivity: explicit `clickable`, else `id !== null`. */\n protected isClickable(node: FoldTimelineNode): boolean {\n return node.clickable ?? node.id !== null;\n }\n\n /** True when any node is clickable — the container is a `<nav>` only then. */\n protected readonly interactive = computed(() =>\n this.nodes().some((n) => this.isClickable(n)),\n );\n\n /** Count of completed nodes (drives the derived fill + the progressbar text). */\n protected readonly doneCount = computed(\n () => this.nodes().filter((n) => n.done).length,\n );\n\n /**\n * Horizontal fill width (%): the explicit `progress` override when given, else\n * derived so the fill reaches the last completed dot.\n */\n protected readonly fillPct = computed(() => {\n const override = this.progress();\n if (override !== null) {\n return override;\n }\n const total = this.nodes().length;\n const done = this.doneCount();\n return total > 1 && done > 0 ? ((done - 1) / (total - 1)) * 100 : 0;\n });\n\n /** `aria-valuenow` for the progressbar — a clean integer. */\n protected readonly fillNow = computed(() => Math.round(this.fillPct()));\n\n /** `aria-valuetext` (\"2 / 4\") when completion is tracked via `done`. */\n protected readonly stepText = computed(() => {\n const done = this.doneCount();\n return done > 0 ? `${done} / ${this.nodes().length}` : null;\n });\n\n /** Accent (\"filled\") dot: an explicit `done`, else the inert-anchor rule. */\n protected isFilled(node: FoldTimelineNode): boolean {\n return node.done ?? node.id === null;\n }\n\n /** Resolved dot style: the node's `variant` overrides the timeline default. */\n protected isHollow(node: FoldTimelineNode): boolean {\n return (node.variant ?? this.variant()) === \"hollow\";\n }\n\n protected onNode(node: FoldTimelineNode): void {\n if (this.isClickable(node)) {\n this.nodeClick.emit(node.id ?? node.key);\n }\n }\n}\n","<!-- Shared inner content of a node (dot + date + label). -->\n<ng-template #dot let-n>\n <span class=\"dot\">\n @if (n.icon; as ic) {\n <fold-icon [name]=\"ic\" [size]=\"11\" />\n }\n </span>\n <span class=\"txt\">\n @if (datePlacement() !== \"hidden\") {\n @if (n.displayDate; as dd) {\n <span class=\"date\">{{ dd }}</span>\n } @else if (n.date; as d) {\n <span class=\"date\">{{ d | date: \"mediumDate\" }}</span>\n }\n }\n @if (nodeTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: n }\"\n />\n } @else {\n <span class=\"nlabel\">{{ n.label }}</span>\n }\n </span>\n</ng-template>\n\n<!-- The progress rail + the nodes — reused in both containers. -->\n<ng-template #body>\n @if (orientation() === \"horizontal\") {\n <span\n class=\"rail\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"fillNow()\"\n [attr.aria-valuetext]=\"stepText()\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <span class=\"rail-fill\" [style.width.%]=\"fillPct()\"></span>\n </span>\n }\n @for (n of nodes(); track n.key) {\n @if (isClickable(n)) {\n <button\n type=\"button\"\n class=\"node\"\n [class.filled]=\"isFilled(n)\"\n [class.hollow]=\"isHollow(n)\"\n [title]=\"nodeTitle()\"\n (click)=\"onNode(n)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dot\"\n [ngTemplateOutletContext]=\"{ $implicit: n }\"\n />\n </button>\n } @else {\n <div\n class=\"node inert\"\n [class.filled]=\"isFilled(n)\"\n [class.hollow]=\"isHollow(n)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dot\"\n [ngTemplateOutletContext]=\"{ $implicit: n }\"\n />\n </div>\n }\n }\n</ng-template>\n\n@if (interactive()) {\n <nav\n class=\"tlv\"\n [class.h]=\"orientation() === 'horizontal'\"\n [class.square]=\"square()\"\n [class.date-above]=\"datePlacement() === 'above'\"\n [class.date-inline]=\"datePlacement() === 'inline'\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <ng-container [ngTemplateOutlet]=\"body\" />\n </nav>\n} @else {\n <div\n class=\"tlv\"\n role=\"group\"\n [class.h]=\"orientation() === 'horizontal'\"\n [class.square]=\"square()\"\n [class.date-above]=\"datePlacement() === 'above'\"\n [class.date-inline]=\"datePlacement() === 'inline'\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n}\n","import { Component, input } from \"@angular/core\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport type { FoldSpinnerSize } from \"../../foundations/spinner/spinner.component\";\n\n/**\n * `<fold-loading>` — a centered loading placeholder: a spinner over a muted\n * message. The host is a `role=\"status\"` / `aria-live=\"polite\"` region, so the\n * message is announced to assistive tech; the spinner is decorative. Drop it\n * anywhere a section is waiting on data — it stretches to fill (`flex: 1`).\n *\n * @selector `fold-loading`\n *\n * @example\n * ```html\n * <fold-loading />\n * <fold-loading message=\"Loading company…\" />\n * <fold-loading size=\"lg\" message=\"Crunching numbers…\" />\n * ```\n */\n@Component({\n selector: \"fold-loading\",\n standalone: true,\n imports: [FoldSpinnerComponent],\n templateUrl: \"./loading-state.component.html\",\n // Inline + tokens only, so the component is fully self-contained.\n styleUrl: \"./loading-state.component.scss\",\n host: {\n role: \"status\",\n \"aria-live\": \"polite\",\n },\n})\nexport class FoldLoadingStateComponent {\n /** Text to display. Defaults to \"Loading...\". */\n readonly message = input(\"Loading...\");\n\n /** Spinner size — an icon-size token (`xs…xl`, default `md`) or a pixel number. */\n readonly size = input<FoldSpinnerSize>(\"md\");\n}\n","<div class=\"loading\">\n <fold-spinner [size]=\"size()\" aria-hidden=\"true\" />\n @if (message()) {\n <span>{{ message() }}</span>\n }\n</div>\n","import { Component, input } from \"@angular/core\";\n\n/**\n * `<fold-empty-state>` — centered empty state with an optional icon, a title, an\n * optional subtitle and an optional action.\n *\n * Content projection carries the icon and the action:\n * - `[empty-icon]` — projected above the title (typically an SVG)\n * - default `ng-content` — projected below the subtitle (typically a button)\n *\n * `tone=\"alert\"` turns it into an error state (red title + icon); the default\n * `neutral` tone is the plain empty state.\n *\n * @selector `fold-empty-state`\n *\n * @example\n * ```html\n * <fold-empty-state\n * title=\"No company yet\"\n * subtitle=\"Create your company space to manage artists, teams and contracts.\"\n * >\n * <svg empty-icon width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n * <path d=\"M19,3H5C3.346…\" />\n * </svg>\n * <button foldButton (click)=\"create()\">+ Create</button>\n * </fold-empty-state>\n *\n * <fold-empty-state tone=\"alert\" title=\"Failed to load\" />\n * ```\n */\n@Component({\n selector: \"fold-empty-state\",\n standalone: true,\n host: { \"[class.alert]\": \"tone() === 'alert'\" },\n templateUrl: \"./empty-state.component.html\",\n styleUrl: \"./empty-state.component.scss\",\n})\nexport class FoldEmptyStateComponent {\n /** The bold primary line. */\n readonly title = input.required<string>();\n /** Optional muted secondary line. */\n readonly subtitle = input(\"\");\n /** `alert` renders an error state (red title + icon); `neutral` is default. */\n readonly tone = input<\"neutral\" | \"alert\">(\"neutral\");\n}\n","<div class=\"empty\">\n <div class=\"empty-icon\">\n <ng-content select=\"[empty-icon]\" />\n </div>\n <p class=\"empty-title\">{{ title() }}</p>\n @if (subtitle()) {\n <p class=\"empty-sub\">{{ subtitle() }}</p>\n }\n <div class=\"empty-action\">\n <ng-content />\n </div>\n</div>\n","import { booleanAttribute, Component, computed, input } from \"@angular/core\";\n\n/**\n * `<fold-aside-layout>` — a centered, self-scrolling content column flanked by\n * up to two sticky side rails. The detail-page archetype: a stack of\n * `fold-page-section`s in the middle, sticky asides beside it, collapsing to a\n * single column on narrow viewports.\n *\n * Content goes in three slots; the grid adapts to whichever rails are filled\n * (via `:has()`), so an omitted rail simply drops its column (reactively, even\n * if the rail appears/disappears at runtime):\n * - default slot — the centre content column (the scroll-length driver): every\n * element that isn't tagged as a rail. Its blocks are stacked for you.\n * - `[asideLeft]` — optional left rail (e.g. a timeline); its presence turns on\n * the third column. Tag each element that belongs in it.\n * - `[asideRight]` — the right rail (history, actions…). Tag each element.\n *\n * Rail content is tagged per-element (not wrapped in one node) so the layout\n * stacks it directly — that's what lets it style the projected blocks without\n * reaching through view encapsulation.\n *\n * Scroll-agnostic: the asides stick relative to the page's own scroll\n * container (its ancestor), so a page keeps whatever scroll it already owns —\n * the layout just drops the grid + `position: sticky` + responsive boilerplate\n * every detail page was hand-rolling. It inlines the same sticky flow as\n * `foldStickyColumn` (top anchor) because it owns its columns, and pairs with a\n * `fold-page-section` stack in the centre.\n *\n * Inputs are kept minimal: optional a11y labels ({@link asideLeftLabel} /\n * {@link asideRightLabel}) — set one and that rail becomes a labelled\n * `complementary` landmark, leave it unset and the rail is a plain container\n * (no anonymous landmark noise) — plus {@link topOffset}, a convenience over the\n * sticky-offset var. Everything else is CSS custom properties on the host. Each\n * of the three tracks is a var: `--fold-aside-layout-rail-width`\n * (220px) · `--fold-aside-layout-center-width` (`minmax(0, 1fr)`) ·\n * `--fold-aside-layout-side-width` (300px). Rails default to a fixed width and\n * the centre flexes; set all three to `minmax(0, 1fr)` for **equal columns**.\n * Also `--fold-aside-layout-gap` (28px) · `--fold-aside-layout-max` (1240px) ·\n * `--fold-aside-layout-top` (24px, the sticky offset — override per rail with\n * `--fold-aside-layout-left-top` / `--fold-aside-layout-right-top`) ·\n * `--fold-aside-layout-rail-max` (the cap above which a taller-than-viewport rail\n * scrolls internally instead of being clipped by `sticky`). The page still owns\n * the scroll container the asides stick within.\n *\n * ```scss\n * // three equal columns\n * fold-aside-layout {\n * --fold-aside-layout-rail-width: minmax(0, 1fr);\n * --fold-aside-layout-center-width: minmax(0, 1fr);\n * --fold-aside-layout-side-width: minmax(0, 1fr);\n * }\n * ```\n *\n * @selector `fold-aside-layout`\n *\n * @example\n * ```html\n * <fold-aside-layout>\n * <app-timeline asideLeft />\n *\n * <app-header />\n * <fold-page-section title=\"…\">…</fold-page-section>\n *\n * <app-history asideRight />\n * <app-actions asideRight />\n * </fold-aside-layout>\n * ```\n */\n@Component({\n selector: \"fold-aside-layout\",\n standalone: true,\n templateUrl: \"./aside-layout.component.html\",\n styleUrl: \"./aside-layout.component.scss\",\n host: {\n \"[style.--fold-aside-layout-top]\": \"topOffsetCss()\",\n \"[class.stack-left-first]\": \"stackLeftFirst()\",\n },\n})\nexport class FoldAsideLayoutComponent {\n /**\n * When the layout collapses to one column, place the left rail **above** the\n * centre instead of below it. Use it when the rail is navigation (a tab-nav),\n * so the menu still precedes the content it drives; leave it off for a\n * companion rail (a timeline, history) where the content should come first.\n */\n readonly stackLeftFirst = input(false, { transform: booleanAttribute });\n /**\n * Accessible label for the left rail. Set it and the rail is exposed as a\n * labelled `complementary` landmark; leave it unset and the rail is a plain\n * container (no landmark), so screen readers aren't given an anonymous region.\n */\n readonly asideLeftLabel = input<string>();\n /** Accessible label for the right rail — same rule as {@link asideLeftLabel}. */\n readonly asideRightLabel = input<string>();\n\n /**\n * The rails' sticky offset — a number (px) or any CSS length. A convenience\n * over the `--fold-aside-layout-top` var (which it sets); leave it unset to keep\n * the 24px default or a per-rail `--fold-aside-layout-left-top` /\n * `-right-top` override.\n *\n * It's the gap the rail keeps from the top **once it sticks** (i.e. after you\n * scroll). At rest the rail already lines up with the centre via the shared\n * grid padding, and `sticky` only ever pushes down, never up — so an offset\n * *below* the grid's top padding has no visible effect until you scroll (a\n * value like `0`–`20` looks inert on a page padded by 28px). Raise the offset\n * past the padding to push the resting rail down; to pull it up, shrink\n * `--fold-aside-layout-pad` instead.\n */\n readonly topOffset = input<number | string>();\n\n /** The offset as a CSS length, or `null` to leave the var untouched. */\n protected readonly topOffsetCss = computed(() => {\n const o = this.topOffset();\n if (o === undefined) {\n return null;\n }\n return typeof o === \"number\" ? `${o}px` : o;\n });\n}\n","<div class=\"al-grid\">\n <div\n class=\"al-aside al-aside-left\"\n [attr.role]=\"asideLeftLabel() ? 'complementary' : null\"\n [attr.aria-label]=\"asideLeftLabel() || null\"\n >\n <ng-content select=\"[asideLeft]\" />\n </div>\n <div class=\"al-center\"><ng-content /></div>\n <div\n class=\"al-aside al-aside-right\"\n [attr.role]=\"asideRightLabel() ? 'complementary' : null\"\n [attr.aria-label]=\"asideRightLabel() || null\"\n >\n <ng-content select=\"[asideRight]\" />\n </div>\n</div>\n","import {\n computed,\n Component,\n effect,\n input,\n numberAttribute,\n signal,\n} from \"@angular/core\";\nimport { observeElementWidth } from \"../../../dom/observe-element-width\";\n\n/**\n * Dead band (px) between folding and unfolding. Wider than any scrollbar, so the\n * width a fold gives back can never flip the layout straight back.\n */\nconst HYSTERESIS = 32;\n\n/**\n * `<fold-tab-layout>` — pairs a tab bar with the content it drives, and owns the\n * one thing every tabbed page hand-rolls: where the nav sits.\n *\n * - `placement=\"top\"` (default) — the nav above the content.\n * - `placement=\"side\"` — the nav as a rail beside the content, folding back on\n * top when the layout gets narrower than {@link foldAt} (so the menu always\n * precedes the content it drives, never below it).\n *\n * Content projection — the nav stays yours (tabs, active key, events):\n * - `[tabNav]` → the tab bar (an `fold-tab-nav`, or anything else).\n * - default slot → the content for the active tab.\n *\n * **A11y — this owns placement, not the ARIA tabs pattern.** The projected bar\n * carries the `tablist`/`tab` roles; the content is yours. If the tabs switch\n * in-page panels, give that content `role=\"tabpanel\"` named by the active tab;\n * if they navigate between routes, keep plain nav semantics and add no tab\n * roles (the tabs pattern is for panel-switching, not navigation).\n *\n * A side rail needs a *vertical* bar, a folded one a *horizontal* bar. Rather\n * than guess, the layout exposes {@link stacked} (`exportAs`) so the projected\n * nav follows the layout in one binding:\n *\n * ```html\n * <fold-tab-layout placement=\"side\" #tl=\"foldTabLayout\">\n * <fold-tab-nav\n * tabNav\n * [direction]=\"tl.stacked() ? 'horizontal' : 'vertical'\"\n * [tabs]=\"tabs\"\n * [activeKey]=\"tab()\"\n * (tabChange)=\"tab.set($event)\"\n * />\n * <app-tab-content />\n * </fold-tab-layout>\n * ```\n *\n * Sizing is CSS custom properties: `--fold-tab-layout-gap` (16px) and\n * `--fold-tab-layout-nav-width` (200px, the side rail track).\n *\n * @selector `fold-tab-layout`\n */\n@Component({\n selector: \"fold-tab-layout\",\n standalone: true,\n exportAs: \"foldTabLayout\",\n host: { \"[class.is-row]\": \"!stacked()\" },\n templateUrl: \"./tab-layout.component.html\",\n styleUrl: \"./tab-layout.component.scss\",\n})\nexport class FoldTabLayoutComponent {\n /** Where the nav sits: above the content, or as a rail beside it. */\n readonly placement = input<\"top\" | \"side\">(\"top\");\n /** Width (px) at or below which a `side` nav folds back on top. */\n readonly foldAt = input(720, { transform: numberAttribute });\n\n /** Whether a `side` rail has folded. Hysteretic — see {@link HYSTERESIS}. */\n private readonly folded = signal(false);\n\n /**\n * Whether the nav currently sits **above** the content — always true for\n * `top`, and true for `side` once the layout has folded.\n * Bind a projected bar's `direction` to it.\n */\n readonly stacked = computed(\n () => this.placement() === \"top\" || this.folded(),\n );\n\n /** The layout's own width, kept live by the shared `ResizeObserver` primitive. */\n private readonly width = observeElementWidth();\n\n constructor() {\n // Re-run the hysteretic fold decision on every width change.\n effect(() => this.measure(this.width()));\n }\n\n /**\n * Fold at `foldAt`, but only unfold once we are clearly past it.\n *\n * Folding makes the content taller, which can bring a scrollbar in and take\n * ~15px of width back — enough to cross a single threshold again and flip\n * forever. A dead band wider than any scrollbar breaks that loop.\n */\n private measure(width: number): void {\n if (width === 0) {\n return;\n }\n const fold = this.foldAt();\n if (!this.folded() && width <= fold) {\n this.folded.set(true);\n } else if (this.folded() && width > fold + HYSTERESIS) {\n this.folded.set(false);\n }\n }\n}\n","<div class=\"tl-nav\"><ng-content select=\"[tabNav]\" /></div>\n<div class=\"tl-body\"><ng-content /></div>\n","import { Component, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-page-layout>` — the vertical scaffold for a settings/admin-style page:\n * an optional `icon` + `title` header with a description slot, an optional\n * top-right actions slot, and a body that stacks its children with a consistent\n * rhythm. Pair it with {@link FoldPageSectionComponent} for grouped sub-sections.\n *\n * **It owns the page gutter, not the width.** The `fold-app-shell` content region\n * is full-bleed (so a page can paint edge-to-edge); this component supplies the\n * themed margins via its own padding, and otherwise **fills whatever width it is\n * given**. It does *not* cap the column — narrowing a block to a readable measure\n * is the content's job (wrap that block in your own max-width container), never\n * the page scaffold's. The *horizontal* gutter is a single token,\n * `--fold-page-gutter` (default `32px`) — retune it per page/theme, or set it to\n * `0` for a bleeding dashboard. A {@link FoldPageSectionComponent} with `bleed`\n * cancels exactly that token to span the page edge-to-edge (a full-width band\n * amid padded content), so the two never desync — including on a responsive gutter.\n * The *vertical* rhythm between stacked elements is its own token,\n * `--fold-page-gap` (default `32px`), retunable the same way.\n *\n * Content projection:\n * - default slot → the page body (sections, cards, banners…).\n * - `[titleBadge]` → an inline pill beside the title (e.g. a status/kind badge).\n * - `p[description]` → the intro under the title. A **slot**, not a string\n * input: a description that needs a `<code>`, a link or a second sentence is\n * the common case, not the exception. It must be a `<p description>` — the\n * selector is tag-qualified on purpose, so a body child that carries its own\n * `description` input (e.g. `<fold-page-section description=\"…\">`) is not\n * swallowed into the header. The layout styles what you project (muted, small,\n * full column width) so the markup stays yours. Project nothing and the header\n * is just the title. Cap the line with `--fold-page-desc-measure` on a fluid page.\n * - `[pageActions]` → the top-right header slot (e.g. an export button).\n *\n * ```html\n * <fold-page-layout icon=\"grid\" title=\"Facturation\">\n * <p description>Abonnement de l'entreprise et gestion des paiements.</p>\n * <button pageActions>Exporter</button>\n * <fold-page-section title=\"Moyens de paiement\">…</fold-page-section>\n * </fold-page-layout>\n * ```\n *\n * @selector `fold-page-layout`\n */\n@Component({\n selector: \"fold-page-layout\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./page-layout.component.html\",\n styleUrl: \"./page-layout.component.scss\",\n})\nexport class FoldPageLayoutComponent {\n /** The page heading (`<h1>`). Omit for a header-less page — or when the page\n * already carries its `<h1>` elsewhere (e.g. a leading `fold-hero-section`),\n * so a page never ends up with two top-level headings. */\n readonly title = input<string>();\n /** An optional leading icon shown beside the title. */\n readonly icon = input<FoldIconName>();\n}\n","@if (title()) {\n <header class=\"page-head\">\n <div class=\"page-head-text\">\n @if (title()) {\n <h1 class=\"page-title\">\n @if (icon(); as ic) {\n <fold-icon class=\"page-icon\" [name]=\"ic\" [size]=\"22\" />\n }\n <span>{{ title() }}</span>\n <span class=\"page-title-badge\"\n ><ng-content select=\"[titleBadge]\"\n /></span>\n </h1>\n }\n <div class=\"page-desc\"><ng-content select=\"p[description]\" /></div>\n </div>\n <div class=\"page-actions\"><ng-content select=\"[pageActions]\" /></div>\n </header>\n}\n<div class=\"page-body\"><ng-content /></div>\n","import { booleanAttribute, Component, inject, input } from \"@angular/core\";\nimport { FoldElementTitleComponent } from \"../../content/element-title/element-title.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\n\n/**\n * `<fold-page-section>` — a titled, semantic **`<section>`** grouping of page\n * content inside a {@link FoldPageLayoutComponent}: an eyebrow `title` + optional\n * `description`, a right-aligned actions slot, and the content below.\n *\n * **It is structure, not a box.** The title is a real heading and the region is\n * a `<section>` named by that heading (`aria-labelledby`) — so a page reads as\n * an outline to assistive tech, and the DOM is self-documenting. It paints\n * nothing: transparent, no border, no radius. For a **visual box**, wrap the\n * content in a {@link FoldCardComponent} — the two are orthogonal and compose (a\n * section can hold a card; a card never needs to know about the page).\n *\n * Content projection:\n * - default slot → the section content.\n * - `[sectionActions]` → the right-aligned header slot (re-projected into the\n * heading row).\n *\n * Two orthogonal helpers, both independent of the title:\n * - `stack` — lay the body out as an evenly-spaced vertical stack (form fields).\n * - `bleed` — break the section out of the page gutter to span the layout\n * edge-to-edge (a full-width band amid padded sections). It cancels exactly\n * `--fold-page-gutter` — the same token {@link FoldPageLayoutComponent} pads\n * with — so it stays flush at every breakpoint and never overflows. As the\n * **first** band it also swallows the page's top padding (a hero flush to the\n * top); as the **last**, the bottom padding (a footer band). A band in the\n * middle keeps the vertical rhythm. Only meaningful inside an `fold-page-layout`.\n *\n * ```html\n * <fold-page-section title=\"Moyens de paiement\" description=\"Le moyen par défaut…\">\n * <button sectionActions>Ajouter</button>\n * …\n * </fold-page-section>\n *\n * <!-- need a box? compose with fold-card -->\n * <fold-page-section title=\"Documents\">\n * <fold-card surface=\"sunken\">…</fold-card>\n * </fold-page-section>\n * ```\n *\n * @selector `fold-page-section`\n */\n@Component({\n selector: \"fold-page-section\",\n standalone: true,\n imports: [FoldElementTitleComponent],\n host: {\n \"[class.stack]\": \"stack()\",\n \"[class.is-bleed]\": \"bleed()\",\n },\n templateUrl: \"./page-section.component.html\",\n styleUrl: \"./page-section.component.scss\",\n})\nexport class FoldPageSectionComponent {\n /** The section heading (rendered small + uppercase; the region's a11y name). */\n readonly title = input<string>();\n /** An optional leading icon beside the title. */\n readonly icon = input<FoldIconName>();\n /** A one-line description under the title. */\n readonly description = input<string>();\n /** Heading depth exposed to assistive tech (`aria-level`) — set it so sections\n * nest correctly under the page's `<h1>` (2 by default). */\n readonly headingLevel = input(2);\n /** Lay the body out as an evenly-spaced vertical stack of form fields. */\n readonly stack = input(false, { transform: booleanAttribute });\n /** Break out of the page gutter to span the layout edge-to-edge — cancels\n * `--fold-page-gutter` exactly, so it stays flush at every breakpoint. As the\n * first/last band it also flushes to the page's top/bottom edge. Only\n * meaningful inside an `fold-page-layout`. */\n readonly bleed = input(false, { transform: booleanAttribute });\n\n /** SSR-safe id on the heading, so the `<section>` names its region with\n * `aria-labelledby` (only when there's a title). */\n protected readonly headingId =\n inject(FoldIdService).next(\"fold-page-section\");\n}\n","<section class=\"ps-root\" [attr.aria-labelledby]=\"title() ? headingId : null\">\n @if (title() || description()) {\n <div class=\"section-head\">\n @if (title(); as t) {\n <fold-element-title\n [title]=\"t\"\n [icon]=\"icon()\"\n [headingId]=\"headingId\"\n [level]=\"headingLevel()\"\n >\n <ng-content select=\"[sectionActions]\" titleAction />\n </fold-element-title>\n }\n @if (description()) {\n <p class=\"section-desc\">{{ description() }}</p>\n }\n </div>\n }\n <div class=\"section-body\"><ng-content /></div>\n</section>\n","import { Component, booleanAttribute, input } from \"@angular/core\";\n\n/**\n * `<fold-hero-section>` — a full-bleed **page splash**: the borderless intro\n * band at the top of a page (wordmark, title, lede, call-to-action). Unlike\n * {@link FoldHeroCardComponent} (a bordered card you drop anywhere), this is a\n * layout primitive — it breaks the page gutter to span edge-to-edge and carries\n * the page's `<h1>`.\n *\n * Meant as a **direct child of `fold-page-layout`**: it cancels exactly the\n * gutter + top padding the layout applies (the same `--fold-page-gutter` /\n * `--fold-page-pad-top` tokens), so the band sits flush to the edges. A soft\n * brand-tinted wash reads it as the hero, closed by a hairline at the bottom.\n *\n * Two content lanes:\n * - default slot — the centred column (eyebrow · title · lede · actions).\n * - `[heroBackdrop]` — decorative layer painted *behind* the content\n * (a watermark, a glow); rendered `aria-hidden`, so keep it purely visual.\n *\n * ```html\n * <fold-hero-section>\n * <span heroBackdrop class=\"watermark\">v1</span>\n * <fold-badge content=\"Angular 22\" />\n * <h1>Fold</h1>\n * <p>A signals-first design system.</p>\n * </fold-hero-section>\n * ```\n *\n * @selector `fold-hero-section`\n */\n@Component({\n selector: \"fold-hero-section\",\n standalone: true,\n host: {\n \"[class.align-start]\": \"align() === 'start'\",\n \"[class.no-wash]\": \"!wash()\",\n },\n templateUrl: \"./hero-section.component.html\",\n styleUrl: \"./hero-section.component.scss\",\n})\nexport class FoldHeroSectionComponent {\n /** Column alignment — `center` (default) · `start` (left-aligned). */\n readonly align = input<\"center\" | \"start\">(\"center\");\n /** Paint the brand-tinted gradient wash (default). Set `false` for a plain surface band. */\n readonly wash = input(true, { transform: booleanAttribute });\n}\n","<div class=\"hs-backdrop\" aria-hidden=\"true\">\n <ng-content select=\"[heroBackdrop]\" />\n</div>\n<div class=\"hs-content\">\n <ng-content />\n</div>\n","import { Component, computed, input, output } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\n\n/**\n * Item representing one slot in the page navigation bar.\n * Either a concrete page number (1-indexed) or an ellipsis gap.\n */\nexport type FoldPageItem = { kind: \"page\"; page: number } | { kind: \"gap\" };\n\n/**\n * `fold-paginator` — presentational, fully controlled.\n *\n * Designed for **server-side pagination** (offset/limit): the parent owns\n * `currentPage`, `pageSize` and `totalItems`, fires the HTTP call on\n * `(pageChange)` / `(pageSizeChange)`, then feeds the new values back in.\n *\n * Renders: `[page size selector] [items range] [‹ 1 2 3 … N ›]`.\n *\n * @example\n * ```html\n * <fold-paginator\n * [currentPage]=\"page()\"\n * [pageSize]=\"size()\"\n * [totalItems]=\"total()\"\n * (pageChange)=\"loadPage($event)\"\n * (pageSizeChange)=\"changeSize($event)\" />\n * ```\n */\n@Component({\n selector: \"fold-paginator\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./paginator.component.html\",\n styleUrl: \"./paginator.component.scss\",\n})\nexport class FoldPaginatorComponent {\n /** 1-indexed current page. */\n readonly currentPage = input.required<number>();\n\n /** Total number of items across all pages (drives `totalPages` + range label). */\n readonly totalItems = input.required<number>();\n\n /** Number of items per page. Must be > 0. */\n readonly pageSize = input.required<number>();\n\n /** Selectable page sizes. Set `[]` to hide the size selector entirely. */\n readonly pageSizeOptions = input<readonly number[]>([10, 25, 50, 100]);\n\n /**\n * How many page buttons to render on each side of the current page\n * between the first/last anchors. Example with `siblingCount: 1`:\n * `1 … 4 [5] 6 … 10`.\n * @default 1\n */\n readonly siblingCount = input<number>(1);\n\n /** Disables all controls (both page nav and size selector). */\n readonly disabled = input<boolean>(false);\n\n /** Fires with the new 1-indexed page number. */\n readonly pageChange = output<number>();\n\n /** Fires with the newly selected page size. */\n readonly pageSizeChange = output<number>();\n\n // ─── Derived state ────────────────────────────────────────────\n\n /** Total pages, minimum 1 so the UI always shows at least \"1 of 1\". */\n readonly totalPages = computed<number>(() => {\n const size = this.pageSize();\n const total = this.totalItems();\n if (size <= 0 || total <= 0) {\n return 1;\n }\n return Math.ceil(total / size);\n });\n\n /** Zero-indexed start / end of the currently visible range (for the label). */\n readonly rangeStart = computed<number>(() => {\n if (this.totalItems() === 0) {\n return 0;\n }\n return (this.currentPage() - 1) * this.pageSize() + 1;\n });\n\n readonly rangeEnd = computed<number>(() =>\n Math.min(this.currentPage() * this.pageSize(), this.totalItems()),\n );\n\n readonly canGoPrev = computed<boolean>(\n () => !this.disabled() && this.currentPage() > 1,\n );\n readonly canGoNext = computed<boolean>(\n () => !this.disabled() && this.currentPage() < this.totalPages(),\n );\n\n /**\n * Page buttons to render, with ellipsis gaps.\n *\n * Algorithm: always render page 1 and page N; render `siblingCount`\n * pages on each side of the current page; insert a single `gap` between\n * any two non-contiguous blocks.\n */\n readonly pageItems = computed<FoldPageItem[]>(() => {\n const total = this.totalPages();\n const current = this.currentPage();\n const sibs = Math.max(0, this.siblingCount());\n\n // Small enough to show every page — no ellipsis needed.\n // `5 + 2*sibs` = first + last + current + 2*sibs around current + 2 gap slots.\n if (total <= 5 + 2 * sibs) {\n return Array.from({ length: total }, (_, i) => ({\n kind: \"page\" as const,\n page: i + 1,\n }));\n }\n\n const leftSibling = Math.max(current - sibs, 2);\n const rightSibling = Math.min(current + sibs, total - 1);\n\n const showLeftGap = leftSibling > 2;\n const showRightGap = rightSibling < total - 1;\n\n const items: FoldPageItem[] = [{ kind: \"page\", page: 1 }];\n\n if (showLeftGap) {\n items.push({ kind: \"gap\" });\n }\n\n for (let p = leftSibling; p <= rightSibling; p++) {\n items.push({ kind: \"page\", page: p });\n }\n\n if (showRightGap) {\n items.push({ kind: \"gap\" });\n }\n\n items.push({ kind: \"page\", page: total });\n return items;\n });\n\n // ─── Handlers ─────────────────────────────────────────────────\n\n goToPage(page: number): void {\n if (this.disabled()) {\n return;\n }\n const clamped = Math.max(1, Math.min(page, this.totalPages()));\n if (clamped === this.currentPage()) {\n return;\n }\n this.pageChange.emit(clamped);\n }\n\n prev(): void {\n if (this.canGoPrev()) {\n this.goToPage(this.currentPage() - 1);\n }\n }\n\n next(): void {\n if (this.canGoNext()) {\n this.goToPage(this.currentPage() + 1);\n }\n }\n\n onPageSizeChange(raw: string): void {\n const size = Number(raw);\n if (Number.isFinite(size) && size > 0 && size !== this.pageSize()) {\n this.pageSizeChange.emit(size);\n }\n }\n}\n","@let options = pageSizeOptions();\n\n<div class=\"paginator-left\">\n @if (options.length > 0) {\n <label class=\"page-size\">\n <select\n #pageSizeSelect\n class=\"page-size__select\"\n [value]=\"pageSize()\"\n [disabled]=\"disabled()\"\n (change)=\"onPageSizeChange(pageSizeSelect.value)\"\n aria-label=\"Éléments par page\"\n >\n @for (opt of options; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n <span class=\"page-size__label\">par page</span>\n </label>\n }\n\n @if (totalItems() > 0) {\n <span class=\"range\"\n >{{ rangeStart() }}–{{ rangeEnd() }} sur {{ totalItems() }}</span\n >\n } @else {\n <span class=\"range range--empty\">Aucun élément</span>\n }\n</div>\n\n<nav class=\"pages\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"nav-btn\"\n [disabled]=\"!canGoPrev()\"\n (click)=\"prev()\"\n aria-label=\"Page précédente\"\n >\n <fold-icon name=\"chevron-left\" [size]=\"15\" />\n </button>\n\n @for (item of pageItems(); track $index) {\n @if (item.kind === \"page\") {\n <button\n type=\"button\"\n class=\"page-btn\"\n [class.is-active]=\"item.page === currentPage()\"\n [attr.aria-current]=\"item.page === currentPage() ? 'page' : null\"\n [attr.aria-label]=\"'Page ' + item.page\"\n [disabled]=\"disabled()\"\n (click)=\"goToPage(item.page)\"\n >\n {{ item.page }}\n </button>\n } @else {\n <span class=\"gap\" aria-hidden=\"true\">…</span>\n }\n }\n\n <button\n type=\"button\"\n class=\"nav-btn\"\n [disabled]=\"!canGoNext()\"\n (click)=\"next()\"\n aria-label=\"Page suivante\"\n >\n <fold-icon name=\"chevron-right\" [size]=\"15\" />\n </button>\n</nav>\n","import { Component, input, output } from \"@angular/core\";\nimport { FoldBadgeComponent } from \"../../content/badge/badge.component\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\nexport type FoldTabNavItem = {\n /** Unique key — identifies the tab and is emitted on click. */\n key: string;\n /** Display label. */\n label: string;\n /** Optional leading icon, by registry name (rendered as an `fold-icon`). */\n icon?: FoldIconName;\n /** Optional trailing badge (e.g. a count). `undefined`/`null` hides it. */\n badge?: string | number | null;\n};\n\n/**\n * `<fold-tab-nav>` — a tab navigation bar (buttons only; the parent renders the\n * content for the active key).\n *\n * - `activeStyle` — `underline` (accent border on the active tab) or `fill`\n * (accent background pill, good for sidebars).\n * - `direction` — `horizontal` (row, equal-width) or `vertical` (stacked\n * sidebar; auto-collapses to a horizontal icon-accordion at ≤768px).\n *\n * @selector `fold-tab-nav`\n *\n * @example\n * ```html\n * <fold-tab-nav\n * [tabs]=\"[{ key: 'members', label: 'Members', badge: 3 }, { key: 'settings', label: 'Settings' }]\"\n * [activeKey]=\"tab()\"\n * activeStyle=\"underline\"\n * direction=\"horizontal\"\n * (tabChange)=\"tab.set($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"fold-tab-nav\",\n standalone: true,\n imports: [FoldIconComponent, FoldBadgeComponent],\n templateUrl: \"./tab-nav.component.html\",\n // Inline + token-driven. Neutral 1px lines use --fold-color-border /\n // -surface-raised so they flip correctly in light mode (the app original\n // hard-coded white-alpha, which would vanish on a light background).\n styleUrl: \"./tab-nav.component.scss\",\n})\nexport class FoldTabNavComponent {\n /** The tabs to render, in order. */\n readonly tabs = input.required<FoldTabNavItem[]>();\n\n /** The `key` of the currently active tab. */\n readonly activeKey = input.required<string>();\n\n /** How the active tab reads: accent underline, or accent fill. */\n readonly activeStyle = input<\"underline\" | \"fill\">(\"underline\");\n\n /** Bar orientation (vertical auto-collapses to horizontal on mobile). */\n readonly direction = input<\"horizontal\" | \"vertical\">(\"horizontal\");\n\n /**\n * Density, from tightest to roomiest:\n * - `reduce` — an icon accordion: every tab but the active one drops its label\n * (and badge) to just its icon, while the active tab keeps its label and\n * takes the remaining room. A tab with no icon keeps its label, so nothing\n * is left unlabelled. Swap to it from your own breakpoint when the bar is\n * too tight for every label.\n * - `compact` (default) — inline / popover bars.\n * - `comfortable` — a prominent, page-level bar.\n */\n readonly size = input<\"reduce\" | \"compact\" | \"comfortable\">(\"compact\");\n\n /** `surface` (filled bar, default) or `transparent` (blends with the app). */\n readonly background = input<\"transparent\" | \"surface\">(\"surface\");\n\n /** Emits the `key` of the clicked tab. */\n readonly tabChange = output<string>();\n}\n","<nav\n class=\"tab-nav\"\n [class.style-underline]=\"activeStyle() === 'underline'\"\n [class.style-fill]=\"activeStyle() === 'fill'\"\n [class.dir-vertical]=\"direction() === 'vertical'\"\n [class.size-comfortable]=\"size() === 'comfortable'\"\n [class.size-reduce]=\"size() === 'reduce'\"\n [class.bg-surface]=\"background() === 'surface'\"\n>\n @for (tab of tabs(); track tab.key) {\n <button\n type=\"button\"\n class=\"tab-nav-item\"\n [class.is-active]=\"activeKey() === tab.key\"\n (click)=\"tabChange.emit(tab.key)\"\n >\n @if (tab.icon; as ic) {\n <fold-icon class=\"tab-nav-icon\" [name]=\"ic\" size=\"sm\" />\n }\n <span class=\"tab-nav-label\">{{ tab.label }}</span>\n @if (tab.badge !== undefined && tab.badge !== null) {\n <fold-badge\n class=\"tab-nav-badge\"\n [content]=\"tab.badge + ''\"\n [variant]=\"activeKey() === tab.key ? 'accent' : 'neutral'\"\n />\n }\n </button>\n }\n</nav>\n","import {\n Component,\n booleanAttribute,\n computed,\n effect,\n input,\n numberAttribute,\n output,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type { FoldToastVariant } from \"./toast.types\";\n\n/** Variant → leading status icon. */\nconst VARIANT_ICON: Record<FoldToastVariant, FoldIconName> = {\n success: \"check-circle\",\n info: \"info\",\n warning: \"warning\",\n error: \"x-circle\",\n};\n\n/**\n * `<fold-toast>` — a single frosted-glass snackbar: a variant status icon, the\n * message (projected), and an optional dismiss button. The stacking + queue\n * belong to `fold-toast-container` + {@link FoldToastService}; the toast itself\n * owns its **lifecycle** — it emits {@link dismiss} on its close button and, if\n * given a `duration`, auto-emits `dismiss` after it elapses (the timer is\n * cleared on destroy). `duration = 0` (the default) is sticky — it stays until\n * dismissed, so a standalone toast never vanishes unexpectedly.\n *\n * The surface is the shared **glass** language; a left accent stripe + the icon\n * take the variant's `-text` tint (`info` uses the brand `primary` tint). It is\n * an `alert` (assertive) for `error`, a `status` (polite) otherwise.\n *\n * ```html\n * <fold-toast variant=\"success\" duration=\"3000\" (dismiss)=\"…\">Track uploaded</fold-toast>\n * ```\n *\n * @selector `fold-toast`\n */\n@Component({\n selector: \"fold-toast\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./toast.component.html\",\n styleUrl: \"./toast.component.scss\",\n host: {\n \"[attr.data-variant]\": \"variant()\",\n \"[attr.role]\": 'variant() === \"error\" ? \"alert\" : \"status\"',\n \"[attr.aria-live]\": 'variant() === \"error\" ? \"assertive\" : \"polite\"',\n },\n})\nexport class FoldToastComponent {\n /** The tone — drives the accent stripe, icon, and live-region politeness. */\n readonly variant = input<FoldToastVariant>(\"info\");\n /** Show the dismiss button. */\n readonly dismissible = input(true, { transform: booleanAttribute });\n /** Auto-dismiss after this many ms. `0` (default) is sticky — no timer. */\n readonly duration = input(0, { transform: numberAttribute });\n\n /** Emitted on the close button, or when `duration` elapses. */\n readonly dismiss = output();\n\n /** The leading status icon for the current variant. */\n readonly icon = computed<FoldIconName>(() => VARIANT_ICON[this.variant()]);\n\n constructor() {\n // The toast owns its own expiry: (re)arm a timer whenever `duration` is a\n // positive value, and clear it on change / destroy so it can't outlive the\n // toast or double-fire. `duration <= 0` stays sticky.\n effect((onCleanup) => {\n const ms = this.duration();\n if (ms <= 0) {\n return;\n }\n const timer = setTimeout(() => this.dismiss.emit(), ms);\n onCleanup(() => clearTimeout(timer));\n });\n }\n}\n","<fold-icon class=\"toast-icon\" [name]=\"icon()\" [size]=\"16\" aria-hidden=\"true\" />\n\n<span class=\"toast-message\"><ng-content /></span>\n\n@if (dismissible()) {\n <button\n class=\"toast-close\"\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"dismiss.emit()\"\n >\n <fold-icon name=\"close\" [size]=\"14\" aria-hidden=\"true\" />\n </button>\n}\n","import { InjectionToken, type Provider } from \"@angular/core\";\nimport type { FoldToastVariant } from \"./toast.types\";\n\n/**\n * App-level toast duration policy. A `show()` call with no explicit duration\n * resolves through it (see {@link resolveToastDuration}).\n */\nexport type FoldToastConfig = {\n /** Fallback for any variant without a per-variant entry. */\n defaultDurationMs?: number;\n /** Per-variant duration (ms) overrides. `0` = sticky (no auto-dismiss). */\n durationByVariant?: Partial<Record<FoldToastVariant, number>>;\n};\n\n/** DI token carrying the app's {@link FoldToastConfig}. Set via {@link provideFoldToasts}. */\nexport const FOLD_TOAST_CONFIG = new InjectionToken<FoldToastConfig>(\n \"FOLD_TOAST_CONFIG\",\n);\n\n/**\n * Configure the toast duration policy at bootstrap (idiomatic, like\n * `provideFoldIcons` / `provideFoldPalette`):\n *\n * ```ts\n * providers: [\n * provideFoldToasts({\n * defaultDurationMs: 4000,\n * durationByVariant: { success: 2000, error: 0 }, // 0 = sticky\n * }),\n * ];\n * ```\n */\nexport function provideFoldToasts(config: FoldToastConfig): Provider {\n return { provide: FOLD_TOAST_CONFIG, useValue: config };\n}\n\n/**\n * Package defaults when nothing is configured or passed — dwell scales with\n * severity, and an `error` is sticky (it must be dismissed, not missed). All\n * overridable via {@link provideFoldToasts} or an explicit `show()` argument.\n */\nexport const FOLD_BAKED_TOAST_DURATION_MS: Record<FoldToastVariant, number> = {\n success: 3000,\n info: 4000,\n warning: 6000,\n error: 0,\n};\n\n/**\n * Duration for a variant, most-specific first: `durationByVariant[variant]` →\n * `defaultDurationMs` → the baked default. A configured `0` stays sticky (`??`\n * only falls through on null/undefined).\n */\nexport function resolveToastDuration(\n config: FoldToastConfig | null,\n variant: FoldToastVariant,\n): number {\n return (\n config?.durationByVariant?.[variant] ??\n config?.defaultDurationMs ??\n FOLD_BAKED_TOAST_DURATION_MS[variant]\n );\n}\n","import { Service, inject, signal } from \"@angular/core\";\nimport { FOLD_TOAST_CONFIG, resolveToastDuration } from \"./toast.config\";\nimport type { FoldToast, FoldToastVariant } from \"./toast.types\";\n\n/**\n * Lightweight toast/snackbar service — the source of truth for the queue that\n * `fold-toast-container` renders. Fire-and-forget: `durationMs` rides on the\n * queued toast and the rendered `fold-toast` owns the auto-dismiss timer (it\n * emits back into {@link dismiss}); a click on its close button does the same.\n * `durationMs = 0` is sticky (no auto-dismiss — the user closes it).\n *\n * A `show()` with no explicit duration resolves it through the app's\n * {@link FoldToastConfig} (see {@link resolveToastDuration}); an explicit\n * argument always wins.\n *\n * ```ts\n * const toast = inject(FoldToastService);\n * toast.show(\"Track uploaded\", \"success\"); // policy duration\n * toast.show(\"Analysis failed\", \"error\", 5000); // explicit override\n * toast.show(\"Action required\", \"warning\", 0); // sticky\n * ```\n */\n@Service()\nexport class FoldToastService {\n private readonly config = inject(FOLD_TOAST_CONFIG, { optional: true });\n private readonly _toasts = signal<FoldToast[]>([]);\n\n /** The active toasts, oldest first. Read by the container. */\n readonly toasts = this._toasts.asReadonly();\n\n show(\n message: string,\n variant: FoldToastVariant = \"info\",\n durationMs?: number,\n ): void {\n const toast: FoldToast = {\n id: crypto.randomUUID(),\n message,\n variant,\n durationMs: durationMs ?? resolveToastDuration(this.config, variant),\n };\n\n this._toasts.update((list) => [...list, toast]);\n }\n\n dismiss(id: string): void {\n this._toasts.update((list) => list.filter((t) => t.id !== id));\n }\n}\n","import { Component, inject } from \"@angular/core\";\nimport { FoldToastComponent } from \"./toast.component\";\nimport { FoldToastService } from \"./toast.service\";\n\n/**\n * `<fold-toast-container>` — renders the {@link FoldToastService} queue as a stack\n * of `fold-toast` snackbars, bottom-right, above everything. Mount it **once**\n * (typically in the app shell's content region). It owns only the stacking and\n * positioning; each {@link FoldToastComponent} owns its own surface, and the\n * service handles auto-expiry. A toast's dismiss button removes it from the queue.\n *\n * @selector `fold-toast-container`\n */\n@Component({\n selector: \"fold-toast-container\",\n standalone: true,\n imports: [FoldToastComponent],\n host: { class: \"toast-host\" },\n templateUrl: \"./toast-container.component.html\",\n styleUrl: \"./toast-container.component.scss\",\n})\nexport class FoldToastContainerComponent {\n readonly toastService = inject(FoldToastService);\n}\n","@for (toast of toastService.toasts(); track toast.id) {\n <fold-toast\n [variant]=\"toast.variant\"\n [duration]=\"toast.durationMs\"\n animate.leave=\"toast-leaving\"\n (dismiss)=\"toastService.dismiss(toast.id)\"\n >{{ toast.message }}</fold-toast\n >\n}\n","import {\n Directive,\n ViewContainerRef,\n effect,\n inject,\n input,\n} from \"@angular/core\";\nimport type { FoldComponentPanelDescriptor } from \"./panel.types\";\n\n/**\n * Mounts an imperatively-opened panel component inside the host: creates it with\n * the descriptor's injector (which provides its `FoldPanelRef`) and pushes the typed\n * `data` in via `setInput`. The component owns its own header/body/footer.\n */\n@Directive({ selector: \"[foldPanelComponentOutlet]\" })\nexport class FoldPanelComponentOutletDirective {\n readonly descriptor = input.required<FoldComponentPanelDescriptor>({\n alias: \"foldPanelComponentOutlet\",\n });\n\n private readonly viewContainer = inject(ViewContainerRef);\n\n constructor() {\n effect(() => {\n const descriptor = this.descriptor();\n this.viewContainer.clear();\n const ref = this.viewContainer.createComponent(descriptor.component, {\n injector: descriptor.injector,\n });\n if (descriptor.data !== undefined) {\n ref.setInput(\"data\", descriptor.data);\n }\n });\n }\n}\n","/**\n * Handle to an imperatively-opened panel. The opener gets it back from\n * `FoldPanelHostService.open()`; the panel component gets the same instance via\n * `inject(FoldPanelRef)`. Either side calls `close(result)` — the panel is\n * dismissed and `closed` resolves with the (typed) result.\n */\nexport class FoldPanelRef<TResult = unknown> {\n /** Resolves with the close result (or `undefined` if closed without one). */\n readonly closed: Promise<TResult | undefined>;\n\n private resolveClosed!: (result: TResult | undefined) => void;\n private settled = false;\n\n /**\n * @param id the panel's stable id — used to wire the dialog's accessible\n * name (`aria-labelledby` → the header's title `id`).\n * @param dismiss removes the panel from the host.\n */\n constructor(\n readonly id: number,\n private readonly dismiss: (result: TResult | undefined) => void,\n ) {\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n }\n\n /** Dismiss the panel, returning an optional result to the opener. */\n close(result?: TResult): void {\n if (this.settled) {\n return;\n }\n this.settled = true;\n this.dismiss(result);\n this.resolveClosed(result);\n }\n}\n","import { InjectionToken, type Provider } from \"@angular/core\";\n\n/**\n * App-wide default for a panel header's close-button label. Lets a non-English\n * app set the label **once** — every `fold-panel-header` (the host's template\n * panels and each feature's component panel) reads it, so there is no per-panel\n * wiring. A `closeLabel` input on a specific header still wins.\n */\nexport const FOLD_PANEL_CLOSE_LABEL = new InjectionToken<string>(\n \"FOLD_PANEL_CLOSE_LABEL\",\n { factory: () => \"Close\" },\n);\n\n/** Overridable panel labels. */\nexport interface FoldPanelLabels {\n /** Close-button accessible label. */\n readonly close: string;\n}\n\n/**\n * Provide app-wide panel labels once at bootstrap.\n *\n * @example\n * ```ts\n * // app.config.ts\n * providers: [provideFoldPanelLabels({ close: \"Fermer\" })];\n * ```\n */\nexport function provideFoldPanelLabels(labels: FoldPanelLabels): Provider {\n return { provide: FOLD_PANEL_CLOSE_LABEL, useValue: labels.close };\n}\n","import type {\n InputSignal,\n Injector,\n Provider,\n Signal,\n TemplateRef,\n Type,\n} from \"@angular/core\";\n\n/** Which layout edge the panel slides in from. */\nexport type FoldPanelSide = \"left\" | \"right\";\n\n/** Fields common to every panel the host renders. */\ninterface PanelBase {\n readonly id: number;\n readonly side: FoldPanelSide;\n readonly width: Signal<number>;\n /** Invoked on Escape, backdrop click, or the header close button. */\n readonly onClose: () => void;\n}\n\n/**\n * Declarative panel: a projected `TemplateRef` plus reactive header metadata.\n * Title/subtitle are `Signal`s so the shared header stays in sync with the\n * caller's `title()`/`subtitle()` inputs with zero manual wiring.\n */\nexport interface FoldTemplatePanelDescriptor extends PanelBase {\n readonly kind: \"template\";\n readonly templateRef: TemplateRef<unknown>;\n readonly title: Signal<string>;\n readonly subtitle: Signal<string>;\n}\n\n/**\n * Imperative panel: a component the host mounts. The component owns its own\n * header/body/footer (so rich panels like the org-chart node settings keep\n * their exact design); the host provides only the shell + a {@link FoldPanelRef}.\n */\nexport interface FoldComponentPanelDescriptor extends PanelBase {\n readonly kind: \"component\";\n readonly component: Type<unknown>;\n /** Typed at the `open()` boundary; set via `setInput` when present. */\n readonly data?: unknown;\n /** Injector that provides the panel's `FoldPanelRef` (+ any config providers). */\n readonly injector: Injector;\n /**\n * Explicit accessible name. Optional: a panel that renders `fold-panel-header`\n * is named automatically (the dialog's `aria-labelledby` points at the\n * header's title). Set this only for a component panel that has no\n * `fold-panel-header` to label it. (Carried straight from `config.ariaLabel`,\n * hence the explicit `| undefined`.)\n */\n readonly ariaLabel?: string | undefined;\n}\n\nexport type FoldPanelDescriptor =\n FoldTemplatePanelDescriptor | FoldComponentPanelDescriptor;\n\n/**\n * A component opened imperatively. Data-carrying panels declare a typed `data`\n * input; data-less panels (e.g. a help panel) simply omit it.\n */\nexport interface FoldPanelContent<TData> {\n readonly data?: InputSignal<TData>;\n}\n\n/** Options for `FoldPanelHostService.open()`. */\nexport interface FoldPanelConfig<TData> {\n /** Type-checked against the component's `data` input; omit for data-less panels. */\n readonly data?: TData;\n readonly side?: FoldPanelSide;\n readonly width?: number;\n /** Extra providers added to the panel's injector (panel-scoped data bus, etc.). */\n readonly providers?: Provider[];\n /**\n * Keep any already-open panels instead of replacing them. Default `false`:\n * one panel at a time — opening a new panel closes the current one.\n */\n readonly stack?: boolean;\n /**\n * Explicit accessible name for the dialog. Only needed when the panel does\n * **not** render `fold-panel-header` (which names the dialog automatically).\n */\n readonly ariaLabel?: string;\n}\n\n/** The DOM `id` of a panel's title, referenced by the dialog's `aria-labelledby`. */\nexport function foldPanelTitleId(panelId: number): string {\n return `fold-panel-title-${panelId}`;\n}\n\n/** Handle returned by `present()`; the caller dismisses via `dismiss()`. */\nexport interface FoldPanelHandle {\n readonly id: number;\n dismiss(): void;\n}\n","import { Component, computed, inject, input, output } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FoldPanelRef } from \"./panel-ref\";\nimport { FOLD_PANEL_CLOSE_LABEL } from \"./panel-labels\";\nimport { foldPanelTitleId } from \"./panel.types\";\n\n/**\n * Standard header for an **imperative** panel component (`panels.open()`), which\n * owns its own header/body/footer — the chrome renders no header for it. This\n * reproduces the chrome's declarative-panel header (title + optional subtitle +\n * close) so every component panel gets the same look without hand-rolling it.\n *\n * **Two variants.**\n * - `title` (default) — a large descriptive title for *editor* panels (a form,\n * an entity's settings): `title` + optional `subtitle` + projected description.\n * - `eyebrow` — a compact, uppercased, muted *category label* for *viewer*\n * panels (a page-like entity with cross-navigation): `icon` + short label,\n * with header actions sitting inline before the close.\n *\n * **Icon.** Optional leading `icon` (an {@link FoldIconComponent} name), shown in\n * both variants — muted in `eyebrow`.\n *\n * **Actions slot.** Project buttons into `[actions]` to sit left of the close\n * button (e.g. a cross-page-nav, an \"open full page\" button). The default,\n * unselected slot still feeds the description line (backwards compatible).\n *\n * **Self-closing.** The header injects its panel's {@link FoldPanelRef} (optional,\n * so it stays a pure presentational component in tests/storybook) and dismisses\n * the panel itself on close — no `(closed)=\"ref.close()\"` wiring needed. The\n * `(closed)` output still fires *before* the dismiss, for side-effects\n * (analytics, cleanup); it does **not** veto the close.\n *\n * **Layout.** Left-aligned. A title-only header (no subtitle, no projected\n * description) is *vertically* centred against the close button; add a subtitle\n * and/or project a description and the row switches to top-aligned. The\n * `eyebrow` variant is always vertically centred.\n *\n * Usage:\n * ```html\n * <!-- editor panel: title only → vertically centred, self-closes -->\n * <fold-panel-header title=\"Titre\" />\n *\n * <!-- editor panel: subtitle + a parent-filled description -->\n * <fold-panel-header title=\"Titre\" subtitle=\"Sous-titre\">\n * <span>Texte d'aide fourni par le parent…</span>\n * </fold-panel-header>\n *\n * <!-- viewer panel: eyebrow label + icon + projected actions -->\n * <fold-panel-header variant=\"eyebrow\" icon=\"playlist-add\" title=\"Playlist\">\n * <app-cross-page-nav actions … />\n * </fold-panel-header>\n * ```\n */\n@Component({\n selector: \"fold-panel-header\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./panel-header.component.html\",\n styleUrl: \"./panel-header.component.scss\",\n})\nexport class FoldPanelHeaderComponent {\n readonly title = input.required<string>();\n readonly subtitle = input<string>(\"\");\n /** Optional leading icon (an {@link FoldIconComponent} name). */\n readonly icon = input<FoldIconName | undefined>(undefined);\n /** `title` (large descriptive) or `eyebrow` (compact uppercased label). */\n readonly variant = input<\"title\" | \"eyebrow\">(\"title\");\n /**\n * Accessible label for the close button. Falls back to the app-wide\n * {@link FOLD_PANEL_CLOSE_LABEL} (default `\"Close\"`) when unset — so a\n * non-English app sets it once via `provideFoldPanelLabels`.\n */\n readonly closeLabel = input<string>();\n\n private readonly defaultCloseLabel = inject(FOLD_PANEL_CLOSE_LABEL);\n\n /** The label actually rendered — the input if given, else the app default. */\n protected readonly effectiveCloseLabel = computed(\n () => this.closeLabel() ?? this.defaultCloseLabel,\n );\n /**\n * Fires just before the panel is dismissed — bind it for side-effects only\n * (the header self-closes regardless; it is not a veto hook).\n */\n readonly closed = output();\n\n protected readonly iconSize = computed(() =>\n this.variant() === \"eyebrow\" ? 14 : 18,\n );\n\n /**\n * The panel this header lives in. Optional: outside a panel (tests,\n * storybook) it resolves to `null` and the header simply emits `(closed)`.\n */\n private readonly panelRef = inject(FoldPanelRef, { optional: true });\n\n /**\n * The title's DOM `id`, so the dialog's `aria-labelledby` can point at it —\n * this is what gives a component panel its accessible name. `null` outside a\n * panel (no ref to key the id on).\n */\n protected readonly titleId = computed<string | null>(() =>\n this.panelRef ? foldPanelTitleId(this.panelRef.id) : null,\n );\n\n protected onClose(): void {\n this.closed.emit();\n this.panelRef?.close();\n }\n}\n","<header class=\"ph\" [class.ph--eyebrow]=\"variant() === 'eyebrow'\">\n <div class=\"ph__titles\">\n <div class=\"ph__titleRow\">\n @if (icon(); as ic) {\n <fold-icon class=\"ph__icon\" [name]=\"ic\" [size]=\"iconSize()\" />\n }\n <h2 class=\"ph__title\" [attr.id]=\"titleId()\">{{ title() }}</h2>\n </div>\n @if (subtitle()) {\n <p class=\"ph__subtitle\">{{ subtitle() }}</p>\n }\n <div class=\"ph__desc\"><ng-content /></div>\n </div>\n <div class=\"ph__actions\">\n <ng-content select=\"[actions]\" />\n <button\n type=\"button\"\n class=\"ph__close\"\n [attr.aria-label]=\"effectiveCloseLabel()\"\n (click)=\"onClose()\"\n >\n <fold-icon name=\"close\" size=\"sm\" />\n </button>\n </div>\n</header>\n","import { Injector, Service, type Type, inject, signal } from \"@angular/core\";\nimport { FoldPanelRef } from \"./panel-ref\";\nimport type {\n FoldComponentPanelDescriptor,\n FoldPanelConfig,\n FoldPanelContent,\n FoldPanelDescriptor,\n FoldPanelHandle,\n FoldTemplatePanelDescriptor,\n} from \"./panel.types\";\n\n/**\n * Single source of truth for the layout-owned side-panel region.\n *\n * Two ways to hand a panel to the one host, both rendered through the same\n * `FoldPanelHostComponent` (backdrop, z-index, animation, scroll-lock, focus-trap):\n *\n * - **`open()` — the canonical, imperative API.** Open a component with a typed\n * `data` input; get a {@link FoldPanelRef} back for the result. No opaque token.\n * - **`present()` — declarative sugar** used by a `<side-panel>` wrapper to\n * teleport a projected template. Kept for page-coupled form drawers.\n */\n@Service()\nexport class FoldPanelHostService {\n private readonly rootInjector = inject(Injector);\n private nextId = 1;\n private readonly _panels = signal<readonly FoldPanelDescriptor[]>([]);\n\n /** The active panels, oldest first. Read by the layout host. */\n readonly panels = this._panels.asReadonly();\n\n // Data-carrying panel: `config.data` is type-checked against the component's\n // `data` input.\n open<TData, TResult = unknown>(\n component: Type<FoldPanelContent<TData>>,\n config: FoldPanelConfig<TData> & { data: TData },\n ): FoldPanelRef<TResult>;\n // Data-less panel (its data, if any, comes via `config.providers`).\n open<TResult = unknown>(\n component: Type<unknown>,\n config?: Omit<FoldPanelConfig<never>, \"data\">,\n ): FoldPanelRef<TResult>;\n open<TResult = unknown>(\n component: Type<unknown>,\n config: FoldPanelConfig<unknown> = {},\n ): FoldPanelRef<TResult> {\n const id = this.takeId();\n const ref = new FoldPanelRef<TResult>(id, () => this.dismiss(id));\n const injector = Injector.create({\n parent: this.rootInjector,\n providers: [\n { provide: FoldPanelRef, useValue: ref },\n ...(config.providers ?? []),\n ],\n });\n const descriptor: FoldComponentPanelDescriptor = {\n kind: \"component\",\n id,\n component,\n data: config.data,\n side: config.side ?? \"right\",\n width: signal(config.width ?? 490),\n injector,\n ariaLabel: config.ariaLabel,\n onClose: () => ref.close(),\n };\n if (!config.stack) {\n this.closeExisting();\n }\n this.add(descriptor);\n return ref;\n }\n\n /**\n * Register a declarative (projected-template) panel; returns a handle. These\n * are self-managed by their `<fold-side-panel>`'s `[open]` binding, so they are\n * not subject to the imperative single-panel replacement.\n */\n present(\n descriptor: Omit<FoldTemplatePanelDescriptor, \"id\" | \"kind\">,\n ): FoldPanelHandle {\n const id = this.takeId();\n this.add({ ...descriptor, kind: \"template\", id });\n return { id, dismiss: () => this.dismiss(id) };\n }\n\n /**\n * Close every open panel through its own `onClose` — so each opener's\n * `FoldPanelRef`/toggle settles — before a new single panel takes over. Iterates\n * a snapshot, so the `onClose`-driven removals don't disturb the loop.\n */\n private closeExisting(): void {\n for (const panel of this._panels()) {\n panel.onClose();\n }\n }\n\n /** Remove a panel by id (idempotent — dismissing twice is safe). */\n dismiss(id: number): void {\n this._panels.update((list) => list.filter((panel) => panel.id !== id));\n }\n\n /** Dismiss every open panel (e.g. on a hard navigation / logout). */\n dismissAll(): void {\n this._panels.set([]);\n }\n\n private takeId(): number {\n const id = this.nextId;\n this.nextId += 1;\n return id;\n }\n\n private add(descriptor: FoldPanelDescriptor): void {\n this._panels.update((list) => [...list, descriptor]);\n }\n}\n","import { DOCUMENT, NgTemplateOutlet } from \"@angular/common\";\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n effect,\n inject,\n} from \"@angular/core\";\nimport { FocusTrapDirective } from \"../../../a11y/focus-trap.directive\";\nimport { ScrollLockService } from \"../../../a11y/scroll-lock.service\";\nimport { FoldPanelComponentOutletDirective } from \"./panel-component-outlet.directive\";\nimport { FoldPanelHeaderComponent } from \"./panel-header.component\";\nimport { FoldPanelHostService } from \"./panel-host.service\";\nimport { foldPanelTitleId } from \"./panel.types\";\nimport type { FoldPanelDescriptor } from \"./panel.types\";\n\n/**\n * `<fold-panel-host>` — the single, layout-owned chrome for every side panel.\n *\n * Rendered **once** in the content region (typically inside the app shell). It\n * reads the {@link FoldPanelHostService} panels and wraps each in a **glass**\n * slide-in `<aside>` (no dark scrim — the surface itself is frosted),\n * `z-index: 50` stacking, focus-trap and body scroll-lock.\n *\n * Two content shapes:\n * - **template** — a projected `<side-panel>` body; the host supplies the shared\n * header (title/subtitle/close).\n * - **component** — an imperatively-opened component that owns its whole\n * header/body/footer; the host supplies only the shell.\n *\n * **Modal barrier.** While any panel is open, everything outside the panel is\n * marked `inert` (a `hideOthers` walk from the host up to `<body>`), so the\n * background is unreachable by pointer, Tab **and** the screen-reader virtual\n * cursor — the completion of the `aria-modal=\"true\"` promise. Only the\n * top-most panel traps focus; the page scroll is frozen once, not per panel.\n *\n * @selector `fold-panel-host`\n */\n@Component({\n selector: \"fold-panel-host\",\n standalone: true,\n imports: [\n NgTemplateOutlet,\n FocusTrapDirective,\n FoldPanelComponentOutletDirective,\n FoldPanelHeaderComponent,\n ],\n templateUrl: \"./panel-host.component.html\",\n styleUrl: \"./panel-host.component.scss\",\n})\nexport class FoldPanelHostComponent {\n private readonly host = inject(FoldPanelHostService);\n private readonly scrollLock = inject(ScrollLockService);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n\n readonly panels = this.host.panels;\n\n private locked = false;\n /** Elements this host made `inert`, so it removes exactly those on close. */\n private inerted: HTMLElement[] = [];\n\n constructor() {\n // Freeze page scroll + inert the background while any panel is open — once,\n // driven by whether the panel list is non-empty.\n effect(() => {\n const open = this.panels().length > 0;\n if (open && !this.locked) {\n this.scrollLock.lock();\n this.applyBackgroundBarrier();\n this.locked = true;\n } else if (!open && this.locked) {\n this.scrollLock.unlock();\n this.removeBackgroundBarrier();\n this.locked = false;\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n if (this.locked) {\n this.scrollLock.unlock();\n this.removeBackgroundBarrier();\n this.locked = false;\n }\n });\n }\n\n /** Explicit `aria-label`, or null when the name comes from `aria-labelledby`. */\n ariaLabel(panel: FoldPanelDescriptor): string | null {\n if (panel.kind === \"template\") {\n return panel.title();\n }\n return panel.ariaLabel ?? null;\n }\n\n /**\n * `aria-labelledby` id for a component panel with no explicit label — points\n * at the `fold-panel-header` title. Null for template panels (they use\n * `aria-label`) and for component panels given an explicit `ariaLabel`.\n */\n ariaLabelledby(panel: FoldPanelDescriptor): string | null {\n if (panel.kind === \"component\" && !panel.ariaLabel) {\n return foldPanelTitleId(panel.id);\n }\n return null;\n }\n\n /** Only the last-opened panel traps focus, so stacked panels don't fight. */\n isTopMost(panel: FoldPanelDescriptor): boolean {\n const panels = this.panels();\n const top = panels[panels.length - 1];\n return top?.id === panel.id;\n }\n\n /** Escape closes the top-most (last-opened) panel. */\n @HostListener(\"document:keydown.escape\")\n onEscape(): void {\n const top = this.panels().at(-1);\n top?.onClose();\n }\n\n onBackdrop(event: MouseEvent, panel: FoldPanelDescriptor): void {\n if (event.target === event.currentTarget) {\n panel.onClose();\n }\n }\n\n /**\n * Mark every branch of the DOM that doesn't contain this host as `inert`, from\n * the host up to `<body>`. Skips elements already inert (so a nested overlay's\n * barrier isn't torn down here). The panels live inside this host, so they\n * stay interactive.\n */\n private applyBackgroundBarrier(): void {\n let node: HTMLElement | null = this.element.nativeElement;\n const body = this.document.body;\n while (node && node !== body && node.parentElement) {\n for (const sibling of Array.from(node.parentElement.children)) {\n if (\n sibling !== node &&\n sibling instanceof HTMLElement &&\n !sibling.hasAttribute(\"inert\")\n ) {\n sibling.setAttribute(\"inert\", \"\");\n this.inerted.push(sibling);\n }\n }\n node = node.parentElement;\n }\n }\n\n private removeBackgroundBarrier(): void {\n for (const el of this.inerted) {\n el.removeAttribute(\"inert\");\n }\n this.inerted = [];\n }\n}\n","@for (panel of panels(); track panel.id) {\n <div\n class=\"panel-dock\"\n [class.panel-dock--left]=\"panel.side === 'left'\"\n (click)=\"onBackdrop($event, panel)\"\n >\n <aside\n class=\"panel\"\n [class.panel--left]=\"panel.side === 'left'\"\n [style.--panel-width.px]=\"panel.width()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"ariaLabel(panel)\"\n [attr.aria-labelledby]=\"ariaLabelledby(panel)\"\n tabindex=\"-1\"\n [foldFocusTrap]=\"isTopMost(panel)\"\n (click)=\"$event.stopPropagation()\"\n >\n @if (panel.kind === \"template\") {\n <fold-panel-header\n [title]=\"panel.title()\"\n [subtitle]=\"panel.subtitle()\"\n (closed)=\"panel.onClose()\"\n />\n <div class=\"panel-body\">\n <ng-container [ngTemplateOutlet]=\"panel.templateRef\" />\n </div>\n } @else {\n <ng-container [foldPanelComponentOutlet]=\"panel\" />\n }\n </aside>\n </div>\n}\n","import { type Type, type WritableSignal, signal } from \"@angular/core\";\nimport type { FoldPanelHostService } from \"./panel-host.service\";\nimport type { FoldPanelRef } from \"./panel-ref\";\nimport type { FoldPanelContent, FoldPanelSide } from \"./panel.types\";\n\n/**\n * A single open-or-close panel button's worth of state. Wraps\n * `FoldPanelHostService.open()` so a page can `toggle(data)` without hand-tracking\n * the `FoldPanelRef` and re-syncing when the panel closes from the inside.\n *\n * `isOpen` stays truthful whether the panel is closed by a second toggle, its\n * own close button, or Escape — it mirrors the ref's `closed` promise.\n */\nexport class FoldPanelToggle<TData> {\n /** Reactive open-state, safe to bind in a template (e.g. an active pill). */\n readonly isOpen: WritableSignal<boolean> = signal(false);\n\n private ref: FoldPanelRef | null = null;\n\n constructor(\n private readonly host: FoldPanelHostService,\n private readonly component: Type<FoldPanelContent<TData>>,\n private readonly side: FoldPanelSide = \"right\",\n ) {}\n\n /** Open with `data`, or close if already open. */\n toggle(data: TData): void {\n if (this.ref) {\n this.ref.close();\n return;\n }\n const ref = this.host.open<TData>(this.component, {\n data,\n side: this.side,\n });\n this.ref = ref;\n this.isOpen.set(true);\n void ref.closed.then(() => {\n this.ref = null;\n this.isOpen.set(false);\n });\n }\n\n /** Close if open (no-op otherwise). */\n close(): void {\n this.ref?.close();\n }\n}\n","// Public TypeScript API for fold-ng.\n//\n// The tokens themselves ship as CSS (import 'fold-ng/tokens.css').\n// This entry point exposes the typed token catalogue + helpers so call\n// sites get autocomplete and a compile error on a misspelt token.\n\nexport { FoldAppShellComponent } from \"./components/layout/app-shell/app-shell.component\";\nexport {\n FoldAvatarComponent,\n type FoldAvatarVariant,\n type FoldAvatarRing,\n type FoldAvatarRingStyle,\n} from \"./components/content/avatar/avatar.component\";\nexport { FoldAvatarDetailComponent } from \"./components/content/avatar-detail/avatar-detail.component\";\nexport {\n FoldAvatarListComponent,\n type FoldAvatarListItem,\n} from \"./components/content/avatar-list/avatar-list.component\";\nexport {\n FoldBadgeComponent,\n type FoldBadgeVariant,\n} from \"./components/content/badge/badge.component\";\nexport { FoldButtonComponent } from \"./components/actions/button/button.component\";\nexport type {\n FoldButtonEmphasis,\n FoldButtonIntent,\n FoldButtonSize,\n FoldButtonShape,\n} from \"./components/actions/button/button.types\";\nexport { FoldButtonIconComponent } from \"./components/actions/button-icon/button-icon.component\";\nexport type {\n FoldButtonIconShape,\n FoldButtonIconSize,\n FoldButtonIconTone,\n} from \"./components/actions/button-icon/button-icon.types\";\nexport { FoldToggleIconComponent } from \"./components/actions/toggle-icon/toggle-icon.component\";\nexport { FoldCardComponent } from \"./components/content/card/card.component\";\nexport { FoldContextCardComponent } from \"./components/content/context-card/context-card.component\";\nexport { FoldElementTitleComponent } from \"./components/content/element-title/element-title.component\";\nexport { FoldFileDropzoneComponent } from \"./components/forms/file-dropzone/file-dropzone.component\";\nexport { FoldFieldListComponent } from \"./components/content/field/field-list.component\";\nexport { FoldFieldComponent } from \"./components/content/field/field.component\";\nexport { FoldLinkComponent } from \"./components/actions/link/link.component\";\nexport { FoldMenuComponent } from \"./components/navigation/menu/menu.component\";\nexport type {\n FoldMenuTint,\n FoldMenuTogglePlacement,\n FoldMenuLevel,\n} from \"./components/navigation/menu/menu.component\";\nexport {\n FoldMenuItemComponent,\n type FoldMenuItemBadgeTone,\n} from \"./components/navigation/menu/menu-item.component\";\nexport { FoldMenuSeparatorComponent } from \"./components/navigation/menu/menu-separator.component\";\nexport { FoldMenuSectionComponent } from \"./components/navigation/menu/menu-section.component\";\nexport { FoldNavLauncherComponent } from \"./components/navigation/nav-launcher/nav-launcher.component\";\nexport { FoldNavTileComponent } from \"./components/navigation/nav-launcher/nav-tile.component\";\nexport { FoldHeroCardComponent } from \"./components/content/hero-card/hero-card.component\";\nexport { FoldDataTableComponent } from \"./components/content/data-table/data-table.component\";\nexport { FoldDataTableCellDirective } from \"./components/content/data-table/data-table-cell.directive\";\nexport {\n FoldStickyColumnDirective,\n type FoldStickyColumnAnchor,\n} from \"./directives/sticky-column.directive\";\nexport type {\n FoldTableColumn,\n FoldTableEmpty,\n FoldTableSort,\n FoldTableSortDir,\n FoldTableTone,\n} from \"./components/content/data-table/data-table.types\";\nexport { FoldChoiceRowComponent } from \"./components/content/choice-row/choice-row.component\";\nexport type { FoldChoiceOption } from \"./components/content/choice-row/choice-row.component\";\nexport { FoldIconComponent } from \"./components/foundations/icon/icon.component\";\nexport { FoldSpinnerComponent } from \"./components/foundations/spinner/spinner.component\";\nexport type { FoldSpinnerSize } from \"./components/foundations/spinner/spinner.component\";\nexport { FoldIdService } from \"./a11y/id.service\";\nexport { FoldFieldIdDirective } from \"./a11y/field-id.directive\";\nexport { FoldRepeatPressDirective } from \"./directives/repeat-press.directive\";\nexport { observeElementWidth } from \"./dom/observe-element-width\";\nexport { FoldSurfaceDirective } from \"./directives/surface.directive\";\nexport type { FoldSurfaceName } from \"./directives/surface.directive\";\nexport { FoldElevatedDirective } from \"./directives/elevated.directive\";\nexport { FoldInputComponent } from \"./components/forms/input/input.component\";\nexport {\n FoldNumberInputComponent,\n type FoldNumberSpinner,\n type FoldNumberControls,\n} from \"./components/forms/input/number-input.component\";\nexport { FoldSearchComponent } from \"./components/forms/input/search.component\";\nexport { FoldSelectComponent } from \"./components/forms/input/select.component\";\nexport { FoldSliderComponent } from \"./components/forms/slider/slider.component\";\nexport { FoldRangeSliderComponent } from \"./components/forms/slider/range-slider.component\";\nexport type { FoldRangeValue } from \"./components/forms/slider/range-slider.component\";\nexport { FoldCalloutComponent } from \"./components/feedback/callout/callout.component\";\nexport type {\n FoldCalloutVariant,\n FoldCalloutAppearance,\n} from \"./components/feedback/callout/callout.component\";\nexport { FoldDisclosureComponent } from \"./components/feedback/disclosure/disclosure.component\";\nexport { FoldStatusBadgeComponent } from \"./components/content/status-badge/status-badge.component\";\nexport { FoldTimelineComponent } from \"./components/content/timeline/timeline.component\";\nexport type {\n FoldTimelineNode,\n FoldTimelineDatePlacement,\n} from \"./components/content/timeline/timeline.component\";\nexport { FoldLoadingStateComponent } from \"./components/feedback/state/loading-state.component\";\nexport { FoldEmptyStateComponent } from \"./components/feedback/state/empty-state.component\";\nexport type { FoldIconSize } from \"./components/foundations/icon/icon.component\";\nexport {\n FoldIconRegistry,\n provideFoldIcons,\n} from \"./components/foundations/icon/icon-registry.service\";\nexport type { FoldIconSet } from \"./components/foundations/icon/icon-registry.service\";\nexport { FOLD_BUILTIN_ICONS } from \"./components/foundations/icon/builtin-icons\";\nexport type {\n FoldIconName,\n FoldBuiltinIconName,\n} from \"./components/foundations/icon/builtin-icons\";\nexport { FoldAsideLayoutComponent } from \"./components/layout/aside-layout/aside-layout.component\";\nexport { FoldTabLayoutComponent } from \"./components/layout/tab-layout/tab-layout.component\";\nexport { FoldPageLayoutComponent } from \"./components/layout/page-layout/page-layout.component\";\nexport { FoldPageSectionComponent } from \"./components/layout/page-section/page-section.component\";\nexport { FoldHeroSectionComponent } from \"./components/layout/hero-section/hero-section.component\";\nexport { FoldPaginatorComponent } from \"./components/content/paginator/paginator.component\";\nexport type { FoldPageItem } from \"./components/content/paginator/paginator.component\";\nexport { FoldTabNavComponent } from \"./components/navigation/tab-nav/tab-nav.component\";\nexport type { FoldTabNavItem } from \"./components/navigation/tab-nav/tab-nav.component\";\nexport { FoldToastComponent } from \"./components/feedback/toast/toast.component\";\nexport { FoldToastContainerComponent } from \"./components/feedback/toast/toast-container.component\";\nexport { FoldToastService } from \"./components/feedback/toast/toast.service\";\nexport {\n provideFoldToasts,\n FOLD_TOAST_CONFIG,\n} from \"./components/feedback/toast/toast.config\";\nexport type { FoldToastConfig } from \"./components/feedback/toast/toast.config\";\nexport type {\n FoldToast,\n FoldToastVariant,\n} from \"./components/feedback/toast/toast.types\";\n\n// ── Panels (overlay system) ──────────────────────────────────\nexport { FoldPanelHostComponent } from \"./components/overlays/panel/panel-host.component\";\nexport { FoldPanelHeaderComponent } from \"./components/overlays/panel/panel-header.component\";\nexport { FoldPanelHostService } from \"./components/overlays/panel/panel-host.service\";\nexport { FoldPanelRef } from \"./components/overlays/panel/panel-ref\";\nexport { FoldPanelToggle } from \"./components/overlays/panel/panel-toggle\";\nexport { FoldPanelComponentOutletDirective } from \"./components/overlays/panel/panel-component-outlet.directive\";\nexport {\n provideFoldPanelLabels,\n FOLD_PANEL_CLOSE_LABEL,\n} from \"./components/overlays/panel/panel-labels\";\nexport type { FoldPanelLabels } from \"./components/overlays/panel/panel-labels\";\nexport type {\n FoldPanelSide,\n FoldPanelContent,\n FoldPanelConfig,\n FoldPanelHandle,\n FoldPanelDescriptor,\n FoldTemplatePanelDescriptor,\n FoldComponentPanelDescriptor,\n} from \"./components/overlays/panel/panel.types\";\n\n// NB: FocusTrapDirective + ScrollLockService stay package-internal — the panel\n// host is their only consumer. Promote to the public API when one appears.\n\n// ── Auto-colour (categorical palettes + the app-wide registry) ─\nexport {\n FoldPaletteRegistry,\n provideFoldPalette,\n FOLD_PALETTE_DEFAULT,\n} from \"./color/palette-registry.service\";\nexport {\n FOLD_AUTO_PALETTES,\n foldHashSeed,\n foldResolvePalette,\n} from \"./color/palettes\";\nexport type { FoldAutoPaletteName, FoldPaletteInput } from \"./color/palettes\";\n\nexport {\n FOLD_SEMANTIC_COLOR_TOKENS,\n FOLD_RADIUS_TOKENS,\n FOLD_TEXT_TOKENS,\n FOLD_SPACE_TOKENS,\n FOLD_MOTION_TOKENS,\n FOLD_BLUR_TOKENS,\n FOLD_SHADOW_TOKENS,\n foldColorProperty,\n foldColorVar,\n foldRadiusVar,\n foldTextVar,\n foldSpaceVar,\n foldMotionVar,\n foldBlurVar,\n foldShadowVar,\n} from \"./tokens/tokens.catalog\";\nexport type {\n FoldSemanticColorToken,\n FoldRadiusToken,\n FoldTextToken,\n FoldSpaceToken,\n FoldMotionToken,\n FoldBlurToken,\n FoldShadowToken,\n} from \"./tokens/tokens.catalog\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|