@frame-kit/ui-ng-patterns 0.2.16 → 0.2.17

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":"frame-kit-ui-ng-patterns-dashboard.mjs","sources":["../../../../packages/ui-ng-patterns/dashboard/page-header/page-header.component.ts","../../../../packages/ui-ng-patterns/dashboard/page-header/page-header.component.html","../../../../packages/ui-ng-patterns/dashboard/table-empty-state/table-empty-state.component.ts","../../../../packages/ui-ng-patterns/dashboard/table-empty-state/table-empty-state.component.html","../../../../packages/ui-ng-patterns/dashboard/content-split-layout/content-split-layout.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-split-layout/content-split-layout.component.html","../../../../packages/ui-ng-patterns/dashboard/columns/columns.component.ts","../../../../packages/ui-ng-patterns/dashboard/columns/columns.component.html","../../../../packages/ui-ng-patterns/dashboard/detail-panel/detail-panel.component.ts","../../../../packages/ui-ng-patterns/dashboard/detail-panel/detail-panel.component.html","../../../../packages/ui-ng-patterns/dashboard/sidebar-nav/sidebar-nav-item.directive.ts","../../../../packages/ui-ng-patterns/dashboard/sidebar-nav/sidebar-nav.component.ts","../../../../packages/ui-ng-patterns/dashboard/sidebar-nav/sidebar-nav.component.html","../../../../packages/ui-ng-patterns/dashboard/dialog-footer/dialog-footer.component.ts","../../../../packages/ui-ng-patterns/dashboard/dialog-footer/dialog-footer.component.html","../../../../packages/ui-ng-patterns/dashboard/dialog-header/dialog-header.component.ts","../../../../packages/ui-ng-patterns/dashboard/dialog-header/dialog-header.component.html","../../../../packages/ui-ng-patterns/dashboard/dialog-shell/dialog-shell.component.ts","../../../../packages/ui-ng-patterns/dashboard/dialog-shell/dialog-shell.component.html","../../../../packages/ui-ng-patterns/dashboard/onboarding-guide/onboarding-guide.component.ts","../../../../packages/ui-ng-patterns/dashboard/onboarding-guide/onboarding-guide.component.html","../../../../packages/ui-ng-patterns/dashboard/search-bar-layout/search-bar-layout.component.ts","../../../../packages/ui-ng-patterns/dashboard/search-bar-layout/search-bar-layout.component.html","../../../../packages/ui-ng-patterns/dashboard/content-page-section/content-page-section.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-page-section/content-page-section.component.html","../../../../packages/ui-ng-patterns/dashboard/content-row/content-row.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-row/content-row.component.html","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column.component.html","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column-headline.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column-headline.component.html","../../../../packages/ui-ng-patterns/dashboard/back-nav/back-nav.component.ts","../../../../packages/ui-ng-patterns/dashboard/back-nav/back-nav.component.html","../../../../packages/ui-ng-patterns/dashboard/content-detail-header/content-detail-header.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-detail-header/content-detail-header.component.html","../../../../packages/ui-ng-patterns/dashboard/content-detail-page/content-detail-page.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-detail-page/content-detail-page.component.html","../../../../packages/ui-ng-patterns/dashboard/inline-loader/inline-loader.component.ts","../../../../packages/ui-ng-patterns/dashboard/inline-loader/inline-loader.component.html","../../../../packages/ui-ng-patterns/dashboard/context-switcher/context-switcher.component.ts","../../../../packages/ui-ng-patterns/dashboard/context-switcher/context-switcher.component.html","../../../../packages/ui-ng-patterns/dashboard/dashboard-nav/dashboard-nav.component.ts","../../../../packages/ui-ng-patterns/dashboard/dashboard-nav/dashboard-nav.component.html","../../../../packages/ui-ng-patterns/dashboard/dashboard-layout/dashboard-layout.component.ts","../../../../packages/ui-ng-patterns/dashboard/dashboard-layout/dashboard-layout.component.html","../../../../packages/ui-ng-patterns/dashboard/frame-kit-ui-ng-patterns-dashboard.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\nimport { TextComponent } from '@frame-kit/ui-ng/core/text';\n\n/**\n * Page-level dashboard header: title + optional description on the left, up to\n * ~3 actions on the right.\n *\n * When the header's own width gets tight, the actions drop below the text and\n * go full-width (mobile-style). The break is driven by a CSS container query on\n * the host, so it responds to the content region's width — not the viewport,\n * which means it behaves correctly inside a narrow panel.\n *\n * Project actions by tagging each button with `pageHeaderActions`:\n *\n * <fk-page-header title=\"Users\" description=\"...\">\n * <fk-button pageHeaderActions variant=\"outline\" size=\"sm\">Import</fk-button>\n * <fk-button pageHeaderActions variant=\"primary\" size=\"sm\">Create user</fk-button>\n * </fk-page-header>\n *\n * Tagging each button (rather than wrapping them in a div) makes every button a\n * direct flex child, so full-width stacking falls out of `align-items: stretch`\n * with no `::ng-deep` reach-in.\n *\n * The title row has two projected slots — `[pageHeaderLeading]` before the\n * title and `[pageHeaderTrailing]` after it. Project a plain `fk-icon` for a\n * decorative mark, or a `button` for a clickable one (the consumer owns the\n * interaction, focus ring, and aria-label):\n *\n * <fk-page-header title=\"Permissions\">\n * <fk-icon pageHeaderLeading name=\"key-outline\" />\n * <button pageHeaderTrailing type=\"button\" aria-label=\"Docs\" (click)=\"openDocs()\">\n * <fk-icon name=\"view-api\" />\n * </button>\n * </fk-page-header>\n */\n@Component({\n selector: 'fk-page-header',\n standalone: true,\n imports: [HeadlineComponent, TextComponent],\n // Emulated (not None) so `:host` works — `:host { display: block }` is what\n // keeps the custom element from defaulting to `display: inline` and\n // collapsing to min-content under the container query below.\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './page-header.component.html',\n styleUrl: './page-header.component.scss',\n})\nexport class PageHeaderComponent {\n // ===== INPUTS =====\n readonly title = input.required<string>();\n readonly description = input<string | null>(null);\n readonly headingLevel = input<HeadlineLevel>(1);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-page-header', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<header class=\"fk-page-header__bar\" [attr.aria-label]=\"ariaLabel()\">\n <div class=\"fk-page-header__text\">\n <div class=\"fk-page-header__title-row\">\n <ng-content select=\"[pageHeaderLeading]\" />\n\n <fk-headline [level]=\"headingLevel()\">{{ title() }}</fk-headline>\n\n <ng-content select=\"[pageHeaderTrailing]\" />\n </div>\n\n @if (description()) {\n <fk-text class=\"fk-page-header__description\" tone=\"muted\">{{\n description()\n }}</fk-text>\n }\n </div>\n\n <div class=\"fk-page-header__actions\">\n <ng-content select=\"[pageHeaderActions]\" />\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\n\n/**\n * Empty-state panel for dashboard tables and lists: a centered icon, a title,\n * an optional description, and a projected actions slot (typically one primary\n * fk-button). Bordered-card styling, meant to stand in for a table body when\n * there are no rows.\n *\n * The action row flips from a horizontal row to a centered vertical stack on\n * narrow widths, driven by a container query on the host — so it reacts to the\n * empty-state's own width (e.g. inside a split column) rather than the viewport.\n *\n * <fk-table-empty-state\n * icon=\"globe\"\n * title=\"No webhooks configured\"\n * description=\"Add a webhook to receive events.\"\n * >\n * <fk-button variant=\"primary\" size=\"sm\">Add webhook</fk-button>\n * </fk-table-empty-state>\n *\n * The actions slot is an open `ng-content`, so project as many actions as the\n * design needs (one primary is the norm; two reads cleanly).\n */\n@Component({\n selector: 'fk-table-empty-state',\n standalone: true,\n imports: [IconComponent],\n // Emulated (default) so `:host` works — the host is the bordered flex card\n // and establishes the container-query context the actions break against.\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './table-empty-state.component.html',\n styleUrl: './table-empty-state.component.scss',\n})\nexport class TableEmptyStateComponent {\n // ===== INPUTS =====\n readonly icon = input<string | null>(null);\n readonly title = input.required<string>();\n readonly description = input<string | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-table-empty-state', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (icon()) {\n <div class=\"fk-table-empty-state__icon\">\n <fk-icon [name]=\"icon()!\" size=\"lg\" />\n </div>\n}\n\n<h3 class=\"fk-table-empty-state__title\">{{ title() }}</h3>\n\n@if (description()) {\n <p class=\"fk-table-empty-state__description\">{{ description() }}</p>\n}\n\n<div class=\"fk-table-empty-state__actions\">\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Two-column split layout with container-query responsive stacking.\n *\n * Projects content into `[start]` (grows to fill) and `[end]` (content-sized or\n * fixed width). Below 700px container width, columns stack vertically.\n *\n * A standalone layout primitive for custom dashboard rows.\n */\n@Component({\n selector: 'fk-content-split-layout',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-split-layout.component.html',\n styleUrl: './content-split-layout.component.scss',\n})\nexport class ContentSplitLayoutComponent {\n // ===== INPUTS =====\n readonly endWidth = input<string | null>(null);\n readonly gap = input<string>('var(--fk-rhythm-4, 1rem)');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-split-layout', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<div\n class=\"fk-content-split-layout__row\"\n [style.--fk-content-split-gap]=\"gap()\"\n>\n <div class=\"fk-content-split-layout__start\">\n <ng-content select=\"[start]\" />\n </div>\n\n <div\n class=\"fk-content-split-layout__end\"\n [class.fk-content-split-layout__end--fixed]=\"endWidth()\"\n [style.--fk-content-split-end-width]=\"endWidth()\"\n >\n <ng-content select=\"[end]\" />\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport type { ColumnsEmptyTracks } from './columns.types';\n\n/**\n * Responsive column layout for dashboard content. Lays projected children out\n * in equal-width columns that wrap — and ultimately collapse to a single\n * stacked column — based on the layout's *own* available width, never the\n * viewport. So it reacts correctly when the dashboard content region is\n * squeezed (sidenav open, a drawer pushed in, a split pane) while the viewport\n * still reports \"desktop\".\n *\n * Implemented with an intrinsic CSS grid — `repeat(auto-fit, minmax(min, 1fr))`\n * — so there is no container query, no JS, and no viewport breakpoint to keep\n * in sync. `minColumnWidth` is the smallest a column may shrink to before the\n * grid drops a column; empty tracks collapse, so N children never produce more\n * than N columns. Spacing on both axes is a single `gutter` gap, so wrapped\n * rows and side-by-side columns separate consistently with no edge artifacts.\n *\n * <fk-columns minColumnWidth=\"18rem\">\n * <fk-field-group>…</fk-field-group>\n * <fk-field-group>…</fk-field-group>\n * </fk-columns>\n *\n * By default columns grow to fill the row (`1fr`). Set `maxColumnWidth` to cap\n * how wide a column may get — past that, columns stay that width and the extra\n * space is left empty (columns aligned to the start) rather than stretching.\n *\n * `emptyTracks` decides what happens to tracks nothing is projected into. The\n * default collapses them, which is right when the children are a fixed set.\n * Keep them when the children are a *filtered* set and a column should be the\n * same width whatever the filter leaves behind.\n */\n@Component({\n selector: 'fk-columns',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './columns.component.html',\n styleUrl: './columns.component.scss',\n})\nexport class ColumnsComponent {\n // ===== INPUTS =====\n /**\n * The smallest width a column may shrink to before the grid drops to fewer\n * columns. This is the single knob that controls when columns wrap/stack.\n */\n readonly minColumnWidth = input<string>('16rem');\n /**\n * Optional cap on how wide a column may grow. Unset (default), columns fill\n * the row (`1fr`); when set (e.g. `'22rem'`), columns size between\n * `minColumnWidth` and this value and don't stretch past it — leftover space\n * stays empty, columns aligned to the start.\n */\n readonly maxColumnWidth = input<string | null>(null);\n /**\n * What becomes of tracks with no child in them.\n *\n * `collapse` (default) removes them — `auto-fit` — so N children never\n * produce more than N columns. The consequence is that the surviving columns\n * share the whole row between them, so a column is wider when it has fewer\n * siblings.\n *\n * `keep` leaves them as empty space — `auto-fill` — so a column is the same\n * width whatever the child count. Use it wherever the children can be\n * filtered: a card that grows because its neighbours were filtered out reads\n * as a bug, not as a layout.\n */\n readonly emptyTracks = input<ColumnsEmptyTracks>('collapse');\n /** Gap between side-by-side columns and between wrapped rows. */\n readonly gutter = input<string>('var(--fk-rhythm-4, 1rem)');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-columns', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n\n @HostBinding('style.--fk-columns-min')\n get hostMin(): string {\n return this.minColumnWidth();\n }\n\n // Null leaves the property unset, so the SCSS falls back to `1fr` (fill).\n @HostBinding('style.--fk-columns-max')\n get hostMax(): string | null {\n return this.maxColumnWidth();\n }\n\n @HostBinding('style.--fk-columns-gutter')\n get hostGutter(): string {\n return this.gutter();\n }\n\n // The grid's repeat keyword, named for the behaviour rather than the CSS so\n // the input reads the same way the docs do.\n @HostBinding('style.--fk-columns-repeat')\n get hostRepeat(): string {\n return this.emptyTracks() === 'keep' ? 'auto-fill' : 'auto-fit';\n }\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Padded container for an expanded dashboard detail region — typically the body\n * of a data-table row expansion, holding an `fk-columns` of form controls.\n *\n * The `disabled` input greys the panel and makes its entire subtree `inert`\n * (non-interactive, unfocusable, hidden from assistive technology) — for\n * controls gated behind a feature toggle that must not be editable until the\n * feature is enabled.\n *\n * <fk-detail-panel [disabled]=\"!feature.enabled\">\n * <fk-columns>…</fk-columns>\n * </fk-detail-panel>\n */\n@Component({\n selector: 'fk-detail-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './detail-panel.component.html',\n styleUrl: './detail-panel.component.scss',\n})\nexport class DetailPanelComponent {\n // ===== INPUTS =====\n /**\n * Greys the panel and makes its content inert (locked) — for feature-gated\n * controls that should not be editable until the feature is enabled.\n */\n readonly disabled = input<boolean>(false);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n [\n 'fk-detail-panel',\n this.disabled() ? 'fk-detail-panel--disabled' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n\n /**\n * Lock the whole subtree when disabled. `inert` blocks pointer interaction,\n * focus, and assistive-tech access in one attribute — stronger and more\n * correct than `pointer-events: none`, which only blocks the mouse.\n */\n @HostBinding('attr.inert')\n get hostInert(): '' | null {\n return this.disabled() ? '' : null;\n }\n}\n","<ng-content />\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport type { SidebarNavLink } from './sidebar-nav.types';\n\n/**\n * Marks an `<ng-template>` whose content `fk-sidebar-nav` renders as an item's\n * leading content — e.g. a method badge or any custom adornment — receiving the\n * item as `$implicit`. The component still owns the row, label, disclosure,\n * active/branch state, collapse, and flyout; this only customizes what sits\n * before the label.\n *\n * The template is applied to any item whose `data` is set; items without `data`\n * fall back to their `icon`.\n *\n * <fk-sidebar-nav [model]=\"nav\">\n * <ng-template fkSidebarNavItem let-item>\n * <fk-method-badge [method]=\"item.data\" />\n * </ng-template>\n * </fk-sidebar-nav>\n */\n@Directive({\n selector: 'ng-template[fkSidebarNavItem]',\n standalone: true,\n})\nexport class SidebarNavItemDirective {\n readonly template =\n inject<TemplateRef<{ $implicit: SidebarNavLink }>>(TemplateRef);\n\n /** Types `let-item` as a `SidebarNavLink` in the consumer's template. */\n static ngTemplateContextGuard(\n _directive: SidebarNavItemDirective,\n _context: unknown,\n ): _context is { $implicit: SidebarNavLink } {\n return true;\n }\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n HostBinding,\n inject,\n Injector,\n input,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n RouterLink,\n} from '@angular/router';\nimport { filter, map, Subscription } from 'rxjs';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { TooltipDirective } from '@frame-kit/ui-ng/directives/tooltip';\nimport { AppShellComponent } from '@frame-kit/ui-ng/layouts/app-shell';\n\nimport { SidebarNavItemDirective } from './sidebar-nav-item.directive';\nimport type {\n SidebarNavItem,\n SidebarNavLink,\n SidebarNavModel,\n} from './sidebar-nav.types';\n\n/**\n * Model-driven dashboard sidebar navigation.\n *\n * Renders a sidebar from a {@link SidebarNavModel}: labelled groups of items,\n * where each item is either a leaf link or a parent with children. The pattern\n * owns the two-state behavior that makes a dashboard rail usable:\n *\n * - **Expanded** — parents disclose their children inline; the section\n * containing the active route stays open and reads as active (tinted).\n * - **Collapsed (icon rail)** — labels collapse to icons with hover tooltips;\n * a parent click opens a **flyout** beside the rail (anchored via CDK\n * Overlay) listing its children, so nested pages stay reachable without\n * expanding the whole sidebar.\n *\n * Drop it into an `fk-app-shell` sidenav slot — it reads the shell's collapse\n * state automatically. Pass `[collapsed]` explicitly to drive the rail without\n * a shell.\n */\n@Component({\n selector: 'fk-sidebar-nav',\n standalone: true,\n imports: [RouterLink, IconComponent, TooltipDirective, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './sidebar-nav.component.html',\n styleUrl: './sidebar-nav.component.scss',\n})\nexport class SidebarNavComponent {\n // ===== INPUTS =====\n /** The navigation model — ordered groups of items. */\n readonly model = input<SidebarNavModel>([]);\n /**\n * Collapsed (icon-rail) state. Left `null`, the component reads the collapse\n * state of an ancestor `fk-app-shell`. Set explicitly to drive the rail\n * without a shell present.\n */\n readonly collapsed = input<boolean | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== DEPENDENCIES =====\n private readonly shell = inject(AppShellComponent, { optional: true });\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly overlay = inject(Overlay);\n private readonly vcr = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n\n // ===== REFS =====\n private readonly flyoutTpl =\n viewChild.required<TemplateRef<unknown>>('flyoutTpl');\n /** Optional consumer template for an item's leading content (e.g. a badge). */\n private readonly itemTpl = contentChild(SidebarNavItemDirective);\n private readonly itemTemplate = computed(\n () => this.itemTpl()?.template ?? null,\n );\n\n /**\n * The leading-content template for an item, or null. Only items carrying\n * `data` use it; others fall back to their `icon`.\n */\n protected leadingTemplate(\n item: SidebarNavLink,\n ): TemplateRef<{ $implicit: SidebarNavLink }> | null {\n return item.data !== undefined && item.data !== null\n ? this.itemTemplate()\n : null;\n }\n\n // ===== STATE =====\n /** Active URL, recomputed on every navigation — drives section-active styling. */\n private readonly currentUrl = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map(() => stripUrl(this.router.url)),\n ),\n { initialValue: stripUrl(this.router.url) },\n );\n /** Parent ids the user has explicitly opened (the active section is always open). */\n private readonly openIds = signal<ReadonlySet<string>>(new Set());\n\n private overlayRef: OverlayRef | null = null;\n /** Overlay-scoped event subscriptions — torn down with the overlay in closeFlyout(). */\n private flyoutSubs: Subscription | null = null;\n /** The trigger row the open flyout is anchored to — used to ignore its own re-click. */\n private flyoutOrigin: HTMLElement | null = null;\n /** The parent whose flyout is currently open (collapsed rail), or null. */\n protected readonly flyoutItem = signal<SidebarNavItem | null>(null);\n\n constructor() {\n // Tear down an open flyout the moment the rail expands. Clicking the shell\n // toggle would close it via the outside-pointer handler, but a programmatic\n // `[collapsed]` change, a responsive breakpoint flip, or a keyboard toggle\n // produces no pointer event — so the overlay would otherwise linger beside\n // the now-expanded sidebar.\n effect(() => {\n if (!this.isCollapsed()) {\n this.closeFlyout();\n }\n });\n\n // Close on any navigation (covers programmatic router.navigate, which\n // disposeOnNavigation does not catch, and keeps internal state in sync).\n effect(() => {\n this.currentUrl();\n this.closeFlyout();\n });\n\n // Auto-open the section that holds the active route — on first load and\n // whenever navigation lands inside a (possibly different, or previously\n // collapsed) section. This only ever *adds* to openIds, so a section the\n // user collapses by hand stays closed until they navigate back into it.\n effect(() => {\n this.currentUrl();\n\n const activeIds = this.model()\n .flatMap((group) => group.items)\n .filter((item) => this.isParent(item) && this.sectionActive(item))\n .map((item) => item.id);\n\n if (activeIds.length === 0) {\n return;\n }\n\n this.openIds.update((set) => {\n const next = new Set(set);\n activeIds.forEach((id) => next.add(id));\n\n return next;\n });\n });\n\n this.destroyRef.onDestroy(() => this.closeFlyout());\n }\n\n // ===== COMPUTED =====\n readonly isCollapsed = computed(\n () => this.collapsed() ?? this.shell?.isCollapsed() ?? false,\n );\n\n readonly classes = computed(() =>\n [\n 'fk-sidebar-nav',\n this.isCollapsed() ? 'fk-sidebar-nav--collapsed' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n // ===== ACTIVE / EXPANSION =====\n protected isParent(item: SidebarNavItem): boolean {\n return (item.children?.length ?? 0) > 0;\n }\n\n protected linkActive(link: SidebarNavLink): boolean {\n const routerLink = link.routerLink;\n\n if (!routerLink) {\n return false;\n }\n\n // Touch currentUrl so the check re-evaluates on every navigation (OnPush).\n this.currentUrl();\n\n // Resolve through the Router rather than string-joining: this handles array\n // commands, relative segments, leading slashes, and matrix/query params\n // correctly — a naive join silently mismatched for array routerLinks.\n const tree = this.router.createUrlTree(\n Array.isArray(routerLink) ? routerLink : [routerLink],\n { relativeTo: this.route },\n );\n\n return this.router.isActive(tree, {\n paths: link.exact ? 'exact' : 'subset',\n queryParams: 'ignored',\n fragment: 'ignored',\n matrixParams: 'ignored',\n });\n }\n\n /** True when the item itself, or any of its children, is the active route. */\n protected sectionActive(item: SidebarNavItem): boolean {\n if (this.linkActive(item)) {\n return true;\n }\n\n return (item.children ?? []).some((child) => this.linkActive(child));\n }\n\n /**\n * Whether a parent discloses its children inline (expanded rail only).\n * Disclosure is owned entirely by `openIds` — the active section is seeded\n * into it by the auto-open effect, so it starts open yet can still be\n * collapsed by clicking the parent (the effect only re-opens on navigation).\n */\n protected isOpen(item: SidebarNavItem): boolean {\n return this.openIds().has(item.id);\n }\n\n // ===== INTERACTIONS =====\n /** Parent row click: flyout in the rail, inline disclosure when expanded. */\n protected onParentClick(item: SidebarNavItem, rowEl: HTMLElement): void {\n if (this.isCollapsed()) {\n this.toggleFlyout(item, rowEl);\n\n return;\n }\n\n this.openIds.update((set) => {\n const next = new Set(set);\n\n if (next.has(item.id)) {\n next.delete(item.id);\n } else {\n next.add(item.id);\n }\n\n return next;\n });\n }\n\n /** Leaf / child / flyout link click — navigation is via routerLink; tidy up. */\n protected onLinkClick(): void {\n this.closeFlyout();\n this.shell?.dismissSidenav();\n }\n\n // ===== FLYOUT (collapsed parent) =====\n private toggleFlyout(item: SidebarNavItem, rowEl: HTMLElement): void {\n if (this.flyoutItem()?.id === item.id) {\n this.closeFlyout();\n\n return;\n }\n\n this.openFlyout(item, rowEl);\n }\n\n private openFlyout(item: SidebarNavItem, rowEl: HTMLElement): void {\n this.closeFlyout();\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(rowEl)\n // Nudge the panel back into the viewport when a low trigger row would push\n // its (now height-capped) box off the bottom edge.\n .withPush(true)\n .withPositions([\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n offsetX: 8,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top',\n offsetX: -8,\n },\n ]);\n\n const overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n panelClass: 'fk-sidebar-nav__flyout',\n // Dispose on browser back/forward so the flyout can't linger over a new\n // page (matches fk-drawer). Programmatic navigation is covered by the\n // route-change effect in the constructor.\n disposeOnNavigation: true,\n });\n\n this.overlayRef = overlayRef;\n this.flyoutOrigin = rowEl;\n this.flyoutItem.set(item);\n overlayRef.attach(\n new TemplatePortal(this.flyoutTpl(), this.vcr, { $implicit: item }),\n );\n\n // After the panel renders: bring the active item into view (so a selection\n // deep in a long, scrolled list is visible on reopen, matching a native\n // select), and point the caret at the trigger's center now that CDK has\n // applied (and possibly pushed) the panel's final position.\n afterNextRender(\n () => {\n this.scrollActiveItemIntoView(overlayRef.overlayElement);\n this.positionFlyoutCaret(overlayRef.overlayElement);\n },\n { injector: this.injector },\n );\n\n // Scope the event subscriptions to this overlay's lifetime via a\n // Subscription torn down in closeFlyout() — not to the component lifetime,\n // and not relying on CDK completing the streams on dispose.\n const subscriptions = new Subscription();\n\n // Re-point the caret whenever CDK repositions the panel (push on open, or a\n // reposition while scrolling) so it keeps tracking the trigger's center.\n subscriptions.add(\n positionStrategy.positionChanges.subscribe(() =>\n this.positionFlyoutCaret(overlayRef.overlayElement),\n ),\n );\n\n subscriptions.add(\n overlayRef.outsidePointerEvents().subscribe((event) => {\n // Ignore clicks on the trigger row itself — the row's own click handler\n // toggles the flyout, so closing here would just let it reopen.\n const target = event.target as Node | null;\n\n if (target && this.flyoutOrigin?.contains(target)) {\n return;\n }\n\n this.closeFlyout();\n }),\n );\n\n subscriptions.add(\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n this.closeFlyout();\n }\n }),\n );\n\n this.flyoutSubs = subscriptions;\n }\n\n private closeFlyout(): void {\n this.flyoutSubs?.unsubscribe();\n this.flyoutSubs = null;\n this.overlayRef?.dispose();\n this.overlayRef = null;\n this.flyoutOrigin = null;\n this.flyoutItem.set(null);\n }\n\n /**\n * Center the active flyout item within its scroll viewport. No-op when there\n * is no active item (nothing selected) or the list isn't scrolled — the\n * `scrollTop` write clamps, so a short list simply stays at the top. Operates\n * only on the items container's own `scrollTop`, never `scrollIntoView`, so it\n * can't perturb the page or the overlay position.\n */\n private scrollActiveItemIntoView(overlayEl: HTMLElement): void {\n const container = overlayEl.querySelector<HTMLElement>(\n '.fk-sidebar-nav__flyout-items',\n );\n const active = container?.querySelector<HTMLElement>(\n '.fk-sidebar-nav__flyout-item--active',\n );\n\n if (!container || !active) {\n return;\n }\n\n const containerBox = container.getBoundingClientRect();\n const activeBox = active.getBoundingClientRect();\n const delta =\n activeBox.top -\n containerBox.top -\n (container.clientHeight - activeBox.height) / 2;\n\n container.scrollTop += delta;\n }\n\n /**\n * Point the flyout caret at the trigger row's vertical center. The caret is\n * absolutely positioned on the panel, so a fixed `top` drifts off the icon as\n * soon as `withPush` (or a flip) shifts the panel; deriving it from the live\n * trigger and panel boxes keeps it aligned. Clamped to the panel so it can't\n * ride off the rounded corners when the trigger sits beyond the panel's span.\n */\n private positionFlyoutCaret(overlayEl: HTMLElement): void {\n const origin = this.flyoutOrigin;\n const panel = overlayEl.querySelector<HTMLElement>(\n '.fk-sidebar-nav__flyout-panel',\n );\n\n if (!origin || !panel) {\n return;\n }\n\n const originBox = origin.getBoundingClientRect();\n const panelBox = panel.getBoundingClientRect();\n\n const caretSize = 11; // px — matches the ::before square\n const edge = 12; // keep the caret clear of the panel's rounded corners\n const center = originBox.top + originBox.height / 2 - panelBox.top;\n const top = Math.max(\n edge,\n Math.min(center - caretSize / 2, panelBox.height - edge - caretSize),\n );\n\n panel.style.setProperty('--fk-sidebar-nav-flyout-caret-top', `${top}px`);\n }\n}\n\n/** Strip query string and fragment so URL comparison matches route paths. */\nfunction stripUrl(url: string): string {\n return url.split('?')[0].split('#')[0];\n}\n","@for (group of model(); track $index) {\n <div class=\"fk-sidebar-nav__group\">\n @if (group.label) {\n <div class=\"fk-sidebar-nav__group-label\">{{ group.label }}</div>\n }\n <div class=\"fk-sidebar-nav__divider\" aria-hidden=\"true\"></div>\n\n <ul class=\"fk-sidebar-nav__list\">\n @for (item of group.items; track item.id) {\n <li class=\"fk-sidebar-nav__item\">\n @if (isParent(item)) {\n <!-- PARENT — disclosure row -->\n <button\n #row\n type=\"button\"\n class=\"fk-sidebar-nav__row fk-sidebar-nav__row--parent\"\n [class.fk-sidebar-nav__row--branch]=\"sectionActive(item)\"\n [attr.aria-expanded]=\"\n isCollapsed() ? flyoutItem()?.id === item.id : isOpen(item)\n \"\n [attr.aria-haspopup]=\"isCollapsed() ? 'true' : null\"\n [attr.aria-label]=\"isCollapsed() ? item.label : null\"\n [fkTooltip]=\"item.label\"\n [fkTooltipDisabled]=\"!isCollapsed()\"\n fkTooltipPosition=\"right\"\n (click)=\"onParentClick(item, row)\"\n >\n @if (leadingTemplate(item); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n } @else if (item.icon) {\n <fk-icon\n class=\"fk-sidebar-nav__icon\"\n [name]=\"item.icon\"\n size=\"sm\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{ item.label }}</span>\n <span\n class=\"fk-sidebar-nav__chevron\"\n [class.fk-sidebar-nav__chevron--open]=\"isOpen(item)\"\n aria-hidden=\"true\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 18 18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.75 4.5L11.25 9L6.75 13.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </span>\n </button>\n\n @if (!isCollapsed() && isOpen(item)) {\n <ul class=\"fk-sidebar-nav__children\">\n @for (child of item.children; track child.id) {\n @if (child.heading) {\n <li class=\"fk-sidebar-nav__subgroup\">\n <span class=\"fk-sidebar-nav__subgroup-title\">{{\n child.label\n }}</span>\n </li>\n } @else {\n <li>\n <a\n class=\"fk-sidebar-nav__child\"\n [class.fk-sidebar-nav__child--active]=\"\n linkActive(child)\n \"\n [attr.aria-current]=\"linkActive(child) ? 'page' : null\"\n [routerLink]=\"child.routerLink\"\n (click)=\"onLinkClick()\"\n >\n @if (leadingTemplate(child); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{\n child.label\n }}</span>\n </a>\n </li>\n }\n }\n </ul>\n }\n } @else {\n <!-- LEAF — direct link -->\n <a\n class=\"fk-sidebar-nav__row\"\n [class.fk-sidebar-nav__row--active]=\"linkActive(item)\"\n [attr.aria-current]=\"linkActive(item) ? 'page' : null\"\n [routerLink]=\"item.routerLink\"\n [attr.aria-label]=\"isCollapsed() ? item.label : null\"\n [fkTooltip]=\"item.label\"\n [fkTooltipDisabled]=\"!isCollapsed()\"\n fkTooltipPosition=\"right\"\n (click)=\"onLinkClick()\"\n >\n @if (leadingTemplate(item); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n } @else if (item.icon) {\n <fk-icon\n class=\"fk-sidebar-nav__icon\"\n [name]=\"item.icon\"\n size=\"sm\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{ item.label }}</span>\n </a>\n }\n </li>\n }\n </ul>\n </div>\n}\n\n<!-- Flyout panel for a collapsed parent (anchored beside the rail via CDK Overlay) -->\n<ng-template #flyoutTpl let-item>\n <!--\n A labelled group of navigation links — not an ARIA `menu`. Menu semantics\n promise roving arrow-key focus we don't implement (these are Tab-navigated\n links), so `role=\"group\"` + `aria-label` is the honest, valid structure.\n -->\n <div\n class=\"fk-sidebar-nav__flyout-panel\"\n role=\"group\"\n [attr.aria-label]=\"item.label\"\n >\n <!-- Decorative: the group is already named by aria-label, so the visual\n title/icon would only repeat it to assistive tech. -->\n <div class=\"fk-sidebar-nav__flyout-head\" aria-hidden=\"true\">\n @if (item.icon) {\n <span class=\"fk-sidebar-nav__flyout-icon\">\n <fk-icon [name]=\"item.icon\" size=\"sm\" />\n </span>\n }\n <span class=\"fk-sidebar-nav__flyout-title\">{{ item.label }}</span>\n </div>\n\n <!--\n The items scroll inside their own bounded container, not the panel: the\n panel hosts the caret (::before) which sits outside its left edge, so\n putting overflow on the panel itself would clip it.\n -->\n <div class=\"fk-sidebar-nav__flyout-items\">\n @for (child of item.children; track child.id) {\n @if (child.heading) {\n <span class=\"fk-sidebar-nav__flyout-subgroup\">{{ child.label }}</span>\n } @else {\n <a\n class=\"fk-sidebar-nav__flyout-item\"\n [class.fk-sidebar-nav__flyout-item--active]=\"linkActive(child)\"\n [attr.aria-current]=\"linkActive(child) ? 'page' : null\"\n [routerLink]=\"child.routerLink\"\n (click)=\"onLinkClick()\"\n >\n @if (leadingTemplate(child); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{ child.label }}</span>\n </a>\n }\n }\n </div>\n </div>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\n\n/**\n * The fixed footer chrome for {@link DialogShellComponent} — an optional muted\n * note on the left, then the projected action buttons pushed to the right,\n * above a top divider. Paired with {@link DialogHeaderComponent} so every\n * dialog shares the same chrome.\n *\n * The note icon is optional and degrades gracefully — an empty `noteIcon`\n * simply renders no glyph.\n *\n * ```html\n * <fk-dialog-footer note=\"Takes effect immediately\" noteIcon=\"power\">\n * <fk-button variant=\"outline\" (click)=\"cancel()\">Cancel</fk-button>\n * <fk-button variant=\"primary\" type=\"submit\">Save</fk-button>\n * </fk-dialog-footer>\n * ```\n */\n@Component({\n selector: 'fk-dialog-footer',\n standalone: true,\n imports: [IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dialog-footer.component.html',\n styleUrl: './dialog-footer.component.scss',\n})\nexport class DialogFooterComponent {\n // ===== INPUTS =====\n /** Optional muted note shown on the left (e.g. \"Takes effect immediately\"). */\n readonly note = input<string>('');\n /** Optional icon glyph rendered before the note. Empty renders no glyph. */\n readonly noteIcon = input<string>('');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-dialog-footer', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (note()) {\n <span class=\"fk-dialog-footer__note\">\n @if (noteIcon()) {\n <fk-icon\n class=\"fk-dialog-footer__note-icon\"\n [name]=\"noteIcon()\"\n size=\"sm\"\n />\n }\n {{ note() }}\n </span>\n}\n\n<span class=\"fk-dialog-footer__spacer\"></span>\n\n<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n} from '@angular/core';\n\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { TextComponent } from '@frame-kit/ui-ng/core/text';\nimport { IconBadgeComponent } from '@frame-kit/ui-ng/ui/icon-badge';\n\nimport type { DialogHeaderTint } from './dialog-header.types';\n\n/** The tint tone → the CSS-variable pair driving the icon tile + title accent.\n * Each reference is two-tier (component token → semantic token) so the header\n * renders correctly with no theme loaded and can be retinted per theme. */\nconst TINTS: Record<DialogHeaderTint, { color: string; background: string }> = {\n brand: {\n color:\n 'var(--fk-dialog-header-tint-brand-color, var(--fk-color-primary, #2563eb))',\n background:\n 'var(--fk-dialog-header-tint-brand-bg, var(--fk-color-primary-light, #eff6ff))',\n },\n warning: {\n color:\n 'var(--fk-dialog-header-tint-warning-color, var(--fk-color-warning, #d97706))',\n background:\n 'var(--fk-dialog-header-tint-warning-bg, var(--fk-color-warning-subtle, #fffbeb))',\n },\n success: {\n color:\n 'var(--fk-dialog-header-tint-success-color, var(--fk-color-success, #16a34a))',\n background:\n 'var(--fk-dialog-header-tint-success-bg, var(--fk-color-success-subtle, #f0fdf4))',\n },\n danger: {\n color:\n 'var(--fk-dialog-header-tint-danger-color, var(--fk-color-danger, #dc2626))',\n background:\n 'var(--fk-dialog-header-tint-danger-bg, var(--fk-color-danger-light, #fee2e2))',\n },\n accent: {\n color: 'var(--fk-dialog-header-tint-accent-color, #7c3aed)',\n background: 'var(--fk-dialog-header-tint-accent-bg, #f5f3ff)',\n },\n};\n\n/**\n * The fixed header chrome for {@link DialogShellComponent} — a tinted icon\n * tile, a title with an optional trailing accent, an optional mono subtitle,\n * and a close button. Every dialog wears the same chrome; only the icon, tint,\n * and text differ, so this centralises it instead of each dialog hand-rolling\n * the markup.\n *\n * Text is passed in as plain inputs (no i18n dependency), and the icon is\n * optional — an empty `icon` simply renders no tile, so the header degrades\n * gracefully rather than showing a broken glyph.\n *\n * ```html\n * <fk-dialog-header\n * icon=\"user-ban\"\n * tint=\"warning\"\n * title=\"Deactivate identity\"\n * subtitle=\"Acme Inc. · Members\"\n * (dismiss)=\"close()\"\n * />\n * ```\n */\n@Component({\n selector: 'fk-dialog-header',\n standalone: true,\n imports: [\n HeadlineComponent,\n IconBadgeComponent,\n IconComponent,\n TextComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dialog-header.component.html',\n styleUrl: './dialog-header.component.scss',\n})\nexport class DialogHeaderComponent {\n // ===== INPUTS =====\n /** Icon glyph name for the tile. Empty renders no tile. */\n readonly icon = input<string>('');\n /** Colour accent for the icon tile + title accent. */\n readonly tint = input<DialogHeaderTint>('brand');\n /** Dialog title. */\n readonly title = input.required<string>();\n /** Optional trailing accent appended to the title, rendered in the tint colour. */\n readonly titleAccent = input<string>('');\n /** Optional mono subtitle under the title. */\n readonly subtitle = input<string>('');\n /** Accessible label for the close button. */\n readonly closeLabel = input<string>('Close');\n\n // ===== OUTPUTS =====\n /** Fires when the close button is clicked. */\n readonly dismiss = output<void>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n /** The tint's `{ color, background }` CSS-variable pair. */\n protected readonly tintVars = computed(() => TINTS[this.tint()]);\n\n readonly classes = computed(() =>\n ['fk-dialog-header', `fk-dialog-header--${this.tint()}`, this.className()]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (icon()) {\n <fk-icon-badge\n class=\"fk-dialog-header__icon\"\n [name]=\"icon()\"\n [color]=\"tintVars().color\"\n [backgroundColor]=\"tintVars().background\"\n shape=\"rounded\"\n size=\"md\"\n />\n}\n\n<div class=\"fk-dialog-header__titles\">\n <fk-headline\n class=\"fk-dialog-header__title\"\n [level]=\"2\"\n fontSize=\"var(--fk-dialog-header-title-font-size, 1.25rem)\"\n >\n {{ title() }}\n @if (titleAccent()) {\n <span class=\"fk-dialog-header__accent\" [style.color]=\"tintVars().color\">\n {{ titleAccent() }}</span\n >\n }\n </fk-headline>\n @if (subtitle()) {\n <fk-text class=\"fk-dialog-header__subtitle\" variant=\"small\">\n {{ subtitle() }}\n </fk-text>\n }\n</div>\n\n<button\n type=\"button\"\n class=\"fk-dialog-header__close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"dismiss.emit()\"\n>\n <fk-icon name=\"close\" size=\"sm\" />\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { ButtonComponent } from '@frame-kit/ui-ng/ui/button';\n\nimport { DialogFooterComponent } from '../dialog-footer/dialog-footer.component';\nimport type { DialogHeaderTint } from '../dialog-header/dialog-header.types';\nimport { DialogHeaderComponent } from '../dialog-header/dialog-header.component';\nimport type { DialogConfirmVariant } from './dialog-shell.types';\n\n/**\n * The one dialog shell every dashboard dialog is built from. It owns the fixed\n * chrome — the tinted icon-tile header (title / accent / subtitle + close) and\n * the footer (muted note + the standard Cancel/confirm buttons) — so individual\n * dialogs stop re-declaring any of it. Everything unique to a dialog lives in\n * the projected **content region**.\n *\n * The shell carries no i18n dependency and no domain data: every label is a\n * plain input (with English defaults for the built-in Cancel button), and the\n * icons are inputs that degrade gracefully when empty. Render it inside the\n * consuming app's own `fk-dialog` (opened bare — `header: null, closable:\n * false` — with an `ariaLabel` for an accessible name).\n *\n * The common case needs zero footer markup — set the confirm label/variant and\n * handle the outputs:\n *\n * ```html\n * <fk-dialog-shell\n * icon=\"user-ban\"\n * tint=\"warning\"\n * title=\"Deactivate identity\"\n * [subtitle]=\"subtitle\"\n * footerNote=\"Sign-in blocked\"\n * footerNoteIcon=\"power\"\n * confirmLabel=\"Deactivate\"\n * confirmIcon=\"user-ban\"\n * confirmVariant=\"warning\"\n * [confirmDisabled]=\"!ready()\"\n * (confirm)=\"onConfirm()\"\n * (dismiss)=\"onCancel()\"\n * >\n * <!-- content region: lead, description, cards, callouts … -->\n * </fk-dialog-shell>\n * ```\n *\n * Escape hatches for the exceptions:\n * - leave `confirmLabel` empty and project buttons into the `dialogFooter` slot\n * to keep the footer chrome but use custom buttons (e.g. a form submit);\n * - set `[customHeader]=\"true\"` and project into the `header` slot to replace\n * the whole header;\n * - set `[customFooter]=\"true\"` and project into the `footer` slot to replace\n * the whole footer.\n */\n@Component({\n selector: 'fk-dialog-shell',\n standalone: true,\n imports: [\n ButtonComponent,\n IconComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dialog-shell.component.html',\n styleUrl: './dialog-shell.component.scss',\n})\nexport class DialogShellComponent {\n // ===== INPUTS =====\n /** Icon glyph for the header tile. Empty renders no tile. */\n readonly icon = input<string>('');\n /** Colour accent for the header tile. */\n readonly tint = input<DialogHeaderTint>('brand');\n /** Header title. */\n readonly title = input.required<string>();\n /** Optional trailing accent appended to the title in the tint colour. */\n readonly titleAccent = input<string>('');\n /** Optional mono subtitle under the title. */\n readonly subtitle = input<string>('');\n /** Optional muted footer note on the left (e.g. \"Permanent\"). */\n readonly footerNote = input<string>('');\n /** Optional icon rendered before the footer note. */\n readonly footerNoteIcon = input<string>('');\n /**\n * Confirm-button label. When set, the shell renders the standard\n * Cancel + confirm pair; leave empty to project custom buttons into the\n * `dialogFooter` slot instead.\n */\n readonly confirmLabel = input<string>('');\n /** Optional leading icon on the confirm button. */\n readonly confirmIcon = input<string>('');\n /** Confirm-button colour — `primary` (default), `danger`, or `warning`. */\n readonly confirmVariant = input<DialogConfirmVariant>('primary');\n /** Disables the confirm button (e.g. while a type-to-confirm is unmet). */\n readonly confirmDisabled = input<boolean>(false);\n /** Cancel-button label. Defaults to `Cancel`. */\n readonly cancelLabel = input<string>('Cancel');\n /** Accessible label for the header's close button. */\n readonly closeLabel = input<string>('Close');\n /**\n * Escape hatch for the rare dialog that needs a bespoke header. When true,\n * the default `fk-dialog-header` (icon tile + title + subtitle) is suppressed\n * and whatever is projected into the `header` slot is rendered raw instead.\n */\n readonly customHeader = input<boolean>(false);\n /**\n * Escape hatch for the rare dialog that needs a bespoke footer. When true,\n * the default `fk-dialog-footer` (note + buttons) is suppressed and whatever\n * is projected into the `footer` slot is rendered raw instead.\n */\n readonly customFooter = input<boolean>(false);\n\n // ===== OUTPUTS =====\n /** Fires when the header close button OR the Cancel button is clicked. */\n readonly dismiss = output<void>();\n /** Fires when the confirm button is clicked. */\n readonly confirm = output<void>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n /** `warning` renders as a retinted `danger` fk-button; others map directly. */\n protected readonly confirmButtonVariant = computed<'primary' | 'danger'>(\n () => {\n const variant = this.confirmVariant();\n\n return variant === 'warning' ? 'danger' : variant;\n },\n );\n\n readonly classes = computed(() =>\n ['fk-dialog-shell', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","@if (customHeader()) {\n <ng-content select=\"[header]\" />\n} @else {\n <fk-dialog-header\n class=\"fk-dialog-shell__header\"\n [icon]=\"icon()\"\n [tint]=\"tint()\"\n [title]=\"title()\"\n [titleAccent]=\"titleAccent()\"\n [subtitle]=\"subtitle()\"\n [closeLabel]=\"closeLabel()\"\n (dismiss)=\"dismiss.emit()\"\n />\n}\n\n<div class=\"fk-dialog-shell__body\">\n <ng-content />\n</div>\n\n@if (customFooter()) {\n <ng-content select=\"[footer]\" />\n} @else {\n <fk-dialog-footer [note]=\"footerNote()\" [noteIcon]=\"footerNoteIcon()\">\n @if (confirmLabel()) {\n <fk-button variant=\"outline\" type=\"button\" (click)=\"dismiss.emit()\">\n {{ cancelLabel() }}\n </fk-button>\n <fk-button\n class=\"fk-dialog-shell__confirm\"\n [class.fk-dialog-shell__confirm--danger]=\"confirmVariant() === 'danger'\"\n [class.fk-dialog-shell__confirm--warning]=\"\n confirmVariant() === 'warning'\n \"\n [variant]=\"confirmButtonVariant()\"\n type=\"button\"\n [disabled]=\"confirmDisabled()\"\n (click)=\"confirm.emit()\"\n >\n @if (confirmIcon()) {\n <fk-icon fkButtonIconStart [name]=\"confirmIcon()\" size=\"sm\" />\n }\n {{ confirmLabel() }}\n </fk-button>\n } @else {\n <ng-content select=\"[dialogFooter]\" />\n }\n </fk-dialog-footer>\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { CdkDragEnd } from '@angular/cdk/drag-drop';\nimport { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { ButtonComponent } from '@frame-kit/ui-ng/ui/button';\n\nimport type {\n OnboardingStep,\n OnboardingSubstep,\n OnboardingSubstepToggle,\n} from './onboarding-guide.types';\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface Rect {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ninterface PersistedState {\n collapsed?: boolean;\n pos?: Point;\n}\n\n/** Pointer travel below this is a click, not a drag. */\nconst DRAG_THRESHOLD = 3;\n\n/**\n * A floating, draggable onboarding-progress widget. It presents a checklist of\n * steps with a progress bar, collapses to a compact pill with a progress ring,\n * and can be dragged around (CDK drag). It renders over the app in a fixed\n * layer — drop it once near the app root.\n *\n * **Presentational, not clever.** It renders exactly what it is given and\n * reports what the user did — it derives no step state of its own. Which step\n * is open (`openStepId`), which are done or pending (`steps`), whether it is\n * collapsed (`collapsed`): all inputs. When a step should advance, when a\n * context switch should re-focus the guide, when a choice has gone stale —\n * all consumer decisions, because the consumer knows *what changed*, while\n * the widget only ever sees a new array.\n *\n * **Controlled model, no domain data.** The `steps` model is a required,\n * reactive input: the widget is a pure view of it and emits events when the\n * user acts (`stepAction`, `stepMarkDone`, `stepSecondaryAction`,\n * `substepToggle`, `footerAction`). The consumer owns the step state — so if\n * it is keyed by, say, the active account or environment, swapping the input\n * re-renders the widget instantly. The widget never persists step state.\n *\n * **Collapsed and openStepId are two-way models.** Bind `[(collapsed)]` /\n * `[(openStepId)]` to drive the card ↔ pill swap and the expanded row from\n * outside; the widget writes them only in response to a direct user action.\n *\n * **Container-aware.** `boundary` (a selector or element) confines both\n * dragging and the widget's resting position to a region of the app — e.g. a\n * dashboard's content area, so the widget can never cover navigation or a\n * footer. The default resting spot is the boundary's bottom-right corner, and\n * the widget re-clamps itself whenever its own footprint changes (pill ↔ card\n * swap, a step expanding) or the viewport resizes — a corner-parked pill that\n * expands into a large card pulls itself fully back into view. Until the user\n * actually drags it, it stays anchored to the bottom-right corner.\n *\n * **Presentation state is internal + optionally persisted.** Collapsed and\n * drag position persist to `localStorage` under `storageKey`; pass\n * `storageKey = null` for session-only behavior (e.g. when a consumer-side\n * store owns presentation policy).\n *\n * **Opinionated but themeable.** It ships a house look out of the box; all\n * colour flows through `--fk-onboarding-guide-*` tokens, so overriding those\n * (e.g. pointing them at a brand scale) retints it without touching the markup.\n *\n * ```html\n * <fk-onboarding-guide\n * [steps]=\"steps()\"\n * title=\"Setup guide\"\n * boundary=\".app-content\"\n * [storageKey]=\"null\"\n * [(collapsed)]=\"collapsed\"\n * (stepAction)=\"onStart($event)\"\n * (substepToggle)=\"onToggle($event)\"\n * (footerAction)=\"onGoLive()\"\n * (dismiss)=\"onDismiss()\"\n * />\n * ```\n */\n@Component({\n selector: 'fk-onboarding-guide',\n standalone: true,\n imports: [CdkDragHandle, ButtonComponent, IconComponent],\n hostDirectives: [CdkDrag],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './onboarding-guide.component.html',\n styleUrl: './onboarding-guide.component.scss',\n})\nexport class OnboardingGuideComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly drag = inject(CdkDrag);\n private readonly destroyRef = inject(DestroyRef);\n\n // ===== INPUTS =====\n /** The step model. Controlled by the consumer; the widget is a view of it. */\n readonly steps = input.required<OnboardingStep[]>();\n /** Widget title. */\n readonly title = input<string>('Setup guide');\n /**\n * `localStorage` key for the collapsed + drag-position preferences.\n * `null` disables persistence entirely — presentation state then lives and\n * dies with the component instance (or with whatever the consumer binds).\n */\n readonly storageKey = input<string | null>('fk-onboarding-guide');\n /**\n * Region the widget is confined to: a CSS selector or an element. Both\n * dragging and the widget's resting position are clamped inside it. `null`\n * (the default) confines to the viewport.\n */\n readonly boundary = input<string | HTMLElement | null>(null);\n /** Breathing room kept between the widget and the boundary's edges. */\n readonly boundaryMargin = input<number>(24);\n /** Shows the rename (edit) affordance next to the title. */\n readonly renamable = input<boolean>(false);\n /** Shows the secondary \"mark this step done\" action on leaf steps. */\n readonly showMarkDone = input<boolean>(true);\n\n // --- Text (English defaults; pass translated strings as needed) ---\n /** Default CTA label when a step doesn't supply its own `actionLabel`. */\n readonly startLabel = input<string>('Start');\n /** Secondary \"mark this step done\" action label. */\n readonly markDoneLabel = input<string>('Mark done');\n /** Footer action label (e.g. \"Go live\"). `null` hides the footer action. */\n readonly footerActionLabel = input<string | null>('Go live');\n /** Footer noun for the \"{done} of {total} {stepsWord} {doneWord}\" summary. */\n readonly stepsWord = input<string>('steps');\n /** Footer verb for the summary. */\n readonly doneWord = input<string>('done');\n /** Collapsed-pill suffix, e.g. \"3 steps left\". */\n readonly stepsLeftWord = input<string>('left');\n /** Collapsed-pill copy shown when everything is complete. */\n readonly allDoneLabel = input<string>('All set');\n /** ARIA labels for the icon-only header controls. */\n readonly renameLabel = input<string>('Rename');\n readonly collapseLabel = input<string>('Collapse');\n readonly dismissLabel = input<string>('Dismiss');\n readonly expandLabel = input<string>('Expand');\n\n // --- Icon glyph names (resolved by the app's icon registry) ---\n readonly checkIcon = input<string>('check');\n readonly caretIcon = input<string>('chevron-down');\n readonly editIcon = input<string>('pen');\n readonly collapseIcon = input<string>('collapse');\n readonly dismissIcon = input<string>('close');\n readonly expandIcon = input<string>('expand');\n readonly actionIcon = input<string>('arrow-right');\n\n // ===== MODEL =====\n /**\n * Whether the widget is collapsed to the pill. Two-way bindable so a\n * consumer-side policy (auto-open on context switches, banner-triggered\n * opens) can drive the card ↔ pill swap; unbound, the widget manages it.\n */\n readonly collapsed = model<boolean>(false);\n\n // ===== OUTPUTS =====\n /** A step's primary CTA was clicked. Emits the step id. */\n readonly stepAction = output<string>();\n /** A step's \"mark done\" was clicked. Emits the step id. */\n readonly stepMarkDone = output<string>();\n /** A step's secondary text-action was clicked. Emits the step id. */\n readonly stepSecondaryAction = output<string>();\n /** A substep checkbox was toggled. */\n readonly substepToggle = output<OnboardingSubstepToggle>();\n /** The footer action was invoked. */\n readonly footerAction = output<void>();\n /** The rename (edit) affordance was clicked; the consumer owns renaming. */\n readonly renameClick = output<void>();\n /** The dismiss control was clicked; the consumer decides whether to hide it. */\n readonly dismiss = output<void>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== PRESENTATION STATE =====\n protected readonly dragPosition = signal<Point>({ x: 0, y: 0 });\n\n /** True immediately after a real drag, so the drag-handle's click (e.g. the\n * pill's expand) is suppressed rather than firing at the drop point. */\n private justDragged = false;\n\n /**\n * True once the user has deliberately placed the widget (a real drag now,\n * or a persisted position from a previous session). Until then the widget\n * re-anchors to the boundary's bottom-right corner on every viewport or\n * footprint change instead of merely clamping its current spot.\n */\n private userMoved = false;\n\n private footprintObserver: ResizeObserver | null = null;\n\n /** Guards the one-time preference restore in `hydrateOnce`. */\n private hydrated = false;\n\n /** True between CDK's drag start and drop — `reposition` stands down. */\n private dragging = false;\n\n /** The boundary element currently under observation (if any). */\n private observedBoundary: Element | null = null;\n\n /**\n * The expanded step, or `null` for none. Fully controlled: the widget\n * writes it only when the user toggles a row, and never infers a value\n * of its own — which step should be open, when to advance to the next\n * one, and whether a context switch should re-focus the guide are all\n * decisions the consumer owns (it knows what changed; the widget only\n * sees a new array).\n */\n readonly openStepId = model<string | null>(null);\n\n // ===== DERIVED =====\n protected readonly total = computed(() => this.steps().length);\n protected readonly doneCount = computed(\n () => this.steps().filter((s) => this.isComplete(s)).length,\n );\n protected readonly percent = computed(() => {\n const total = this.total();\n\n return total === 0 ? 0 : Math.round((this.doneCount() / total) * 100);\n });\n protected readonly stepsLeft = computed(\n () => this.total() - this.doneCount(),\n );\n protected readonly complete = computed(\n () => this.total() > 0 && this.stepsLeft() === 0,\n );\n\n /** Circumference for the pill's progress ring (r = 16). */\n protected readonly ringCircumference = 2 * Math.PI * 16;\n protected readonly ringOffset = computed(() => {\n const total = this.total();\n const fraction = total === 0 ? 0 : this.doneCount() / total;\n\n return this.ringCircumference * (1 - fraction);\n });\n\n readonly classes = computed(() =>\n [\n 'fk-onboarding-guide',\n this.collapsed() ? 'fk-onboarding-guide--collapsed' : '',\n this.complete() ? 'fk-onboarding-guide--complete' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n constructor() {\n this.drag.started\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => (this.dragging = true));\n\n this.drag.ended\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.onDragEnded(event));\n\n // The card ↔ pill swap changes the footprint drastically; reposition\n // right after the swap renders. The ResizeObserver covers the same\n // case, but its deliveries ride the rendering loop — which pauses in\n // occluded/backgrounded tabs — so the swap gets a deterministic,\n // task-scheduled companion (layout can be forced without frames).\n effect(() => {\n this.collapsed();\n\n untracked(() => {\n if (typeof window !== 'undefined') {\n setTimeout(() => this.reposition());\n }\n });\n });\n\n // Confine live dragging to the boundary — CDK enforces it during the\n // drag, and `clamp` applies the same region to programmatic placement.\n // The assignment is unconditional so clearing the input releases CDK's\n // constraint too (an empty string disables it), and the position\n // re-clamps immediately so a runtime boundary change moves the widget\n // into the new region instead of waiting for the next geometry trigger.\n // `boundaryMargin` is tracked alongside `boundary` so a runtime margin\n // change re-clamps immediately instead of waiting for the next\n // geometry trigger. Hydration runs first, synchronously, on the very\n // first execution — during initial change detection, BEFORE the first\n // paint — so a returning user's saved position and collapsed state\n // apply without a visible jump from the automatic anchor.\n effect(() => {\n const boundary = this.boundary();\n\n this.boundaryMargin();\n\n untracked(() => {\n this.hydrateOnce();\n this.drag.boundaryElement = boundary ?? '';\n this.syncBoundaryObservation();\n this.reposition();\n });\n });\n\n afterNextRender(() => {\n this.watchGeometry();\n // Re-clamp once real layout has settled — first-CD measurements are\n // forced synchronously and can differ slightly (fonts, late styles).\n this.reposition();\n });\n\n this.destroyRef.onDestroy(() => {\n this.footprintObserver?.disconnect();\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.onViewportResize);\n }\n });\n }\n\n // ===== COMPLETION LOGIC =====\n isComplete(step: OnboardingStep): boolean {\n if (step.substeps && step.substeps.length > 0) {\n return step.substeps.every((sub) => sub.done);\n }\n\n return step.done;\n }\n\n isPending(step: OnboardingStep): boolean {\n return !this.isComplete(step) && step.pending === true;\n }\n\n protected isActive(step: OnboardingStep): boolean {\n return !this.isComplete(step) && this.openStepId() === step.id;\n }\n\n protected actionLabelFor(step: OnboardingStep): string {\n return step.actionLabel || this.startLabel();\n }\n\n // ===== INTERACTIONS =====\n protected toggleStep(stepId: string): void {\n this.openStepId.set(this.openStepId() === stepId ? null : stepId);\n }\n\n protected onAction(step: OnboardingStep): void {\n this.stepAction.emit(step.id);\n }\n\n protected onMarkDone(step: OnboardingStep): void {\n this.stepMarkDone.emit(step.id);\n }\n\n protected onSecondaryAction(step: OnboardingStep): void {\n this.stepSecondaryAction.emit(step.id);\n }\n\n protected onSubstep(step: OnboardingStep, substep: OnboardingSubstep): void {\n this.substepToggle.emit({ stepId: step.id, substepId: substep.id });\n }\n\n protected onCollapse(): void {\n this.setCollapsed(true);\n }\n\n protected onExpand(): void {\n if (this.justDragged) {\n return;\n }\n\n this.setCollapsed(false);\n }\n\n protected onRename(): void {\n this.renameClick.emit();\n }\n\n protected onDismiss(): void {\n this.dismiss.emit();\n }\n\n protected onFooterAction(): void {\n this.footerAction.emit();\n }\n\n private setCollapsed(value: boolean): void {\n this.collapsed.set(value);\n this.persist();\n }\n\n // ===== DRAG =====\n private onDragEnded(event: CdkDragEnd): void {\n this.dragging = false;\n\n const clamped = this.clamp(this.drag.getFreeDragPosition());\n\n this.dragPosition.set(clamped);\n this.drag.setFreeDragPosition(clamped);\n\n const moved =\n Math.abs(event.distance.x) > DRAG_THRESHOLD ||\n Math.abs(event.distance.y) > DRAG_THRESHOLD;\n\n if (moved) {\n this.userMoved = true;\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n this.persist();\n }\n }\n\n // ===== GEOMETRY =====\n /**\n * Keep the resting position valid as the world changes around it. Two\n * signals feed the same repositioning: the viewport resizing, and the\n * widget's own footprint changing (pill ↔ card swap, a step expanding) —\n * the latter is what stops a corner-parked pill from reopening as a card\n * that's mostly off-screen.\n */\n private watchGeometry(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n window.addEventListener('resize', this.onViewportResize);\n\n // Environments without ResizeObserver (some test runners, older\n // runtimes) keep the viewport-resize path; footprint tracking is a\n // progressive enhancement.\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.footprintObserver = new ResizeObserver(() => this.reposition());\n this.footprintObserver.observe(this.host.nativeElement);\n this.syncBoundaryObservation();\n }\n\n /**\n * The boundary region can resize without a viewport resize — a side\n * panel opening, chrome banners toggling — so the confining element is\n * observed alongside the widget's own footprint. Re-synced whenever the\n * `boundary` input changes.\n */\n private syncBoundaryObservation(): void {\n if (!this.footprintObserver) {\n return;\n }\n\n const next = this.resolveBoundaryElement();\n\n if (next === this.observedBoundary) {\n return;\n }\n\n if (this.observedBoundary) {\n this.footprintObserver.unobserve(this.observedBoundary);\n }\n\n if (next) {\n this.footprintObserver.observe(next);\n }\n\n this.observedBoundary = next;\n }\n\n private resolveBoundaryElement(): Element | null {\n const boundary = this.boundary();\n\n if (typeof window === 'undefined' || !boundary) {\n return null;\n }\n\n return typeof boundary === 'string'\n ? document.querySelector(boundary)\n : boundary;\n }\n\n private readonly onViewportResize = (): void => this.reposition();\n\n private reposition(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Never fight a drag in flight: CDK owns the transform until the\n // pointer is released, and writing a position here (a resize or an\n // observer callback can land mid-drag) would tear the widget away\n // from the pointer. `onDragEnded` clamps the drop point anyway.\n if (this.dragging) {\n return;\n }\n\n // A selector boundary may not have matched at mount — re-resolve on\n // every geometry trigger so a late-appearing element gets observed.\n this.syncBoundaryObservation();\n\n const current = this.drag.getFreeDragPosition();\n const target = this.userMoved\n ? this.clamp(current)\n : this.defaultBottomRight();\n\n if (target.x !== current.x || target.y !== current.y) {\n this.dragPosition.set(target);\n this.drag.setFreeDragPosition(target);\n\n // A deliberate placement that just got re-clamped (e.g. the card ↔\n // pill swap) supersedes whatever was stored moments earlier.\n if (this.userMoved) {\n this.persist();\n }\n }\n }\n\n /** The confining region: the `boundary` element's rect, or the viewport. */\n private boundaryRect(): Rect {\n const el = this.resolveBoundaryElement();\n\n if (el) {\n return el.getBoundingClientRect();\n }\n\n return {\n left: 0,\n top: 0,\n right: typeof window === 'undefined' ? 0 : window.innerWidth,\n bottom: typeof window === 'undefined' ? 0 : window.innerHeight,\n };\n }\n\n /**\n * Constrain one axis to `[start + margin, end - size - margin]`.\n *\n * When the region can't fit the widget plus both margins that range is\n * inverted, so the margin is dropped and the widget is fitted to the\n * region's own edges instead — keeping it inside the boundary rather\n * than letting the inset push it out. A widget genuinely larger than\n * its region still overflows (the card has a fixed width and something\n * has to give); it pins to the start edge.\n */\n private clampAxis(\n value: number,\n start: number,\n end: number,\n size: number,\n margin: number,\n ): number {\n const min = start + margin;\n const max = end - size - margin;\n\n if (min <= max) {\n return Math.max(min, Math.min(value, max));\n }\n\n const tightMax = end - size;\n\n if (start <= tightMax) {\n return Math.max(start, Math.min(value, tightMax));\n }\n\n return start;\n }\n\n private clamp(point: Point): Point {\n if (typeof window === 'undefined') {\n return point;\n }\n\n const rect = this.host.nativeElement.getBoundingClientRect();\n const bounds = this.boundaryRect();\n const margin = this.boundaryMargin();\n\n return {\n x: this.clampAxis(point.x, bounds.left, bounds.right, rect.width, margin),\n y: this.clampAxis(\n point.y,\n bounds.top,\n bounds.bottom,\n rect.height,\n margin,\n ),\n };\n }\n\n private defaultBottomRight(): Point {\n if (typeof window === 'undefined') {\n return { x: 0, y: 0 };\n }\n\n const rect = this.host.nativeElement.getBoundingClientRect();\n const bounds = this.boundaryRect();\n const margin = this.boundaryMargin();\n\n // Aim at the bottom-right inset and let the shared clamp resolve it —\n // including the too-narrow-region fallbacks.\n return this.clamp({\n x: bounds.right - rect.width - margin,\n y: bounds.bottom - rect.height - margin,\n });\n }\n\n // ===== PERSISTENCE =====\n /**\n * One-time restore of the persisted preferences, run from the first\n * execution of the boundary effect — inputs are set by then, storage\n * reads are synchronous, and it lands during initial change detection\n * so the restored state is what the first paint shows. The caller's\n * `reposition()` clamps the raw restored position right afterwards.\n */\n private hydrateOnce(): void {\n if (this.hydrated) {\n return;\n }\n\n this.hydrated = true;\n\n const saved = this.read();\n\n // The stored collapsed preference restores only when the model still\n // holds its default — a consumer that mounted the widget with a bound,\n // non-default `collapsed` gave an explicit instruction, and storage\n // must not overwrite it (or echo the stale value back out through\n // `collapsedChange`). Fully controlled usage should disable\n // persistence with `storageKey: null`.\n if (saved.collapsed != null && this.collapsed() === false) {\n this.collapsed.set(saved.collapsed);\n }\n\n if (saved.pos) {\n // A persisted position is a deliberate placement from a previous\n // session — keep honouring it instead of re-anchoring bottom-right.\n this.userMoved = true;\n this.dragPosition.set(saved.pos);\n this.drag.setFreeDragPosition(saved.pos);\n }\n }\n\n private read(): PersistedState {\n const store = this.storage();\n const key = this.storageKey();\n\n if (!store || !key) {\n return {};\n }\n\n try {\n return JSON.parse(store.getItem(key) || '{}');\n } catch {\n return {};\n }\n }\n\n private persist(): void {\n const store = this.storage();\n const key = this.storageKey();\n\n if (!store || !key) {\n return;\n }\n\n // Position is a preference only once the user has actually dragged —\n // persisting the automatic bottom-right anchor would make the next\n // load's hydrate treat it as a deliberate placement and stop the\n // widget from re-anchoring on geometry changes.\n const state: PersistedState = {\n collapsed: this.collapsed(),\n pos: this.userMoved ? this.dragPosition() : undefined,\n };\n\n try {\n store.setItem(key, JSON.stringify(state));\n } catch {\n // Storage unavailable (private mode / quota) — preferences just don't stick.\n }\n }\n\n private storage(): Storage | null {\n try {\n return typeof window === 'undefined' ? null : window.localStorage;\n } catch {\n return null;\n }\n }\n}\n","<!-- ===================== EXPANDED CARD ===================== -->\n<div class=\"fk-onboarding-guide__card\">\n <div class=\"fk-onboarding-guide__head\">\n <div class=\"fk-onboarding-guide__head-top\">\n <span class=\"fk-onboarding-guide__grip\" cdkDragHandle aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"9\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n </span>\n\n <span class=\"fk-onboarding-guide__title\" cdkDragHandle>{{\n title()\n }}</span>\n\n @if (renamable()) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__icon-btn fk-onboarding-guide__edit\"\n [attr.aria-label]=\"renameLabel()\"\n (click)=\"onRename()\"\n >\n <fk-icon [name]=\"editIcon()\" size=\"sm\" />\n </button>\n }\n\n <div class=\"fk-onboarding-guide__head-actions\">\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__icon-btn\"\n [attr.aria-label]=\"collapseLabel()\"\n (click)=\"onCollapse()\"\n >\n <fk-icon [name]=\"collapseIcon()\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__icon-btn\"\n [attr.aria-label]=\"dismissLabel()\"\n (click)=\"onDismiss()\"\n >\n <fk-icon [name]=\"dismissIcon()\" size=\"sm\" />\n </button>\n </div>\n </div>\n\n <div class=\"fk-onboarding-guide__progress\">\n <div\n class=\"fk-onboarding-guide__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"percent()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div\n class=\"fk-onboarding-guide__fill\"\n [style.width.%]=\"percent()\"\n ></div>\n </div>\n <span class=\"fk-onboarding-guide__pct\">{{ percent() }}%</span>\n </div>\n </div>\n\n <div class=\"fk-onboarding-guide__steps\" role=\"list\">\n @for (step of steps(); track step.id) {\n @let done = isComplete(step);\n @let pending = isPending(step);\n @let open = openStepId() === step.id;\n @let active = isActive(step);\n\n <div\n class=\"fk-onboarding-guide__step\"\n role=\"listitem\"\n [class.fk-onboarding-guide__step--done]=\"done\"\n [class.fk-onboarding-guide__step--open]=\"open\"\n >\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__step-row\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggleStep(step.id)\"\n >\n <span\n class=\"fk-onboarding-guide__check\"\n [class.fk-onboarding-guide__check--done]=\"done\"\n [class.fk-onboarding-guide__check--pending]=\"pending\"\n [class.fk-onboarding-guide__check--active]=\"active && !pending\"\n [class.fk-onboarding-guide__check--todo]=\"\n !done && !active && !pending\n \"\n aria-hidden=\"true\"\n >\n @if (done) {\n <fk-icon [name]=\"checkIcon()\" size=\"xs\" />\n } @else if (active || pending) {\n <i class=\"fk-onboarding-guide__dot\"></i>\n }\n </span>\n\n <span class=\"fk-onboarding-guide__step-label\">{{ step.label }}</span>\n\n <span class=\"fk-onboarding-guide__caret\" aria-hidden=\"true\">\n <fk-icon [name]=\"caretIcon()\" size=\"sm\" />\n </span>\n </button>\n\n @if (open) {\n <div class=\"fk-onboarding-guide__step-body\">\n @if (step.substeps && step.substeps.length > 0) {\n @for (sub of step.substeps; track sub.id) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__sub\"\n [class.fk-onboarding-guide__sub--done]=\"sub.done\"\n (click)=\"onSubstep(step, sub)\"\n >\n <span\n class=\"fk-onboarding-guide__sub-check\"\n aria-hidden=\"true\"\n >\n @if (sub.done) {\n <fk-icon [name]=\"checkIcon()\" size=\"xs\" />\n }\n </span>\n <span class=\"fk-onboarding-guide__sub-label\">{{\n sub.label\n }}</span>\n </button>\n }\n } @else {\n @if (step.description) {\n <p class=\"fk-onboarding-guide__desc\">{{ step.description }}</p>\n }\n\n @if (pending && step.pendingNote) {\n <p class=\"fk-onboarding-guide__pending-note\">\n {{ step.pendingNote }}\n </p>\n }\n\n @if (!done || step.secondaryActionLabel) {\n <div class=\"fk-onboarding-guide__actions\">\n @if (!done) {\n <fk-button\n variant=\"primary\"\n size=\"sm\"\n (click)=\"onAction(step)\"\n >\n {{ actionLabelFor(step) }}\n <fk-icon\n fkButtonIconEnd\n [name]=\"actionIcon()\"\n size=\"xs\"\n />\n </fk-button>\n\n @if (showMarkDone()) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__skip\"\n (click)=\"onMarkDone(step)\"\n >\n {{ markDoneLabel() }}\n </button>\n }\n }\n\n @if (step.secondaryActionLabel) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__secondary\"\n (click)=\"onSecondaryAction(step)\"\n >\n {{ step.secondaryActionLabel }}\n </button>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"fk-onboarding-guide__foot\">\n <span class=\"fk-onboarding-guide__foot-text\">\n <b>{{ doneCount() }}</b> / {{ total() }} {{ stepsWord() }}\n {{ doneWord() }}\n </span>\n\n @if (footerActionLabel(); as footerLabel) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__go\"\n (click)=\"onFooterAction()\"\n >\n {{ footerLabel }}\n <fk-icon [name]=\"actionIcon()\" size=\"xs\" />\n </button>\n }\n </div>\n</div>\n\n<!-- ===================== COLLAPSED PILL ===================== -->\n<button\n type=\"button\"\n class=\"fk-onboarding-guide__pill\"\n cdkDragHandle\n [attr.aria-label]=\"expandLabel()\"\n (click)=\"onExpand()\"\n>\n <span class=\"fk-onboarding-guide__ring\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 38 38\">\n <circle class=\"fk-onboarding-guide__ring-track\" cx=\"19\" cy=\"19\" r=\"16\" />\n <circle\n class=\"fk-onboarding-guide__ring-prog\"\n cx=\"19\"\n cy=\"19\"\n r=\"16\"\n [style.stroke-dasharray]=\"ringCircumference\"\n [style.stroke-dashoffset]=\"ringOffset()\"\n />\n </svg>\n <span class=\"fk-onboarding-guide__ring-num\">{{ percent() }}%</span>\n </span>\n\n <span class=\"fk-onboarding-guide__pill-meta\">\n <span class=\"fk-onboarding-guide__pill-title\">{{ title() }}</span>\n <span class=\"fk-onboarding-guide__pill-sub\">\n @if (complete()) {\n {{ allDoneLabel() }}\n } @else {\n <b>{{ stepsLeft() }}</b> {{ stepsWord() }} {{ stepsLeftWord() }}\n }\n </span>\n </span>\n\n <span class=\"fk-onboarding-guide__pill-expand\" aria-hidden=\"true\">\n <fk-icon [name]=\"expandIcon()\" size=\"sm\" />\n </span>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * Layout for a dashboard search/filter bar. It lays out a primary search field\n * and fixed-width filter dropdowns in a responsive row and compacts the\n * projected `fk-form-field` / `fk-input` / `fk-select` controls to the house\n * filter-bar size — so every dashboard's filter bar reads the same without\n * per-page CSS.\n *\n * It owns **layout and responsiveness only** — no surrounding border,\n * background, or elevation. If you want the bar to sit inside a card, wrap it in\n * your own surface.\n *\n * Tag the primary search field with the `search` attribute (grows to fill) and\n * each fixed-width filter with the `filter` attribute. Under a narrow container\n * the row stacks and every control goes full-width.\n *\n * ```html\n * <fk-search-bar-layout>\n * <fk-form-field search>\n * <fk-icon fkPrefix name=\"magnifier-outline\" size=\"sm\" />\n * <fk-input formControlName=\"q\" placeholder=\"Search…\" />\n * </fk-form-field>\n *\n * <fk-form-field filter>\n * <fk-select formControlName=\"status\" [options]=\"options\" />\n * </fk-form-field>\n * </fk-search-bar-layout>\n * ```\n *\n * Uses `ViewEncapsulation.None` so it can style the projected controls (the\n * `[search]` / `[filter]` children and the select chevron); its rules are scoped\n * under the block class.\n */\n@Component({\n selector: 'fk-search-bar-layout',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './search-bar-layout.component.html',\n styleUrl: './search-bar-layout.component.scss',\n})\nexport class SearchBarLayoutComponent {\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-search-bar-layout', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.role')\n readonly role = 'search';\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<div class=\"fk-search-bar-layout__row\">\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\n\n/**\n * A titled content section for a dashboard page: an optional heading followed by\n * projected content, with consistent vertical rhythm between the section and its\n * own children.\n *\n * Spacing is top-margin only (never a parent `gap`), so a consumer's per-child\n * `margin-top` overrides cleanly instead of stacking on an invisible gap. The\n * first child sits flush; each subsequent child gets the section rhythm.\n * `marginTop` overrides the section's own top margin per instance.\n *\n * ```html\n * <fk-content-page-section title=\"Members\" [level]=\"3\">\n * <p>…</p>\n * <fk-data-table />\n * </fk-content-page-section>\n * ```\n *\n * Uses `ViewEncapsulation.None` so the inter-child rhythm rule reaches projected\n * content; its rules are scoped under the block class.\n */\n@Component({\n selector: 'fk-content-page-section',\n standalone: true,\n imports: [HeadlineComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './content-page-section.component.html',\n styleUrl: './content-page-section.component.scss',\n})\nexport class ContentPageSectionComponent {\n // ===== INPUTS =====\n readonly title = input<string | null>(null);\n readonly level = input<HeadlineLevel>(5);\n readonly marginTop = input<string | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-page-section', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('style.margin-top')\n get hostMarginTop(): string | null {\n return this.marginTop();\n }\n}\n","@if (title()) {\n <fk-headline [level]=\"level()\">{{ title() }}</fk-headline>\n}\n\n<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Lays its `fk-content-column` children out **side by side**, wrapping and\n * ultimately stacking to a single column based on the row's *own* available\n * width — never the viewport (so it reacts when a sidenav opens or it sits in a\n * narrow panel). Same intrinsic CSS grid as `fk-columns`\n * (`repeat(auto-fit, minmax(min, 1fr))`); `minColumnWidth` is the single knob\n * for when columns stack.\n *\n * Optionally **bordered**, with an optional **headline**\n * (`fk-content-column-headline`) that sits *outside* the border — so the row\n * reads as a titled section wrapping a set of columns.\n *\n * ```html\n * <fk-content-row [bordered]=\"true\" minColumnWidth=\"16rem\">\n * <fk-content-column-headline>Providers</fk-content-column-headline>\n * <fk-content-column>…</fk-content-column>\n * <fk-content-column>…</fk-content-column>\n * </fk-content-row>\n * ```\n */\n@Component({\n selector: 'fk-content-row',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-row.component.html',\n styleUrl: './content-row.component.scss',\n})\nexport class ContentRowComponent {\n // ===== INPUTS =====\n /**\n * The smallest width a column may shrink to before the row drops to fewer\n * columns — the single knob that controls when columns wrap/stack.\n */\n readonly minColumnWidth = input<string>('16rem');\n /**\n * Optional cap on how wide a column may grow. Unset (default), columns fill\n * the row (`1fr`); when set, columns stop at this width and leftover space\n * stays empty (columns aligned to the start).\n */\n readonly maxColumnWidth = input<string | null>(null);\n /** Gap between side-by-side columns and between wrapped rows. */\n readonly gutter = input<string>('var(--fk-rhythm-4, 1rem)');\n /** Draws a bordered, padded box around the columns (not the headline). */\n readonly bordered = input<boolean>(false);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-row', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n\n @HostBinding('style.--fk-content-row-min')\n get hostMin(): string {\n return this.minColumnWidth();\n }\n\n // Null leaves the property unset, so the SCSS falls back to `1fr` (fill).\n @HostBinding('style.--fk-content-row-max')\n get hostMax(): string | null {\n return this.maxColumnWidth();\n }\n\n @HostBinding('style.--fk-content-row-gutter')\n get hostGutter(): string {\n return this.gutter();\n }\n}\n","<!-- Headline sits outside the bordered region. -->\n<ng-content select=\"fk-content-column-headline\" />\n\n<div\n class=\"fk-content-row__grid\"\n [class.fk-content-row__grid--bordered]=\"bordered()\"\n>\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * A single content column — a vertical block of stacked content, with an\n * optional **border** and an optional **headline** (`fk-content-column-headline`)\n * that sits *outside* that border. The semantic unit that goes inside an\n * `fk-content-row` (which lays columns side by side and stacks them when narrow),\n * or stands alone as a bordered, titled section.\n *\n * ```html\n * <fk-content-column [bordered]=\"true\">\n * <fk-content-column-headline>Provider</fk-content-column-headline>\n * …\n * </fk-content-column>\n * ```\n */\n@Component({\n selector: 'fk-content-column',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-column.component.html',\n styleUrl: './content-column.component.scss',\n})\nexport class ContentColumnComponent {\n // ===== INPUTS =====\n /** Draws a bordered, padded box around the content (not the headline). */\n readonly bordered = input<boolean>(false);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-column', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<!-- Headline sits outside the bordered region. -->\n<ng-content select=\"fk-content-column-headline\" />\n\n<div\n class=\"fk-content-column__content\"\n [class.fk-content-column__content--bordered]=\"bordered()\"\n>\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Optional headline for `fk-content-column` / `fk-content-row`. Projected\n * *outside* the bordered region, so it labels the group without being boxed in\n * with the content. Projects its own text/markup.\n *\n * ```html\n * <fk-content-column [bordered]=\"true\">\n * <fk-content-column-headline>Provider</fk-content-column-headline>\n * …\n * </fk-content-column>\n * ```\n */\n@Component({\n selector: 'fk-content-column-headline',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-column-headline.component.html',\n styleUrl: './content-column-headline.component.scss',\n})\nexport class ContentColumnHeadlineComponent {\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-column-headline', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\nimport { TextComponent } from '@frame-kit/ui-ng/core/text';\n\n/**\n * A back control paired with a title / subtitle lockup — the recurring\n * \"‹ back, then a heading\" header used at the top of a secondary nav rail or a\n * detail view. The title renders through `fk-headline` (its level is\n * configurable via `headingLevel`) and the optional subtitle through `fk-text`.\n *\n * **No icon dependency** (see the patterns DEVELOPMENT_GUIDE): the back control\n * renders a projected icon via the `[backIcon]` slot, falling back to a CSS\n * glyph when none is projected — the consuming app injects its own icon.\n *\n * <fk-back-nav title=\"Settings\" subtitle=\"Acme Inc\" (back)=\"goBack()\">\n * <fk-icon backIcon name=\"arrow-left-outline-duo\" />\n * </fk-back-nav>\n *\n * Presentational — the host owns routing (handle `(back)`). Exposed as a\n * building block: `fk-content-detail-header` composes it.\n */\n@Component({\n selector: 'fk-back-nav',\n standalone: true,\n imports: [HeadlineComponent, TextComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './back-nav.component.html',\n styleUrl: './back-nav.component.scss',\n})\nexport class BackNavComponent {\n // ===== INPUTS =====\n /** Title text, rendered via `fk-headline`. */\n readonly title = input.required<string>();\n\n /** Optional subtitle, rendered via `fk-text` under the title. */\n readonly subtitle = input<string>('');\n\n /** Heading level passed to `fk-headline`. */\n readonly headingLevel = input<HeadlineLevel>(3);\n\n /** Render the back control. Hide it where the lockup leads without one. */\n readonly showBack = input<boolean>(true);\n\n /** Accessible label for the back control. */\n readonly backAriaLabel = input<string>('Back');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== OUTPUTS =====\n /** Emitted when the back control is activated; the host handles navigation. */\n readonly back = output<void>();\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-back-nav', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (showBack()) {\n <button\n type=\"button\"\n class=\"fk-back-nav__back\"\n [attr.aria-label]=\"backAriaLabel()\"\n (click)=\"back.emit()\"\n >\n <ng-content select=\"[backIcon]\" />\n </button>\n}\n\n<div class=\"fk-back-nav__text\">\n <div class=\"fk-back-nav__headline\">\n <fk-headline [level]=\"headingLevel()\">{{ title() }}</fk-headline>\n <ng-content select=\"[headline]\" />\n </div>\n\n @if (subtitle()) {\n <fk-text variant=\"caption\" tone=\"muted\">{{ subtitle() }}</fk-text>\n }\n\n <div class=\"fk-back-nav__subtitle\">\n <ng-content select=\"[subtitle]\" />\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\n\nimport { BackNavComponent } from '../back-nav/back-nav.component';\n\n/**\n * Detail-view header — an `fk-back-nav` lockup (back control + title/subtitle)\n * on the left and up to ~3 actions on the right. Sits at the top of a routed\n * detail surface: back returns to the list, the title/subtitle name the record,\n * and `[detailHeaderActions]` holds the record's actions.\n *\n * Like `fk-page-header`, the actions drop below the lockup and go full-width when\n * the header's own width gets tight (a CSS container query on the host), so it\n * behaves inside a narrow panel, not just at the viewport.\n *\n * **No icon dependency** — the back icon is projected via `[detailHeaderBackIcon]`\n * (forwarded to the lockup), falling back to a CSS glyph. Presentational — the\n * host owns routing (handle `(back)`). Pairs with `fk-content-detail-page`, which\n * places it over a scrollable body (any framing is the consuming app's skin).\n *\n * <fk-content-detail-header\n * title=\"Okta — Employees\"\n * subtitle=\"SAML · Admin · con_9f2a4b\"\n * (back)=\"goBack()\"\n * >\n * <fk-icon detailHeaderBackIcon name=\"arrow-left-outline-duo\" />\n * <fk-button detailHeaderActions variant=\"outline\" size=\"sm\">Disable</fk-button>\n * </fk-content-detail-header>\n */\n@Component({\n selector: 'fk-content-detail-header',\n standalone: true,\n imports: [BackNavComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-detail-header.component.html',\n styleUrl: './content-detail-header.component.scss',\n})\nexport class ContentDetailHeaderComponent {\n // ===== INPUTS =====\n /** Title naming the record. */\n readonly title = input.required<string>();\n\n /** Optional subtitle under the title (e.g. a type/scope/id line). */\n readonly subtitle = input<string>('');\n\n /** Heading level for the title. Defaults to 3 (~22px), a sub-surface heading. */\n readonly headingLevel = input<HeadlineLevel>(3);\n\n /** Render the back control. Hosts that embed the header inline hide it. */\n readonly showBack = input<boolean>(true);\n\n /** Accessible label for the back control. */\n readonly backAriaLabel = input<string>('Back');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== OUTPUTS =====\n /** Emitted when the back control is activated; the host handles navigation. */\n readonly back = output<void>();\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-detail-header', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<header class=\"fk-content-detail-header__bar\" [attr.aria-label]=\"ariaLabel()\">\n <fk-back-nav\n class=\"fk-content-detail-header__lead\"\n [title]=\"title()\"\n [subtitle]=\"subtitle()\"\n [headingLevel]=\"headingLevel()\"\n [showBack]=\"showBack()\"\n [backAriaLabel]=\"backAriaLabel()\"\n (back)=\"back.emit()\"\n >\n <ng-content select=\"[detailHeaderBackIcon]\" ngProjectAs=\"[backIcon]\" />\n <ng-content select=\"[detailHeaderHeadline]\" ngProjectAs=\"[headline]\" />\n <ng-content select=\"[detailHeaderSubtitle]\" ngProjectAs=\"[subtitle]\" />\n </fk-back-nav>\n\n <div class=\"fk-content-detail-header__actions\">\n <ng-content select=\"[detailHeaderActions]\" />\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { ContentDetailHeaderComponent } from '../content-detail-header/content-detail-header.component';\n\n/**\n * Detail surface for content too large for a drawer: an\n * `fk-content-detail-header` (back control, heading/subtitle, `[actions]`) over\n * a body (`<ng-content>`), stacked in a flex column.\n *\n * Structural only — it carries **no visual chrome** (no border, background,\n * padding, sticky, or motion) and imposes no scroll behavior of its own; the\n * consuming app adds those as a skin, e.g. targeting the `--page` host modifier.\n *\n * `mode` drives the header's back control:\n * - `page` (default): shows the back control; `(back)` is emitted for the host.\n * - `embedded`: inline for a tab panel — no back control.\n *\n * Pairs with `fk-content-split-layout`.\n */\n@Component({\n selector: 'fk-content-detail-page',\n standalone: true,\n imports: [ContentDetailHeaderComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n templateUrl: './content-detail-page.component.html',\n styleUrl: './content-detail-page.component.scss',\n})\nexport class ContentDetailPageComponent {\n /** Heading shown in the header. */\n readonly heading = input<string>('');\n\n /** Optional subtitle under the heading (forwarded to the header). */\n readonly subtitle = input<string>('');\n\n /** Back-control label. */\n readonly backLabel = input<string>('Back');\n\n /**\n * `page` — shows the header's back control. `embedded` — inline content for a\n * tab panel (no back control). Also exposed as a `--page` / `--embedded` host\n * modifier class so a consumer skin can frame each mode differently.\n */\n readonly mode = input<'page' | 'embedded'>('page');\n\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n /** Emitted when the back control is activated; the host handles navigation. */\n readonly back = output<void>();\n\n @HostBinding('class')\n get hostClass(): string {\n return [\n 'fk-content-detail-page',\n `fk-content-detail-page--${this.mode()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<div class=\"fk-content-detail-page__header\">\n <fk-content-detail-header\n [title]=\"heading()\"\n [subtitle]=\"subtitle()\"\n [backAriaLabel]=\"backLabel()\"\n [showBack]=\"mode() === 'page'\"\n (back)=\"back.emit()\"\n >\n <ng-content select=\"[backIcon]\" ngProjectAs=\"[detailHeaderBackIcon]\" />\n <ng-content select=\"[headline]\" ngProjectAs=\"[detailHeaderHeadline]\" />\n <ng-content select=\"[subtitle]\" ngProjectAs=\"[detailHeaderSubtitle]\" />\n <ng-content select=\"[actions]\" ngProjectAs=\"[detailHeaderActions]\" />\n </fk-content-detail-header>\n</div>\n\n<div class=\"fk-content-detail-page__body\">\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { LoaderComponent } from '@frame-kit/ui-ng/ui/loader';\n\n/**\n * The line a region shows while it fetches something of its own: a small\n * spinner beside a label, centered where the content will be.\n *\n * Sits in place of the content so a section that is still resolving reads as\n * working rather than as empty. Mono and faint because it is machinery\n * reporting itself, not content that has arrived.\n *\n * Not for a whole page — a page has its own loading state. This is for a\n * section whose data comes separately from the rest: a drawer panel, a\n * capability list, an audit page inside a detail view.\n *\n * <fk-inline-loader label=\"Loading capabilities…\" />\n *\n * The label doubles as the spinner's accessible name — one string, so the two\n * cannot drift.\n */\n@Component({\n selector: 'fk-inline-loader',\n standalone: true,\n imports: [LoaderComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './inline-loader.component.html',\n styleUrl: './inline-loader.component.scss',\n})\nexport class InlineLoaderComponent {\n // ===== INPUTS =====\n /** What is being fetched, already translated. Also the spinner's aria-label. */\n readonly label = input.required<string>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-inline-loader', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<fk-loader size=\"sm\" [ariaLabel]=\"label()\" />\n<span class=\"fk-inline-loader__label\">{{ label() }}</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport {\n DropdownMenuComponent,\n DropdownPanelDirective,\n DropdownTriggerDirective,\n} from '@frame-kit/ui-ng/ui/dropdown-menu';\n\nimport type {\n ContextSwitcherColumn,\n ContextSwitcherIconTone,\n ContextSwitcherOption,\n ContextSwitcherSelection,\n ContextSwitcherSublabelTone,\n} from './context-switcher.types';\n\n/**\n * The sidebar control for \"which context am I working in\": a trigger showing\n * the current name over a small category line, and a panel of one or more\n * titled option columns.\n *\n * Several of these stack in a rail (an account, an application, an\n * environment), and any visible difference between them reads as a mistake\n * rather than a distinction — so the chrome lives here once, and the meaning\n * stays with the caller. This holds no data, fetches nothing, and knows\n * nothing about what the options are; it reports what was clicked.\n *\n * <fk-context-switcher\n * [name]=\"accountName()\"\n * sublabel=\"Account\"\n * ariaLabel=\"Switch account\"\n * [columns]=\"columns()\"\n * (optionSelect)=\"onSelect($event)\"\n * >\n * <fk-icon contextSwitcherIcon name=\"organization\" />\n * </fk-context-switcher>\n *\n * Closing is the caller's call: choosing an account commits and should close,\n * while choosing an application in a two-column switcher only re-focuses the\n * second column and must stay open. Call `close()` when you mean to.\n */\n@Component({\n selector: 'fk-context-switcher',\n standalone: true,\n imports: [\n DropdownMenuComponent,\n DropdownTriggerDirective,\n DropdownPanelDirective,\n ],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './context-switcher.component.html',\n styleUrl: './context-switcher.component.scss',\n})\nexport class ContextSwitcherComponent {\n // ===== INPUTS =====\n /**\n * The trigger's headline — the context you are in. Null renders a\n * skeleton rather than an empty row, for a first load with nothing cached.\n */\n readonly name = input<string | null>(null);\n\n /**\n * The small mono line beneath the name — the kind of thing the name is\n * (\"Account\"), or a second piece of live context. Null renders a skeleton;\n * empty renders nothing.\n */\n readonly sublabel = input<string | null>('');\n\n readonly iconTone = input<ContextSwitcherIconTone>('brand');\n readonly sublabelTone = input<ContextSwitcherSublabelTone>('muted');\n\n /** Icon-rail mode — the trigger collapses to its badge. */\n readonly collapsed = input(false);\n\n /**\n * The collapsed trigger shows no text, so it carries the current context in\n * its label instead. Falls back to `ariaLabel`.\n */\n readonly collapsedAriaLabel = input<string>('');\n\n /** One column, or several. Empty columns render nothing. */\n readonly columns = input.required<readonly ContextSwitcherColumn[]>();\n\n // ===== OUTPUTS =====\n readonly optionSelect = output<ContextSwitcherSelection>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n /** Describes the control itself. */\n readonly ariaLabel = input<string>('');\n\n // ===== COMPUTED =====\n private readonly dropdown = viewChild.required(DropdownMenuComponent);\n\n /** Two columns sit side by side; one fills the panel. */\n readonly multiColumn = computed(() => this.columns().length > 1);\n\n readonly triggerAriaLabel = computed(() =>\n this.collapsed()\n ? this.collapsedAriaLabel() || this.ariaLabel()\n : this.ariaLabel(),\n );\n\n readonly classes = computed(() =>\n [\n 'fk-context-switcher',\n this.collapsed() ? 'fk-context-switcher--collapsed' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n /** Close the panel. The caller decides when a selection is final. */\n close(): void {\n this.dropdown().close();\n }\n\n protected onSelect(\n column: ContextSwitcherColumn,\n option: ContextSwitcherOption,\n ): void {\n this.optionSelect.emit({ columnKey: column.key, option });\n }\n}\n","<fk-dropdown-menu\n [ariaLabel]=\"ariaLabel() || null\"\n placement=\"bottom-start\"\n [portal]=\"true\"\n>\n <button\n fkDropdownTrigger\n type=\"button\"\n class=\"fk-context-switcher__trigger\"\n [class.fk-context-switcher__trigger--collapsed]=\"collapsed()\"\n [attr.aria-label]=\"triggerAriaLabel() || null\"\n >\n <!--\n One badge for both states, so the projected icon has exactly one outlet.\n The fallback glyph shows only while nothing is projected.\n -->\n <span\n class=\"fk-context-switcher__icon\"\n [class.fk-context-switcher__icon--solid]=\"iconTone() === 'solid'\"\n aria-hidden=\"true\"\n >\n <ng-content select=\"[contextSwitcherIcon]\" />\n </span>\n\n @if (!collapsed()) {\n <span class=\"fk-context-switcher__labels\">\n <span class=\"fk-context-switcher__name\">\n @if (name(); as resolved) {\n {{ resolved }}\n } @else {\n <span class=\"fk-context-switcher__skeleton\" aria-hidden=\"true\"\n >&nbsp;</span\n >\n }\n </span>\n <span\n class=\"fk-context-switcher__sublabel\"\n [class.fk-context-switcher__sublabel--primary]=\"\n sublabelTone() === 'primary'\n \"\n >\n @if (sublabel(); as resolved) {\n {{ resolved }}\n } @else if (sublabel() === null) {\n <span\n class=\"fk-context-switcher__skeleton fk-context-switcher__skeleton--sublabel\"\n aria-hidden=\"true\"\n >&nbsp;</span\n >\n }\n </span>\n </span>\n\n <span class=\"fk-context-switcher__chevron\" aria-hidden=\"true\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 18 18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 6.75L9 11.25L13.5 6.75\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </span>\n }\n </button>\n\n <ng-template fkDropdownPanel>\n <div\n class=\"fk-context-switcher__panel\"\n [class.fk-context-switcher__panel--multi]=\"multiColumn()\"\n >\n @for (column of columns(); track column.key) {\n <div class=\"fk-context-switcher__column\">\n <div class=\"fk-context-switcher__column-title\">\n {{ column.title }}\n </div>\n <div class=\"fk-context-switcher__list\" role=\"listbox\">\n @for (option of column.options; track option.id) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"fk-context-switcher__item\"\n [class.fk-context-switcher__item--active]=\"\n option.id === column.activeId\n \"\n [attr.aria-selected]=\"option.id === column.activeId\"\n (click)=\"onSelect(column, option)\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n</fk-dropdown-menu>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { SidebarNavComponent } from '../sidebar-nav/sidebar-nav.component';\nimport type {\n SidebarNavItem,\n SidebarNavModel,\n} from '../sidebar-nav/sidebar-nav.types';\nimport type {\n DashboardNavGroup,\n DashboardNavItem,\n} from './dashboard-nav.types';\n\ninterface NavSegment {\n id: string;\n before: boolean;\n after: boolean;\n separated: boolean;\n model: SidebarNavModel;\n}\n\n/**\n * A dashboard's sidebar navigation: the caller's groups, with items the\n * caller may not open already removed, rendered as one `fk-sidebar-nav` per\n * group so that projected controls — an account switcher, an environment\n * switcher — can sit between groups.\n *\n * <fk-dashboard-nav\n * [groups]=\"groups()\"\n * [collapsed]=\"collapsed()\"\n * slotBeforeGroupId=\"workspace\"\n * slotAfterGroupId=\"access\"\n * >\n * <div navSlotBefore><fk-context-switcher … /></div>\n * <div><fk-context-switcher … /></div>\n * </fk-dashboard-nav>\n *\n * Visibility is a plain boolean on each item, decided by the caller from\n * whatever authority it has; this component only removes what is hidden. A\n * parent whose children have all been removed goes too — it would expand to\n * nothing. Disclosure, active state and the collapsed-rail flyout are owned\n * by `fk-sidebar-nav`.\n */\n@Component({\n selector: 'fk-dashboard-nav',\n standalone: true,\n imports: [SidebarNavComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dashboard-nav.component.html',\n styleUrl: './dashboard-nav.component.scss',\n})\nexport class DashboardNavComponent {\n // ===== INPUTS =====\n readonly groups = input.required<DashboardNavGroup[]>();\n /** Icon-rail mode, passed through to every segment. */\n readonly collapsed = input(false);\n /** Project `[navSlotBefore]` content immediately before this group. */\n readonly slotBeforeGroupId = input<string | null>(null);\n /** Project default `<ng-content>` immediately after this group. */\n readonly slotAfterGroupId = input<string | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n /**\n * Visible groups sliced into render segments, each carrying a single-group\n * `SidebarNavModel`.\n */\n private readonly segments = computed<NavSegment[]>(() => {\n const before = this.slotBeforeGroupId();\n const after = this.slotAfterGroupId();\n\n return this.groups()\n .map((group) => ({\n group,\n items: group.items\n .filter((item) => item.visible !== false)\n .map((item) =>\n item.children\n ? {\n ...item,\n children: item.children.filter((c) => c.visible !== false),\n }\n : item,\n )\n .filter((item) => !item.children || item.children.length > 0),\n }))\n .filter((entry) => entry.items.length > 0)\n .map((entry, index) => ({\n id: entry.group.id,\n before: before === entry.group.id,\n after: after === entry.group.id,\n separated: index > 0 && (entry.group.separatorBefore ?? false),\n model: [\n {\n label: entry.group.label,\n items: entry.items.map(toModelItem),\n },\n ],\n }));\n });\n\n /**\n * Groups above the projected `[navSlotBefore]` content, and those below it.\n * Split rather than conditionally projecting inside the loop: the slot's\n * position is expressed by what is emitted around it, so the template needs\n * exactly one outlet — Angular projects to the first matching `ng-content`,\n * and a second copy (or one inside a false `@if`) swallows the content.\n */\n readonly segmentsBeforeSlot = computed<NavSegment[]>(() => {\n const all = this.segments();\n const anchor = all.findIndex((segment) => segment.before);\n\n return anchor < 0 ? [] : all.slice(0, anchor);\n });\n\n readonly segmentsAfterSlot = computed<NavSegment[]>(() => {\n const all = this.segments();\n const anchor = all.findIndex((segment) => segment.before);\n\n return anchor < 0 ? all : all.slice(anchor);\n });\n\n readonly classes = computed(() =>\n [\n 'fk-dashboard-nav',\n this.collapsed() ? 'fk-dashboard-nav--collapsed' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n /**\n * The sidebar is a navigation landmark, so a screen reader can jump to it\n * rather than walking the page to find it. The host is the element that\n * holds every link, so the role belongs here; without it the `aria-label`\n * below names nothing, and a page whose only other landmark is a breadcrumb\n * offers no way to reach the navigation at all.\n */\n @HostBinding('attr.role')\n readonly hostRole = 'navigation';\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n\n/** Strip the visibility flags; `fk-sidebar-nav` never sees a hidden row. */\nfunction toModelItem(item: DashboardNavItem): SidebarNavItem {\n const { visible: _visible, children, ...rest } = item;\n\n return {\n ...rest,\n children: children?.map(({ visible: _v, ...child }) => child),\n };\n}\n","@for (segment of segmentsBeforeSlot(); track segment.id) {\n @if (segment.separated) {\n <div class=\"fk-dashboard-nav__separator\" aria-hidden=\"true\"></div>\n }\n <fk-sidebar-nav [model]=\"segment.model\" [collapsed]=\"collapsed()\" />\n}\n\n<!--\n Exactly one outlet for `[navSlotBefore]`, never inside a conditional. With\n no anchored group, or no groups at all, both loops are empty and the slot\n lands at the top — so a caller with nothing to navigate to still gets its\n switcher, which is the one way back to somewhere it can use.\n-->\n<ng-content select=\"[navSlotBefore]\" />\n\n@for (segment of segmentsAfterSlot(); track segment.id) {\n @if (segment.separated) {\n <div class=\"fk-dashboard-nav__separator\" aria-hidden=\"true\"></div>\n }\n <fk-sidebar-nav [model]=\"segment.model\" [collapsed]=\"collapsed()\" />\n @if (segment.after) {\n <ng-content />\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport {\n AppShellComponent,\n type AppShellMode,\n} from '@frame-kit/ui-ng/layouts/app-shell';\n\n/**\n * The chrome of a signed-in dashboard, built on `fk-app-shell`: a full-height\n * aside with a brand header and collapse toggle, a sticky frosted topbar with\n * a mobile hamburger, a capped page area with an optional loading veil, and a\n * footer. Every dashboard that uses it gets the identical structure — the\n * same hamburger, the same collapse, the same scroll behaviour — and differs\n * only in what it projects.\n *\n * <fk-dashboard-layout [pageLoading]=\"navigating()\">\n * <fk-nav-brand layoutBrand brandText=\"Acme\" />\n * <fk-dashboard-nav layoutAside [groups]=\"groups()\" [collapsed]=\"collapsed()\" />\n * <nav layoutTopbarStart>Acme / Overview</nav>\n * <fk-user-menu layoutTopbarEnd … />\n * <router-outlet />\n * <span layoutFooter>© Acme</span>\n * </fk-dashboard-layout>\n *\n * A dashboard that needs a trailing panel — a documentation reader, a detail\n * inspector — projects it into `[layoutEnd]` and chooses its `endMode`. One\n * that needs a panel beside the page, such as a secondary navigation, projects\n * it into `[layoutContentPanel]`, which sits in the content row ahead of the\n * scroll container so the page scrolls under it rather than with it.\n *\n * The aside's toggle and the topbar's hamburger drive the underlying shell;\n * `collapsed` reports the rail state so projected controls can follow it.\n * The toggle glyphs are projection slots with a built-in fallback, so no icon\n * registry is required.\n */\n@Component({\n selector: 'fk-dashboard-layout',\n standalone: true,\n imports: [AppShellComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dashboard-layout.component.html',\n styleUrl: './dashboard-layout.component.scss',\n})\nexport class DashboardLayoutComponent {\n // ===== INPUTS =====\n /** Passed to `fk-app-shell`. `icon` collapses to a rail; `side` hides entirely. */\n readonly mode = input<AppShellMode>('icon');\n readonly sidenavWidth = input<string>('260px');\n readonly collapsedWidth = input<string>('64px');\n /** Layout mode for the trailing panel, when `[layoutEnd]` is projected. */\n readonly endMode = input<AppShellMode>('over');\n readonly endWidth = input<string>('400px');\n readonly endCollapsedWidth = input<string>('64px');\n /** Veil the page area with the projected `[layoutPageLoader]` content. */\n readonly pageLoading = input(false);\n /** Accessible name for the aside's collapse toggle. */\n readonly toggleAriaLabel = input<string>('Toggle navigation');\n /** Accessible name for the topbar's mobile hamburger. */\n readonly menuAriaLabel = input<string>('Open navigation');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n private readonly shell = viewChild(AppShellComponent);\n\n /** Whether the aside is in its icon rail. Projected controls follow this. */\n readonly collapsed = computed(() => this.shell()?.isCollapsed() ?? false);\n\n /** Whether the trailing panel is showing. Projected controls follow this. */\n readonly endOpen = computed(() => this.shell()?.endOpen() ?? false);\n\n readonly classes = computed(() =>\n [\n 'fk-dashboard-layout',\n this.collapsed() ? 'fk-dashboard-layout--collapsed' : '',\n this.pageLoading() ? 'fk-dashboard-layout--page-loading' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n /** The aside header's toggle: collapse or expand the rail. */\n toggleSidenav(): void {\n this.shell()?.toggleSidenav();\n }\n\n /** The topbar hamburger: open the off-canvas aside on narrow viewports. */\n openSidenav(): void {\n this.shell()?.openSidenav();\n }\n\n /**\n * Collapse the rail from outside the header's own toggle — what a dashboard\n * calls when it opens the trailing panel and wants the room.\n */\n closeSidenav(): void {\n this.shell()?.closeSidenav();\n }\n\n /** Show the projected `[layoutEnd]` panel. */\n openEnd(): void {\n this.shell()?.openEnd();\n }\n\n /** Hide it. */\n closeEnd(): void {\n this.shell()?.closeEnd();\n }\n\n /** Hide it if it is showing, show it if it is not. */\n toggleEnd(): void {\n this.shell()?.toggleEnd();\n }\n}\n","<!--\n Banners sit above the shell, in flow, inside the fixed-height host: the\n shell absorbs whatever height they leave, so a banner appearing never adds a\n document scrollbar.\n-->\n<ng-content select=\"[layoutBanner]\" />\n\n<fk-app-shell\n [mode]=\"mode()\"\n [sidenavWidth]=\"sidenavWidth()\"\n [collapsedWidth]=\"collapsedWidth()\"\n [endMode]=\"endMode()\"\n [endWidth]=\"endWidth()\"\n [endCollapsedWidth]=\"endCollapsedWidth()\"\n>\n <div appShellSidenav class=\"fk-dashboard-layout__aside\">\n <div class=\"fk-dashboard-layout__aside-header\">\n <div class=\"fk-dashboard-layout__brand\">\n <ng-content select=\"[layoutBrand]\" />\n </div>\n\n <button\n type=\"button\"\n class=\"fk-dashboard-layout__toggle\"\n [attr.aria-label]=\"toggleAriaLabel()\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleSidenav()\"\n >\n <ng-content select=\"[layoutToggleIcon]\" />\n </button>\n </div>\n\n <div class=\"fk-dashboard-layout__aside-body\">\n <ng-content select=\"[layoutAside]\" />\n </div>\n\n <div class=\"fk-dashboard-layout__aside-footer\">\n <ng-content select=\"[layoutAsideFooter]\" />\n </div>\n </div>\n\n <div appShellContent class=\"fk-dashboard-layout__content\">\n <!--\n A panel beside the page — a secondary navigation, a filter rail — sits in\n the content row ahead of the scroll container, so the topbar and the page\n scroll under it rather than it scrolling with them.\n -->\n <ng-content select=\"[layoutContentPanel]\" />\n\n <!--\n The scroll container. The topbar sticks at its top and the page scrolls\n under it, which is what lets the frosted bar show content through.\n -->\n <div class=\"fk-dashboard-layout__body\">\n <header class=\"fk-dashboard-layout__topbar\">\n <div class=\"fk-dashboard-layout__topbar-inner\">\n <button\n type=\"button\"\n class=\"fk-dashboard-layout__menu\"\n [attr.aria-label]=\"menuAriaLabel()\"\n (click)=\"openSidenav()\"\n >\n <ng-content select=\"[layoutMenuIcon]\" />\n </button>\n\n <div class=\"fk-dashboard-layout__topbar-start\">\n <ng-content select=\"[layoutTopbarStart]\" />\n </div>\n\n <div class=\"fk-dashboard-layout__topbar-end\">\n <ng-content select=\"[layoutTopbarEnd]\" />\n </div>\n </div>\n </header>\n\n <div class=\"fk-dashboard-layout__page\">\n <ng-content />\n\n @if (pageLoading()) {\n <div class=\"fk-dashboard-layout__page-loader\" aria-live=\"polite\">\n <ng-content select=\"[layoutPageLoader]\" />\n </div>\n }\n </div>\n </div>\n </div>\n\n <!--\n A plain div, not a second `aside`: `fk-app-shell` already makes its end\n region an aside, and nesting one inside it would declare two landmarks for\n one panel.\n -->\n <div appShellEnd class=\"fk-dashboard-layout__end\">\n <ng-content select=\"[layoutEnd]\" />\n </div>\n\n <footer appShellFooter class=\"fk-dashboard-layout__footer\">\n <ng-content select=\"[layoutFooter]\" />\n </footer>\n</fk-app-shell>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-kit-ui-ng-patterns-dashboard.mjs","sources":["../../../../packages/ui-ng-patterns/dashboard/page-header/page-header.component.ts","../../../../packages/ui-ng-patterns/dashboard/page-header/page-header.component.html","../../../../packages/ui-ng-patterns/dashboard/table-empty-state/table-empty-state.component.ts","../../../../packages/ui-ng-patterns/dashboard/table-empty-state/table-empty-state.component.html","../../../../packages/ui-ng-patterns/dashboard/content-split-layout/content-split-layout.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-split-layout/content-split-layout.component.html","../../../../packages/ui-ng-patterns/dashboard/columns/columns.component.ts","../../../../packages/ui-ng-patterns/dashboard/columns/columns.component.html","../../../../packages/ui-ng-patterns/dashboard/detail-panel/detail-panel.component.ts","../../../../packages/ui-ng-patterns/dashboard/detail-panel/detail-panel.component.html","../../../../packages/ui-ng-patterns/dashboard/sidebar-nav/sidebar-nav-item.directive.ts","../../../../packages/ui-ng-patterns/dashboard/sidebar-nav/sidebar-nav.component.ts","../../../../packages/ui-ng-patterns/dashboard/sidebar-nav/sidebar-nav.component.html","../../../../packages/ui-ng-patterns/dashboard/dialog-footer/dialog-footer.component.ts","../../../../packages/ui-ng-patterns/dashboard/dialog-footer/dialog-footer.component.html","../../../../packages/ui-ng-patterns/dashboard/dialog-header/dialog-header.component.ts","../../../../packages/ui-ng-patterns/dashboard/dialog-header/dialog-header.component.html","../../../../packages/ui-ng-patterns/dashboard/dialog-shell/dialog-shell.component.ts","../../../../packages/ui-ng-patterns/dashboard/dialog-shell/dialog-shell.component.html","../../../../packages/ui-ng-patterns/dashboard/onboarding-guide/onboarding-guide.component.ts","../../../../packages/ui-ng-patterns/dashboard/onboarding-guide/onboarding-guide.component.html","../../../../packages/ui-ng-patterns/dashboard/search-bar-layout/search-bar-layout.component.ts","../../../../packages/ui-ng-patterns/dashboard/search-bar-layout/search-bar-layout.component.html","../../../../packages/ui-ng-patterns/dashboard/content-page-section/content-page-section.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-page-section/content-page-section.component.html","../../../../packages/ui-ng-patterns/dashboard/content-row/content-row.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-row/content-row.component.html","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column.component.html","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column-headline.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-column/content-column-headline.component.html","../../../../packages/ui-ng-patterns/dashboard/back-nav/back-nav.component.ts","../../../../packages/ui-ng-patterns/dashboard/back-nav/back-nav.component.html","../../../../packages/ui-ng-patterns/dashboard/content-detail-header/content-detail-header.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-detail-header/content-detail-header.component.html","../../../../packages/ui-ng-patterns/dashboard/content-detail-page/content-detail-page.component.ts","../../../../packages/ui-ng-patterns/dashboard/content-detail-page/content-detail-page.component.html","../../../../packages/ui-ng-patterns/dashboard/inline-loader/inline-loader.component.ts","../../../../packages/ui-ng-patterns/dashboard/inline-loader/inline-loader.component.html","../../../../packages/ui-ng-patterns/dashboard/context-switcher/context-switcher.component.ts","../../../../packages/ui-ng-patterns/dashboard/context-switcher/context-switcher.component.html","../../../../packages/ui-ng-patterns/dashboard/dashboard-nav/dashboard-nav.component.ts","../../../../packages/ui-ng-patterns/dashboard/dashboard-nav/dashboard-nav.component.html","../../../../packages/ui-ng-patterns/dashboard/dashboard-layout/dashboard-layout.component.ts","../../../../packages/ui-ng-patterns/dashboard/dashboard-layout/dashboard-layout.component.html","../../../../packages/ui-ng-patterns/dashboard/dashboard-chrome/dashboard-chrome.component.ts","../../../../packages/ui-ng-patterns/dashboard/dashboard-chrome/dashboard-chrome.component.html","../../../../packages/ui-ng-patterns/dashboard/frame-kit-ui-ng-patterns-dashboard.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\nimport { TextComponent } from '@frame-kit/ui-ng/core/text';\n\n/**\n * Page-level dashboard header: title + optional description on the left, up to\n * ~3 actions on the right.\n *\n * When the header's own width gets tight, the actions drop below the text and\n * go full-width (mobile-style). The break is driven by a CSS container query on\n * the host, so it responds to the content region's width — not the viewport,\n * which means it behaves correctly inside a narrow panel.\n *\n * Project actions by tagging each button with `pageHeaderActions`:\n *\n * <fk-page-header title=\"Users\" description=\"...\">\n * <fk-button pageHeaderActions variant=\"outline\" size=\"sm\">Import</fk-button>\n * <fk-button pageHeaderActions variant=\"primary\" size=\"sm\">Create user</fk-button>\n * </fk-page-header>\n *\n * Tagging each button (rather than wrapping them in a div) makes every button a\n * direct flex child, so full-width stacking falls out of `align-items: stretch`\n * with no `::ng-deep` reach-in.\n *\n * The title row has two projected slots — `[pageHeaderLeading]` before the\n * title and `[pageHeaderTrailing]` after it. Project a plain `fk-icon` for a\n * decorative mark, or a `button` for a clickable one (the consumer owns the\n * interaction, focus ring, and aria-label):\n *\n * <fk-page-header title=\"Permissions\">\n * <fk-icon pageHeaderLeading name=\"key-outline\" />\n * <button pageHeaderTrailing type=\"button\" aria-label=\"Docs\" (click)=\"openDocs()\">\n * <fk-icon name=\"view-api\" />\n * </button>\n * </fk-page-header>\n */\n@Component({\n selector: 'fk-page-header',\n standalone: true,\n imports: [HeadlineComponent, TextComponent],\n // Emulated (not None) so `:host` works — `:host { display: block }` is what\n // keeps the custom element from defaulting to `display: inline` and\n // collapsing to min-content under the container query below.\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './page-header.component.html',\n styleUrl: './page-header.component.scss',\n})\nexport class PageHeaderComponent {\n // ===== INPUTS =====\n readonly title = input.required<string>();\n readonly description = input<string | null>(null);\n readonly headingLevel = input<HeadlineLevel>(1);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-page-header', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<header class=\"fk-page-header__bar\" [attr.aria-label]=\"ariaLabel()\">\n <div class=\"fk-page-header__text\">\n <div class=\"fk-page-header__title-row\">\n <ng-content select=\"[pageHeaderLeading]\" />\n\n <fk-headline [level]=\"headingLevel()\">{{ title() }}</fk-headline>\n\n <ng-content select=\"[pageHeaderTrailing]\" />\n </div>\n\n @if (description()) {\n <fk-text class=\"fk-page-header__description\" tone=\"muted\">{{\n description()\n }}</fk-text>\n }\n </div>\n\n <div class=\"fk-page-header__actions\">\n <ng-content select=\"[pageHeaderActions]\" />\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\n\n/**\n * Empty-state panel for dashboard tables and lists: a centered icon, a title,\n * an optional description, and a projected actions slot (typically one primary\n * fk-button). Bordered-card styling, meant to stand in for a table body when\n * there are no rows.\n *\n * The action row flips from a horizontal row to a centered vertical stack on\n * narrow widths, driven by a container query on the host — so it reacts to the\n * empty-state's own width (e.g. inside a split column) rather than the viewport.\n *\n * <fk-table-empty-state\n * icon=\"globe\"\n * title=\"No webhooks configured\"\n * description=\"Add a webhook to receive events.\"\n * >\n * <fk-button variant=\"primary\" size=\"sm\">Add webhook</fk-button>\n * </fk-table-empty-state>\n *\n * The actions slot is an open `ng-content`, so project as many actions as the\n * design needs (one primary is the norm; two reads cleanly).\n */\n@Component({\n selector: 'fk-table-empty-state',\n standalone: true,\n imports: [IconComponent],\n // Emulated (default) so `:host` works — the host is the bordered flex card\n // and establishes the container-query context the actions break against.\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './table-empty-state.component.html',\n styleUrl: './table-empty-state.component.scss',\n})\nexport class TableEmptyStateComponent {\n // ===== INPUTS =====\n readonly icon = input<string | null>(null);\n readonly title = input.required<string>();\n readonly description = input<string | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-table-empty-state', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (icon()) {\n <div class=\"fk-table-empty-state__icon\">\n <fk-icon [name]=\"icon()!\" size=\"lg\" />\n </div>\n}\n\n<h3 class=\"fk-table-empty-state__title\">{{ title() }}</h3>\n\n@if (description()) {\n <p class=\"fk-table-empty-state__description\">{{ description() }}</p>\n}\n\n<div class=\"fk-table-empty-state__actions\">\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Two-column split layout with container-query responsive stacking.\n *\n * Projects content into `[start]` (grows to fill) and `[end]` (content-sized or\n * fixed width). Below 700px container width, columns stack vertically.\n *\n * A standalone layout primitive for custom dashboard rows.\n */\n@Component({\n selector: 'fk-content-split-layout',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-split-layout.component.html',\n styleUrl: './content-split-layout.component.scss',\n})\nexport class ContentSplitLayoutComponent {\n // ===== INPUTS =====\n readonly endWidth = input<string | null>(null);\n readonly gap = input<string>('var(--fk-rhythm-4, 1rem)');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-split-layout', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<div\n class=\"fk-content-split-layout__row\"\n [style.--fk-content-split-gap]=\"gap()\"\n>\n <div class=\"fk-content-split-layout__start\">\n <ng-content select=\"[start]\" />\n </div>\n\n <div\n class=\"fk-content-split-layout__end\"\n [class.fk-content-split-layout__end--fixed]=\"endWidth()\"\n [style.--fk-content-split-end-width]=\"endWidth()\"\n >\n <ng-content select=\"[end]\" />\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport type { ColumnsEmptyTracks } from './columns.types';\n\n/**\n * Responsive column layout for dashboard content. Lays projected children out\n * in equal-width columns that wrap — and ultimately collapse to a single\n * stacked column — based on the layout's *own* available width, never the\n * viewport. So it reacts correctly when the dashboard content region is\n * squeezed (sidenav open, a drawer pushed in, a split pane) while the viewport\n * still reports \"desktop\".\n *\n * Implemented with an intrinsic CSS grid — `repeat(auto-fit, minmax(min, 1fr))`\n * — so there is no container query, no JS, and no viewport breakpoint to keep\n * in sync. `minColumnWidth` is the smallest a column may shrink to before the\n * grid drops a column; empty tracks collapse, so N children never produce more\n * than N columns. Spacing on both axes is a single `gutter` gap, so wrapped\n * rows and side-by-side columns separate consistently with no edge artifacts.\n *\n * <fk-columns minColumnWidth=\"18rem\">\n * <fk-field-group>…</fk-field-group>\n * <fk-field-group>…</fk-field-group>\n * </fk-columns>\n *\n * By default columns grow to fill the row (`1fr`). Set `maxColumnWidth` to cap\n * how wide a column may get — past that, columns stay that width and the extra\n * space is left empty (columns aligned to the start) rather than stretching.\n *\n * `emptyTracks` decides what happens to tracks nothing is projected into. The\n * default collapses them, which is right when the children are a fixed set.\n * Keep them when the children are a *filtered* set and a column should be the\n * same width whatever the filter leaves behind.\n */\n@Component({\n selector: 'fk-columns',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './columns.component.html',\n styleUrl: './columns.component.scss',\n})\nexport class ColumnsComponent {\n // ===== INPUTS =====\n /**\n * The smallest width a column may shrink to before the grid drops to fewer\n * columns. This is the single knob that controls when columns wrap/stack.\n */\n readonly minColumnWidth = input<string>('16rem');\n /**\n * Optional cap on how wide a column may grow. Unset (default), columns fill\n * the row (`1fr`); when set (e.g. `'22rem'`), columns size between\n * `minColumnWidth` and this value and don't stretch past it — leftover space\n * stays empty, columns aligned to the start.\n */\n readonly maxColumnWidth = input<string | null>(null);\n /**\n * What becomes of tracks with no child in them.\n *\n * `collapse` (default) removes them — `auto-fit` — so N children never\n * produce more than N columns. The consequence is that the surviving columns\n * share the whole row between them, so a column is wider when it has fewer\n * siblings.\n *\n * `keep` leaves them as empty space — `auto-fill` — so a column is the same\n * width whatever the child count. Use it wherever the children can be\n * filtered: a card that grows because its neighbours were filtered out reads\n * as a bug, not as a layout.\n */\n readonly emptyTracks = input<ColumnsEmptyTracks>('collapse');\n /** Gap between side-by-side columns and between wrapped rows. */\n readonly gutter = input<string>('var(--fk-rhythm-4, 1rem)');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-columns', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n\n @HostBinding('style.--fk-columns-min')\n get hostMin(): string {\n return this.minColumnWidth();\n }\n\n // Null leaves the property unset, so the SCSS falls back to `1fr` (fill).\n @HostBinding('style.--fk-columns-max')\n get hostMax(): string | null {\n return this.maxColumnWidth();\n }\n\n @HostBinding('style.--fk-columns-gutter')\n get hostGutter(): string {\n return this.gutter();\n }\n\n // The grid's repeat keyword, named for the behaviour rather than the CSS so\n // the input reads the same way the docs do.\n @HostBinding('style.--fk-columns-repeat')\n get hostRepeat(): string {\n return this.emptyTracks() === 'keep' ? 'auto-fill' : 'auto-fit';\n }\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Padded container for an expanded dashboard detail region — typically the body\n * of a data-table row expansion, holding an `fk-columns` of form controls.\n *\n * The `disabled` input greys the panel and makes its entire subtree `inert`\n * (non-interactive, unfocusable, hidden from assistive technology) — for\n * controls gated behind a feature toggle that must not be editable until the\n * feature is enabled.\n *\n * <fk-detail-panel [disabled]=\"!feature.enabled\">\n * <fk-columns>…</fk-columns>\n * </fk-detail-panel>\n */\n@Component({\n selector: 'fk-detail-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './detail-panel.component.html',\n styleUrl: './detail-panel.component.scss',\n})\nexport class DetailPanelComponent {\n // ===== INPUTS =====\n /**\n * Greys the panel and makes its content inert (locked) — for feature-gated\n * controls that should not be editable until the feature is enabled.\n */\n readonly disabled = input<boolean>(false);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n [\n 'fk-detail-panel',\n this.disabled() ? 'fk-detail-panel--disabled' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n\n /**\n * Lock the whole subtree when disabled. `inert` blocks pointer interaction,\n * focus, and assistive-tech access in one attribute — stronger and more\n * correct than `pointer-events: none`, which only blocks the mouse.\n */\n @HostBinding('attr.inert')\n get hostInert(): '' | null {\n return this.disabled() ? '' : null;\n }\n}\n","<ng-content />\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport type { SidebarNavLink } from './sidebar-nav.types';\n\n/**\n * Marks an `<ng-template>` whose content `fk-sidebar-nav` renders as an item's\n * leading content — e.g. a method badge or any custom adornment — receiving the\n * item as `$implicit`. The component still owns the row, label, disclosure,\n * active/branch state, collapse, and flyout; this only customizes what sits\n * before the label.\n *\n * The template is applied to any item whose `data` is set; items without `data`\n * fall back to their `icon`.\n *\n * <fk-sidebar-nav [model]=\"nav\">\n * <ng-template fkSidebarNavItem let-item>\n * <fk-method-badge [method]=\"item.data\" />\n * </ng-template>\n * </fk-sidebar-nav>\n */\n@Directive({\n selector: 'ng-template[fkSidebarNavItem]',\n standalone: true,\n})\nexport class SidebarNavItemDirective {\n readonly template =\n inject<TemplateRef<{ $implicit: SidebarNavLink }>>(TemplateRef);\n\n /** Types `let-item` as a `SidebarNavLink` in the consumer's template. */\n static ngTemplateContextGuard(\n _directive: SidebarNavItemDirective,\n _context: unknown,\n ): _context is { $implicit: SidebarNavLink } {\n return true;\n }\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n HostBinding,\n inject,\n Injector,\n input,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n RouterLink,\n} from '@angular/router';\nimport { filter, map, Subscription } from 'rxjs';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { TooltipDirective } from '@frame-kit/ui-ng/directives/tooltip';\nimport { AppShellComponent } from '@frame-kit/ui-ng/layouts/app-shell';\n\nimport { SidebarNavItemDirective } from './sidebar-nav-item.directive';\nimport type {\n SidebarNavItem,\n SidebarNavLink,\n SidebarNavModel,\n} from './sidebar-nav.types';\n\n/**\n * Model-driven dashboard sidebar navigation.\n *\n * Renders a sidebar from a {@link SidebarNavModel}: labelled groups of items,\n * where each item is either a leaf link or a parent with children. The pattern\n * owns the two-state behavior that makes a dashboard rail usable:\n *\n * - **Expanded** — parents disclose their children inline; the section\n * containing the active route stays open and reads as active (tinted).\n * - **Collapsed (icon rail)** — labels collapse to icons with hover tooltips;\n * a parent click opens a **flyout** beside the rail (anchored via CDK\n * Overlay) listing its children, so nested pages stay reachable without\n * expanding the whole sidebar.\n *\n * Drop it into an `fk-app-shell` sidenav slot — it reads the shell's collapse\n * state automatically. Pass `[collapsed]` explicitly to drive the rail without\n * a shell.\n */\n@Component({\n selector: 'fk-sidebar-nav',\n standalone: true,\n imports: [RouterLink, IconComponent, TooltipDirective, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './sidebar-nav.component.html',\n styleUrl: './sidebar-nav.component.scss',\n})\nexport class SidebarNavComponent {\n // ===== INPUTS =====\n /** The navigation model — ordered groups of items. */\n readonly model = input<SidebarNavModel>([]);\n /**\n * Collapsed (icon-rail) state. Left `null`, the component reads the collapse\n * state of an ancestor `fk-app-shell`. Set explicitly to drive the rail\n * without a shell present.\n */\n readonly collapsed = input<boolean | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== DEPENDENCIES =====\n private readonly shell = inject(AppShellComponent, { optional: true });\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly overlay = inject(Overlay);\n private readonly vcr = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n\n // ===== REFS =====\n private readonly flyoutTpl =\n viewChild.required<TemplateRef<unknown>>('flyoutTpl');\n /** Optional consumer template for an item's leading content (e.g. a badge). */\n private readonly itemTpl = contentChild(SidebarNavItemDirective);\n private readonly itemTemplate = computed(\n () => this.itemTpl()?.template ?? null,\n );\n\n /**\n * The leading-content template for an item, or null. Only items carrying\n * `data` use it; others fall back to their `icon`.\n */\n protected leadingTemplate(\n item: SidebarNavLink,\n ): TemplateRef<{ $implicit: SidebarNavLink }> | null {\n return item.data !== undefined && item.data !== null\n ? this.itemTemplate()\n : null;\n }\n\n // ===== STATE =====\n /** Active URL, recomputed on every navigation — drives section-active styling. */\n private readonly currentUrl = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map(() => stripUrl(this.router.url)),\n ),\n { initialValue: stripUrl(this.router.url) },\n );\n /** Parent ids the user has explicitly opened (the active section is always open). */\n private readonly openIds = signal<ReadonlySet<string>>(new Set());\n\n private overlayRef: OverlayRef | null = null;\n /** Overlay-scoped event subscriptions — torn down with the overlay in closeFlyout(). */\n private flyoutSubs: Subscription | null = null;\n /** The trigger row the open flyout is anchored to — used to ignore its own re-click. */\n private flyoutOrigin: HTMLElement | null = null;\n /** The parent whose flyout is currently open (collapsed rail), or null. */\n protected readonly flyoutItem = signal<SidebarNavItem | null>(null);\n\n constructor() {\n // Tear down an open flyout the moment the rail expands. Clicking the shell\n // toggle would close it via the outside-pointer handler, but a programmatic\n // `[collapsed]` change, a responsive breakpoint flip, or a keyboard toggle\n // produces no pointer event — so the overlay would otherwise linger beside\n // the now-expanded sidebar.\n effect(() => {\n if (!this.isCollapsed()) {\n this.closeFlyout();\n }\n });\n\n // Close on any navigation (covers programmatic router.navigate, which\n // disposeOnNavigation does not catch, and keeps internal state in sync).\n effect(() => {\n this.currentUrl();\n this.closeFlyout();\n });\n\n // Auto-open the section that holds the active route — on first load and\n // whenever navigation lands inside a (possibly different, or previously\n // collapsed) section. This only ever *adds* to openIds, so a section the\n // user collapses by hand stays closed until they navigate back into it.\n effect(() => {\n this.currentUrl();\n\n const activeIds = this.model()\n .flatMap((group) => group.items)\n .filter((item) => this.isParent(item) && this.sectionActive(item))\n .map((item) => item.id);\n\n if (activeIds.length === 0) {\n return;\n }\n\n this.openIds.update((set) => {\n const next = new Set(set);\n activeIds.forEach((id) => next.add(id));\n\n return next;\n });\n });\n\n this.destroyRef.onDestroy(() => this.closeFlyout());\n }\n\n // ===== COMPUTED =====\n readonly isCollapsed = computed(\n () => this.collapsed() ?? this.shell?.isCollapsed() ?? false,\n );\n\n readonly classes = computed(() =>\n [\n 'fk-sidebar-nav',\n this.isCollapsed() ? 'fk-sidebar-nav--collapsed' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n // ===== ACTIVE / EXPANSION =====\n protected isParent(item: SidebarNavItem): boolean {\n return (item.children?.length ?? 0) > 0;\n }\n\n protected linkActive(link: SidebarNavLink): boolean {\n const routerLink = link.routerLink;\n\n if (!routerLink) {\n return false;\n }\n\n // Touch currentUrl so the check re-evaluates on every navigation (OnPush).\n this.currentUrl();\n\n // Resolve through the Router rather than string-joining: this handles array\n // commands, relative segments, leading slashes, and matrix/query params\n // correctly — a naive join silently mismatched for array routerLinks.\n const tree = this.router.createUrlTree(\n Array.isArray(routerLink) ? routerLink : [routerLink],\n { relativeTo: this.route },\n );\n\n return this.router.isActive(tree, {\n paths: link.exact ? 'exact' : 'subset',\n queryParams: 'ignored',\n fragment: 'ignored',\n matrixParams: 'ignored',\n });\n }\n\n /** True when the item itself, or any of its children, is the active route. */\n protected sectionActive(item: SidebarNavItem): boolean {\n if (this.linkActive(item)) {\n return true;\n }\n\n return (item.children ?? []).some((child) => this.linkActive(child));\n }\n\n /**\n * Whether a parent discloses its children inline (expanded rail only).\n * Disclosure is owned entirely by `openIds` — the active section is seeded\n * into it by the auto-open effect, so it starts open yet can still be\n * collapsed by clicking the parent (the effect only re-opens on navigation).\n */\n protected isOpen(item: SidebarNavItem): boolean {\n return this.openIds().has(item.id);\n }\n\n // ===== INTERACTIONS =====\n /** Parent row click: flyout in the rail, inline disclosure when expanded. */\n protected onParentClick(item: SidebarNavItem, rowEl: HTMLElement): void {\n if (this.isCollapsed()) {\n this.toggleFlyout(item, rowEl);\n\n return;\n }\n\n this.openIds.update((set) => {\n const next = new Set(set);\n\n if (next.has(item.id)) {\n next.delete(item.id);\n } else {\n next.add(item.id);\n }\n\n return next;\n });\n }\n\n /** Leaf / child / flyout link click — navigation is via routerLink; tidy up. */\n protected onLinkClick(): void {\n this.closeFlyout();\n this.shell?.dismissSidenav();\n }\n\n // ===== FLYOUT (collapsed parent) =====\n private toggleFlyout(item: SidebarNavItem, rowEl: HTMLElement): void {\n if (this.flyoutItem()?.id === item.id) {\n this.closeFlyout();\n\n return;\n }\n\n this.openFlyout(item, rowEl);\n }\n\n private openFlyout(item: SidebarNavItem, rowEl: HTMLElement): void {\n this.closeFlyout();\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(rowEl)\n // Nudge the panel back into the viewport when a low trigger row would push\n // its (now height-capped) box off the bottom edge.\n .withPush(true)\n .withPositions([\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n offsetX: 8,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top',\n offsetX: -8,\n },\n ]);\n\n const overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n panelClass: 'fk-sidebar-nav__flyout',\n // Dispose on browser back/forward so the flyout can't linger over a new\n // page (matches fk-drawer). Programmatic navigation is covered by the\n // route-change effect in the constructor.\n disposeOnNavigation: true,\n });\n\n this.overlayRef = overlayRef;\n this.flyoutOrigin = rowEl;\n this.flyoutItem.set(item);\n overlayRef.attach(\n new TemplatePortal(this.flyoutTpl(), this.vcr, { $implicit: item }),\n );\n\n // After the panel renders: bring the active item into view (so a selection\n // deep in a long, scrolled list is visible on reopen, matching a native\n // select), and point the caret at the trigger's center now that CDK has\n // applied (and possibly pushed) the panel's final position.\n afterNextRender(\n () => {\n this.scrollActiveItemIntoView(overlayRef.overlayElement);\n this.positionFlyoutCaret(overlayRef.overlayElement);\n },\n { injector: this.injector },\n );\n\n // Scope the event subscriptions to this overlay's lifetime via a\n // Subscription torn down in closeFlyout() — not to the component lifetime,\n // and not relying on CDK completing the streams on dispose.\n const subscriptions = new Subscription();\n\n // Re-point the caret whenever CDK repositions the panel (push on open, or a\n // reposition while scrolling) so it keeps tracking the trigger's center.\n subscriptions.add(\n positionStrategy.positionChanges.subscribe(() =>\n this.positionFlyoutCaret(overlayRef.overlayElement),\n ),\n );\n\n subscriptions.add(\n overlayRef.outsidePointerEvents().subscribe((event) => {\n // Ignore clicks on the trigger row itself — the row's own click handler\n // toggles the flyout, so closing here would just let it reopen.\n const target = event.target as Node | null;\n\n if (target && this.flyoutOrigin?.contains(target)) {\n return;\n }\n\n this.closeFlyout();\n }),\n );\n\n subscriptions.add(\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n this.closeFlyout();\n }\n }),\n );\n\n this.flyoutSubs = subscriptions;\n }\n\n private closeFlyout(): void {\n this.flyoutSubs?.unsubscribe();\n this.flyoutSubs = null;\n this.overlayRef?.dispose();\n this.overlayRef = null;\n this.flyoutOrigin = null;\n this.flyoutItem.set(null);\n }\n\n /**\n * Center the active flyout item within its scroll viewport. No-op when there\n * is no active item (nothing selected) or the list isn't scrolled — the\n * `scrollTop` write clamps, so a short list simply stays at the top. Operates\n * only on the items container's own `scrollTop`, never `scrollIntoView`, so it\n * can't perturb the page or the overlay position.\n */\n private scrollActiveItemIntoView(overlayEl: HTMLElement): void {\n const container = overlayEl.querySelector<HTMLElement>(\n '.fk-sidebar-nav__flyout-items',\n );\n const active = container?.querySelector<HTMLElement>(\n '.fk-sidebar-nav__flyout-item--active',\n );\n\n if (!container || !active) {\n return;\n }\n\n const containerBox = container.getBoundingClientRect();\n const activeBox = active.getBoundingClientRect();\n const delta =\n activeBox.top -\n containerBox.top -\n (container.clientHeight - activeBox.height) / 2;\n\n container.scrollTop += delta;\n }\n\n /**\n * Point the flyout caret at the trigger row's vertical center. The caret is\n * absolutely positioned on the panel, so a fixed `top` drifts off the icon as\n * soon as `withPush` (or a flip) shifts the panel; deriving it from the live\n * trigger and panel boxes keeps it aligned. Clamped to the panel so it can't\n * ride off the rounded corners when the trigger sits beyond the panel's span.\n */\n private positionFlyoutCaret(overlayEl: HTMLElement): void {\n const origin = this.flyoutOrigin;\n const panel = overlayEl.querySelector<HTMLElement>(\n '.fk-sidebar-nav__flyout-panel',\n );\n\n if (!origin || !panel) {\n return;\n }\n\n const originBox = origin.getBoundingClientRect();\n const panelBox = panel.getBoundingClientRect();\n\n const caretSize = 11; // px — matches the ::before square\n const edge = 12; // keep the caret clear of the panel's rounded corners\n const center = originBox.top + originBox.height / 2 - panelBox.top;\n const top = Math.max(\n edge,\n Math.min(center - caretSize / 2, panelBox.height - edge - caretSize),\n );\n\n panel.style.setProperty('--fk-sidebar-nav-flyout-caret-top', `${top}px`);\n }\n}\n\n/** Strip query string and fragment so URL comparison matches route paths. */\nfunction stripUrl(url: string): string {\n return url.split('?')[0].split('#')[0];\n}\n","@for (group of model(); track $index) {\n <div class=\"fk-sidebar-nav__group\">\n @if (group.label) {\n <div class=\"fk-sidebar-nav__group-label\">{{ group.label }}</div>\n }\n <div class=\"fk-sidebar-nav__divider\" aria-hidden=\"true\"></div>\n\n <ul class=\"fk-sidebar-nav__list\">\n @for (item of group.items; track item.id) {\n <li class=\"fk-sidebar-nav__item\">\n @if (isParent(item)) {\n <!-- PARENT — disclosure row -->\n <button\n #row\n type=\"button\"\n class=\"fk-sidebar-nav__row fk-sidebar-nav__row--parent\"\n [class.fk-sidebar-nav__row--branch]=\"sectionActive(item)\"\n [attr.aria-expanded]=\"\n isCollapsed() ? flyoutItem()?.id === item.id : isOpen(item)\n \"\n [attr.aria-haspopup]=\"isCollapsed() ? 'true' : null\"\n [attr.aria-label]=\"isCollapsed() ? item.label : null\"\n [fkTooltip]=\"item.label\"\n [fkTooltipDisabled]=\"!isCollapsed()\"\n fkTooltipPosition=\"right\"\n (click)=\"onParentClick(item, row)\"\n >\n @if (leadingTemplate(item); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n } @else if (item.icon) {\n <fk-icon\n class=\"fk-sidebar-nav__icon\"\n [name]=\"item.icon\"\n size=\"sm\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{ item.label }}</span>\n <span\n class=\"fk-sidebar-nav__chevron\"\n [class.fk-sidebar-nav__chevron--open]=\"isOpen(item)\"\n aria-hidden=\"true\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 18 18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.75 4.5L11.25 9L6.75 13.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </span>\n </button>\n\n @if (!isCollapsed() && isOpen(item)) {\n <ul class=\"fk-sidebar-nav__children\">\n @for (child of item.children; track child.id) {\n @if (child.heading) {\n <li class=\"fk-sidebar-nav__subgroup\">\n <span class=\"fk-sidebar-nav__subgroup-title\">{{\n child.label\n }}</span>\n </li>\n } @else {\n <li>\n <a\n class=\"fk-sidebar-nav__child\"\n [class.fk-sidebar-nav__child--active]=\"\n linkActive(child)\n \"\n [attr.aria-current]=\"linkActive(child) ? 'page' : null\"\n [routerLink]=\"child.routerLink\"\n (click)=\"onLinkClick()\"\n >\n @if (leadingTemplate(child); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{\n child.label\n }}</span>\n </a>\n </li>\n }\n }\n </ul>\n }\n } @else {\n <!-- LEAF — direct link -->\n <a\n class=\"fk-sidebar-nav__row\"\n [class.fk-sidebar-nav__row--active]=\"linkActive(item)\"\n [attr.aria-current]=\"linkActive(item) ? 'page' : null\"\n [routerLink]=\"item.routerLink\"\n [attr.aria-label]=\"isCollapsed() ? item.label : null\"\n [fkTooltip]=\"item.label\"\n [fkTooltipDisabled]=\"!isCollapsed()\"\n fkTooltipPosition=\"right\"\n (click)=\"onLinkClick()\"\n >\n @if (leadingTemplate(item); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n } @else if (item.icon) {\n <fk-icon\n class=\"fk-sidebar-nav__icon\"\n [name]=\"item.icon\"\n size=\"sm\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{ item.label }}</span>\n </a>\n }\n </li>\n }\n </ul>\n </div>\n}\n\n<!-- Flyout panel for a collapsed parent (anchored beside the rail via CDK Overlay) -->\n<ng-template #flyoutTpl let-item>\n <!--\n A labelled group of navigation links — not an ARIA `menu`. Menu semantics\n promise roving arrow-key focus we don't implement (these are Tab-navigated\n links), so `role=\"group\"` + `aria-label` is the honest, valid structure.\n -->\n <div\n class=\"fk-sidebar-nav__flyout-panel\"\n role=\"group\"\n [attr.aria-label]=\"item.label\"\n >\n <!-- Decorative: the group is already named by aria-label, so the visual\n title/icon would only repeat it to assistive tech. -->\n <div class=\"fk-sidebar-nav__flyout-head\" aria-hidden=\"true\">\n @if (item.icon) {\n <span class=\"fk-sidebar-nav__flyout-icon\">\n <fk-icon [name]=\"item.icon\" size=\"sm\" />\n </span>\n }\n <span class=\"fk-sidebar-nav__flyout-title\">{{ item.label }}</span>\n </div>\n\n <!--\n The items scroll inside their own bounded container, not the panel: the\n panel hosts the caret (::before) which sits outside its left edge, so\n putting overflow on the panel itself would clip it.\n -->\n <div class=\"fk-sidebar-nav__flyout-items\">\n @for (child of item.children; track child.id) {\n @if (child.heading) {\n <span class=\"fk-sidebar-nav__flyout-subgroup\">{{ child.label }}</span>\n } @else {\n <a\n class=\"fk-sidebar-nav__flyout-item\"\n [class.fk-sidebar-nav__flyout-item--active]=\"linkActive(child)\"\n [attr.aria-current]=\"linkActive(child) ? 'page' : null\"\n [routerLink]=\"child.routerLink\"\n (click)=\"onLinkClick()\"\n >\n @if (leadingTemplate(child); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\n />\n }\n <span class=\"fk-sidebar-nav__label\">{{ child.label }}</span>\n </a>\n }\n }\n </div>\n </div>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\n\n/**\n * The fixed footer chrome for {@link DialogShellComponent} — an optional muted\n * note on the left, then the projected action buttons pushed to the right,\n * above a top divider. Paired with {@link DialogHeaderComponent} so every\n * dialog shares the same chrome.\n *\n * The note icon is optional and degrades gracefully — an empty `noteIcon`\n * simply renders no glyph.\n *\n * ```html\n * <fk-dialog-footer note=\"Takes effect immediately\" noteIcon=\"power\">\n * <fk-button variant=\"outline\" (click)=\"cancel()\">Cancel</fk-button>\n * <fk-button variant=\"primary\" type=\"submit\">Save</fk-button>\n * </fk-dialog-footer>\n * ```\n */\n@Component({\n selector: 'fk-dialog-footer',\n standalone: true,\n imports: [IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dialog-footer.component.html',\n styleUrl: './dialog-footer.component.scss',\n})\nexport class DialogFooterComponent {\n // ===== INPUTS =====\n /** Optional muted note shown on the left (e.g. \"Takes effect immediately\"). */\n readonly note = input<string>('');\n /** Optional icon glyph rendered before the note. Empty renders no glyph. */\n readonly noteIcon = input<string>('');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-dialog-footer', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (note()) {\n <span class=\"fk-dialog-footer__note\">\n @if (noteIcon()) {\n <fk-icon\n class=\"fk-dialog-footer__note-icon\"\n [name]=\"noteIcon()\"\n size=\"sm\"\n />\n }\n {{ note() }}\n </span>\n}\n\n<span class=\"fk-dialog-footer__spacer\"></span>\n\n<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n} from '@angular/core';\n\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { TextComponent } from '@frame-kit/ui-ng/core/text';\nimport { IconBadgeComponent } from '@frame-kit/ui-ng/ui/icon-badge';\n\nimport type { DialogHeaderTint } from './dialog-header.types';\n\n/** The tint tone → the CSS-variable pair driving the icon tile + title accent.\n * Each reference is two-tier (component token → semantic token) so the header\n * renders correctly with no theme loaded and can be retinted per theme. */\nconst TINTS: Record<DialogHeaderTint, { color: string; background: string }> = {\n brand: {\n color:\n 'var(--fk-dialog-header-tint-brand-color, var(--fk-color-primary, #2563eb))',\n background:\n 'var(--fk-dialog-header-tint-brand-bg, var(--fk-color-primary-light, #eff6ff))',\n },\n warning: {\n color:\n 'var(--fk-dialog-header-tint-warning-color, var(--fk-color-warning, #d97706))',\n background:\n 'var(--fk-dialog-header-tint-warning-bg, var(--fk-color-warning-subtle, #fffbeb))',\n },\n success: {\n color:\n 'var(--fk-dialog-header-tint-success-color, var(--fk-color-success, #16a34a))',\n background:\n 'var(--fk-dialog-header-tint-success-bg, var(--fk-color-success-subtle, #f0fdf4))',\n },\n danger: {\n color:\n 'var(--fk-dialog-header-tint-danger-color, var(--fk-color-danger, #dc2626))',\n background:\n 'var(--fk-dialog-header-tint-danger-bg, var(--fk-color-danger-light, #fee2e2))',\n },\n accent: {\n color: 'var(--fk-dialog-header-tint-accent-color, #7c3aed)',\n background: 'var(--fk-dialog-header-tint-accent-bg, #f5f3ff)',\n },\n};\n\n/**\n * The fixed header chrome for {@link DialogShellComponent} — a tinted icon\n * tile, a title with an optional trailing accent, an optional mono subtitle,\n * and a close button. Every dialog wears the same chrome; only the icon, tint,\n * and text differ, so this centralises it instead of each dialog hand-rolling\n * the markup.\n *\n * Text is passed in as plain inputs (no i18n dependency), and the icon is\n * optional — an empty `icon` simply renders no tile, so the header degrades\n * gracefully rather than showing a broken glyph.\n *\n * ```html\n * <fk-dialog-header\n * icon=\"user-ban\"\n * tint=\"warning\"\n * title=\"Deactivate identity\"\n * subtitle=\"Acme Inc. · Members\"\n * (dismiss)=\"close()\"\n * />\n * ```\n */\n@Component({\n selector: 'fk-dialog-header',\n standalone: true,\n imports: [\n HeadlineComponent,\n IconBadgeComponent,\n IconComponent,\n TextComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dialog-header.component.html',\n styleUrl: './dialog-header.component.scss',\n})\nexport class DialogHeaderComponent {\n // ===== INPUTS =====\n /** Icon glyph name for the tile. Empty renders no tile. */\n readonly icon = input<string>('');\n /** Colour accent for the icon tile + title accent. */\n readonly tint = input<DialogHeaderTint>('brand');\n /** Dialog title. */\n readonly title = input.required<string>();\n /** Optional trailing accent appended to the title, rendered in the tint colour. */\n readonly titleAccent = input<string>('');\n /** Optional mono subtitle under the title. */\n readonly subtitle = input<string>('');\n /** Accessible label for the close button. */\n readonly closeLabel = input<string>('Close');\n\n // ===== OUTPUTS =====\n /** Fires when the close button is clicked. */\n readonly dismiss = output<void>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n /** The tint's `{ color, background }` CSS-variable pair. */\n protected readonly tintVars = computed(() => TINTS[this.tint()]);\n\n readonly classes = computed(() =>\n ['fk-dialog-header', `fk-dialog-header--${this.tint()}`, this.className()]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (icon()) {\n <fk-icon-badge\n class=\"fk-dialog-header__icon\"\n [name]=\"icon()\"\n [color]=\"tintVars().color\"\n [backgroundColor]=\"tintVars().background\"\n shape=\"rounded\"\n size=\"md\"\n />\n}\n\n<div class=\"fk-dialog-header__titles\">\n <fk-headline\n class=\"fk-dialog-header__title\"\n [level]=\"2\"\n fontSize=\"var(--fk-dialog-header-title-font-size, 1.25rem)\"\n >\n {{ title() }}\n @if (titleAccent()) {\n <span class=\"fk-dialog-header__accent\" [style.color]=\"tintVars().color\">\n {{ titleAccent() }}</span\n >\n }\n </fk-headline>\n @if (subtitle()) {\n <fk-text class=\"fk-dialog-header__subtitle\" variant=\"small\">\n {{ subtitle() }}\n </fk-text>\n }\n</div>\n\n<button\n type=\"button\"\n class=\"fk-dialog-header__close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"dismiss.emit()\"\n>\n <fk-icon name=\"close\" size=\"sm\" />\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { ButtonComponent } from '@frame-kit/ui-ng/ui/button';\n\nimport { DialogFooterComponent } from '../dialog-footer/dialog-footer.component';\nimport type { DialogHeaderTint } from '../dialog-header/dialog-header.types';\nimport { DialogHeaderComponent } from '../dialog-header/dialog-header.component';\nimport type { DialogConfirmVariant } from './dialog-shell.types';\n\n/**\n * The one dialog shell every dashboard dialog is built from. It owns the fixed\n * chrome — the tinted icon-tile header (title / accent / subtitle + close) and\n * the footer (muted note + the standard Cancel/confirm buttons) — so individual\n * dialogs stop re-declaring any of it. Everything unique to a dialog lives in\n * the projected **content region**.\n *\n * The shell carries no i18n dependency and no domain data: every label is a\n * plain input (with English defaults for the built-in Cancel button), and the\n * icons are inputs that degrade gracefully when empty. Render it inside the\n * consuming app's own `fk-dialog` (opened bare — `header: null, closable:\n * false` — with an `ariaLabel` for an accessible name).\n *\n * The common case needs zero footer markup — set the confirm label/variant and\n * handle the outputs:\n *\n * ```html\n * <fk-dialog-shell\n * icon=\"user-ban\"\n * tint=\"warning\"\n * title=\"Deactivate identity\"\n * [subtitle]=\"subtitle\"\n * footerNote=\"Sign-in blocked\"\n * footerNoteIcon=\"power\"\n * confirmLabel=\"Deactivate\"\n * confirmIcon=\"user-ban\"\n * confirmVariant=\"warning\"\n * [confirmDisabled]=\"!ready()\"\n * (confirm)=\"onConfirm()\"\n * (dismiss)=\"onCancel()\"\n * >\n * <!-- content region: lead, description, cards, callouts … -->\n * </fk-dialog-shell>\n * ```\n *\n * Escape hatches for the exceptions:\n * - leave `confirmLabel` empty and project buttons into the `dialogFooter` slot\n * to keep the footer chrome but use custom buttons (e.g. a form submit);\n * - set `[customHeader]=\"true\"` and project into the `header` slot to replace\n * the whole header;\n * - set `[customFooter]=\"true\"` and project into the `footer` slot to replace\n * the whole footer.\n */\n@Component({\n selector: 'fk-dialog-shell',\n standalone: true,\n imports: [\n ButtonComponent,\n IconComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dialog-shell.component.html',\n styleUrl: './dialog-shell.component.scss',\n})\nexport class DialogShellComponent {\n // ===== INPUTS =====\n /** Icon glyph for the header tile. Empty renders no tile. */\n readonly icon = input<string>('');\n /** Colour accent for the header tile. */\n readonly tint = input<DialogHeaderTint>('brand');\n /** Header title. */\n readonly title = input.required<string>();\n /** Optional trailing accent appended to the title in the tint colour. */\n readonly titleAccent = input<string>('');\n /** Optional mono subtitle under the title. */\n readonly subtitle = input<string>('');\n /** Optional muted footer note on the left (e.g. \"Permanent\"). */\n readonly footerNote = input<string>('');\n /** Optional icon rendered before the footer note. */\n readonly footerNoteIcon = input<string>('');\n /**\n * Confirm-button label. When set, the shell renders the standard\n * Cancel + confirm pair; leave empty to project custom buttons into the\n * `dialogFooter` slot instead.\n */\n readonly confirmLabel = input<string>('');\n /** Optional leading icon on the confirm button. */\n readonly confirmIcon = input<string>('');\n /** Confirm-button colour — `primary` (default), `danger`, or `warning`. */\n readonly confirmVariant = input<DialogConfirmVariant>('primary');\n /** Disables the confirm button (e.g. while a type-to-confirm is unmet). */\n readonly confirmDisabled = input<boolean>(false);\n /** Cancel-button label. Defaults to `Cancel`. */\n readonly cancelLabel = input<string>('Cancel');\n /** Accessible label for the header's close button. */\n readonly closeLabel = input<string>('Close');\n /**\n * Escape hatch for the rare dialog that needs a bespoke header. When true,\n * the default `fk-dialog-header` (icon tile + title + subtitle) is suppressed\n * and whatever is projected into the `header` slot is rendered raw instead.\n */\n readonly customHeader = input<boolean>(false);\n /**\n * Escape hatch for the rare dialog that needs a bespoke footer. When true,\n * the default `fk-dialog-footer` (note + buttons) is suppressed and whatever\n * is projected into the `footer` slot is rendered raw instead.\n */\n readonly customFooter = input<boolean>(false);\n\n // ===== OUTPUTS =====\n /** Fires when the header close button OR the Cancel button is clicked. */\n readonly dismiss = output<void>();\n /** Fires when the confirm button is clicked. */\n readonly confirm = output<void>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n /** `warning` renders as a retinted `danger` fk-button; others map directly. */\n protected readonly confirmButtonVariant = computed<'primary' | 'danger'>(\n () => {\n const variant = this.confirmVariant();\n\n return variant === 'warning' ? 'danger' : variant;\n },\n );\n\n readonly classes = computed(() =>\n ['fk-dialog-shell', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","@if (customHeader()) {\n <ng-content select=\"[header]\" />\n} @else {\n <fk-dialog-header\n class=\"fk-dialog-shell__header\"\n [icon]=\"icon()\"\n [tint]=\"tint()\"\n [title]=\"title()\"\n [titleAccent]=\"titleAccent()\"\n [subtitle]=\"subtitle()\"\n [closeLabel]=\"closeLabel()\"\n (dismiss)=\"dismiss.emit()\"\n />\n}\n\n<div class=\"fk-dialog-shell__body\">\n <ng-content />\n</div>\n\n@if (customFooter()) {\n <ng-content select=\"[footer]\" />\n} @else {\n <fk-dialog-footer [note]=\"footerNote()\" [noteIcon]=\"footerNoteIcon()\">\n @if (confirmLabel()) {\n <fk-button variant=\"outline\" type=\"button\" (click)=\"dismiss.emit()\">\n {{ cancelLabel() }}\n </fk-button>\n <fk-button\n class=\"fk-dialog-shell__confirm\"\n [class.fk-dialog-shell__confirm--danger]=\"confirmVariant() === 'danger'\"\n [class.fk-dialog-shell__confirm--warning]=\"\n confirmVariant() === 'warning'\n \"\n [variant]=\"confirmButtonVariant()\"\n type=\"button\"\n [disabled]=\"confirmDisabled()\"\n (click)=\"confirm.emit()\"\n >\n @if (confirmIcon()) {\n <fk-icon fkButtonIconStart [name]=\"confirmIcon()\" size=\"sm\" />\n }\n {{ confirmLabel() }}\n </fk-button>\n } @else {\n <ng-content select=\"[dialogFooter]\" />\n }\n </fk-dialog-footer>\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { CdkDragEnd } from '@angular/cdk/drag-drop';\nimport { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { ButtonComponent } from '@frame-kit/ui-ng/ui/button';\n\nimport type {\n OnboardingStep,\n OnboardingSubstep,\n OnboardingSubstepToggle,\n} from './onboarding-guide.types';\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface Rect {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ninterface PersistedState {\n collapsed?: boolean;\n pos?: Point;\n}\n\n/** Pointer travel below this is a click, not a drag. */\nconst DRAG_THRESHOLD = 3;\n\n/**\n * A floating, draggable onboarding-progress widget. It presents a checklist of\n * steps with a progress bar, collapses to a compact pill with a progress ring,\n * and can be dragged around (CDK drag). It renders over the app in a fixed\n * layer — drop it once near the app root.\n *\n * **Presentational, not clever.** It renders exactly what it is given and\n * reports what the user did — it derives no step state of its own. Which step\n * is open (`openStepId`), which are done or pending (`steps`), whether it is\n * collapsed (`collapsed`): all inputs. When a step should advance, when a\n * context switch should re-focus the guide, when a choice has gone stale —\n * all consumer decisions, because the consumer knows *what changed*, while\n * the widget only ever sees a new array.\n *\n * **Controlled model, no domain data.** The `steps` model is a required,\n * reactive input: the widget is a pure view of it and emits events when the\n * user acts (`stepAction`, `stepMarkDone`, `stepSecondaryAction`,\n * `substepToggle`, `footerAction`). The consumer owns the step state — so if\n * it is keyed by, say, the active account or environment, swapping the input\n * re-renders the widget instantly. The widget never persists step state.\n *\n * **Collapsed and openStepId are two-way models.** Bind `[(collapsed)]` /\n * `[(openStepId)]` to drive the card ↔ pill swap and the expanded row from\n * outside; the widget writes them only in response to a direct user action.\n *\n * **Container-aware.** `boundary` (a selector or element) confines both\n * dragging and the widget's resting position to a region of the app — e.g. a\n * dashboard's content area, so the widget can never cover navigation or a\n * footer. The default resting spot is the boundary's bottom-right corner, and\n * the widget re-clamps itself whenever its own footprint changes (pill ↔ card\n * swap, a step expanding) or the viewport resizes — a corner-parked pill that\n * expands into a large card pulls itself fully back into view. Until the user\n * actually drags it, it stays anchored to the bottom-right corner.\n *\n * **Presentation state is internal + optionally persisted.** Collapsed and\n * drag position persist to `localStorage` under `storageKey`; pass\n * `storageKey = null` for session-only behavior (e.g. when a consumer-side\n * store owns presentation policy).\n *\n * **Opinionated but themeable.** It ships a house look out of the box; all\n * colour flows through `--fk-onboarding-guide-*` tokens, so overriding those\n * (e.g. pointing them at a brand scale) retints it without touching the markup.\n *\n * ```html\n * <fk-onboarding-guide\n * [steps]=\"steps()\"\n * title=\"Setup guide\"\n * boundary=\".app-content\"\n * [storageKey]=\"null\"\n * [(collapsed)]=\"collapsed\"\n * (stepAction)=\"onStart($event)\"\n * (substepToggle)=\"onToggle($event)\"\n * (footerAction)=\"onGoLive()\"\n * (dismiss)=\"onDismiss()\"\n * />\n * ```\n */\n@Component({\n selector: 'fk-onboarding-guide',\n standalone: true,\n imports: [CdkDragHandle, ButtonComponent, IconComponent],\n hostDirectives: [CdkDrag],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './onboarding-guide.component.html',\n styleUrl: './onboarding-guide.component.scss',\n})\nexport class OnboardingGuideComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly drag = inject(CdkDrag);\n private readonly destroyRef = inject(DestroyRef);\n\n // ===== INPUTS =====\n /** The step model. Controlled by the consumer; the widget is a view of it. */\n readonly steps = input.required<OnboardingStep[]>();\n /** Widget title. */\n readonly title = input<string>('Setup guide');\n /**\n * `localStorage` key for the collapsed + drag-position preferences.\n * `null` disables persistence entirely — presentation state then lives and\n * dies with the component instance (or with whatever the consumer binds).\n */\n readonly storageKey = input<string | null>('fk-onboarding-guide');\n /**\n * Region the widget is confined to: a CSS selector or an element. Both\n * dragging and the widget's resting position are clamped inside it. `null`\n * (the default) confines to the viewport.\n */\n readonly boundary = input<string | HTMLElement | null>(null);\n /** Breathing room kept between the widget and the boundary's edges. */\n readonly boundaryMargin = input<number>(24);\n /** Shows the rename (edit) affordance next to the title. */\n readonly renamable = input<boolean>(false);\n /** Shows the secondary \"mark this step done\" action on leaf steps. */\n readonly showMarkDone = input<boolean>(true);\n\n // --- Text (English defaults; pass translated strings as needed) ---\n /** Default CTA label when a step doesn't supply its own `actionLabel`. */\n readonly startLabel = input<string>('Start');\n /** Secondary \"mark this step done\" action label. */\n readonly markDoneLabel = input<string>('Mark done');\n /** Footer action label (e.g. \"Go live\"). `null` hides the footer action. */\n readonly footerActionLabel = input<string | null>('Go live');\n /** Footer noun for the \"{done} of {total} {stepsWord} {doneWord}\" summary. */\n readonly stepsWord = input<string>('steps');\n /** Footer verb for the summary. */\n readonly doneWord = input<string>('done');\n /** Collapsed-pill suffix, e.g. \"3 steps left\". */\n readonly stepsLeftWord = input<string>('left');\n /** Collapsed-pill copy shown when everything is complete. */\n readonly allDoneLabel = input<string>('All set');\n /** ARIA labels for the icon-only header controls. */\n readonly renameLabel = input<string>('Rename');\n readonly collapseLabel = input<string>('Collapse');\n readonly dismissLabel = input<string>('Dismiss');\n readonly expandLabel = input<string>('Expand');\n\n // --- Icon glyph names (resolved by the app's icon registry) ---\n readonly checkIcon = input<string>('check');\n readonly caretIcon = input<string>('chevron-down');\n readonly editIcon = input<string>('pen');\n readonly collapseIcon = input<string>('collapse');\n readonly dismissIcon = input<string>('close');\n readonly expandIcon = input<string>('expand');\n readonly actionIcon = input<string>('arrow-right');\n\n // ===== MODEL =====\n /**\n * Whether the widget is collapsed to the pill. Two-way bindable so a\n * consumer-side policy (auto-open on context switches, banner-triggered\n * opens) can drive the card ↔ pill swap; unbound, the widget manages it.\n */\n readonly collapsed = model<boolean>(false);\n\n // ===== OUTPUTS =====\n /** A step's primary CTA was clicked. Emits the step id. */\n readonly stepAction = output<string>();\n /** A step's \"mark done\" was clicked. Emits the step id. */\n readonly stepMarkDone = output<string>();\n /** A step's secondary text-action was clicked. Emits the step id. */\n readonly stepSecondaryAction = output<string>();\n /** A substep checkbox was toggled. */\n readonly substepToggle = output<OnboardingSubstepToggle>();\n /** The footer action was invoked. */\n readonly footerAction = output<void>();\n /** The rename (edit) affordance was clicked; the consumer owns renaming. */\n readonly renameClick = output<void>();\n /** The dismiss control was clicked; the consumer decides whether to hide it. */\n readonly dismiss = output<void>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== PRESENTATION STATE =====\n protected readonly dragPosition = signal<Point>({ x: 0, y: 0 });\n\n /** True immediately after a real drag, so the drag-handle's click (e.g. the\n * pill's expand) is suppressed rather than firing at the drop point. */\n private justDragged = false;\n\n /**\n * True once the user has deliberately placed the widget (a real drag now,\n * or a persisted position from a previous session). Until then the widget\n * re-anchors to the boundary's bottom-right corner on every viewport or\n * footprint change instead of merely clamping its current spot.\n */\n private userMoved = false;\n\n private footprintObserver: ResizeObserver | null = null;\n\n /** Guards the one-time preference restore in `hydrateOnce`. */\n private hydrated = false;\n\n /** True between CDK's drag start and drop — `reposition` stands down. */\n private dragging = false;\n\n /** The boundary element currently under observation (if any). */\n private observedBoundary: Element | null = null;\n\n /**\n * The expanded step, or `null` for none. Fully controlled: the widget\n * writes it only when the user toggles a row, and never infers a value\n * of its own — which step should be open, when to advance to the next\n * one, and whether a context switch should re-focus the guide are all\n * decisions the consumer owns (it knows what changed; the widget only\n * sees a new array).\n */\n readonly openStepId = model<string | null>(null);\n\n // ===== DERIVED =====\n protected readonly total = computed(() => this.steps().length);\n protected readonly doneCount = computed(\n () => this.steps().filter((s) => this.isComplete(s)).length,\n );\n protected readonly percent = computed(() => {\n const total = this.total();\n\n return total === 0 ? 0 : Math.round((this.doneCount() / total) * 100);\n });\n protected readonly stepsLeft = computed(\n () => this.total() - this.doneCount(),\n );\n protected readonly complete = computed(\n () => this.total() > 0 && this.stepsLeft() === 0,\n );\n\n /** Circumference for the pill's progress ring (r = 16). */\n protected readonly ringCircumference = 2 * Math.PI * 16;\n protected readonly ringOffset = computed(() => {\n const total = this.total();\n const fraction = total === 0 ? 0 : this.doneCount() / total;\n\n return this.ringCircumference * (1 - fraction);\n });\n\n readonly classes = computed(() =>\n [\n 'fk-onboarding-guide',\n this.collapsed() ? 'fk-onboarding-guide--collapsed' : '',\n this.complete() ? 'fk-onboarding-guide--complete' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n constructor() {\n this.drag.started\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => (this.dragging = true));\n\n this.drag.ended\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.onDragEnded(event));\n\n // The card ↔ pill swap changes the footprint drastically; reposition\n // right after the swap renders. The ResizeObserver covers the same\n // case, but its deliveries ride the rendering loop — which pauses in\n // occluded/backgrounded tabs — so the swap gets a deterministic,\n // task-scheduled companion (layout can be forced without frames).\n effect(() => {\n this.collapsed();\n\n untracked(() => {\n if (typeof window !== 'undefined') {\n setTimeout(() => this.reposition());\n }\n });\n });\n\n // Confine live dragging to the boundary — CDK enforces it during the\n // drag, and `clamp` applies the same region to programmatic placement.\n // The assignment is unconditional so clearing the input releases CDK's\n // constraint too (an empty string disables it), and the position\n // re-clamps immediately so a runtime boundary change moves the widget\n // into the new region instead of waiting for the next geometry trigger.\n // `boundaryMargin` is tracked alongside `boundary` so a runtime margin\n // change re-clamps immediately instead of waiting for the next\n // geometry trigger. Hydration runs first, synchronously, on the very\n // first execution — during initial change detection, BEFORE the first\n // paint — so a returning user's saved position and collapsed state\n // apply without a visible jump from the automatic anchor.\n effect(() => {\n const boundary = this.boundary();\n\n this.boundaryMargin();\n\n untracked(() => {\n this.hydrateOnce();\n this.drag.boundaryElement = boundary ?? '';\n this.syncBoundaryObservation();\n this.reposition();\n });\n });\n\n afterNextRender(() => {\n this.watchGeometry();\n // Re-clamp once real layout has settled — first-CD measurements are\n // forced synchronously and can differ slightly (fonts, late styles).\n this.reposition();\n });\n\n this.destroyRef.onDestroy(() => {\n this.footprintObserver?.disconnect();\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.onViewportResize);\n }\n });\n }\n\n // ===== COMPLETION LOGIC =====\n isComplete(step: OnboardingStep): boolean {\n if (step.substeps && step.substeps.length > 0) {\n return step.substeps.every((sub) => sub.done);\n }\n\n return step.done;\n }\n\n isPending(step: OnboardingStep): boolean {\n return !this.isComplete(step) && step.pending === true;\n }\n\n protected isActive(step: OnboardingStep): boolean {\n return !this.isComplete(step) && this.openStepId() === step.id;\n }\n\n protected actionLabelFor(step: OnboardingStep): string {\n return step.actionLabel || this.startLabel();\n }\n\n // ===== INTERACTIONS =====\n protected toggleStep(stepId: string): void {\n this.openStepId.set(this.openStepId() === stepId ? null : stepId);\n }\n\n protected onAction(step: OnboardingStep): void {\n this.stepAction.emit(step.id);\n }\n\n protected onMarkDone(step: OnboardingStep): void {\n this.stepMarkDone.emit(step.id);\n }\n\n protected onSecondaryAction(step: OnboardingStep): void {\n this.stepSecondaryAction.emit(step.id);\n }\n\n protected onSubstep(step: OnboardingStep, substep: OnboardingSubstep): void {\n this.substepToggle.emit({ stepId: step.id, substepId: substep.id });\n }\n\n protected onCollapse(): void {\n this.setCollapsed(true);\n }\n\n protected onExpand(): void {\n if (this.justDragged) {\n return;\n }\n\n this.setCollapsed(false);\n }\n\n protected onRename(): void {\n this.renameClick.emit();\n }\n\n protected onDismiss(): void {\n this.dismiss.emit();\n }\n\n protected onFooterAction(): void {\n this.footerAction.emit();\n }\n\n private setCollapsed(value: boolean): void {\n this.collapsed.set(value);\n this.persist();\n }\n\n // ===== DRAG =====\n private onDragEnded(event: CdkDragEnd): void {\n this.dragging = false;\n\n const clamped = this.clamp(this.drag.getFreeDragPosition());\n\n this.dragPosition.set(clamped);\n this.drag.setFreeDragPosition(clamped);\n\n const moved =\n Math.abs(event.distance.x) > DRAG_THRESHOLD ||\n Math.abs(event.distance.y) > DRAG_THRESHOLD;\n\n if (moved) {\n this.userMoved = true;\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n this.persist();\n }\n }\n\n // ===== GEOMETRY =====\n /**\n * Keep the resting position valid as the world changes around it. Two\n * signals feed the same repositioning: the viewport resizing, and the\n * widget's own footprint changing (pill ↔ card swap, a step expanding) —\n * the latter is what stops a corner-parked pill from reopening as a card\n * that's mostly off-screen.\n */\n private watchGeometry(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n window.addEventListener('resize', this.onViewportResize);\n\n // Environments without ResizeObserver (some test runners, older\n // runtimes) keep the viewport-resize path; footprint tracking is a\n // progressive enhancement.\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.footprintObserver = new ResizeObserver(() => this.reposition());\n this.footprintObserver.observe(this.host.nativeElement);\n this.syncBoundaryObservation();\n }\n\n /**\n * The boundary region can resize without a viewport resize — a side\n * panel opening, chrome banners toggling — so the confining element is\n * observed alongside the widget's own footprint. Re-synced whenever the\n * `boundary` input changes.\n */\n private syncBoundaryObservation(): void {\n if (!this.footprintObserver) {\n return;\n }\n\n const next = this.resolveBoundaryElement();\n\n if (next === this.observedBoundary) {\n return;\n }\n\n if (this.observedBoundary) {\n this.footprintObserver.unobserve(this.observedBoundary);\n }\n\n if (next) {\n this.footprintObserver.observe(next);\n }\n\n this.observedBoundary = next;\n }\n\n private resolveBoundaryElement(): Element | null {\n const boundary = this.boundary();\n\n if (typeof window === 'undefined' || !boundary) {\n return null;\n }\n\n return typeof boundary === 'string'\n ? document.querySelector(boundary)\n : boundary;\n }\n\n private readonly onViewportResize = (): void => this.reposition();\n\n private reposition(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Never fight a drag in flight: CDK owns the transform until the\n // pointer is released, and writing a position here (a resize or an\n // observer callback can land mid-drag) would tear the widget away\n // from the pointer. `onDragEnded` clamps the drop point anyway.\n if (this.dragging) {\n return;\n }\n\n // A selector boundary may not have matched at mount — re-resolve on\n // every geometry trigger so a late-appearing element gets observed.\n this.syncBoundaryObservation();\n\n const current = this.drag.getFreeDragPosition();\n const target = this.userMoved\n ? this.clamp(current)\n : this.defaultBottomRight();\n\n if (target.x !== current.x || target.y !== current.y) {\n this.dragPosition.set(target);\n this.drag.setFreeDragPosition(target);\n\n // A deliberate placement that just got re-clamped (e.g. the card ↔\n // pill swap) supersedes whatever was stored moments earlier.\n if (this.userMoved) {\n this.persist();\n }\n }\n }\n\n /** The confining region: the `boundary` element's rect, or the viewport. */\n private boundaryRect(): Rect {\n const el = this.resolveBoundaryElement();\n\n if (el) {\n return el.getBoundingClientRect();\n }\n\n return {\n left: 0,\n top: 0,\n right: typeof window === 'undefined' ? 0 : window.innerWidth,\n bottom: typeof window === 'undefined' ? 0 : window.innerHeight,\n };\n }\n\n /**\n * Constrain one axis to `[start + margin, end - size - margin]`.\n *\n * When the region can't fit the widget plus both margins that range is\n * inverted, so the margin is dropped and the widget is fitted to the\n * region's own edges instead — keeping it inside the boundary rather\n * than letting the inset push it out. A widget genuinely larger than\n * its region still overflows (the card has a fixed width and something\n * has to give); it pins to the start edge.\n */\n private clampAxis(\n value: number,\n start: number,\n end: number,\n size: number,\n margin: number,\n ): number {\n const min = start + margin;\n const max = end - size - margin;\n\n if (min <= max) {\n return Math.max(min, Math.min(value, max));\n }\n\n const tightMax = end - size;\n\n if (start <= tightMax) {\n return Math.max(start, Math.min(value, tightMax));\n }\n\n return start;\n }\n\n private clamp(point: Point): Point {\n if (typeof window === 'undefined') {\n return point;\n }\n\n const rect = this.host.nativeElement.getBoundingClientRect();\n const bounds = this.boundaryRect();\n const margin = this.boundaryMargin();\n\n return {\n x: this.clampAxis(point.x, bounds.left, bounds.right, rect.width, margin),\n y: this.clampAxis(\n point.y,\n bounds.top,\n bounds.bottom,\n rect.height,\n margin,\n ),\n };\n }\n\n private defaultBottomRight(): Point {\n if (typeof window === 'undefined') {\n return { x: 0, y: 0 };\n }\n\n const rect = this.host.nativeElement.getBoundingClientRect();\n const bounds = this.boundaryRect();\n const margin = this.boundaryMargin();\n\n // Aim at the bottom-right inset and let the shared clamp resolve it —\n // including the too-narrow-region fallbacks.\n return this.clamp({\n x: bounds.right - rect.width - margin,\n y: bounds.bottom - rect.height - margin,\n });\n }\n\n // ===== PERSISTENCE =====\n /**\n * One-time restore of the persisted preferences, run from the first\n * execution of the boundary effect — inputs are set by then, storage\n * reads are synchronous, and it lands during initial change detection\n * so the restored state is what the first paint shows. The caller's\n * `reposition()` clamps the raw restored position right afterwards.\n */\n private hydrateOnce(): void {\n if (this.hydrated) {\n return;\n }\n\n this.hydrated = true;\n\n const saved = this.read();\n\n // The stored collapsed preference restores only when the model still\n // holds its default — a consumer that mounted the widget with a bound,\n // non-default `collapsed` gave an explicit instruction, and storage\n // must not overwrite it (or echo the stale value back out through\n // `collapsedChange`). Fully controlled usage should disable\n // persistence with `storageKey: null`.\n if (saved.collapsed != null && this.collapsed() === false) {\n this.collapsed.set(saved.collapsed);\n }\n\n if (saved.pos) {\n // A persisted position is a deliberate placement from a previous\n // session — keep honouring it instead of re-anchoring bottom-right.\n this.userMoved = true;\n this.dragPosition.set(saved.pos);\n this.drag.setFreeDragPosition(saved.pos);\n }\n }\n\n private read(): PersistedState {\n const store = this.storage();\n const key = this.storageKey();\n\n if (!store || !key) {\n return {};\n }\n\n try {\n return JSON.parse(store.getItem(key) || '{}');\n } catch {\n return {};\n }\n }\n\n private persist(): void {\n const store = this.storage();\n const key = this.storageKey();\n\n if (!store || !key) {\n return;\n }\n\n // Position is a preference only once the user has actually dragged —\n // persisting the automatic bottom-right anchor would make the next\n // load's hydrate treat it as a deliberate placement and stop the\n // widget from re-anchoring on geometry changes.\n const state: PersistedState = {\n collapsed: this.collapsed(),\n pos: this.userMoved ? this.dragPosition() : undefined,\n };\n\n try {\n store.setItem(key, JSON.stringify(state));\n } catch {\n // Storage unavailable (private mode / quota) — preferences just don't stick.\n }\n }\n\n private storage(): Storage | null {\n try {\n return typeof window === 'undefined' ? null : window.localStorage;\n } catch {\n return null;\n }\n }\n}\n","<!-- ===================== EXPANDED CARD ===================== -->\n<div class=\"fk-onboarding-guide__card\">\n <div class=\"fk-onboarding-guide__head\">\n <div class=\"fk-onboarding-guide__head-top\">\n <span class=\"fk-onboarding-guide__grip\" cdkDragHandle aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"9\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n </span>\n\n <span class=\"fk-onboarding-guide__title\" cdkDragHandle>{{\n title()\n }}</span>\n\n @if (renamable()) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__icon-btn fk-onboarding-guide__edit\"\n [attr.aria-label]=\"renameLabel()\"\n (click)=\"onRename()\"\n >\n <fk-icon [name]=\"editIcon()\" size=\"sm\" />\n </button>\n }\n\n <div class=\"fk-onboarding-guide__head-actions\">\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__icon-btn\"\n [attr.aria-label]=\"collapseLabel()\"\n (click)=\"onCollapse()\"\n >\n <fk-icon [name]=\"collapseIcon()\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__icon-btn\"\n [attr.aria-label]=\"dismissLabel()\"\n (click)=\"onDismiss()\"\n >\n <fk-icon [name]=\"dismissIcon()\" size=\"sm\" />\n </button>\n </div>\n </div>\n\n <div class=\"fk-onboarding-guide__progress\">\n <div\n class=\"fk-onboarding-guide__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"percent()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div\n class=\"fk-onboarding-guide__fill\"\n [style.width.%]=\"percent()\"\n ></div>\n </div>\n <span class=\"fk-onboarding-guide__pct\">{{ percent() }}%</span>\n </div>\n </div>\n\n <div class=\"fk-onboarding-guide__steps\" role=\"list\">\n @for (step of steps(); track step.id) {\n @let done = isComplete(step);\n @let pending = isPending(step);\n @let open = openStepId() === step.id;\n @let active = isActive(step);\n\n <div\n class=\"fk-onboarding-guide__step\"\n role=\"listitem\"\n [class.fk-onboarding-guide__step--done]=\"done\"\n [class.fk-onboarding-guide__step--open]=\"open\"\n >\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__step-row\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggleStep(step.id)\"\n >\n <span\n class=\"fk-onboarding-guide__check\"\n [class.fk-onboarding-guide__check--done]=\"done\"\n [class.fk-onboarding-guide__check--pending]=\"pending\"\n [class.fk-onboarding-guide__check--active]=\"active && !pending\"\n [class.fk-onboarding-guide__check--todo]=\"\n !done && !active && !pending\n \"\n aria-hidden=\"true\"\n >\n @if (done) {\n <fk-icon [name]=\"checkIcon()\" size=\"xs\" />\n } @else if (active || pending) {\n <i class=\"fk-onboarding-guide__dot\"></i>\n }\n </span>\n\n <span class=\"fk-onboarding-guide__step-label\">{{ step.label }}</span>\n\n <span class=\"fk-onboarding-guide__caret\" aria-hidden=\"true\">\n <fk-icon [name]=\"caretIcon()\" size=\"sm\" />\n </span>\n </button>\n\n @if (open) {\n <div class=\"fk-onboarding-guide__step-body\">\n @if (step.substeps && step.substeps.length > 0) {\n @for (sub of step.substeps; track sub.id) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__sub\"\n [class.fk-onboarding-guide__sub--done]=\"sub.done\"\n (click)=\"onSubstep(step, sub)\"\n >\n <span\n class=\"fk-onboarding-guide__sub-check\"\n aria-hidden=\"true\"\n >\n @if (sub.done) {\n <fk-icon [name]=\"checkIcon()\" size=\"xs\" />\n }\n </span>\n <span class=\"fk-onboarding-guide__sub-label\">{{\n sub.label\n }}</span>\n </button>\n }\n } @else {\n @if (step.description) {\n <p class=\"fk-onboarding-guide__desc\">{{ step.description }}</p>\n }\n\n @if (pending && step.pendingNote) {\n <p class=\"fk-onboarding-guide__pending-note\">\n {{ step.pendingNote }}\n </p>\n }\n\n @if (!done || step.secondaryActionLabel) {\n <div class=\"fk-onboarding-guide__actions\">\n @if (!done) {\n <fk-button\n variant=\"primary\"\n size=\"sm\"\n (click)=\"onAction(step)\"\n >\n {{ actionLabelFor(step) }}\n <fk-icon\n fkButtonIconEnd\n [name]=\"actionIcon()\"\n size=\"xs\"\n />\n </fk-button>\n\n @if (showMarkDone()) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__skip\"\n (click)=\"onMarkDone(step)\"\n >\n {{ markDoneLabel() }}\n </button>\n }\n }\n\n @if (step.secondaryActionLabel) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__secondary\"\n (click)=\"onSecondaryAction(step)\"\n >\n {{ step.secondaryActionLabel }}\n </button>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"fk-onboarding-guide__foot\">\n <span class=\"fk-onboarding-guide__foot-text\">\n <b>{{ doneCount() }}</b> / {{ total() }} {{ stepsWord() }}\n {{ doneWord() }}\n </span>\n\n @if (footerActionLabel(); as footerLabel) {\n <button\n type=\"button\"\n class=\"fk-onboarding-guide__go\"\n (click)=\"onFooterAction()\"\n >\n {{ footerLabel }}\n <fk-icon [name]=\"actionIcon()\" size=\"xs\" />\n </button>\n }\n </div>\n</div>\n\n<!-- ===================== COLLAPSED PILL ===================== -->\n<button\n type=\"button\"\n class=\"fk-onboarding-guide__pill\"\n cdkDragHandle\n [attr.aria-label]=\"expandLabel()\"\n (click)=\"onExpand()\"\n>\n <span class=\"fk-onboarding-guide__ring\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 38 38\">\n <circle class=\"fk-onboarding-guide__ring-track\" cx=\"19\" cy=\"19\" r=\"16\" />\n <circle\n class=\"fk-onboarding-guide__ring-prog\"\n cx=\"19\"\n cy=\"19\"\n r=\"16\"\n [style.stroke-dasharray]=\"ringCircumference\"\n [style.stroke-dashoffset]=\"ringOffset()\"\n />\n </svg>\n <span class=\"fk-onboarding-guide__ring-num\">{{ percent() }}%</span>\n </span>\n\n <span class=\"fk-onboarding-guide__pill-meta\">\n <span class=\"fk-onboarding-guide__pill-title\">{{ title() }}</span>\n <span class=\"fk-onboarding-guide__pill-sub\">\n @if (complete()) {\n {{ allDoneLabel() }}\n } @else {\n <b>{{ stepsLeft() }}</b> {{ stepsWord() }} {{ stepsLeftWord() }}\n }\n </span>\n </span>\n\n <span class=\"fk-onboarding-guide__pill-expand\" aria-hidden=\"true\">\n <fk-icon [name]=\"expandIcon()\" size=\"sm\" />\n </span>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * Layout for a dashboard search/filter bar. It lays out a primary search field\n * and fixed-width filter dropdowns in a responsive row and compacts the\n * projected `fk-form-field` / `fk-input` / `fk-select` controls to the house\n * filter-bar size — so every dashboard's filter bar reads the same without\n * per-page CSS.\n *\n * It owns **layout and responsiveness only** — no surrounding border,\n * background, or elevation. If you want the bar to sit inside a card, wrap it in\n * your own surface.\n *\n * Tag the primary search field with the `search` attribute (grows to fill) and\n * each fixed-width filter with the `filter` attribute. Under a narrow container\n * the row stacks and every control goes full-width.\n *\n * ```html\n * <fk-search-bar-layout>\n * <fk-form-field search>\n * <fk-icon fkPrefix name=\"magnifier-outline\" size=\"sm\" />\n * <fk-input formControlName=\"q\" placeholder=\"Search…\" />\n * </fk-form-field>\n *\n * <fk-form-field filter>\n * <fk-select formControlName=\"status\" [options]=\"options\" />\n * </fk-form-field>\n * </fk-search-bar-layout>\n * ```\n *\n * Uses `ViewEncapsulation.None` so it can style the projected controls (the\n * `[search]` / `[filter]` children and the select chevron); its rules are scoped\n * under the block class.\n */\n@Component({\n selector: 'fk-search-bar-layout',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './search-bar-layout.component.html',\n styleUrl: './search-bar-layout.component.scss',\n})\nexport class SearchBarLayoutComponent {\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-search-bar-layout', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.role')\n readonly role = 'search';\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<div class=\"fk-search-bar-layout__row\">\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\n\n/**\n * A titled content section for a dashboard page: an optional heading followed by\n * projected content, with consistent vertical rhythm between the section and its\n * own children.\n *\n * Spacing is top-margin only (never a parent `gap`), so a consumer's per-child\n * `margin-top` overrides cleanly instead of stacking on an invisible gap. The\n * first child sits flush; each subsequent child gets the section rhythm.\n * `marginTop` overrides the section's own top margin per instance.\n *\n * ```html\n * <fk-content-page-section title=\"Members\" [level]=\"3\">\n * <p>…</p>\n * <fk-data-table />\n * </fk-content-page-section>\n * ```\n *\n * Uses `ViewEncapsulation.None` so the inter-child rhythm rule reaches projected\n * content; its rules are scoped under the block class.\n */\n@Component({\n selector: 'fk-content-page-section',\n standalone: true,\n imports: [HeadlineComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './content-page-section.component.html',\n styleUrl: './content-page-section.component.scss',\n})\nexport class ContentPageSectionComponent {\n // ===== INPUTS =====\n readonly title = input<string | null>(null);\n readonly level = input<HeadlineLevel>(5);\n readonly marginTop = input<string | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-page-section', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('style.margin-top')\n get hostMarginTop(): string | null {\n return this.marginTop();\n }\n}\n","@if (title()) {\n <fk-headline [level]=\"level()\">{{ title() }}</fk-headline>\n}\n\n<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Lays its `fk-content-column` children out **side by side**, wrapping and\n * ultimately stacking to a single column based on the row's *own* available\n * width — never the viewport (so it reacts when a sidenav opens or it sits in a\n * narrow panel). Same intrinsic CSS grid as `fk-columns`\n * (`repeat(auto-fit, minmax(min, 1fr))`); `minColumnWidth` is the single knob\n * for when columns stack.\n *\n * Optionally **bordered**, with an optional **headline**\n * (`fk-content-column-headline`) that sits *outside* the border — so the row\n * reads as a titled section wrapping a set of columns.\n *\n * ```html\n * <fk-content-row [bordered]=\"true\" minColumnWidth=\"16rem\">\n * <fk-content-column-headline>Providers</fk-content-column-headline>\n * <fk-content-column>…</fk-content-column>\n * <fk-content-column>…</fk-content-column>\n * </fk-content-row>\n * ```\n */\n@Component({\n selector: 'fk-content-row',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-row.component.html',\n styleUrl: './content-row.component.scss',\n})\nexport class ContentRowComponent {\n // ===== INPUTS =====\n /**\n * The smallest width a column may shrink to before the row drops to fewer\n * columns — the single knob that controls when columns wrap/stack.\n */\n readonly minColumnWidth = input<string>('16rem');\n /**\n * Optional cap on how wide a column may grow. Unset (default), columns fill\n * the row (`1fr`); when set, columns stop at this width and leftover space\n * stays empty (columns aligned to the start).\n */\n readonly maxColumnWidth = input<string | null>(null);\n /** Gap between side-by-side columns and between wrapped rows. */\n readonly gutter = input<string>('var(--fk-rhythm-4, 1rem)');\n /** Draws a bordered, padded box around the columns (not the headline). */\n readonly bordered = input<boolean>(false);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-row', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n\n @HostBinding('style.--fk-content-row-min')\n get hostMin(): string {\n return this.minColumnWidth();\n }\n\n // Null leaves the property unset, so the SCSS falls back to `1fr` (fill).\n @HostBinding('style.--fk-content-row-max')\n get hostMax(): string | null {\n return this.maxColumnWidth();\n }\n\n @HostBinding('style.--fk-content-row-gutter')\n get hostGutter(): string {\n return this.gutter();\n }\n}\n","<!-- Headline sits outside the bordered region. -->\n<ng-content select=\"fk-content-column-headline\" />\n\n<div\n class=\"fk-content-row__grid\"\n [class.fk-content-row__grid--bordered]=\"bordered()\"\n>\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * A single content column — a vertical block of stacked content, with an\n * optional **border** and an optional **headline** (`fk-content-column-headline`)\n * that sits *outside* that border. The semantic unit that goes inside an\n * `fk-content-row` (which lays columns side by side and stacks them when narrow),\n * or stands alone as a bordered, titled section.\n *\n * ```html\n * <fk-content-column [bordered]=\"true\">\n * <fk-content-column-headline>Provider</fk-content-column-headline>\n * …\n * </fk-content-column>\n * ```\n */\n@Component({\n selector: 'fk-content-column',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-column.component.html',\n styleUrl: './content-column.component.scss',\n})\nexport class ContentColumnComponent {\n // ===== INPUTS =====\n /** Draws a bordered, padded box around the content (not the headline). */\n readonly bordered = input<boolean>(false);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-column', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<!-- Headline sits outside the bordered region. -->\n<ng-content select=\"fk-content-column-headline\" />\n\n<div\n class=\"fk-content-column__content\"\n [class.fk-content-column__content--bordered]=\"bordered()\"\n>\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\n/**\n * Optional headline for `fk-content-column` / `fk-content-row`. Projected\n * *outside* the bordered region, so it labels the group without being boxed in\n * with the content. Projects its own text/markup.\n *\n * ```html\n * <fk-content-column [bordered]=\"true\">\n * <fk-content-column-headline>Provider</fk-content-column-headline>\n * …\n * </fk-content-column>\n * ```\n */\n@Component({\n selector: 'fk-content-column-headline',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-column-headline.component.html',\n styleUrl: './content-column-headline.component.scss',\n})\nexport class ContentColumnHeadlineComponent {\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-column-headline', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\nimport { HeadlineComponent } from '@frame-kit/ui-ng/core/headline';\nimport { TextComponent } from '@frame-kit/ui-ng/core/text';\n\n/**\n * A back control paired with a title / subtitle lockup — the recurring\n * \"‹ back, then a heading\" header used at the top of a secondary nav rail or a\n * detail view. The title renders through `fk-headline` (its level is\n * configurable via `headingLevel`) and the optional subtitle through `fk-text`.\n *\n * **No icon dependency** (see the patterns DEVELOPMENT_GUIDE): the back control\n * renders a projected icon via the `[backIcon]` slot, falling back to a CSS\n * glyph when none is projected — the consuming app injects its own icon.\n *\n * <fk-back-nav title=\"Settings\" subtitle=\"Acme Inc\" (back)=\"goBack()\">\n * <fk-icon backIcon name=\"arrow-left-outline-duo\" />\n * </fk-back-nav>\n *\n * Presentational — the host owns routing (handle `(back)`). Exposed as a\n * building block: `fk-content-detail-header` composes it.\n */\n@Component({\n selector: 'fk-back-nav',\n standalone: true,\n imports: [HeadlineComponent, TextComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './back-nav.component.html',\n styleUrl: './back-nav.component.scss',\n})\nexport class BackNavComponent {\n // ===== INPUTS =====\n /** Title text, rendered via `fk-headline`. */\n readonly title = input.required<string>();\n\n /** Optional subtitle, rendered via `fk-text` under the title. */\n readonly subtitle = input<string>('');\n\n /** Heading level passed to `fk-headline`. */\n readonly headingLevel = input<HeadlineLevel>(3);\n\n /** Render the back control. Hide it where the lockup leads without one. */\n readonly showBack = input<boolean>(true);\n\n /** Accessible label for the back control. */\n readonly backAriaLabel = input<string>('Back');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== OUTPUTS =====\n /** Emitted when the back control is activated; the host handles navigation. */\n readonly back = output<void>();\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-back-nav', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (showBack()) {\n <button\n type=\"button\"\n class=\"fk-back-nav__back\"\n [attr.aria-label]=\"backAriaLabel()\"\n (click)=\"back.emit()\"\n >\n <ng-content select=\"[backIcon]\" />\n </button>\n}\n\n<div class=\"fk-back-nav__text\">\n <div class=\"fk-back-nav__headline\">\n <fk-headline [level]=\"headingLevel()\">{{ title() }}</fk-headline>\n <ng-content select=\"[headline]\" />\n </div>\n\n @if (subtitle()) {\n <fk-text variant=\"caption\" tone=\"muted\">{{ subtitle() }}</fk-text>\n }\n\n <div class=\"fk-back-nav__subtitle\">\n <ng-content select=\"[subtitle]\" />\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport type { HeadlineLevel } from '@frame-kit/ui-ng/core/headline';\n\nimport { BackNavComponent } from '../back-nav/back-nav.component';\n\n/**\n * Detail-view header — an `fk-back-nav` lockup (back control + title/subtitle)\n * on the left and up to ~3 actions on the right. Sits at the top of a routed\n * detail surface: back returns to the list, the title/subtitle name the record,\n * and `[detailHeaderActions]` holds the record's actions.\n *\n * Like `fk-page-header`, the actions drop below the lockup and go full-width when\n * the header's own width gets tight (a CSS container query on the host), so it\n * behaves inside a narrow panel, not just at the viewport.\n *\n * **No icon dependency** — the back icon is projected via `[detailHeaderBackIcon]`\n * (forwarded to the lockup), falling back to a CSS glyph. Presentational — the\n * host owns routing (handle `(back)`). Pairs with `fk-content-detail-page`, which\n * places it over a scrollable body (any framing is the consuming app's skin).\n *\n * <fk-content-detail-header\n * title=\"Okta — Employees\"\n * subtitle=\"SAML · Admin · con_9f2a4b\"\n * (back)=\"goBack()\"\n * >\n * <fk-icon detailHeaderBackIcon name=\"arrow-left-outline-duo\" />\n * <fk-button detailHeaderActions variant=\"outline\" size=\"sm\">Disable</fk-button>\n * </fk-content-detail-header>\n */\n@Component({\n selector: 'fk-content-detail-header',\n standalone: true,\n imports: [BackNavComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './content-detail-header.component.html',\n styleUrl: './content-detail-header.component.scss',\n})\nexport class ContentDetailHeaderComponent {\n // ===== INPUTS =====\n /** Title naming the record. */\n readonly title = input.required<string>();\n\n /** Optional subtitle under the title (e.g. a type/scope/id line). */\n readonly subtitle = input<string>('');\n\n /** Heading level for the title. Defaults to 3 (~22px), a sub-surface heading. */\n readonly headingLevel = input<HeadlineLevel>(3);\n\n /** Render the back control. Hosts that embed the header inline hide it. */\n readonly showBack = input<boolean>(true);\n\n /** Accessible label for the back control. */\n readonly backAriaLabel = input<string>('Back');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== OUTPUTS =====\n /** Emitted when the back control is activated; the host handles navigation. */\n readonly back = output<void>();\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-content-detail-header', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<header class=\"fk-content-detail-header__bar\" [attr.aria-label]=\"ariaLabel()\">\n <fk-back-nav\n class=\"fk-content-detail-header__lead\"\n [title]=\"title()\"\n [subtitle]=\"subtitle()\"\n [headingLevel]=\"headingLevel()\"\n [showBack]=\"showBack()\"\n [backAriaLabel]=\"backAriaLabel()\"\n (back)=\"back.emit()\"\n >\n <ng-content select=\"[detailHeaderBackIcon]\" ngProjectAs=\"[backIcon]\" />\n <ng-content select=\"[detailHeaderHeadline]\" ngProjectAs=\"[headline]\" />\n <ng-content select=\"[detailHeaderSubtitle]\" ngProjectAs=\"[subtitle]\" />\n </fk-back-nav>\n\n <div class=\"fk-content-detail-header__actions\">\n <ng-content select=\"[detailHeaderActions]\" />\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { ContentDetailHeaderComponent } from '../content-detail-header/content-detail-header.component';\n\n/**\n * Detail surface for content too large for a drawer: an\n * `fk-content-detail-header` (back control, heading/subtitle, `[actions]`) over\n * a body (`<ng-content>`), stacked in a flex column.\n *\n * Structural only — it carries **no visual chrome** (no border, background,\n * padding, sticky, or motion) and imposes no scroll behavior of its own; the\n * consuming app adds those as a skin, e.g. targeting the `--page` host modifier.\n *\n * `mode` drives the header's back control:\n * - `page` (default): shows the back control; `(back)` is emitted for the host.\n * - `embedded`: inline for a tab panel — no back control.\n *\n * Pairs with `fk-content-split-layout`.\n */\n@Component({\n selector: 'fk-content-detail-page',\n standalone: true,\n imports: [ContentDetailHeaderComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n templateUrl: './content-detail-page.component.html',\n styleUrl: './content-detail-page.component.scss',\n})\nexport class ContentDetailPageComponent {\n /** Heading shown in the header. */\n readonly heading = input<string>('');\n\n /** Optional subtitle under the heading (forwarded to the header). */\n readonly subtitle = input<string>('');\n\n /** Back-control label. */\n readonly backLabel = input<string>('Back');\n\n /**\n * `page` — shows the header's back control. `embedded` — inline content for a\n * tab panel (no back control). Also exposed as a `--page` / `--embedded` host\n * modifier class so a consumer skin can frame each mode differently.\n */\n readonly mode = input<'page' | 'embedded'>('page');\n\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n /** Emitted when the back control is activated; the host handles navigation. */\n readonly back = output<void>();\n\n @HostBinding('class')\n get hostClass(): string {\n return [\n 'fk-content-detail-page',\n `fk-content-detail-page--${this.mode()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<div class=\"fk-content-detail-page__header\">\n <fk-content-detail-header\n [title]=\"heading()\"\n [subtitle]=\"subtitle()\"\n [backAriaLabel]=\"backLabel()\"\n [showBack]=\"mode() === 'page'\"\n (back)=\"back.emit()\"\n >\n <ng-content select=\"[backIcon]\" ngProjectAs=\"[detailHeaderBackIcon]\" />\n <ng-content select=\"[headline]\" ngProjectAs=\"[detailHeaderHeadline]\" />\n <ng-content select=\"[subtitle]\" ngProjectAs=\"[detailHeaderSubtitle]\" />\n <ng-content select=\"[actions]\" ngProjectAs=\"[detailHeaderActions]\" />\n </fk-content-detail-header>\n</div>\n\n<div class=\"fk-content-detail-page__body\">\n <ng-content />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { LoaderComponent } from '@frame-kit/ui-ng/ui/loader';\n\n/**\n * The line a region shows while it fetches something of its own: a small\n * spinner beside a label, centered where the content will be.\n *\n * Sits in place of the content so a section that is still resolving reads as\n * working rather than as empty. Mono and faint because it is machinery\n * reporting itself, not content that has arrived.\n *\n * Not for a whole page — a page has its own loading state. This is for a\n * section whose data comes separately from the rest: a drawer panel, a\n * capability list, an audit page inside a detail view.\n *\n * <fk-inline-loader label=\"Loading capabilities…\" />\n *\n * The label doubles as the spinner's accessible name — one string, so the two\n * cannot drift.\n */\n@Component({\n selector: 'fk-inline-loader',\n standalone: true,\n imports: [LoaderComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './inline-loader.component.html',\n styleUrl: './inline-loader.component.scss',\n})\nexport class InlineLoaderComponent {\n // ===== INPUTS =====\n /** What is being fetched, already translated. Also the spinner's aria-label. */\n readonly label = input.required<string>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() =>\n ['fk-inline-loader', this.className()].filter(Boolean).join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n}\n","<fk-loader size=\"sm\" [ariaLabel]=\"label()\" />\n<span class=\"fk-inline-loader__label\">{{ label() }}</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport {\n DropdownMenuComponent,\n DropdownPanelDirective,\n DropdownTriggerDirective,\n} from '@frame-kit/ui-ng/ui/dropdown-menu';\n\nimport type {\n ContextSwitcherColumn,\n ContextSwitcherIconTone,\n ContextSwitcherOption,\n ContextSwitcherSelection,\n ContextSwitcherSublabelTone,\n} from './context-switcher.types';\n\n/**\n * The sidebar control for \"which context am I working in\": a trigger showing\n * the current name over a small category line, and a panel of one or more\n * titled option columns.\n *\n * Several of these stack in a rail (an account, an application, an\n * environment), and any visible difference between them reads as a mistake\n * rather than a distinction — so the chrome lives here once, and the meaning\n * stays with the caller. This holds no data, fetches nothing, and knows\n * nothing about what the options are; it reports what was clicked.\n *\n * <fk-context-switcher\n * [name]=\"accountName()\"\n * sublabel=\"Account\"\n * ariaLabel=\"Switch account\"\n * [columns]=\"columns()\"\n * (optionSelect)=\"onSelect($event)\"\n * >\n * <fk-icon contextSwitcherIcon name=\"organization\" />\n * </fk-context-switcher>\n *\n * Closing is the caller's call: choosing an account commits and should close,\n * while choosing an application in a two-column switcher only re-focuses the\n * second column and must stay open. Call `close()` when you mean to.\n */\n@Component({\n selector: 'fk-context-switcher',\n standalone: true,\n imports: [\n DropdownMenuComponent,\n DropdownTriggerDirective,\n DropdownPanelDirective,\n ],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './context-switcher.component.html',\n styleUrl: './context-switcher.component.scss',\n})\nexport class ContextSwitcherComponent {\n // ===== INPUTS =====\n /**\n * The trigger's headline — the context you are in. Null renders a\n * skeleton rather than an empty row, for a first load with nothing cached.\n */\n readonly name = input<string | null>(null);\n\n /**\n * The small mono line beneath the name — the kind of thing the name is\n * (\"Account\"), or a second piece of live context. Null renders a skeleton;\n * empty renders nothing.\n */\n readonly sublabel = input<string | null>('');\n\n readonly iconTone = input<ContextSwitcherIconTone>('brand');\n readonly sublabelTone = input<ContextSwitcherSublabelTone>('muted');\n\n /** Icon-rail mode — the trigger collapses to its badge. */\n readonly collapsed = input(false);\n\n /**\n * The collapsed trigger shows no text, so it carries the current context in\n * its label instead. Falls back to `ariaLabel`.\n */\n readonly collapsedAriaLabel = input<string>('');\n\n /** One column, or several. Empty columns render nothing. */\n readonly columns = input.required<readonly ContextSwitcherColumn[]>();\n\n // ===== OUTPUTS =====\n readonly optionSelect = output<ContextSwitcherSelection>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n /** Describes the control itself. */\n readonly ariaLabel = input<string>('');\n\n // ===== COMPUTED =====\n private readonly dropdown = viewChild.required(DropdownMenuComponent);\n\n /** Two columns sit side by side; one fills the panel. */\n readonly multiColumn = computed(() => this.columns().length > 1);\n\n readonly triggerAriaLabel = computed(() =>\n this.collapsed()\n ? this.collapsedAriaLabel() || this.ariaLabel()\n : this.ariaLabel(),\n );\n\n readonly classes = computed(() =>\n [\n 'fk-context-switcher',\n this.collapsed() ? 'fk-context-switcher--collapsed' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n /** Close the panel. The caller decides when a selection is final. */\n close(): void {\n this.dropdown().close();\n }\n\n protected onSelect(\n column: ContextSwitcherColumn,\n option: ContextSwitcherOption,\n ): void {\n this.optionSelect.emit({ columnKey: column.key, option });\n }\n}\n","<fk-dropdown-menu\n [ariaLabel]=\"ariaLabel() || null\"\n placement=\"bottom-start\"\n [portal]=\"true\"\n>\n <button\n fkDropdownTrigger\n type=\"button\"\n class=\"fk-context-switcher__trigger\"\n [class.fk-context-switcher__trigger--collapsed]=\"collapsed()\"\n [attr.aria-label]=\"triggerAriaLabel() || null\"\n >\n <!--\n One badge for both states, so the projected icon has exactly one outlet.\n The fallback glyph shows only while nothing is projected.\n -->\n <span\n class=\"fk-context-switcher__icon\"\n [class.fk-context-switcher__icon--solid]=\"iconTone() === 'solid'\"\n aria-hidden=\"true\"\n >\n <ng-content select=\"[contextSwitcherIcon]\" />\n </span>\n\n @if (!collapsed()) {\n <span class=\"fk-context-switcher__labels\">\n <span class=\"fk-context-switcher__name\">\n @if (name(); as resolved) {\n {{ resolved }}\n } @else {\n <span class=\"fk-context-switcher__skeleton\" aria-hidden=\"true\"\n >&nbsp;</span\n >\n }\n </span>\n <span\n class=\"fk-context-switcher__sublabel\"\n [class.fk-context-switcher__sublabel--primary]=\"\n sublabelTone() === 'primary'\n \"\n >\n @if (sublabel(); as resolved) {\n {{ resolved }}\n } @else if (sublabel() === null) {\n <span\n class=\"fk-context-switcher__skeleton fk-context-switcher__skeleton--sublabel\"\n aria-hidden=\"true\"\n >&nbsp;</span\n >\n }\n </span>\n </span>\n\n <span class=\"fk-context-switcher__chevron\" aria-hidden=\"true\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 18 18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 6.75L9 11.25L13.5 6.75\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </span>\n }\n </button>\n\n <ng-template fkDropdownPanel>\n <div\n class=\"fk-context-switcher__panel\"\n [class.fk-context-switcher__panel--multi]=\"multiColumn()\"\n >\n @for (column of columns(); track column.key) {\n <div class=\"fk-context-switcher__column\">\n <div class=\"fk-context-switcher__column-title\">\n {{ column.title }}\n </div>\n <div class=\"fk-context-switcher__list\" role=\"listbox\">\n @for (option of column.options; track option.id) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"fk-context-switcher__item\"\n [class.fk-context-switcher__item--active]=\"\n option.id === column.activeId\n \"\n [attr.aria-selected]=\"option.id === column.activeId\"\n (click)=\"onSelect(column, option)\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n</fk-dropdown-menu>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { AppShellComponent } from '@frame-kit/ui-ng/layouts/app-shell';\n\nimport { SidebarNavComponent } from '../sidebar-nav/sidebar-nav.component';\nimport type {\n SidebarNavItem,\n SidebarNavModel,\n} from '../sidebar-nav/sidebar-nav.types';\nimport type {\n DashboardNavGroup,\n DashboardNavItem,\n} from './dashboard-nav.types';\n\ninterface NavSegment {\n id: string;\n before: boolean;\n after: boolean;\n separated: boolean;\n model: SidebarNavModel;\n}\n\n/**\n * A dashboard's sidebar navigation: the caller's groups, with items the\n * caller may not open already removed, rendered as one `fk-sidebar-nav` per\n * group so that projected controls — an account switcher, an environment\n * switcher — can sit between groups.\n *\n * <fk-dashboard-nav\n * [groups]=\"groups()\"\n * [collapsed]=\"collapsed()\"\n * slotBeforeGroupId=\"workspace\"\n * slotAfterGroupId=\"access\"\n * >\n * <div navSlotBefore><fk-context-switcher … /></div>\n * <div><fk-context-switcher … /></div>\n * </fk-dashboard-nav>\n *\n * Visibility is a plain boolean on each item, decided by the caller from\n * whatever authority it has; this component only removes what is hidden. A\n * parent whose children have all been removed goes too — it would expand to\n * nothing. Disclosure, active state and the collapsed-rail flyout are owned\n * by `fk-sidebar-nav`.\n */\n@Component({\n selector: 'fk-dashboard-nav',\n standalone: true,\n imports: [SidebarNavComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dashboard-nav.component.html',\n styleUrl: './dashboard-nav.component.scss',\n})\nexport class DashboardNavComponent {\n // ===== INPUTS =====\n readonly groups = input.required<DashboardNavGroup[]>();\n /**\n * Icon-rail mode, passed through to every segment. Left `null` — the\n * default — each segment reads the collapse state of an ancestor\n * `fk-app-shell`, which is what `fk-dashboard-layout` is. Set it\n * explicitly only to drive the rail without a shell present.\n *\n * It defaults to inheriting rather than to `false` because the failure is\n * silent otherwise: a nav told nothing renders its expanded rows into a\n * collapsed rail and they are squashed, with no error to follow.\n */\n readonly collapsed = input<boolean | null>(null);\n /** Project `[navSlotBefore]` content immediately before this group. */\n readonly slotBeforeGroupId = input<string | null>(null);\n /** Project default `<ng-content>` immediately after this group. */\n readonly slotAfterGroupId = input<string | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== INJECTED =====\n private readonly shell = inject(AppShellComponent, { optional: true });\n\n // ===== COMPUTED =====\n /** The rail state in force: this input, else the ancestor shell's. */\n readonly isCollapsed = computed(\n () => this.collapsed() ?? this.shell?.isCollapsed() ?? false,\n );\n\n /**\n * Visible groups sliced into render segments, each carrying a single-group\n * `SidebarNavModel`.\n */\n private readonly segments = computed<NavSegment[]>(() => {\n const before = this.slotBeforeGroupId();\n const after = this.slotAfterGroupId();\n\n return this.groups()\n .map((group) => ({\n group,\n items: group.items\n .filter((item) => item.visible !== false)\n .map((item) =>\n item.children\n ? {\n ...item,\n children: item.children.filter((c) => c.visible !== false),\n }\n : item,\n )\n .filter((item) => !item.children || item.children.length > 0),\n }))\n .filter((entry) => entry.items.length > 0)\n .map((entry, index) => ({\n id: entry.group.id,\n before: before === entry.group.id,\n after: after === entry.group.id,\n separated: index > 0 && (entry.group.separatorBefore ?? false),\n model: [\n {\n label: entry.group.label,\n items: entry.items.map(toModelItem),\n },\n ],\n }));\n });\n\n /**\n * Groups above the projected `[navSlotBefore]` content, and those below it.\n * Split rather than conditionally projecting inside the loop: the slot's\n * position is expressed by what is emitted around it, so the template needs\n * exactly one outlet — Angular projects to the first matching `ng-content`,\n * and a second copy (or one inside a false `@if`) swallows the content.\n */\n readonly segmentsBeforeSlot = computed<NavSegment[]>(() => {\n const all = this.segments();\n const anchor = all.findIndex((segment) => segment.before);\n\n return anchor < 0 ? [] : all.slice(0, anchor);\n });\n\n readonly segmentsAfterSlot = computed<NavSegment[]>(() => {\n const all = this.segments();\n const anchor = all.findIndex((segment) => segment.before);\n\n return anchor < 0 ? all : all.slice(anchor);\n });\n\n readonly classes = computed(() =>\n [\n 'fk-dashboard-nav',\n this.isCollapsed() ? 'fk-dashboard-nav--collapsed' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n /**\n * The sidebar is a navigation landmark, so a screen reader can jump to it\n * rather than walking the page to find it. The host is the element that\n * holds every link, so the role belongs here; without it the `aria-label`\n * below names nothing, and a page whose only other landmark is a breadcrumb\n * offers no way to reach the navigation at all.\n */\n @HostBinding('attr.role')\n readonly hostRole = 'navigation';\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n\n/** Strip the visibility flags; `fk-sidebar-nav` never sees a hidden row. */\nfunction toModelItem(item: DashboardNavItem): SidebarNavItem {\n const { visible: _visible, children, ...rest } = item;\n\n return {\n ...rest,\n children: children?.map(({ visible: _v, ...child }) => child),\n };\n}\n","@for (segment of segmentsBeforeSlot(); track segment.id) {\n @if (segment.separated) {\n <div class=\"fk-dashboard-nav__separator\" aria-hidden=\"true\"></div>\n }\n <fk-sidebar-nav [model]=\"segment.model\" [collapsed]=\"isCollapsed()\" />\n}\n\n<!--\n Exactly one outlet for `[navSlotBefore]`, never inside a conditional. With\n no anchored group, or no groups at all, both loops are empty and the slot\n lands at the top — so a caller with nothing to navigate to still gets its\n switcher, which is the one way back to somewhere it can use.\n-->\n<ng-content select=\"[navSlotBefore]\" />\n\n@for (segment of segmentsAfterSlot(); track segment.id) {\n @if (segment.separated) {\n <div class=\"fk-dashboard-nav__separator\" aria-hidden=\"true\"></div>\n }\n <fk-sidebar-nav [model]=\"segment.model\" [collapsed]=\"isCollapsed()\" />\n @if (segment.after) {\n <ng-content />\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport {\n AppShellComponent,\n type AppShellMode,\n} from '@frame-kit/ui-ng/layouts/app-shell';\n\n/**\n * The chrome of a signed-in dashboard, built on `fk-app-shell`: a full-height\n * aside with a brand header and collapse toggle, a sticky frosted topbar with\n * a mobile hamburger, a capped page area with an optional loading veil, and a\n * footer. Every dashboard that uses it gets the identical structure — the\n * same hamburger, the same collapse, the same scroll behaviour — and differs\n * only in what it projects.\n *\n * <fk-dashboard-layout [pageLoading]=\"navigating()\">\n * <fk-nav-brand layoutBrand brandText=\"Acme\" />\n * <fk-dashboard-nav layoutAside [groups]=\"groups()\" [collapsed]=\"collapsed()\" />\n * <nav layoutTopbarStart>Acme / Overview</nav>\n * <fk-user-menu layoutTopbarEnd … />\n * <router-outlet />\n * <span layoutFooter>© Acme</span>\n * </fk-dashboard-layout>\n *\n * A dashboard that needs a trailing panel — a documentation reader, a detail\n * inspector — projects it into `[layoutEnd]` and chooses its `endMode`. One\n * that needs a panel beside the page, such as a secondary navigation, projects\n * it into `[layoutContentPanel]`, which sits in the content row ahead of the\n * scroll container so the page scrolls under it rather than with it.\n *\n * The aside's toggle and the topbar's hamburger drive the underlying shell;\n * `collapsed` reports the rail state so projected controls can follow it.\n * The toggle glyphs are projection slots with a built-in fallback, so no icon\n * registry is required.\n */\n@Component({\n selector: 'fk-dashboard-layout',\n standalone: true,\n imports: [AppShellComponent],\n encapsulation: ViewEncapsulation.Emulated,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dashboard-layout.component.html',\n styleUrl: './dashboard-layout.component.scss',\n})\nexport class DashboardLayoutComponent {\n // ===== INPUTS =====\n /** Passed to `fk-app-shell`. `icon` collapses to a rail; `side` hides entirely. */\n readonly mode = input<AppShellMode>('icon');\n readonly sidenavWidth = input<string>('260px');\n readonly collapsedWidth = input<string>('64px');\n /** Layout mode for the trailing panel, when `[layoutEnd]` is projected. */\n readonly endMode = input<AppShellMode>('over');\n readonly endWidth = input<string>('400px');\n readonly endCollapsedWidth = input<string>('64px');\n /** Veil the page area with the projected `[layoutPageLoader]` content. */\n readonly pageLoading = input(false);\n /** Accessible name for the aside's collapse toggle. */\n readonly toggleAriaLabel = input<string>('Toggle navigation');\n /** Accessible name for the topbar's mobile hamburger. */\n readonly menuAriaLabel = input<string>('Open navigation');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n private readonly shell = viewChild(AppShellComponent);\n\n /** Whether the aside is in its icon rail. Projected controls follow this. */\n readonly collapsed = computed(() => this.shell()?.isCollapsed() ?? false);\n\n /** Whether the trailing panel is showing. Projected controls follow this. */\n readonly endOpen = computed(() => this.shell()?.endOpen() ?? false);\n\n readonly classes = computed(() =>\n [\n 'fk-dashboard-layout',\n this.collapsed() ? 'fk-dashboard-layout--collapsed' : '',\n this.pageLoading() ? 'fk-dashboard-layout--page-loading' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass(): string {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n /** The aside header's toggle: collapse or expand the rail. */\n toggleSidenav(): void {\n this.shell()?.toggleSidenav();\n }\n\n /** The topbar hamburger: open the off-canvas aside on narrow viewports. */\n openSidenav(): void {\n this.shell()?.openSidenav();\n }\n\n /**\n * Collapse the rail from outside the header's own toggle — what a dashboard\n * calls when it opens the trailing panel and wants the room.\n */\n closeSidenav(): void {\n this.shell()?.closeSidenav();\n }\n\n /** Show the projected `[layoutEnd]` panel. */\n openEnd(): void {\n this.shell()?.openEnd();\n }\n\n /** Hide it. */\n closeEnd(): void {\n this.shell()?.closeEnd();\n }\n\n /** Hide it if it is showing, show it if it is not. */\n toggleEnd(): void {\n this.shell()?.toggleEnd();\n }\n}\n","<!--\n Banners sit above the shell, in flow, inside the fixed-height host: the\n shell absorbs whatever height they leave, so a banner appearing never adds a\n document scrollbar.\n-->\n<ng-content select=\"[layoutBanner]\" />\n\n<fk-app-shell\n [mode]=\"mode()\"\n [sidenavWidth]=\"sidenavWidth()\"\n [collapsedWidth]=\"collapsedWidth()\"\n [endMode]=\"endMode()\"\n [endWidth]=\"endWidth()\"\n [endCollapsedWidth]=\"endCollapsedWidth()\"\n>\n <div appShellSidenav class=\"fk-dashboard-layout__aside\">\n <div class=\"fk-dashboard-layout__aside-header\">\n <div class=\"fk-dashboard-layout__brand\">\n <ng-content select=\"[layoutBrand]\" />\n </div>\n\n <button\n type=\"button\"\n class=\"fk-dashboard-layout__toggle\"\n [attr.aria-label]=\"toggleAriaLabel()\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleSidenav()\"\n >\n <ng-content select=\"[layoutToggleIcon]\" />\n </button>\n </div>\n\n <div class=\"fk-dashboard-layout__aside-body\">\n <ng-content select=\"[layoutAside]\" />\n </div>\n\n <div class=\"fk-dashboard-layout__aside-footer\">\n <ng-content select=\"[layoutAsideFooter]\" />\n </div>\n </div>\n\n <div appShellContent class=\"fk-dashboard-layout__content\">\n <!--\n A panel beside the page — a secondary navigation, a filter rail — sits in\n the content row ahead of the scroll container, so the topbar and the page\n scroll under it rather than it scrolling with them.\n -->\n <ng-content select=\"[layoutContentPanel]\" />\n\n <!--\n The scroll container. The topbar sticks at its top and the page scrolls\n under it, which is what lets the frosted bar show content through.\n -->\n <div class=\"fk-dashboard-layout__body\">\n <header class=\"fk-dashboard-layout__topbar\">\n <div class=\"fk-dashboard-layout__topbar-inner\">\n <button\n type=\"button\"\n class=\"fk-dashboard-layout__menu\"\n [attr.aria-label]=\"menuAriaLabel()\"\n (click)=\"openSidenav()\"\n >\n <ng-content select=\"[layoutMenuIcon]\" />\n </button>\n\n <div class=\"fk-dashboard-layout__topbar-start\">\n <ng-content select=\"[layoutTopbarStart]\" />\n </div>\n\n <div class=\"fk-dashboard-layout__topbar-end\">\n <ng-content select=\"[layoutTopbarEnd]\" />\n </div>\n </div>\n </header>\n\n <div class=\"fk-dashboard-layout__page\">\n <ng-content />\n\n @if (pageLoading()) {\n <div class=\"fk-dashboard-layout__page-loader\" aria-live=\"polite\">\n <ng-content select=\"[layoutPageLoader]\" />\n </div>\n }\n </div>\n </div>\n </div>\n\n <!--\n A plain div, not a second `aside`: `fk-app-shell` already makes its end\n region an aside, and nesting one inside it would declare two landmarks for\n one panel.\n -->\n <div appShellEnd class=\"fk-dashboard-layout__end\">\n <ng-content select=\"[layoutEnd]\" />\n </div>\n\n <footer appShellFooter class=\"fk-dashboard-layout__footer\">\n <ng-content select=\"[layoutFooter]\" />\n </footer>\n</fk-app-shell>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n ViewEncapsulation,\n viewChild,\n} from '@angular/core';\n\nimport type { AppShellMode } from '@frame-kit/ui-ng/layouts/app-shell';\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { NavBrandComponent } from '@frame-kit/ui-ng/ui/nav-brand';\n\nimport { DashboardLayoutComponent } from '../dashboard-layout/dashboard-layout.component';\nimport { DashboardNavComponent } from '../dashboard-nav/dashboard-nav.component';\nimport type { DashboardNavGroup } from '../dashboard-nav/dashboard-nav.types';\n\n/**\n * A whole dashboard shell in one element: the collapsing aside and its\n * toggle, the brand block at its head, the icon-rail navigation, and the\n * banner, topbar, panel and footer slots a product hangs its own content\n * off.\n *\n * `fk-dashboard-layout` and `fk-dashboard-nav` remain the pieces to reach\n * for when a product wants a different arrangement. This is the arrangement\n * most products want, assembled once: every consumer that builds it by hand\n * repeats the same half-dozen bindings, and the ones that matter fail\n * quietly when forgotten rather than loudly.\n *\n * Everything a product supplies is projected on through, so nothing is\n * given up by using it: banners, a trailing panel, a second nav column\n * beside the page, switchers pinned into the rail.\n *\n * @example\n * ```html\n * <fk-dashboard-chrome\n * #chrome\n * brandText=\"Acme\"\n * brandDescription=\"Admin\"\n * brandHref=\"/\"\n * [navGroups]=\"nav()\"\n * >\n * <fk-icon-badge chromeBrandMark name=\"acme-mark\" shape=\"rounded\" size=\"sm\" />\n * <nav chromeTopbarStart>…</nav>\n * <fk-user-menu chromeTopbarEnd … />\n * <router-outlet />\n * </fk-dashboard-chrome>\n * ```\n */\n@Component({\n selector: 'fk-dashboard-chrome',\n standalone: true,\n imports: [\n DashboardLayoutComponent,\n DashboardNavComponent,\n IconComponent,\n NavBrandComponent,\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dashboard-chrome.component.html',\n})\nexport class DashboardChromeComponent {\n // ===== BRAND =====\n /** Product name beside the mark. */\n readonly brandText = input<string>('');\n /** The line under it — which product this is. */\n readonly brandDescription = input<string>('');\n /** Where the brand block navigates. */\n readonly brandHref = input<string>('/');\n\n // ===== NAVIGATION =====\n /** Ordered nav groups, already filtered to what this reader may open. */\n readonly navGroups = input<DashboardNavGroup[]>([]);\n /** Group id the `[chromeNavBefore]` content is placed in front of. */\n readonly navSlotBeforeGroupId = input<string | null>(null);\n /** Group id the `[chromeNavAfter]` content follows. */\n readonly navSlotAfterGroupId = input<string | null>(null);\n\n // ===== LAYOUT =====\n /** Aside behaviour. `icon` leaves a rail behind when collapsed. */\n readonly mode = input<AppShellMode>('icon');\n /** Trailing-panel behaviour, for a product that projects `[chromeEnd]`. */\n readonly endMode = input<AppShellMode>('over');\n /** Covers the content column while a routed page resolves. */\n readonly pageLoading = input(false);\n\n readonly toggleAriaLabel = input<string>('');\n readonly menuAriaLabel = input<string>('');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // Optional rather than required: content a product projects reads the\n // rail state before the view has resolved, and a required query throws\n // when read that early.\n private readonly layout = viewChild(DashboardLayoutComponent);\n\n /**\n * Whether the aside is collapsed to its rail. For projected content that\n * has to follow it — a switcher pinned into the nav shrinks to its glyph\n * the same way the rows do.\n */\n collapsed(): boolean {\n return this.layout()?.collapsed() ?? false;\n }\n\n /** Whether the trailing panel is open. */\n endOpen(): boolean {\n return this.layout()?.endOpen() ?? false;\n }\n\n /** Collapse the aside to its rail. */\n closeSidenav(): void {\n this.layout()?.closeSidenav();\n }\n\n /** Open the trailing panel. */\n openEnd(): void {\n this.layout()?.openEnd();\n }\n\n /** Close the trailing panel. */\n closeEnd(): void {\n this.layout()?.closeEnd();\n }\n}\n","<fk-dashboard-layout\n [mode]=\"mode()\"\n [endMode]=\"endMode()\"\n [pageLoading]=\"pageLoading()\"\n [toggleAriaLabel]=\"toggleAriaLabel()\"\n [menuAriaLabel]=\"menuAriaLabel()\"\n [className]=\"className()\"\n>\n <ng-content select=\"[chromeBanner]\" ngProjectAs=\"[layoutBanner]\" />\n\n <fk-nav-brand\n layoutBrand\n [brandText]=\"brandText()\"\n [description]=\"brandDescription()\"\n [href]=\"brandHref()\"\n >\n <ng-content select=\"[chromeBrandMark]\" ngProjectAs=\"[navLogo]\" />\n </fk-nav-brand>\n\n <!--\n The layout draws its own hamburger without these, which would not match\n a product's icon set. Supplied here so no consumer has to know that.\n -->\n <fk-icon layoutToggleIcon name=\"menu-outline\" size=\"18px\" />\n <fk-icon layoutMenuIcon name=\"menu-outline\" />\n\n <!--\n No `collapsed` binding: the nav reads the rail state from this layout,\n which is the ancestor shell it looks for.\n -->\n <fk-dashboard-nav\n layoutAside\n [groups]=\"navGroups()\"\n [slotBeforeGroupId]=\"navSlotBeforeGroupId()\"\n [slotAfterGroupId]=\"navSlotAfterGroupId()\"\n >\n <ng-content select=\"[chromeNavBefore]\" ngProjectAs=\"[navSlotBefore]\" />\n <ng-content select=\"[chromeNavAfter]\" />\n </fk-dashboard-nav>\n\n <ng-content select=\"[chromeTopbarStart]\" ngProjectAs=\"[layoutTopbarStart]\" />\n <ng-content select=\"[chromeTopbarEnd]\" ngProjectAs=\"[layoutTopbarEnd]\" />\n\n <!-- The routed page, and anything else in the content column. -->\n <ng-content />\n\n <ng-content\n select=\"[chromeContentPanel]\"\n ngProjectAs=\"[layoutContentPanel]\"\n />\n <ng-content select=\"[chromeEnd]\" ngProjectAs=\"[layoutEnd]\" />\n <ng-content select=\"[chromeFooter]\" ngProjectAs=\"[layoutFooter]\" />\n</fk-dashboard-layout>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}