@theredhead/lucid-blocks 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theredhead-lucid-blocks.mjs","sources":["../../../packages/ui-blocks/src/lib/master-detail-view/master-detail-view.component.ts","../../../packages/ui-blocks/src/lib/master-detail-view/master-detail-view.component.html","../../../packages/ui-blocks/src/lib/dashboard/dashboard-panel.component.ts","../../../packages/ui-blocks/src/lib/dashboard/dashboard-panel.component.html","../../../packages/ui-blocks/src/lib/dashboard/dashboard.component.ts","../../../packages/ui-blocks/src/lib/dashboard/dashboard.component.html","../../../packages/ui-blocks/src/lib/navigation-page/navigation-page.component.ts","../../../packages/ui-blocks/src/lib/navigation-page/navigation-page.component.html","../../../packages/ui-blocks/src/lib/navigation-page/navigation-page.utils.ts","../../../packages/ui-blocks/src/lib/search-view/saved-search.service.ts","../../../packages/ui-blocks/src/lib/search-view/search-view.component.ts","../../../packages/ui-blocks/src/lib/search-view/search-view.component.html","../../../packages/ui-blocks/src/lib/property-sheet/property-sheet.component.ts","../../../packages/ui-blocks/src/lib/property-sheet/property-sheet.component.html","../../../packages/ui-blocks/src/lib/command-palette/command-palette.component.ts","../../../packages/ui-blocks/src/lib/command-palette/command-palette.component.html","../../../packages/ui-blocks/src/lib/file-browser/file-browser.types.ts","../../../packages/ui-blocks/src/lib/file-browser/file-browser.component.ts","../../../packages/ui-blocks/src/lib/file-browser/file-browser.component.html","../../../packages/ui-blocks/src/lib/chat-view/message-bubble/message-bubble.component.ts","../../../packages/ui-blocks/src/lib/chat-view/message-bubble/message-bubble.component.html","../../../packages/ui-blocks/src/lib/chat-view/chat-view.component.ts","../../../packages/ui-blocks/src/lib/chat-view/chat-view.component.html","../../../packages/ui-blocks/src/lib/wizard/wizard-step.component.ts","../../../packages/ui-blocks/src/lib/wizard/wizard.component.ts","../../../packages/ui-blocks/src/lib/wizard/wizard.component.html","../../../packages/ui-blocks/src/lib/kanban-board/kanban-board.component.ts","../../../packages/ui-blocks/src/lib/kanban-board/kanban-board.component.html","../../../packages/ui-blocks/src/lib/common-dialogs/alert-dialog.component.ts","../../../packages/ui-blocks/src/lib/common-dialogs/confirm-dialog.component.ts","../../../packages/ui-blocks/src/lib/common-dialogs/prompt-dialog.component.ts","../../../packages/ui-blocks/src/lib/common-dialogs/open-file-dialog.component.ts","../../../packages/ui-blocks/src/lib/common-dialogs/save-file-dialog.component.ts","../../../packages/ui-blocks/src/lib/common-dialogs/about-dialog.component.ts","../../../packages/ui-blocks/src/lib/common-dialogs/common-dialog.service.ts","../../../packages/ui-blocks/src/public-api.ts","../../../packages/ui-blocks/src/theredhead-lucid-blocks.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n contentChildren,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n} from \"@angular/core\";\r\nimport { NgTemplateOutlet } from \"@angular/common\";\r\nimport {\r\n FilterableArrayTreeDatasource,\r\n isTreeDatasource,\r\n type IDatasource,\r\n type Predicate,\r\n UISurface,\r\n} from \"@theredhead/lucid-foundation\";\r\nimport {\r\n FilterableArrayDatasource,\r\n SelectionModel,\r\n UIFilter,\r\n UIIcon,\r\n UIIcons,\r\n UISplitContainer,\r\n UITableView,\r\n UITableViewColumn,\r\n UITreeView,\r\n inferFilterFields,\r\n toFilterExpression,\r\n toPredicate,\r\n type ColumnMeta,\r\n type FilterDescriptor,\r\n type FilterExpression,\r\n type FilterFieldDefinition,\r\n type ITreeDatasource,\r\n type SplitCollapseTarget,\r\n type SplitPanelConstraints,\r\n type TreeNode,\r\n type TreeNodeContext,\r\n} from \"@theredhead/lucid-kit\";\r\n\r\n/**\r\n * Context provided to the detail template.\r\n *\r\n * @typeParam T - The row object type.\r\n */\r\nexport interface MasterDetailContext<T> {\r\n /** The selected item (also available as `let-object`). */\r\n $implicit: T;\r\n}\r\n\r\n/**\r\n * A master-detail layout that shows a list of items in a\r\n * {@link UITableView} and renders a detail template for the\r\n * currently selected item.\r\n *\r\n * ### Basic usage (table mode)\r\n * ```html\r\n * <ui-master-detail-view [datasource]=\"adapter\" title=\"People\">\r\n * <ui-text-column key=\"name\" headerText=\"Name\" />\r\n * <ui-text-column key=\"email\" headerText=\"Email\" />\r\n *\r\n * <ng-template #detail let-object>\r\n * <h3>{{ object.name }}</h3>\r\n * <p>{{ object.email }}</p>\r\n * </ng-template>\r\n * </ui-master-detail-view>\r\n * ```\r\n *\r\n * ### Tree mode\r\n * ```html\r\n * <ui-master-detail-view [datasource]=\"treeDs\" [treeDisplayWith]=\"labelFn\">\r\n * <ng-template #detail let-object>\r\n * <h3>{{ object.name }}</h3>\r\n * </ng-template>\r\n * </ui-master-detail-view>\r\n * ```\r\n *\r\n * ### With filter\r\n * ```html\r\n * <!-- Auto-inferred fields from columns + data types -->\r\n * <ui-master-detail-view [datasource]=\"adapter\" [showFilter]=\"true\">\r\n * <ui-text-column key=\"name\" headerText=\"Name\" />\r\n * <ui-text-column key=\"email\" headerText=\"Email\" />\r\n * <ng-template #detail let-object>…</ng-template>\r\n * </ui-master-detail-view>\r\n * ```\r\n *\r\n * ### With custom filter template (override)\r\n * ```html\r\n * <ui-master-detail-view [datasource]=\"adapter\" [showFilter]=\"true\">\r\n * <ng-template #filter>\r\n * <ui-filter [fields]=\"fields\" [(value)]=\"descriptor\"\r\n * (expressionChange)=\"ds.filterBy($event)\" />\r\n * </ng-template>\r\n * <!-- columns and detail template -->\r\n * </ui-master-detail-view>\r\n * ```\r\n */\r\n@Component({\r\n selector: \"ui-master-detail-view\",\r\n standalone: true,\r\n imports: [\r\n UISplitContainer,\r\n UITableView,\r\n UITreeView,\r\n UIFilter,\r\n NgTemplateOutlet,\r\n UIIcon,\r\n ],\r\n templateUrl: \"./master-detail-view.component.html\",\r\n styleUrl: \"./master-detail-view.component.scss\",\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\r\n host: {\r\n class: \"ui-master-detail-view\",\r\n },\r\n})\r\nexport class UIMasterDetailView<T = unknown> {\r\n // ── Inputs ────────────────────────────────────────────────────────\r\n\r\n /** Title displayed above the list panel. */\r\n public readonly title = input<string>(\"Items\");\r\n\r\n /**\r\n * The datasource powering the master list.\r\n *\r\n * Accepts any {@link IDatasource} (for flat table mode)\r\n * or an {@link ITreeDatasource} (for hierarchical tree mode).\r\n * The component detects the type at runtime and renders the\r\n * appropriate view.\r\n */\r\n public readonly datasource = input<\r\n IDatasource<T> | ITreeDatasource<T> | undefined\r\n >(undefined);\r\n\r\n /**\r\n * Function that returns a display string for tree node data.\r\n * Only used in tree mode when no `#nodeTemplate` is projected.\r\n * Defaults to `String(data)`.\r\n */\r\n public readonly treeDisplayWith = input<(data: T) => string>((data: T) =>\r\n String(data),\r\n );\r\n\r\n /** Placeholder text shown when no item is selected. */\r\n public readonly placeholder = input<string>(\"Select an item to view details\");\r\n\r\n /**\r\n * Whether the filter section is visible.\r\n *\r\n * - `true` — always show the filter.\r\n * - `false` — never show the filter.\r\n * - `undefined` (default) — auto-detect: show the filter when the\r\n * resolved datasource is a {@link FilterableArrayDatasource}.\r\n *\r\n * When shown without a projected `#filter` template, the component\r\n * embeds a `<ui-filter>` internally using auto-inferred field\r\n * definitions.\r\n */\r\n public readonly showFilter = input<boolean | undefined>(undefined);\r\n\r\n /** Whether the filter section starts expanded. */\r\n public readonly filterExpanded = input<boolean>(true);\r\n\r\n /**\r\n * Whether the filter toggle button is hidden.\r\n *\r\n * When `true`, the toggle is removed and the filter section stays\r\n * permanently in whatever state `filterExpanded` dictates:\r\n * - `filterExpanded: true` + `filterModeLocked: true` → filter is\r\n * always visible, cannot be collapsed.\r\n * - `filterExpanded: false` + `filterModeLocked: true` → filter bar\r\n * is completely hidden (equivalent to `showFilter: false`).\r\n *\r\n * This value is also forwarded to the embedded `<ui-filter>` as\r\n * `[modeLocked]`, preventing the user from toggling between\r\n * simple and advanced filter modes.\r\n */\r\n public readonly filterModeLocked = input<boolean>(false);\r\n\r\n /**\r\n * Explicit filter field definitions.\r\n *\r\n * When provided these override the auto-inferred fields.\r\n * Only relevant when no `#filter` template is projected.\r\n */\r\n public readonly filterFields = input<FilterFieldDefinition<T>[] | undefined>(\r\n undefined,\r\n );\r\n\r\n /**\r\n * Initial split sizes as a `[list, detail]` percentage tuple.\r\n * Must sum to 100. Defaults to `[33, 67]`.\r\n */\r\n public readonly splitSizes = input<readonly [number, number]>([33, 67]);\r\n\r\n /**\r\n * Optional localStorage key for persisting the split panel sizes.\r\n * When set the user's last divider position is restored on init.\r\n */\r\n public readonly splitName = input<string | undefined>(undefined);\r\n\r\n /**\r\n * Which panel to collapse when the divider is double-clicked.\r\n * Defaults to `'first'` so the list panel can be collapsed.\r\n */\r\n public readonly splitCollapseTarget = input<SplitCollapseTarget>(\"first\");\r\n\r\n /**\r\n * Size constraints for the list (first) panel in pixels.\r\n * Defaults to `{ min: 200 }`.\r\n */\r\n public readonly listConstraints = input<SplitPanelConstraints>({\r\n min: 200,\r\n });\r\n\r\n // ── Table pass-through inputs ─────────────────────────────────\r\n\r\n /** Whether the embedded table view is disabled. */\r\n public readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Page size for the embedded table view's paginator.\r\n * Leave `undefined` to use the table's default.\r\n */\r\n public readonly pageSize = input<number | undefined>(undefined);\r\n\r\n /**\r\n * External page index (zero-based) for the embedded table view.\r\n * Leave `undefined` to let the built-in paginator manage it.\r\n */\r\n public readonly pageIndex = input<number | undefined>(undefined);\r\n\r\n /**\r\n * Whether to show the table's built-in paginator.\r\n * Defaults to `false`.\r\n */\r\n public readonly showBuiltInPaginator = input<boolean>(false);\r\n\r\n /** Accessible caption for the embedded table. */\r\n public readonly caption = input<string>(\"\");\r\n\r\n /** Whether to show row-index numbers in the table. */\r\n public readonly showRowIndexIndicator = input<boolean>(false);\r\n\r\n /** Header text for the row-index column. Defaults to `\"#\"`. */\r\n public readonly rowIndexHeaderText = input<string>(\"#\");\r\n\r\n /**\r\n * Unique table identifier used for persisting column widths.\r\n * When set, column widths are stored in localStorage.\r\n */\r\n public readonly tableId = input<string>(\"\");\r\n\r\n /**\r\n * Whether table columns can be resized by dragging header borders.\r\n * Defaults to `true`.\r\n */\r\n public readonly resizable = input<boolean>(true);\r\n\r\n /**\r\n * Row height in pixels for the internal table-view.\r\n * Forwarded to `<ui-table-view [rowHeight]>`.\r\n * Defaults to 36 px.\r\n */\r\n public readonly rowHeight = input<number>(36);\r\n\r\n // ── Outputs ───────────────────────────────────────────────────────\r\n\r\n /** Emits whenever the selection changes. Carries the selected item or `undefined`. */\r\n public readonly selectedChange = output<T | undefined>();\r\n\r\n /**\r\n * Emits the {@link FilterExpression} every time the filter rules\r\n * change. Emits an empty array when no valid rules remain.\r\n *\r\n * For {@link FilterableArrayDatasource} instances the expression is\r\n * applied automatically — this output is for consumers who use a\r\n * custom datasource and need to handle filtering manually.\r\n */\r\n public readonly expressionChange = output<FilterExpression<T>>();\r\n\r\n // ── Models ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * The filter descriptor state (two-way bindable).\r\n *\r\n * Provides full read/write access to the filter's rule set and\r\n * junction mode. Defaults to an empty AND descriptor.\r\n */\r\n public readonly filterDescriptor = model<FilterDescriptor<T>>({\r\n junction: \"and\",\r\n rules: [],\r\n });\r\n\r\n // ── Content queries ───────────────────────────────────────────────\r\n\r\n /**\r\n * Projected table-view columns.\r\n * These are forwarded to the internal `<ui-table-view>`.\r\n */\r\n public readonly columns = contentChildren(UITableViewColumn);\r\n\r\n /** Detail template — rendered when an item is selected. */\r\n public readonly detailTemplate =\r\n contentChild<TemplateRef<MasterDetailContext<T>>>(\"detail\");\r\n\r\n /** Optional filter template — shown in the collapsible filter area. */\r\n public readonly filterTemplate = contentChild<TemplateRef<unknown>>(\"filter\");\r\n\r\n /**\r\n * Optional tree-node template — forwarded to `<ui-tree-view>`.\r\n * Receives {@link TreeNodeContext} as its context.\r\n */\r\n public readonly treeNodeTemplate =\r\n contentChild<TemplateRef<TreeNodeContext<T>>>(\"nodeTemplate\");\r\n\r\n // ── View queries ──────────────────────────────────────────────────\r\n\r\n /** @internal — the internal table view instance (table mode). */\r\n private readonly tableViewChild = viewChild(UITableView);\r\n\r\n // ── Computed ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Whether the component is in tree mode.\r\n * `true` when the `datasource` input is an `ITreeDatasource`. @internal\r\n */\r\n protected readonly isTreeMode = computed(() =>\r\n isTreeDatasource(this.datasource()),\r\n );\r\n\r\n /**\r\n * The tree datasource, extracted from the unified `datasource`\r\n * input. Returns `undefined` when not in tree mode.\r\n * @internal\r\n */\r\n protected readonly resolvedTreeDatasource = computed<\r\n ITreeDatasource<T> | undefined\r\n >(() => {\r\n const ds = this.datasource();\r\n return isTreeDatasource<T>(ds) ? ds : undefined;\r\n });\r\n\r\n /**\r\n * The currently selected item, derived from the table selection\r\n * model or the tree selection signal. @internal\r\n */\r\n protected readonly selectedItem = computed<T | undefined>(() => {\r\n if (this.isTreeMode()) {\r\n const nodes = this.selectedTreeNodes();\r\n return nodes.length > 0 ? nodes[0].data : undefined;\r\n }\r\n const items = this.selectionModel.selected();\r\n return items.length > 0 ? items[0] : undefined;\r\n });\r\n\r\n /** Context for the detail template outlet. @internal */\r\n protected readonly detailContext = computed<\r\n MasterDetailContext<T> | undefined\r\n >(() => {\r\n const item = this.selectedItem();\r\n if (item === undefined) return undefined;\r\n return { $implicit: item };\r\n });\r\n\r\n /**\r\n * The resolved flat-table datasource.\r\n *\r\n * Returns the `datasource` input when it is a flat\r\n * {@link IDatasource} (not a tree). Falls back to an empty\r\n * {@link FilterableArrayDatasource} when no datasource is set or\r\n * when the input is a tree datasource.\r\n * @internal\r\n */\r\n protected readonly resolvedTableDatasource = computed<IDatasource<T>>(() => {\r\n const explicit = this.datasource();\r\n if (explicit && !isTreeDatasource(explicit)) {\r\n return explicit;\r\n }\r\n return new FilterableArrayDatasource<T>([]);\r\n });\r\n\r\n /**\r\n * Whether the filter section should be displayed.\r\n *\r\n * - Explicit `showFilter` input wins when not `undefined`.\r\n * - Otherwise auto-detects: `true` when the underlying raw\r\n * datasource is a {@link FilterableArrayDatasource}.\r\n * @internal\r\n */\r\n protected readonly resolvedShowFilter = computed<boolean>(() => {\r\n const explicit = this.showFilter();\r\n if (explicit !== undefined) return explicit;\r\n\r\n // Tree mode: auto-show when a tree datasource is provided\r\n if (this.resolvedTreeDatasource() !== undefined) return false;\r\n\r\n // Auto-detect: show filter when the datasource supports filtering\r\n const ds = this.resolvedTableDatasource();\r\n return ds instanceof FilterableArrayDatasource;\r\n });\r\n\r\n /**\r\n * The filter field definitions used by the embedded `<ui-filter>`.\r\n *\r\n * Priority: explicit `filterFields` input → inferred from projected\r\n * columns and the first data row.\r\n * @internal\r\n */\r\n protected readonly resolvedFilterFields = computed<\r\n FilterFieldDefinition<T>[]\r\n >(() => {\r\n const explicit = this.filterFields();\r\n if (explicit) return explicit;\r\n\r\n // ── Tree mode: infer from tree node data ──\r\n const treeDs = this.resolvedTreeDatasource();\r\n if (treeDs) {\r\n const flatData = this.collectTreeData(treeDs);\r\n if (flatData.length === 0) return [];\r\n return inferFilterFields(\r\n flatData[0] as Record<string, unknown>,\r\n ) as FilterFieldDefinition<T>[];\r\n }\r\n\r\n // ── Table mode: infer from columns + datasource rows ──\r\n // Derive column metadata from projected UITableViewColumn instances\r\n const cols = this.columns();\r\n const columnMeta: ColumnMeta[] = cols.map((c) => ({\r\n key: c.key(),\r\n headerText: c.headerText(),\r\n }));\r\n\r\n // Get a sample row from the *unfiltered* datasource to sniff\r\n // types. We must NOT use getNumberOfItems() on a filtered\r\n // datasource — the filtered count drops to 0 when no rows match\r\n // the current predicate and would make the filter fields (and\r\n // the filter component) disappear.\r\n const ds = this.resolvedTableDatasource();\r\n\r\n // Prefer the full unfiltered list when available\r\n const allRows =\r\n ds instanceof FilterableArrayDatasource ? ds.allRows : undefined;\r\n\r\n let sample: T | undefined;\r\n if (allRows && allRows.length > 0) {\r\n sample = allRows[0];\r\n } else {\r\n // Fallback for non-filterable datasources\r\n const count = ds.getNumberOfItems();\r\n if (typeof count !== \"number\" || count === 0) return [];\r\n const result = ds.getObjectAtRowIndex(0);\r\n if (!result || result instanceof Promise) return [];\r\n sample = result;\r\n }\r\n\r\n if (!sample) return [];\r\n\r\n return inferFilterFields(\r\n sample as Record<string, unknown>,\r\n columnMeta.length > 0 ? columnMeta : undefined,\r\n ) as FilterFieldDefinition<T>[];\r\n });\r\n\r\n /**\r\n * The raw data array for the embedded filter (used to derive\r\n * distinct values for autocomplete / select).\r\n * @internal\r\n */\r\n protected readonly resolvedFilterData = computed<readonly T[]>(() => {\r\n // ── Tree mode: flatten all node data ──\r\n const treeDs = this.resolvedTreeDatasource();\r\n if (treeDs) {\r\n const flatData = this.collectTreeData(treeDs);\r\n return flatData.length < 1000 ? flatData : [];\r\n }\r\n\r\n // ── Table mode ──\r\n const ds = this.resolvedTableDatasource();\r\n\r\n // Use the full unfiltered dataset when available so that distinct\r\n // value lists and autocomplete options don't shrink as the user\r\n // narrows the filter.\r\n if (ds instanceof FilterableArrayDatasource) {\r\n const all = ds.allRows;\r\n return all.length < 1000 ? all : [];\r\n }\r\n\r\n // Fallback for non-filterable datasources: gather visible rows\r\n const count = ds.getNumberOfItems();\r\n if (typeof count !== \"number\" || count === 0 || count >= 1000) return [];\r\n const rows: T[] = [];\r\n for (let i = 0; i < count; i++) {\r\n const row = ds.getObjectAtRowIndex(i);\r\n if (!(row instanceof Promise)) rows.push(row);\r\n }\r\n return rows;\r\n });\r\n\r\n // ── Public fields ───────────────────────────────────────────────\r\n\r\n /** Selection model for the table-view (single mode). */\r\n public readonly selectionModel = new SelectionModel<T>(\"single\");\r\n\r\n // ── Protected fields ──────────────────────────────────────────────\r\n\r\n /** @internal — currently selected tree nodes (tree mode). */\r\n protected readonly selectedTreeNodes = signal<readonly TreeNode<T>[]>([]);\r\n\r\n /** @internal — whether the filter section is collapsed. */\r\n protected readonly filterCollapsed = signal(false);\r\n\r\n /**\r\n * The current filter predicate for tree mode.\r\n * Forwarded to the `<ui-tree-view>` `filterPredicate` input.\r\n * @internal\r\n */\r\n protected readonly treeFilterPredicate = signal<Predicate<T> | undefined>(\r\n undefined,\r\n );\r\n\r\n // ── Protected constants ───────────────────────────────────────────\r\n\r\n /** @internal */\r\n protected readonly chevronDown = UIIcons.Lucide.Arrows.ChevronDown;\r\n\r\n /** @internal */\r\n protected readonly chevronRight = UIIcons.Lucide.Arrows.ChevronRight;\r\n\r\n // ── Constructor ───────────────────────────────────────────────────\r\n\r\n public constructor() {\r\n // Initialise filterCollapsed from the filterExpanded input\r\n effect(() => {\r\n const expanded = this.filterExpanded();\r\n untracked(() => this.filterCollapsed.set(!expanded));\r\n });\r\n\r\n // Emit selectedChange whenever selection changes\r\n effect(() => {\r\n const item = this.selectedItem();\r\n untracked(() => this.selectedChange.emit(item));\r\n });\r\n }\r\n\r\n // ── Public methods ────────────────────────────────────────────────\r\n\r\n /**\r\n * Called by the embedded `<ui-filter>` when the expression changes.\r\n *\r\n * - For {@link FilterableArrayDatasource} the expression is applied\r\n * via `filterBy()` and the adapter is refreshed.\r\n * - For tree mode the expression is compiled into a predicate for\r\n * the tree-view's `filterPredicate` input.\r\n * - Always emits via {@link expressionChange} so consumers with\r\n * custom datasources can react.\r\n */\r\n public onFilterExpressionChange(expression: FilterExpression<T>): void {\r\n this.expressionChange.emit(expression);\r\n\r\n if (this.isTreeMode()) {\r\n const treeDs = this.resolvedTreeDatasource();\r\n\r\n // FilterableArrayTreeDatasource: compile expression and apply\r\n if (treeDs instanceof FilterableArrayTreeDatasource) {\r\n const fields = this.resolvedFilterFields();\r\n const compiled = toFilterExpression(expression, fields);\r\n treeDs.filterBy(compiled.length === 0 ? null : compiled);\r\n return;\r\n }\r\n\r\n // Plain ITreeDatasource: fall back to tree-view filterPredicate input\r\n const fields = this.resolvedFilterFields();\r\n const descriptor = this.filterDescriptor();\r\n this.treeFilterPredicate.set(toPredicate(descriptor, fields));\r\n return;\r\n }\r\n\r\n // Table mode: apply expression to FilterableArrayDatasource\r\n const ds = this.resolvedTableDatasource();\r\n if (ds instanceof FilterableArrayDatasource) {\r\n const fields = this.resolvedFilterFields();\r\n const compiled = toFilterExpression(expression, fields);\r\n ds.filterBy(compiled.length === 0 ? null : compiled);\r\n this.tableViewChild()?.refreshDatasource();\r\n }\r\n }\r\n\r\n // ── Protected methods ─────────────────────────────────────────────\r\n\r\n /** @internal — toggle filter visibility. */\r\n protected toggleFilter(): void {\r\n this.filterCollapsed.update((v) => !v);\r\n }\r\n\r\n // ── Private helpers ───────────────────────────────────────────────\r\n\r\n /**\r\n * Recursively collects the `data` payloads from every node in the\r\n * tree datasource into a flat array. Used to infer filter fields\r\n * and provide distinct values in tree mode.\r\n */\r\n private collectTreeData(ds: ITreeDatasource<T>): T[] {\r\n const items: T[] = [];\r\n const walk = (nodes: TreeNode<T>[]): void => {\r\n for (const node of nodes) {\r\n items.push(node.data);\r\n const children = ds.getChildren(node);\r\n if (Array.isArray(children)) walk(children);\r\n }\r\n };\r\n const roots = ds.getRootNodes();\r\n if (Array.isArray(roots)) walk(roots);\r\n return items;\r\n }\r\n}\r\n","<!-- Hidden slot: instantiates projected columns so contentChildren can discover them. -->\r\n<div class=\"columns-slot\"><ng-content /></div>\r\n\r\n@if (resolvedShowFilter()) {\r\n <div class=\"filter-bar\">\r\n @if (!filterModeLocked()) {\r\n <button\r\n class=\"filter-toggle\"\r\n type=\"button\"\r\n (click)=\"toggleFilter()\"\r\n [attr.aria-expanded]=\"!filterCollapsed()\"\r\n aria-controls=\"mdv-filter-content\"\r\n >\r\n <ui-icon\r\n [svg]=\"filterCollapsed() ? chevronRight : chevronDown\"\r\n [size]=\"14\"\r\n />\r\n <span>Filter</span>\r\n </button>\r\n }\r\n @if (!filterCollapsed()) {\r\n <div class=\"filter-content\" id=\"mdv-filter-content\">\r\n @if (filterTemplate(); as filterTpl) {\r\n <ng-container *ngTemplateOutlet=\"filterTpl\" />\r\n } @else {\r\n @if (resolvedFilterFields(); as fields) {\r\n @if (fields.length > 0) {\r\n <ui-filter\r\n [fields]=\"fields\"\r\n [data]=\"resolvedFilterData()\"\r\n [allowJunction]=\"true\"\r\n [modeLocked]=\"filterModeLocked()\"\r\n [(value)]=\"filterDescriptor\"\r\n (expressionChange)=\"onFilterExpressionChange($event)\"\r\n />\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n\r\n<ui-split-container\r\n class=\"split\"\r\n [initialSizes]=\"splitSizes()\"\r\n [name]=\"splitName()\"\r\n [collapseTarget]=\"splitCollapseTarget()\"\r\n [firstConstraints]=\"listConstraints()\"\r\n ariaLabel=\"Resize list and detail panels\"\r\n>\r\n <aside first class=\"list\">\r\n <header class=\"ui-surface-type-panel\">\r\n <h2 class=\"title\">{{ title() }}</h2>\r\n </header>\r\n\r\n @if (isTreeMode()) {\r\n <div class=\"tree-wrapper\">\r\n <ui-tree-view\r\n [datasource]=\"resolvedTreeDatasource()!\"\r\n [displayWith]=\"treeDisplayWith()\"\r\n [filterPredicate]=\"treeFilterPredicate()\"\r\n [(selected)]=\"selectedTreeNodes\"\r\n ariaLabel=\"Master list\"\r\n >\r\n @if (treeNodeTemplate(); as nodeTpl) {\r\n <ng-template #nodeTemplate let-node let-level=\"level\" let-expanded=\"expanded\" let-hasChildren=\"hasChildren\">\r\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: node, level: level, expanded: expanded, hasChildren: hasChildren }\" />\r\n </ng-template>\r\n }\r\n </ui-tree-view>\r\n </div>\r\n } @else {\r\n <div class=\"table-wrapper\">\r\n <ui-table-view\r\n [datasource]=\"resolvedTableDatasource()\"\r\n [externalColumns]=\"columns()\"\r\n [disabled]=\"disabled()\"\r\n [pageSize]=\"pageSize()\"\r\n [pageIndex]=\"pageIndex()\"\r\n [showBuiltInPaginator]=\"showBuiltInPaginator()\"\r\n [caption]=\"caption()\"\r\n [showRowIndexIndicator]=\"showRowIndexIndicator()\"\r\n [rowIndexHeaderText]=\"rowIndexHeaderText()\"\r\n [tableId]=\"tableId()\"\r\n [resizable]=\"resizable()\"\r\n [rowHeight]=\"rowHeight()\"\n selectionMode=\"single\"\r\n [showSelectionColumn]=\"false\"\r\n [rowClickSelect]=\"true\"\r\n [selectionModel]=\"selectionModel\"\r\n />\r\n </div>\r\n }\r\n </aside>\r\n\r\n <main second class=\"detail\">\r\n @if (detailContext(); as ctx) {\r\n @if (detailTemplate(); as tpl) {\r\n <section class=\"detail-content\">\r\n <ng-container *ngTemplateOutlet=\"tpl; context: ctx\" />\r\n </section>\r\n }\r\n } @else {\r\n <div class=\"placeholder\">\r\n <p>{{ placeholder() }}</p>\r\n </div>\r\n }\r\n </main>\r\n</ui-split-container>","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n output,\n signal,\n} from \"@angular/core\";\nimport {\n LoggerFactory,\n UISurface,\n UI_DEFAULT_SURFACE_TYPE,\n} from \"@theredhead/lucid-foundation\";\nimport { UIIcon, UIIcons } from \"@theredhead/lucid-kit\";\nimport type { DashboardPanelConfig } from \"./dashboard.types\";\n\n/**\n * A single panel inside a {@link UIDashboard}.\n *\n * The panel renders a header bar (title + optional collapse / remove\n * controls) and projects arbitrary content via `<ng-content>`.\n *\n * @example\n * ```html\n * <ui-dashboard-panel [config]=\"{ id: 'sales', title: 'Sales KPI', collapsible: true }\">\n * <p>Revenue chart goes here</p>\n * </ui-dashboard-panel>\n * ```\n */\n@Component({\n selector: \"ui-dashboard-panel\",\n standalone: true,\n imports: [UIIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n providers: [{ provide: UI_DEFAULT_SURFACE_TYPE, useValue: \"panel\" }],\n templateUrl: \"./dashboard-panel.component.html\",\n styleUrl: \"./dashboard-panel.component.scss\",\n host: {\n class: \"ui-dashboard-panel\",\n \"[class.collapsed]\": \"collapsed()\",\n \"[class.removed]\": \"removed()\",\n \"[class.notified]\": \"notified()\",\n \"[style.grid-column]\": \"gridColumn()\",\n \"[style.grid-row]\": \"gridRow()\",\n \"[attr.data-panel-id]\": \"config().id\",\n },\n})\nexport class UIDashboardPanel {\n // ── Inputs ──────────────────────────────────────────────────────\n\n /** Panel configuration (id, title, grid placement, flags). */\n public readonly config = input.required<DashboardPanelConfig>();\n\n // ── Outputs ─────────────────────────────────────────────────────\n\n /** Emitted when the user removes (hides) this panel. */\n public readonly panelRemoved = output<string>();\n\n /** Emitted when the collapsed state changes. */\n public readonly collapsedChange = output<boolean>();\n\n // ── Computed ────────────────────────────────────────────────────\n\n /** CSS `grid-column` value derived from placement config. */\n protected readonly gridColumn = computed(() => {\n const span = this.config().placement?.colSpan ?? 1;\n return span > 1 ? `span ${span}` : undefined;\n });\n\n /** CSS `grid-row` value derived from placement config. */\n protected readonly gridRow = computed(() => {\n const span = this.config().placement?.rowSpan ?? 1;\n return span > 1 ? `span ${span}` : undefined;\n });\n\n /** Whether the panel header shows a collapse toggle. */\n protected readonly isCollapsible = computed(\n () => this.config().collapsible === true,\n );\n\n /** Whether the panel header shows a remove button. */\n protected readonly isRemovable = computed(\n () => this.config().removable === true,\n );\n\n /** SVG icon for the collapse toggle button. */\n protected readonly collapseIcon = computed(() =>\n this.collapsed()\n ? UIIcons.Lucide.Arrows.ChevronRight\n : UIIcons.Lucide.Arrows.ChevronDown,\n );\n\n /** SVG icon for the remove button. */\n protected readonly removeIcon = UIIcons.Lucide.Math.X;\n\n // ── Public fields ───────────────────────────────────────────────\n\n /** Whether the panel body is currently collapsed. */\n public readonly collapsed = signal(false);\n\n /** Whether the panel has been removed (hidden) by the user. */\n public readonly removed = signal(false);\n\n /** Whether the panel currently has an active notification. */\n public readonly notified = signal(false);\n\n // ── Private fields ──────────────────────────────────────────────\n\n private readonly log = inject(LoggerFactory).createLogger(\"UIDashboardPanel\");\n private readonly destroyRef = inject(DestroyRef);\n private notificationTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ── Public methods ──────────────────────────────────────────────\n\n public constructor() {\n this.destroyRef.onDestroy(() => this.clearNotificationTimer());\n }\n\n // ── Public methods ──────────────────────────────────────────────\n\n /**\n * Activate a notification on this panel.\n *\n * The notification accent remains visible until the panel is\n * focused (expanded) or the optional `timeoutMs` elapses.\n *\n * @param timeoutMs - Auto-clear delay in milliseconds. When `0`\n * or omitted the notification persists until manually cleared.\n */\n public notify(timeoutMs = 0): void {\n this.clearNotificationTimer();\n this.notified.set(true);\n this.log.debug(\"Panel notified\", [this.config().id, timeoutMs]);\n\n if (timeoutMs > 0) {\n this.notificationTimer = setTimeout(() => {\n this.clearNotification();\n }, timeoutMs);\n }\n }\n\n /** Clear the active notification. */\n public clearNotification(): void {\n this.clearNotificationTimer();\n this.notified.set(false);\n }\n\n /** Toggle the collapsed state. */\n public toggleCollapse(): void {\n if (!this.isCollapsible()) return;\n this.collapsed.update((v) => !v);\n this.collapsedChange.emit(this.collapsed());\n\n // Expanding a panel clears its notification\n if (!this.collapsed()) {\n this.clearNotification();\n }\n\n this.log.debug(\"Panel collapse toggled\", [\n this.config().id,\n this.collapsed(),\n ]);\n }\n\n /** Remove (hide) the panel. */\n public remove(): void {\n if (!this.isRemovable()) return;\n this.removed.set(true);\n this.panelRemoved.emit(this.config().id);\n this.log.debug(\"Panel removed\", [this.config().id]);\n }\n\n /** Restore a previously removed panel. */\n public restore(): void {\n this.removed.set(false);\n this.log.debug(\"Panel restored\", [this.config().id]);\n }\n\n // ── Private methods ─────────────────────────────────────────────\n\n private clearNotificationTimer(): void {\n if (this.notificationTimer !== null) {\n clearTimeout(this.notificationTimer);\n this.notificationTimer = null;\n }\n }\n}\n","<header class=\"header\">\n <div class=\"heading\">\n @if (config().icon) {\n <ui-icon [svg]=\"config().icon!\" [size]=\"14\" class=\"icon\" />\n }\n <h3 class=\"title\">{{ config().title }}</h3>\n </div>\n\n <div class=\"actions\">\n @if (isCollapsible()) {\n <button\n type=\"button\"\n class=\"action\"\n [attr.aria-label]=\"collapsed() ? 'Expand panel' : 'Collapse panel'\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleCollapse()\"\n >\n <ui-icon [svg]=\"collapseIcon()\" [size]=\"14\" />\n </button>\n }\n @if (isRemovable()) {\n <button\n type=\"button\"\n class=\"action action--remove\"\n aria-label=\"Remove panel\"\n (click)=\"remove()\"\n >\n <ui-icon [svg]=\"removeIcon\" [size]=\"14\" />\n </button>\n }\n </div>\n</header>\n\n@if (!collapsed()) {\n <div class=\"body\">\n <ng-content />\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n untracked,\n} from \"@angular/core\";\nimport { LoggerFactory, UISurface } from \"@theredhead/lucid-foundation\";\nimport { UIDashboardPanel } from \"./dashboard-panel.component\";\nimport { UIIcon, UIIcons } from \"@theredhead/lucid-kit\";\nimport type {\n DashboardColumns,\n DashboardDockPosition,\n} from \"./dashboard.types\";\n\n/**\n * Dashboard host component.\n *\n * Lays out projected {@link UIDashboardPanel} children on a CSS grid.\n * The grid column count is configurable via the `columns` input — either\n * a fixed number or `'auto'` for responsive auto-fill.\n *\n * Panels declare their own grid span via their `config.placement`\n * property. The host is intentionally *content-agnostic*: it provides\n * the grid shell and panel management (collapse, remove, restore)\n * while consumers project whatever widgets they need.\n *\n * @example\n * ```html\n * <ui-dashboard [columns]=\"3\" [gap]=\"16\">\n * <ui-dashboard-panel [config]=\"{ id: 'kpi', title: 'KPI', placement: { colSpan: 2 } }\">\n * <my-kpi-widget />\n * </ui-dashboard-panel>\n *\n * <ui-dashboard-panel [config]=\"{ id: 'chart', title: 'Revenue' }\">\n * <my-chart />\n * </ui-dashboard-panel>\n *\n * <ui-dashboard-panel [config]=\"{ id: 'feed', title: 'Activity', placement: { colSpan: 3 } }\">\n * <my-activity-feed />\n * </ui-dashboard-panel>\n * </ui-dashboard>\n * ```\n */\n@Component({\n selector: \"ui-dashboard\",\n standalone: true,\n imports: [UIIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n templateUrl: \"./dashboard.component.html\",\n styleUrl: \"./dashboard.component.scss\",\n host: {\n class: \"ui-dashboard\",\n },\n})\nexport class UIDashboard {\n // ── Inputs ──────────────────────────────────────────────────────\n\n /**\n * Number of grid columns.\n *\n * - A number (e.g. `3`) creates a fixed column layout.\n * - `'auto'` uses responsive `auto-fill` with `minmax(280px, 1fr)`.\n *\n * Defaults to `'auto'`.\n */\n public readonly columns = input<DashboardColumns>(\"auto\");\n\n /**\n * Gap between grid cells in pixels.\n * Defaults to `16`.\n */\n public readonly gap = input<number>(16);\n\n /**\n * Minimum column width in pixels (only used when `columns` is `'auto'`).\n * Defaults to `280`.\n */\n public readonly minColumnWidth = input<number>(280);\n\n /** Accessible label for the dashboard region. */\n public readonly ariaLabel = input<string>(\"Dashboard\");\n\n /**\n * Where the collapsed-panel dock is rendered.\n * Defaults to `'bottom'`.\n */\n public readonly dockPosition = input<DashboardDockPosition>(\"bottom\");\n\n /**\n * Whether dock chips show the panel title alongside the icon.\n * Defaults to `false` (icon-only with title in tooltip).\n */\n public readonly dockShowTitles = input<boolean>(false);\n\n /**\n * Default SVG icon for panels that don't declare their own `icon`.\n * Defaults to the Lucide `LayoutDashboard` icon.\n */\n public readonly defaultDockIcon = input<string>(\n UIIcons.Lucide.Layout.LayoutDashboard,\n );\n\n /**\n * SVG icon for the optional dock menu button.\n * When set, a menu button is rendered at the leading edge of the dock.\n * When omitted (`undefined`), no menu button is shown.\n */\n public readonly dockMenuIcon = input<string | undefined>(undefined);\n\n // ── Outputs ─────────────────────────────────────────────────────\n\n /** Emitted when any panel is removed by the user. */\n public readonly panelRemoved = output<string>();\n\n /** Emitted when the dock menu button is clicked. */\n public readonly dockMenuClicked = output<void>();\n\n // ── Content queries ─────────────────────────────────────────────\n\n /** All projected dashboard panels. */\n public readonly panels = contentChildren(UIDashboardPanel);\n\n // ── Computed ────────────────────────────────────────────────────\n\n /** CSS value for `grid-template-columns`. */\n protected readonly gridTemplateColumns = computed(() => {\n const cols = this.columns();\n if (cols === \"auto\") {\n return `repeat(auto-fill, minmax(${this.minColumnWidth()}px, 1fr))`;\n }\n return `repeat(${cols}, 1fr)`;\n });\n\n /** CSS value for `gap`. */\n protected readonly gridGap = computed(() => `${this.gap()}px`);\n\n /** Panels that have been removed by the user. */\n public readonly removedPanelIds = computed(() =>\n this.panels()\n .filter((p) => p.removed())\n .map((p) => p.config().id),\n );\n\n /** Panels that are currently collapsed (shown in the dock). */\n public readonly collapsedPanels = computed(() =>\n this.panels().filter((p) => p.collapsed() && !p.removed()),\n );\n\n // ── Public fields ───────────────────────────────────────────────\n\n /** Whether the dock panel-picker menu is open. */\n public readonly dockMenuOpen = signal(false);\n\n // ── Protected fields ────────────────────────────────────────────\n\n // ── Private fields ──────────────────────────────────────────────\n\n private readonly log = inject(LoggerFactory).createLogger(\"UIDashboard\");\n private readonly destroyRef = inject(DestroyRef);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n\n /** Subscriptions to panel `panelRemoved` outputs. */\n private panelSubs: (() => void)[] = [];\n\n // ── Constructor ─────────────────────────────────────────────────\n\n public constructor() {\n // Close dock menu on outside click\n const onDocClick = (e: Event) => {\n if (\n this.dockMenuOpen() &&\n !this.elRef.nativeElement\n .querySelector(\".dock-menu-anchor\")\n ?.contains(e.target as Node)\n ) {\n this.dockMenuOpen.set(false);\n }\n };\n document.addEventListener(\"pointerdown\", onDocClick);\n this.destroyRef.onDestroy(() =>\n document.removeEventListener(\"pointerdown\", onDocClick),\n );\n\n // Whenever the projected panels change, subscribe to their\n // panelRemoved outputs so the host can re-emit them.\n effect(() => {\n const panels = this.panels();\n\n untracked(() => {\n // Tear down previous subscriptions\n for (const unsub of this.panelSubs) {\n unsub();\n }\n this.panelSubs = [];\n\n for (const panel of panels) {\n const sub = panel.panelRemoved.subscribe((id) => {\n this.panelRemoved.emit(id);\n });\n this.panelSubs.push(() => sub.unsubscribe());\n }\n });\n });\n\n // Clean up on destroy\n this.destroyRef.onDestroy(() => {\n for (const unsub of this.panelSubs) {\n unsub();\n }\n this.panelSubs = [];\n });\n }\n\n // ── Public methods ──────────────────────────────────────────────\n\n /**\n * Restore a previously removed panel by its id.\n *\n * @param panelId - The `config.id` of the panel to restore.\n * @returns `true` if the panel was found and restored.\n */\n public restorePanel(panelId: string): boolean {\n const panel = this.panels().find((p) => p.config().id === panelId);\n if (panel) {\n panel.restore();\n this.log.debug(\"Panel restored via host\", [panelId]);\n return true;\n }\n return false;\n }\n\n /**\n * Restore all removed panels.\n */\n public restoreAll(): void {\n for (const panel of this.panels()) {\n if (panel.removed()) {\n panel.restore();\n }\n }\n this.log.debug(\"All panels restored\");\n }\n\n /**\n * Resolve the icon SVG for a panel, falling back to the default.\n *\n * @param panelIcon - The panel's own icon, if any.\n * @returns SVG inner-content string.\n */\n protected resolveIcon(panelIcon: string | undefined): string {\n return panelIcon ?? this.defaultDockIcon();\n }\n\n /** Toggle the dock panel-picker menu. */\n public toggleDockMenu(): void {\n this.dockMenuOpen.update((v) => !v);\n this.dockMenuClicked.emit();\n }\n\n /** Close the dock panel-picker menu. */\n public closeDockMenu(): void {\n this.dockMenuOpen.set(false);\n }\n\n /**\n * Toggle a panel's collapsed state from the menu.\n * If removed, restore it first.\n */\n protected menuTogglePanel(panel: UIDashboardPanel): void {\n if (panel.removed()) {\n panel.restore();\n } else if (panel.collapsed()) {\n panel.toggleCollapse();\n } else if (panel.config().collapsible) {\n panel.toggleCollapse();\n }\n }\n}\n","@if (dockPosition() === 'top') {\n <div class=\"dock\" role=\"toolbar\" aria-label=\"Dashboard dock\">\n @if (dockMenuIcon()) {\n <div class=\"anchor\">\n <button\n type=\"button\"\n class=\"menu-btn\"\n [class.menu-btn--active]=\"dockMenuOpen()\"\n aria-label=\"Dashboard menu\"\n [attr.aria-expanded]=\"dockMenuOpen()\"\n aria-haspopup=\"menu\"\n (click)=\"toggleDockMenu()\"\n >\n <ui-icon [svg]=\"dockMenuIcon()!\" [size]=\"16\" />\n </button>\n @if (dockMenuOpen()) {\n <div class=\"menu\" role=\"menu\" aria-label=\"Panel picker\">\n @for (panel of panels(); track panel.config().id) {\n <button\n type=\"button\"\n class=\"item\"\n [class.item--hidden]=\"panel.collapsed() || panel.removed()\"\n role=\"menuitem\"\n (click)=\"menuTogglePanel(panel)\"\n >\n <ui-icon\n [svg]=\"resolveIcon(panel.config().icon)\"\n [size]=\"14\"\n class=\"item-icon\"\n />\n <span class=\"item-label\">{{ panel.config().title }}</span>\n @if (panel.collapsed() || panel.removed()) {\n <span class=\"item-badge\">hidden</span>\n }\n </button>\n }\n <ng-content select=\"[dockMenuItem]\" />\n </div>\n }\n </div>\n @if (collapsedPanels().length > 0) {\n <span class=\"separator\" aria-hidden=\"true\"></span>\n }\n }\n @for (panel of collapsedPanels(); track panel.config().id) {\n <button\n type=\"button\"\n class=\"chip\"\n [class.chip--notified]=\"panel.notified()\"\n [attr.title]=\"panel.config().title\"\n [attr.aria-label]=\"'Restore ' + panel.config().title\"\n (click)=\"panel.toggleCollapse()\"\n >\n <ui-icon [svg]=\"resolveIcon(panel.config().icon)\" [size]=\"16\" />\n @if (dockShowTitles()) {\n <span class=\"chip-label\">{{ panel.config().title }}</span>\n }\n </button>\n }\n </div>\n}\n\n<div\n class=\"grid\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.gap]=\"gridGap()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"region\"\n>\n <ng-content />\n</div>\n\n@if (dockPosition() === 'bottom') {\n <div class=\"dock\" role=\"toolbar\" aria-label=\"Dashboard dock\">\n @if (dockMenuIcon()) {\n <div class=\"anchor\">\n <button\n type=\"button\"\n class=\"menu-btn\"\n [class.menu-btn--active]=\"dockMenuOpen()\"\n aria-label=\"Dashboard menu\"\n [attr.aria-expanded]=\"dockMenuOpen()\"\n aria-haspopup=\"menu\"\n (click)=\"toggleDockMenu()\"\n >\n <ui-icon [svg]=\"dockMenuIcon()!\" [size]=\"16\" />\n </button>\n @if (dockMenuOpen()) {\n <div class=\"menu menu--above\" role=\"menu\" aria-label=\"Panel picker\">\n @for (panel of panels(); track panel.config().id) {\n <button\n type=\"button\"\n class=\"item\"\n [class.item--hidden]=\"panel.collapsed() || panel.removed()\"\n role=\"menuitem\"\n (click)=\"menuTogglePanel(panel)\"\n >\n <ui-icon\n [svg]=\"resolveIcon(panel.config().icon)\"\n [size]=\"14\"\n class=\"item-icon\"\n />\n <span class=\"item-label\">{{ panel.config().title }}</span>\n @if (panel.collapsed() || panel.removed()) {\n <span class=\"item-badge\">hidden</span>\n }\n </button>\n }\n <ng-content select=\"[dockMenuItem]\" />\n </div>\n }\n </div>\n @if (collapsedPanels().length > 0) {\n <span class=\"separator\" aria-hidden=\"true\"></span>\n }\n }\n @for (panel of collapsedPanels(); track panel.config().id) {\n <button\n type=\"button\"\n class=\"chip\"\n [class.chip--notified]=\"panel.notified()\"\n [attr.title]=\"panel.config().title\"\n [attr.aria-label]=\"'Restore ' + panel.config().title\"\n (click)=\"panel.toggleCollapse()\"\n >\n <ui-icon [svg]=\"resolveIcon(panel.config().icon)\" [size]=\"16\" />\n @if (dockShowTitles()) {\n <span class=\"chip-label\">{{ panel.config().title }}</span>\n }\n </button>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n inject,\n input,\n model,\n type OnInit,\n output,\n TemplateRef,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\n\nimport {\n type BreadcrumbItem,\n type BreadcrumbVariant,\n type DrawerPosition,\n type DrawerWidth,\n type ITreeDatasource,\n type TreeNode,\n UIBreadcrumb,\n UIButton,\n UIDrawer,\n UIIcon,\n UIIcons,\n UISidebarGroup,\n UISidebarItem,\n UISidebarNav,\n} from \"@theredhead/lucid-kit\";\nimport {\n ArrayTreeDatasource,\n StorageService,\n UISurface,\n} from \"@theredhead/lucid-foundation\";\n\nimport type { NavigationNode } from \"./navigation-page.utils\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\n/**\n * Data payload carried by each node in the navigation tree.\n *\n * The structural properties (`id`, `icon`, `disabled`, `expanded`,\n * `children`) live on the {@link TreeNode} wrapper; this interface\n * holds the domain-specific fields.\n */\nexport interface NavigationNodeData {\n /** Display label shown in the sidebar and breadcrumb trail. */\n readonly label: string;\n\n /**\n * Optional trailing badge text (e.g. an unread count).\n * Forwarded to the sidebar item's `[badge]` input.\n */\n readonly badge?: string;\n\n /**\n * Optional route path for Angular Router integration.\n *\n * When items are produced by `routesToNavigation()`, this is set\n * to the full resolved path segment. Consumers can use it in the\n * `(navigated)` handler to call `router.navigate()`.\n */\n readonly route?: string;\n}\n\n/** Template context for the projected content template. */\nexport interface NavigationPageContext {\n /** The currently active navigation node. */\n readonly $implicit: NavigationNode;\n /** The currently active navigation node (named binding). */\n readonly page: NavigationNode;\n}\n\n// ── Component ────────────────────────────────────────────────────────\n\n/**\n * A full-page navigation layout that combines a {@link UIDrawer},\n * a {@link UISidebarNav} with configurable items, a {@link UIBreadcrumb}\n * path, and a main content area.\n *\n * Navigation items are provided as a tree — either via an\n * {@link ITreeDatasource} for dynamic data, or via a convenience\n * `items` input accepting `NavigationNode[]`.\n *\n * Tree nodes with **children** are rendered as collapsible\n * `<ui-sidebar-group>` elements; leaf nodes render as\n * `<ui-sidebar-item>` entries. The breadcrumb trail is built\n * automatically from the node hierarchy.\n *\n * ### Data sources\n *\n * | Input | Type | Use case |\n * |--------------|------------------------------------------|------------------------------|\n * | `datasource` | `ITreeDatasource<NavigationNodeData>` | Dynamic / async data |\n * | `items` | `NavigationNode[]` | Static in-memory tree |\n *\n * When both are set, `datasource` takes precedence.\n *\n * Use the `navItem()` and `navGroup()` factory functions (or\n * `routesToNavigation()` for Angular Router integration) to build\n * the node array ergonomically.\n *\n * @example\n * ```html\n * <ui-navigation-page\n * [items]=\"navItems\"\n * [(activePage)]=\"currentPage\"\n * (navigated)=\"onNavigate($event)\"\n * >\n * <ng-template #content let-node>\n * <h2>{{ node.data.label }}</h2>\n * </ng-template>\n * </ui-navigation-page>\n * ```\n */\n@Component({\n selector: \"ui-navigation-page\",\n standalone: true,\n imports: [\n NgTemplateOutlet,\n UIButton,\n UIDrawer,\n UIIcon,\n UISidebarNav,\n UISidebarItem,\n UISidebarGroup,\n UIBreadcrumb,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n templateUrl: \"./navigation-page.component.html\",\n styleUrl: \"./navigation-page.component.scss\",\n host: {\n class: \"ui-navigation-page\",\n \"[class.drawer-open]\": \"drawerOpen()\",\n \"[class.sidebar-hidden]\": \"!sidebarVisible()\",\n },\n})\nexport class UINavigationPage implements OnInit {\n // ── Inputs ──────────────────────────────────────────────────────────\n\n /**\n * Tree datasource providing navigation nodes.\n *\n * Accepts any {@link ITreeDatasource} whose data payload is\n * {@link NavigationNodeData}. Root nodes with `children` render as\n * collapsible groups; leaf nodes render as sidebar items.\n *\n * Takes precedence over the `items` convenience input.\n */\n public readonly datasource = input<\n ITreeDatasource<NavigationNodeData> | undefined\n >(undefined);\n\n /**\n * Convenience: static array of navigation tree nodes.\n *\n * When set (and no `datasource` is provided), an internal\n * `ArrayTreeDatasource` is created automatically.\n *\n * Build nodes with the `navItem()` / `navGroup()` factories\n * or the `routesToNavigation()` utility.\n */\n public readonly items = input<readonly NavigationNode[]>([]);\n\n /**\n * Root breadcrumb label displayed as the first item in the trail.\n * Clicking it navigates to the first leaf node.\n */\n public readonly rootLabel = input<string>(\"Home\");\n\n /** Side the drawer slides in from. */\n public readonly drawerPosition = input<DrawerPosition>(\"left\");\n\n /** Width of the drawer panel. */\n public readonly drawerWidth = input<DrawerWidth>(\"medium\");\n\n /** Visual style for the breadcrumb trail. */\n public readonly breadcrumbVariant = input<BreadcrumbVariant>(\"button\");\n\n /** Accessible label for the navigation landmark. */\n public readonly ariaLabel = input<string>(\"Page navigation\");\n\n /** Whether the drawer should always be visible (desktop layout). */\n public readonly sidebarPinned = input(true);\n\n /** Whether to show the sidebar toggle button before the breadcrumb. */\n public readonly showSidebarToggle = input(true);\n\n /**\n * Optional localStorage key for persisting the sidebar open/closed state.\n *\n * When set, the component reads the stored value on creation and\n * writes back whenever `sidebarVisible` changes. Leave empty\n * (the default) to disable persistence.\n */\n public readonly storageKey = input<string>(\"\");\n\n // ── Models ──────────────────────────────────────────────────────────\n\n /** The currently active node id. Supports two-way binding. */\n public readonly activePage = model<string>(\"\");\n\n /** Whether the drawer is open (when not pinned). Supports two-way binding. */\n public readonly drawerOpen = model(false);\n\n /** Whether the sidebar panel is visible. Supports two-way binding. Defaults to shown. */\n public readonly sidebarVisible = model(true);\n\n // ── Outputs ─────────────────────────────────────────────────────────\n\n /** Emitted when the user navigates to a node. */\n public readonly navigated = output<NavigationNode>();\n\n // ── Content queries ─────────────────────────────────────────────────\n\n /**\n * Projected template for the main content area.\n * Receives the current {@link NavigationNode} as the implicit context.\n *\n * ```html\n * <ng-template #content let-node>\n * <h2>{{ node.data.label }}</h2>\n * </ng-template>\n * ```\n */\n public readonly contentTemplate =\n contentChild<TemplateRef<NavigationPageContext>>(\"content\");\n\n /** Projected sidebar items for custom content above the generated items. */\n public readonly projectedItems = contentChildren(UISidebarItem);\n\n // ── Computed ────────────────────────────────────────────────────────\n\n /** Icon for the sidebar toggle button. @internal */\n protected readonly sidebarToggleIcon = computed(() =>\n this.sidebarVisible()\n ? UIIcons.Lucide.Arrows.PanelLeftClose\n : UIIcons.Lucide.Arrows.PanelLeftOpen,\n );\n\n // ── Private fields ──────────────────────────────────────────────────\n\n private readonly storage = inject(StorageService);\n\n // ── Lifecycle ───────────────────────────────────────────────────────\n\n public ngOnInit(): void {\n const key = this.storageKey();\n if (key) {\n const stored = this.storage.getItem(key);\n if (stored !== null) {\n this.sidebarVisible.set(stored === \"true\");\n }\n }\n }\n\n // ── Public methods ──────────────────────────────────────────────────\n\n /** Toggle the sidebar and persist the new state to storage. */\n public toggleSidebar(): void {\n const next = !this.sidebarVisible();\n this.sidebarVisible.set(next);\n const key = this.storageKey();\n if (key) {\n this.storage.setItem(key, String(next));\n }\n }\n\n /** Resolved datasource — from the input or auto-created from items. */\n protected readonly resolvedDatasource = computed(() => {\n const ds = this.datasource();\n if (ds) {\n return ds;\n }\n return new ArrayTreeDatasource<NavigationNodeData>(\n this.items() as TreeNode<NavigationNodeData>[],\n );\n });\n\n /** Root nodes from the resolved datasource. */\n protected readonly rootNodes = computed<readonly NavigationNode[]>(() => {\n const ds = this.resolvedDatasource();\n const roots = ds.getRootNodes();\n // Support only synchronous datasources for now\n return Array.isArray(roots) ? roots : [];\n });\n\n /** The currently active navigation node. */\n public readonly currentPage = computed(() => {\n const id = this.activePage();\n return this.findNodeById(id, this.rootNodes()) ?? this.firstLeaf();\n });\n\n /** Breadcrumb trail derived from the active node and its ancestors. */\n protected readonly breadcrumbItems = computed<readonly BreadcrumbItem[]>(\n () => {\n const current = this.currentPage();\n if (!current) {\n return [{ label: this.rootLabel() }];\n }\n\n const items: BreadcrumbItem[] = [{ label: this.rootLabel(), url: \"/\" }];\n\n // If the node is a child of a group, add the group crumb\n const parent = this.findParent(current.id, this.rootNodes());\n if (parent) {\n items.push({ label: parent.data.label });\n }\n\n items.push({ label: current.data.label });\n return items;\n },\n );\n\n // ── Public methods ──────────────────────────────────────────────────\n\n /** Navigate to a node by its tree-node reference. */\n public navigate(node: NavigationNode): void {\n if (node.disabled) {\n return;\n }\n this.activePage.set(node.id);\n this.navigated.emit(node);\n\n // Auto-close drawer on navigation when not pinned\n if (!this.sidebarPinned()) {\n this.drawerOpen.set(false);\n }\n }\n\n /** Navigate to the first leaf node (root breadcrumb click handler). */\n public navigateToRoot(): void {\n const first = this.firstLeaf();\n if (first) {\n this.navigate(first);\n }\n }\n\n /** @internal Handle breadcrumb item clicks. */\n protected onBreadcrumbClick(item: BreadcrumbItem): void {\n if (item.url === \"/\") {\n this.navigateToRoot();\n return;\n }\n // Try to find a node matching the breadcrumb label\n const node = this.findNodeByLabel(item.label, this.rootNodes());\n if (node) {\n this.navigate(node);\n }\n }\n\n // ── Private helpers ─────────────────────────────────────────────────\n\n /**\n * Finds a node by `id` anywhere in the tree (depth-first).\n * @internal\n */\n private findNodeById(\n id: string,\n nodes: readonly NavigationNode[],\n ): NavigationNode | undefined {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n if (node.children?.length) {\n const found = this.findNodeById(id, node.children);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Finds a node by `data.label` anywhere in the tree (depth-first).\n * @internal\n */\n private findNodeByLabel(\n label: string,\n nodes: readonly NavigationNode[],\n ): NavigationNode | undefined {\n for (const node of nodes) {\n if (node.data.label === label) {\n return node;\n }\n if (node.children?.length) {\n const found = this.findNodeByLabel(label, node.children);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Finds the parent node of a given child `id`.\n * @internal\n */\n private findParent(\n childId: string,\n nodes: readonly NavigationNode[],\n ): NavigationNode | undefined {\n for (const node of nodes) {\n if (node.children?.some((c) => c.id === childId)) {\n return node;\n }\n if (node.children?.length) {\n const found = this.findParent(childId, node.children);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Returns the first leaf node (no children) in the tree.\n * @internal\n */\n private firstLeaf(): NavigationNode | undefined {\n const roots = this.rootNodes();\n for (const node of roots) {\n if (!node.children?.length) {\n return node;\n }\n // First child of a group\n const leaf = node.children.find((c) => !c.children?.length);\n if (leaf) {\n return leaf;\n }\n }\n return roots[0];\n }\n}\n","<div class=\"layout\">\n <!-- Sidebar (pinned or inside drawer) -->\n @if (sidebarPinned()) {\n <aside class=\"sidebar\" [class.sidebar--collapsed]=\"!sidebarVisible()\">\n <ng-content select=\"[uiSidebarHeader]\" />\n <ui-sidebar-nav [ariaLabel]=\"ariaLabel()\">\n <ng-content select=\"ui-sidebar-item\" />\n\n @for (node of rootNodes(); track node.id) {\n @if (node.children?.length) {\n <ui-sidebar-group\n [label]=\"node.data.label\"\n [icon]=\"node.icon ?? ''\"\n [expanded]=\"node.expanded ?? true\"\n >\n @for (child of node.children; track child.id) {\n <ui-sidebar-item\n [label]=\"child.data.label\"\n [icon]=\"child.icon ?? ''\"\n [badge]=\"child.data.badge ?? ''\"\n [active]=\"currentPage()?.id === child.id\"\n [disabled]=\"child.disabled ?? false\"\n (activated)=\"navigate(child)\"\n />\n }\n </ui-sidebar-group>\n } @else {\n <ui-sidebar-item\n [label]=\"node.data.label\"\n [icon]=\"node.icon ?? ''\"\n [badge]=\"node.data.badge ?? ''\"\n [active]=\"currentPage()?.id === node.id\"\n [disabled]=\"node.disabled ?? false\"\n (activated)=\"navigate(node)\"\n />\n }\n }\n </ui-sidebar-nav>\n <ng-content select=\"[uiSidebarFooter]\" />\n </aside>\n } @else {\n <ui-drawer\n [(open)]=\"drawerOpen\"\n [position]=\"drawerPosition()\"\n [width]=\"drawerWidth()\"\n [ariaLabel]=\"ariaLabel()\"\n >\n <ng-content select=\"[uiSidebarHeader]\" />\n <ui-sidebar-nav [ariaLabel]=\"ariaLabel()\">\n <ng-content select=\"ui-sidebar-item\" />\n\n @for (node of rootNodes(); track node.id) {\n @if (node.children?.length) {\n <ui-sidebar-group\n [label]=\"node.data.label\"\n [icon]=\"node.icon ?? ''\"\n [expanded]=\"node.expanded ?? true\"\n >\n @for (child of node.children; track child.id) {\n <ui-sidebar-item\n [label]=\"child.data.label\"\n [icon]=\"child.icon ?? ''\"\n [badge]=\"child.data.badge ?? ''\"\n [active]=\"currentPage()?.id === child.id\"\n [disabled]=\"child.disabled ?? false\"\n (activated)=\"navigate(child)\"\n />\n }\n </ui-sidebar-group>\n } @else {\n <ui-sidebar-item\n [label]=\"node.data.label\"\n [icon]=\"node.icon ?? ''\"\n [badge]=\"node.data.badge ?? ''\"\n [active]=\"currentPage()?.id === node.id\"\n [disabled]=\"node.disabled ?? false\"\n (activated)=\"navigate(node)\"\n />\n }\n }\n </ui-sidebar-nav>\n <ng-content select=\"[uiSidebarFooter]\" />\n </ui-drawer>\n }\n\n <!-- Main content area -->\n <main class=\"main\">\n <header class=\"breadcrumb\">\n @if (showSidebarToggle()) {\n <ui-button\n class=\"sidebar-toggle\"\n variant=\"ghost\"\n ariaLabel=\"Toggle sidebar\"\n (click)=\"toggleSidebar()\"\n >\n <ui-icon [svg]=\"sidebarToggleIcon()\" [size]=\"18\" />\n </ui-button>\n }\n <ui-breadcrumb\n surfaceType=\"panel\"\n [items]=\"breadcrumbItems()\"\n [variant]=\"breadcrumbVariant()\"\n ariaLabel=\"Page breadcrumb\"\n (itemClicked)=\"onBreadcrumbClick($event)\"\n />\n </header>\n\n <div class=\"content\">\n @if (contentTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"tpl; context: { $implicit: currentPage(), page: currentPage() }\"\n />\n } @else {\n <ng-content />\n }\n </div>\n </main>\n</div>\n","import type { TreeNode } from \"@theredhead/lucid-kit\";\n\nimport type { NavigationNodeData } from \"./navigation-page.component\";\n\n/**\n * Convenience type alias for a navigation tree node.\n *\n * A `NavigationNode` is a {@link TreeNode} whose data payload is\n * {@link NavigationNodeData}. Leaf nodes render as sidebar items;\n * nodes with `children` render as collapsible sidebar groups.\n */\nexport type NavigationNode = TreeNode<NavigationNodeData>;\n\n// ── Factory helpers ──────────────────────────────────────────────────\n\n/**\n * Creates a leaf navigation node (sidebar item).\n *\n * @param id - Unique identifier (also used as the active-page key).\n * @param label - Display text in the sidebar and breadcrumb.\n * @param options - Optional icon, badge, route, and disabled state.\n * @returns A {@link NavigationNode} without children.\n *\n * @example\n * ```ts\n * navItem('dashboard', 'Dashboard', {\n * icon: UIIcons.Lucide.Layout.LayoutDashboard,\n * badge: '3',\n * })\n * ```\n */\nexport function navItem(\n id: string,\n label: string,\n options?: {\n readonly icon?: string;\n readonly badge?: string;\n readonly route?: string;\n readonly disabled?: boolean;\n },\n): NavigationNode {\n return {\n id,\n data: {\n label,\n badge: options?.badge,\n route: options?.route,\n },\n icon: options?.icon,\n disabled: options?.disabled,\n };\n}\n\n/**\n * Creates a group navigation node (collapsible sidebar group).\n *\n * @param id - Unique identifier for the group.\n * @param label - Display text for the group header.\n * @param children - Child navigation nodes rendered inside the group.\n * @param options - Optional icon and expanded state.\n * @returns A {@link NavigationNode} with children.\n *\n * @example\n * ```ts\n * navGroup('settings', 'Settings', [\n * navItem('general', 'General'),\n * navItem('security', 'Security'),\n * ], { icon: UIIcons.Lucide.Account.Settings })\n * ```\n */\nexport function navGroup(\n id: string,\n label: string,\n children: readonly NavigationNode[],\n options?: {\n readonly icon?: string;\n readonly expanded?: boolean;\n },\n): NavigationNode {\n return {\n id,\n data: { label },\n icon: options?.icon,\n expanded: options?.expanded ?? true,\n children: [...children],\n };\n}\n\n// ── Router integration ───────────────────────────────────────────────\n\n/**\n * Shape of a route entry compatible with Angular's `Route` type.\n *\n * This is intentionally a structural type so consumers can pass\n * `inject(Router).config` directly without the library depending\n * on `@angular/router`.\n *\n * Routes are only included in the output when they carry\n * `data.navLabel`. Additional metadata keys:\n *\n * | Key | Type | Maps to |\n * |-----------------|-----------|------------------------------|\n * | `navLabel` | `string` | `data.label` |\n * | `navIcon` | `string` | `node.icon` |\n * | `navBadge` | `string` | `data.badge` |\n * | `navDisabled` | `boolean` | `node.disabled` |\n * | `navExpanded` | `boolean` | `node.expanded` (for groups) |\n */\nexport interface NavigationRouteConfig {\n readonly path?: string;\n readonly data?: Readonly<Record<string, unknown>>;\n readonly children?: readonly NavigationRouteConfig[];\n}\n\n/**\n * Converts an Angular-Router-compatible route config array into\n * {@link NavigationNode NavigationNode[]} for use with\n * {@link UINavigationPage}.\n *\n * Only routes that include `data: { navLabel: '…' }` are emitted.\n * Child routes are recursively processed, producing group nodes\n * when a parent has navigable children.\n *\n * @param routes - The route configuration (e.g. `inject(Router).config`).\n * @param parentPath - Internal: accumulated path prefix for nested routes.\n * @returns An array of navigation tree nodes.\n *\n * @example\n * ```ts\n * // In your app component:\n * private readonly router = inject(Router);\n * readonly navItems = routesToNavigation(this.router.config);\n * ```\n */\nexport function routesToNavigation(\n routes: readonly NavigationRouteConfig[],\n parentPath = \"\",\n): NavigationNode[] {\n const nodes: NavigationNode[] = [];\n\n for (const route of routes) {\n const data = route.data;\n if (!data?.[\"navLabel\"]) {\n // Skip routes without navigation metadata, but recurse into children\n if (route.children?.length) {\n const childPath = joinPath(parentPath, route.path);\n nodes.push(...routesToNavigation(route.children, childPath));\n }\n continue;\n }\n\n const fullPath = joinPath(parentPath, route.path);\n const children = route.children\n ? routesToNavigation(route.children, fullPath)\n : undefined;\n\n nodes.push({\n id: fullPath || \"/\",\n data: {\n label: data[\"navLabel\"] as string,\n badge: (data[\"navBadge\"] as string) ?? undefined,\n route: fullPath || \"/\",\n },\n icon: (data[\"navIcon\"] as string) ?? undefined,\n disabled: (data[\"navDisabled\"] as boolean) ?? false,\n expanded: (data[\"navExpanded\"] as boolean) ?? true,\n children: children?.length ? children : undefined,\n });\n }\n\n return nodes;\n}\n\n/** @internal Join two path segments, avoiding double slashes. */\nfunction joinPath(parent: string, segment?: string): string {\n if (!segment) {\n return parent;\n }\n if (!parent) {\n return segment;\n }\n return `${parent}/${segment}`.replace(/\\/+/g, \"/\");\n}\n","import { inject, Injectable } from \"@angular/core\";\nimport { StorageService } from \"@theredhead/lucid-foundation\";\n\nimport type { SavedSearch } from \"./saved-search.types\";\n\n/**\n * Manages persisted saved searches through the application-wide\n * {@link StorageService} (which defaults to `localStorage` via\n * the `STORAGE_STRATEGY` injection token).\n *\n * Searches are stored as a JSON array under a key derived from the\n * caller-supplied `storageKey`. Multiple independent search views can\n * coexist by using different storage keys.\n *\n * ### Usage\n *\n * ```ts\n * private readonly savedSearchService = inject(SavedSearchService);\n *\n * // list\n * const searches = this.savedSearchService.list('my-view');\n *\n * // save\n * this.savedSearchService.save('my-view', {\n * id: crypto.randomUUID(),\n * name: 'Active users',\n * descriptor: { junction: 'and', rules: [...] },\n * savedAt: new Date().toISOString(),\n * });\n *\n * // delete\n * this.savedSearchService.remove('my-view', searchId);\n * ```\n *\n * ### Swapping the storage backend\n *\n * Override the `STORAGE_STRATEGY` token from `@theredhead/lucid-foundation`:\n *\n * ```ts\n * providers: [\n * { provide: STORAGE_STRATEGY, useClass: MyIndexedDbStrategy },\n * ]\n * ```\n */\n@Injectable({ providedIn: \"root\" })\nexport class SavedSearchService {\n private readonly storage = inject(StorageService);\n\n /**\n * Retrieve all saved searches for the given storage key.\n *\n * Returns an empty array when nothing is stored or when the stored\n * value cannot be parsed.\n */\n public list(storageKey: string): SavedSearch[] {\n const raw = this.storage.getItem(this.prefixedKey(storageKey));\n if (!raw) return [];\n\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed as SavedSearch[];\n } catch {\n return [];\n }\n }\n\n /**\n * Persist a saved search. If a search with the same `id` already\n * exists it is replaced; otherwise the new search is appended.\n */\n public save(storageKey: string, search: SavedSearch): void {\n const list = this.list(storageKey);\n const index = list.findIndex((s) => s.id === search.id);\n if (index >= 0) {\n list[index] = search;\n } else {\n list.push(search);\n }\n this.persist(storageKey, list);\n }\n\n /**\n * Remove a saved search by its `id`.\n *\n * No-op if the id does not exist.\n */\n public remove(storageKey: string, searchId: string): void {\n const list = this.list(storageKey);\n const filtered = list.filter((s) => s.id !== searchId);\n this.persist(storageKey, filtered);\n }\n\n /**\n * Persist a new ordering of saved searches.\n *\n * Accepts an array of IDs in the desired order. Searches whose\n * IDs are not in the list are dropped.\n */\n public reorder(storageKey: string, orderedIds: readonly string[]): void {\n const list = this.list(storageKey);\n const map = new Map(list.map((s) => [s.id, s]));\n const reordered = orderedIds\n .map((id) => map.get(id))\n .filter((s): s is SavedSearch => s !== undefined);\n this.persist(storageKey, reordered);\n }\n\n /**\n * Remove all saved searches for a given storage key.\n */\n public clear(storageKey: string): void {\n this.storage.removeItem(this.prefixedKey(storageKey));\n }\n\n // ── Private helpers ─────────────────────────────────────────────\n\n private prefixedKey(storageKey: string): string {\n return `ui-saved-searches:${storageKey}`;\n }\n\n private persist(storageKey: string, list: SavedSearch[]): void {\n this.storage.setItem(this.prefixedKey(storageKey), JSON.stringify(list));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport {\n FilterableArrayDatasource,\n type IDatasource,\n UISurface,\n} from \"@theredhead/lucid-foundation\";\nimport {\n UIButton,\n UIDialog,\n UIDialogBody,\n UIDialogFooter,\n UIDialogHeader,\n UIFilter,\n UIIcon,\n UIIcons,\n UIInput,\n UIPagination,\n UITableView,\n UITableViewColumn,\n inferFilterFields,\n toFilterExpression,\n type ColumnMeta,\n type FilterDescriptor,\n type FilterExpression,\n type FilterFieldDefinition,\n type PageChangeEvent,\n} from \"@theredhead/lucid-kit\";\n\nimport { SavedSearchService } from \"./saved-search.service\";\nimport type { SavedSearch } from \"./saved-search.types\";\nimport type {\n SearchViewLayout,\n SearchViewResultsContext,\n} from \"./search-view.types\";\n\n/**\n * A unified browse-and-filter layout that composes {@link UIFilter},\n * {@link UITableView} (or a custom results template), and\n * {@link UIPagination} into a single search screen.\n *\n * ### Table mode (default)\n * ```html\n * <ui-search-view [datasource]=\"ds\" title=\"Users\">\n * <ui-text-column key=\"name\" headerText=\"Name\" />\n * <ui-text-column key=\"email\" headerText=\"Email\" />\n * </ui-search-view>\n * ```\n *\n * ### Custom results template\n * ```html\n * <ui-search-view [datasource]=\"ds\" layout=\"custom\" [filterFields]=\"fields\">\n * <ng-template #results let-items>\n * @for (item of items; track item.id) {\n * <app-card [data]=\"item\" />\n * }\n * </ng-template>\n * </ui-search-view>\n * ```\n *\n * ### With custom filter template\n * ```html\n * <ui-search-view [datasource]=\"ds\">\n * <ng-template #filter>\n * <my-custom-filter (change)=\"applyFilter($event)\" />\n * </ng-template>\n * <ui-text-column key=\"name\" headerText=\"Name\" />\n * </ui-search-view>\n * ```\n */\n@Component({\n selector: \"ui-search-view\",\n standalone: true,\n imports: [\n UIButton,\n UIDialog,\n UIDialogBody,\n UIDialogFooter,\n UIDialogHeader,\n UIFilter,\n UIInput,\n UITableView,\n UIPagination,\n UIIcon,\n NgTemplateOutlet,\n ],\n templateUrl: \"./search-view.component.html\",\n styleUrl: \"./search-view.component.scss\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n host: {\n class: \"ui-search-view\",\n },\n})\nexport class UISearchView<T = unknown> {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** Title displayed in the header area. */\n public readonly title = input<string>(\"Results\");\n\n /**\n * The datasource powering the search results.\n *\n * Accepts any {@link IDatasource}. When the datasource is a\n * {@link FilterableArrayDatasource} the component automatically\n * applies filter expressions from the embedded filter.\n */\n public readonly datasource = input<IDatasource<T> | undefined>(undefined);\n\n /**\n * Results layout mode.\n *\n * - `'table'` (default) — uses `<ui-table-view>` with projected columns.\n * - `'custom'` — renders the projected `#results` template.\n */\n public readonly layout = input<SearchViewLayout>(\"table\");\n\n /**\n * Explicit filter field definitions.\n *\n * When provided these override the auto-inferred fields derived\n * from projected columns and sample data.\n */\n public readonly filterFields = input<FilterFieldDefinition<T>[] | undefined>(\n undefined,\n );\n\n /**\n * Whether the filter section is visible.\n *\n * - `true` — always show the filter.\n * - `false` — never show the filter.\n * - `undefined` (default) — auto-detect: show when the datasource\n * is a {@link FilterableArrayDatasource}.\n */\n public readonly showFilter = input<boolean | undefined>(undefined);\n\n /** Whether the filter section starts expanded. */\n public readonly filterExpanded = input<boolean>(true);\n\n /** Whether the filter toggle button is hidden. */\n public readonly filterModeLocked = input<boolean>(false);\n\n /** Whether to show the pagination footer. */\n public readonly showPagination = input<boolean>(true);\n\n /** Items per page. */\n public readonly pageSize = input<number>(25);\n\n /** Available page-size options in the pagination selector. */\n public readonly pageSizeOptions = input<readonly number[]>([10, 25, 50, 100]);\n\n /** Placeholder text shown when there are no results. */\n public readonly placeholder = input<string>(\"No results found\");\n\n /** Accessible label for the component. */\n public readonly ariaLabel = input<string>(\"Search view\");\n\n /**\n * Storage key that enables the saved-searches feature.\n *\n * When set, a toolbar strip is shown allowing users to save, load,\n * and delete named filter states. The key is used to namespace the\n * persisted data in the underlying {@link StorageService}.\n *\n * Leave `undefined` (default) to disable saved searches.\n */\n public readonly storageKey = input<string | undefined>(undefined);\n\n // ── Outputs ───────────────────────────────────────────────────────\n\n /**\n * Emits the {@link FilterExpression} every time the filter rules change.\n */\n public readonly expressionChange = output<FilterExpression<T>>();\n\n /** Emits when the page changes. */\n public readonly pageChange = output<PageChangeEvent>();\n\n /** Emits when a saved search is loaded, saved, or deleted. */\n public readonly savedSearchChange = output<SavedSearch | null>();\n\n // ── Models ────────────────────────────────────────────────────────\n\n /** The filter descriptor state (two-way bindable). */\n public readonly filterDescriptor = model<FilterDescriptor<T>>({\n junction: \"and\",\n rules: [],\n });\n\n /** Current page index (two-way bindable, zero-based). */\n public readonly pageIndex = model<number>(0);\n\n // ── Content queries ───────────────────────────────────────────────\n\n /** Projected table-view columns (used in table layout mode). */\n public readonly columns = contentChildren(UITableViewColumn);\n\n /** Optional custom results template (used in custom layout mode). */\n public readonly resultsTemplate =\n contentChild<TemplateRef<SearchViewResultsContext<T>>>(\"results\");\n\n /** Optional custom filter template. */\n public readonly filterTemplate = contentChild<TemplateRef<unknown>>(\"filter\");\n\n /** Optional empty-state template. */\n public readonly emptyTemplate = contentChild<TemplateRef<unknown>>(\"empty\");\n\n // ── View queries ──────────────────────────────────────────────────\n\n /** @internal — reference to the embedded table-view (when in table layout). */\n private readonly tableView = viewChild(UITableView);\n\n // ── Computed ──────────────────────────────────────────────────────\n\n /** @internal */\n protected readonly chevronRight = UIIcons.Lucide.Arrows.ChevronRight;\n /** @internal */\n protected readonly chevronDown = UIIcons.Lucide.Arrows.ChevronDown;\n\n /** @internal — whether the filter panel is collapsed. */\n protected readonly filterCollapsed = signal<boolean>(false);\n\n /** @internal — total item count from the datasource. */\n protected readonly totalItems = signal<number>(0);\n\n /** @internal */\n protected readonly resolvedShowFilter = computed(() => {\n const explicit = this.showFilter();\n if (explicit !== undefined) return explicit;\n return this.datasource() instanceof FilterableArrayDatasource;\n });\n\n /** @internal — auto-inferred or explicit filter fields. */\n protected readonly resolvedFilterFields = computed(() => {\n const explicit = this.filterFields();\n if (explicit) return explicit;\n\n const ds = this.datasource();\n if (!ds) return [];\n\n const cols = this.columns();\n const columnMeta: ColumnMeta[] = cols.map((c) => ({\n key: c.key(),\n headerText: c.headerText(),\n }));\n\n // Prefer the full unfiltered list when available\n const allRows =\n ds instanceof FilterableArrayDatasource ? ds.allRows : undefined;\n\n let sample: T | undefined;\n if (allRows && allRows.length > 0) {\n sample = allRows[0];\n } else {\n const count = ds.getNumberOfItems();\n if (typeof count !== \"number\" || count === 0) return [];\n const result = ds.getObjectAtRowIndex(0);\n if (!result || result instanceof Promise) return [];\n sample = result;\n }\n\n if (!sample) return [];\n\n return inferFilterFields(\n sample as Record<string, unknown>,\n columnMeta.length > 0 ? columnMeta : undefined,\n ) as FilterFieldDefinition<T>[];\n });\n\n /** @internal — sample data for filter value suggestions. */\n protected readonly resolvedFilterData = computed<readonly T[]>(() => {\n const ds = this.datasource();\n if (!ds) return [];\n\n if (ds instanceof FilterableArrayDatasource) {\n const all = ds.allRows;\n return all.length < 1000 ? all : [];\n }\n\n const count = ds.getNumberOfItems();\n if (typeof count !== \"number\" || count === 0 || count >= 1000) return [];\n const rows: T[] = [];\n for (let i = 0; i < count; i++) {\n const row = ds.getObjectAtRowIndex(i);\n if (!(row instanceof Promise)) rows.push(row);\n }\n return rows;\n });\n\n // ── Saved-search state ──────────────────────────────────────────\n\n /** @internal — whether the saved-searches feature is enabled. */\n protected readonly savedSearchesEnabled = computed(\n () => this.storageKey() !== undefined,\n );\n\n /** @internal — list of persisted saved searches. */\n protected readonly savedSearches = signal<readonly SavedSearch[]>([]);\n\n /** @internal — ID of the currently selected saved search (empty = none). */\n protected readonly selectedSearchId = signal<string>(\"\");\n\n /** @internal — name input value when saving a filter. */\n protected readonly searchName = signal<string>(\"\");\n\n /** @internal — whether the save-filter dialog is open. */\n protected readonly saveDialogOpen = signal<boolean>(false);\n\n /** @internal — index of the chip being dragged (−1 = none). */\n private dragSourceIndex = -1;\n\n /**\n * @internal — bumped after every `filterBy` call so computeds\n * that depend on the datasource's filtered state re-evaluate.\n */\n private readonly _filterVersion = signal(0);\n\n /**\n * @internal — the rows for the current page (filtered + paged).\n * Used only for custom layout mode where the table is not\n * available to handle paging internally.\n */\n protected readonly pagedRows = computed<readonly T[]>(() => {\n this._filterVersion();\n const ds = this.datasource();\n if (!ds) return [];\n\n const total = ds.getNumberOfItems();\n if (typeof total !== \"number\" || total === 0) return [];\n\n if (!this.showPagination()) {\n const rows: T[] = [];\n for (let i = 0; i < total; i++) {\n const row = ds.getObjectAtRowIndex(i);\n if (!(row instanceof Promise)) rows.push(row);\n }\n return rows;\n }\n\n const size = this.pageSize();\n const start = this.pageIndex() * size;\n const end = Math.min(start + size, total);\n\n const rows: T[] = [];\n for (let i = start; i < end; i++) {\n const row = ds.getObjectAtRowIndex(i);\n if (!(row instanceof Promise)) rows.push(row);\n }\n return rows;\n });\n\n private readonly savedSearchService = inject(SavedSearchService);\n\n // ── Constructor ───────────────────────────────────────────────────\n\n public constructor() {\n this.filterCollapsed.set(!this.filterExpanded());\n\n effect(() => {\n this.filterCollapsed.set(!this.filterExpanded());\n });\n\n effect(() => {\n const ds = this.datasource();\n if (!ds) {\n this.totalItems.set(0);\n return;\n }\n const count = ds.getNumberOfItems();\n if (typeof count === \"number\") {\n this.totalItems.set(count);\n }\n });\n\n // Reload persisted saved searches whenever the storage key changes.\n effect(() => {\n const key = this.storageKey();\n if (key) {\n this.savedSearches.set(this.savedSearchService.list(key));\n } else {\n this.savedSearches.set([]);\n }\n this.selectedSearchId.set(\"\");\n this.saveDialogOpen.set(false);\n });\n }\n\n // ── Public methods ────────────────────────────────────────────────\n\n /** Toggle the filter panel open/closed. */\n public toggleFilter(): void {\n this.filterCollapsed.update((c) => !c);\n }\n\n /**\n * Load a saved search by its ID, applying its filter descriptor\n * to the search view.\n */\n public loadSavedSearch(searchId: string): void {\n if (!searchId) {\n this.selectedSearchId.set(\"\");\n return;\n }\n const search = this.savedSearches().find((s) => s.id === searchId);\n if (search) {\n this.filterDescriptor.set(structuredClone(search.descriptor));\n this.selectedSearchId.set(search.id);\n this.savedSearchChange.emit(search);\n }\n }\n\n /**\n * Save the current filter state as a new named search.\n */\n public saveNewSearch(name: string): void {\n const key = this.storageKey();\n if (!key || !name.trim()) return;\n\n const search: SavedSearch<T> = {\n id: crypto.randomUUID(),\n name: name.trim(),\n descriptor: structuredClone(this.filterDescriptor()),\n savedAt: new Date().toISOString(),\n };\n\n this.savedSearchService.save(key, search as SavedSearch);\n this.savedSearches.set(this.savedSearchService.list(key));\n this.selectedSearchId.set(search.id);\n this.saveDialogOpen.set(false);\n this.searchName.set(\"\");\n this.savedSearchChange.emit(search as SavedSearch);\n }\n\n /**\n * Delete a saved search by its ID.\n */\n public deleteSavedSearch(searchId: string): void {\n const key = this.storageKey();\n if (!key) return;\n\n this.savedSearchService.remove(key, searchId);\n this.savedSearches.set(this.savedSearchService.list(key));\n if (this.selectedSearchId() === searchId) {\n this.selectedSearchId.set(\"\");\n }\n this.savedSearchChange.emit(null);\n }\n\n // ── Protected methods ─────────────────────────────────────────────\n\n /** @internal */\n protected readonly saveIcon = UIIcons.Lucide.Files.Save;\n /** @internal */\n protected readonly xIcon = UIIcons.Lucide.Math.X;\n\n /** @internal */\n protected onLoadSearch(searchId: string): void {\n this.loadSavedSearch(searchId);\n }\n\n /** @internal */\n protected onDeleteSearch(event: Event, searchId: string): void {\n event.stopPropagation();\n this.deleteSavedSearch(searchId);\n }\n\n /** @internal — opens the save-filter dialog. */\n protected onSaveFilterClick(): void {\n this.searchName.set(\"\");\n this.saveDialogOpen.set(true);\n }\n\n /** @internal */\n protected onConfirmSave(): void {\n this.saveNewSearch(this.searchName());\n }\n\n /** @internal */\n protected onCancelSave(): void {\n this.saveDialogOpen.set(false);\n this.searchName.set(\"\");\n }\n\n // ── Chip drag-and-drop reorder ────────────────────────────────────\n\n /** @internal */\n protected onChipDragStart(event: DragEvent, index: number): void {\n this.dragSourceIndex = index;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = \"move\";\n }\n }\n\n /** @internal */\n protected onChipDragOver(event: DragEvent): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"move\";\n }\n }\n\n /** @internal */\n protected onChipDrop(event: DragEvent, targetIndex: number): void {\n event.preventDefault();\n const from = this.dragSourceIndex;\n if (from < 0 || from === targetIndex) return;\n\n const key = this.storageKey();\n if (!key) return;\n\n const list = [...this.savedSearches()];\n const [moved] = list.splice(from, 1);\n list.splice(targetIndex, 0, moved);\n\n const orderedIds = list.map((s) => s.id);\n this.savedSearchService.reorder(key, orderedIds);\n this.savedSearches.set(this.savedSearchService.list(key));\n this.dragSourceIndex = -1;\n }\n\n /** @internal */\n protected onChipDragEnd(): void {\n this.dragSourceIndex = -1;\n }\n\n /** @internal */\n protected onFilterExpressionChange(expression: FilterExpression<T>): void {\n this.expressionChange.emit(expression);\n\n const ds = this.datasource();\n if (ds instanceof FilterableArrayDatasource) {\n const compiled = toFilterExpression(\n expression,\n this.resolvedFilterFields(),\n );\n ds.filterBy(compiled.length === 0 ? null : compiled);\n const count = ds.getNumberOfItems();\n this.totalItems.set(typeof count === \"number\" ? count : 0);\n this.pageIndex.set(0);\n\n // Tell the table to rebuild its adapter so it picks up the\n // newly filtered datasource content.\n this.tableView()?.refreshDatasource();\n }\n this._filterVersion.update((v) => v + 1);\n }\n\n /** @internal */\n protected onPageChange(event: PageChangeEvent): void {\n this.pageChange.emit(event);\n }\n}\n","<!-- Hidden slot: instantiates projected columns for contentChildren discovery. -->\n<div class=\"columns-slot\"><ng-content /></div>\n\n<header class=\"sv-header\">\n <h2 class=\"sv-title\">{{ title() }}</h2>\n <span class=\"sv-count\">{{ totalItems() }} items</span>\n</header>\n\n@if (resolvedShowFilter()) {\n <div class=\"sv-filter-bar\">\n @if (!filterModeLocked()) {\n <button\n class=\"sv-filter-toggle\"\n type=\"button\"\n (click)=\"toggleFilter()\"\n [attr.aria-expanded]=\"!filterCollapsed()\"\n aria-controls=\"sv-filter-content\"\n >\n <ui-icon\n [svg]=\"filterCollapsed() ? chevronRight : chevronDown\"\n [size]=\"14\"\n />\n <span>Filter</span>\n </button>\n }\n @if (!filterCollapsed()) {\n <div class=\"sv-filter-content\" id=\"sv-filter-content\">\n @if (filterTemplate(); as filterTpl) {\n <ng-container *ngTemplateOutlet=\"filterTpl\" />\n } @else {\n @if (resolvedFilterFields(); as fields) {\n @if (fields.length > 0) {\n <ui-filter\n [fields]=\"fields\"\n [data]=\"resolvedFilterData()\"\n [allowJunction]=\"true\"\n [modeLocked]=\"filterModeLocked()\"\n [showSaveButton]=\"savedSearchesEnabled()\"\n [(value)]=\"filterDescriptor\"\n (expressionChange)=\"onFilterExpressionChange($event)\"\n (saveFilter)=\"onSaveFilterClick()\"\n />\n }\n }\n }\n </div>\n }\n </div>\n}\n\n@if (savedSearchesEnabled() && savedSearches().length > 0) {\n <div\n class=\"sv-chip-strip\"\n role=\"listbox\"\n aria-label=\"Saved searches\"\n >\n @for (search of savedSearches(); track search.id; let idx = $index) {\n <button\n class=\"sv-chip\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"selectedSearchId() === search.id\"\n [class.sv-chip--active]=\"selectedSearchId() === search.id\"\n draggable=\"true\"\n (click)=\"onLoadSearch(search.id)\"\n (dragstart)=\"onChipDragStart($event, idx)\"\n (dragover)=\"onChipDragOver($event)\"\n (drop)=\"onChipDrop($event, idx)\"\n (dragend)=\"onChipDragEnd()\"\n >\n <span class=\"sv-chip-label\">{{ search.name }}</span>\n <span\n class=\"sv-chip-remove\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Delete ' + search.name\"\n (click)=\"onDeleteSearch($event, search.id)\"\n (keydown.enter)=\"onDeleteSearch($event, search.id)\"\n (keydown.space)=\"onDeleteSearch($event, search.id)\"\n >\n <ui-icon [svg]=\"xIcon\" [size]=\"10\" />\n </span>\n </button>\n }\n </div>\n}\n\n<div class=\"sv-results\" role=\"region\" [attr.aria-label]=\"ariaLabel()\">\n @if (layout() === 'table') {\n <div class=\"sv-table-wrapper\">\n <ui-table-view\n [datasource]=\"datasource()!\"\n [externalColumns]=\"columns()\"\n [showBuiltInPaginator]=\"false\"\n [showRowIndexIndicator]=\"false\"\n [pageSize]=\"pageSize()\"\n [pageIndex]=\"pageIndex()\"\n />\n @if (totalItems() === 0) {\n @if (emptyTemplate(); as emptyTpl) {\n <ng-container *ngTemplateOutlet=\"emptyTpl\" />\n } @else {\n <div class=\"sv-empty\">\n <p>{{ placeholder() }}</p>\n </div>\n }\n }\n </div>\n } @else if (totalItems() === 0) {\n @if (emptyTemplate(); as emptyTpl) {\n <ng-container *ngTemplateOutlet=\"emptyTpl\" />\n } @else {\n <div class=\"sv-empty\">\n <p>{{ placeholder() }}</p>\n </div>\n }\n } @else if (resultsTemplate(); as resultsTpl) {\n <div class=\"sv-custom-results\">\n <ng-container\n *ngTemplateOutlet=\"resultsTpl; context: { $implicit: pagedRows() }\"\n />\n </div>\n }\n</div>\n\n@if (showPagination() && totalItems() > 0) {\n <footer class=\"sv-footer\">\n <ui-pagination\n [totalItems]=\"totalItems()\"\n [pageSize]=\"pageSize()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [(pageIndex)]=\"pageIndex\"\n (pageChange)=\"onPageChange($event)\"\n />\n </footer>\n}\n\n<ui-dialog [(open)]=\"saveDialogOpen\" ariaLabel=\"Save filter\">\n <ui-dialog-header>Save Filter</ui-dialog-header>\n <ui-dialog-body>\n <ui-input\n [(value)]=\"searchName\"\n placeholder=\"Filter name\"\n ariaLabel=\"Filter name\"\n />\n </ui-dialog-body>\n <ui-dialog-footer>\n <ui-button variant=\"ghost\" (click)=\"onCancelSave()\">Cancel</ui-button>\n <ui-button variant=\"filled\" (click)=\"onConfirmSave()\" [disabled]=\"!searchName().trim()\">Save</ui-button>\n </ui-dialog-footer>\n</ui-dialog>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n} from \"@angular/core\";\n\nimport {\n UICheckbox,\n UIColorPicker,\n UIDropdownList,\n UIInput,\n UISlider,\n} from \"@theredhead/lucid-kit\";\n\nimport type {\n PropertyChangeEvent,\n PropertyFieldDefinition,\n} from \"./property-sheet.types\";\nimport {\n UISurface,\n UI_DEFAULT_SURFACE_TYPE,\n} from \"@theredhead/lucid-foundation\";\n\n/**\n * Grouped field set used internally to organise fields by group.\n * @internal\n */\ninterface FieldGroup<T> {\n readonly name: string;\n readonly fields: readonly PropertyFieldDefinition<T>[];\n}\n\n/**\n * A key-value inspector panel that renders a schema of typed fields\n * against a data object.\n *\n * Each field definition maps to an appropriate editor widget\n * (`UIInput`, `UISelect`, `UICheckbox`, `UIColorPicker`, or\n * `UISlider`). Changes are emitted per-field via\n * {@link propertyChange} and the data model is updated in-place.\n *\n * ### Basic usage\n * ```html\n * <ui-property-sheet\n * [fields]=\"fields\"\n * [(data)]=\"config\"\n * (propertyChange)=\"onChanged($event)\"\n * />\n * ```\n *\n * ### Grouped fields\n * ```ts\n * const fields: PropertyFieldDefinition<Config>[] = [\n * { key: 'name', label: 'Name', type: 'string', group: 'General' },\n * { key: 'color', label: 'Color', type: 'color', group: 'Appearance' },\n * ];\n * ```\n */\n@Component({\n selector: \"ui-property-sheet\",\n standalone: true,\n imports: [UIInput, UIDropdownList, UICheckbox, UIColorPicker, UISlider],\n templateUrl: \"./property-sheet.component.html\",\n styleUrl: \"./property-sheet.component.scss\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n providers: [{ provide: UI_DEFAULT_SURFACE_TYPE, useValue: \"panel\" }],\n host: {\n class: \"ui-property-sheet\",\n },\n})\nexport class UIPropertySheet<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** Field definitions describing the properties to edit. */\n public readonly fields =\n input.required<readonly PropertyFieldDefinition<T>[]>();\n\n /** Accessible label for the sheet. */\n public readonly ariaLabel = input<string>(\"Property sheet\");\n\n // ── Models ────────────────────────────────────────────────────────\n\n /** The data object being inspected/edited (two-way bindable). */\n public readonly data = model<T>({} as T);\n\n // ── Outputs ───────────────────────────────────────────────────────\n\n /** Emits when any property value changes. */\n public readonly propertyChange = output<PropertyChangeEvent<T>>();\n\n // ── Computed ──────────────────────────────────────────────────────\n\n /** @internal — fields organised into named groups. */\n protected readonly groups = computed<readonly FieldGroup<T>[]>(() => {\n const defs = this.fields();\n const map = new Map<string, PropertyFieldDefinition<T>[]>();\n\n for (const field of defs) {\n const group = field.group ?? \"\";\n let list = map.get(group);\n if (!list) {\n list = [];\n map.set(group, list);\n }\n list.push(field);\n }\n\n const result: FieldGroup<T>[] = [];\n for (const [name, fields] of map) {\n result.push({ name, fields });\n }\n return result;\n });\n\n // ── Protected methods ─────────────────────────────────────────────\n\n /** @internal — read a field value from the data object. */\n protected getValue(key: string): unknown {\n return this.data()[key as keyof T];\n }\n\n /** @internal — update a field and emit. */\n protected onValueChange(key: string & keyof T, value: unknown): void {\n const updated = { ...this.data(), [key]: value };\n this.data.set(updated);\n this.propertyChange.emit({ key, value, data: updated });\n }\n}\n","<div class=\"ps-sheet\" role=\"form\" [attr.aria-label]=\"ariaLabel()\">\n @for (group of groups(); track group.name) {\n @if (group.name) {\n <h3 class=\"ps-group-heading\">{{ group.name }}</h3>\n }\n @for (field of group.fields; track field.key) {\n <div class=\"ps-row\" [class.ps-row--readonly]=\"field.readonly\">\n <label class=\"ps-label\" [attr.for]=\"'ps-' + field.key\">\n {{ field.label }}\n </label>\n <div class=\"ps-editor\">\n @switch (field.type) {\n @case ('string') {\n <ui-input\n [attr.id]=\"'ps-' + field.key\"\n [value]=\"'' + (getValue(field.key) ?? '')\"\n [placeholder]=\"field.placeholder ?? ''\"\n [disabled]=\"field.readonly ?? false\"\n [ariaLabel]=\"field.label\"\n (valueChange)=\"onValueChange(field.key, $event)\"\n />\n }\n @case ('number') {\n <ui-input\n [attr.id]=\"'ps-' + field.key\"\n type=\"number\"\n [value]=\"'' + (getValue(field.key) ?? '')\"\n [placeholder]=\"field.placeholder ?? ''\"\n [disabled]=\"field.readonly ?? false\"\n [ariaLabel]=\"field.label\"\n (valueChange)=\"onValueChange(field.key, +$event)\"\n />\n }\n @case ('boolean') {\n <ui-checkbox\n [checked]=\"!!getValue(field.key)\"\n [disabled]=\"field.readonly ?? false\"\n [ariaLabel]=\"field.label\"\n (checkedChange)=\"onValueChange(field.key, $event)\"\n />\n }\n @case ('select') {\n <ui-dropdown-list\n [options]=\"field.options ?? []\"\n [value]=\"'' + (getValue(field.key) ?? '')\"\n [disabled]=\"field.readonly ?? false\"\n [ariaLabel]=\"field.label\"\n (valueChange)=\"onValueChange(field.key, $event)\"\n />\n }\n @case ('color') {\n <ui-color-picker\n [value]=\"'' + (getValue(field.key) ?? '#000000')\"\n (valueChange)=\"onValueChange(field.key, $event)\"\n />\n }\n @case ('slider') {\n <ui-slider\n [value]=\"+(getValue(field.key) ?? 0)\"\n [min]=\"field.min ?? 0\"\n [max]=\"field.max ?? 100\"\n [step]=\"field.step ?? 1\"\n [disabled]=\"field.readonly ?? false\"\n [showValue]=\"true\"\n (valueChange)=\"onValueChange(field.key, $event)\"\n />\n }\n }\n </div>\n </div>\n }\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild,\n} from \"@angular/core\";\n\nimport { UIIcon, UIIcons } from \"@theredhead/lucid-kit\";\n\nimport type {\n CommandExecuteEvent,\n CommandGroup,\n CommandPaletteItem,\n} from \"./command-palette.types\";\nimport { UISurface } from \"@theredhead/lucid-foundation\";\n\n/**\n * A keyboard-triggered command palette that provides quick access\n * to application actions through a searchable, grouped list.\n *\n * Open with `Cmd+K` / `Ctrl+K` (when {@link globalShortcut} is\n * enabled) or by setting the `open` model to `true`.\n *\n * ### Basic usage\n * ```html\n * <ui-command-palette\n * [commands]=\"commands\"\n * [(open)]=\"paletteOpen\"\n * (execute)=\"onExecute($event)\"\n * />\n * ```\n *\n * ### With recent items\n * ```html\n * <ui-command-palette\n * [commands]=\"commands\"\n * [maxRecent]=\"5\"\n * [(open)]=\"paletteOpen\"\n * (execute)=\"onExecute($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"ui-command-palette\",\n standalone: true,\n imports: [UIIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n templateUrl: \"./command-palette.component.html\",\n styleUrl: \"./command-palette.component.scss\",\n host: {\n class: \"ui-command-palette\",\n },\n})\nexport class UICommandPalette<C = unknown> {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** The full list of available commands. */\n public readonly commands = input.required<readonly CommandPaletteItem<C>[]>();\n\n /** Placeholder text for the search input. */\n public readonly placeholder = input<string>(\"Type a command…\");\n\n /** Accessible label for the palette. */\n public readonly ariaLabel = input<string>(\"Command palette\");\n\n /**\n * Whether the global `Cmd+K` / `Ctrl+K` keyboard shortcut is\n * active. Defaults to `true`.\n */\n public readonly globalShortcut = input<boolean>(true);\n\n /**\n * Maximum number of recent commands to track. Set to `0` to\n * disable the recent-items section. Defaults to `5`.\n */\n public readonly maxRecent = input<number>(5);\n\n // ── Models ────────────────────────────────────────────────────────\n\n /** Whether the palette is open (two-way bindable). */\n public readonly open = model<boolean>(false);\n\n // ── Outputs ───────────────────────────────────────────────────────\n\n /** Emitted when a command is executed. */\n public readonly execute = output<CommandExecuteEvent<C>>();\n\n // ── View queries ──────────────────────────────────────────────────\n\n /** @internal */\n private readonly searchInputRef =\n viewChild<ElementRef<HTMLInputElement>>(\"searchInput\");\n\n // ── Internal state ────────────────────────────────────────────────\n\n /** @internal — current search query. */\n protected readonly query = signal(\"\");\n\n /** @internal — index of the active (highlighted) item. */\n protected readonly activeIndex = signal(0);\n\n /** @internal — IDs of recently executed commands (most recent first). */\n protected readonly recentIds = signal<readonly string[]>([]);\n\n // ── Icons ─────────────────────────────────────────────────────────\n\n /** @internal */\n protected readonly searchIcon = UIIcons.Lucide.Social.Search;\n /** @internal */\n protected readonly returnIcon = UIIcons.Lucide.Arrows.CornerDownLeft;\n /** @internal */\n protected readonly arrowUpIcon = UIIcons.Lucide.Arrows.ArrowUp;\n /** @internal */\n protected readonly arrowDownIcon = UIIcons.Lucide.Arrows.ArrowDown;\n\n // ── Computed ──────────────────────────────────────────────────────\n\n /** @internal — filtered and grouped commands based on the query. */\n protected readonly filteredGroups = computed<readonly CommandGroup<C>[]>(\n () => {\n const q = this.query().toLowerCase().trim();\n const all = this.commands();\n\n const matching = q\n ? all.filter(\n (cmd) =>\n cmd.label.toLowerCase().includes(q) ||\n (cmd.keywords ?? []).some((k) => k.toLowerCase().includes(q)) ||\n (cmd.group ?? \"\").toLowerCase().includes(q),\n )\n : all;\n\n return this.groupCommands(matching);\n },\n );\n\n /** @internal — recent commands that are still in the full commands list. */\n protected readonly recentCommands = computed<\n readonly CommandPaletteItem<C>[]\n >(() => {\n const ids = this.recentIds();\n const max = this.maxRecent();\n if (max === 0 || ids.length === 0) return [];\n\n const all = this.commands();\n const lookup = new Map(all.map((c) => [c.id, c]));\n return ids\n .map((id) => lookup.get(id))\n .filter((c): c is CommandPaletteItem<C> => c !== undefined)\n .slice(0, max);\n });\n\n /** @internal — whether to show the recent section. */\n protected readonly showRecent = computed(\n () =>\n this.maxRecent() > 0 &&\n this.recentCommands().length > 0 &&\n !this.query().trim(),\n );\n\n /** @internal — flat list of all currently visible items for keyboard nav. */\n protected readonly flatItems = computed<readonly CommandPaletteItem<C>[]>(\n () => {\n const items: CommandPaletteItem<C>[] = [];\n if (this.showRecent()) {\n items.push(...this.recentCommands());\n }\n for (const group of this.filteredGroups()) {\n items.push(...group.items);\n }\n return items;\n },\n );\n\n // ── Constructor ───────────────────────────────────────────────────\n\n public constructor() {\n // Register global keyboard shortcut\n const onKeydown = (e: KeyboardEvent) => {\n if (!this.globalShortcut()) return;\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault();\n this.open.update((v) => !v);\n }\n };\n\n if (typeof document !== \"undefined\") {\n document.addEventListener(\"keydown\", onKeydown);\n }\n\n // Focus the search input when the palette opens\n effect(() => {\n if (this.open()) {\n this.query.set(\"\");\n this.activeIndex.set(0);\n // Allow DOM to render before focusing\n queueMicrotask(() => {\n this.searchInputRef()?.nativeElement.focus();\n });\n }\n });\n\n // Reset active index when query changes\n effect(() => {\n this.query();\n this.activeIndex.set(0);\n });\n }\n\n // ── Public methods ────────────────────────────────────────────────\n\n /** Programmatically open the palette. */\n public show(): void {\n this.open.set(true);\n }\n\n /** Programmatically close the palette. */\n public close(): void {\n this.open.set(false);\n }\n\n // ── Protected methods ─────────────────────────────────────────────\n\n /** @internal */\n protected onSearchInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.query.set(input.value);\n }\n\n /** @internal */\n protected onKeydown(event: KeyboardEvent): void {\n const items = this.flatItems();\n const len = items.length;\n if (len === 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n this.activeIndex.update((i) => (i + 1) % len);\n this.scrollActiveIntoView();\n break;\n case \"ArrowUp\":\n event.preventDefault();\n this.activeIndex.update((i) => (i - 1 + len) % len);\n this.scrollActiveIntoView();\n break;\n case \"Enter\": {\n event.preventDefault();\n const item = items[this.activeIndex()];\n if (item && !item.disabled) {\n this.executeCommand(item);\n }\n break;\n }\n case \"Escape\":\n event.preventDefault();\n this.close();\n break;\n }\n }\n\n /** @internal */\n protected onItemClick(item: CommandPaletteItem<C>): void {\n if (item.disabled) return;\n this.executeCommand(item);\n }\n\n /** @internal */\n protected onBackdropClick(): void {\n this.close();\n }\n\n /** @internal — compute the flat index for a group item. */\n protected getFlatIndex(groupIndex: number, itemIndex: number): number {\n const groups = this.filteredGroups();\n let offset = this.showRecent() ? this.recentCommands().length : 0;\n for (let g = 0; g < groupIndex; g++) {\n offset += groups[g].items.length;\n }\n return offset + itemIndex;\n }\n\n /** @internal — compute the flat index for a recent item. */\n protected getRecentFlatIndex(index: number): number {\n return index;\n }\n\n // ── Private methods ───────────────────────────────────────────────\n\n private executeCommand(item: CommandPaletteItem<C>): void {\n this.execute.emit({\n command: item,\n executedAt: new Date().toISOString(),\n });\n this.addToRecent(item.id);\n this.close();\n }\n\n private addToRecent(id: string): void {\n const max = this.maxRecent();\n if (max === 0) return;\n this.recentIds.update((ids) => {\n const filtered = ids.filter((i) => i !== id);\n return [id, ...filtered].slice(0, max);\n });\n }\n\n private groupCommands(\n items: readonly CommandPaletteItem<C>[],\n ): readonly CommandGroup<C>[] {\n const map = new Map<string, CommandPaletteItem<C>[]>();\n for (const item of items) {\n const group = item.group ?? \"\";\n let list = map.get(group);\n if (!list) {\n list = [];\n map.set(group, list);\n }\n list.push(item);\n }\n const result: CommandGroup<C>[] = [];\n for (const [name, groupItems] of map) {\n result.push({ name, items: groupItems });\n }\n return result;\n }\n\n private scrollActiveIntoView(): void {\n queueMicrotask(() => {\n const active = this.searchInputRef()\n ?.nativeElement.closest(\".cp-dialog\")\n ?.querySelector(\".cp-item--active\");\n active?.scrollIntoView?.({ block: \"nearest\" });\n });\n }\n}\n","@if (open()) {\n <div class=\"cp-backdrop\" (click)=\"onBackdropClick()\" (keydown)=\"onKeydown($event)\" tabindex=\"-1\"></div>\n <div\n class=\"cp-dialog\"\n role=\"dialog\"\n [attr.aria-label]=\"ariaLabel()\"\n (keydown)=\"onKeydown($event)\"\n >\n <!-- Search bar -->\n <div class=\"cp-search\">\n <ui-icon class=\"cp-search-icon\" [svg]=\"searchIcon\" [size]=\"18\" />\n <input\n #searchInput\n class=\"cp-search-input\"\n type=\"text\"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n (input)=\"onSearchInput($event)\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n aria-controls=\"cp-results\"\n [attr.aria-activedescendant]=\"\n flatItems().length\n ? 'cp-item-' + activeIndex()\n : null\n \"\n />\n <kbd class=\"cp-kbd\">esc</kbd>\n </div>\n\n <!-- Results List -->\n <div\n id=\"cp-results\"\n class=\"cp-results\"\n role=\"listbox\"\n [attr.aria-label]=\"'Search results'\"\n >\n @if (flatItems().length === 0) {\n <div class=\"cp-empty\">No matching commands</div>\n } @else {\n <!-- Recent Commands -->\n @if (showRecent()) {\n <div class=\"cp-group\">\n <div class=\"cp-group-heading\">Recent</div>\n @for (item of recentCommands(); track item.id; let i = $index) {\n <div\n class=\"cp-item\"\n role=\"option\"\n tabindex=\"-1\"\n [id]=\"'cp-item-' + getRecentFlatIndex(i)\"\n [class.cp-item--active]=\"activeIndex() === getRecentFlatIndex(i)\"\n [class.cp-item--disabled]=\"item.disabled\"\n [attr.aria-selected]=\"activeIndex() === getRecentFlatIndex(i)\"\n [attr.aria-disabled]=\"item.disabled ?? false\"\n (click)=\"onItemClick(item)\"\n (keydown)=\"onKeydown($event)\"\n (pointerenter)=\"activeIndex.set(getRecentFlatIndex(i))\"\n >\n @if (item.icon) {\n <ui-icon class=\"cp-item-icon\" [svg]=\"item.icon\" [size]=\"16\" />\n }\n <span class=\"cp-item-label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <kbd class=\"cp-item-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n\n <!-- Grouped commands -->\n @for (group of filteredGroups(); track group.name; let gi = $index) {\n <div class=\"cp-group\">\n @if (group.name) {\n <div class=\"cp-group-heading\">{{ group.name }}</div>\n }\n @for (item of group.items; track item.id; let ii = $index) {\n <div\n class=\"cp-item\"\n role=\"option\"\n tabindex=\"-1\"\n [id]=\"'cp-item-' + getFlatIndex(gi, ii)\"\n [class.cp-item--active]=\"activeIndex() === getFlatIndex(gi, ii)\"\n [class.cp-item--disabled]=\"item.disabled\"\n [attr.aria-selected]=\"activeIndex() === getFlatIndex(gi, ii)\"\n [attr.aria-disabled]=\"item.disabled ?? false\"\n (click)=\"onItemClick(item)\"\n (keydown)=\"onKeydown($event)\"\n (pointerenter)=\"activeIndex.set(getFlatIndex(gi, ii))\"\n >\n @if (item.icon) {\n <ui-icon class=\"cp-item-icon\" [svg]=\"item.icon\" [size]=\"16\" />\n }\n <span class=\"cp-item-label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <kbd class=\"cp-item-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- Footer hints -->\n <div class=\"cp-footer\">\n <span class=\"cp-hint\">\n <ui-icon [svg]=\"returnIcon\" [size]=\"12\" />\n <span>to select</span>\n </span>\n <span class=\"cp-hint\">\n <ui-icon [svg]=\"arrowUpIcon\" [size]=\"12\" />\n <ui-icon [svg]=\"arrowDownIcon\" [size]=\"12\" />\n <span>to navigate</span>\n </span>\n <span class=\"cp-hint\">\n <kbd>esc</kbd>\n <span>to close</span>\n </span>\n </div>\n </div>\n}\n","import { InjectionToken } from \"@angular/core\";\nimport type { TreeNode } from \"@theredhead/lucid-kit\";\n\n/**\n * View modes supported by the file browser contents panel.\n *\n * - `list` — Default row-per-entry list (original behaviour).\n * - `icons` — Grid of large icons with name labels.\n * - `detail` — Table with sortable columns (name, size, date, type).\n * - `tree` — Flat tree view showing nested hierarchy inline.\n * - `column` — NeXTSTEP / macOS Finder column view: one column per\n * traversed directory level with horizontal scrolling.\n */\nexport type FileBrowserViewMode =\n | \"list\"\n | \"icons\"\n | \"detail\"\n | \"tree\"\n | \"column\";\n\n/**\n * Maps file extensions (without leading dot, lower-case) to SVG icon\n * strings. Consumers provide this via DI to customise the icon view.\n *\n * @example\n * ```ts\n * const MY_ICONS: FileIconRegistry = {\n * ts: UIIcons.Lucide.Files.FileCode,\n * json: UIIcons.Lucide.Files.FileJson,\n * md: UIIcons.Lucide.Files.FileText,\n * };\n *\n * providers: [{ provide: FILE_ICON_REGISTRY, useValue: MY_ICONS }]\n * ```\n */\nexport type FileIconRegistry = Record<string, string>;\n\n/**\n * DI token for the customisable file-icon registry.\n *\n * When provided, the icon view resolves icons by looking up the\n * file's extension (lower-case, without the leading dot) in the\n * registry. Falls back to the default file/folder icon.\n */\nexport const FILE_ICON_REGISTRY = new InjectionToken<FileIconRegistry>(\n \"FILE_ICON_REGISTRY\",\n);\n\n/**\n * A key-value metadata pair displayed in the details pane.\n */\nexport interface MetadataField {\n /** Human-readable label for the field. */\n readonly label: string;\n /** Displayable value. */\n readonly value: string | number | boolean;\n}\n\n/**\n * Callback that extracts displayable metadata fields from an entry.\n * Provided via the `[metadataProvider]` input on the file browser.\n */\nexport type MetadataProvider<M = unknown> = (\n entry: FileBrowserEntry<M>,\n) => MetadataField[];\n\n/**\n * A single entry in a file browser — either a file or a directory.\n *\n * @typeParam M - Optional metadata type for extra fields\n * (size, modified date, permissions, etc.).\n */\nexport interface FileBrowserEntry<M = unknown> {\n /** Unique identifier for the entry. */\n readonly id: string;\n\n /** Display name of the file or directory. */\n readonly name: string;\n\n /** Whether this entry is a directory (`true`) or a file (`false`). */\n readonly isDirectory: boolean;\n\n /**\n * Optional SVG icon override. When omitted, the file browser\n * uses default folder/file icons.\n */\n readonly icon?: string;\n\n /** Optional arbitrary metadata (size, date, MIME type, etc.). */\n readonly meta?: M;\n}\n\n/**\n * Datasource contract for the file browser.\n *\n * Implementations may back this with an in-memory tree, a REST API,\n * IndexedDB, or any other storage mechanism. All methods may return\n * either a synchronous value or a `Promise`.\n *\n * @typeParam M - Optional metadata type carried on each entry.\n */\nexport interface FileBrowserDatasource<M = unknown> {\n /**\n * Returns the entries (files and directories) inside the given\n * directory node. For the root directory, `parent` is `null`.\n */\n getChildren(\n parent: FileBrowserEntry<M> | null,\n ): FileBrowserEntry<M>[] | Promise<FileBrowserEntry<M>[]>;\n\n /**\n * Returns `true` if the given entry is a directory that can\n * contain children (even if currently empty).\n */\n isDirectory(entry: FileBrowserEntry<M>): boolean;\n}\n\n/**\n * Event emitted when a file (non-directory) entry is activated\n * (double-clicked or pressed Enter).\n *\n * @typeParam M - Optional metadata type.\n */\nexport interface FileActivateEvent<M = unknown> {\n /** The activated file entry. */\n readonly entry: FileBrowserEntry<M>;\n\n /** ISO-8601 timestamp of the activation. */\n readonly activatedAt: string;\n}\n\n/**\n * Event emitted when the current directory changes (user navigates\n * into a folder).\n *\n * @typeParam M - Optional metadata type.\n */\nexport interface DirectoryChangeEvent<M = unknown> {\n /** The directory the user navigated to (`null` for root). */\n readonly directory: FileBrowserEntry<M> | null;\n\n /** The breadcrumb path from root to the current directory. */\n readonly path: readonly FileBrowserEntry<M>[];\n}\n\n/**\n * Adapter that converts {@link FileBrowserEntry} items to\n * {@link TreeNode} items for the tree-view sidebar.\n *\n * @internal\n */\nexport function entryToTreeNode<M>(\n entry: FileBrowserEntry<M>,\n children?: TreeNode<FileBrowserEntry<M>>[],\n): TreeNode<FileBrowserEntry<M>> {\n return {\n id: entry.id,\n data: entry,\n children,\n icon: entry.icon,\n };\n}\n","import {\n AfterViewInit,\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from \"@angular/core\";\n\nimport {\n UIBreadcrumb,\n type BreadcrumbItem,\n UITreeView,\n UIIcon,\n UIIcons,\n type TreeNode,\n type ITreeDatasource,\n} from \"@theredhead/lucid-kit\";\n\nimport { StorageService, UISurface } from \"@theredhead/lucid-foundation\";\n\nimport { NgTemplateOutlet } from \"@angular/common\";\n\nimport type {\n DirectoryChangeEvent,\n FileActivateEvent,\n FileBrowserDatasource,\n FileBrowserEntry,\n FileBrowserViewMode,\n MetadataField,\n MetadataProvider,\n} from \"./file-browser.types\";\nimport { entryToTreeNode, FILE_ICON_REGISTRY } from \"./file-browser.types\";\n\n/**\n * Context provided to a custom entry template.\n *\n * @typeParam M - Metadata type carried on each entry.\n */\nexport interface EntryTemplateContext<M = unknown> {\n /** The entry (also available as the implicit `let-entry`). */\n $implicit: FileBrowserEntry<M>;\n}\n\n/**\n * A two-panel file browser block composing {@link UITreeView},\n * {@link UIBreadcrumb}, and a contents list.\n *\n * The tree sidebar shows the folder hierarchy. Selecting a folder\n * displays its contents (files and sub-folders) in the main panel.\n * A breadcrumb bar shows the current path and allows quick\n * navigation to ancestor folders.\n *\n * ### Basic usage\n * ```html\n * <ui-file-browser [datasource]=\"ds\" (fileActivated)=\"open($event)\" />\n * ```\n *\n * ### With custom entry template\n * ```html\n * <ui-file-browser [datasource]=\"ds\">\n * <ng-template #entryTemplate let-entry>\n * <span>{{ entry.name }} — {{ entry.meta?.size }}</span>\n * </ng-template>\n * </ui-file-browser>\n * ```\n */\n@Component({\n selector: \"ui-file-browser\",\n standalone: true,\n imports: [UITreeView, UIBreadcrumb, UIIcon, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n templateUrl: \"./file-browser.component.html\",\n styleUrl: \"./file-browser.component.scss\",\n host: {\n class: \"ui-file-browser\",\n \"[class.dragging]\": \"draggingPanel()\",\n \"[style.--fb-sidebar-width]\": \"sidebarWidthPx() + 'px'\",\n \"[style.--fb-details-width]\": \"detailsWidthPx() + 'px'\",\n },\n})\nexport class UIFileBrowser<M = unknown> implements AfterViewInit {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** The datasource providing the file/directory structure. */\n public readonly datasource = input.required<FileBrowserDatasource<M>>();\n\n /** Accessible label for the file browser. */\n public readonly ariaLabel = input<string>(\"File browser\");\n\n /** Whether to show the sidebar tree panel. */\n public readonly showSidebar = input<boolean>(true);\n\n /** Label for the root breadcrumb item. */\n public readonly rootLabel = input<string>(\"Root\");\n\n /** Active view mode for the contents panel. */\n public readonly viewMode = input<FileBrowserViewMode>(\"list\");\n\n /** Whether to show the details pane for the selected entry. */\n public readonly showDetails = input<boolean>(false);\n\n /**\n * Optional persistence key. When set, sidebar and details panel widths\n * are saved to and restored from storage.\n */\n public readonly name = input<string | undefined>(undefined);\n\n /**\n * Callback that extracts metadata fields from a selected entry.\n * Required for the details pane to display meaningful data.\n */\n public readonly metadataProvider = input<MetadataProvider<M> | null>(null);\n\n // ── Models ────────────────────────────────────────────────────────\n\n /** The currently selected entry (two-way bindable). */\n public readonly selectedEntry = model<FileBrowserEntry<M> | null>(null);\n\n // ── Outputs ───────────────────────────────────────────────────────\n\n /** Emitted when a file (non-directory) is activated (double-click / Enter). */\n public readonly fileActivated = output<FileActivateEvent<M>>();\n\n /** Emitted when the current directory changes. */\n public readonly directoryChange = output<DirectoryChangeEvent<M>>();\n\n // ── Content projection ────────────────────────────────────────────\n\n /** Optional custom template for rendering each entry in the contents panel. */\n public readonly entryTemplate =\n contentChild<TemplateRef<EntryTemplateContext<M>>>(\"entryTemplate\");\n\n // ── View queries ──────────────────────────────────────────────────\n\n /** @internal */\n private readonly treeViewRef =\n viewChild<UITreeView<FileBrowserEntry<M>>>(\"treeView\");\n\n // ── Internal state ────────────────────────────────────────────────\n\n /** @internal — the breadcrumb path from root to the current directory. */\n protected readonly path = signal<readonly FileBrowserEntry<M>[]>([]);\n\n /** @internal — the current directory (`null` = root). */\n protected readonly currentDirectory = signal<FileBrowserEntry<M> | null>(\n null,\n );\n\n /** @internal — contents of the current directory. */\n protected readonly contents = signal<readonly FileBrowserEntry<M>[]>([]);\n\n /** @internal — tree selection for one-way binding. */\n protected readonly treeSelected = signal<\n readonly TreeNode<FileBrowserEntry<M>>[]\n >([]);\n\n /** @internal — tree datasource adapter. */\n protected readonly treeDatasource = computed<\n ITreeDatasource<FileBrowserEntry<M>>\n >(() => {\n const ds = this.datasource();\n return this.createTreeDatasource(ds);\n });\n\n /** @internal — display function for tree nodes. */\n protected readonly displayNodeLabel = (entry: FileBrowserEntry<M>): string =>\n entry.name;\n\n // ── Icons ─────────────────────────────────────────────────────────\n\n /** @internal */\n protected readonly icons = {\n folder: UIIcons.Lucide.Files.Folder,\n folderOpen: UIIcons.Lucide.Files.FolderOpen,\n file: UIIcons.Lucide.Files.File,\n fileText: UIIcons.Lucide.Files.FileText,\n chevronRight: UIIcons.Lucide.Arrows.ChevronRight,\n } as const;\n\n // ── DI ────────────────────────────────────────────────────────────\n\n /** @internal — optional icon registry supplied via DI. */\n private readonly iconRegistry = inject(FILE_ICON_REGISTRY, {\n optional: true,\n });\n\n /** @internal */\n private readonly elRef = inject(ElementRef);\n\n /** @internal */\n private readonly injector = inject(Injector);\n\n /** @internal */\n private readonly storage = inject(StorageService);\n\n // ── Resize state ──────────────────────────────────────────────────\n\n /** @internal — current sidebar width in pixels. */\n protected readonly sidebarWidthPx = signal(240);\n\n /** @internal — current details panel width in pixels. */\n protected readonly detailsWidthPx = signal(220);\n\n /** @internal — which panel divider is actively being dragged. */\n protected readonly draggingPanel = signal<\"sidebar\" | \"details\" | null>(null);\n\n /** @internal — collapsed state for sidebar. */\n protected readonly sidebarCollapsed = signal(false);\n\n /** @internal — collapsed state for details panel. */\n protected readonly detailsCollapsed = signal(false);\n\n /** @internal — width before sidebar collapse for restore. */\n private preSidebarCollapseWidth: number | null = null;\n\n /** @internal — width before details collapse for restore. */\n private preDetailsCollapseWidth: number | null = null;\n\n // ── Column-view state ─────────────────────────────────────────────\n\n /**\n * @internal — each element represents one column in the column view.\n * Index 0 = root, subsequent = each directory navigated into.\n */\n protected readonly columnPanes = signal<\n readonly {\n directory: FileBrowserEntry<M> | null;\n entries: readonly FileBrowserEntry<M>[];\n }[]\n >([]);\n\n /**\n * @internal — the entry selected in each column pane (by pane index).\n */\n protected readonly columnSelections = signal<\n readonly (FileBrowserEntry<M> | null)[]\n >([]);\n\n // ── Computed ──────────────────────────────────────────────────────\n\n /** @internal — breadcrumb items built from the current path. */\n protected readonly breadcrumbItems = computed<readonly BreadcrumbItem[]>(\n () => {\n const items: BreadcrumbItem[] = [{ label: this.rootLabel() }];\n for (const entry of this.path()) {\n items.push({ label: entry.name });\n }\n return items;\n },\n );\n\n /** @internal — whether an entry is selected in the contents panel. */\n protected readonly hasSelection = computed(\n () => this.selectedEntry() !== null,\n );\n\n /** @internal — metadata fields for the selected entry (details pane). */\n protected readonly detailFields = computed<readonly MetadataField[]>(() => {\n const entry = this.selectedEntry();\n const provider = this.metadataProvider();\n if (!entry || !provider) return [];\n return provider(entry);\n });\n\n // ── Constructor ───────────────────────────────────────────────────\n\n public constructor() {\n // Load root contents on init\n effect(() => {\n const ds = this.datasource();\n this.loadContents(ds, null);\n });\n\n // Initialise column-view root pane when datasource is ready\n effect(() => {\n const ds = this.datasource();\n const mode = this.viewMode();\n if (mode === \"column\") {\n this.initColumnView(ds);\n }\n });\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────\n\n public ngAfterViewInit(): void {\n const saved = this.loadPanelWidths();\n if (saved) {\n this.sidebarWidthPx.set(saved.sidebar);\n this.detailsWidthPx.set(saved.details);\n this.sidebarCollapsed.set(saved.sidebarCollapsed);\n this.detailsCollapsed.set(saved.detailsCollapsed);\n }\n }\n\n // ── Public methods ────────────────────────────────────────────────\n\n /** Navigate to the root directory. */\n public navigateToRoot(): void {\n this.navigateTo(null, []);\n }\n\n /** Navigate to a specific directory entry. */\n public navigateToDirectory(entry: FileBrowserEntry<M>): void {\n if (!entry.isDirectory) return;\n const newPath = [...this.path(), entry];\n this.navigateTo(entry, newPath);\n }\n\n // ── Protected methods ─────────────────────────────────────────────\n\n /** @internal — starts pointer-based divider dragging for a panel. */\n protected onDividerPointerDown(\n event: PointerEvent,\n panel: \"sidebar\" | \"details\",\n ): void {\n event.preventDefault();\n const divider = event.currentTarget as HTMLElement;\n divider.setPointerCapture(event.pointerId);\n\n this.draggingPanel.set(panel);\n\n const body = (this.elRef.nativeElement as HTMLElement).querySelector(\n \".fb-body\",\n ) as HTMLElement;\n if (!body) return;\n const bodyRect = body.getBoundingClientRect();\n\n const onMove = (e: PointerEvent): void => {\n const cursor = e.clientX - bodyRect.left;\n const bodyWidth = bodyRect.width;\n\n if (panel === \"sidebar\") {\n const clampedPx = Math.max(80, Math.min(cursor, bodyWidth * 0.5));\n this.sidebarWidthPx.set(Math.round(clampedPx));\n this.sidebarCollapsed.set(false);\n } else {\n // Details panel: measure from the right edge\n const fromRight = bodyRect.right - e.clientX;\n const clampedPx = Math.max(120, Math.min(fromRight, bodyWidth * 0.5));\n this.detailsWidthPx.set(Math.round(clampedPx));\n this.detailsCollapsed.set(false);\n }\n };\n\n const onUp = (): void => {\n this.draggingPanel.set(null);\n divider.removeEventListener(\"pointermove\", onMove);\n divider.removeEventListener(\"pointerup\", onUp);\n divider.removeEventListener(\"pointercancel\", onUp);\n this.savePanelWidths();\n };\n\n divider.addEventListener(\"pointermove\", onMove);\n divider.addEventListener(\"pointerup\", onUp);\n divider.addEventListener(\"pointercancel\", onUp);\n }\n\n /** @internal — double-click on a divider toggles panel collapse. */\n protected onDividerDblClick(panel: \"sidebar\" | \"details\"): void {\n if (panel === \"sidebar\") {\n if (this.sidebarCollapsed()) {\n this.sidebarCollapsed.set(false);\n if (this.preSidebarCollapseWidth) {\n this.sidebarWidthPx.set(this.preSidebarCollapseWidth);\n this.preSidebarCollapseWidth = null;\n }\n } else {\n this.preSidebarCollapseWidth = this.sidebarWidthPx();\n this.sidebarCollapsed.set(true);\n }\n } else {\n if (this.detailsCollapsed()) {\n this.detailsCollapsed.set(false);\n if (this.preDetailsCollapseWidth) {\n this.detailsWidthPx.set(this.preDetailsCollapseWidth);\n this.preDetailsCollapseWidth = null;\n }\n } else {\n this.preDetailsCollapseWidth = this.detailsWidthPx();\n this.detailsCollapsed.set(true);\n }\n }\n this.savePanelWidths();\n }\n\n /** @internal */\n protected onBreadcrumbClick(item: BreadcrumbItem): void {\n const items = this.breadcrumbItems();\n const idx = items.indexOf(item);\n\n if (idx === 0) {\n // Root\n this.navigateTo(null, []);\n } else {\n // Navigate to that ancestor\n const newPath = this.path().slice(0, idx);\n const target = newPath[newPath.length - 1] ?? null;\n this.navigateTo(target, [...newPath]);\n }\n }\n\n /** @internal */\n protected onTreeNodeSelected(\n selected: readonly TreeNode<FileBrowserEntry<M>>[],\n ): void {\n if (selected.length === 0) return;\n const node = selected[0];\n const entry = node.data;\n if (entry.isDirectory) {\n const newPath = this.buildPathToNode(node);\n this.navigateTo(entry, newPath);\n }\n }\n\n /** @internal */\n protected onTreeNodeActivated(node: TreeNode<FileBrowserEntry<M>>): void {\n const entry = node.data;\n if (entry.isDirectory) {\n const newPath = this.buildPathToNode(node);\n this.navigateTo(entry, newPath);\n }\n }\n\n /** @internal */\n protected onEntryClick(entry: FileBrowserEntry<M>): void {\n this.selectedEntry.set(entry);\n }\n\n /** @internal */\n protected onEntryDblClick(entry: FileBrowserEntry<M>): void {\n if (entry.isDirectory) {\n this.navigateToDirectory(entry);\n } else {\n this.fileActivated.emit({\n entry,\n activatedAt: new Date().toISOString(),\n });\n }\n }\n\n /** @internal */\n protected onEntryKeydown(\n event: KeyboardEvent,\n entry: FileBrowserEntry<M>,\n ): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n this.onEntryDblClick(entry);\n }\n }\n\n /** @internal */\n protected getEntryIcon(entry: FileBrowserEntry<M>): string {\n if (entry.icon) return entry.icon;\n if (entry.isDirectory) return this.icons.folder;\n // Check DI icon registry by file extension\n if (this.iconRegistry) {\n const ext = this.extractExtension(entry.name);\n if (ext && ext in this.iconRegistry) {\n return this.iconRegistry[ext];\n }\n }\n return this.icons.file;\n }\n\n /** @internal */\n protected isEntrySelected(entry: FileBrowserEntry<M>): boolean {\n return this.selectedEntry()?.id === entry.id;\n }\n\n // ── Private methods ───────────────────────────────────────────────\n\n private navigateTo(\n directory: FileBrowserEntry<M> | null,\n path: readonly FileBrowserEntry<M>[],\n ): void {\n this.currentDirectory.set(directory);\n this.path.set(path);\n this.selectedEntry.set(null);\n this.loadContents(this.datasource(), directory);\n this.directoryChange.emit({ directory, path });\n\n // Expand the tree to the selected folder\n this.expandTreeToPath(path);\n }\n\n private async loadContents(\n ds: FileBrowserDatasource<M>,\n parent: FileBrowserEntry<M> | null,\n ): Promise<void> {\n const result = await Promise.resolve(ds.getChildren(parent));\n this.contents.set(result);\n }\n\n private createTreeDatasource(\n ds: FileBrowserDatasource<M>,\n ): ITreeDatasource<FileBrowserEntry<M>> {\n return {\n getRootNodes: () => {\n const children = ds.getChildren(null);\n if (children instanceof Promise) {\n return children.then((items) =>\n items.filter((e) => e.isDirectory).map((e) => entryToTreeNode(e)),\n );\n }\n return children\n .filter((e) => e.isDirectory)\n .map((e) => entryToTreeNode(e));\n },\n getChildren: (node: TreeNode<FileBrowserEntry<M>>) => {\n const children = ds.getChildren(node.data);\n if (children instanceof Promise) {\n return children.then((items) =>\n items.filter((e) => e.isDirectory).map((e) => entryToTreeNode(e)),\n );\n }\n return children\n .filter((e) => e.isDirectory)\n .map((e) => entryToTreeNode(e));\n },\n hasChildren: (node: TreeNode<FileBrowserEntry<M>>) =>\n ds.isDirectory(node.data),\n };\n }\n\n private buildPathToNode(\n node: TreeNode<FileBrowserEntry<M>>,\n ): FileBrowserEntry<M>[] {\n // Walk the tree from roots to find the path to this node\n const ds = this.treeDatasource();\n const roots = ds.getRootNodes();\n if (!Array.isArray(roots)) return [node.data];\n\n const path: FileBrowserEntry<M>[] = [];\n const found = this.findNodePath(roots, node.id, path, ds);\n return found ? path : [node.data];\n }\n\n private findNodePath(\n nodes: TreeNode<FileBrowserEntry<M>>[],\n targetId: string,\n path: FileBrowserEntry<M>[],\n ds: ITreeDatasource<FileBrowserEntry<M>>,\n ): boolean {\n for (const n of nodes) {\n path.push(n.data);\n if (n.id === targetId) return true;\n\n if (ds.hasChildren(n)) {\n const children = ds.getChildren(n);\n if (\n Array.isArray(children) &&\n this.findNodePath(children, targetId, path, ds)\n ) {\n return true;\n }\n }\n path.pop();\n }\n return false;\n }\n\n private expandTreeToPath(path: readonly FileBrowserEntry<M>[]): void {\n const tree = this.treeViewRef();\n if (!tree) return;\n for (const entry of path) {\n const node = entryToTreeNode(entry);\n tree.expand(node);\n }\n }\n\n // ── Column-view helpers ───────────────────────────────────────────\n\n /** @internal — handle click on an entry inside a column pane. */\n protected async onColumnEntryClick(\n paneIndex: number,\n entry: FileBrowserEntry<M>,\n ): Promise<void> {\n // Update selection in this pane\n const sels = [...this.columnSelections()];\n sels[paneIndex] = entry;\n // Clear selections in deeper panes\n this.columnSelections.set(sels.slice(0, paneIndex + 1));\n this.selectedEntry.set(entry);\n\n // If directory, open a new pane to the right (truncate deeper panes first)\n if (entry.isDirectory) {\n const ds = this.datasource();\n const children = await Promise.resolve(ds.getChildren(entry));\n const panes = this.columnPanes().slice(0, paneIndex + 1);\n this.columnPanes.set([...panes, { directory: entry, entries: children }]);\n this.scrollLastColumnPaneIntoView();\n } else {\n // Truncate deeper panes for file selection\n this.columnPanes.set(this.columnPanes().slice(0, paneIndex + 1));\n }\n }\n\n /** @internal — double-click in column view activates a file. */\n protected onColumnEntryDblClick(entry: FileBrowserEntry<M>): void {\n if (!entry.isDirectory) {\n this.fileActivated.emit({\n entry,\n activatedAt: new Date().toISOString(),\n });\n }\n }\n\n /** @internal — check if entry is selected in a column pane. */\n protected isColumnEntrySelected(\n paneIndex: number,\n entry: FileBrowserEntry<M>,\n ): boolean {\n return this.columnSelections()[paneIndex]?.id === entry.id;\n }\n\n private async initColumnView(ds: FileBrowserDatasource<M>): Promise<void> {\n const rootEntries = await Promise.resolve(ds.getChildren(null));\n this.columnPanes.set([{ directory: null, entries: rootEntries }]);\n this.columnSelections.set([]);\n }\n\n private extractExtension(filename: string): string | null {\n const dot = filename.lastIndexOf(\".\");\n if (dot < 1) return null;\n return filename.slice(dot + 1).toLowerCase();\n }\n\n /** @internal — scroll the rightmost column pane into view after DOM update. */\n private scrollLastColumnPaneIntoView(): void {\n afterNextRender(\n () => {\n const container = (\n this.elRef.nativeElement as HTMLElement\n ).querySelector(\".fb-contents--column\");\n if (container) {\n const lastPane = container.querySelector(\n \".fb-column-pane:last-child\",\n );\n lastPane?.scrollIntoView?.({\n behavior: \"smooth\",\n block: \"nearest\",\n inline: \"end\",\n });\n }\n },\n { injector: this.injector },\n );\n }\n\n // ── Panel width persistence ───────────────────────────────────────\n\n private static readonly STORAGE_PREFIX = \"ui-file-browser:\";\n\n private savePanelWidths(): void {\n const key = this.name();\n if (!key) return;\n const data = JSON.stringify({\n sidebar: this.sidebarWidthPx(),\n details: this.detailsWidthPx(),\n sidebarCollapsed: this.sidebarCollapsed(),\n detailsCollapsed: this.detailsCollapsed(),\n });\n this.storage.setItem(UIFileBrowser.STORAGE_PREFIX + key, data);\n }\n\n private loadPanelWidths(): {\n sidebar: number;\n details: number;\n sidebarCollapsed: boolean;\n detailsCollapsed: boolean;\n } | null {\n const key = this.name();\n if (!key) return null;\n try {\n const raw = this.storage.getItem(UIFileBrowser.STORAGE_PREFIX + key);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n typeof parsed.sidebar === \"number\" &&\n typeof parsed.details === \"number\"\n ) {\n return {\n sidebar: parsed.sidebar,\n details: parsed.details,\n sidebarCollapsed: !!parsed.sidebarCollapsed,\n detailsCollapsed: !!parsed.detailsCollapsed,\n };\n }\n } catch {\n // Corrupt data — ignore.\n }\n return null;\n }\n}\n","<div class=\"fb-header\">\n <ui-breadcrumb\n [items]=\"breadcrumbItems()\"\n variant=\"button\"\n ariaLabel=\"File path\"\n (itemClicked)=\"onBreadcrumbClick($event)\"\n />\n</div>\n\n<div class=\"fb-body\">\n <!-- Sidebar: Folder tree -->\n @if (showSidebar()) {\n <div class=\"fb-sidebar\" [class.fb-sidebar--collapsed]=\"sidebarCollapsed()\">\n @if (!sidebarCollapsed()) {\n <ui-tree-view\n #treeView\n [datasource]=\"treeDatasource()\"\n [displayWith]=\"displayNodeLabel\"\n ariaLabel=\"Folder tree\"\n [selected]=\"treeSelected()\"\n (selectedChange)=\"onTreeNodeSelected($event)\"\n (nodeActivated)=\"onTreeNodeActivated($event)\"\n >\n <ng-template #nodeTemplate let-node>\n <ui-icon\n [svg]=\"node.data.icon ?? icons.folder\"\n [size]=\"16\"\n />\n <span class=\"fb-node-label\">{{ node.data.name }}</span>\n </ng-template>\n </ui-tree-view>\n }\n </div>\n\n <!-- Sidebar resize divider -->\n <div\n class=\"fb-divider fb-divider--sidebar ui-surface-type-raised\"\n role=\"separator\"\n tabindex=\"0\"\n aria-label=\"Resize sidebar\"\n aria-orientation=\"horizontal\"\n (pointerdown)=\"onDividerPointerDown($event, 'sidebar')\"\n (dblclick)=\"onDividerDblClick('sidebar')\"\n >\n <div class=\"fb-divider-handle\"></div>\n </div>\n }\n\n <!-- ═══ Contents panel — switches on viewMode ═══ -->\n\n @switch (viewMode()) {\n\n <!-- ── List view (default) ── -->\n @case ('list') {\n <div class=\"fb-contents fb-contents--list\" role=\"list\" [attr.aria-label]=\"ariaLabel()\">\n @if (contents().length === 0) {\n <div class=\"fb-empty\">Empty folder</div>\n } @else {\n @for (entry of contents(); track entry.id) {\n <div\n class=\"fb-entry\"\n role=\"listitem\"\n tabindex=\"0\"\n [class.fb-entry--selected]=\"isEntrySelected(entry)\"\n [class.fb-entry--directory]=\"entry.isDirectory\"\n (click)=\"onEntryClick(entry)\"\n (dblclick)=\"onEntryDblClick(entry)\"\n (keydown)=\"onEntryKeydown($event, entry)\"\n >\n @if (entryTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: entry }\"\n />\n } @else {\n <ui-icon class=\"fb-entry-icon\" [svg]=\"getEntryIcon(entry)\" [size]=\"18\" />\n <span class=\"fb-entry-name\">{{ entry.name }}</span>\n @if (entry.isDirectory) {\n <ui-icon class=\"fb-entry-chevron\" [svg]=\"icons.chevronRight\" [size]=\"14\" />\n }\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- ── Icon view ── -->\n @case ('icons') {\n <div class=\"fb-contents fb-contents--icons\" role=\"list\" [attr.aria-label]=\"ariaLabel()\">\n @if (contents().length === 0) {\n <div class=\"fb-empty\">Empty folder</div>\n } @else {\n @for (entry of contents(); track entry.id) {\n <div\n class=\"fb-icon-tile\"\n role=\"listitem\"\n tabindex=\"0\"\n [class.fb-icon-tile--selected]=\"isEntrySelected(entry)\"\n (click)=\"onEntryClick(entry)\"\n (dblclick)=\"onEntryDblClick(entry)\"\n (keydown)=\"onEntryKeydown($event, entry)\"\n >\n <ui-icon class=\"fb-icon-tile-icon\" [svg]=\"getEntryIcon(entry)\" [size]=\"40\" />\n <span class=\"fb-icon-tile-name\">{{ entry.name }}</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- ── Detail view (table-like) ── -->\n @case ('detail') {\n <div class=\"fb-contents fb-contents--detail\" role=\"table\" [attr.aria-label]=\"ariaLabel()\">\n <div class=\"fb-detail-header\" role=\"row\">\n <span class=\"fb-detail-cell fb-detail-cell--icon\" role=\"columnheader\"></span>\n <span class=\"fb-detail-cell fb-detail-cell--name\" role=\"columnheader\">Name</span>\n <span class=\"fb-detail-cell fb-detail-cell--meta\" role=\"columnheader\">Size</span>\n <span class=\"fb-detail-cell fb-detail-cell--meta\" role=\"columnheader\">Type</span>\n <span class=\"fb-detail-cell fb-detail-cell--meta\" role=\"columnheader\">Modified</span>\n </div>\n @if (contents().length === 0) {\n <div class=\"fb-empty\">Empty folder</div>\n } @else {\n @for (entry of contents(); track entry.id) {\n <div\n class=\"fb-detail-row\"\n role=\"row\"\n tabindex=\"0\"\n [class.fb-detail-row--selected]=\"isEntrySelected(entry)\"\n [class.fb-detail-row--directory]=\"entry.isDirectory\"\n (click)=\"onEntryClick(entry)\"\n (dblclick)=\"onEntryDblClick(entry)\"\n (keydown)=\"onEntryKeydown($event, entry)\"\n >\n <span class=\"fb-detail-cell fb-detail-cell--icon\" role=\"cell\">\n <ui-icon [svg]=\"getEntryIcon(entry)\" [size]=\"16\" />\n </span>\n <span class=\"fb-detail-cell fb-detail-cell--name\" role=\"cell\">{{ entry.name }}</span>\n <span class=\"fb-detail-cell fb-detail-cell--meta\" role=\"cell\">{{ $any(entry.meta)?.size ?? '—' }}</span>\n <span class=\"fb-detail-cell fb-detail-cell--meta\" role=\"cell\">{{ $any(entry.meta)?.type ?? '—' }}</span>\n <span class=\"fb-detail-cell fb-detail-cell--meta\" role=\"cell\">{{ $any(entry.meta)?.modified ?? '—' }}</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- ── Tree view ── -->\n @case ('tree') {\n <div class=\"fb-contents fb-contents--tree\" [attr.aria-label]=\"ariaLabel()\">\n <ui-tree-view\n [datasource]=\"treeDatasource()\"\n [displayWith]=\"displayNodeLabel\"\n ariaLabel=\"File tree\"\n (nodeActivated)=\"onTreeNodeActivated($event)\"\n >\n <ng-template #nodeTemplate let-node>\n <ui-icon [svg]=\"getEntryIcon(node.data)\" [size]=\"16\" />\n <span class=\"fb-node-label\">{{ node.data.name }}</span>\n </ng-template>\n </ui-tree-view>\n </div>\n }\n\n <!-- ── Column view (NeXTSTEP / macOS Finder) ── -->\n @case ('column') {\n <div class=\"fb-contents fb-contents--column\" [attr.aria-label]=\"ariaLabel()\">\n @for (pane of columnPanes(); track $index; let i = $index) {\n <div class=\"fb-column-pane\" role=\"list\">\n @for (entry of pane.entries; track entry.id) {\n <div\n class=\"fb-column-entry\"\n role=\"listitem\"\n tabindex=\"0\"\n [class.fb-column-entry--selected]=\"isColumnEntrySelected(i, entry)\"\n [class.fb-column-entry--directory]=\"entry.isDirectory\"\n (click)=\"onColumnEntryClick(i, entry)\"\n (dblclick)=\"onColumnEntryDblClick(entry)\"\n (keydown)=\"onEntryKeydown($event, entry)\"\n >\n <ui-icon [svg]=\"getEntryIcon(entry)\" [size]=\"16\" />\n <span class=\"fb-column-entry-name\">{{ entry.name }}</span>\n @if (entry.isDirectory) {\n <ui-icon class=\"fb-entry-chevron\" [svg]=\"icons.chevronRight\" [size]=\"12\" />\n }\n </div>\n } @empty {\n <div class=\"fb-empty\">Empty</div>\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- ═══ Details pane ═══ -->\n @if (showDetails() && hasSelection()) {\n <!-- Details resize divider -->\n <div\n class=\"fb-divider fb-divider--details ui-surface-type-raised\"\n role=\"separator\"\n tabindex=\"0\"\n aria-label=\"Resize details\"\n aria-orientation=\"horizontal\"\n (pointerdown)=\"onDividerPointerDown($event, 'details')\"\n (dblclick)=\"onDividerDblClick('details')\"\n >\n <div class=\"fb-divider-handle\"></div>\n </div>\n\n <aside class=\"fb-details\" [class.fb-details--collapsed]=\"detailsCollapsed()\" aria-label=\"File details\">\n @if (!detailsCollapsed()) {\n <div class=\"fb-details-header\">\n <ui-icon [svg]=\"getEntryIcon(selectedEntry()!)\" [size]=\"32\" />\n <span class=\"fb-details-name\">{{ selectedEntry()!.name }}</span>\n <span class=\"fb-details-kind\">\n {{ selectedEntry()!.isDirectory ? 'Folder' : 'File' }}\n </span>\n </div>\n\n @if (detailFields().length > 0) {\n <dl class=\"fb-details-meta\">\n @for (field of detailFields(); track field.label) {\n <dt class=\"fb-details-label\">{{ field.label }}</dt>\n <dd class=\"fb-details-value\">{{ field.value }}</dd>\n }\n </dl>\n }\n }\n </aside>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from \"@angular/core\";\n\nimport { UIAvatar, UIIcon } from \"@theredhead/lucid-kit\";\n\nimport type { ChatMessage } from \"../chat-view.types\";\n\n/**\n * A single chat message bubble with optional avatar, sender name,\n * content, and timestamp.\n *\n * The bubble adjusts its visual alignment and styling based on the\n * `isMine` input — right-aligned with accent colour for the\n * current user, left-aligned with a neutral surface for others.\n *\n * ### Usage\n * ```html\n * <ui-message-bubble [message]=\"msg\" [isMine]=\"false\" />\n * ```\n */\n@Component({\n selector: \"ui-message-bubble\",\n standalone: true,\n imports: [UIAvatar],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: \"./message-bubble.component.html\",\n styleUrl: \"./message-bubble.component.scss\",\n host: {\n class: \"ui-message-bubble\",\n \"[class.mine]\": \"isMine()\",\n },\n})\nexport class UIMessageBubble<M = unknown> {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** The message to render. */\n public readonly message = input.required<ChatMessage<M>>();\n\n /** Whether this message belongs to the current user. */\n public readonly isMine = input<boolean>(false);\n\n // ── Computed ──────────────────────────────────────────────────────\n\n /** @internal — whether content should be rendered as HTML. */\n protected readonly isRichText = computed(\n () => (this.message().type ?? \"text\") === \"rich-text\",\n );\n\n /** @internal — formatted short time string. */\n protected readonly timeString = computed(() => {\n const ts = this.message().timestamp;\n return ts.toLocaleTimeString(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n });\n}\n","@if (!isMine()) {\n <ui-avatar\n [name]=\"message().sender.name\"\n [src]=\"message().sender.avatarSrc\"\n [email]=\"message().sender.avatarEmail\"\n size=\"small\"\n />\n}\n\n<div class=\"bubble-body\">\n @if (!isMine()) {\n <span class=\"bubble-sender\">{{ message().sender.name }}</span>\n }\n\n @if (isRichText()) {\n <div class=\"bubble-content\" [innerHTML]=\"message().content\"></div>\n } @else {\n <div class=\"bubble-content\">{{ message().content }}</div>\n }\n\n <time class=\"bubble-timestamp\">{{ timeString() }}</time>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n ElementRef,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from \"@angular/core\";\nimport { NgTemplateOutlet, DatePipe } from \"@angular/common\";\n\nimport {\n UIAvatar,\n UIButton,\n UIIcon,\n UIIcons,\n UIRichTextEditor,\n} from \"@theredhead/lucid-kit\";\n\nimport type {\n ChatComposerMode,\n ChatMessage,\n ChatParticipant,\n MessageDateGroup,\n MessageSendEvent,\n MessageTemplateContext,\n} from \"./chat-view.types\";\nimport { UIMessageBubble } from \"./message-bubble/message-bubble.component\";\nimport { UISurface } from \"@theredhead/lucid-foundation\";\n\n/**\n * A chat / messaging view composing UIAvatar, UIRichTextEditor,\n * and a scrollable message list with a composer bar.\n *\n * Messages are supplied via the `messages` input. The component\n * groups them by date and renders each with sender avatar, bubble,\n * and timestamp. The current user's messages are right-aligned.\n *\n * The composer bar supports both plain-text (`textarea`) and\n * rich-text (`UIRichTextEditor`) modes via the `composerMode`\n * input.\n *\n * Custom message templates can be projected using a\n * `#messageTemplate` content child.\n *\n * ### Basic usage\n * ```html\n * <ui-chat-view\n * [messages]=\"messages\"\n * [currentUser]=\"me\"\n * (messageSend)=\"onSend($event)\"\n * />\n * ```\n *\n * ### Rich-text composer\n * ```html\n * <ui-chat-view\n * [messages]=\"messages\"\n * [currentUser]=\"me\"\n * composerMode=\"rich-text\"\n * (messageSend)=\"onSend($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"ui-chat-view\",\n standalone: true,\n imports: [\n NgTemplateOutlet,\n DatePipe,\n UIAvatar,\n UIButton,\n UIIcon,\n UIMessageBubble,\n UIRichTextEditor,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n templateUrl: \"./chat-view.component.html\",\n styleUrl: \"./chat-view.component.scss\",\n host: {\n class: \"ui-chat-view\",\n },\n})\nexport class UIChatView<M = unknown> implements AfterViewInit {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** The list of messages to display. */\n public readonly messages = input<readonly ChatMessage<M>[]>([]);\n\n /** The current user (their messages are right-aligned). */\n public readonly currentUser = input.required<ChatParticipant>();\n\n /** Composer input mode. */\n public readonly composerMode = input<ChatComposerMode>(\"text\");\n\n /** Placeholder text for the composer. */\n public readonly placeholder = input<string>(\"Type a message…\");\n\n /** Accessible label for the chat view. */\n public readonly ariaLabel = input<string>(\"Chat\");\n\n // ── Content children ──────────────────────────────────────────────\n\n /**\n * Optional custom template for rendering individual messages.\n * Receives a {@link MessageTemplateContext}.\n */\n public readonly messageTemplate =\n contentChild<TemplateRef<MessageTemplateContext<M>>>(TemplateRef);\n\n // ── Outputs ───────────────────────────────────────────────────────\n\n /** Emitted when the user sends a message. */\n public readonly messageSend = output<MessageSendEvent>();\n\n // ── View queries ──────────────────────────────────────────────────\n\n /** @internal */\n private readonly messageListRef =\n viewChild<ElementRef<HTMLDivElement>>(\"messageList\");\n\n /** @internal */\n private readonly composerInputRef =\n viewChild<ElementRef<HTMLTextAreaElement>>(\"composerInput\");\n\n // ── Internal state ────────────────────────────────────────────────\n\n /** @internal — current text in the composer. */\n protected readonly composerValue = signal(\"\");\n\n // ── Icons ─────────────────────────────────────────────────────────\n\n /** @internal */\n protected readonly sendIcon = UIIcons.Lucide.Communication.SendHorizontal;\n\n // ── Computed ──────────────────────────────────────────────────────\n\n /** @internal — messages grouped by date. */\n protected readonly groupedMessages = computed<readonly MessageDateGroup<M>[]>(\n () => this.groupByDate(this.messages()),\n );\n\n /** @internal — whether the send button should be enabled. */\n protected readonly canSend = computed(\n () => this.composerValue().trim().length > 0,\n );\n\n // ── Constructor ───────────────────────────────────────────────────\n\n public constructor() {\n // Auto-scroll to bottom when messages change\n effect(() => {\n this.messages(); // track\n this.scrollToBottom();\n });\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────\n\n public ngAfterViewInit(): void {\n this.scrollToBottom();\n }\n\n // ── Public methods ────────────────────────────────────────────────\n\n /** Scroll the message list to the bottom. */\n public scrollToBottom(): void {\n requestAnimationFrame(() => {\n const el = this.messageListRef()?.nativeElement;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n });\n }\n\n // ── Protected methods ─────────────────────────────────────────────\n\n /** @internal — determine if a message was sent by the current user. */\n protected isMine(message: ChatMessage<M>): boolean {\n return message.sender.id === this.currentUser().id;\n }\n\n /** @internal — send the composed message. */\n protected send(): void {\n const content = this.composerValue().trim();\n if (!content) return;\n\n this.messageSend.emit({ content });\n this.composerValue.set(\"\");\n\n // Re-focus the plain-text composer\n const textarea = this.composerInputRef()?.nativeElement;\n if (textarea) {\n textarea.focus();\n }\n }\n\n /** @internal — handle Enter key in the text composer. */\n protected onComposerKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.send();\n }\n }\n\n /** @internal — handle input events on the textarea. */\n protected onComposerInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n this.composerValue.set(target.value);\n }\n\n // ── Private methods ───────────────────────────────────────────────\n\n /** Group messages by date, producing human-readable labels. */\n private groupByDate(\n messages: readonly ChatMessage<M>[],\n ): MessageDateGroup<M>[] {\n const groups = new Map<string, ChatMessage<M>[]>();\n\n for (const msg of messages) {\n const key = this.toDateKey(msg.timestamp);\n const list = groups.get(key);\n if (list) {\n list.push(msg);\n } else {\n groups.set(key, [msg]);\n }\n }\n\n const today = this.toDateKey(new Date());\n const yesterday = this.toDateKey(new Date(Date.now() - 86_400_000));\n\n const result: MessageDateGroup<M>[] = [];\n for (const [date, msgs] of groups) {\n let label: string;\n if (date === today) {\n label = \"Today\";\n } else if (date === yesterday) {\n label = \"Yesterday\";\n } else {\n label = new Date(date).toLocaleDateString(undefined, {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n }\n result.push({ date, label, messages: msgs });\n }\n\n return result;\n }\n\n /** Convert a Date to a YYYY-MM-DD key. */\n private toDateKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n }\n}\n","<div class=\"chat-messages\" #messageList role=\"log\" [attr.aria-label]=\"ariaLabel()\">\n @for (group of groupedMessages(); track group.date) {\n <div class=\"chat-date-divider\" role=\"separator\">\n <span class=\"chat-date-label\">{{ group.label }}</span>\n </div>\n\n @for (message of group.messages; track message.id) {\n @if (messageTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"tpl; context: { $implicit: message, message: message, isMine: isMine(message) }\"\n />\n } @else {\n @if ((message.type ?? 'text') === 'system') {\n <div class=\"chat-system-message\">\n {{ message.content }}\n </div>\n } @else {\n <ui-message-bubble\n [message]=\"message\"\n [isMine]=\"isMine(message)\"\n />\n }\n }\n }\n }\n\n @if (groupedMessages().length === 0) {\n <div class=\"chat-empty\">No messages yet</div>\n }\n</div>\n\n<div class=\"chat-composer\">\n @if (composerMode() === 'rich-text') {\n <ui-rich-text-editor\n [(value)]=\"composerValue\"\n [placeholder]=\"placeholder()\"\n ariaLabel=\"Message composer\"\n />\n } @else {\n <textarea\n #composerInput\n class=\"chat-composer-input\"\n [placeholder]=\"placeholder()\"\n [value]=\"composerValue()\"\n (input)=\"onComposerInput($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n rows=\"1\"\n aria-label=\"Message composer\"\n ></textarea>\n }\n\n <button\n type=\"button\"\n class=\"chat-send-button\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"'Send message'\"\n (click)=\"send()\"\n >\n <ui-icon [svg]=\"sendIcon\" [size]=\"18\" />\n </button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n TemplateRef,\n viewChild,\n} from \"@angular/core\";\nimport { UISurface, UI_DEFAULT_SURFACE_TYPE } from \"@theredhead/lucid-foundation\";\n\n/**\n * A single step inside a {@link UIWizard}.\n *\n * Wrap each piece of wizard content in this component and project\n * it into `<ui-wizard>`.\n *\n * ### Usage\n * ```html\n * <ui-wizard>\n * <ui-wizard-step label=\"Account\">…</ui-wizard-step>\n * <ui-wizard-step label=\"Profile\">…</ui-wizard-step>\n * <ui-wizard-step label=\"Confirm\">…</ui-wizard-step>\n * </ui-wizard>\n * ```\n */\n@Component({\n selector: \"ui-wizard-step\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n providers: [{ provide: UI_DEFAULT_SURFACE_TYPE, useValue: \"panel\" }],\n template: \"<ng-template #stepContent><ng-content /></ng-template>\",\n host: {\n class: \"ui-wizard-step\",\n \"[style.display]\": '\"none\"',\n },\n})\nexport class UIWizardStep {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** Label shown in the step indicator. */\n public readonly label = input.required<string>();\n\n /** Whether this step is optional (shown as hint text). */\n public readonly optional = input<boolean>(false);\n\n /**\n * Whether the user can advance past this step. Bind a\n * signal expression to create a validation gate.\n *\n * @default true\n */\n public readonly canAdvance = input<boolean>(true);\n\n // ── View queries ──────────────────────────────────────────────────\n\n /** @internal — template holding the step's projected content. */\n public readonly contentTemplate =\n viewChild.required<TemplateRef<unknown>>(\"stepContent\");\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n input,\n model,\n output,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\n\nimport { UIIcon, UIIcons } from \"@theredhead/lucid-kit\";\n\nimport { UIWizardStep } from \"./wizard-step.component\";\nimport type { StepChangeEvent } from \"./wizard.types\";\nimport { UISurface, UI_DEFAULT_SURFACE_TYPE } from \"@theredhead/lucid-foundation\";\n\n/**\n * A multi-step workflow shell with a step indicator, navigation\n * buttons, and optional validation gates.\n *\n * Steps are defined by projecting `<ui-wizard-step>` children.\n * The wizard discovers them via content queries and renders only\n * the active step.\n *\n * ### Basic usage\n * ```html\n * <ui-wizard (complete)=\"onFinish()\">\n * <ui-wizard-step label=\"Account\">…</ui-wizard-step>\n * <ui-wizard-step label=\"Profile\">…</ui-wizard-step>\n * <ui-wizard-step label=\"Confirm\">…</ui-wizard-step>\n * </ui-wizard>\n * ```\n *\n * ### With validation gates\n * ```html\n * <ui-wizard linear>\n * <ui-wizard-step label=\"Details\" [canAdvance]=\"formValid()\">\n * …\n * </ui-wizard-step>\n * <ui-wizard-step label=\"Review\">…</ui-wizard-step>\n * </ui-wizard>\n * ```\n */\n@Component({\n selector: \"ui-wizard\",\n standalone: true,\n imports: [NgTemplateOutlet, UIIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n providers: [{ provide: UI_DEFAULT_SURFACE_TYPE, useValue: \"panel\" }],\n templateUrl: \"./wizard.component.html\",\n styleUrl: \"./wizard.component.scss\",\n host: {\n class: \"ui-wizard\",\n },\n})\nexport class UIWizard {\n // ── Inputs ────────────────────────────────────────────────────────\n\n /**\n * When `true`, the user must complete steps in order and\n * cannot click ahead on the step indicator.\n */\n public readonly linear = input<boolean>(false);\n\n /** Whether to show the step indicator bar. */\n public readonly showStepIndicator = input<boolean>(true);\n\n /** Label for the Back button. */\n public readonly backLabel = input<string>(\"Back\");\n\n /** Label for the Next button. */\n public readonly nextLabel = input<string>(\"Next\");\n\n /** Label for the Finish button (shown on the last step). */\n public readonly finishLabel = input<string>(\"Finish\");\n\n /** Accessible label for the wizard. */\n public readonly ariaLabel = input<string>(\"Wizard\");\n\n // ── Models ────────────────────────────────────────────────────────\n\n /** Zero-based index of the active step (two-way bindable). */\n public readonly activeIndex = model<number>(0);\n\n // ── Content children ──────────────────────────────────────────────\n\n /** @internal — discovered wizard steps. */\n public readonly steps = contentChildren(UIWizardStep);\n\n // ── Outputs ───────────────────────────────────────────────────────\n\n /** Emitted when the active step changes. */\n public readonly stepChange = output<StepChangeEvent>();\n\n /** Emitted when the user clicks Finish on the last step. */\n public readonly complete = output<void>();\n\n // ── Icons ─────────────────────────────────────────────────────────\n\n /** @internal */\n protected readonly checkIcon = UIIcons.Lucide.Notifications.Check;\n\n // ── Computed ──────────────────────────────────────────────────────\n\n /** @internal — the currently active step. */\n protected readonly activeStep = computed(() => {\n const all = this.steps();\n const idx = this.activeIndex();\n return idx >= 0 && idx < all.length ? all[idx] : undefined;\n });\n\n /** @internal */\n protected readonly isFirstStep = computed(() => this.activeIndex() === 0);\n\n /** @internal */\n protected readonly isLastStep = computed(\n () => this.activeIndex() === this.steps().length - 1,\n );\n\n /** @internal — whether the current step allows advancing. */\n protected readonly canGoNext = computed(() => {\n const step = this.activeStep();\n return step ? step.canAdvance() : false;\n });\n\n // ── Public methods ────────────────────────────────────────────────\n\n /** Advance to the next step (respects validation). */\n public next(): void {\n if (this.isLastStep() || !this.canGoNext()) return;\n this.goToStep(this.activeIndex() + 1);\n }\n\n /** Go back to the previous step. */\n public previous(): void {\n if (this.isFirstStep()) return;\n this.goToStep(this.activeIndex() - 1);\n }\n\n /** Navigate to a specific step by index. */\n public goToStep(index: number): void {\n const all = this.steps();\n if (index < 0 || index >= all.length) return;\n\n // In linear mode, prevent skipping ahead beyond validated steps\n if (this.linear() && index > this.activeIndex()) {\n // Check all steps between current and target are valid\n for (let i = this.activeIndex(); i < index; i++) {\n if (!all[i].canAdvance()) return;\n }\n }\n\n const previous = this.activeIndex();\n if (previous === index) return;\n\n this.activeIndex.set(index);\n this.stepChange.emit({ previousIndex: previous, currentIndex: index });\n }\n\n /** Complete the wizard (only works on the last step). */\n public finish(): void {\n if (!this.isLastStep() || !this.canGoNext()) return;\n this.complete.emit();\n }\n\n // ── Protected methods ─────────────────────────────────────────────\n\n /** @internal — handle step indicator click. */\n protected onStepClick(index: number): void {\n if (this.linear() && index > this.activeIndex()) {\n // In linear mode, only allow clicking completed steps or current\n return;\n }\n this.goToStep(index);\n }\n\n /** @internal — whether a step indicator is clickable. */\n protected isStepClickable(index: number): boolean {\n if (!this.linear()) return true;\n return index <= this.activeIndex();\n }\n}\n","@if (showStepIndicator()) {\n <nav class=\"wizard-indicator\" [attr.aria-label]=\"ariaLabel() + ' steps'\" role=\"tablist\">\n @for (step of steps(); track $index; let i = $index) {\n @if (i > 0) {\n <div\n class=\"wizard-connector\"\n [class.wizard-connector--completed]=\"i <= activeIndex()\"\n ></div>\n }\n\n <button\n type=\"button\"\n class=\"wizard-step-indicator\"\n [class.wizard-step-indicator--active]=\"i === activeIndex()\"\n [class.wizard-step-indicator--completed]=\"i < activeIndex()\"\n [class.wizard-step-indicator--clickable]=\"isStepClickable(i)\"\n [disabled]=\"!isStepClickable(i)\"\n role=\"tab\"\n [attr.aria-selected]=\"i === activeIndex()\"\n [attr.aria-label]=\"step.label()\"\n (click)=\"onStepClick(i)\"\n >\n <span class=\"wizard-step-number\">\n @if (i < activeIndex()) {\n <ui-icon [svg]=\"checkIcon\" [size]=\"14\" />\n } @else {\n {{ i + 1 }}\n }\n </span>\n <span class=\"wizard-step-label\">\n {{ step.label() }}\n @if (step.optional()) {\n <span class=\"wizard-step-optional\">Optional</span>\n }\n </span>\n </button>\n }\n </nav>\n}\n\n<div class=\"wizard-content\" role=\"tabpanel\">\n @if (activeStep(); as step) {\n <ng-container *ngTemplateOutlet=\"step.contentTemplate()\" />\n }\n</div>\n\n<div class=\"wizard-navigation\">\n @if (!isFirstStep()) {\n <button\n type=\"button\"\n class=\"wizard-nav-button wizard-nav-button--back\"\n (click)=\"previous()\"\n >\n {{ backLabel() }}\n </button>\n }\n\n <div class=\"wizard-nav-spacer\"></div>\n\n @if (isLastStep()) {\n <button\n type=\"button\"\n class=\"wizard-nav-button wizard-nav-button--finish\"\n [disabled]=\"!canGoNext()\"\n (click)=\"finish()\"\n >\n {{ finishLabel() }}\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"wizard-nav-button wizard-nav-button--next\"\n [disabled]=\"!canGoNext()\"\n (click)=\"next()\"\n >\n {{ nextLabel() }}\n </button>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n contentChild,\n input,\n model,\n output,\n TemplateRef,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport {\n CdkDropListGroup,\n CdkDropList,\n CdkDrag,\n CdkDragPlaceholder,\n CdkDragDrop,\n moveItemInArray,\n transferArrayItem,\n} from \"@angular/cdk/drag-drop\";\n\nimport type {\n KanbanColumn,\n KanbanCard,\n KanbanCardMoveEvent,\n KanbanCardContext,\n} from \"./kanban-board.types\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Column-based kanban board with drag-and-drop card reordering.\n *\n * Cards can be moved within a column (reorder) or across columns\n * (transfer). Columns and cards are provided via a two-way `columns`\n * model. Project an `<ng-template>` to customise card rendering.\n *\n * ### Basic usage\n * ```html\n * <ui-kanban-board [(columns)]=\"columns\">\n * <ng-template let-card let-column=\"column\">\n * <h4>{{ card.data.title }}</h4>\n * <p>{{ card.data.description }}</p>\n * </ng-template>\n * </ui-kanban-board>\n * ```\n */\n@Component({\n selector: \"ui-kanban-board\",\n standalone: true,\n imports: [\n NgTemplateOutlet,\n CdkDropListGroup,\n CdkDropList,\n CdkDrag,\n CdkDragPlaceholder,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n templateUrl: \"./kanban-board.component.html\",\n styleUrl: \"./kanban-board.component.scss\",\n host: {\n class: \"ui-kanban-board\",\n },\n})\nexport class UIKanbanBoard<T = unknown> {\n // ── Models ────────────────────────────────────────────────────────\n\n /** Column data (two-way bindable). Mutated in-place during drag operations. */\n public readonly columns = model.required<KanbanColumn<T>[]>();\n\n // ── Inputs ────────────────────────────────────────────────────────\n\n /** Accessible label for the board region. */\n public readonly ariaLabel = input<string>(\"Kanban board\");\n\n // ── Content children ──────────────────────────────────────────────\n\n /** Optional projected template for card rendering. */\n public readonly cardTemplate =\n contentChild<TemplateRef<KanbanCardContext<T>>>(TemplateRef);\n\n // ── Outputs ───────────────────────────────────────────────────────\n\n /** Emitted after a card is moved (reorder or transfer). */\n public readonly cardMoved = output<KanbanCardMoveEvent<T>>();\n\n /** Emitted when a card is clicked. */\n public readonly cardClicked = output<KanbanCard<T>>();\n\n // ── Protected methods ─────────────────────────────────────────────\n\n /** @internal — handle CDK drop event. */\n protected onDrop(event: CdkDragDrop<KanbanCard<T>[]>): void {\n const card: KanbanCard<T> = event.item.data;\n const previousColumnId = event.previousContainer.id;\n const currentColumnId = event.container.id;\n const previousIndex = event.previousIndex;\n const currentIndex = event.currentIndex;\n\n if (event.previousContainer === event.container) {\n moveItemInArray(event.container.data, previousIndex, currentIndex);\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n previousIndex,\n currentIndex,\n );\n }\n\n // Trigger signal update with new array reference\n this.columns.set([...this.columns()]);\n\n this.cardMoved.emit({\n card,\n previousColumnId,\n currentColumnId,\n previousIndex,\n currentIndex,\n });\n }\n\n /** @internal — handle card click. */\n protected onCardClick(card: KanbanCard<T>): void {\n this.cardClicked.emit(card);\n }\n}\n","<div class=\"kanban-columns\" cdkDropListGroup role=\"region\" [attr.aria-label]=\"ariaLabel()\">\n @for (column of columns(); track column.id) {\n <div class=\"kanban-column\" [style.border-top-color]=\"column.color ?? null\">\n <div class=\"kanban-column-header\">\n <span class=\"kanban-column-title\">{{ column.title }}</span>\n <span class=\"kanban-column-count\" [attr.aria-label]=\"column.cards.length + ' cards'\">\n {{ column.cards.length }}\n </span>\n </div>\n\n <div\n class=\"kanban-column-body\"\n cdkDropList\n [cdkDropListData]=\"column.cards\"\n [id]=\"column.id\"\n (cdkDropListDropped)=\"onDrop($event)\"\n >\n @for (card of column.cards; track card.id) {\n <div\n class=\"kanban-card-wrapper\"\n cdkDrag\n [cdkDragData]=\"card\"\n tabindex=\"0\"\n role=\"listitem\"\n (click)=\"onCardClick(card)\"\n (keydown.enter)=\"onCardClick(card)\"\n >\n <div cdkDragPlaceholder class=\"kanban-card-placeholder\"></div>\n\n @if (cardTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"tpl; context: { $implicit: card, column: column }\"\n />\n } @else {\n <div class=\"kanban-card-fallback\">{{ card.id }}</div>\n }\n </div>\n } @empty {\n <div class=\"kanban-column-empty\">No cards</div>\n }\n </div>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from \"@angular/core\";\n\nimport {\n UIButton,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n ModalRef,\n} from \"@theredhead/lucid-kit\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Content component for a simple alert dialog.\n *\n * Displayed by {@link CommonDialogService.alert}. Shows a title,\n * message, and a single dismiss button.\n *\n * @internal — not intended for direct use; use the service instead.\n */\n@Component({\n selector: \"ui-alert-dialog\",\n standalone: true,\n imports: [UIButton, UIDialogHeader, UIDialogBody, UIDialogFooter],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-alert-dialog\" },\n template: `\n <ui-dialog-header>{{ title() }}</ui-dialog-header>\n <ui-dialog-body>\n <p class=\"cd-message\">{{ message() }}</p>\n </ui-dialog-body>\n <ui-dialog-footer>\n <ui-button\n variant=\"filled\"\n [ariaLabel]=\"buttonLabel()\"\n (click)=\"dismiss()\"\n >\n {{ buttonLabel() }}\n </ui-button>\n </ui-dialog-footer>\n `,\n styles: [\n `\n :host {\n display: flex;\n flex-direction: column;\n min-width: 20rem;\n }\n .cd-message {\n margin: 0;\n line-height: 1.55;\n white-space: pre-wrap;\n }\n `,\n ],\n})\nexport class UIAlertDialog {\n public readonly title = input(\"Alert\");\n public readonly message = input(\"\");\n public readonly buttonLabel = input(\"OK\");\n\n private readonly modalRef = inject(ModalRef<void>);\n\n public dismiss(): void {\n this.modalRef.close(undefined);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from \"@angular/core\";\n\nimport {\n UIButton,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n ModalRef,\n} from \"@theredhead/lucid-kit\";\n\nimport type { ConfirmVariant } from \"./common-dialog.types\";\nimport { UISurface } from \"@theredhead/lucid-foundation\";\n\n/**\n * Content component for a confirm dialog.\n *\n * Displayed by {@link CommonDialogService.confirm}. Shows a title,\n * message, and confirm / cancel buttons. Resolves to `true` (confirm)\n * or `false` (cancel / dismiss).\n *\n * @internal — not intended for direct use; use the service instead.\n */\n@Component({\n selector: \"ui-confirm-dialog\",\n standalone: true,\n imports: [UIButton, UIDialogHeader, UIDialogBody, UIDialogFooter],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n host: {\n class: \"ui-confirm-dialog\",\n \"[class.danger]\": \"variant() === 'danger'\",\n \"[class.warning]\": \"variant() === 'warning'\",\n },\n template: `\n <ui-dialog-header>{{ title() }}</ui-dialog-header>\n <ui-dialog-body>\n <p class=\"cd-message\">{{ message() }}</p>\n </ui-dialog-body>\n <ui-dialog-footer>\n <ui-button\n variant=\"outlined\"\n [ariaLabel]=\"cancelLabel()\"\n (click)=\"cancel()\"\n >\n {{ cancelLabel() }}\n </ui-button>\n <ui-button\n variant=\"filled\"\n [ariaLabel]=\"confirmLabel()\"\n (click)=\"confirm()\"\n >\n {{ confirmLabel() }}\n </ui-button>\n </ui-dialog-footer>\n `,\n styles: [\n `\n :host {\n display: flex;\n flex-direction: column;\n min-width: 20rem;\n }\n .cd-message {\n margin: 0;\n line-height: 1.55;\n white-space: pre-wrap;\n }\n :host(.danger) {\n --ui-accent: #d93025;\n }\n :host(.warning) {\n --ui-accent: #e5a50a;\n }\n `,\n ],\n})\nexport class UIConfirmDialog {\n public readonly title = input(\"Confirm\");\n public readonly message = input(\"\");\n public readonly confirmLabel = input(\"OK\");\n public readonly cancelLabel = input(\"Cancel\");\n public readonly variant = input<ConfirmVariant>(\"primary\");\n\n private readonly modalRef = inject(ModalRef<boolean>);\n\n public confirm(): void {\n this.modalRef.close(true);\n }\n\n public cancel(): void {\n this.modalRef.close(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n signal, OnInit,\n} from \"@angular/core\";\n\nimport {\n UIButton,\n UIInput,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n ModalRef,\n} from \"@theredhead/lucid-kit\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Content component for a prompt dialog.\n *\n * Displayed by {@link CommonDialogService.prompt}. Shows a title,\n * message, a text input, and OK / Cancel buttons. Resolves to the\n * entered string or `null` if cancelled.\n *\n * @internal — not intended for direct use; use the service instead.\n */\n@Component({\n selector: \"ui-prompt-dialog\",\n standalone: true,\n imports: [UIButton, UIInput, UIDialogHeader, UIDialogBody, UIDialogFooter],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-prompt-dialog\" },\n template: `\n <ui-dialog-header>{{ title() }}</ui-dialog-header>\n <ui-dialog-body>\n <p class=\"cd-message\">{{ message() }}</p>\n <ui-input\n [(value)]=\"inputValue\"\n [placeholder]=\"placeholder()\"\n ariaLabel=\"Prompt input\"\n />\n </ui-dialog-body>\n <ui-dialog-footer>\n <ui-button\n variant=\"outlined\"\n [ariaLabel]=\"cancelLabel()\"\n (click)=\"cancel()\"\n >\n {{ cancelLabel() }}\n </ui-button>\n <ui-button variant=\"filled\" [ariaLabel]=\"okLabel()\" (click)=\"ok()\">\n {{ okLabel() }}\n </ui-button>\n </ui-dialog-footer>\n `,\n styles: [\n `\n :host {\n display: flex;\n flex-direction: column;\n min-width: 24rem;\n }\n .cd-message {\n margin: 0 0 0.75rem;\n line-height: 1.55;\n white-space: pre-wrap;\n }\n `,\n ],\n})\nexport class UIPromptDialog implements OnInit {\n public readonly title = input(\"Prompt\");\n public readonly message = input(\"\");\n public readonly defaultValue = input(\"\");\n public readonly placeholder = input(\"\");\n public readonly okLabel = input(\"OK\");\n public readonly cancelLabel = input(\"Cancel\");\n\n protected readonly inputValue = signal(\"\");\n\n private readonly modalRef = inject(ModalRef<string | null>);\n\n public ngOnInit(): void {\n this.inputValue.set(this.defaultValue());\n }\n\n public ok(): void {\n this.modalRef.close(this.inputValue());\n }\n\n public cancel(): void {\n this.modalRef.close(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n signal,\n} from \"@angular/core\";\n\nimport {\n UIButton,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n ModalRef,\n} from \"@theredhead/lucid-kit\";\n\nimport { UIFileBrowser } from \"../file-browser/file-browser.component\";\nimport type {\n FileBrowserDatasource,\n FileBrowserEntry,\n FileActivateEvent,\n} from \"../file-browser/file-browser.types\";\nimport type { OpenFileResult } from \"./common-dialog.types\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Content component for an open-file dialog.\n *\n * Displayed by {@link CommonDialogService.openFile}. Embeds a\n * {@link UIFileBrowser} and resolves to the selected file(s) or\n * `null` if cancelled.\n *\n * @internal — not intended for direct use; use the service instead.\n */\n@Component({\n selector: \"ui-open-file-dialog\",\n standalone: true,\n imports: [\n UIButton,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n UIFileBrowser,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-open-file-dialog\" },\n template: `\n <ui-dialog-header>{{ title() }}</ui-dialog-header>\n <ui-dialog-body>\n <ui-file-browser\n [datasource]=\"datasource()\"\n [(selectedEntry)]=\"selectedFile\"\n (fileActivated)=\"onFileActivated($event)\"\n ariaLabel=\"Browse files\"\n />\n </ui-dialog-body>\n <ui-dialog-footer>\n <ui-button variant=\"outlined\" ariaLabel=\"Cancel\" (click)=\"cancel()\">\n Cancel\n </ui-button>\n <ui-button\n variant=\"filled\"\n [ariaLabel]=\"openLabel()\"\n [disabled]=\"!selectedFile() || selectedFile()!.isDirectory\"\n (click)=\"open()\"\n >\n {{ openLabel() }}\n </ui-button>\n </ui-dialog-footer>\n `,\n styles: [\n `\n :host {\n display: flex;\n flex-direction: column;\n min-width: 36rem;\n }\n :host ::ng-deep ui-dialog-body {\n height: 24rem;\n overflow: hidden;\n }\n :host ::ng-deep ui-dialog-body ui-file-browser {\n height: 100%;\n }\n `,\n ],\n})\nexport class UIOpenFileDialog<M = unknown> {\n public readonly title = input(\"Open File\");\n public readonly openLabel = input(\"Open\");\n public readonly datasource = input.required<FileBrowserDatasource<M>>();\n\n protected readonly selectedFile = signal<FileBrowserEntry<M> | null>(null);\n\n private readonly modalRef = inject(ModalRef<OpenFileResult<M> | null>);\n\n protected onFileActivated(_event: FileActivateEvent<M>): void {\n const entry = this.selectedFile();\n if (entry && !entry.isDirectory) {\n this.modalRef.close({ files: [entry] });\n }\n }\n\n public open(): void {\n const entry = this.selectedFile();\n if (entry && !entry.isDirectory) {\n this.modalRef.close({ files: [entry] });\n }\n }\n\n public cancel(): void {\n this.modalRef.close(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n signal,\n OnInit,\n} from \"@angular/core\";\n\nimport {\n UIButton,\n UIInput,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n ModalRef,\n} from \"@theredhead/lucid-kit\";\n\nimport { UIFileBrowser } from \"../file-browser/file-browser.component\";\nimport type {\n FileBrowserDatasource,\n FileBrowserEntry,\n DirectoryChangeEvent,\n} from \"../file-browser/file-browser.types\";\nimport type { SaveFileResult } from \"./common-dialog.types\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Content component for a save-file dialog.\n *\n * Displayed by {@link CommonDialogService.saveFile}. Embeds a\n * {@link UIFileBrowser} for directory navigation plus a file-name\n * input. Resolves to a directory + file name, or `null` if cancelled.\n *\n * @internal — not intended for direct use; use the service instead.\n */\n@Component({\n selector: \"ui-save-file-dialog\",\n standalone: true,\n imports: [\n UIButton,\n UIInput,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n UIFileBrowser,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-save-file-dialog\" },\n template: `\n <ui-dialog-header>{{ title() }}</ui-dialog-header>\n <ui-dialog-body>\n <ui-file-browser\n [datasource]=\"datasource()\"\n (directoryChange)=\"onDirectoryChange($event)\"\n ariaLabel=\"Browse directories\"\n />\n <div class=\"cd-filename-row\">\n <span class=\"cd-filename-label\">File name:</span>\n <ui-input\n [(value)]=\"fileName\"\n placeholder=\"Enter file name\"\n ariaLabel=\"File name\"\n />\n </div>\n </ui-dialog-body>\n <ui-dialog-footer>\n <ui-button variant=\"outlined\" ariaLabel=\"Cancel\" (click)=\"cancel()\">\n Cancel\n </ui-button>\n <ui-button\n variant=\"filled\"\n [ariaLabel]=\"saveLabel()\"\n [disabled]=\"!fileName().trim()\"\n (click)=\"save()\"\n >\n {{ saveLabel() }}\n </ui-button>\n </ui-dialog-footer>\n `,\n styles: [\n `\n :host {\n display: flex;\n flex-direction: column;\n min-width: 36rem;\n }\n :host ::ng-deep ui-dialog-body {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n height: 26rem;\n overflow: hidden;\n }\n :host ::ng-deep ui-dialog-body ui-file-browser {\n flex: 1;\n min-height: 0;\n }\n .cd-filename-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n .cd-filename-label {\n font-weight: 600;\n font-size: 0.88rem;\n white-space: nowrap;\n }\n .cd-filename-row ui-input {\n flex: 1;\n }\n `,\n ],\n})\nexport class UISaveFileDialog<M = unknown> implements OnInit {\n public readonly title = input(\"Save File\");\n public readonly saveLabel = input(\"Save\");\n public readonly defaultName = input(\"\");\n public readonly datasource = input.required<FileBrowserDatasource<M>>();\n\n protected readonly fileName = signal(\"\");\n protected readonly currentDir = signal<FileBrowserEntry<M> | null>(null);\n\n private readonly modalRef = inject(ModalRef<SaveFileResult<M> | null>);\n\n public ngOnInit(): void {\n this.fileName.set(this.defaultName());\n }\n\n protected onDirectoryChange(event: DirectoryChangeEvent<M>): void {\n this.currentDir.set(event.directory);\n }\n\n public save(): void {\n const name = this.fileName().trim();\n if (name) {\n this.modalRef.close({ directory: this.currentDir(), name });\n }\n }\n\n public cancel(): void {\n this.modalRef.close(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from \"@angular/core\";\n\nimport {\n UIButton,\n UIDialogHeader,\n UIDialogBody,\n UIDialogFooter,\n ModalRef,\n} from \"@theredhead/lucid-kit\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Content component for an \"About\" dialog.\n *\n * Displayed by {@link CommonDialogService.about}. Shows the\n * application name, version, description, optional logo, copyright\n * notice, and credits.\n *\n * @internal — not intended for direct use; use the service instead.\n */\n@Component({\n selector: \"ui-about-dialog\",\n standalone: true,\n imports: [UIButton, UIDialogHeader, UIDialogBody, UIDialogFooter],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-about-dialog\" },\n template: `\n <ui-dialog-header>About {{ appName() }}</ui-dialog-header>\n <ui-dialog-body>\n <div class=\"cd-about-content\">\n @if (logoUrl()) {\n <img\n class=\"cd-about-logo\"\n [src]=\"logoUrl()\"\n [alt]=\"appName() + ' logo'\"\n />\n }\n <h2 class=\"cd-about-name\">{{ appName() }}</h2>\n @if (version()) {\n <span class=\"cd-about-version\">Version {{ version() }}</span>\n }\n @if (description()) {\n <p class=\"cd-about-desc\">{{ description() }}</p>\n }\n @if (credits().length > 0) {\n <div class=\"cd-about-credits\">\n <h4 class=\"cd-about-credits-title\">Credits</h4>\n <ul class=\"cd-about-credits-list\">\n @for (credit of credits(); track credit) {\n <li>{{ credit }}</li>\n }\n </ul>\n </div>\n }\n @if (copyright()) {\n <p class=\"cd-about-copyright\">{{ copyright() }}</p>\n }\n </div>\n </ui-dialog-body>\n <ui-dialog-footer>\n <ui-button variant=\"filled\" ariaLabel=\"Close\" (click)=\"dismiss()\">\n Close\n </ui-button>\n </ui-dialog-footer>\n `,\n styles: [\n `\n :host {\n display: flex;\n flex-direction: column;\n min-width: 22rem;\n max-width: 28rem;\n }\n .cd-about-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 0.25rem;\n }\n .cd-about-logo {\n width: 64px;\n height: 64px;\n object-fit: contain;\n margin-bottom: 0.5rem;\n }\n .cd-about-name {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 700;\n }\n .cd-about-version {\n font-size: 0.82rem;\n color: var(--ui-text-muted, #5a6470);\n }\n .cd-about-desc {\n margin: 0.5rem 0 0;\n line-height: 1.55;\n font-size: 0.92rem;\n }\n .cd-about-credits {\n margin-top: 0.75rem;\n width: 100%;\n text-align: left;\n }\n .cd-about-credits-title {\n margin: 0 0 0.35rem;\n font-size: 0.85rem;\n font-weight: 600;\n }\n .cd-about-credits-list {\n margin: 0;\n padding-left: 1.25rem;\n font-size: 0.85rem;\n line-height: 1.6;\n color: var(--ui-text-muted, #5a6470);\n }\n .cd-about-copyright {\n margin: 0.75rem 0 0;\n font-size: 0.78rem;\n color: var(--ui-text-muted, #5a6470);\n }\n `,\n ],\n})\nexport class UIAboutDialog {\n public readonly appName = input(\"Application\");\n public readonly version = input(\"\");\n public readonly description = input(\"\");\n public readonly logoUrl = input(\"\");\n public readonly copyright = input(\"\");\n public readonly credits = input<readonly string[]>([]);\n\n private readonly modalRef = inject(ModalRef<void>);\n\n public dismiss(): void {\n this.modalRef.close(undefined);\n }\n}\n","import { inject, Injectable } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { ModalService } from \"@theredhead/lucid-kit\";\n\nimport { UIAlertDialog } from \"./alert-dialog.component\";\nimport { UIConfirmDialog } from \"./confirm-dialog.component\";\nimport { UIPromptDialog } from \"./prompt-dialog.component\";\nimport { UIOpenFileDialog } from \"./open-file-dialog.component\";\nimport { UISaveFileDialog } from \"./save-file-dialog.component\";\nimport { UIAboutDialog } from \"./about-dialog.component\";\n\nimport type {\n AlertOptions,\n ConfirmOptions,\n PromptOptions,\n OpenFileOptions,\n OpenFileResult,\n SaveFileOptions,\n SaveFileResult,\n AboutOptions,\n} from \"./common-dialog.types\";\n\n/**\n * Service for showing common application dialogs — alert, confirm,\n * prompt, open-file, save-file, and about.\n *\n * Each method opens a modal dialog and returns a `Promise` that\n * resolves when the user closes it. The service delegates to\n * {@link ModalService} for the underlying dialog lifecycle.\n *\n * @example\n * ```ts\n * const confirmed = await this.dialogs.confirm({\n * title: 'Delete item?',\n * message: 'This action cannot be undone.',\n * variant: 'danger',\n * });\n *\n * if (confirmed) { ... }\n * ```\n */\n@Injectable({ providedIn: \"root\" })\nexport class CommonDialogService {\n private readonly modal = inject(ModalService);\n\n /**\n * Show a simple informational alert with a dismiss button.\n *\n * @returns Resolves when the user dismisses the dialog.\n */\n public async alert(options: AlertOptions): Promise<void> {\n const ref = this.modal.openModal<UIAlertDialog, void>({\n component: UIAlertDialog,\n inputs: {\n title: options.title,\n message: options.message,\n buttonLabel: options.buttonLabel ?? \"OK\",\n },\n ariaLabel: options.ariaLabel ?? options.title,\n });\n await firstValueFrom(ref.closed);\n }\n\n /**\n * Show a confirmation dialog with confirm and cancel buttons.\n *\n * @returns `true` if the user confirmed, `false` otherwise.\n */\n public async confirm(options: ConfirmOptions): Promise<boolean> {\n const ref = this.modal.openModal<UIConfirmDialog, boolean>({\n component: UIConfirmDialog,\n inputs: {\n title: options.title,\n message: options.message,\n confirmLabel: options.confirmLabel ?? \"OK\",\n cancelLabel: options.cancelLabel ?? \"Cancel\",\n variant: options.variant ?? \"primary\",\n },\n ariaLabel: options.ariaLabel ?? options.title,\n });\n const result = await firstValueFrom(ref.closed);\n return result ?? false;\n }\n\n /**\n * Show a prompt dialog with a text input.\n *\n * @returns The entered string, or `null` if cancelled.\n */\n public async prompt(options: PromptOptions): Promise<string | null> {\n const ref = this.modal.openModal<UIPromptDialog, string | null>({\n component: UIPromptDialog,\n inputs: {\n title: options.title,\n message: options.message,\n defaultValue: options.defaultValue ?? \"\",\n placeholder: options.placeholder ?? \"\",\n okLabel: options.okLabel ?? \"OK\",\n cancelLabel: options.cancelLabel ?? \"Cancel\",\n },\n ariaLabel: options.ariaLabel ?? options.title,\n });\n const result = await firstValueFrom(ref.closed);\n return result ?? null;\n }\n\n /**\n * Show an open-file dialog powered by {@link UIFileBrowser}.\n *\n * @returns The selected file(s), or `null` if cancelled.\n */\n public async openFile<M = unknown>(\n options: OpenFileOptions<M>,\n ): Promise<OpenFileResult<M> | null> {\n const ref = this.modal.openModal<\n UIOpenFileDialog<M>,\n OpenFileResult<M> | null\n >({\n component: UIOpenFileDialog,\n inputs: {\n title: options.title ?? \"Open File\",\n openLabel: options.openLabel ?? \"Open\",\n datasource: options.datasource,\n },\n ariaLabel: options.ariaLabel ?? options.title ?? \"Open File\",\n });\n const result = await firstValueFrom(ref.closed);\n return result ?? null;\n }\n\n /**\n * Show a save-file dialog powered by {@link UIFileBrowser} with a\n * file-name input.\n *\n * @returns The directory and file name, or `null` if cancelled.\n */\n public async saveFile<M = unknown>(\n options: SaveFileOptions<M>,\n ): Promise<SaveFileResult<M> | null> {\n const ref = this.modal.openModal<\n UISaveFileDialog<M>,\n SaveFileResult<M> | null\n >({\n component: UISaveFileDialog,\n inputs: {\n title: options.title ?? \"Save File\",\n saveLabel: options.saveLabel ?? \"Save\",\n defaultName: options.defaultName ?? \"\",\n datasource: options.datasource,\n },\n ariaLabel: options.ariaLabel ?? options.title ?? \"Save File\",\n });\n const result = await firstValueFrom(ref.closed);\n return result ?? null;\n }\n\n /**\n * Show an \"About\" dialog with application information.\n *\n * @returns Resolves when the user closes the dialog.\n */\n public async about(options: AboutOptions): Promise<void> {\n const ref = this.modal.openModal<UIAboutDialog, void>({\n component: UIAboutDialog,\n inputs: {\n appName: options.appName,\n version: options.version ?? \"\",\n description: options.description ?? \"\",\n logoUrl: options.logoUrl ?? \"\",\n copyright: options.copyright ?? \"\",\n credits: options.credits ?? [],\n },\n ariaLabel: options.ariaLabel ?? `About ${options.appName}`,\n });\n await firstValueFrom(ref.closed);\n }\n}\n","/*\r\n * Public API Surface of @theredhead/lucid-blocks\r\n */\r\n\r\nexport {\r\n UIMasterDetailView,\r\n type MasterDetailContext,\r\n} from \"./lib/master-detail-view/master-detail-view.component\";\r\n\r\nexport * from \"./lib/dashboard\";\r\n\r\nexport * from \"./lib/navigation-page\";\r\n\r\nexport * from \"./lib/search-view\";\r\n\r\nexport * from \"./lib/property-sheet\";\r\n\r\nexport * from \"./lib/command-palette\";\r\n\r\nexport * from \"./lib/file-browser\";\r\n\r\nexport * from \"./lib/chat-view\";\r\n\r\nexport * from \"./lib/wizard\";\r\n\r\nexport * from \"./lib/kanban-board\";\r\n\r\nexport * from \"./lib/common-dialogs\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["FilterableArrayDatasource"],"mappings":"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"}