fold-ng 0.4.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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/color/contrast.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/nav-layout/nav-layout.context.ts","../../src/components/layout/nav-layout/nav-layout.component.ts","../../src/components/layout/nav-layout/nav-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/view-nav/view-nav.component.ts","../../src/components/navigation/view-nav/view-nav.component.html","../../src/components/navigation/tabs/tabs.component.ts","../../src/components/navigation/tabs/tabs.component.html","../../src/components/navigation/tabs/tab-panel.component.ts","../../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 theme\n * may colour differently from the page; `accent` is an **auto-inverting** region\n * filled with the brand accent, whose content re-points to a compatible\n * on-accent palette (see the `[data-surface=\"accent\"]` block in `semantic.css`).\n */\nexport type FoldSurfaceName = \"page\" | \"chrome\" | \"accent\";\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","/**\n * Small WCAG colour-contrast helpers — used to pick a legible ink for text on a\n * categorical fill (avatar initials), and lockable by a contrast test.\n *\n * These operate on plain hex strings (`#rgb` / `#rrggbb`); a categorical palette\n * is qualitative *data* (hex is allowed there — rule 5.3), so contrast can't be\n * a token concern and lives here.\n */\n\n/** Parse `#rgb` / `#rrggbb` to `[r, g, b]` (0–255), or `null` if not a hex. */\nfunction parseHex(hex: string): [number, number, number] | null {\n const h = hex.trim().replace(/^#/, \"\");\n const full =\n h.length === 3\n ? h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : h;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) {\n return null;\n }\n return [\n parseInt(full.slice(0, 2), 16),\n parseInt(full.slice(2, 4), 16),\n parseInt(full.slice(4, 6), 16),\n ];\n}\n\n/** WCAG relative luminance of a hex colour, or `null` if it isn't a hex. */\nexport function foldLuminance(hex: string): number | null {\n const rgb = parseHex(hex);\n if (!rgb) {\n return null;\n }\n const lin = (c: number): number => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * lin(rgb[0]) + 0.7152 * lin(rgb[1]) + 0.0722 * lin(rgb[2]);\n}\n\n/** WCAG contrast ratio between two hex colours (1–21), or `null` if either\n * isn't a hex. */\nexport function foldContrast(a: string, b: string): number | null {\n const la = foldLuminance(a);\n const lb = foldLuminance(b);\n if (la === null || lb === null) {\n return null;\n }\n const [hi, lo] = la >= lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/**\n * The **more legible** of two inks for text drawn on `fill` — whichever has the\n * higher WCAG contrast. Picking the max (rather than thresholding luminance)\n * guarantees the best of the pair for *any* fill: at the black/white crossover\n * both inks already clear ~4.5:1, so every fill lands at or above it. A non-hex\n * `fill` falls back to `dark`.\n */\nexport function foldReadableInk(\n fill: string,\n dark: string,\n light: string,\n): string {\n const withDark = foldContrast(fill, dark);\n const withLight = foldContrast(fill, light);\n if (withDark === null || withLight === null) {\n return dark;\n }\n return withDark >= withLight ? dark : light;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n linkedSignal,\n} from \"@angular/core\";\nimport { FoldPaletteRegistry } from \"../../../color/palette-registry.service\";\nimport { foldReadableInk } from \"../../../color/contrast\";\n\n/** Ink for text on a light vs dark categorical fill. */\nconst DARK_INK = \"#1a202c\";\nconst LIGHT_INK = \"#ffffff\";\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 * A broken `imageUrl` falls back to the initials rather than the browser's\n * broken-image glyph (and retries when the URL changes).\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. The ring is a\n * redundant emphasis cue — never the sole carrier of a state — because on a\n * light page a soft status hue (amber/green) can't clear WCAG 3:1 as a thin\n * line (status-ring-contrast.spec.ts).\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; falls back to initials if it fails to load. |\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 * @example\n * ```html\n * <fold-avatar name=\"Clément Aubry\" size=\"lg\" />\n * <fold-avatar name=\"Léa Petit\" ring=\"accent\" ringStyle=\"dotted\" />\n * <fold-avatar name=\"Acme Corp\" square imageUrl=\"/logo.svg\" />\n * ```\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 /** True once the `<img>` fails to load. Resets whenever `imageUrl` changes,\n * so a corrected URL is retried rather than staying on the fallback. */\n protected readonly imageFailed = linkedSignal(() => {\n this.imageUrl();\n return false;\n });\n /** Show the image only when a URL is set AND it has not failed — a broken URL\n * falls back to the initials instead of the browser's broken-image glyph. */\n protected readonly showImage = computed(\n () => Boolean(this.imageUrl()) && !this.imageFailed(),\n );\n\n /** Readable ink for the initials — the higher-contrast of dark/light ink on\n * the fill, so a custom palette stays legible. */\n protected readonly onColor = computed(() =>\n foldReadableInk(this.color(), DARK_INK, LIGHT_INK),\n );\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 (showImage()) {\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.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 [attr.title]=\"name()\"\n >\n <img\n [src]=\"imageUrl()\"\n [alt]=\"name()\"\n class=\"avatar-img\"\n (error)=\"imageFailed.set(true)\"\n />\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 * @example\n * ```html\n * <fold-avatar-detail primary=\"Alex Rivers\" secondary=\"alex@sh3pherd.dev\" />\n * <fold-avatar-detail primary=\"Acme Corp\" secondary=\"Organisation\" square />\n * ```\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-view-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/** Rail-width scale — the nav-rail hierarchy's shared widths, named to pair with\n * the `--fold-color-bg-rail-*` colours (primary app menu → secondary workspace /\n * aside → tertiary in-page nav). */\nexport const FOLD_RAIL_TOKENS = [\"primary\", \"secondary\", \"tertiary\"] as const;\n\nexport type FoldRailToken = (typeof FOLD_RAIL_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, output } from \"@angular/core\";\n\n/** Which band(s) carry a chrome treatment (a separator hairline or a raised\n * tint): neither, just the header, just the footer, or both. */\nexport type FoldCardBandChrome = \"none\" | \"header\" | \"footer\" | \"both\";\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) · `accent` (an accent-filled\n * card whose content sub-tree auto-inverts to a compatible on-accent palette).\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` — makes the whole card a clickable control (see below).\n * - `separators` — which bands get a hairline against the body:\n * `none` (default) · `header` · `footer` · `both`.\n * - `raisedBands` — which bands are tinted a step above the surface (fainter on\n * `sunken`): `none` (default) · `header` · `footer` · `both`.\n *\n * `separators` and `raisedBands` are per-band and independent axes, so a card can\n * have (say) a raised, un-separated header over a flush footer.\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 * **Interactive cards.** `interactive` turns the whole card into a real control:\n * the host gains `role=\"button\"`, `tabindex=\"0\"`, a focus ring and a hover lift,\n * and Enter / Space (or a click) emit `(activated)`. Give it an accessible name\n * with `ariaLabel` when the card's text isn't a sufficient label.\n * A `role=\"button\"` must not wrap other interactive controls — so an interactive\n * card must NOT contain buttons/links. For a card with its own inner actions,\n * keep it non-interactive and put a single primary `<a>`/`<button>` inside.\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=\"both\">\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 * @example\n * ```html\n * <fold-card interactive ariaLabel=\"Open Acme Records\" (activated)=\"open()\">\n * <h3>Acme Records</h3>\n * <p>128 contracts · 96 active</p>\n * </fold-card>\n * ```\n */\n@Component({\n selector: \"fold-card\",\n standalone: true,\n host: {\n \"[class.s-sunken]\": \"surface() === 'sunken'\",\n \"[class.s-accent]\": \"surface() === 'accent'\",\n \"[attr.data-surface]\": \"surface() === 'accent' ? 'accent' : null\",\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.sep-header]\": \"hasBand(separators(), 'header')\",\n \"[class.sep-footer]\": \"hasBand(separators(), 'footer')\",\n \"[class.raise-header]\": \"hasBand(raisedBands(), 'header')\",\n \"[class.raise-footer]\": \"hasBand(raisedBands(), 'footer')\",\n \"[attr.role]\": \"interactive() ? 'button' : null\",\n \"[attr.tabindex]\": \"interactive() ? 0 : null\",\n \"[attr.aria-label]\": \"interactive() ? (ariaLabel() ?? null) : null\",\n \"(click)\": \"onActivate($event)\",\n \"(keydown)\": \"onKeydown($event)\",\n },\n templateUrl: \"./card.component.html\",\n styleUrl: \"./card.component.scss\",\n})\nexport class FoldCardComponent {\n /** Surface tint — `card` (raised, default), `sunken` (deeper container), or\n * `accent` (an **accent-filled** card: the accent colour as ground, with the\n * whole content sub-tree auto-inverted to a compatible on-accent role-set —\n * text, borders, band gradation, and even nested buttons/links/icon-tiles\n * convert automatically). Use it to make a card in a grid stand out. */\n readonly surface = input<\"card\" | \"sunken\" | \"accent\">(\"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 /** Make the whole card a clickable control: `role=\"button\"` + `tabindex`, a\n * focus ring, a hover lift, and Enter/Space/click → `(activated)`. Must not\n * wrap other interactive controls (see the class docs). */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Accessible name for the interactive card, when its content isn't enough. */\n readonly ariaLabel = input<string>();\n /** Which bands get a hairline against the body — `none` (default), `header`,\n * `footer`, or `both`. */\n readonly separators = input<FoldCardBandChrome>(\"none\");\n /** Which bands are lifted with a subtle raised tint over the card surface\n * (fainter on `sunken`) — `none` (default), `header`, `footer`, or `both`. */\n readonly raisedBands = input<FoldCardBandChrome>(\"none\");\n\n /** Fires when an `interactive` card is activated (click, Enter, or Space). */\n readonly activated = output<Event>();\n\n /** Whether a per-band chrome value applies to the given band. */\n protected hasBand(\n value: FoldCardBandChrome,\n band: \"header\" | \"footer\",\n ): boolean {\n return value === band || value === \"both\";\n }\n\n protected onActivate(event: Event): void {\n if (this.interactive()) {\n this.activated.emit(event);\n }\n }\n\n /** Enter/Space activate the card, matching the native button keyboard contract\n * (Space is prevented from scrolling the page). */\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.interactive() || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n this.activated.emit(event);\n }\n}\n","<div class=\"card-header\"><ng-content select=\"[cardHeader]\" /></div>\n<div class=\"card-body\"><ng-content /></div>\n<div class=\"card-footer\"><ng-content select=\"[cardFooter]\" /></div>\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 {\n booleanAttribute,\n Component,\n computed,\n input,\n output,\n} 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 * - `target` / `rel` — anchor mode only. Setting `target=\"_blank\"` auto-applies\n * `rel=\"noopener noreferrer\"` (safe by default); override with an explicit\n * `rel`.\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\" target=\"_blank\" tone=\"muted\">\n * Documentation\n * </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 /** Anchor target (e.g. `_blank`). Anchor mode only. */\n readonly target = input<string>();\n /** Anchor `rel`. Anchor mode only. Defaults to `noopener noreferrer` when\n * `target=\"_blank\"`; set explicitly to override. */\n readonly rel = 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; carries the `MouseEvent`. */\n readonly clicked = output<MouseEvent>();\n\n /** Resolved `rel` — the explicit value, or a safe default for a new tab. */\n protected readonly resolvedRel = computed(\n () =>\n this.rel() ?? (this.target() === \"_blank\" ? \"noopener noreferrer\" : null),\n );\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\n class=\"lnk\"\n [href]=\"h\"\n [attr.target]=\"target() ?? null\"\n [attr.rel]=\"resolvedRel()\"\n >\n <ng-container [ngTemplateOutlet]=\"inner\" />\n </a>\n} @else {\n <button\n type=\"button\"\n class=\"lnk\"\n [disabled]=\"disabled()\"\n (click)=\"clicked.emit($event)\"\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 // a solid primary ground is an accent surface: auto-invert the content too.\n \"[attr.data-surface]\": \"surface() === 'primary' ? 'accent' : null\",\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 { InjectionToken, type Signal } from \"@angular/core\";\n\n/**\n * The slice of a {@link FoldNavLayoutComponent} that a projected bar reads to\n * follow the layout — exposed through DI so a `fold-view-nav` / `fold-tabs` with\n * `direction=\"auto\"` orients itself without the consumer wiring `tl.stacked()`.\n */\nexport interface FoldNavLayoutContext {\n /**\n * True when the layout currently stacks the bar **above** the content (a `top`\n * placement, or a `side` rail that has folded) — i.e. the bar should be\n * horizontal. False when it sits as a vertical rail beside the content.\n */\n readonly stacked: Signal<boolean>;\n}\n\n/** DI handle for the nearest {@link FoldNavLayoutComponent}, if any. */\nexport const FOLD_NAV_LAYOUT = new InjectionToken<FoldNavLayoutContext>(\n \"FOLD_NAV_LAYOUT\",\n);\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\";\nimport {\n FOLD_NAV_LAYOUT,\n type FoldNavLayoutContext,\n} from \"./nav-layout.context\";\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-nav-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 bar stays yours (tabs, active key, events):\n * - `[tabNav]` → the bar. Project a {@link FoldViewNavComponent} if the tabs\n * **navigate** (route between views) or a {@link FoldTabsComponent} if they\n * **switch panels in place** — this layout is agnostic, it only places the bar.\n * - default slot → the content (routed views, or the tabs' `fold-tab-panel`s).\n *\n * **A11y lives in the bar, not here.** `fold-view-nav` brings `<nav>` +\n * `aria-current`; `fold-tabs` brings the full `role=\"tablist\"` widget with its\n * `fold-tab-panel`s. This component adds no tab semantics — it only decides where\n * the bar sits and folds it responsively.\n *\n * A side rail needs a *vertical* bar, a folded one a *horizontal* bar. The\n * projected bar handles that itself with `direction=\"auto\"` (its default) — it\n * reads this layout through DI ({@link FoldNavLayoutContext}), no wiring:\n *\n * ```html\n * <fold-nav-layout placement=\"side\">\n * <fold-view-nav tabNav [items]=\"items\" />\n * <router-outlet />\n * </fold-nav-layout>\n * ```\n *\n * The layout also exposes {@link stacked} via `exportAs` for consumers that want\n * to read the folded state themselves.\n *\n * **Two roles — same component, composed differently.**\n * - **Page scaffold** — the tab rail *is* the page's primary structure: use it\n * directly (usually `placement=\"side\"`), the folded bar leading the content.\n * - **Tabbed section** — a tabbed block *inside* a page, among other sections.\n * Don't reach for a new mode — wrap it in a {@link FoldPageSectionComponent}.\n * The section owns the title, the `<section>` + heading semantics, the vertical\n * rhythm and the optional `bleed`; tab-layout stays pure placement. It paints\n * nothing (no card), so it sits **flat** — add `bleed` on the section for an\n * edge-to-edge band. The rail folds on the **section's** width (it measures\n * itself), not the viewport, so nested tabs collapse on their own.\n *\n * ```html\n * <!-- a tabbed section: flat structure (page-section) + tab placement -->\n * <fold-page-section title=\"Settings\" bleed>\n * <fold-nav-layout placement=\"side\">\n * <fold-view-nav tabNav [items]=\"items\" />\n * <app-settings-panel />\n * </fold-nav-layout>\n * </fold-page-section>\n * ```\n *\n * Sizing is CSS custom properties: `--fold-nav-layout-gap` (16px) and\n * `--fold-nav-layout-rail-width` — the side-rail track, defaulting to the shared\n * `--fold-rail-tertiary` (200px). That's the **tertiary** step of the rail\n * hierarchy — the same level the `--fold-color-bg-rail-tertiary` colour names\n * (app menu → workspace → in-page nav) — so every rail in the app stays on one\n * scale. Override the local var per instance.\n *\n * @selector `fold-nav-layout`\n */\n@Component({\n selector: \"fold-nav-layout\",\n standalone: true,\n exportAs: \"foldNavLayout\",\n host: { \"[class.is-row]\": \"!stacked()\" },\n providers: [\n { provide: FOLD_NAV_LAYOUT, useExisting: FoldNavLayoutComponent },\n ],\n templateUrl: \"./nav-layout.component.html\",\n styleUrl: \"./nav-layout.component.scss\",\n})\nexport class FoldNavLayoutComponent implements FoldNavLayoutContext {\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, contentChild, Directive, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * Marks a custom page title projected into {@link FoldPageLayoutComponent} — put\n * it on inline heading content when the plain `icon` + `title` inputs aren't\n * enough (an avatar, a two-tone title, a live status). It renders inside the\n * page's `<h1>`, so keep it inline and text-like. Its presence switches the\n * header on in place of the input-driven title.\n *\n * @example\n * ```html\n * <fold-page-layout>\n * <span pageTitle><fold-avatar … /> Acme Records</span>\n * </fold-page-layout>\n * ```\n */\n@Directive({ selector: \"[pageTitle]\", standalone: true })\nexport class FoldPageTitleDirective {}\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 * - `[pageTitle]` ({@link FoldPageTitleDirective}) → a custom title, rendered\n * inside the `<h1>` in place of the `icon` + `title` inputs, for when a plain\n * string won't do (an avatar, a two-tone title). Its presence alone switches\n * the header on.\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 /** A projected `[pageTitle]`, if any — switches the header on for a custom\n * title even without the `title` input. */\n protected readonly customTitle = contentChild(FoldPageTitleDirective);\n}\n","@if (title() || customTitle()) {\n <header class=\"page-head\">\n <div class=\"page-head-text\">\n <h1 class=\"page-title\">\n @if (title(); as t) {\n @if (icon(); as ic) {\n <fold-icon class=\"page-icon\" [name]=\"ic\" [size]=\"22\" />\n }\n <span>{{ t }}</span>\n }\n <ng-content select=\"[pageTitle]\" />\n <span class=\"page-title-badge\"\n ><ng-content select=\"[titleBadge]\"\n /></span>\n </h1>\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 { NgTemplateOutlet } from \"@angular/common\";\nimport {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n output,\n} from \"@angular/core\";\nimport { RouterLink, RouterLinkActive } from \"@angular/router\";\nimport { FoldBadgeComponent } from \"../../content/badge/badge.component\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FOLD_NAV_LAYOUT } from \"../../layout/nav-layout/nav-layout.context\";\n\nexport type FoldViewNavItem = {\n /** Unique key — identifies the item and is emitted by `activeChange`. */\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 * Router target — makes this item a real `routerLink` `<a>`: cmd/middle-click\n * opens a new tab, the URL is a deep link, and the active state is driven\n * automatically by `routerLinkActive` (no `activeKey` needed). Accepts the\n * same value as `[routerLink]` — a path string or a commands array.\n */\n link?: string | unknown[];\n /** External URL — renders a plain `<a href>` (no router). */\n href?: string;\n /** Disable the item: non-interactive + dimmed. */\n disabled?: boolean;\n};\n\n/**\n * `<fold-view-nav>` — a **navigation** bar styled as tabs: a `<nav>` whose items\n * *go somewhere*. Give each item a `link` (or `href`) and it renders a real\n * `<a>` — so cmd/middle-click opens a new tab, the URL is a deep link, and the\n * active item is driven automatically by `routerLinkActive` +\n * `aria-current=\"page\"`. Without a link an item is a `<button>` that emits\n * `activeChange` and reads its active state from `activeKey` (view switching\n * with no route).\n *\n * **Navigation, not the tabs widget.** Reach for this when a tab routes / switches\n * views. When tabs toggle **layered panels in place** (same URL), use\n * {@link FoldTabsComponent} — same look, but the ARIA Tabs pattern\n * (`role=\"tablist\"`, arrow keys, `tabpanel`).\n *\n * - `activeStyle` — `underline` (accent border) or `fill` (accent pill).\n * - `direction` — `auto` (default: follows a wrapping `fold-nav-layout`, else\n * vertical), `vertical`, or `horizontal`.\n *\n * @selector `fold-view-nav`\n *\n * @example\n * ```html\n * <!-- real navigation: link items, active state automatic -->\n * <fold-view-nav [items]=\"[\n * { key: 'members', label: 'Members', link: 'members', badge: 3 },\n * { key: 'settings', label: 'Settings', link: 'settings' },\n * ]\" />\n * <router-outlet />\n * ```\n */\n@Component({\n selector: \"fold-view-nav\",\n standalone: true,\n imports: [\n NgTemplateOutlet,\n FoldIconComponent,\n FoldBadgeComponent,\n RouterLink,\n RouterLinkActive,\n ],\n templateUrl: \"./view-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: \"./view-nav.component.scss\",\n})\nexport class FoldViewNavComponent {\n /** The items to render, in order. */\n readonly items = input.required<FoldViewNavItem[]>();\n\n /**\n * The active item's `key` — for **button** items (no `link`). Link items ignore\n * it: their active state comes from the URL via `routerLinkActive`.\n */\n readonly activeKey = input<string>(\"\");\n\n /** How the active item reads: accent underline, or accent fill. */\n readonly activeStyle = input<\"underline\" | \"fill\">(\"underline\");\n\n /**\n * Bar orientation. Defaults to `auto`: inside a `fold-nav-layout` it follows\n * the layout (vertical rail, horizontal once folded) with no wiring; on its\n * own it is `vertical` — the readable-first shape, reading as the app's\n * **third navigation rail** (app menu → workspace → in-page views, the\n * `--fold-rail-tertiary` level). Force `horizontal` for a page-level top bar.\n */\n readonly direction = input<\"horizontal\" | \"vertical\" | \"auto\">(\"auto\");\n\n /**\n * Density — pure padding/typography:\n * - `compact` (default) — inline / popover bars.\n * - `comfortable` — a prominent, page-level bar.\n */\n readonly size = input<\"compact\" | \"comfortable\">(\"compact\");\n\n /**\n * Collapse the bar to icons (independent of {@link size}). **Horizontal**, an\n * icon accordion: every item but the active one drops to its icon, the active\n * one keeps its label. **Vertical**, a collapsed icon rail (like a folded\n * menu): every item shows just its icon, its label a hover/focus tooltip and\n * its count a corner bubble — narrow the layout's `--fold-nav-layout-rail-width`\n * to match. An item with no icon falls back to a square glyph of its label's\n * initial, so the rail stays icon-width whether or not items carry icons.\n * Toggle it from your own breakpoint when the bar is too tight.\n */\n readonly collapsed = input(false, { transform: booleanAttribute });\n\n /**\n * `transparent` (default — blends with the app, so the items read directly) or\n * `surface` (a filled bar that carries its own rail background).\n */\n readonly background = input<\"transparent\" | \"surface\">(\"transparent\");\n\n /** Emits the `key` of a clicked **button** item (link items just navigate). */\n readonly activeChange = output<string>();\n\n /** The nearest layout, if any — lets `direction=\"auto\"` follow it. */\n private readonly layout = inject(FOLD_NAV_LAYOUT, { optional: true });\n\n /** `direction` with `auto` resolved against the wrapping layout. */\n protected readonly resolvedDirection = computed<\"horizontal\" | \"vertical\">(\n () => {\n const d = this.direction();\n if (d !== \"auto\") {\n return d;\n }\n return this.layout?.stacked() ? \"horizontal\" : \"vertical\";\n },\n );\n}\n","<nav\n class=\"tab-bar\"\n [class.style-underline]=\"activeStyle() === 'underline'\"\n [class.style-fill]=\"activeStyle() === 'fill'\"\n [class.dir-vertical]=\"resolvedDirection() === 'vertical'\"\n [class.size-comfortable]=\"size() === 'comfortable'\"\n [class.is-collapsed]=\"collapsed()\"\n [class.bg-surface]=\"background() === 'surface'\"\n>\n @for (item of items(); track item.key) {\n @if (item.disabled) {\n <button\n type=\"button\"\n class=\"tab-bar-item is-disabled\"\n disabled\n aria-disabled=\"true\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{ $implicit: item, active: false }\"\n />\n </button>\n } @else if (item.link !== undefined) {\n <a\n class=\"tab-bar-item\"\n [routerLink]=\"item.link\"\n routerLinkActive=\"is-active\"\n #rla=\"routerLinkActive\"\n [attr.aria-current]=\"rla.isActive ? 'page' : null\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{ $implicit: item, active: rla.isActive }\"\n />\n </a>\n } @else if (item.href !== undefined) {\n <a\n class=\"tab-bar-item\"\n [href]=\"item.href\"\n [class.is-active]=\"activeKey() === item.key\"\n [attr.aria-current]=\"activeKey() === item.key ? 'page' : null\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n active: activeKey() === item.key,\n }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"tab-bar-item\"\n [class.is-active]=\"activeKey() === item.key\"\n [attr.aria-current]=\"activeKey() === item.key ? 'page' : null\"\n (click)=\"activeChange.emit(item.key)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n active: activeKey() === item.key,\n }\"\n />\n </button>\n }\n }\n</nav>\n\n<!-- One item's inner content, shared by the link / button branches. -->\n<ng-template #body let-item let-active=\"active\">\n @if (item.icon; as ic) {\n <fold-icon class=\"tab-bar-icon\" [name]=\"ic\" size=\"sm\" />\n } @else if (collapsed()) {\n <!-- Collapsed needs a fixed glyph; an icon-less item falls back to its\n initial so the rail stays icon-width and the label still tooltips. -->\n <span class=\"tab-bar-icon tab-bar-initial\" aria-hidden=\"true\">{{\n item.label.charAt(0)\n }}</span>\n }\n <span class=\"tab-bar-label\">{{ item.label }}</span>\n @if (item.badge !== undefined && item.badge !== null) {\n <fold-badge\n class=\"tab-bar-badge\"\n [content]=\"item.badge + ''\"\n [variant]=\"active ? 'accent' : 'neutral'\"\n />\n }\n</ng-template>\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n viewChildren,\n} 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\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FOLD_NAV_LAYOUT } from \"../../layout/nav-layout/nav-layout.context\";\n\n/** A tab in a {@link FoldTabsComponent} bar. */\nexport type FoldTabItem = {\n /** Unique key — identifies the tab / its panel, emitted on change. */\n key: string;\n /** Display label. */\n label: string;\n /** Optional leading icon. */\n icon?: FoldIconName;\n /** Optional trailing count badge. `undefined`/`null` hides it. */\n badge?: string | number | null;\n};\n\n/**\n * The read side a {@link FoldTabPanelComponent} needs to wire itself to a tab —\n * exposed by `fold-tabs` via `exportAs=\"foldTabs\"`. Decouples the panel from the\n * concrete component.\n */\nexport interface FoldTabsContext {\n /** The active tab's key. */\n activeKey(): string;\n /** The DOM id of the tab for `key` (a panel's `aria-labelledby`). */\n tabId(key: string): string;\n /** The DOM id of the panel for `key` (a tab's `aria-controls`). */\n panelId(key: string): string;\n}\n\n/**\n * `<fold-tabs>` — the **in-page tabs widget** (the ARIA Tabs pattern): a\n * `role=\"tablist\"` of `role=\"tab\"` buttons that switch layered panels **without\n * navigating**. Arrow keys move between tabs (roving tabindex — only the active\n * tab is in the Tab order), `Home`/`End` jump to the ends, and each tab is wired\n * to its panel via `aria-controls` ↔ `aria-labelledby`.\n *\n * Pair it with one {@link FoldTabPanelComponent} per key, handed the bar via a\n * template ref so the two coordinate across slots (e.g. inside a\n * `fold-nav-layout`). Same visual as {@link FoldViewNavComponent}; the\n * difference is **semantics** — use `fold-tabs` for in-page panel switching, and\n * `fold-view-nav` when the tabs actually navigate (route) between views.\n *\n * ```html\n * <fold-nav-layout>\n * <fold-tabs\n * nav\n * #t=\"foldTabs\"\n * [tabs]=\"tabs\"\n * [activeKey]=\"tab()\"\n * (tabChange)=\"tab.set($event)\"\n * />\n * <fold-tab-panel [tabs]=\"t\" key=\"overview\">…</fold-tab-panel>\n * <fold-tab-panel [tabs]=\"t\" key=\"settings\">…</fold-tab-panel>\n * </fold-nav-layout>\n * ```\n *\n * Same visual knobs as `fold-view-nav` (`activeStyle` · `direction` · `size` ·\n * `background`). Sizing shares the tab-bar tokens.\n *\n * @selector `fold-tabs`\n */\n@Component({\n selector: \"fold-tabs\",\n standalone: true,\n exportAs: \"foldTabs\",\n imports: [FoldIconComponent, FoldBadgeComponent],\n templateUrl: \"./tabs.component.html\",\n styleUrl: \"./tabs.component.scss\",\n})\nexport class FoldTabsComponent implements FoldTabsContext {\n /** The tabs to render, in order. */\n readonly tabs = input.required<FoldTabItem[]>();\n /** The `key` of the active tab (the shown panel). */\n readonly activeKey = input.required<string>();\n /** How the active tab reads: accent underline, or accent fill. */\n readonly activeStyle = input<\"underline\" | \"fill\">(\"underline\");\n /**\n * Bar orientation (drives `aria-orientation`). Defaults to `auto`: follows a\n * wrapping `fold-nav-layout`, else `horizontal`.\n */\n readonly direction = input<\"horizontal\" | \"vertical\" | \"auto\">(\"auto\");\n /** Density — see {@link FoldViewNavComponent} for the same scale. */\n readonly size = input<\"compact\" | \"comfortable\">(\"compact\");\n /** Collapse to icons — see {@link FoldViewNavComponent.collapsed}. */\n readonly collapsed = input(false, { transform: booleanAttribute });\n /** `surface` (filled bar, default) or `transparent`. */\n readonly background = input<\"transparent\" | \"surface\">(\"surface\");\n /** Emits the newly-selected tab's `key`. */\n readonly tabChange = output<string>();\n\n /** The nearest layout, if any — lets `direction=\"auto\"` follow it. */\n private readonly layout = inject(FOLD_NAV_LAYOUT, { optional: true });\n\n /** `direction` with `auto` resolved against the wrapping layout. */\n protected readonly resolvedDirection = computed<\"horizontal\" | \"vertical\">(\n () => {\n const d = this.direction();\n if (d !== \"auto\") {\n return d;\n }\n return this.layout?.stacked() ? \"horizontal\" : \"vertical\";\n },\n );\n\n /** Per-instance id root, so ids are unique + stable across SSR. */\n private readonly uid = inject(FoldIdService).next(\"fold-tabs\");\n private readonly tabButtons =\n viewChildren<ElementRef<HTMLButtonElement>>(\"tabBtn\");\n\n tabId(key: string): string {\n return `${this.uid}-tab-${key}`;\n }\n panelId(key: string): string {\n return `${this.uid}-panel-${key}`;\n }\n\n protected select(key: string): void {\n this.tabChange.emit(key);\n }\n\n /**\n * Roving-tabindex keyboard model (APG Tabs, automatic activation): arrows move\n * — and select — the adjacent tab, `Home`/`End` the ends. Both axes work, so\n * it stays correct whether the bar is horizontal, vertical, or a\n * mobile-collapsed vertical.\n */\n protected onKeydown(event: KeyboardEvent): void {\n const keys = this.tabs().map((t) => t.key);\n if (keys.length === 0) {\n return;\n }\n const current = keys.indexOf(this.activeKey());\n let target: number;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n target = (current + 1) % keys.length;\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n target = (current - 1 + keys.length) % keys.length;\n break;\n case \"Home\":\n target = 0;\n break;\n case \"End\":\n target = keys.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n const key = keys[target];\n if (key === undefined) {\n return;\n }\n this.tabChange.emit(key);\n this.tabButtons()[target]?.nativeElement.focus();\n }\n}\n","<div\n class=\"tab-bar\"\n role=\"tablist\"\n [attr.aria-orientation]=\"\n resolvedDirection() === 'vertical' ? 'vertical' : 'horizontal'\n \"\n [class.style-underline]=\"activeStyle() === 'underline'\"\n [class.style-fill]=\"activeStyle() === 'fill'\"\n [class.dir-vertical]=\"resolvedDirection() === 'vertical'\"\n [class.size-comfortable]=\"size() === 'comfortable'\"\n [class.is-collapsed]=\"collapsed()\"\n [class.bg-surface]=\"background() === 'surface'\"\n (keydown)=\"onKeydown($event)\"\n>\n @for (tab of tabs(); track tab.key) {\n <button\n #tabBtn\n type=\"button\"\n role=\"tab\"\n class=\"tab-bar-item\"\n [id]=\"tabId(tab.key)\"\n [class.is-active]=\"activeKey() === tab.key\"\n [attr.aria-selected]=\"activeKey() === tab.key\"\n [attr.aria-controls]=\"panelId(tab.key)\"\n [tabindex]=\"activeKey() === tab.key ? 0 : -1\"\n (click)=\"select(tab.key)\"\n >\n @if (tab.icon; as ic) {\n <fold-icon class=\"tab-bar-icon\" [name]=\"ic\" size=\"sm\" />\n } @else if (collapsed()) {\n <span class=\"tab-bar-icon tab-bar-initial\" aria-hidden=\"true\">{{\n tab.label.charAt(0)\n }}</span>\n }\n <span class=\"tab-bar-label\">{{ tab.label }}</span>\n @if (tab.badge !== undefined && tab.badge !== null) {\n <fold-badge\n class=\"tab-bar-badge\"\n [content]=\"tab.badge + ''\"\n [variant]=\"activeKey() === tab.key ? 'accent' : 'neutral'\"\n />\n }\n </button>\n }\n</div>\n","import { Component, computed, input } from \"@angular/core\";\nimport type { FoldTabsContext } from \"./tabs.component\";\n\n/**\n * `<fold-tab-panel>` — one panel of a {@link FoldTabsComponent}. Handed the bar\n * via a template ref (`[tabs]=\"t\"`, where `#t=\"foldTabs\"`) plus its `key`, it\n * becomes a `role=\"tabpanel\"` named by its tab (`aria-labelledby`), reachable by\n * `aria-controls` from that tab, focusable while active, and `hidden` otherwise.\n *\n * The ref pairing is what lets the tabs bar and its panels sit in **different**\n * slots (e.g. the bar in a `fold-nav-layout`'s nav slot, the panels in its\n * content) and still coordinate.\n *\n * ```html\n * <fold-tabs #t=\"foldTabs\" [tabs]=\"tabs\" [activeKey]=\"tab()\" (tabChange)=\"tab.set($event)\" />\n * <fold-tab-panel [tabs]=\"t\" key=\"overview\">…</fold-tab-panel>\n * ```\n *\n * @selector `fold-tab-panel`\n */\n@Component({\n selector: \"fold-tab-panel\",\n standalone: true,\n host: {\n role: \"tabpanel\",\n \"[id]\": \"panelId()\",\n \"[attr.aria-labelledby]\": \"labelledBy()\",\n \"[attr.tabindex]\": \"isActive() ? 0 : null\",\n \"[hidden]\": \"!isActive()\",\n },\n template: \"<ng-content />\",\n})\nexport class FoldTabPanelComponent {\n /** The owning `fold-tabs`, read via its template ref (`#t=\"foldTabs\"`). */\n readonly tabs = input.required<FoldTabsContext>();\n /** This panel's tab key — must match one tab in the bar. */\n readonly key = input.required<string>();\n\n protected readonly isActive = computed(\n () => this.tabs().activeKey() === this.key(),\n );\n protected readonly panelId = computed(() => this.tabs().panelId(this.key()));\n protected readonly labelledBy = computed(() => this.tabs().tabId(this.key()));\n}\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 type { FoldCardBandChrome } 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 { FoldNavLayoutComponent } from \"./components/layout/nav-layout/nav-layout.component\";\nexport {\n FoldPageLayoutComponent,\n FoldPageTitleDirective,\n} 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 { FoldViewNavComponent } from \"./components/navigation/view-nav/view-nav.component\";\nexport type { FoldViewNavItem } from \"./components/navigation/view-nav/view-nav.component\";\nexport { FoldTabsComponent } from \"./components/navigation/tabs/tabs.component\";\nexport type {\n FoldTabItem,\n FoldTabsContext,\n} from \"./components/navigation/tabs/tabs.component\";\nexport { FoldTabPanelComponent } from \"./components/navigation/tabs/tab-panel.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/color/contrast.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/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/actions/inline-confirm/inline-confirm-labels.ts","../../src/components/actions/inline-confirm/inline-confirm.component.ts","../../src/components/actions/inline-confirm/inline-confirm.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-row-card.directive.ts","../../src/components/content/data-table/data-table-keyboard.ts","../../src/components/forms/checkbox/checkbox.component.ts","../../src/components/forms/checkbox/checkbox.component.html","../../src/components/content/data-table/data-table-labels.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/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/overlays/popover/placement.ts","../../src/components/overlays/popover/auto-update.ts","../../src/components/overlays/popover/popover.component.ts","../../src/components/overlays/popover/popover.component.html","../../src/components/overlays/popover/popover-trigger.directive.ts","../../src/components/forms/listbox/listbox-owner.ts","../../src/components/forms/listbox/option.component.ts","../../src/components/forms/listbox/listbox-nav.ts","../../src/components/forms/listbox/listbox.component.ts","../../src/components/forms/listbox/listbox.component.html","../../src/components/forms/listbox/multiselect.component.ts","../../src/components/forms/listbox/multiselect.component.html","../../src/components/forms/password/password-rules.ts","../../src/components/forms/password/password-field.component.ts","../../src/components/forms/password/password-field.component.html","../../src/components/forms/view-toggle/view-toggle.component.ts","../../src/components/forms/view-toggle/view-toggle.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/nav-layout/nav-layout.context.ts","../../src/components/layout/nav-layout/nav-layout.component.ts","../../src/components/layout/nav-layout/nav-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-labels.ts","../../src/components/content/paginator/paginator.component.ts","../../src/components/content/paginator/paginator.component.html","../../src/components/navigation/view-nav/view-nav.component.ts","../../src/components/navigation/view-nav/view-nav.component.html","../../src/components/navigation/tabs/tabs.component.ts","../../src/components/navigation/tabs/tabs.component.html","../../src/components/navigation/tabs/tab-panel.component.ts","../../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/components/overlays/popover/dropdown-item.component.ts","../../src/components/overlays/popover/dropdown.component.ts","../../src/components/overlays/popover/dropdown.component.html","../../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 theme\n * may colour differently from the page; `accent` is an **auto-inverting** region\n * filled with the brand accent, whose content re-points to a compatible\n * on-accent palette (see the `[data-surface=\"accent\"]` block in `semantic.css`).\n */\nexport type FoldSurfaceName = \"page\" | \"chrome\" | \"accent\";\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","/**\n * Small WCAG colour-contrast helpers — used to pick a legible ink for text on a\n * categorical fill (avatar initials), and lockable by a contrast test.\n *\n * These operate on plain hex strings (`#rgb` / `#rrggbb`); a categorical palette\n * is qualitative *data* (hex is allowed there — rule 5.3), so contrast can't be\n * a token concern and lives here.\n */\n\n/** Parse `#rgb` / `#rrggbb` to `[r, g, b]` (0–255), or `null` if not a hex. */\nfunction parseHex(hex: string): [number, number, number] | null {\n const h = hex.trim().replace(/^#/, \"\");\n const full =\n h.length === 3\n ? h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : h;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) {\n return null;\n }\n return [\n parseInt(full.slice(0, 2), 16),\n parseInt(full.slice(2, 4), 16),\n parseInt(full.slice(4, 6), 16),\n ];\n}\n\n/** WCAG relative luminance of a hex colour, or `null` if it isn't a hex. */\nexport function foldLuminance(hex: string): number | null {\n const rgb = parseHex(hex);\n if (!rgb) {\n return null;\n }\n const lin = (c: number): number => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * lin(rgb[0]) + 0.7152 * lin(rgb[1]) + 0.0722 * lin(rgb[2]);\n}\n\n/** WCAG contrast ratio between two hex colours (1–21), or `null` if either\n * isn't a hex. */\nexport function foldContrast(a: string, b: string): number | null {\n const la = foldLuminance(a);\n const lb = foldLuminance(b);\n if (la === null || lb === null) {\n return null;\n }\n const [hi, lo] = la >= lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/**\n * The **more legible** of two inks for text drawn on `fill` — whichever has the\n * higher WCAG contrast. Picking the max (rather than thresholding luminance)\n * guarantees the best of the pair for *any* fill: at the black/white crossover\n * both inks already clear ~4.5:1, so every fill lands at or above it. A non-hex\n * `fill` falls back to `dark`.\n */\nexport function foldReadableInk(\n fill: string,\n dark: string,\n light: string,\n): string {\n const withDark = foldContrast(fill, dark);\n const withLight = foldContrast(fill, light);\n if (withDark === null || withLight === null) {\n return dark;\n }\n return withDark >= withLight ? dark : light;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n linkedSignal,\n} from \"@angular/core\";\nimport { FoldPaletteRegistry } from \"../../../color/palette-registry.service\";\nimport { foldReadableInk } from \"../../../color/contrast\";\n\n/** Ink for text on a light vs dark categorical fill. */\nconst DARK_INK = \"#1a202c\";\nconst LIGHT_INK = \"#ffffff\";\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 * A broken `imageUrl` falls back to the initials rather than the browser's\n * broken-image glyph (and retries when the URL changes).\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. The ring is a\n * redundant emphasis cue — never the sole carrier of a state — because on a\n * light page a soft status hue (amber/green) can't clear WCAG 3:1 as a thin\n * line (status-ring-contrast.spec.ts).\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; falls back to initials if it fails to load. |\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 * @example\n * ```html\n * <fold-avatar name=\"Clément Aubry\" size=\"lg\" />\n * <fold-avatar name=\"Léa Petit\" ring=\"accent\" ringStyle=\"dotted\" />\n * <fold-avatar name=\"Acme Corp\" square imageUrl=\"/logo.svg\" />\n * ```\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 /** True once the `<img>` fails to load. Resets whenever `imageUrl` changes,\n * so a corrected URL is retried rather than staying on the fallback. */\n protected readonly imageFailed = linkedSignal(() => {\n this.imageUrl();\n return false;\n });\n /** Show the image only when a URL is set AND it has not failed — a broken URL\n * falls back to the initials instead of the browser's broken-image glyph. */\n protected readonly showImage = computed(\n () => Boolean(this.imageUrl()) && !this.imageFailed(),\n );\n\n /** Readable ink for the initials — the higher-contrast of dark/light ink on\n * the fill, so a custom palette stays legible. */\n protected readonly onColor = computed(() =>\n foldReadableInk(this.color(), DARK_INK, LIGHT_INK),\n );\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 (showImage()) {\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.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 [attr.title]=\"name()\"\n >\n <img\n [src]=\"imageUrl()\"\n [alt]=\"name()\"\n class=\"avatar-img\"\n (error)=\"imageFailed.set(true)\"\n />\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 * @example\n * ```html\n * <fold-avatar-detail primary=\"Alex Rivers\" secondary=\"alex@sh3pherd.dev\" />\n * <fold-avatar-detail primary=\"Acme Corp\" secondary=\"Organisation\" square />\n * ```\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-view-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/** Rail-width scale — the nav-rail hierarchy's shared widths, named to pair with\n * the `--fold-color-bg-rail-*` colours (primary app menu → secondary workspace /\n * aside → tertiary in-page nav). */\nexport const FOLD_RAIL_TOKENS = [\"primary\", \"secondary\", \"tertiary\"] as const;\n\nexport type FoldRailToken = (typeof FOLD_RAIL_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-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 signal,\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-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, FoldIconComponent],\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 /** On a `password` input, offer a reveal (eye) toggle to show/hide the value. */\n readonly revealable = input(false, { transform: booleanAttribute });\n /** Accessible name of the reveal control while hidden. @default 'Show password' */\n readonly revealLabel = input(\"Show password\");\n /** Accessible name of the reveal control while shown. @default 'Hide password' */\n readonly hideLabel = input(\"Hide password\");\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 /** Is the password currently revealed (shown as plain text)? */\n protected readonly revealed = signal(false);\n /** Whether to render the reveal toggle — a `revealable` password input. */\n protected readonly showReveal = computed(\n () => this.revealable() && this.type() === \"password\",\n );\n /** The native `type` to render — `text` while a password is revealed. */\n protected readonly effectiveType = computed(() =>\n this.showReveal() && this.revealed() ? \"text\" : this.type(),\n );\n /** The reveal control's accessible name, tracking its state. */\n protected readonly revealAria = computed(() =>\n this.revealed() ? this.hideLabel() : this.revealLabel(),\n );\n\n protected toggleReveal(): void {\n this.revealed.update((shown) => !shown);\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 <div class=\"in-field\">\n <input\n [id]=\"inputId\"\n [class.has-reveal]=\"showReveal()\"\n [attr.type]=\"effectiveType()\"\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 @if (showReveal()) {\n <button\n type=\"button\"\n class=\"in-reveal\"\n [attr.aria-label]=\"revealAria()\"\n [attr.aria-pressed]=\"revealed()\"\n [disabled]=\"disabled() || readOnly()\"\n (click)=\"toggleReveal()\"\n >\n <fold-icon\n [name]=\"revealed() ? 'eye-off' : 'eye'\"\n size=\"sm\"\n aria-hidden=\"true\"\n />\n </button>\n }\n </div>\n</fold-input-base>\n","import { InjectionToken, type Provider } from \"@angular/core\";\n\n/**\n * Every user-facing / accessible string the inline-confirm renders. The\n * `typePrompt` is a function of the value to match, so a locale can reword the\n * whole sentence rather than translate a fixed template. All defaults are\n * English — a non-English app overrides them once via\n * {@link provideFoldInlineConfirmLabels}, or per instance via the `labels` input.\n */\nexport interface FoldInlineConfirmLabels {\n /** Label of the confirm button. */\n readonly confirm: string;\n /** Label of the cancel button. */\n readonly cancel: string;\n /** `aria-label` of the icon-only cancel button (`cancelIcon`). */\n readonly cancelAria: string;\n /** Confirm-button label while `loading`. */\n readonly busy: string;\n /** Accessible name of the confirmation group that replaces the trigger. */\n readonly group: string;\n /** Placeholder + prompt for the secret field (`password`, no `match`). */\n readonly secret: string;\n /** The type-to-confirm prompt, e.g. `(\"prod\") => \"Type prod to confirm\"`. */\n readonly typePrompt: (match: string) => string;\n}\n\n/** The English defaults — the base every override merges onto. */\nexport const FOLD_INLINE_CONFIRM_DEFAULT_LABELS: FoldInlineConfirmLabels = {\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n cancelAria: \"Cancel\",\n busy: \"Working…\",\n group: \"Confirm action\",\n secret: \"Password\",\n typePrompt: (match) => `Type ${match} to confirm`,\n};\n\n/** App-wide inline-confirm labels; defaults to English. */\nexport const FOLD_INLINE_CONFIRM_LABELS =\n new InjectionToken<FoldInlineConfirmLabels>(\"FOLD_INLINE_CONFIRM_LABELS\", {\n factory: () => FOLD_INLINE_CONFIRM_DEFAULT_LABELS,\n });\n\n/**\n * Provide app-wide inline-confirm labels once at bootstrap. Partial — any key\n * you omit keeps its English default.\n *\n * @example\n * ```ts\n * // app.config.ts\n * providers: [\n * provideFoldInlineConfirmLabels({\n * confirm: \"Confirmer\",\n * cancel: \"Annuler\",\n * typePrompt: (m) => `Saisissez ${m} pour confirmer`,\n * }),\n * ];\n * ```\n */\nexport function provideFoldInlineConfirmLabels(\n labels: Partial<FoldInlineConfirmLabels>,\n): Provider {\n return {\n provide: FOLD_INLINE_CONFIRM_LABELS,\n useValue: { ...FOLD_INLINE_CONFIRM_DEFAULT_LABELS, ...labels },\n };\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { FoldButtonComponent } from \"../button/button.component\";\nimport type { FoldButtonIntent, FoldButtonSize } from \"../button/button.types\";\nimport { FoldButtonIconComponent } from \"../button-icon/button-icon.component\";\nimport { FoldInputComponent } from \"../../forms/input/input.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport {\n FOLD_INLINE_CONFIRM_LABELS,\n type FoldInlineConfirmLabels,\n} from \"./inline-confirm-labels\";\n\n/**\n * `<fold-inline-confirm>` — an in-place \"are you sure?\" affordance. The host\n * projects a **trigger** (a real, focusable control — a `foldButton`, a\n * `fold-button-icon`); on activation the trigger is replaced *in the same slot*\n * by a confirm/cancel row, so a destructive action is guarded without a modal\n * and without the layout jumping. Emits `confirmed` / `cancelled`.\n *\n * Three families, chosen by input:\n *\n * - **Simple** (default) — trigger → `Confirm` · `Cancel`. `confirmed` emits `\"\"`.\n * - **Type-to-confirm** — set `match`: the confirm button stays disabled until\n * the user types the value (case-insensitive, trimmed). `confirmed` emits the\n * typed text.\n * - **Secret** — set `password` (no `match`): a masked field that confirms once\n * non-empty. `confirmed` emits the secret, so a handler can post it to the\n * server (which is the only place a password can actually be checked).\n *\n * `Escape` cancels; `Enter` in the field confirms when valid. Opening moves\n * focus to the field (typed families) or the confirm button (simple), and\n * cancelling returns focus to the trigger.\n *\n * @selector `fold-inline-confirm`\n *\n * @example\n * ```html\n * <!-- simple -->\n * <fold-inline-confirm (confirmed)=\"remove()\">\n * <fold-button-icon icon=\"trash\" tooltip=\"Delete\" />\n * </fold-inline-confirm>\n *\n * <!-- type-to-confirm -->\n * <fold-inline-confirm [match]=\"node.name\" (confirmed)=\"archive()\">\n * <button foldButton emphasis=\"outline\" intent=\"danger\">Delete node</button>\n * </fold-inline-confirm>\n *\n * <!-- password-gated -->\n * <fold-inline-confirm password (confirmed)=\"deleteAccount($event)\">\n * <button foldButton intent=\"danger\">Delete account</button>\n * </fold-inline-confirm>\n *\n * <!-- async: keep it open + show a spinner until the request settles -->\n * <fold-inline-confirm\n * keepOpenOnConfirm\n * [loading]=\"pending()\"\n * [(open)]=\"confirmOpen\"\n * confirmIcon=\"bin\"\n * cancelIcon=\"close\"\n * (confirmed)=\"onDelete()\">\n * <fold-button-icon icon=\"bin\" tooltip=\"Delete\" />\n * </fold-inline-confirm>\n * ```\n */\n@Component({\n selector: \"fold-inline-confirm\",\n standalone: true,\n imports: [FoldButtonComponent, FoldButtonIconComponent, FoldInputComponent],\n templateUrl: \"./inline-confirm.component.html\",\n styleUrl: \"./inline-confirm.component.scss\",\n host: { \"[class.is-open]\": \"open()\" },\n})\nexport class FoldInlineConfirmComponent {\n private readonly defaults = inject(FOLD_INLINE_CONFIRM_LABELS);\n\n /** Intent (colour) of the confirm button. @default \"danger\" */\n readonly intent = input<FoldButtonIntent>(\"danger\");\n /** Optional warning shown above the confirm row. */\n readonly message = input<string>();\n /**\n * The exact text the user must type to confirm (type-to-confirm family).\n * Empty → the simple family. Matching is case-insensitive + trimmed.\n */\n readonly match = input<string>(\"\");\n /**\n * Mask the field and confirm on any non-empty value (secret family). A\n * password can't be verified in the browser, so this only *collects* it —\n * `confirmed` emits it for the handler to send to the server. Ignored when\n * `match` is set.\n */\n readonly password = input(false, { transform: booleanAttribute });\n /** Placeholder for the typed / secret field. */\n readonly placeholder = input<string>();\n /** Pending state — disables the buttons and shows the `busy` label. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Control density. @default \"sm\" */\n readonly size = input<FoldButtonSize>(\"sm\");\n /** Optional leading icon on the confirm button (e.g. `\"bin\"` on \"Delete\"). */\n readonly confirmIcon = input<FoldIconName>();\n /**\n * Render the cancel as an icon-only button of the given icon (e.g. `\"close\"`)\n * instead of a labelled button. Unset → a labelled cancel. The name is your\n * choice from the icon registry.\n */\n readonly cancelIcon = input<FoldIconName>();\n /**\n * Keep the affordance open after `confirmed` fires, so an async handler can\n * show `loading` and then close it via `[(open)]`. Default: close on confirm\n * (the right behaviour for synchronous / optimistic actions).\n */\n readonly keepOpenOnConfirm = input(false, { transform: booleanAttribute });\n /** Per-instance label overrides, merged over the app-wide + English defaults. */\n readonly labels = input<Partial<FoldInlineConfirmLabels>>();\n\n /** Emitted when the user confirms — carries the typed text (or `\"\"`). */\n readonly confirmed = output<string>();\n /** Emitted when the user cancels (button or `Escape`). */\n readonly cancelled = output();\n\n /**\n * Whether the confirm affordance (vs. the trigger) is showing. Two-way, so a\n * parent can drive it — open it programmatically, or close it when an async\n * `confirmed` handler settles (paired with `keepOpenOnConfirm`).\n */\n readonly open = model(false);\n /** The text currently typed in the field. */\n protected readonly typed = signal(\"\");\n\n private readonly triggerEl =\n viewChild<ElementRef<HTMLElement>>(\"triggerWrap\");\n private readonly groupEl = viewChild<ElementRef<HTMLElement>>(\"groupEl\");\n\n /** SSR-safe id tying the message to the confirm group. */\n protected readonly msgId = inject(FoldIdService).next(\"fold-inline-confirm\");\n\n /** Effective labels: English defaults ← app-wide provider ← per-instance input. */\n protected readonly l = computed<FoldInlineConfirmLabels>(() => ({\n ...this.defaults,\n ...this.labels(),\n }));\n\n /** True when a value must be typed before confirming. */\n protected readonly needsInput = computed(\n () => this.match().length > 0 || this.password(),\n );\n\n /** Whether the typed value satisfies the gate (match, or non-empty secret). */\n protected readonly inputValid = computed<boolean>(() => {\n const m = this.match().trim();\n if (m.length > 0) {\n return this.typed().trim().toLowerCase() === m.toLowerCase();\n }\n if (this.password()) {\n return this.typed().length > 0;\n }\n return true;\n });\n\n /** The confirm button is live once the gate is satisfied and nothing pends. */\n protected readonly canConfirm = computed(\n () => this.inputValid() && !this.loading(),\n );\n\n protected readonly fieldType = computed<\"text\" | \"password\">(() =>\n this.password() && this.match().length === 0 ? \"password\" : \"text\",\n );\n\n /** Prompt above a typed field: the match sentence, or the secret label. */\n protected readonly prompt = computed<string>(() => {\n const m = this.match().trim();\n return m.length > 0 ? this.l().typePrompt(m) : this.l().secret;\n });\n\n /** Has the affordance ever opened? Gates focus-return so mount doesn't steal. */\n private opened = false;\n\n constructor() {\n // One place owns focus, after render (so the target has been (re)painted):\n // opening → move focus into the affordance (the field, else the confirm\n // button); closing after a prior open → return focus to the trigger. The\n // `opened` gate stops the initial closed render from grabbing focus.\n afterRenderEffect(() => {\n if (this.open()) {\n this.opened = true;\n const root = this.groupEl()?.nativeElement;\n const target = this.needsInput()\n ? root?.querySelector<HTMLElement>(\"input\")\n : root?.querySelector<HTMLElement>(\"button\");\n target?.focus();\n } else if (this.opened) {\n this.triggerEl()\n ?.nativeElement.querySelector<HTMLElement>(\"button, a\")\n ?.focus();\n }\n });\n }\n\n /** Start the confirm flow (called by the projected trigger's click). */\n protected activate(): void {\n this.typed.set(\"\");\n this.open.set(true);\n }\n\n /** Complete the confirmation, emitting the typed value (or `\"\"`). */\n protected confirm(): void {\n if (!this.canConfirm()) {\n return;\n }\n const value = this.typed();\n if (!this.keepOpenOnConfirm()) {\n this.open.set(false);\n this.typed.set(\"\");\n }\n this.confirmed.emit(value);\n }\n\n /** Abort and restore the trigger (focus returns via the render effect). */\n protected cancel(): void {\n // Both cancel buttons are disabled while loading; Escape must match, or a\n // mid-flight (async) action could be cancelled out from under the parent.\n if (this.loading()) {\n return;\n }\n this.open.set(false);\n this.typed.set(\"\");\n this.cancelled.emit();\n }\n}\n","@if (!open()) {\n <!-- Idle: the host's projected trigger. A click anywhere in it starts the\n flow; the trigger itself stays a real focusable control (button / anchor),\n so keyboard activation is native (Enter/Space → click) — no extra\n role/tabindex, and no keydown handler that would double-fire. -->\n <span #triggerWrap class=\"fic-trigger\" (click)=\"activate()\">\n <ng-content />\n </span>\n} @else {\n <div\n #groupEl\n class=\"fic-confirm\"\n role=\"group\"\n [attr.aria-label]=\"l().group\"\n (keydown.escape)=\"cancel(); $event.stopPropagation()\"\n >\n @if (message(); as text) {\n <p class=\"fic-message\" [id]=\"msgId\">{{ text }}</p>\n }\n\n @if (needsInput()) {\n <fold-input\n class=\"fic-field\"\n [label]=\"prompt()\"\n [type]=\"fieldType()\"\n [size]=\"size() === 'lg' ? 'lg' : 'sm'\"\n [placeholder]=\"placeholder() ?? ''\"\n [autocomplete]=\"password() ? 'current-password' : 'off'\"\n [(value)]=\"typed\"\n (keydown.enter)=\"confirm()\"\n />\n }\n\n <div class=\"fic-actions\">\n <button\n foldButton\n emphasis=\"solid\"\n [intent]=\"intent()\"\n [size]=\"size()\"\n [icon]=\"confirmIcon()\"\n [disabled]=\"!canConfirm()\"\n [attr.aria-describedby]=\"message() ? msgId : null\"\n (click)=\"confirm()\"\n >\n {{ loading() ? l().busy : l().confirm }}\n </button>\n\n @if (cancelIcon(); as icon) {\n <fold-button-icon\n [icon]=\"icon\"\n tone=\"ghost\"\n [size]=\"size()\"\n [disabled]=\"loading()\"\n [tooltip]=\"l().cancelAria\"\n (clicked)=\"cancel()\"\n />\n } @else {\n <button\n foldButton\n emphasis=\"soft\"\n intent=\"neutral\"\n [size]=\"size()\"\n [disabled]=\"loading()\"\n (click)=\"cancel()\"\n >\n {{ l().cancel }}\n </button>\n }\n </div>\n </div>\n}\n","import { booleanAttribute, Component, input, output } from \"@angular/core\";\n\n/** Which band(s) carry a chrome treatment (a separator hairline or a raised\n * tint): neither, just the header, just the footer, or both. */\nexport type FoldCardBandChrome = \"none\" | \"header\" | \"footer\" | \"both\";\n\n/** What the `separators` / `raisedBands` inputs accept: the {@link FoldCardBandChrome}\n * enum, or a boolean shorthand — a bare attribute (`separators`, i.e. `\"\"`) or\n * `true` means **both** bands; `false` means **none**. */\nexport type FoldCardBandChromeInput = FoldCardBandChrome | boolean | \"\";\n\n/** Coerce the band-chrome shorthand: bare attribute / `true` → `\"both\"`,\n * `false` → `\"none\"`, an explicit enum value passes through unchanged. */\nexport function foldCardBandChrome(\n value: FoldCardBandChromeInput,\n): FoldCardBandChrome {\n if (value === \"\" || value === true) {\n return \"both\";\n }\n if (value === false) {\n return \"none\";\n }\n return value;\n}\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) · `accent` (an accent-filled\n * card whose content sub-tree auto-inverts to a compatible on-accent palette).\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` — makes the whole card a clickable control (see below).\n * - `separators` — which bands get a hairline against the body:\n * `none` (default) · `header` · `footer` · `both`.\n * - `raisedBands` — which bands are tinted a step above the surface (fainter on\n * `sunken`): `none` (default) · `header` · `footer` · `both`.\n *\n * `separators` and `raisedBands` are per-band and independent axes, so a card can\n * have (say) a raised, un-separated header over a flush footer.\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 * **Interactive cards.** `interactive` turns the whole card into a real control:\n * the host gains `role=\"button\"`, `tabindex=\"0\"`, a focus ring and a hover lift,\n * and Enter / Space (or a click) emit `(activated)`. Give it an accessible name\n * with `ariaLabel` when the card's text isn't a sufficient label.\n * A `role=\"button\"` must not wrap other interactive controls — so an interactive\n * card must NOT contain buttons/links. For a card with its own inner actions,\n * keep it non-interactive and put a single primary `<a>`/`<button>` inside.\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=\"both\">\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 * @example\n * ```html\n * <fold-card interactive ariaLabel=\"Open Acme Records\" (activated)=\"open()\">\n * <h3>Acme Records</h3>\n * <p>128 contracts · 96 active</p>\n * </fold-card>\n * ```\n */\n@Component({\n selector: \"fold-card\",\n standalone: true,\n host: {\n \"[class.s-sunken]\": \"surface() === 'sunken'\",\n \"[class.s-accent]\": \"surface() === 'accent'\",\n \"[attr.data-surface]\": \"surface() === 'accent' ? 'accent' : null\",\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.sep-header]\": \"hasBand(separators(), 'header')\",\n \"[class.sep-footer]\": \"hasBand(separators(), 'footer')\",\n \"[class.raise-header]\": \"hasBand(raisedBands(), 'header')\",\n \"[class.raise-footer]\": \"hasBand(raisedBands(), 'footer')\",\n \"[attr.role]\": \"interactive() ? 'button' : null\",\n \"[attr.tabindex]\": \"interactive() ? 0 : null\",\n \"[attr.aria-label]\": \"interactive() ? (ariaLabel() ?? null) : null\",\n \"(click)\": \"onActivate($event)\",\n \"(keydown)\": \"onKeydown($event)\",\n },\n templateUrl: \"./card.component.html\",\n styleUrl: \"./card.component.scss\",\n})\nexport class FoldCardComponent {\n /** Surface tint — `card` (raised, default), `sunken` (deeper container), or\n * `accent` (an **accent-filled** card: the accent colour as ground, with the\n * whole content sub-tree auto-inverted to a compatible on-accent role-set —\n * text, borders, band gradation, and even nested buttons/links/icon-tiles\n * convert automatically). Use it to make a card in a grid stand out. */\n readonly surface = input<\"card\" | \"sunken\" | \"accent\">(\"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 /** Make the whole card a clickable control: `role=\"button\"` + `tabindex`, a\n * focus ring, a hover lift, and Enter/Space/click → `(activated)`. Must not\n * wrap other interactive controls (see the class docs). */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Accessible name for the interactive card, when its content isn't enough. */\n readonly ariaLabel = input<string>();\n /** Which bands get a hairline against the body — `none` (default), `header`,\n * `footer`, or `both`. Accepts a boolean shorthand: a bare `separators` (or\n * `[separators]=\"true\"`) means `both`; `false` means `none`. */\n readonly separators = input<FoldCardBandChrome, FoldCardBandChromeInput>(\n \"none\",\n { transform: foldCardBandChrome },\n );\n /** Which bands are lifted with a subtle raised tint over the card surface\n * (fainter on `sunken`) — `none` (default), `header`, `footer`, or `both`.\n * Accepts the same boolean shorthand as {@link separators}. */\n readonly raisedBands = input<FoldCardBandChrome, FoldCardBandChromeInput>(\n \"none\",\n { transform: foldCardBandChrome },\n );\n\n /** Fires when an `interactive` card is activated (click, Enter, or Space). */\n readonly activated = output<Event>();\n\n /** Whether a per-band chrome value applies to the given band. */\n protected hasBand(\n value: FoldCardBandChrome,\n band: \"header\" | \"footer\",\n ): boolean {\n return value === band || value === \"both\";\n }\n\n protected onActivate(event: Event): void {\n if (this.interactive()) {\n this.activated.emit(event);\n }\n }\n\n /** Enter/Space activate the card, matching the native button keyboard contract\n * (Space is prevented from scrolling the page). */\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.interactive() || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n this.activated.emit(event);\n }\n}\n","<div class=\"card-header\"><ng-content select=\"[cardHeader]\" /></div>\n<div class=\"card-body\"><ng-content /></div>\n<div class=\"card-footer\"><ng-content select=\"[cardFooter]\" /></div>\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 // `title` is a heading input — strip the reflected native attribute so it\n // never doubles as a browser tooltip.\n \"[attr.title]\": \"null\",\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 // `title` is a heading input — strip the native attribute a static\n // `title=\"…\"` leaves behind, so it never doubles as a browser tooltip.\n host: { \"[attr.title]\": \"null\" },\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 {\n booleanAttribute,\n Component,\n computed,\n input,\n output,\n} 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 * - `target` / `rel` — anchor mode only. Setting `target=\"_blank\"` auto-applies\n * `rel=\"noopener noreferrer\"` (safe by default); override with an explicit\n * `rel`.\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\" target=\"_blank\" tone=\"muted\">\n * Documentation\n * </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 /** Anchor target (e.g. `_blank`). Anchor mode only. */\n readonly target = input<string>();\n /** Anchor `rel`. Anchor mode only. Defaults to `noopener noreferrer` when\n * `target=\"_blank\"`; set explicitly to override. */\n readonly rel = 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; carries the `MouseEvent`. */\n readonly clicked = output<MouseEvent>();\n\n /** Resolved `rel` — the explicit value, or a safe default for a new tab. */\n protected readonly resolvedRel = computed(\n () =>\n this.rel() ?? (this.target() === \"_blank\" ? \"noopener noreferrer\" : null),\n );\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\n class=\"lnk\"\n [href]=\"h\"\n [attr.target]=\"target() ?? null\"\n [attr.rel]=\"resolvedRel()\"\n >\n <ng-container [ngTemplateOutlet]=\"inner\" />\n </a>\n} @else {\n <button\n type=\"button\"\n class=\"lnk\"\n [disabled]=\"disabled()\"\n (click)=\"clicked.emit($event)\"\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 // a solid primary ground is an accent surface: auto-invert the content too.\n \"[attr.data-surface]\": \"surface() === 'primary' ? 'accent' : null\",\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 { Directive, TemplateRef, inject } from \"@angular/core\";\n\n/**\n * Marks the `<ng-template>` that renders a whole row as a **custom mobile card**\n * inside `<fold-data-table mobileLayout=\"custom\">`:\n *\n * ```html\n * <ng-template foldRowCard let-row let-i=\"index\"> … </ng-template>\n * ```\n *\n * The template context is `{ $implicit: row, index }`. When `mobileLayout` is\n * `\"custom\"`, the table hides on narrow screens and this template renders once\n * per row instead of the auto label/value stack — the parent owns the mobile\n * presentation entirely (including any interactions it wants inside the card).\n *\n * As with cell templates, `let-row` is untyped by design — annotate through the\n * parent component's typed helpers.\n */\n@Directive({ selector: \"ng-template[foldRowCard]\", standalone: true })\nexport class FoldDataTableRowCardDirective {\n readonly template = inject(TemplateRef);\n}\n","/**\n * Roving-tabindex DOM helpers for `fold-data-table` body rows — pure functions\n * that move focus between `<tr>` siblings, so the component's keydown handler\n * stays thin and they are unit-testable without a component fixture.\n */\n\n/** Focus the adjacent row (Arrow Up/Down) relative to the focused one. */\nexport function focusAdjacentRow(\n from: EventTarget | null,\n edge: \"nextElementSibling\" | \"previousElementSibling\",\n): void {\n if (!(from instanceof Element)) {\n return;\n }\n const sibling = from[edge];\n if (sibling instanceof HTMLElement) {\n sibling.focus();\n }\n}\n\n/** Focus the first / last row in the same body (Home / End). */\nexport function focusEdgeRow(\n from: EventTarget | null,\n edge: \"firstElementChild\" | \"lastElementChild\",\n): void {\n if (!(from instanceof Element)) {\n return;\n }\n const target = from.parentElement?.[edge];\n if (target instanceof HTMLElement) {\n target.focus();\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n model,\n} from \"@angular/core\";\nimport type {\n FormCheckboxControl,\n ValidationError,\n} from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\n\n/**\n * `<fold-checkbox>` — the boolean form control. A **native** `<input\n * type=\"checkbox\">` (so keyboard, focus, the `checkbox` role, form submission\n * and `indeterminate` all come for free) is visually replaced by a tokenised\n * box + check/dash mark: best-in-class semantics with full visual control.\n *\n * Drive it standalone with `[(checked)]` / `(checkedChange)`, or bind a signal\n * form field with `[formField]` (it implements `FormCheckboxControl`, whose\n * value member is `checked` — not `value` — so the field's value **is** the\n * checked state; `disabled`, `touched` and `errors` are wired by `FormField`).\n * `indeterminate` renders the mixed state\n * (e.g. a \"select all\" over a partial selection); it is a visual cue only —\n * clicking a mixed box checks it, as natively.\n *\n * Accessible by construction: the box is decorative, the native input carries\n * the semantics; a visible `label` wraps the input (click-to-toggle) and names\n * it, otherwise pass `ariaLabel`. Focus-visible ring, `prefers-reduced-motion`\n * and `forced-colors` are all handled.\n *\n * @selector `fold-checkbox`\n *\n * @example\n * ```html\n * <fold-checkbox label=\"Remember me\" [(checked)]=\"remember\" />\n * <fold-checkbox ariaLabel=\"Select row\" [checked]=\"selected\" (checkedChange)=\"toggle()\" />\n * <fold-checkbox label=\"I accept the terms\" required [formField]=\"form.consent\" />\n * ```\n */\n@Component({\n selector: \"fold-checkbox\",\n standalone: true,\n templateUrl: \"./checkbox.component.html\",\n styleUrl: \"./checkbox.component.scss\",\n host: { \"[class]\": \"size()\" },\n})\nexport class FoldCheckboxComponent implements FormCheckboxControl {\n /** Checked state — the signal-forms field value. Bind with `[(checked)]`,\n * `(checkedChange)`, or `[formField]`. */\n readonly checked = model<boolean>(false);\n\n /** Disabled state — bound automatically by `FormField`. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on blur so `FormField` can surface errors. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField` from the field. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n\n /** Mixed / tri-state visual (native `indeterminate`, a property not attribute). */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n /** Optional visible label — wraps the box, so clicking it toggles. */\n readonly label = input<string>();\n /** Accessible name when there is no visible `label`. */\n readonly ariaLabel = input<string>();\n /** Optional helper text shown under the control. */\n readonly hint = input<string>();\n /** Show a required marker on the label (and set the native `required`). */\n readonly required = input(false, { transform: booleanAttribute });\n /** Size preset — `sm` for dense rows/tables, `md` (default) for forms. */\n readonly size = input<\"sm\" | \"md\">(\"md\");\n\n /** Unique, SSR-safe id for label + message association. */\n readonly inputId = inject(FoldIdService).next(\"fold-checkbox\");\n\n /** The message under the control: the first error once touched, else the hint. */\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 protected readonly message = computed<string | null>(\n () => this.errorMessage() ?? this.hint() ?? null,\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 guard: a checkbox with no visible label and no ariaLabel has no\n // accessible name — a hard a11y failure that is easy to miss.\n effect(() => {\n if (!isDevMode()) {\n return;\n }\n if (!this.label() && !this.ariaLabel()) {\n console.warn(\n \"[fold-checkbox] has no accessible name: set `label` or `ariaLabel`.\",\n );\n }\n });\n }\n\n /** Native change → sync the model (also fires the auto `checkedChange`). */\n onChange(event: Event): void {\n const target = event.target;\n if (target instanceof HTMLInputElement) {\n this.checked.set(target.checked);\n }\n }\n\n protected onBlur(): void {\n this.touched.set(true);\n }\n}\n","<label class=\"cb\" [class.is-disabled]=\"disabled()\">\n <input\n #native\n type=\"checkbox\"\n class=\"cb-native\"\n [id]=\"inputId\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.aria-label]=\"label() ? null : (ariaLabel() ?? null)\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n (change)=\"onChange($event)\"\n (blur)=\"onBlur()\"\n />\n <span class=\"cb-box\" aria-hidden=\"true\">\n <svg class=\"cb-mark cb-check\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3.5 8.5l3 3 6-6.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <svg class=\"cb-mark cb-dash\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n @if (label(); as text) {\n <span class=\"cb-label\"\n >{{ text }}\n @if (required()) {\n <span class=\"cb-req\" aria-hidden=\"true\"> *</span>\n }\n </span>\n }\n</label>\n@if (message(); as msg) {\n <span\n class=\"cb-msg\"\n [class.is-error]=\"errorMessage()\"\n [id]=\"errorMessage() ? inputId + '-error' : inputId + '-hint'\"\n >{{ msg }}</span\n >\n}\n","import { InjectionToken, type Provider } from \"@angular/core\";\n\n/**\n * Every user-facing / accessible string {@link FoldDataTableComponent} renders\n * that isn't supplied per row. Parameterised strings are functions so a locale\n * can reword, not just translate. All defaults are English — a non-English app\n * overrides them once via {@link provideFoldDataTableLabels}, or per instance\n * via the `labels` input. (Per-row names come from the `selectionLabel` input;\n * {@link FoldDataTableLabels.selectRow} is only the fallback when it's unset.)\n */\nexport interface FoldDataTableLabels {\n /** `aria-label` of the select-all header checkbox. */\n readonly selectAll: string;\n /** Fallback `aria-label` of a row checkbox (used when no `selectionLabel`). */\n readonly selectRow: string;\n /** A sortable header's button `aria-label`, e.g. `(\"Name\") => \"Sort by Name\"`. */\n readonly sortBy: (column: string) => string;\n /** The loading spinner's accessible label. */\n readonly loading: string;\n}\n\n/** The English defaults — the base every override merges onto. */\nexport const FOLD_DATA_TABLE_DEFAULT_LABELS: FoldDataTableLabels = {\n selectAll: \"Select all rows\",\n selectRow: \"Select row\",\n sortBy: (column) => `Sort by ${column}`,\n loading: \"Loading…\",\n};\n\n/** App-wide data-table labels; defaults to English. */\nexport const FOLD_DATA_TABLE_LABELS = new InjectionToken<FoldDataTableLabels>(\n \"FOLD_DATA_TABLE_LABELS\",\n { factory: () => FOLD_DATA_TABLE_DEFAULT_LABELS },\n);\n\n/**\n * Provide app-wide data-table labels once at bootstrap. Partial — any key you\n * omit keeps its English default.\n *\n * @example\n * ```ts\n * providers: [\n * provideFoldDataTableLabels({\n * selectAll: \"Tout sélectionner\",\n * sortBy: (c) => `Trier par ${c}`,\n * }),\n * ];\n * ```\n */\nexport function provideFoldDataTableLabels(\n labels: Partial<FoldDataTableLabels>,\n): Provider {\n return {\n provide: FOLD_DATA_TABLE_LABELS,\n useValue: { ...FOLD_DATA_TABLE_DEFAULT_LABELS, ...labels },\n };\n}\n","import {\n Component,\n DestroyRef,\n type TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n isDevMode,\n output,\n signal,\n} from \"@angular/core\";\nimport { NgClass, NgTemplateOutlet } from \"@angular/common\";\nimport { FoldDataTableCellDirective } from \"./data-table-cell.directive\";\nimport { FoldDataTableRowCardDirective } from \"./data-table-row-card.directive\";\nimport { focusAdjacentRow, focusEdgeRow } from \"./data-table-keyboard\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldSpinnerComponent } from \"../../foundations/spinner/spinner.component\";\nimport { FoldCheckboxComponent } from \"../../forms/checkbox/checkbox.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport type {\n FoldTableColumn,\n FoldTableEmpty,\n FoldTableSort,\n FoldTableTone,\n} from \"./data-table.types\";\nimport {\n FOLD_DATA_TABLE_LABELS,\n type FoldDataTableLabels,\n} from \"./data-table-labels\";\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 loading + empty states).\n *\n * Selection stays controlled too: pass a `selected` set of row keys and handle\n * `selectionChange` — the table renders the checkbox column, the header\n * select-all (with an indeterminate state over the current rows), and the\n * selected-row tint, but never owns the set.\n *\n * The narrow-screen behaviour is the parent's choice, not an imposed one, via\n * `mobileLayout`: `scroll` (default — stay tabular, scroll horizontally),\n * `auto-cards` (each row stacks into a label/value card), or `custom` (the\n * parent supplies `<ng-template foldRowCard let-row>` and owns the card).\n *\n * Accessible by construction: the first column renders as `<th scope=\"row\">`\n * (screen readers announce each row by its identity cell), the sort direction\n * rides on `aria-sort` (the icon is decorative), clickable rows answer Enter and\n * Space and form a single roving-tabindex group (Arrow/Home/End move between\n * rows), and `caption` gives the table a visually-hidden name.\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: [\n NgClass,\n NgTemplateOutlet,\n FoldIconComponent,\n FoldSpinnerComponent,\n FoldCheckboxComponent,\n ],\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 /** While `true`, shows a spinner instead of the empty state — a table that\n * is fetching reads as \"loading\", never as \"no data\". */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Accessible table name, rendered as a visually-hidden `<caption>`. Set it\n * when the surrounding context does not already name the table for AT. */\n readonly caption = input<string>();\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 /**\n * How the table behaves on a narrow screen:\n * - `scroll` (default) — stay tabular; the body scrolls horizontally. The\n * table imposes no card layout unless asked.\n * - `auto-cards` — each row stacks into an auto label/value card.\n * - `custom` — hide the table and render the projected `foldRowCard` template\n * per row, so the parent owns the mobile presentation.\n */\n readonly mobileLayout = input<\"scroll\" | \"auto-cards\" | \"custom\">(\"scroll\");\n /** Row density — `compact` tightens padding for dense rosters. */\n readonly density = input<\"comfortable\" | \"compact\">(\"comfortable\");\n /** Pin the identity column while the body scrolls horizontally (wide tables). */\n readonly stickyFirst = input(false, { transform: booleanAttribute });\n\n /** Renders the checkbox column + header select-all. */\n readonly selectable = input(false, { transform: booleanAttribute });\n /** Controlled selection — the set of selected row keys. The parent owns it. */\n readonly selected = input<ReadonlySet<string | number>>(new Set());\n /** Accessible label for a row's checkbox, e.g. `(row) => row.name`. */\n readonly selectionLabel = input<(row: T) => string>();\n /** Per-instance label overrides (merged over the app-wide / English defaults). */\n readonly labels = input<Partial<FoldDataTableLabels>>();\n\n /** Emits the next selection set on any checkbox toggle (never mutates input). */\n readonly selectionChange = output<Set<string | number>>();\n /** Emits the clicked sortable column's `key`. */\n readonly sortChange = output<string>();\n readonly rowClick = output<T>();\n\n /** Key of the row that currently holds the single tab stop (roving tabindex). */\n private readonly focusedKey = signal<string | number | null>(null);\n /** True on a narrow viewport — gates the custom mobile-card rendering so the\n * desktop never instantiates the (CSS-hidden) per-row cards. */\n protected readonly isNarrow = signal(false);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injectedLabels = inject(FOLD_DATA_TABLE_LABELS);\n\n /** Effective labels — the app-wide (or English) set, with the `labels` input on top. */\n protected readonly l = computed<FoldDataTableLabels>(() => ({\n ...this.injectedLabels,\n ...this.labels(),\n }));\n\n constructor() {\n // Track the same 700px breakpoint the mobile CSS uses, so `mobileLayout=\n // \"custom\"` only builds its card list when the cards are actually shown.\n // SSR / no matchMedia → false (desktop-first; the client corrects on hydration).\n if (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\"\n ) {\n const mq = window.matchMedia(\"(max-width: 700px)\");\n this.isNarrow.set(mq.matches);\n const onChange = (e: MediaQueryListEvent): void => {\n this.isNarrow.set(e.matches);\n };\n mq.addEventListener(\"change\", onChange);\n this.destroyRef.onDestroy(() => {\n mq.removeEventListener(\"change\", onChange);\n });\n }\n\n // Dev guard: `truncate` clips against the column `width`; without one it\n // silently won't truncate. Warn so the misuse surfaces at authoring time.\n effect(() => {\n if (!isDevMode()) {\n return;\n }\n for (const col of this.columns()) {\n if (col.truncate && !col.width) {\n console.warn(\n `[fold-data-table] column \"${col.key}\" sets truncate but no width; ` +\n `truncation needs a width to clip against.`,\n );\n }\n }\n });\n }\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 private readonly rowCard = contentChild(FoldDataTableRowCardDirective);\n /** The custom mobile-card template, only when `mobileLayout=\"custom\"`. */\n readonly rowCardTemplate = computed<TemplateRef<unknown> | null>(() =>\n this.mobileLayout() === \"custom\"\n ? (this.rowCard()?.template ?? null)\n : null,\n );\n\n /**\n * The toolbar's surface level — the \"weight\" the title bar lends the table.\n * All four map to fold surface tokens (never a hard-coded colour): `default`\n * (a subtle header lift), `sunken` / `raised` (a step down / up the elevation\n * ramp), and `accent` — a brand-filled bar whose projected content\n * auto-inverts to the on-accent palette per theme (the shared\n * `[data-surface=\"accent\"]` machinery).\n */\n readonly toolbarSurface = input<\"default\" | \"sunken\" | \"raised\" | \"accent\">(\n \"default\",\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 /** Total ARIA column count (data columns + the checkbox column). */\n readonly colCount = computed(\n () => this.columns().length + (this.selectable() ? 1 : 0),\n );\n\n /** Current row keys, in order — the roving-nav anchor set. */\n private readonly rowKeys = computed(() =>\n this.rows().map((row, i) => this.keyOf(row, i)),\n );\n /** The row that holds the single tab stop: the focused row while it still\n * exists, else the first row — so a removed/filtered focus never strands the\n * roving group with zero tab stops. */\n private readonly activeRowKey = computed<string | number | null>(() => {\n const focused = this.focusedKey();\n const keys = this.rowKeys();\n if (focused !== null && keys.includes(focused)) {\n return focused;\n }\n return keys[0] ?? null;\n });\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 icon for a column: a neutral up/down (`expand-all`) when idle, or\n * the active direction chevron. Decorative — `aria-sort` on the `<th>` is the\n * accessible carrier, so these icons stay `aria-hidden` (fold-icon default). */\n sortIcon(key: string): FoldIconName {\n const sort = this.sort();\n if (sort?.key !== key) {\n return \"expand-all\";\n }\n return sort.dir === \"asc\" ? \"chevron-up\" : \"chevron-down\";\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 /* ── selection (controlled) ── */\n\n isRowSelected(row: T, index: number): boolean {\n return this.selected().has(this.keyOf(row, index));\n }\n\n /** All current rows selected (drives the header checkbox `checked`). */\n readonly allSelected = computed(\n () =>\n this.rows().length > 0 &&\n this.rows().every((row, i) => this.selected().has(this.keyOf(row, i))),\n );\n\n /** Some — but not all — current rows selected (header `indeterminate`). */\n readonly someSelected = computed(\n () =>\n !this.allSelected() &&\n this.rows().some((row, i) => this.selected().has(this.keyOf(row, i))),\n );\n\n toggleRow(row: T, index: number): void {\n const next = new Set(this.selected());\n const key = this.keyOf(row, index);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n this.selectionChange.emit(next);\n }\n\n /** Select-all toggles every current row; if all are already in, clears them. */\n toggleAll(): void {\n const next = new Set(this.selected());\n const select = !this.allSelected();\n this.rows().forEach((row, i) => {\n const key = this.keyOf(row, i);\n if (select) {\n next.add(key);\n } else {\n next.delete(key);\n }\n });\n this.selectionChange.emit(next);\n }\n\n labelFor(row: T): string {\n return this.selectionLabel()?.(row) ?? this.l().selectRow;\n }\n\n /* ── roving-tabindex keyboard navigation over clickable rows ── */\n\n /** The single tab stop: the focused (or fallback first) row. */\n rowTabIndex(row: T, index: number): 0 | -1 | null {\n if (!this.clickable()) {\n return null;\n }\n const active = this.activeRowKey();\n return active !== null && this.keyOf(row, index) === active ? 0 : -1;\n }\n\n onRowFocus(row: T, index: number): void {\n this.focusedKey.set(this.keyOf(row, index));\n }\n\n onRowKeydown(event: KeyboardEvent, row: T): void {\n // Only when the row itself holds focus — never when the key bubbled up from\n // an inner control (a link, a button, the selection checkbox), which owns it.\n if (event.target !== event.currentTarget) {\n return;\n }\n switch (event.key) {\n case \"Enter\":\n this.onRowActivate(row);\n break;\n case \" \":\n this.onRowActivate(row);\n event.preventDefault();\n break;\n case \"ArrowDown\":\n focusAdjacentRow(event.currentTarget, \"nextElementSibling\");\n event.preventDefault();\n break;\n case \"ArrowUp\":\n focusAdjacentRow(event.currentTarget, \"previousElementSibling\");\n event.preventDefault();\n break;\n case \"Home\":\n focusEdgeRow(event.currentTarget, \"firstElementChild\");\n event.preventDefault();\n break;\n case \"End\":\n focusEdgeRow(event.currentTarget, \"lastElementChild\");\n event.preventDefault();\n break;\n default:\n break;\n }\n }\n}\n","<div\n class=\"folddt-wrap\"\n [class.folddt--zebra]=\"zebra()\"\n [class.folddt--hover]=\"hover()\"\n [class.folddt--cards]=\"mobileLayout() === 'auto-cards'\"\n [class.folddt--custom]=\"mobileLayout() === 'custom'\"\n [class.folddt--compact]=\"density() === 'compact'\"\n [class.folddt--sticky-first]=\"stickyFirst()\"\n [class.folddt--select]=\"selectable()\"\n>\n <div\n class=\"folddt-toolbar\"\n [class.folddt-toolbar--sunken]=\"toolbarSurface() === 'sunken'\"\n [class.folddt-toolbar--raised]=\"toolbarSurface() === 'raised'\"\n [class.folddt-toolbar--accent]=\"toolbarSurface() === 'accent'\"\n [attr.data-surface]=\"toolbarSurface() === 'accent' ? 'accent' : null\"\n >\n <ng-content select=\"[foldToolbar]\" />\n </div>\n <div class=\"folddt-scroll\">\n <table class=\"folddt\" [attr.aria-colcount]=\"colCount()\">\n @if (caption(); as cap) {\n <caption class=\"folddt-caption\">\n {{\n cap\n }}\n </caption>\n }\n <thead>\n <tr>\n @if (selectable()) {\n <th scope=\"col\" class=\"folddt-select-h\">\n <fold-checkbox\n size=\"sm\"\n [ariaLabel]=\"l().selectAll\"\n [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (checkedChange)=\"toggleAll()\"\n />\n </th>\n }\n @for (col of columns(); track col.key) {\n <th\n scope=\"col\"\n [class.is-primary-h]=\"col.key === primaryKey()\"\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 [class.center]=\"col.align === 'center'\"\n [attr.aria-label]=\"l().sortBy(col.label)\"\n (click)=\"sortChange.emit(col.key)\"\n >\n <span>{{ col.label }}</span>\n <fold-icon\n class=\"folddt-arrow\"\n [class.on]=\"isSorted(col.key)\"\n [name]=\"sortIcon(col.key)\"\n [size]=\"14\"\n />\n </button>\n } @else {\n <span\n class=\"folddt-th-plain\"\n [class.right]=\"col.align === 'right'\"\n [class.center]=\"col.align === 'center'\"\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 [class.is-selected]=\"selectable() && isRowSelected(row, i)\"\n [attr.tabindex]=\"rowTabIndex(row, i)\"\n [attr.aria-selected]=\"selectable() ? isRowSelected(row, i) : null\"\n (click)=\"onRowActivate(row)\"\n (focus)=\"onRowFocus(row, i)\"\n (keydown)=\"onRowKeydown($event, row)\"\n >\n @if (selectable()) {\n <td class=\"folddt-cell folddt-cell--select\">\n <fold-checkbox\n size=\"sm\"\n [ariaLabel]=\"labelFor(row)\"\n [checked]=\"isRowSelected(row, i)\"\n (click)=\"$event.stopPropagation()\"\n (checkedChange)=\"toggleRow(row, i)\"\n />\n </td>\n }\n @for (col of columns(); track col.key) {\n @if (col.key === primaryKey()) {\n <th\n scope=\"row\"\n class=\"folddt-cell is-primary\"\n [class.right]=\"col.align === 'right'\"\n [class.center]=\"col.align === 'center'\"\n [class.truncate]=\"col.truncate\"\n [ngClass]=\"col.cellClass || ''\"\n [attr.data-label]=\"col.label\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cellTemplate(col.key)\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n </th>\n } @else {\n <td\n class=\"folddt-cell\"\n [class.right]=\"col.align === 'right'\"\n [class.center]=\"col.align === 'center'\"\n [class.truncate]=\"col.truncate\"\n [ngClass]=\"col.cellClass || ''\"\n [attr.data-label]=\"col.label\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cellTemplate(col.key)\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n @if (isNarrow() && rowCardTemplate(); as card) {\n <div class=\"folddt-cardlist\" role=\"list\">\n @for (row of rows(); track keyOf(row, $index); let i = $index) {\n <div class=\"folddt-cardlist-item\" role=\"listitem\">\n <ng-container\n [ngTemplateOutlet]=\"card\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n </div>\n }\n </div>\n }\n\n @if (loading()) {\n <div class=\"folddt-loading\">\n <fold-spinner [label]=\"l().loading\" />\n </div>\n } @else 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","/**\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","/**\n * Zero-dependency placement math for {@link FoldPopoverComponent}. Pure and\n * framework-free so it unit-tests without a DOM: give it the anchor rect, the\n * floating size and the viewport, get back the `{ x, y }` to pin the floating\n * element (viewport coordinates, for `position: fixed`) plus the placement it\n * actually resolved to after collision handling.\n *\n * Three middlewares, in the order a good popover applies them:\n * 1. **flip** — pick the best-fitting side: keep the preferred one if it fits,\n * else its opposite, else whichever has the most room (so a bottom menu opens\n * upward near the fold instead of spilling offscreen).\n * 2. **size** — report the space available on the chosen side (`maxWidth` /\n * `maxHeight`), so the caller caps the panel and scrolls the overflow instead\n * of letting it run off the viewport.\n * 3. **shift** — slide along the cross axis to stay within the viewport padding,\n * without leaving the anchor's side.\n *\n * We deliberately do not depend on Floating UI — fold ships no runtime deps.\n */\n\n/** The side of the anchor the floating element sits on. */\nexport type FoldPopoverSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n/** Alignment of the floating element along the anchor's cross axis. */\nexport type FoldPopoverAlign = \"start\" | \"center\" | \"end\";\n/** A full placement: a side, optionally suffixed with an alignment. */\nexport type FoldPopoverPlacement =\n FoldPopoverSide | `${FoldPopoverSide}-${FoldPopoverAlign}`;\n\n/** A rectangle in viewport coordinates (a subset of `DOMRect`). */\nexport interface FoldRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport interface FoldPlacementInput {\n /** The trigger's bounding rect, in viewport coordinates. */\n readonly anchor: FoldRect;\n /** The floating element's measured size. */\n readonly floating: { readonly width: number; readonly height: number };\n /** Preferred placement before collision handling. */\n readonly placement: FoldPopoverPlacement;\n /**\n * Ordered fallbacks tried (after the preferred) when the preferred side can't\n * fit — the first that fits wins, else the roomiest of all candidates. Each\n * may change side *and* alignment. Defaults to the opposite side.\n */\n readonly fallbackPlacements?: readonly FoldPopoverPlacement[] | undefined;\n /** Gap between the anchor and the floating element, in px. */\n readonly offset: number;\n /** Viewport size (usually `innerWidth` / `innerHeight`). */\n readonly viewport: { readonly width: number; readonly height: number };\n /** Minimum gap kept between the floating element and the viewport edge. */\n readonly padding: number;\n}\n\nexport interface FoldPlacementResult {\n readonly x: number;\n readonly y: number;\n /** The placement after flip — drives the arrow / `data-placement`. */\n readonly placement: FoldPopoverPlacement;\n /** Space available to the floating element on the resolved side, minus\n * padding — the consumer caps `max-width` / `max-height` to these and lets\n * the panel scroll (the `size` middleware). */\n readonly maxWidth: number;\n readonly maxHeight: number;\n}\n\nconst OPPOSITE: Record<FoldPopoverSide, FoldPopoverSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\nfunction isSide(value: string): value is FoldPopoverSide {\n return (\n value === \"top\" ||\n value === \"bottom\" ||\n value === \"left\" ||\n value === \"right\"\n );\n}\n\nfunction isAlign(value: string): value is FoldPopoverAlign {\n return value === \"start\" || value === \"center\" || value === \"end\";\n}\n\nfunction parse(placement: FoldPopoverPlacement): {\n side: FoldPopoverSide;\n align: FoldPopoverAlign;\n} {\n const [rawSide, rawAlign] = placement.split(\"-\");\n const side: FoldPopoverSide =\n rawSide !== undefined && isSide(rawSide) ? rawSide : \"bottom\";\n const align: FoldPopoverAlign =\n rawAlign !== undefined && isAlign(rawAlign) ? rawAlign : \"center\";\n return { side, align };\n}\n\n/** Is `side` on the vertical axis (floating above/below the anchor)? */\nfunction isVertical(side: FoldPopoverSide): boolean {\n return side === \"top\" || side === \"bottom\";\n}\n\n/** Room available between the anchor and the viewport edge on a given side. */\nfunction roomFor(\n side: FoldPopoverSide,\n anchor: FoldRect,\n viewport: { width: number; height: number },\n): number {\n switch (side) {\n case \"top\":\n return anchor.y;\n case \"bottom\":\n return viewport.height - (anchor.y + anchor.height);\n case \"left\":\n return anchor.x;\n case \"right\":\n return viewport.width - (anchor.x + anchor.width);\n }\n}\n\n/** Main-axis coordinate (the side offset) for a resolved side. */\nfunction mainAxisCoord(\n side: FoldPopoverSide,\n anchor: FoldRect,\n floating: { width: number; height: number },\n offset: number,\n): number {\n switch (side) {\n case \"top\":\n return anchor.y - floating.height - offset;\n case \"bottom\":\n return anchor.y + anchor.height + offset;\n case \"left\":\n return anchor.x - floating.width - offset;\n case \"right\":\n return anchor.x + anchor.width + offset;\n }\n}\n\n/** Cross-axis coordinate before shifting, from the alignment. */\nfunction crossAxisCoord(\n side: FoldPopoverSide,\n align: FoldPopoverAlign,\n anchor: FoldRect,\n floating: { width: number; height: number },\n): number {\n const vertical = isVertical(side);\n const anchorStart = vertical ? anchor.x : anchor.y;\n const anchorSize = vertical ? anchor.width : anchor.height;\n const floatSize = vertical ? floating.width : floating.height;\n switch (align) {\n case \"start\":\n return anchorStart;\n case \"end\":\n return anchorStart + anchorSize - floatSize;\n case \"center\":\n return anchorStart + anchorSize / 2 - floatSize / 2;\n }\n}\n\n/** Clamp a value into `[min, max]`; if the range is inverted, return `min`. */\nfunction clamp(value: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(value, min), max);\n}\n\n/** Room needed on a placement's main axis to fit the floating element. */\nfunction needFor(\n side: FoldPopoverSide,\n floating: { width: number; height: number },\n): number {\n return isVertical(side) ? floating.height : floating.width;\n}\n\n/**\n * Choose the placement (**flip**): try the preferred, then each fallback (the\n * opposite side by default); the first whose side fits the floating element\n * wins. If none fit, take whichever has the most room — the `size` middleware\n * then caps + scrolls the overflow, so it degrades gracefully.\n */\nfunction choosePlacement(input: FoldPlacementInput): {\n side: FoldPopoverSide;\n align: FoldPopoverAlign;\n} {\n const preferred = parse(input.placement);\n const opposite: FoldPopoverPlacement =\n preferred.align === \"center\"\n ? OPPOSITE[preferred.side]\n : `${OPPOSITE[preferred.side]}-${preferred.align}`;\n const fallbacks = input.fallbackPlacements ?? [opposite];\n const candidates = [input.placement, ...fallbacks];\n let best = preferred;\n let bestRoom = -Infinity;\n for (const candidate of candidates) {\n const parsed = parse(candidate);\n const room = roomFor(parsed.side, input.anchor, input.viewport);\n if (room >= needFor(parsed.side, input.floating) + input.offset) {\n return parsed;\n }\n if (room > bestRoom) {\n bestRoom = room;\n best = parsed;\n }\n }\n return best;\n}\n\n/**\n * Resolve `{ x, y, placement, maxWidth, maxHeight }` for a floating element.\n * Order: **flip** (choose the best-fitting side) → **size** (available space on\n * that side, for the caller to cap + scroll) → **shift** (slide along the cross\n * axis to stay in the viewport).\n */\nexport function computePlacement(\n input: FoldPlacementInput,\n): FoldPlacementResult {\n const { anchor, floating, offset, viewport, padding } = input;\n const chosen = choosePlacement(input);\n const side = chosen.side;\n const align = chosen.align;\n\n // size: the room on the chosen side (main axis) and the viewport (cross axis).\n const maxMain = Math.max(\n 0,\n roomFor(side, anchor, viewport) - offset - padding,\n );\n const crossViewport = isVertical(side) ? viewport.width : viewport.height;\n const maxCross = Math.max(0, crossViewport - 2 * padding);\n const maxHeight = isVertical(side) ? maxMain : maxCross;\n const maxWidth = isVertical(side) ? maxCross : maxMain;\n\n // position with the effective (capped) size so a scrolled panel still sits\n // flush against the anchor and shifts within the viewport.\n const eff = {\n width: Math.min(floating.width, maxWidth),\n height: Math.min(floating.height, maxHeight),\n };\n let x: number;\n let y: number;\n if (isVertical(side)) {\n y = mainAxisCoord(side, anchor, eff, offset);\n x = crossAxisCoord(side, align, anchor, eff);\n x = clamp(x, padding, viewport.width - eff.width - padding);\n } else {\n x = mainAxisCoord(side, anchor, eff, offset);\n y = crossAxisCoord(side, align, anchor, eff);\n y = clamp(y, padding, viewport.height - eff.height - padding);\n }\n\n const placement: FoldPopoverPlacement =\n align === \"center\" ? side : `${side}-${align}`;\n return { x, y, placement, maxWidth, maxHeight };\n}\n","/**\n * Keep a floating element pinned to its anchor: call `onChange` whenever\n * anything that could move the anchor or resize either element happens —\n * scrolling (capture phase, so nested scroll containers count), a window\n * resize, or a size change of the anchor / floating element (`ResizeObserver`).\n * Returns a teardown that removes every listener. Mirrors Floating UI's\n * `autoUpdate`, dependency-free and scoped to fold's needs.\n */\nexport function autoUpdate(\n anchor: HTMLElement | null,\n floating: HTMLElement,\n onChange: () => void,\n): () => void {\n if (typeof window === \"undefined\") {\n return () => undefined;\n }\n window.addEventListener(\"scroll\", onChange, true);\n window.addEventListener(\"resize\", onChange);\n const ro =\n typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(onChange);\n if (ro) {\n if (anchor) {\n ro.observe(anchor);\n }\n ro.observe(floating);\n }\n return () => {\n window.removeEventListener(\"scroll\", onChange, true);\n window.removeEventListener(\"resize\", onChange);\n ro?.disconnect();\n };\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n model,\n Renderer2,\n RendererStyleFlags2,\n viewChild,\n} from \"@angular/core\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { computePlacement, type FoldPopoverPlacement } from \"./placement\";\nimport { autoUpdate } from \"./auto-update\";\n\n/**\n * `<fold-popover>` — an anchored floating layer. Project a trigger\n * (`[foldPopoverTrigger]`) and any content; the content renders in the native\n * **top layer** (via the `popover` attribute, so it escapes `overflow: hidden`\n * and every `z-index`) and is positioned against the trigger with a\n * dependency-free flip/shift engine ({@link computePlacement}).\n *\n * Controlled or uncontrolled through `[(open)]`. Dismissal is owned here\n * (outside-click + `Escape`) rather than the browser's light-dismiss, so\n * re-clicking the trigger toggles cleanly instead of reopening. Opening moves\n * focus into the panel; closing returns it to the trigger. The trigger gets\n * `aria-haspopup` / `aria-expanded` / `aria-controls` wired automatically.\n *\n * For an actions menu with `role=\"menu\"` + keyboard, use `fold-dropdown`, which\n * is built on this.\n *\n * The panel's width is `max-content`; to make it match the trigger (a select-like\n * dropdown), read the published `--fold-popover-anchor-width` in the panel's CSS\n * (e.g. `min-width: var(--fold-popover-anchor-width)`) — it tracks the trigger.\n *\n * @selector `fold-popover`\n *\n * The trigger carries `[foldPopoverTrigger]`; the floating content is marked\n * `foldPopoverPanel`.\n *\n * @example\n * ```html\n * <fold-popover placement=\"bottom-end\">\n * <button foldButton foldPopoverTrigger>Filters</button>\n * <div foldPopoverPanel class=\"my-panel\">…</div>\n * </fold-popover>\n * ```\n */\n@Component({\n selector: \"fold-popover\",\n standalone: true,\n templateUrl: \"./popover.component.html\",\n styleUrl: \"./popover.component.scss\",\n host: {\n class: \"fold-popover\",\n \"(click)\": \"onHostClick($event)\",\n \"(keydown.arrowdown)\": \"onArrowDown($event)\",\n },\n})\nexport class FoldPopoverComponent {\n private readonly renderer = inject(Renderer2);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Preferred placement before collision handling. @default \"bottom-start\" */\n readonly placement = input<FoldPopoverPlacement>(\"bottom-start\");\n /** Ordered placements to try when the preferred can't fit (default: the\n * opposite side). The first that fits wins, else the roomiest. */\n readonly fallbackPlacements = input<readonly FoldPopoverPlacement[]>();\n /** Gap between the trigger and the panel, in px. @default 8 */\n readonly offset = input(8);\n /** Minimum gap kept from the viewport edge, in px. @default 8 */\n readonly padding = input(8);\n /** Move focus into the panel on open. @default true (a dropdown sets false to\n * focus its first item instead). */\n readonly autoFocus = input(true);\n /** Show a small arrow pointing at the trigger. @default false */\n readonly arrow = input(false, { transform: booleanAttribute });\n /** Two-way open state — drive it, or let the trigger toggle it. */\n readonly open = model(false);\n\n /** SSR-safe id linking the trigger's `aria-controls` to the panel. */\n readonly panelId = inject(FoldIdService).next(\"fold-popover\");\n /** Override the trigger's `aria-controls` target — point it at the real\n * controlled element (e.g. an inner `role=\"listbox\"`) when the panel is just a\n * wrapper. @default the panel's own id. */\n readonly ariaControls = input<string>();\n\n private readonly panel = viewChild<ElementRef<HTMLElement>>(\"panel\");\n private readonly inner = viewChild<ElementRef<HTMLElement>>(\"inner\");\n private readonly arrowEl = viewChild<ElementRef<HTMLElement>>(\"arrow\");\n\n /**\n * The marked trigger — the projected `[foldPopoverTrigger]`. Found by DOM\n * query on the host (projected content is a DOM descendant of the host), so it\n * resolves regardless of how deeply it is re-projected (e.g. through\n * `fold-dropdown`) — a content query would not survive the re-projection. Used\n * to anchor against and to detect trigger clicks.\n */\n private markedTrigger(): HTMLElement | null {\n return this.host.nativeElement.querySelector<HTMLElement>(\n \"[foldPopoverTrigger]\",\n );\n }\n\n private static readonly FOCUSABLE =\n \"button, a[href], input, select, textarea, [tabindex]\";\n\n /**\n * The focusable trigger — the marked element itself if it's focusable, else\n * the first focusable inside it (e.g. `fold-button-icon`'s inner `<button>`).\n * This is what receives focus + the aria wiring, so a wrapper trigger is still\n * fully keyboard-accessible.\n */\n private focusableTrigger(): HTMLElement | null {\n const marked = this.markedTrigger();\n if (!marked) {\n return null;\n }\n if (marked.matches(FoldPopoverComponent.FOCUSABLE)) {\n return marked;\n }\n return marked.querySelector<HTMLElement>(FoldPopoverComponent.FOCUSABLE);\n }\n\n constructor() {\n // Keep the trigger's aria in sync — all on the focusable element, so a\n // screen reader announces haspopup/expanded/controls on the control it lands\n // on. `haspopup` comes from the marked element's attribute value.\n effect(() => {\n const open = this.open();\n const focusable = this.focusableTrigger();\n const marked = this.markedTrigger();\n if (!focusable || !marked) {\n return;\n }\n const hp = marked.getAttribute(\"foldpopovertrigger\");\n const haspopup =\n hp === \"menu\" || hp === \"listbox\" || hp === \"true\" ? hp : \"dialog\";\n this.renderer.setAttribute(focusable, \"aria-haspopup\", haspopup);\n this.renderer.setAttribute(\n focusable,\n \"aria-controls\",\n this.ariaControls() ?? this.panelId,\n );\n this.renderer.setAttribute(focusable, \"aria-expanded\", String(open));\n });\n\n // Open/close the native popover + own the dismissal and positioning.\n afterRenderEffect((onCleanup) => {\n const el = this.panel()?.nativeElement;\n if (!el || typeof document === \"undefined\") {\n return;\n }\n const supported = typeof el.showPopover === \"function\";\n if (this.open()) {\n if (supported && !el.matches(\":popover-open\")) {\n el.showPopover();\n }\n this.reposition();\n if (this.autoFocus()) {\n el.focus({ preventScroll: true });\n }\n\n const onDown = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof Node)) {\n return;\n }\n const inPanel = el.contains(target);\n const inTrigger = this.markedTrigger()?.contains(target) ?? false;\n if (!inPanel && !inTrigger) {\n this.open.set(false);\n }\n };\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n this.open.set(false);\n }\n };\n document.addEventListener(\"pointerdown\", onDown, true);\n document.addEventListener(\"keydown\", onKey, true);\n // Keep pinned while open: scroll / resize / element-resize.\n const stopAutoUpdate = autoUpdate(this.markedTrigger(), el, () =>\n this.reposition(),\n );\n onCleanup(() => {\n document.removeEventListener(\"pointerdown\", onDown, true);\n document.removeEventListener(\"keydown\", onKey, true);\n stopAutoUpdate();\n });\n } else if (supported && el.matches(\":popover-open\")) {\n // Only pull focus back to the trigger if it's still inside the closing\n // panel (Escape / select) or nowhere in particular (a click on blank\n // space → body). If it already moved elsewhere — Tab to the next field,\n // a click on another control — leave it there instead of yanking it back.\n const active = document.activeElement;\n const restore =\n !active || active === document.body || el.contains(active);\n el.hidePopover();\n if (restore) {\n this.focusableTrigger()?.focus({ preventScroll: true });\n }\n }\n });\n }\n\n /** Position the panel against the trigger: flip → size (cap + scroll) → shift,\n * then place the arrow. */\n private reposition(): void {\n const panel = this.panel()?.nativeElement;\n const anchorEl = this.markedTrigger();\n if (!panel || !anchorEl) {\n return;\n }\n const anchor = anchorEl.getBoundingClientRect();\n const result = computePlacement({\n anchor,\n floating: { width: panel.offsetWidth, height: panel.offsetHeight },\n placement: this.placement(),\n fallbackPlacements: this.fallbackPlacements(),\n offset: this.offset(),\n viewport: { width: window.innerWidth, height: window.innerHeight },\n padding: this.padding(),\n });\n this.renderer.setStyle(panel, \"position\", \"fixed\");\n this.renderer.setStyle(panel, \"left\", `${result.x}px`);\n this.renderer.setStyle(panel, \"top\", `${result.y}px`);\n this.renderer.setStyle(panel, \"margin\", \"0\");\n // Expose the trigger width so a panel can match it (a select-like dropdown):\n // read `var(--fold-popover-anchor-width)` in the projected panel's CSS.\n this.renderer.setStyle(\n panel,\n \"--fold-popover-anchor-width\",\n `${anchor.width}px`,\n RendererStyleFlags2.DashCase,\n );\n this.renderer.setAttribute(panel, \"data-placement\", result.placement);\n // Apply the size caps only when positive — a degenerate 0-size viewport\n // (SSR / detached) must not collapse the panel to nothing.\n this.applyCap(panel, \"max-width\", result.maxWidth);\n this.applyCap(this.inner()?.nativeElement, \"max-height\", result.maxHeight);\n this.positionArrow(result.placement, anchor, result.x, result.y);\n }\n\n /** Set a `max-*` cap in px, but only when positive (skip a degenerate 0). */\n private applyCap(\n el: HTMLElement | undefined,\n prop: string,\n value: number,\n ): void {\n if (!el) {\n return;\n }\n if (value > 0) {\n this.renderer.setStyle(el, prop, `${value}px`);\n } else {\n this.renderer.removeStyle(el, prop);\n }\n }\n\n /** Center the arrow on the anchor along the cross axis, clamped to the panel. */\n private positionArrow(\n placement: FoldPopoverPlacement,\n anchor: DOMRect,\n x: number,\n y: number,\n ): void {\n const arrow = this.arrowEl()?.nativeElement;\n const panel = this.panel()?.nativeElement;\n if (!arrow || !panel) {\n return;\n }\n const side = placement.split(\"-\")[0];\n const s = 11; // arrow box, px (matches .fpop-arrow)\n const inset = 6; // keep clear of the rounded corner\n const set = (prop: string, value: string): void =>\n this.renderer.setStyle(arrow, prop, value);\n for (const p of [\"top\", \"bottom\", \"left\", \"right\"]) {\n this.renderer.removeStyle(arrow, p);\n }\n if (side === \"top\" || side === \"bottom\") {\n const raw = anchor.x + anchor.width / 2 - x - s / 2;\n set(\n \"left\",\n `${Math.max(inset, Math.min(raw, panel.offsetWidth - s - inset))}px`,\n );\n set(side === \"bottom\" ? \"top\" : \"bottom\", `${-s / 2}px`);\n } else {\n const raw = anchor.y + anchor.height / 2 - y - s / 2;\n set(\n \"top\",\n `${Math.max(inset, Math.min(raw, panel.offsetHeight - s - inset))}px`,\n );\n set(side === \"right\" ? \"left\" : \"right\", `${-s / 2}px`);\n }\n }\n\n protected onHostClick(event: MouseEvent): void {\n const target = event.target;\n if (\n target instanceof Node &&\n (this.markedTrigger()?.contains(target) ?? false)\n ) {\n this.open.update((v) => !v);\n }\n }\n\n protected onArrowDown(event: Event): void {\n const target = event.target;\n if (\n target instanceof Node &&\n (this.markedTrigger()?.contains(target) ?? false)\n ) {\n event.preventDefault();\n this.open.set(true);\n }\n }\n}\n","<ng-content />\n<div #panel class=\"fpop-panel\" popover=\"manual\" [id]=\"panelId\" tabindex=\"-1\">\n @if (arrow()) {\n <div #arrow class=\"fpop-arrow\" aria-hidden=\"true\"></div>\n }\n <div #inner class=\"fpop-inner\">\n <ng-content select=\"[foldPopoverPanel]\" />\n </div>\n</div>\n","import { Directive, ElementRef, inject, input } from \"@angular/core\";\n\n/**\n * Marks the element inside a `<fold-popover>` that opens it — apply to a real,\n * focusable control (a `foldButton`), or a wrapper whose first focusable child\n * is the control (a `fold-button-icon`). The popover anchors to this element,\n * and wires `aria-haspopup` / `aria-expanded` / `aria-controls` onto the\n * focusable control. The value picks the `aria-haspopup` token — it is reflected\n * to the marker attribute so both `foldPopoverTrigger=\"menu\"` and\n * `[foldPopoverTrigger]=\"expr\"` work.\n *\n * ```html\n * <fold-popover>\n * <button foldButton foldPopoverTrigger=\"menu\">Actions</button>\n * …panel…\n * </fold-popover>\n * ```\n *\n * @selector `[foldPopoverTrigger]`\n */\n@Directive({\n selector: \"[foldPopoverTrigger]\",\n standalone: true,\n host: { \"[attr.foldpopovertrigger]\": \"haspopup()\" },\n})\nexport class FoldPopoverTriggerDirective {\n /** The trigger's host element. */\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n /**\n * `aria-haspopup` value. @default \"dialog\" (use \"menu\" for a dropdown). Bare\n * `foldPopoverTrigger` (no value) keeps the default.\n */\n readonly haspopup = input<FoldTriggerHaspopup, string>(\"dialog\", {\n alias: \"foldPopoverTrigger\",\n transform: (value) =>\n value === \"menu\" || value === \"listbox\" || value === \"true\"\n ? value\n : \"dialog\",\n });\n}\n\ntype FoldTriggerHaspopup = \"menu\" | \"dialog\" | \"listbox\" | \"true\";\n","import {\n afterRenderEffect,\n InjectionToken,\n isDevMode,\n type Signal,\n} from \"@angular/core\";\n\n/**\n * The contract a `fold-option` needs from whatever owns it — the single-select\n * `fold-listbox` or the multi-select `fold-multiselect`. Injected through a token\n * (not the concrete class) so an option stays decoupled from either component and\n * there is no circular import. Generic over the option value type `T`; the token\n * itself is erased to `unknown` (the option↔owner value link is a runtime\n * contract — content projection can't carry `T` statically).\n */\nexport interface FoldListboxOwner<T> {\n /** Is this option's value currently selected? (equality vs. membership.) */\n isSelected(value: T): boolean;\n /** The keyboard-active option's id — the listbox's `aria-activedescendant`. */\n readonly activeId: Signal<string | null>;\n}\n\nexport const FOLD_LISTBOX_OWNER = new InjectionToken<FoldListboxOwner<unknown>>(\n \"FOLD_LISTBOX_OWNER\",\n);\n\n/**\n * Dev-only guard: warn (once per value) when a control holds a value with no\n * matching `<fold-option>` — a silent \"shows the placeholder\" bug otherwise, and\n * the runtime safety net for the value/option type link projection can't check at\n * compile time. Runs in an `afterRenderEffect` so option `value`s are set before\n * they're read (an eager `effect` would hit `NG0950` reading a required input too\n * early). Call from a component constructor (an injection context).\n *\n * `selected` yields the currently-held values (single-select passes `[]` or a\n * one-element array; multi-select its array), and `eq` is the owner's\n * `compareWith`, so object values match by identity, not reference.\n */\nexport function warnOnOrphanValue<T>(\n selected: () => readonly T[],\n options: () => readonly { value(): T }[],\n eq: (a: T, b: T) => boolean,\n tag: string,\n): void {\n if (!isDevMode()) {\n return;\n }\n const warned = new Set<T>();\n afterRenderEffect(() => {\n const opts = options();\n if (opts.length === 0) {\n return; // options may still be projecting — nothing to check against yet\n }\n for (const v of selected()) {\n if (!warned.has(v) && !opts.some((o) => eq(o.value(), v))) {\n warned.add(v);\n console.warn(\n `[${tag}] value ${String(v)} has no matching <fold-option>.`,\n );\n }\n }\n });\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n} from \"@angular/core\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FOLD_LISTBOX_OWNER } from \"./listbox-owner\";\n\n/**\n * `<fold-option>` — a single choice inside a {@link FoldListboxComponent}. Project\n * as many as you need; the label is whatever you put inside (plain text, or richer\n * content — an icon, a description). It reads the parent for its own `is-selected`\n * / `is-active` state (computed, so nothing is pushed in during change detection —\n * which would read this required `value` before it is set), and exposes a stable\n * id the listbox points `aria-activedescendant` at.\n *\n * ```html\n * <fold-listbox [(value)]=\"currency\">\n * <fold-option value=\"EUR\">Euro</fold-option>\n * <fold-option value=\"USD\" [disabled]=\"!usdAllowed\">US Dollar</fold-option>\n * </fold-listbox>\n * ```\n *\n * @selector `fold-option`\n */\n@Component({\n selector: \"fold-option\",\n standalone: true,\n template: \"<ng-content />\",\n styleUrl: \"./option.component.scss\",\n host: {\n role: \"option\",\n \"[id]\": \"id\",\n \"[attr.aria-selected]\": \"selected()\",\n \"[attr.aria-disabled]\": \"disabled() || null\",\n \"[class.is-active]\": \"active()\",\n \"[class.is-selected]\": \"selected()\",\n \"[class.is-disabled]\": \"disabled()\",\n },\n})\nexport class FoldOptionComponent<T> {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly owner = inject(FOLD_LISTBOX_OWNER);\n\n /** The value written back to the listbox when this option is chosen. */\n readonly value = input.required<T>();\n /** Disabled options are skipped by keyboard nav and can't be selected. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Stable, SSR-safe id — the listbox points `aria-activedescendant` at it. */\n readonly id = inject(FoldIdService).next(\"fold-option\");\n\n /** Derived from the parent — evaluated lazily during this option's own render,\n * so the required `value` is always set by the time it's read. */\n readonly selected = computed(() => this.owner.isSelected(this.value()));\n readonly active = computed(() => this.owner.activeId() === this.id);\n\n /** The option's visible text — used for the trigger label and type-ahead. */\n get label(): string {\n return this.host.nativeElement.textContent?.trim() ?? \"\";\n }\n\n /** Bring the option into view when it becomes keyboard-active. Optional-chained\n * so it's a no-op where `scrollIntoView` is absent (jsdom, non-DOM SSR). */\n scrollIntoView(): void {\n this.host.nativeElement.scrollIntoView?.({ block: \"nearest\" });\n }\n}\n","import { computed, signal, type Signal } from \"@angular/core\";\n\n/** The slice of a `fold-option` the keyboard core needs. The value is unused by\n * the core (it navigates by id/label/disabled), so it stays erased. */\nexport interface FoldNavOption {\n value(): unknown;\n disabled(): boolean;\n readonly label: string;\n readonly id: string;\n scrollIntoView(): void;\n}\n\n/** What the owning listbox does when the core resolves an intent. */\nexport interface FoldNavHandlers {\n /** Activate the option at `index` (single-select commits + closes; multi\n * toggles + stays open). */\n select(index: number): void;\n /** Close the popup (Tab). */\n close(): void;\n}\n\n/**\n * The shared roving/keyboard core for `fold-listbox` and `fold-multiselect`. It\n * owns the keyboard-active row (↑/↓ wrapping + disabled-skip, `Home`/`End`,\n * multi-letter type-ahead) and reports it as `activeId` for\n * `aria-activedescendant`; the owner decides what *selecting* means. Plain class,\n * no Angular decorators — instantiated in a component field.\n */\nexport class FoldListboxNav {\n private readonly active = signal(-1);\n /** The active option's id, or none — the listbox's `aria-activedescendant`. */\n readonly activeId: Signal<string | null> = computed(\n () => this.opts()[this.active()]?.id ?? null,\n );\n\n private typeBuffer = \"\";\n private typeAt = 0;\n\n constructor(\n private readonly opts: () => readonly FoldNavOption[],\n private readonly handlers: FoldNavHandlers,\n ) {}\n\n /** Index of the active row (or -1). */\n activeIndex(): number {\n return this.active();\n }\n\n /** Reset when the popup closes. */\n reset(): void {\n this.active.set(-1);\n }\n\n /** On open, arm `preferred` if it's a real row, else the first enabled one. */\n arm(preferred: number): void {\n this.setActive(preferred >= 0 ? preferred : this.edge(1));\n }\n\n /** Point at a row from a hover — no scroll, so the pointer doesn't jog the list. */\n point(index: number): void {\n if (index >= 0) {\n this.active.set(index);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n this.move(1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n this.move(-1);\n break;\n case \"Home\":\n event.preventDefault();\n this.setActive(this.edge(1));\n break;\n case \"End\":\n event.preventDefault();\n this.setActive(this.edge(-1));\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n this.handlers.select(this.active());\n break;\n case \"Tab\":\n this.handlers.close();\n break;\n default:\n this.typeahead(event, (index) => this.setActive(index));\n }\n }\n\n /** First (`dir` = 1) or last (`dir` = -1) enabled option index, or -1. */\n private edge(dir: 1 | -1): number {\n const opts = this.opts();\n const order = [...opts.keys()];\n for (const idx of dir === 1 ? order : order.reverse()) {\n if (!opts[idx]?.disabled()) {\n return idx;\n }\n }\n return -1;\n }\n\n private move(delta: number): void {\n const opts = this.opts();\n let i = this.active();\n let remaining = opts.length;\n while (remaining > 0) {\n i = (i + delta + opts.length) % opts.length;\n if (!opts[i]?.disabled()) {\n this.setActive(i);\n return;\n }\n remaining -= 1;\n }\n }\n\n private setActive(index: number): void {\n if (index < 0) {\n return;\n }\n this.active.set(index);\n this.opts()[index]?.scrollIntoView();\n }\n\n /** Multi-letter type-ahead: keystrokes within 500 ms accumulate, so \"de\" jumps\n * to \"Delete\", not just the next \"d\". `onMatch` gets the matched index — the\n * open list arms it (`setActive`); a closed trigger commits it directly.\n * Returns true if the key was a type-ahead character (so a caller can stop). */\n typeahead(event: KeyboardEvent, onMatch: (index: number) => void): boolean {\n if (\n event.key.length !== 1 ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n ) {\n return false;\n }\n const now = Date.now();\n this.typeBuffer =\n now - this.typeAt > 500 ? event.key : this.typeBuffer + event.key;\n this.typeAt = now;\n const query = this.typeBuffer.toLowerCase();\n const opts = this.opts();\n const from = query.length === 1 ? 1 : 0;\n const current = Math.max(this.active(), 0);\n for (let i = 0; i < opts.length; i += 1) {\n const idx = (current + from + i) % opts.length;\n const o = opts[idx];\n if (o && !o.disabled() && o.label.toLowerCase().startsWith(query)) {\n onMatch(idx);\n return true;\n }\n }\n return true;\n }\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n Component,\n computed,\n contentChild,\n contentChildren,\n ElementRef,\n inject,\n input,\n isDevMode,\n model,\n output,\n type TemplateRef,\n viewChild,\n viewChildren,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldPopoverComponent } from \"../../overlays/popover/popover.component\";\nimport { FoldPopoverTriggerDirective } from \"../../overlays/popover/popover-trigger.directive\";\nimport type { FoldPopoverPlacement } from \"../../overlays/popover/placement\";\nimport { FoldInputBaseComponent } from \"../input/input-base.component\";\nimport { FoldOptionComponent } from \"./option.component\";\nimport type { FoldSelectOption } from \"./select-option\";\nimport { FoldListboxNav } from \"./listbox-nav\";\nimport {\n FOLD_LISTBOX_OWNER,\n warnOnOrphanValue,\n type FoldListboxOwner,\n} from \"./listbox-owner\";\n\n/**\n * `<fold-listbox>` — a **styleable** single-select, the richer sibling of the\n * native-`<select>`-wrapping {@link FoldSelectComponent}. Reach for it when the\n * options need custom rendering the native popup can't give (an icon, a second\n * line, a status) — otherwise `fold-select` stays the lighter, mobile-native\n * default. For picking several values, use `fold-multiselect`.\n *\n * Built on {@link FoldPopoverComponent}: the popover owns positioning, the native\n * top layer, outside-click / `Escape` dismissal and focus return. On top of that\n * this adds the ARIA select pattern — a `role=\"listbox\"` that holds focus and\n * drives `aria-activedescendant`, full keyboard (↑/↓, `Home`/`End`, type-ahead,\n * `Enter`) — and Signal-Forms wiring (`FormValueControl<string>`), so `[formField]`\n * and `[(value)]` both work, exactly like `fold-input` / `fold-select`.\n *\n * ```html\n * <fold-listbox label=\"Devise\" [(value)]=\"currency\" placeholder=\"Choisir…\">\n * <fold-option value=\"EUR\">Euro</fold-option>\n * <fold-option value=\"USD\">US Dollar</fold-option>\n * </fold-listbox>\n * ```\n *\n * @selector `fold-listbox`\n */\n@Component({\n selector: \"fold-listbox\",\n standalone: true,\n imports: [\n FoldInputBaseComponent,\n FoldIconComponent,\n FoldOptionComponent,\n FoldPopoverComponent,\n FoldPopoverTriggerDirective,\n NgTemplateOutlet,\n ],\n templateUrl: \"./listbox.component.html\",\n styleUrl: \"./listbox.component.scss\",\n host: { \"[class]\": 'size() + \" \" + variant()' },\n providers: [\n { provide: FOLD_LISTBOX_OWNER, useExisting: FoldListboxComponent },\n ],\n})\nexport class FoldListboxComponent<T>\n implements FormValueControl<T | null>, FoldListboxOwner<T>\n{\n /** Selected value (the chosen option's `value`), or `null` when nothing is\n * picked. A `model()` so `FormField` and `[(value)]` stay in sync. Generic\n * over the option value — `string` by inference, but `number`, an `enum` or\n * an object all work (objects need {@link compareWith}). */\n readonly value = model<T | null>(null);\n /** How two values are compared for selection — supply it for **object** values\n * (reference equality won't match); primitives (string/number/enum) don't need\n * it. @default `Object.is` */\n readonly compareWith = input<(a: T, b: T) => boolean>();\n /** Data-driven options — the alternative to projecting `<fold-option>`. When\n * set, the value type is linked to the options at compile time (no projection\n * seam). For rich rows, project `<ng-template #option let-o>`. */\n readonly options = input<readonly FoldSelectOption<T>[]>();\n /** Disabled state — bound automatically by `FormField`. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on selection / 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 /** Two-way open state of the popup. */\n readonly open = model(false);\n /** Fires when the **user picks an option** — carries the chosen value, never\n * `null`. Use it for the common \"do X on selection\" case to skip the\n * `T | null` narrowing that `[(value)]` / `valueChange` require. Clearing the\n * value (the × button) does **not** fire this; observe `value`/`valueChange`\n * for that. */\n readonly selectionChange = output<T>();\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 /** Optional label displayed above the control. */\n readonly label = input<string>();\n /** Show a 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 /** Optional helper text shown under the control. */\n readonly hint = input<string>();\n /** Text shown on the trigger while nothing is selected. */\n readonly placeholder = input<string>();\n /** Preferred popup placement. @default 'bottom-start' */\n readonly placement = input<FoldPopoverPlacement>(\"bottom-start\");\n /** Show a clear (×) affordance on the trigger once a value is picked. */\n readonly allowClear = input(false, { transform: booleanAttribute });\n /** Accessible name of the clear button. @default 'Clear' */\n readonly clearLabel = input(\"Clear\");\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-listbox\");\n /** Id of the `role=\"listbox\"` element (own, distinct from the popover panel). */\n protected readonly listId = `${this.inputId}-list`;\n\n /** Rich per-row template for the `[options]` array API (`<ng-template #option>`). */\n protected readonly optionTemplate =\n contentChild<TemplateRef<{ $implicit: FoldSelectOption<T> }>>(\"option\");\n private readonly projectedOptions =\n contentChildren<FoldOptionComponent<T>>(FoldOptionComponent);\n private readonly renderedOptions =\n viewChildren<FoldOptionComponent<T>>(FoldOptionComponent);\n /** The live option instances, from whichever API is in use — the `[options]`\n * array (rendered in the view) when set, else the projected `<fold-option>`s. */\n private readonly allOptions = computed(() =>\n this.options() ? this.renderedOptions() : this.projectedOptions(),\n );\n private readonly list = viewChild<ElementRef<HTMLElement>>(\"list\");\n\n /** Compare two values — the injected `compareWith`, else `Object.is`. Called\n * only where both operands are `T`, so no erasure leaks in. */\n private eq(a: T, b: T): boolean {\n const cmp = this.compareWith();\n return cmp ? cmp(a, b) : Object.is(a, b);\n }\n\n /** Shared roving/keyboard core; single-select commits + closes on activation. */\n private readonly nav = new FoldListboxNav(() => this.allOptions(), {\n select: (index) => this.selectAt(index),\n close: () => this.open.set(false),\n });\n /** `aria-activedescendant`, read by each `fold-option` for its `is-active`. */\n readonly activeId = this.nav.activeId;\n\n /** The selected option's label, for the trigger. */\n protected readonly selectedLabel = computed<string | undefined>(() => {\n const v = this.value();\n return v === null\n ? undefined\n : this.allOptions().find((o) => this.eq(o.value(), v))?.label;\n });\n /** Whether the clear affordance is currently offered. */\n protected readonly showClear = computed(\n () => this.allowClear() && this.value() !== null && !this.disabled(),\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 /** `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 /** Has the popup been opened at least once this lifetime — so closing it (by\n * Escape, outside-click, Tab or a pick) can mark the field touched, exactly as\n * a native `<select>` does on blur. Without this a `required` select that the\n * user opens and dismisses would never surface its error. */\n private hasOpened = false;\n\n constructor() {\n // On open, move focus into the list and arm the active row on the selection\n // (or the first enabled option). Deferred to a microtask so it runs AFTER the\n // popover's render effect has shown the panel in the same flush. On close,\n // mark touched (blur parity).\n afterRenderEffect(() => {\n if (this.open()) {\n this.hasOpened = true;\n queueMicrotask(() => {\n if (this.open()) {\n this.list()?.nativeElement.focus();\n this.nav.arm(this.selectedIndex());\n }\n });\n } else {\n this.nav.reset();\n if (this.hasOpened) {\n this.touched.set(true);\n }\n }\n });\n warnOnOrphanValue(\n () => {\n const v = this.value();\n return v === null ? [] : [v];\n },\n () => this.allOptions(),\n (a, b) => this.eq(a, b),\n \"fold-listbox\",\n );\n if (isDevMode()) {\n afterRenderEffect(() => {\n if (this.options() && this.projectedOptions().length > 0) {\n console.warn(\n \"[fold-listbox] both `[options]` and projected <fold-option> given — the array wins, the projected ones are ignored.\",\n );\n }\n });\n }\n }\n\n /** A value is selected when it equals the current one (via `compareWith`). */\n isSelected(value: T): boolean {\n const v = this.value();\n return v !== null && this.eq(v, value);\n }\n\n /** Clear the selection (the `allowClear` ×). */\n protected clear(event: Event): void {\n event.stopPropagation(); // don't let the trigger open\n this.value.set(null);\n this.touched.set(true);\n }\n\n /** Open with the keys a native select opens on; otherwise type-ahead picks\n * directly without opening — native-`<select>` parity. */\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.open()) {\n return;\n }\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(event.key)) {\n event.preventDefault();\n this.open.set(true);\n return;\n }\n this.nav.typeahead(event, (index) => this.selectAt(index));\n }\n\n /** Keyboard while the list is open and focused — delegated to the core. */\n protected onListKeydown(event: KeyboardEvent): void {\n this.nav.onKeydown(event);\n }\n\n /** Click on a row selects it (delegated, so projected rows need no wiring). */\n protected onListClick(event: MouseEvent): void {\n const o = this.enabledOptionFrom(event.target);\n if (o) {\n this.commit(o);\n }\n }\n\n /** Hover arms the row, so pointer and keyboard share one active row. */\n protected onListPointermove(event: PointerEvent): void {\n const o = this.enabledOptionFrom(event.target);\n if (o) {\n this.nav.point(this.allOptions().indexOf(o));\n }\n }\n\n /** Index of the selected option (or -1) — where the keyboard arms on open. */\n private selectedIndex(): number {\n const v = this.value();\n if (v === null) {\n return -1;\n }\n return this.allOptions().findIndex(\n (o) => this.eq(o.value(), v) && !o.disabled(),\n );\n }\n\n /** The enabled option under an event target, or null. */\n private enabledOptionFrom(\n target: EventTarget | null,\n ): FoldOptionComponent<T> | null {\n if (!(target instanceof Element)) {\n return null;\n }\n const el = target.closest(\"[role='option']\");\n const o = this.allOptions().find((opt) => opt.id === el?.id);\n return o && !o.disabled() ? o : null;\n }\n\n private selectAt(index: number): void {\n const o = this.allOptions()[index];\n if (o && !o.disabled()) {\n this.commit(o);\n }\n }\n\n private commit(option: FoldOptionComponent<T>): void {\n const picked = option.value();\n this.value.set(picked);\n this.selectionChange.emit(picked);\n this.touched.set(true);\n this.open.set(false);\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 <fold-popover\n [(open)]=\"open\"\n [autoFocus]=\"false\"\n [ariaControls]=\"listId\"\n [placement]=\"placement()\"\n [fallbackPlacements]=\"['top-start', 'bottom-end', 'top-end']\"\n >\n <div class=\"lb-field\">\n <button\n type=\"button\"\n class=\"lb-trigger\"\n [class.has-clear]=\"showClear()\"\n [id]=\"inputId\"\n foldPopoverTrigger=\"listbox\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (selectedLabel(); as lbl) {\n <span class=\"lb-value\">{{ lbl }}</span>\n } @else {\n <span class=\"lb-placeholder\">{{ placeholder() }}</span>\n }\n <fold-icon\n name=\"chevron-down\"\n size=\"sm\"\n class=\"lb-caret\"\n aria-hidden=\"true\"\n />\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"lb-clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear($event)\"\n >\n <fold-icon name=\"close\" size=\"sm\" aria-hidden=\"true\" />\n </button>\n }\n </div>\n\n <div\n #list\n foldPopoverPanel\n class=\"lb-list\"\n role=\"listbox\"\n tabindex=\"-1\"\n [id]=\"listId\"\n [attr.aria-label]=\"label()\"\n [attr.aria-activedescendant]=\"activeId()\"\n (keydown)=\"onListKeydown($event)\"\n (click)=\"onListClick($event)\"\n (pointermove)=\"onListPointermove($event)\"\n >\n @if (options(); as opts) {\n @for (o of opts; track o.value) {\n <fold-option [value]=\"o.value\" [disabled]=\"o.disabled ?? false\">\n @if (optionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: o }\"\n />\n } @else {\n {{ o.label }}\n }\n </fold-option>\n }\n } @else {\n <ng-content />\n }\n </div>\n </fold-popover>\n</fold-input-base>\n","import {\n afterRenderEffect,\n booleanAttribute,\n Component,\n computed,\n contentChild,\n contentChildren,\n ElementRef,\n inject,\n input,\n isDevMode,\n model,\n type TemplateRef,\n viewChild,\n viewChildren,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldPopoverComponent } from \"../../overlays/popover/popover.component\";\nimport { FoldPopoverTriggerDirective } from \"../../overlays/popover/popover-trigger.directive\";\nimport type { FoldPopoverPlacement } from \"../../overlays/popover/placement\";\nimport { FoldInputBaseComponent } from \"../input/input-base.component\";\nimport { FoldOptionComponent } from \"./option.component\";\nimport type { FoldSelectOption } from \"./select-option\";\nimport { FoldListboxNav } from \"./listbox-nav\";\nimport {\n FOLD_LISTBOX_OWNER,\n warnOnOrphanValue,\n type FoldListboxOwner,\n} from \"./listbox-owner\";\n\n/** Labels beyond this count collapse to a \"+N\" tail on the trigger summary. */\nconst SUMMARY_MAX = 3;\n\n/**\n * `<fold-multiselect>` — the multi-select sibling of {@link FoldListboxComponent}.\n * Same styleable popover + `fold-option` rows, but the value is a set: activating\n * a row **toggles** its membership and the panel **stays open**, so several picks\n * are one interaction. It's a separate component (not a `multiple` flag) because\n * the Signal-Forms value type is genuinely different — `readonly string[]`, not\n * `string` — so `[formField]` and `[(value)]` stay honestly typed.\n *\n * `role=\"listbox\"` + `aria-multiselectable`, full keyboard (↑/↓, `Home`/`End`,\n * type-ahead; `Enter`/`Space` toggle), and each selected row keeps its check. The\n * trigger summarises the selection (the chosen labels, joined).\n *\n * ```html\n * <fold-multiselect label=\"Genres\" [(value)]=\"genres\" placeholder=\"Pick a few…\">\n * <fold-option value=\"rock\">Rock</fold-option>\n * <fold-option value=\"jazz\">Jazz</fold-option>\n * </fold-multiselect>\n * ```\n *\n * @selector `fold-multiselect`\n */\n@Component({\n selector: \"fold-multiselect\",\n standalone: true,\n imports: [\n FoldInputBaseComponent,\n FoldIconComponent,\n FoldOptionComponent,\n FoldPopoverComponent,\n FoldPopoverTriggerDirective,\n NgTemplateOutlet,\n ],\n templateUrl: \"./multiselect.component.html\",\n styleUrl: \"./multiselect.component.scss\",\n host: { \"[class]\": 'size() + \" \" + variant()' },\n providers: [\n { provide: FOLD_LISTBOX_OWNER, useExisting: FoldMultiselectComponent },\n ],\n})\nexport class FoldMultiselectComponent<T>\n implements FormValueControl<readonly T[]>, FoldListboxOwner<T>\n{\n /** Selected values. A `model()` so `FormField` and `[(value)]` stay in sync.\n * Generic over the option value (string by inference; number/enum/object all\n * work — objects need {@link compareWith}). */\n readonly value = model<readonly T[]>([]);\n /** How two values are compared for membership — supply it for **object**\n * values; primitives don't need it. @default `Object.is` */\n readonly compareWith = input<(a: T, b: T) => boolean>();\n /** Data-driven options — the alternative to projecting `<fold-option>`. When\n * set, the value type is linked to the options at compile time. For rich rows,\n * project `<ng-template #option let-o>`. */\n readonly options = input<readonly FoldSelectOption<T>[]>();\n /** Disabled state — bound automatically by `FormField`. */\n readonly disabled = input<boolean>(false);\n /** Two-way touched state — set on the first toggle, 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 /** Two-way open state of the popup. */\n readonly open = model(false);\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 /** Optional label displayed above the control. */\n readonly label = input<string>();\n /** Show a 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 /** Optional helper text shown under the control. */\n readonly hint = input<string>();\n /** Text shown on the trigger while nothing is selected. */\n readonly placeholder = input<string>();\n /** Preferred popup placement. @default 'bottom-start' */\n readonly placement = input<FoldPopoverPlacement>(\"bottom-start\");\n\n /** Unique, SSR-safe id for label association (see {@link FoldIdService}). */\n readonly inputId = inject(FoldIdService).next(\"fold-multiselect\");\n /** Id of the `role=\"listbox\"` element (own, distinct from the popover panel). */\n protected readonly listId = `${this.inputId}-list`;\n\n /** Rich per-row template for the `[options]` array API (`<ng-template #option>`). */\n protected readonly optionTemplate =\n contentChild<TemplateRef<{ $implicit: FoldSelectOption<T> }>>(\"option\");\n private readonly projectedOptions =\n contentChildren<FoldOptionComponent<T>>(FoldOptionComponent);\n private readonly renderedOptions =\n viewChildren<FoldOptionComponent<T>>(FoldOptionComponent);\n /** The live option instances, from whichever API is in use. */\n private readonly allOptions = computed(() =>\n this.options() ? this.renderedOptions() : this.projectedOptions(),\n );\n private readonly list = viewChild<ElementRef<HTMLElement>>(\"list\");\n\n /** Compare two values — the injected `compareWith`, else `Object.is`. */\n private eq(a: T, b: T): boolean {\n const cmp = this.compareWith();\n return cmp ? cmp(a, b) : Object.is(a, b);\n }\n\n /** Shared roving/keyboard core; multi-select toggles + stays open on activation. */\n private readonly nav = new FoldListboxNav(() => this.allOptions(), {\n select: (index) => this.toggle(index),\n close: () => this.open.set(false),\n });\n /** `aria-activedescendant`, read by each `fold-option` for its `is-active`. */\n readonly activeId = this.nav.activeId;\n\n /** Fast-path membership: a `Set` when values compare by identity (the default,\n * O(1) per option), or `null` when a `compareWith` is supplied — then\n * membership falls back to a linear `eq` scan (correct for object values). */\n private readonly selectedSet = computed(() =>\n this.compareWith() ? null : new Set(this.value()),\n );\n\n /** The chosen labels (in option order) — joined, collapsing to \"…, +N\" past\n * {@link SUMMARY_MAX} so the trigger can't grow unbounded. */\n protected readonly summaryLabel = computed<string | undefined>(() => {\n if (this.value().length === 0) {\n return undefined;\n }\n const labels = this.allOptions()\n .filter((o) => this.isSelected(o.value()))\n .map((o) => o.label);\n if (labels.length === 0) {\n return undefined;\n }\n if (labels.length <= SUMMARY_MAX) {\n return labels.join(\", \");\n }\n return `${labels.slice(0, SUMMARY_MAX).join(\", \")} +${labels.length - SUMMARY_MAX}`;\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 /** `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 /** Has the popup been opened this lifetime — so any close marks touched (blur\n * parity), even one that picked nothing. */\n private hasOpened = false;\n\n constructor() {\n // On open, move focus into the list and arm on the first selected row (or the\n // first enabled one). Deferred to a microtask so it runs AFTER the popover's\n // render effect has shown the panel in the same flush. On close, mark touched.\n afterRenderEffect(() => {\n if (this.open()) {\n this.hasOpened = true;\n queueMicrotask(() => {\n if (this.open()) {\n this.list()?.nativeElement.focus();\n this.nav.arm(this.firstSelectedIndex());\n }\n });\n } else {\n this.nav.reset();\n if (this.hasOpened) {\n this.touched.set(true);\n }\n }\n });\n warnOnOrphanValue(\n () => this.value(),\n () => this.allOptions(),\n (a, b) => this.eq(a, b),\n \"fold-multiselect\",\n );\n if (isDevMode()) {\n afterRenderEffect(() => {\n if (this.options() && this.projectedOptions().length > 0) {\n console.warn(\n \"[fold-multiselect] both `[options]` and projected <fold-option> given — the array wins, the projected ones are ignored.\",\n );\n }\n });\n }\n }\n\n /** A value is selected when it's in the current set (via `compareWith`). */\n isSelected(value: T): boolean {\n const set = this.selectedSet();\n return set ? set.has(value) : this.value().some((v) => this.eq(v, value));\n }\n\n /** Open with the keys a native select opens on. */\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.open()) {\n return;\n }\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(event.key)) {\n event.preventDefault();\n this.open.set(true);\n }\n }\n\n /** Keyboard while the list is open and focused — delegated to the core. */\n protected onListKeydown(event: KeyboardEvent): void {\n this.nav.onKeydown(event);\n }\n\n /** Click on a row toggles it (delegated, so projected rows need no wiring). */\n protected onListClick(event: MouseEvent): void {\n const index = this.enabledIndexFrom(event.target);\n if (index >= 0) {\n this.toggle(index);\n }\n }\n\n /** Hover arms the row, so pointer and keyboard share one active row. */\n protected onListPointermove(event: PointerEvent): void {\n const index = this.enabledIndexFrom(event.target);\n if (index >= 0) {\n this.nav.point(index);\n }\n }\n\n /** Index of the first selected option (or -1) — where the keyboard arms on open. */\n private firstSelectedIndex(): number {\n return this.allOptions().findIndex(\n (o) => this.isSelected(o.value()) && !o.disabled(),\n );\n }\n\n /** Index of the enabled option under an event target, or -1. */\n private enabledIndexFrom(target: EventTarget | null): number {\n if (!(target instanceof Element)) {\n return -1;\n }\n const el = target.closest(\"[role='option']\");\n const opts = this.allOptions();\n const index = opts.findIndex((o) => o.id === el?.id);\n return index >= 0 && !opts[index]?.disabled() ? index : -1;\n }\n\n /** Add or remove the option's value from the set; the panel stays open. */\n private toggle(index: number): void {\n const o = this.allOptions()[index];\n if (!o || o.disabled()) {\n return;\n }\n const v = o.value();\n const current = this.value();\n this.value.set(\n this.isSelected(v)\n ? current.filter((x) => !this.eq(x, v))\n : [...current, v],\n );\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 <fold-popover\n [(open)]=\"open\"\n [autoFocus]=\"false\"\n [ariaControls]=\"listId\"\n [placement]=\"placement()\"\n [fallbackPlacements]=\"['top-start', 'bottom-end', 'top-end']\"\n >\n <button\n type=\"button\"\n class=\"lb-trigger\"\n [id]=\"inputId\"\n foldPopoverTrigger=\"listbox\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (summaryLabel(); as lbl) {\n <span class=\"lb-value\">{{ lbl }}</span>\n } @else {\n <span class=\"lb-placeholder\">{{ placeholder() }}</span>\n }\n <fold-icon\n name=\"chevron-down\"\n size=\"sm\"\n class=\"lb-caret\"\n aria-hidden=\"true\"\n />\n </button>\n\n <div\n #list\n foldPopoverPanel\n class=\"lb-list\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n tabindex=\"-1\"\n [id]=\"listId\"\n [attr.aria-label]=\"label()\"\n [attr.aria-activedescendant]=\"activeId()\"\n (keydown)=\"onListKeydown($event)\"\n (click)=\"onListClick($event)\"\n (pointermove)=\"onListPointermove($event)\"\n >\n @if (options(); as opts) {\n @for (o of opts; track o.value) {\n <fold-option [value]=\"o.value\" [disabled]=\"o.disabled ?? false\">\n @if (optionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: o }\"\n />\n } @else {\n {{ o.label }}\n }\n </fold-option>\n }\n } @else {\n <ng-content />\n }\n </div>\n </fold-popover>\n</fold-input-base>\n","/**\n * One password requirement shown as a live-validating dot in\n * {@link FoldPasswordFieldComponent}. The predicate is deliberately just a\n * function, so any validation style drops in:\n *\n * - **regex** — `foldRegexRule('An uppercase letter', /[A-Z]/)`, or inline\n * `{ label, test: (v) => /\\d/.test(v) }`.\n * - **zod** (no dependency added here) —\n * `{ label: 'Valid', test: (v) => schema.safeParse(v).success }`.\n * - **anything** — length, an entropy score, a server-known blocklist, …\n */\nexport interface FoldPasswordRule {\n /** Human-readable requirement, e.g. \"At least 8 characters\". */\n readonly label: string;\n /** Passes when the value satisfies the rule. */\n readonly test: (value: string) => boolean;\n}\n\n/** Build a rule from a `RegExp` — the common case. */\nexport function foldRegexRule(\n label: string,\n pattern: RegExp,\n): FoldPasswordRule {\n return { label, test: (value) => pattern.test(value) };\n}\n\n/**\n * A sensible default policy (English labels): 8+ characters, an uppercase and a\n * lowercase letter, and a digit. Override via the `rules` input for a different\n * policy or localised labels.\n */\nexport function foldDefaultPasswordRules(): readonly FoldPasswordRule[] {\n return [\n { label: \"At least 8 characters\", test: (v) => v.length >= 8 },\n foldRegexRule(\"An uppercase letter\", /[A-Z]/),\n foldRegexRule(\"A lowercase letter\", /[a-z]/),\n foldRegexRule(\"A number\", /\\d/),\n ];\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n} from \"@angular/core\";\nimport type { FormValueControl, ValidationError } from \"@angular/forms/signals\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport { FoldInputComponent } from \"../input/input.component\";\nimport {\n foldDefaultPasswordRules,\n type FoldPasswordRule,\n} from \"./password-rules\";\n\n/**\n * `<fold-password-field>` — a password input with a **live requirements\n * checklist**. Composes `fold-input[type=password][revealable]` (so it inherits\n * the tokened box, the label/hint/error chrome and the show/hide eye) and renders\n * a dot per {@link FoldPasswordRule} that turns on as the value satisfies it.\n *\n * The rules are **injected**, not hard-coded — a `RegExp` (via `foldRegexRule`),\n * a `zod` `safeParse`, a length check, anything (see {@link FoldPasswordRule}).\n * `rules` defaults to {@link foldDefaultPasswordRules}. `validChange` emits\n * whether every rule passes; Signal-Forms-native (`FormValueControl<string>`).\n *\n * ```html\n * <fold-password-field\n * label=\"New password\"\n * [(value)]=\"password\"\n * (validChange)=\"ok.set($event)\"\n * />\n * ```\n *\n * @selector `fold-password-field`\n */\n@Component({\n selector: \"fold-password-field\",\n standalone: true,\n imports: [FoldInputComponent, FoldIconComponent],\n templateUrl: \"./password-field.component.html\",\n styleUrl: \"./password-field.component.scss\",\n exportAs: \"foldPasswordField\",\n})\nexport class FoldPasswordFieldComponent implements FormValueControl<string> {\n /** The password value. A `model()` so `FormField` and `[(value)]` 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 — forwarded to the inner input (set on blur). */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField`, shown under the input. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n\n /** Label above the field. @default 'Password' */\n readonly label = input(\"Password\");\n /** Placeholder text. */\n readonly placeholder = input(\"\");\n /** Helper text under the input (above the rules). */\n readonly hint = input<string>();\n /** Show a required marker on the label. */\n readonly required = input(false, { transform: booleanAttribute });\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 /** Native `autocomplete`. @default 'new-password' */\n readonly autocomplete = input<string | null>(\"new-password\");\n /** Offer the reveal (eye) toggle. @default true */\n readonly revealable = input(true, { transform: booleanAttribute });\n /** `aria-label` of the reveal toggle when hidden — forwarded to the input. */\n readonly revealLabel = input(\"Show password\");\n /** `aria-label` of the reveal toggle when shown — forwarded to the input. */\n readonly hideLabel = input(\"Hide password\");\n\n /** The requirements to display and validate against. @default the built-ins. */\n readonly rules = input<readonly FoldPasswordRule[]>(\n foldDefaultPasswordRules(),\n );\n /** Built-in row marker: a filling `dot`, or a `check` tick on satisfied rows.\n * @default 'dot' */\n readonly marker = input<\"dot\" | \"check\">(\"dot\");\n /** Accessible name of the requirements list. @default 'Password requirements' */\n readonly rulesLabel = input(\"Password requirements\");\n /** Word prefixed to a satisfied rule for screen readers. @default 'met' */\n readonly metLabel = input(\"met\");\n /** Word prefixed to an unmet rule for screen readers. @default 'not met' */\n readonly unmetLabel = input(\"not met\");\n\n /** Emits whether every rule passes, on each change. */\n readonly validChange = output<boolean>();\n\n /** Each rule paired with its live pass/fail state. Public + `exportAs`, so a\n * custom `[rules]` projection can render its own list off the same state:\n * `#pw=\"foldPasswordField\"` then loop `pw.checklist()`. */\n readonly checklist = computed(() =>\n this.rules().map((r) => ({ label: r.label, met: r.test(this.value()) })),\n );\n /** True when every rule passes. */\n protected readonly allValid = computed(() =>\n this.checklist().every((r) => r.met),\n );\n\n constructor() {\n // Surface validity to the parent as it changes (initial state included).\n effect(() => this.validChange.emit(this.allValid()));\n }\n}\n","<fold-input\n type=\"password\"\n [label]=\"label()\"\n [placeholder]=\"placeholder()\"\n [hint]=\"hint()\"\n [required]=\"required()\"\n [size]=\"size()\"\n [variant]=\"variant()\"\n [disabled]=\"disabled()\"\n [revealable]=\"revealable()\"\n [revealLabel]=\"revealLabel()\"\n [hideLabel]=\"hideLabel()\"\n [autocomplete]=\"autocomplete()\"\n [errors]=\"errors()\"\n [(value)]=\"value\"\n [(touched)]=\"touched\"\n/>\n\n<!-- Project into `[rules]` to redesign the checklist off the same state\n (`#pw=\"foldPasswordField\"` → `pw.checklist()`); otherwise the default list\n below is the fallback content. -->\n<ng-content select=\"[rules]\">\n @if (checklist().length) {\n <ul class=\"pw-rules\" [attr.aria-label]=\"rulesLabel()\" aria-live=\"polite\">\n @for (rule of checklist(); track rule.label) {\n <li class=\"pw-rule\" [class.is-met]=\"rule.met\">\n @if (marker() === \"check\") {\n <span class=\"pw-mark\" aria-hidden=\"true\">\n @if (rule.met) {\n <fold-icon name=\"check\" size=\"sm\" />\n }\n </span>\n } @else {\n <span class=\"pw-dot\" aria-hidden=\"true\"></span>\n }\n <span class=\"pw-rule-label\">{{ rule.label }}</span>\n <!-- The met/unmet word is real text (not just an attribute), so the\n aria-live region actually announces a rule flipping. -->\n <span class=\"pw-sr\"\n >— {{ rule.met ? metLabel() : unmetLabel() }}</span\n >\n </li>\n }\n </ul>\n }\n</ng-content>\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n model,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/** One segment of a {@link FoldViewToggleComponent}. */\nexport interface FoldViewToggleOption {\n /** The value emitted when this segment is chosen. */\n readonly value: string;\n /** Optional leading icon. */\n readonly icon?: FoldIconName;\n /** Optional visible label. Omit for an icon-only segment (set `ariaLabel`). */\n readonly label?: string;\n /** Accessible name — required when there is no visible `label`. */\n readonly ariaLabel?: string;\n /** Disable this segment. */\n readonly disabled?: boolean;\n}\n\n/**\n * `<fold-view-toggle>` — a compact **segmented single-select** (Cards / Table, a\n * density switch, a chart mode…). Generic and zero-domain: pass `options` and\n * bind `[(value)]`. It's a proper `role=\"radiogroup\"` of `role=\"radio\"` segments\n * with roving tabindex and arrow-key selection (Home/End too), so it's a real\n * single-choice control, not two independent toggles.\n *\n * ```html\n * <fold-view-toggle\n * ariaLabel=\"View\"\n * [options]=\"[\n * { value: 'cards', icon: 'grid', ariaLabel: 'Cards' },\n * { value: 'table', icon: 'list', ariaLabel: 'Table' },\n * ]\"\n * [(value)]=\"view\"\n * />\n * ```\n *\n * @selector `fold-view-toggle`\n */\n@Component({\n selector: \"fold-view-toggle\",\n standalone: true,\n imports: [FoldIconComponent],\n templateUrl: \"./view-toggle.component.html\",\n styleUrl: \"./view-toggle.component.scss\",\n host: { \"[class]\": \"size() + ' a-' + activeStyle()\" },\n})\nexport class FoldViewToggleComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The segments, in order. */\n readonly options = input.required<readonly FoldViewToggleOption[]>();\n /** The selected value. `[(value)]` / `FormField`-friendly. */\n readonly value = model.required<string>();\n /** Accessible name of the group. */\n readonly ariaLabel = input<string>();\n /** Size preset. @default 'md' */\n readonly size = input<\"sm\" | \"md\">(\"md\");\n /** How the selected segment reads: a neutral `raised` chip, or an `accent`\n * brand tint. @default 'raised' */\n readonly activeStyle = input<\"raised\" | \"accent\">(\"raised\");\n /** Hide visible labels, keeping icons only (labels stay as accessible names). */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n\n constructor() {\n if (isDevMode()) {\n effect(() => {\n if (!this.ariaLabel()) {\n console.warn(\n \"[fold-view-toggle] no `ariaLabel` — a radiogroup needs an accessible name.\",\n );\n }\n });\n }\n }\n\n /** The segment holding the tab stop: the selected one when enabled, else the\n * first enabled — never a disabled (unfocusable) segment, so Tab always\n * reaches the group even if the selected value is disabled. */\n protected readonly rovingValue = computed<string | null>(() => {\n const options = this.options();\n const selected = options.find((o) => o.value === this.value());\n if (selected && !selected.disabled) {\n return selected.value;\n }\n return options.find((o) => !o.disabled)?.value ?? null;\n });\n\n /** Pick a segment (no-op if disabled or already selected). */\n protected select(option: FoldViewToggleOption): void {\n if (!option.disabled) {\n this.value.set(option.value);\n }\n }\n\n /** Arrow keys move the selection between enabled segments (radiogroup pattern). */\n protected onKeydown(event: KeyboardEvent): void {\n const enabled = this.options().filter((o) => !o.disabled);\n if (enabled.length === 0) {\n return;\n }\n const next = this.nextValue(event.key, enabled);\n if (next === null) {\n return;\n }\n event.preventDefault();\n this.value.set(next);\n this.focusValue(next);\n }\n\n /** The value to move to for a nav key, or null if the key isn't one. */\n private nextValue(\n key: string,\n enabled: readonly FoldViewToggleOption[],\n ): string | null {\n const current = Math.max(\n enabled.findIndex((o) => o.value === this.value()),\n 0,\n );\n switch (key) {\n case \"Home\":\n return enabled[0]?.value ?? null;\n case \"End\":\n return enabled[enabled.length - 1]?.value ?? null;\n case \"ArrowRight\":\n case \"ArrowDown\":\n return enabled[(current + 1) % enabled.length]?.value ?? null;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n return (\n enabled[(current - 1 + enabled.length) % enabled.length]?.value ??\n null\n );\n default:\n return null;\n }\n }\n\n private focusValue(value: string): void {\n const index = this.options().findIndex((o) => o.value === value);\n const buttons =\n this.host.nativeElement.querySelectorAll<HTMLButtonElement>(\n \"[role='radio']\",\n );\n buttons.item(index)?.focus();\n }\n}\n","<div\n class=\"vt\"\n role=\"radiogroup\"\n [attr.aria-label]=\"ariaLabel()\"\n (keydown)=\"onKeydown($event)\"\n>\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"vt-btn\"\n [class.is-on]=\"value() === option.value\"\n [class.icon-only]=\"iconOnly() || !option.label\"\n [attr.aria-checked]=\"value() === option.value\"\n [attr.aria-label]=\"option.ariaLabel ?? option.label ?? null\"\n [attr.tabindex]=\"rovingValue() === option.value ? 0 : -1\"\n [disabled]=\"option.disabled || null\"\n [attr.title]=\"iconOnly() ? (option.label ?? option.ariaLabel) : null\"\n (click)=\"select(option)\"\n >\n @if (option.icon) {\n <fold-icon [name]=\"option.icon\" size=\"sm\" aria-hidden=\"true\" />\n }\n @if (option.label && !iconOnly()) {\n <span class=\"vt-label\">{{ option.label }}</span>\n }\n </button>\n }\n</div>\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 { 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\">`, so keyboard, focus and\n * the `slider` role are all native). The fill is a `--sl-pct` custom property, so\n * there is no overlay markup. For a min↔max pair, use {@link FoldRangeSliderComponent}.\n *\n * Integrates with signal forms via `FormValueControl<number>` (bind\n * `[formField]`), or drive it standalone with `[(value)]` / `(valueChange)`. A\n * visible `label` is a real `<label for>`; a `valueText` override is announced\n * to assistive tech through `aria-valuetext` (so a value that _means_ something —\n * `\"off\"`, `\"12:30\"` — reads as that, not the raw number).\n *\n * @selector `fold-slider`\n *\n * @example\n * ```html\n * <fold-slider label=\"Rail width\" [min]=\"48\" [max]=\"120\" [(value)]=\"width\" />\n * <fold-slider label=\"Volume\" [formField]=\"form.volume\" />\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 implements FormValueControl<number> {\n /** The bound value — a `model()`, so `[(value)]` and signal forms both sync. */\n readonly value = model<number>(0);\n /** Minimum value (also the field's min validator via `FormField`). @default 0 */\n readonly min = input<number | undefined>(0);\n /** Maximum value (also the field's max validator via `FormField`). @default 100 */\n readonly max = input<number | undefined>(100);\n /** Increment granularity. @default 1 */\n readonly step = input<number | undefined>(1);\n /** Optional visible label (a real `<label for>`), also the accessible name. */\n readonly label = input<string>();\n /** Accessible name when there is no visible `label`. */\n readonly ariaLabel = input<string>();\n /** Override the displayed + announced value text — e.g. `'off'` for \"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 /** Optional helper text shown under the track. */\n readonly hint = input<string>();\n /** Disable interaction. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Two-way touched state — set on blur so `FormField` can surface errors. */\n readonly touched = model<boolean>(false);\n /** Validation errors — bound by `FormField` from the field. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n\n /** Unique, SSR-safe id for label + message association. */\n readonly inputId = inject(FoldIdService).next(\"fold-slider\");\n\n /** Resolved bounds — the interface types min/max/step as `number | undefined`\n * (a `FormField` may leave a bound unset); fall back to the standalone defaults. */\n protected readonly rMin = computed(() => this.min() ?? 0);\n protected readonly rMax = computed(() => this.max() ?? 100);\n protected readonly rStep = computed(() => this.step() ?? 1);\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.rMax() - this.rMin();\n if (range <= 0) {\n return 0;\n }\n const pct = ((this.value() - this.rMin()) / 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 /** The message under the track: the first error once touched, else the hint. */\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 protected readonly message = computed<string | null>(\n () => this.errorMessage() ?? this.hint() ?? null,\n );\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 protected onInput(event: Event): void {\n this.value.set(Number(readInputValue(event)));\n }\n\n protected onBlur(): void {\n this.touched.set(true);\n }\n}\n","<div class=\"sl\">\n @if (label() || showValue()) {\n <div class=\"sl-head\">\n @if (label(); as text) {\n <label class=\"sl-label\" [for]=\"inputId\">{{ text }}</label>\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]=\"rMin()\"\n [max]=\"rMax()\"\n [step]=\"rStep()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [style.--sl-pct]=\"percent() + '%'\"\n [attr.aria-label]=\"label() ? null : (ariaLabel() ?? null)\"\n [attr.aria-valuetext]=\"valueText() ?? null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n />\n @if (message(); as msg) {\n <span\n class=\"sl-msg\"\n [class.is-error]=\"errorMessage()\"\n [id]=\"errorMessage() ? inputId + '-error' : inputId + '-hint'\"\n >{{ msg }}</span\n >\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n model,\n output,\n} from \"@angular/core\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { readInputValue } from \"../../forms/input/input-value\";\n\n/** A min↔max pair held 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 * Two-way bound via `[(value)]` (a `model()`), or one-way `[value]` +\n * `(valueChange)`. The thumbs never cross (each clamps against the other). The\n * pair is a labelled `role=\"group\"`; each thumb announces its formatted value\n * through `aria-valuetext`, and the thumb names (`minLabel` / `maxLabel`) are\n * inputs so a non-English app can localise them.\n *\n * @selector `fold-range-slider`\n *\n * @example\n * ```html\n * <fold-range-slider label=\"BPM\" [min]=\"60\" [max]=\"220\" [step]=\"5\" [(value)]=\"bpm\" />\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 (names the `role=\"group\"`). */\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 * A `model()`, so `[(value)]` and `(valueChange)` both work. */\n readonly value = model<FoldRangeValue | undefined>(undefined);\n /** Fires when the **user drags a thumb** — carries the resolved `{ min, max }`,\n * never `undefined`. Use it for the common \"filter on change\" case to skip the\n * `FoldRangeValue | undefined` narrowing that `[(value)]` / `valueChange`\n * require. */\n readonly rangeChange = output<FoldRangeValue>();\n /** How the values are formatted for display + `aria-valuetext`. @default 'number' */\n readonly unit = input<\"number\" | \"duration\">(\"number\");\n /** Disable both thumbs. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Accessible name suffix for the lower thumb. @default 'minimum' */\n readonly minLabel = input(\"minimum\");\n /** Accessible name suffix for the upper thumb. @default 'maximum' */\n readonly maxLabel = input(\"maximum\");\n\n /** Id of the visible label, so the group can point at it. */\n readonly labelId = inject(FoldIdService).next(\"fold-range\");\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.commit({\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.commit({\n min: this.currentMin(),\n max: Math.max(val, this.currentMin()),\n });\n }\n\n private commit(next: FoldRangeValue): void {\n this.value.set(next);\n this.rangeChange.emit(next);\n }\n}\n","<div class=\"rs\" role=\"group\" [attr.aria-labelledby]=\"labelId\">\n <span class=\"rs-label\" [id]=\"labelId\">{{ 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 [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + minLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMin())\"\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 [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() + ' ' + maxLabel()\"\n [attr.aria-valuetext]=\"formatValue(currentMax())\"\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 // `[attr.title]: null` strips the native attribute a static `title=\"…\"`\n // leaves behind, so the heading input never doubles as a browser tooltip.\n host: { \"[class.alert]\": \"tone() === 'alert'\", \"[attr.title]\": \"null\" },\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 { InjectionToken, type Signal } from \"@angular/core\";\n\n/**\n * The slice of a {@link FoldNavLayoutComponent} that a projected bar reads to\n * follow the layout — exposed through DI so a `fold-view-nav` / `fold-tabs` with\n * `direction=\"auto\"` orients itself without the consumer wiring `tl.stacked()`.\n */\nexport interface FoldNavLayoutContext {\n /**\n * True when the layout currently stacks the bar **above** the content (a `top`\n * placement, or a `side` rail that has folded) — i.e. the bar should be\n * horizontal. False when it sits as a vertical rail beside the content.\n */\n readonly stacked: Signal<boolean>;\n}\n\n/** DI handle for the nearest {@link FoldNavLayoutComponent}, if any. */\nexport const FOLD_NAV_LAYOUT = new InjectionToken<FoldNavLayoutContext>(\n \"FOLD_NAV_LAYOUT\",\n);\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\";\nimport {\n FOLD_NAV_LAYOUT,\n type FoldNavLayoutContext,\n} from \"./nav-layout.context\";\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-nav-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 bar stays yours (tabs, active key, events):\n * - `[tabNav]` → the bar. Project a {@link FoldViewNavComponent} if the tabs\n * **navigate** (route between views) or a {@link FoldTabsComponent} if they\n * **switch panels in place** — this layout is agnostic, it only places the bar.\n * - default slot → the content (routed views, or the tabs' `fold-tab-panel`s).\n *\n * **A11y lives in the bar, not here.** `fold-view-nav` brings `<nav>` +\n * `aria-current`; `fold-tabs` brings the full `role=\"tablist\"` widget with its\n * `fold-tab-panel`s. This component adds no tab semantics — it only decides where\n * the bar sits and folds it responsively.\n *\n * A side rail needs a *vertical* bar, a folded one a *horizontal* bar. The\n * projected bar handles that itself with `direction=\"auto\"` (its default) — it\n * reads this layout through DI ({@link FoldNavLayoutContext}), no wiring:\n *\n * ```html\n * <fold-nav-layout placement=\"side\">\n * <fold-view-nav tabNav [items]=\"items\" />\n * <router-outlet />\n * </fold-nav-layout>\n * ```\n *\n * The layout also exposes {@link stacked} via `exportAs` for consumers that want\n * to read the folded state themselves.\n *\n * **Two roles — same component, composed differently.**\n * - **Page scaffold** — the tab rail *is* the page's primary structure: use it\n * directly (usually `placement=\"side\"`), the folded bar leading the content.\n * - **Tabbed section** — a tabbed block *inside* a page, among other sections.\n * Don't reach for a new mode — wrap it in a {@link FoldPageSectionComponent}.\n * The section owns the title, the `<section>` + heading semantics, the vertical\n * rhythm and the optional `bleed`; tab-layout stays pure placement. It paints\n * nothing (no card), so it sits **flat** — add `bleed` on the section for an\n * edge-to-edge band. The rail folds on the **section's** width (it measures\n * itself), not the viewport, so nested tabs collapse on their own.\n *\n * ```html\n * <!-- a tabbed section: flat structure (page-section) + tab placement -->\n * <fold-page-section title=\"Settings\" bleed>\n * <fold-nav-layout placement=\"side\">\n * <fold-view-nav tabNav [items]=\"items\" />\n * <app-settings-panel />\n * </fold-nav-layout>\n * </fold-page-section>\n * ```\n *\n * Sizing is CSS custom properties: `--fold-nav-layout-gap` (16px) and\n * `--fold-nav-layout-rail-width` — the side-rail track, defaulting to the shared\n * `--fold-rail-tertiary` (200px). That's the **tertiary** step of the rail\n * hierarchy — the same level the `--fold-color-bg-rail-tertiary` colour names\n * (app menu → workspace → in-page nav) — so every rail in the app stays on one\n * scale. Override the local var per instance.\n *\n * @selector `fold-nav-layout`\n */\n@Component({\n selector: \"fold-nav-layout\",\n standalone: true,\n exportAs: \"foldNavLayout\",\n host: { \"[class.is-row]\": \"!stacked()\" },\n providers: [\n { provide: FOLD_NAV_LAYOUT, useExisting: FoldNavLayoutComponent },\n ],\n templateUrl: \"./nav-layout.component.html\",\n styleUrl: \"./nav-layout.component.scss\",\n})\nexport class FoldNavLayoutComponent implements FoldNavLayoutContext {\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, contentChild, Directive, input } from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * Marks a custom page title projected into {@link FoldPageLayoutComponent} — put\n * it on inline heading content when the plain `icon` + `title` inputs aren't\n * enough (an avatar, a two-tone title, a live status). It renders inside the\n * page's `<h1>`, so keep it inline and text-like. Its presence switches the\n * header on in place of the input-driven title.\n *\n * @example\n * ```html\n * <fold-page-layout>\n * <span pageTitle><fold-avatar … /> Acme Records</span>\n * </fold-page-layout>\n * ```\n */\n@Directive({ selector: \"[pageTitle]\", standalone: true })\nexport class FoldPageTitleDirective {}\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 * - `[pageTitle]` ({@link FoldPageTitleDirective}) → a custom title, rendered\n * inside the `<h1>` in place of the `icon` + `title` inputs, for when a plain\n * string won't do (an avatar, a two-tone title). Its presence alone switches\n * the header on.\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 // `title` is a heading input — strip the native attribute a static\n // `title=\"…\"` leaves behind, so it never doubles as a browser tooltip.\n host: { \"[attr.title]\": \"null\" },\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 /** A projected `[pageTitle]`, if any — switches the header on for a custom\n * title even without the `title` input. */\n protected readonly customTitle = contentChild(FoldPageTitleDirective);\n}\n","@if (title() || customTitle()) {\n <header class=\"page-head\">\n <div class=\"page-head-text\">\n <h1 class=\"page-title\">\n @if (title(); as t) {\n @if (icon(); as ic) {\n <fold-icon class=\"page-icon\" [name]=\"ic\" [size]=\"22\" />\n }\n <span>{{ t }}</span>\n }\n <ng-content select=\"[pageTitle]\" />\n <span class=\"page-title-badge\"\n ><ng-content select=\"[titleBadge]\"\n /></span>\n </h1>\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 // `title` is a heading input — strip the reflected native attribute so it\n // never doubles as a browser tooltip.\n \"[attr.title]\": \"null\",\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 { InjectionToken, type Provider } from \"@angular/core\";\n\n/**\n * Every user-facing / accessible string the paginator renders. Parameterised\n * strings (the visible range, a page's aria-label) are functions so a locale\n * can reorder or reword them, not just translate a fixed template. All defaults\n * are English — a non-English app overrides them once via\n * {@link provideFoldPaginatorLabels}, or per instance via the `labels` input.\n */\nexport interface FoldPaginatorLabels {\n /** `aria-label` of the page-size `<select>`. */\n readonly pageSize: string;\n /** Trailing text after the size selector, e.g. \"per page\". */\n readonly perPage: string;\n /** `aria-label` of the page-navigation `<nav>`. */\n readonly nav: string;\n /** Previous-page button `aria-label`. */\n readonly previous: string;\n /** Next-page button `aria-label`. */\n readonly next: string;\n /** Shown in place of the range when there are no items. */\n readonly empty: string;\n /** A page button's `aria-label`, e.g. `(3) => \"Page 3\"`. */\n readonly page: (page: number) => string;\n /** The visible range label, e.g. `(21, 30, 237) => \"21–30 of 237\"`. */\n readonly range: (start: number, end: number, total: number) => string;\n}\n\n/** The English defaults — the base every override merges onto. */\nexport const FOLD_PAGINATOR_DEFAULT_LABELS: FoldPaginatorLabels = {\n pageSize: \"Items per page\",\n perPage: \"per page\",\n nav: \"Pagination\",\n previous: \"Previous page\",\n next: \"Next page\",\n empty: \"No items\",\n page: (page) => `Page ${page}`,\n range: (start, end, total) => `${start}–${end} of ${total}`,\n};\n\n/** App-wide paginator labels; defaults to English. */\nexport const FOLD_PAGINATOR_LABELS = new InjectionToken<FoldPaginatorLabels>(\n \"FOLD_PAGINATOR_LABELS\",\n { factory: () => FOLD_PAGINATOR_DEFAULT_LABELS },\n);\n\n/**\n * Provide app-wide paginator labels once at bootstrap. Partial — any key you\n * omit keeps its English default.\n *\n * @example\n * ```ts\n * // app.config.ts\n * providers: [\n * provideFoldPaginatorLabels({\n * perPage: \"par page\",\n * previous: \"Page précédente\",\n * range: (s, e, t) => `${s}–${e} sur ${t}`,\n * }),\n * ];\n * ```\n */\nexport function provideFoldPaginatorLabels(\n labels: Partial<FoldPaginatorLabels>,\n): Provider {\n return {\n provide: FOLD_PAGINATOR_LABELS,\n useValue: { ...FOLD_PAGINATOR_DEFAULT_LABELS, ...labels },\n };\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport {\n FOLD_PAGINATOR_LABELS,\n type FoldPaginatorLabels,\n} from \"./paginator-labels\";\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/** Which control a page change should refocus after the parent re-renders. */\ntype RefocusTarget = \"active\" | \"prev\" | \"next\";\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. The\n * component tolerates a lagging or out-of-range `currentPage` — the visible\n * range, the active button and the prev/next guards all use an internally\n * clamped page, so a stale value can never render a nonsensical range.\n *\n * Renders: `[page size selector] [items range] [‹ 1 2 3 … N ›]`.\n *\n * **Accessible:** the `<nav>`, both arrows, each page (`aria-current=\"page\"` on\n * the active one) and the size selector carry labels, all overridable for i18n\n * via {@link provideFoldPaginatorLabels} (English by default) or the `labels`\n * input. After a page change it moves focus to the control the user was on (the\n * active page, or the prev/next arrow while it stays enabled) so keyboard focus\n * is never dropped to `<body>`.\n *\n * @selector `fold-paginator`\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(false, { transform: booleanAttribute });\n\n /** Per-instance label overrides (merged over the app-wide / English defaults). */\n readonly labels = input<Partial<FoldPaginatorLabels>>();\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 private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injectedLabels = inject(FOLD_PAGINATOR_LABELS);\n\n /** Effective labels — the app-wide (or English) set, with the `labels` input on top. */\n readonly l = computed<FoldPaginatorLabels>(() => ({\n ...this.injectedLabels,\n ...this.labels(),\n }));\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 /** The current page clamped into `[1, totalPages]` — the value everything\n * visible derives from, so a lagging/out-of-range parent never shows a\n * broken range or highlights a phantom page. */\n readonly page = computed<number>(() =>\n Math.min(Math.max(this.currentPage(), 1), this.totalPages()),\n );\n\n /** Sanitised sibling count — a non-negative integer. */\n private readonly siblings = computed<number>(() =>\n Math.max(0, Math.floor(this.siblingCount())),\n );\n\n /** The rendered size options, always including the current `pageSize` (so the\n * `<select>` can never silently show a value the parent isn't using). */\n readonly sizeOptions = computed<readonly number[]>(() => {\n const opts = this.pageSizeOptions();\n const size = this.pageSize();\n if (opts.includes(size)) {\n return opts;\n }\n return [...opts, size].sort((a, b) => a - b);\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.page() - 1) * this.pageSize() + 1;\n });\n\n readonly rangeEnd = computed<number>(() =>\n Math.min(this.page() * this.pageSize(), this.totalItems()),\n );\n\n readonly canGoPrev = computed<boolean>(\n () => !this.disabled() && this.page() > 1,\n );\n readonly canGoNext = computed<boolean>(\n () => !this.disabled() && this.page() < 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.page();\n const sibs = this.siblings();\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 // ─── Focus management (keep keyboard focus after a page change) ─\n\n private refocus: RefocusTarget | null = null;\n private lastFocusedPage = -1;\n\n constructor() {\n // Browser-only, runs after the DOM reflects the new page. When a page\n // change originated from a click here, move focus to the control the user\n // was on so it is never dropped to <body>.\n afterRenderEffect(() => {\n const page = this.page();\n if (this.refocus !== null && page !== this.lastFocusedPage) {\n this.applyRefocus(this.refocus);\n this.refocus = null;\n }\n this.lastFocusedPage = page;\n });\n }\n\n private applyRefocus(target: RefocusTarget): void {\n const root = this.host.nativeElement;\n const active = root.querySelector<HTMLElement>(\".page-btn.is-active\");\n let el: HTMLElement | null = active;\n if (target === \"prev\" && this.canGoPrev()) {\n el = root.querySelector<HTMLElement>(\".nav-btn--prev\");\n } else if (target === \"next\" && this.canGoNext()) {\n el = root.querySelector<HTMLElement>(\".nav-btn--next\");\n }\n el?.focus();\n }\n\n // ─── Handlers ─────────────────────────────────────────────────\n\n goToPage(page: number, via: RefocusTarget = \"active\"): void {\n if (this.disabled()) {\n return;\n }\n const clamped = Math.max(1, Math.min(page, this.totalPages()));\n if (clamped === this.page()) {\n return;\n }\n this.refocus = via;\n this.pageChange.emit(clamped);\n }\n\n prev(): void {\n if (this.canGoPrev()) {\n this.goToPage(this.page() - 1, \"prev\");\n }\n }\n\n next(): void {\n if (this.canGoNext()) {\n this.goToPage(this.page() + 1, \"next\");\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 labels = l();\n@let sizes = sizeOptions();\n\n<div class=\"paginator-left\">\n @if (pageSizeOptions().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 [attr.aria-label]=\"labels.pageSize\"\n >\n @for (opt of sizes; track opt) {\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">\n {{ opt }}\n </option>\n }\n </select>\n <span class=\"page-size__label\">{{ labels.perPage }}</span>\n </label>\n }\n\n @if (totalItems() > 0) {\n <span class=\"range\">{{\n labels.range(rangeStart(), rangeEnd(), totalItems())\n }}</span>\n } @else {\n <span class=\"range range--empty\">{{ labels.empty }}</span>\n }\n</div>\n\n<nav class=\"pages\" [attr.aria-label]=\"labels.nav\">\n <button\n type=\"button\"\n class=\"nav-btn nav-btn--prev\"\n [disabled]=\"!canGoPrev()\"\n (click)=\"prev()\"\n [attr.aria-label]=\"labels.previous\"\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 === page()\"\n [attr.aria-current]=\"item.page === page() ? 'page' : null\"\n [attr.aria-label]=\"labels.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 nav-btn--next\"\n [disabled]=\"!canGoNext()\"\n (click)=\"next()\"\n [attr.aria-label]=\"labels.next\"\n >\n <fold-icon name=\"chevron-right\" [size]=\"15\" />\n </button>\n</nav>\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n booleanAttribute,\n Component,\n computed,\n inject,\n input,\n output,\n} from \"@angular/core\";\nimport { RouterLink, RouterLinkActive } from \"@angular/router\";\nimport { FoldBadgeComponent } from \"../../content/badge/badge.component\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\nimport { FOLD_NAV_LAYOUT } from \"../../layout/nav-layout/nav-layout.context\";\n\nexport type FoldViewNavItem = {\n /** Unique key — identifies the item and is emitted by `activeChange`. */\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 * Router target — makes this item a real `routerLink` `<a>`: cmd/middle-click\n * opens a new tab, the URL is a deep link, and the active state is driven\n * automatically by `routerLinkActive` (no `activeKey` needed). Accepts the\n * same value as `[routerLink]` — a path string or a commands array.\n */\n link?: string | unknown[];\n /** External URL — renders a plain `<a href>` (no router). */\n href?: string;\n /** Disable the item: non-interactive + dimmed. */\n disabled?: boolean;\n};\n\n/**\n * `<fold-view-nav>` — a **navigation** bar styled as tabs: a `<nav>` whose items\n * *go somewhere*. Give each item a `link` (or `href`) and it renders a real\n * `<a>` — so cmd/middle-click opens a new tab, the URL is a deep link, and the\n * active item is driven automatically by `routerLinkActive` +\n * `aria-current=\"page\"`. Without a link an item is a `<button>` that emits\n * `activeChange` and reads its active state from `activeKey` (view switching\n * with no route).\n *\n * **Navigation, not the tabs widget.** Reach for this when a tab routes / switches\n * views. When tabs toggle **layered panels in place** (same URL), use\n * {@link FoldTabsComponent} — same look, but the ARIA Tabs pattern\n * (`role=\"tablist\"`, arrow keys, `tabpanel`).\n *\n * - `activeStyle` — `underline` (accent border) or `fill` (accent pill).\n * - `direction` — `auto` (default: follows a wrapping `fold-nav-layout`, else\n * vertical), `vertical`, or `horizontal`.\n *\n * @selector `fold-view-nav`\n *\n * @example\n * ```html\n * <!-- real navigation: link items, active state automatic -->\n * <fold-view-nav [items]=\"[\n * { key: 'members', label: 'Members', link: 'members', badge: 3 },\n * { key: 'settings', label: 'Settings', link: 'settings' },\n * ]\" />\n * <router-outlet />\n * ```\n */\n@Component({\n selector: \"fold-view-nav\",\n standalone: true,\n imports: [\n NgTemplateOutlet,\n FoldIconComponent,\n FoldBadgeComponent,\n RouterLink,\n RouterLinkActive,\n ],\n templateUrl: \"./view-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: \"./view-nav.component.scss\",\n})\nexport class FoldViewNavComponent {\n /** The items to render, in order. */\n readonly items = input.required<FoldViewNavItem[]>();\n\n /**\n * The active item's `key` — for **button** items (no `link`). Link items ignore\n * it: their active state comes from the URL via `routerLinkActive`.\n */\n readonly activeKey = input<string>(\"\");\n\n /** How the active item reads: accent underline, or accent fill. */\n readonly activeStyle = input<\"underline\" | \"fill\">(\"underline\");\n\n /**\n * Bar orientation. Defaults to `auto`: inside a `fold-nav-layout` it follows\n * the layout (vertical rail, horizontal once folded) with no wiring; on its\n * own it is `vertical` — the readable-first shape, reading as the app's\n * **third navigation rail** (app menu → workspace → in-page views, the\n * `--fold-rail-tertiary` level). Force `horizontal` for a page-level top bar.\n */\n readonly direction = input<\"horizontal\" | \"vertical\" | \"auto\">(\"auto\");\n\n /**\n * Density — pure padding/typography:\n * - `compact` (default) — inline / popover bars.\n * - `comfortable` — a prominent, page-level bar.\n */\n readonly size = input<\"compact\" | \"comfortable\">(\"compact\");\n\n /**\n * Collapse the bar to icons (independent of {@link size}). **Horizontal**, an\n * icon accordion: every item but the active one drops to its icon, the active\n * one keeps its label. **Vertical**, a collapsed icon rail (like a folded\n * menu): every item shows just its icon, its label a hover/focus tooltip and\n * its count a corner bubble — narrow the layout's `--fold-nav-layout-rail-width`\n * to match. An item with no icon falls back to a square glyph of its label's\n * initial, so the rail stays icon-width whether or not items carry icons.\n * Toggle it from your own breakpoint when the bar is too tight.\n */\n readonly collapsed = input(false, { transform: booleanAttribute });\n\n /**\n * `transparent` (default — blends with the app, so the items read directly) or\n * `surface` (a filled bar that carries its own rail background).\n */\n readonly background = input<\"transparent\" | \"surface\">(\"transparent\");\n\n /** Emits the `key` of a clicked **button** item (link items just navigate). */\n readonly activeChange = output<string>();\n\n /** The nearest layout, if any — lets `direction=\"auto\"` follow it. */\n private readonly layout = inject(FOLD_NAV_LAYOUT, { optional: true });\n\n /** `direction` with `auto` resolved against the wrapping layout. */\n protected readonly resolvedDirection = computed<\"horizontal\" | \"vertical\">(\n () => {\n const d = this.direction();\n if (d !== \"auto\") {\n return d;\n }\n return this.layout?.stacked() ? \"horizontal\" : \"vertical\";\n },\n );\n}\n","<nav\n class=\"tab-bar\"\n [class.style-underline]=\"activeStyle() === 'underline'\"\n [class.style-fill]=\"activeStyle() === 'fill'\"\n [class.dir-vertical]=\"resolvedDirection() === 'vertical'\"\n [class.size-comfortable]=\"size() === 'comfortable'\"\n [class.is-collapsed]=\"collapsed()\"\n [class.bg-surface]=\"background() === 'surface'\"\n>\n @for (item of items(); track item.key) {\n @if (item.disabled) {\n <button\n type=\"button\"\n class=\"tab-bar-item is-disabled\"\n disabled\n aria-disabled=\"true\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{ $implicit: item, active: false }\"\n />\n </button>\n } @else if (item.link !== undefined) {\n <a\n class=\"tab-bar-item\"\n [routerLink]=\"item.link\"\n routerLinkActive=\"is-active\"\n #rla=\"routerLinkActive\"\n [attr.aria-current]=\"rla.isActive ? 'page' : null\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{ $implicit: item, active: rla.isActive }\"\n />\n </a>\n } @else if (item.href !== undefined) {\n <a\n class=\"tab-bar-item\"\n [href]=\"item.href\"\n [class.is-active]=\"activeKey() === item.key\"\n [attr.aria-current]=\"activeKey() === item.key ? 'page' : null\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n active: activeKey() === item.key,\n }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"tab-bar-item\"\n [class.is-active]=\"activeKey() === item.key\"\n [attr.aria-current]=\"activeKey() === item.key ? 'page' : null\"\n (click)=\"activeChange.emit(item.key)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"body\"\n [ngTemplateOutletContext]=\"{\n $implicit: item,\n active: activeKey() === item.key,\n }\"\n />\n </button>\n }\n }\n</nav>\n\n<!-- One item's inner content, shared by the link / button branches. -->\n<ng-template #body let-item let-active=\"active\">\n @if (item.icon; as ic) {\n <fold-icon class=\"tab-bar-icon\" [name]=\"ic\" size=\"sm\" />\n } @else if (collapsed()) {\n <!-- Collapsed needs a fixed glyph; an icon-less item falls back to its\n initial so the rail stays icon-width and the label still tooltips. -->\n <span class=\"tab-bar-icon tab-bar-initial\" aria-hidden=\"true\">{{\n item.label.charAt(0)\n }}</span>\n }\n <span class=\"tab-bar-label\">{{ item.label }}</span>\n @if (item.badge !== undefined && item.badge !== null) {\n <fold-badge\n class=\"tab-bar-badge\"\n [content]=\"item.badge + ''\"\n [variant]=\"active ? 'accent' : 'neutral'\"\n />\n }\n</ng-template>\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n viewChildren,\n} 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\";\nimport { FoldIdService } from \"../../../a11y/id.service\";\nimport { FOLD_NAV_LAYOUT } from \"../../layout/nav-layout/nav-layout.context\";\n\n/** A tab in a {@link FoldTabsComponent} bar. */\nexport type FoldTabItem = {\n /** Unique key — identifies the tab / its panel, emitted on change. */\n key: string;\n /** Display label. */\n label: string;\n /** Optional leading icon. */\n icon?: FoldIconName;\n /** Optional trailing count badge. `undefined`/`null` hides it. */\n badge?: string | number | null;\n};\n\n/**\n * The read side a {@link FoldTabPanelComponent} needs to wire itself to a tab —\n * exposed by `fold-tabs` via `exportAs=\"foldTabs\"`. Decouples the panel from the\n * concrete component.\n */\nexport interface FoldTabsContext {\n /** The active tab's key. */\n activeKey(): string;\n /** The DOM id of the tab for `key` (a panel's `aria-labelledby`). */\n tabId(key: string): string;\n /** The DOM id of the panel for `key` (a tab's `aria-controls`). */\n panelId(key: string): string;\n}\n\n/**\n * `<fold-tabs>` — the **in-page tabs widget** (the ARIA Tabs pattern): a\n * `role=\"tablist\"` of `role=\"tab\"` buttons that switch layered panels **without\n * navigating**. Arrow keys move between tabs (roving tabindex — only the active\n * tab is in the Tab order), `Home`/`End` jump to the ends, and each tab is wired\n * to its panel via `aria-controls` ↔ `aria-labelledby`.\n *\n * Pair it with one {@link FoldTabPanelComponent} per key, handed the bar via a\n * template ref so the two coordinate across slots (e.g. inside a\n * `fold-nav-layout`). Same visual as {@link FoldViewNavComponent}; the\n * difference is **semantics** — use `fold-tabs` for in-page panel switching, and\n * `fold-view-nav` when the tabs actually navigate (route) between views.\n *\n * ```html\n * <fold-nav-layout>\n * <fold-tabs\n * nav\n * #t=\"foldTabs\"\n * [tabs]=\"tabs\"\n * [activeKey]=\"tab()\"\n * (tabChange)=\"tab.set($event)\"\n * />\n * <fold-tab-panel [tabs]=\"t\" key=\"overview\">…</fold-tab-panel>\n * <fold-tab-panel [tabs]=\"t\" key=\"settings\">…</fold-tab-panel>\n * </fold-nav-layout>\n * ```\n *\n * Same visual knobs as `fold-view-nav` (`activeStyle` · `direction` · `size` ·\n * `background`). Sizing shares the tab-bar tokens.\n *\n * @selector `fold-tabs`\n */\n@Component({\n selector: \"fold-tabs\",\n standalone: true,\n exportAs: \"foldTabs\",\n imports: [FoldIconComponent, FoldBadgeComponent],\n templateUrl: \"./tabs.component.html\",\n styleUrl: \"./tabs.component.scss\",\n})\nexport class FoldTabsComponent implements FoldTabsContext {\n /** The tabs to render, in order. */\n readonly tabs = input.required<FoldTabItem[]>();\n /** The `key` of the active tab (the shown panel). */\n readonly activeKey = input.required<string>();\n /** How the active tab reads: accent underline, or accent fill. */\n readonly activeStyle = input<\"underline\" | \"fill\">(\"underline\");\n /**\n * Bar orientation (drives `aria-orientation`). Defaults to `auto`: follows a\n * wrapping `fold-nav-layout`, else `horizontal`.\n */\n readonly direction = input<\"horizontal\" | \"vertical\" | \"auto\">(\"auto\");\n /** Density — see {@link FoldViewNavComponent} for the same scale. */\n readonly size = input<\"compact\" | \"comfortable\">(\"compact\");\n /** Collapse to icons — see {@link FoldViewNavComponent.collapsed}. */\n readonly collapsed = input(false, { transform: booleanAttribute });\n /** `surface` (filled bar, default) or `transparent`. */\n readonly background = input<\"transparent\" | \"surface\">(\"surface\");\n /** Emits the newly-selected tab's `key`. */\n readonly tabChange = output<string>();\n\n /** The nearest layout, if any — lets `direction=\"auto\"` follow it. */\n private readonly layout = inject(FOLD_NAV_LAYOUT, { optional: true });\n\n /** `direction` with `auto` resolved against the wrapping layout. */\n protected readonly resolvedDirection = computed<\"horizontal\" | \"vertical\">(\n () => {\n const d = this.direction();\n if (d !== \"auto\") {\n return d;\n }\n return this.layout?.stacked() ? \"horizontal\" : \"vertical\";\n },\n );\n\n /** Per-instance id root, so ids are unique + stable across SSR. */\n private readonly uid = inject(FoldIdService).next(\"fold-tabs\");\n private readonly tabButtons =\n viewChildren<ElementRef<HTMLButtonElement>>(\"tabBtn\");\n\n tabId(key: string): string {\n return `${this.uid}-tab-${key}`;\n }\n panelId(key: string): string {\n return `${this.uid}-panel-${key}`;\n }\n\n protected select(key: string): void {\n this.tabChange.emit(key);\n }\n\n /**\n * Roving-tabindex keyboard model (APG Tabs, automatic activation): arrows move\n * — and select — the adjacent tab, `Home`/`End` the ends. Both axes work, so\n * it stays correct whether the bar is horizontal, vertical, or a\n * mobile-collapsed vertical.\n */\n protected onKeydown(event: KeyboardEvent): void {\n const keys = this.tabs().map((t) => t.key);\n if (keys.length === 0) {\n return;\n }\n const current = keys.indexOf(this.activeKey());\n let target: number;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n target = (current + 1) % keys.length;\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n target = (current - 1 + keys.length) % keys.length;\n break;\n case \"Home\":\n target = 0;\n break;\n case \"End\":\n target = keys.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n const key = keys[target];\n if (key === undefined) {\n return;\n }\n this.tabChange.emit(key);\n this.tabButtons()[target]?.nativeElement.focus();\n }\n}\n","<div\n class=\"tab-bar\"\n role=\"tablist\"\n [attr.aria-orientation]=\"\n resolvedDirection() === 'vertical' ? 'vertical' : 'horizontal'\n \"\n [class.style-underline]=\"activeStyle() === 'underline'\"\n [class.style-fill]=\"activeStyle() === 'fill'\"\n [class.dir-vertical]=\"resolvedDirection() === 'vertical'\"\n [class.size-comfortable]=\"size() === 'comfortable'\"\n [class.is-collapsed]=\"collapsed()\"\n [class.bg-surface]=\"background() === 'surface'\"\n (keydown)=\"onKeydown($event)\"\n>\n @for (tab of tabs(); track tab.key) {\n <button\n #tabBtn\n type=\"button\"\n role=\"tab\"\n class=\"tab-bar-item\"\n [id]=\"tabId(tab.key)\"\n [class.is-active]=\"activeKey() === tab.key\"\n [attr.aria-selected]=\"activeKey() === tab.key\"\n [attr.aria-controls]=\"panelId(tab.key)\"\n [tabindex]=\"activeKey() === tab.key ? 0 : -1\"\n (click)=\"select(tab.key)\"\n >\n @if (tab.icon; as ic) {\n <fold-icon class=\"tab-bar-icon\" [name]=\"ic\" size=\"sm\" />\n } @else if (collapsed()) {\n <span class=\"tab-bar-icon tab-bar-initial\" aria-hidden=\"true\">{{\n tab.label.charAt(0)\n }}</span>\n }\n <span class=\"tab-bar-label\">{{ tab.label }}</span>\n @if (tab.badge !== undefined && tab.badge !== null) {\n <fold-badge\n class=\"tab-bar-badge\"\n [content]=\"tab.badge + ''\"\n [variant]=\"activeKey() === tab.key ? 'accent' : 'neutral'\"\n />\n }\n </button>\n }\n</div>\n","import { Component, computed, input } from \"@angular/core\";\nimport type { FoldTabsContext } from \"./tabs.component\";\n\n/**\n * `<fold-tab-panel>` — one panel of a {@link FoldTabsComponent}. Handed the bar\n * via a template ref (`[tabs]=\"t\"`, where `#t=\"foldTabs\"`) plus its `key`, it\n * becomes a `role=\"tabpanel\"` named by its tab (`aria-labelledby`), reachable by\n * `aria-controls` from that tab, focusable while active, and `hidden` otherwise.\n *\n * The ref pairing is what lets the tabs bar and its panels sit in **different**\n * slots (e.g. the bar in a `fold-nav-layout`'s nav slot, the panels in its\n * content) and still coordinate.\n *\n * ```html\n * <fold-tabs #t=\"foldTabs\" [tabs]=\"tabs\" [activeKey]=\"tab()\" (tabChange)=\"tab.set($event)\" />\n * <fold-tab-panel [tabs]=\"t\" key=\"overview\">…</fold-tab-panel>\n * ```\n *\n * @selector `fold-tab-panel`\n */\n@Component({\n selector: \"fold-tab-panel\",\n standalone: true,\n host: {\n role: \"tabpanel\",\n \"[id]\": \"panelId()\",\n \"[attr.aria-labelledby]\": \"labelledBy()\",\n \"[attr.tabindex]\": \"isActive() ? 0 : null\",\n \"[hidden]\": \"!isActive()\",\n },\n template: \"<ng-content />\",\n})\nexport class FoldTabPanelComponent {\n /** The owning `fold-tabs`, read via its template ref (`#t=\"foldTabs\"`). */\n readonly tabs = input.required<FoldTabsContext>();\n /** This panel's tab key — must match one tab in the bar. */\n readonly key = input.required<string>();\n\n protected readonly isActive = computed(\n () => this.tabs().activeKey() === this.key(),\n );\n protected readonly panelId = computed(() => this.tabs().panelId(this.key()));\n protected readonly labelledBy = computed(() => this.tabs().tabId(this.key()));\n}\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 // `title` is a heading input — strip the native attribute a static\n // `title=\"…\"` leaves behind, so it never doubles as a browser tooltip.\n host: { \"[attr.title]\": \"null\" },\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","import {\n booleanAttribute,\n Component,\n ElementRef,\n input,\n output,\n viewChild,\n} from \"@angular/core\";\nimport { FoldIconComponent } from \"../../foundations/icon/icon.component\";\nimport type { FoldIconName } from \"../../foundations/icon/builtin-icons\";\n\n/**\n * `<fold-dropdown-item>` — one actionable row inside a {@link FoldDropdownComponent}.\n * Renders a `role=\"menuitem\"` button; emits `selected` on activation (click,\n * `Enter` or `Space`) and the parent closes the menu. Roving focus + arrow-key\n * navigation are owned by the dropdown.\n *\n * @selector `fold-dropdown-item`\n *\n * @example\n * ```html\n * <fold-dropdown-item icon=\"edit\" (selected)=\"rename()\">Rename</fold-dropdown-item>\n * <fold-dropdown-item tone=\"danger\" (selected)=\"remove()\">Delete</fold-dropdown-item>\n * ```\n */\n@Component({\n selector: \"fold-dropdown-item\",\n standalone: true,\n imports: [FoldIconComponent],\n template: `\n <button\n #btn\n type=\"button\"\n role=\"menuitem\"\n class=\"fdrop-item\"\n [class.is-danger]=\"tone() === 'danger'\"\n tabindex=\"-1\"\n [disabled]=\"disabled()\"\n (click)=\"onClick()\"\n >\n @if (icon(); as ic) {\n <fold-icon [name]=\"ic\" size=\"sm\" class=\"fdrop-item-icon\" />\n }\n <span class=\"fdrop-item-label\"><ng-content /></span>\n </button>\n `,\n styleUrl: \"./dropdown-item.component.scss\",\n})\nexport class FoldDropdownItemComponent {\n /** Disable the row — skipped by keyboard navigation, inert to clicks. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Visual tone. @default \"default\" */\n readonly tone = input<\"default\" | \"danger\">(\"default\");\n /** Optional leading icon. */\n readonly icon = input<FoldIconName>();\n /** Emitted on activation (click / Enter / Space). */\n readonly selected = output();\n\n private readonly btn = viewChild<ElementRef<HTMLButtonElement>>(\"btn\");\n\n /** The native button — the dropdown reads it for roving focus + typeahead. */\n get button(): HTMLButtonElement | undefined {\n return this.btn()?.nativeElement;\n }\n\n focus(): void {\n this.btn()?.nativeElement.focus();\n }\n\n protected onClick(): void {\n if (!this.disabled()) {\n this.selected.emit();\n }\n }\n}\n","import {\n afterRenderEffect,\n Component,\n contentChildren,\n inject,\n input,\n model,\n Renderer2,\n signal,\n} from \"@angular/core\";\nimport { FoldPopoverComponent } from \"./popover.component\";\nimport { FoldDropdownItemComponent } from \"./dropdown-item.component\";\nimport type { FoldPopoverPlacement } from \"./placement\";\n\n/**\n * `<fold-dropdown>` — an actions menu built on {@link FoldPopoverComponent}.\n * Project a trigger (`[foldPopoverTrigger]`) and a list of\n * `<fold-dropdown-item>`s; the menu is a `role=\"menu\"` with full keyboard\n * support (↑/↓ roving, `Home`/`End`, type-ahead), opens focused on its first\n * enabled item, and closes — returning focus to the trigger — when an item is\n * chosen or on `Escape` / outside-click. Give the trigger `foldPopoverTrigger=\"menu\"`\n * so its `aria-haspopup` reads as a menu.\n *\n * @selector `fold-dropdown`\n *\n * @example\n * ```html\n * <fold-dropdown ariaLabel=\"Row actions\">\n * <fold-button-icon icon=\"more-vertical\" tooltip=\"Actions\" foldPopoverTrigger=\"menu\" />\n * <fold-dropdown-item icon=\"edit\" (selected)=\"rename(row)\">Rename</fold-dropdown-item>\n * <fold-dropdown-item tone=\"danger\" (selected)=\"remove(row)\">Delete</fold-dropdown-item>\n * </fold-dropdown>\n * ```\n */\n@Component({\n selector: \"fold-dropdown\",\n standalone: true,\n imports: [FoldPopoverComponent],\n templateUrl: \"./dropdown.component.html\",\n styleUrl: \"./dropdown.component.scss\",\n})\nexport class FoldDropdownComponent {\n private readonly renderer = inject(Renderer2);\n\n /** Preferred placement. @default \"bottom-start\" */\n readonly placement = input<FoldPopoverPlacement>(\"bottom-start\");\n /** Gap between trigger and menu, in px. @default 8 */\n readonly offset = input(8);\n /** Accessible name of the menu. */\n readonly ariaLabel = input<string>();\n /** Two-way open state. */\n readonly open = model(false);\n\n private readonly items = contentChildren(FoldDropdownItemComponent);\n /** Active row = index into {@link enabled}. Roving state lives here (not read\n * from `document.activeElement`), so it stays correct regardless of focus. */\n private readonly active = signal(0);\n\n constructor() {\n // On open, arm + focus the first enabled item. Deferred to a microtask so it\n // runs AFTER the popover's own render effect has `showPopover()`n the panel\n // in the same flush — focusing a still-hidden panel would no-op and leave\n // focus on the trigger (outside the menu, so keydowns wouldn't reach it).\n afterRenderEffect(() => {\n if (this.open()) {\n queueMicrotask(() => {\n if (this.open()) {\n this.focusIndex(0);\n }\n });\n }\n });\n }\n\n /** Enabled items only — keyboard nav + focus skip disabled rows. */\n private enabled(): FoldDropdownItemComponent[] {\n return this.items().filter((i) => !i.disabled());\n }\n\n private focusIndex(index: number): void {\n const items = this.enabled();\n if (items.length === 0) {\n return;\n }\n const idx = ((index % items.length) + items.length) % items.length;\n this.active.set(idx);\n for (const it of this.items()) {\n if (it.button) {\n this.renderer.setAttribute(it.button, \"tabindex\", \"-1\");\n }\n }\n const target = items[idx];\n if (target?.button) {\n this.renderer.setAttribute(target.button, \"tabindex\", \"0\");\n }\n target?.focus();\n }\n\n protected onMenuKeydown(event: KeyboardEvent): void {\n const items = this.enabled();\n if (items.length === 0) {\n return;\n }\n const current = this.active();\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n this.focusIndex(current + 1);\n return;\n case \"ArrowUp\":\n event.preventDefault();\n this.focusIndex(current - 1);\n return;\n case \"Home\":\n event.preventDefault();\n this.focusIndex(0);\n return;\n case \"End\":\n event.preventDefault();\n this.focusIndex(items.length - 1);\n return;\n case \"Tab\":\n this.open.set(false);\n return;\n default:\n this.typeahead(event, items, current);\n }\n }\n\n /** Type-ahead buffer (multi-letter): keystrokes within 500 ms accumulate, so\n * \"de\" jumps to \"Delete\", not just the next \"d\". */\n private typeBuffer = \"\";\n private typeAt = 0;\n\n private typeahead(\n event: KeyboardEvent,\n items: FoldDropdownItemComponent[],\n current: number,\n ): void {\n if (\n event.key.length !== 1 ||\n event.key === \" \" || // Space activates the focused item, never type-ahead\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n ) {\n return;\n }\n const now = Date.now();\n this.typeBuffer =\n now - this.typeAt > 500 ? event.key : this.typeBuffer + event.key;\n this.typeAt = now;\n const query = this.typeBuffer.toLowerCase();\n // A fresh single letter advances to the NEXT match (cycles same-initial\n // items); an extended buffer stays on the current item if it still matches.\n const from = query.length === 1 ? 1 : 0;\n for (let i = 0; i < items.length; i += 1) {\n const idx = (current + from + i) % items.length;\n const label = items[idx]?.button?.textContent?.trim().toLowerCase() ?? \"\";\n if (label.startsWith(query)) {\n this.focusIndex(idx);\n return;\n }\n }\n }\n\n /** A menuitem was activated (click / Enter / Space bubbles here) → close. */\n protected onMenuActivate(event: MouseEvent): void {\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n const btn = target.closest<HTMLButtonElement>(\"button[role='menuitem']\");\n if (btn && !btn.disabled) {\n this.open.set(false);\n }\n }\n}\n","<fold-popover\n [placement]=\"placement()\"\n [offset]=\"offset()\"\n [autoFocus]=\"false\"\n [(open)]=\"open\"\n>\n <ng-content select=\"[foldPopoverTrigger]\" />\n <div\n foldPopoverPanel\n class=\"fdrop-menu\"\n role=\"menu\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n (keydown)=\"onMenuKeydown($event)\"\n (click)=\"onMenuActivate($event)\"\n >\n <ng-content />\n </div>\n</fold-popover>\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 { FoldInlineConfirmComponent } from \"./components/actions/inline-confirm/inline-confirm.component\";\nexport {\n FOLD_INLINE_CONFIRM_LABELS,\n FOLD_INLINE_CONFIRM_DEFAULT_LABELS,\n provideFoldInlineConfirmLabels,\n} from \"./components/actions/inline-confirm/inline-confirm-labels\";\nexport type { FoldInlineConfirmLabels } from \"./components/actions/inline-confirm/inline-confirm-labels\";\nexport {\n FoldCardComponent,\n foldCardBandChrome,\n} from \"./components/content/card/card.component\";\nexport type {\n FoldCardBandChrome,\n FoldCardBandChromeInput,\n} 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 { FoldDataTableRowCardDirective } from \"./components/content/data-table/data-table-row-card.directive\";\nexport {\n provideFoldDataTableLabels,\n FOLD_DATA_TABLE_LABELS,\n FOLD_DATA_TABLE_DEFAULT_LABELS,\n} from \"./components/content/data-table/data-table-labels\";\nexport type { FoldDataTableLabels } from \"./components/content/data-table/data-table-labels\";\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 { FoldListboxComponent } from \"./components/forms/listbox/listbox.component\";\nexport { FoldMultiselectComponent } from \"./components/forms/listbox/multiselect.component\";\nexport { FoldOptionComponent } from \"./components/forms/listbox/option.component\";\nexport type { FoldSelectOption } from \"./components/forms/listbox/select-option\";\nexport { FoldPasswordFieldComponent } from \"./components/forms/password/password-field.component\";\nexport {\n foldDefaultPasswordRules,\n foldRegexRule,\n type FoldPasswordRule,\n} from \"./components/forms/password/password-rules\";\nexport { FoldViewToggleComponent } from \"./components/forms/view-toggle/view-toggle.component\";\nexport type { FoldViewToggleOption } from \"./components/forms/view-toggle/view-toggle.component\";\nexport { FoldCheckboxComponent } from \"./components/forms/checkbox/checkbox.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 { FoldNavLayoutComponent } from \"./components/layout/nav-layout/nav-layout.component\";\nexport {\n FoldPageLayoutComponent,\n FoldPageTitleDirective,\n} 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 {\n provideFoldPaginatorLabels,\n FOLD_PAGINATOR_LABELS,\n FOLD_PAGINATOR_DEFAULT_LABELS,\n} from \"./components/content/paginator/paginator-labels\";\nexport type { FoldPaginatorLabels } from \"./components/content/paginator/paginator-labels\";\nexport { FoldViewNavComponent } from \"./components/navigation/view-nav/view-nav.component\";\nexport type { FoldViewNavItem } from \"./components/navigation/view-nav/view-nav.component\";\nexport { FoldTabsComponent } from \"./components/navigation/tabs/tabs.component\";\nexport type {\n FoldTabItem,\n FoldTabsContext,\n} from \"./components/navigation/tabs/tabs.component\";\nexport { FoldTabPanelComponent } from \"./components/navigation/tabs/tab-panel.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 { FoldPopoverComponent } from \"./components/overlays/popover/popover.component\";\nexport { FoldPopoverTriggerDirective } from \"./components/overlays/popover/popover-trigger.directive\";\nexport { FoldDropdownComponent } from \"./components/overlays/popover/dropdown.component\";\nexport { FoldDropdownItemComponent } from \"./components/overlays/popover/dropdown-item.component\";\nexport { computePlacement } from \"./components/overlays/popover/placement\";\nexport { autoUpdate } from \"./components/overlays/popover/auto-update\";\nexport type {\n FoldPopoverPlacement,\n FoldPopoverSide,\n FoldPopoverAlign,\n FoldPlacementInput,\n FoldPlacementResult,\n FoldRect,\n} from \"./components/overlays/popover/placement\";\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":["clamp"],"mappings":"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"}