{"version":3,"file":"ng-hub-ui-board.mjs","sources":["../../../projects/board/src/lib/directives/board-column-footer.directive.ts","../../../projects/board/src/lib/directives/board-column-header.directive.ts","../../../projects/board/src/lib/directives/card-drag-preview.directive.ts","../../../projects/board/src/lib/directives/card-placeholder.directive.ts","../../../projects/board/src/lib/directives/card-template.directive.ts","../../../projects/board/src/lib/directives/column-drag-preview.directive.ts","../../../projects/board/src/lib/directives/column-placeholder.directive.ts","../../../projects/board/src/lib/models/array-helpers.ts","../../../projects/board/src/lib/components/board/board.component.ts","../../../projects/board/src/lib/components/board/board.component.html","../../../projects/board/src/lib/board.module.ts","../../../projects/board/src/lib/pipes/invert-color.pipe.ts","../../../projects/board/src/lib/models/drag-drop-event.ts","../../../projects/board/src/public-api.ts","../../../projects/board/src/ng-hub-ui-board.ts"],"sourcesContent":["import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of column footer templates within board columns.\n * \n * This directive enables developers to define custom templates for column footers,\n * perfect for displaying summary information, quick actions, statistics,\n * or any column-specific controls at the bottom of each column.\n * \n * @publicApi\n * \n * @example\n * ```html\n * <ng-template columnFooterTpt let-column=\"column\">\n *   <div class=\"custom-footer\">\n *     <div class=\"column-summary\">\n *       <span>Total: {{ column.cards.length }}</span>\n *       <span>Priority Items: {{ getPriorityItems(column) }}</span>\n *     </div>\n *     <button (click)=\"quickAddCard(column)\">Quick Add</button>\n *   </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[columnFooterTpt]',\n\tstandalone: true\n})\nexport class BoardColumnFooterDirective {\n\t/**\n\t * Creates a new BoardColumnFooterDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom column footer layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of column header templates within board columns.\n * \n * This directive provides the ability to define custom templates for rendering column headers,\n * giving developers full control over the appearance and functionality of column headers\n * including titles, descriptions, actions, and metadata display.\n * \n * @publicApi\n * \n * @example\n * ```html\n * <ng-template columnHeaderTpt let-column=\"column\">\n *   <div class=\"custom-header\">\n *     <h2>{{ column.title }}</h2>\n *     <span class=\"card-count\">{{ column.cards.length }} items</span>\n *     <button (click)=\"addCard(column)\">Add Card</button>\n *   </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[columnHeaderTpt]',\n\tstandalone: true\n})\nexport class BoardColumnHeaderDirective {\n\t/**\n\t * Creates a new BoardColumnHeaderDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom column header layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of the drag preview (drag image) for cards.\n *\n * This directive defines a custom template for the visual element that follows\n * the cursor when dragging a card. The template receives the dragged card and\n * the source column as context variables.\n *\n * @publicApi\n *\n * @example\n * ```html\n * <hub-board [board]=\"board\">\n *   <ng-template cardDragPreview let-card=\"card\" let-column=\"column\">\n *     <div class=\"custom-drag-preview\">\n *       <i class=\"bi bi-grip-vertical\"></i>\n *       <span>{{ card.title }}</span>\n *     </div>\n *   </ng-template>\n * </hub-board>\n * ```\n */\n@Directive({\n\tselector: '[cardDragPreview]',\n\tstandalone: true\n})\nexport class CardDragPreviewDirective {\n\t/**\n\t * Creates a new CardDragPreviewDirective instance.\n\t *\n\t * @param templateRef - The template reference that contains the custom drag preview layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Structural directive used to define a custom placeholder template for cards during drag operations.\n *\n * When a card is being dragged, the placeholder shows where the card will be dropped.\n * By default, an empty space with a dashed border is shown. Use this directive to customize\n * the placeholder appearance.\n *\n * @usageNotes\n *\n * ### Basic usage\n *\n * ```html\n * <hub-board [board]=\"board\">\n *   <ng-template cardPlaceholder let-card=\"card\" let-column=\"column\">\n *     <div class=\"my-custom-placeholder\">\n *       <span>Drop \"{{ card?.title }}\" here</span>\n *     </div>\n *   </ng-template>\n * </hub-board>\n * ```\n *\n * ### Context variables\n *\n * The template context provides:\n * - `card`: The card being dragged (may be undefined)\n * - `column`: The target column where the card will be dropped\n *\n * @publicApi\n */\n@Directive({\n\tselector: '[cardPlaceholder]',\n\tstandalone: true\n})\nexport class CardPlaceholderDirective {}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of card templates within board columns.\n * \n * This directive is used to define custom templates for rendering board cards.\n * It provides access to the template reference that can be used by the board component\n * to render cards with custom layouts and styling.\n * \n * @publicApi\n * \n * @example\n * ```html\n * <ng-template cardTpt let-card=\"item\" let-column=\"column\">\n *   <div class=\"custom-card\">\n *     <h3>{{ card.title }}</h3>\n *     <p>{{ card.description }}</p>\n *   </div>\n * </ng-template>\n * ```\n */\n@Directive({\n\tselector: '[cardTpt]',\n\tstandalone: true\n})\nexport class CardTemplateDirective {\n\t/**\n\t * Creates a new CardTemplateDirective instance.\n\t * \n\t * @param templateRef - The template reference that contains the custom card layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n/**\n * Directive that allows customization of the drag preview (drag image) for columns.\n *\n * This directive defines a custom template for the visual element that follows\n * the cursor when dragging a column. The template receives the dragged column\n * as a context variable.\n *\n * @publicApi\n *\n * @example\n * ```html\n * <hub-board [board]=\"board\">\n *   <ng-template columnDragPreview let-column=\"column\">\n *     <div class=\"custom-column-drag-preview\">\n *       <i class=\"bi bi-kanban\"></i>\n *       <span>{{ column.title }}</span>\n *       <span class=\"badge\">{{ column.cards.length }} cards</span>\n *     </div>\n *   </ng-template>\n * </hub-board>\n * ```\n */\n@Directive({\n\tselector: '[columnDragPreview]',\n\tstandalone: true\n})\nexport class ColumnDragPreviewDirective {\n\t/**\n\t * Creates a new ColumnDragPreviewDirective instance.\n\t *\n\t * @param templateRef - The template reference that contains the custom drag preview layout\n\t */\n\tconstructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Structural directive used to define a custom placeholder template for columns during drag operations.\n *\n * When a column is being dragged, the placeholder shows where the column will be dropped.\n * By default, an empty space with a dashed border is shown. Use this directive to customize\n * the placeholder appearance.\n *\n * @usageNotes\n *\n * ### Basic usage\n *\n * ```html\n * <hub-board [board]=\"board\">\n *   <ng-template columnPlaceholder let-column=\"column\">\n *     <div class=\"my-custom-placeholder\">\n *       <span>Drop \"{{ column?.title }}\" here</span>\n *     </div>\n *   </ng-template>\n * </hub-board>\n * ```\n *\n * ### Context variables\n *\n * The template context provides:\n * - `column`: The column being dragged (may be undefined)\n *\n * @publicApi\n */\n@Directive({\n\tselector: '[columnPlaceholder]',\n\tstandalone: true\n})\nexport class ColumnPlaceholderDirective {}\n","/**\n * Array move/transfer helpers used when reordering cards and columns.\n *\n * These come from the shared `ng-hub-ui-utils` drag-and-drop core — a dependency-free,\n * behaviour-identical implementation shared by every ng-hub-ui library — and are re-exported\n * here so the board's public API is unchanged.\n *\n * @publicApi\n */\nexport { moveItemInArray, transferArrayItem } from 'ng-hub-ui-utils';\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n\tComponent,\n\tElementRef,\n\tSignal,\n\tTemplateRef,\n\tcomputed,\n\tcontentChild,\n\tinject,\n\tinput,\n\toutput,\n\tsignal,\n\tviewChild\n} from '@angular/core';\nimport { BoardColumnFooterDirective } from '../../directives/board-column-footer.directive';\nimport { BoardColumnHeaderDirective } from '../../directives/board-column-header.directive';\nimport { CardDragPreviewDirective } from '../../directives/card-drag-preview.directive';\nimport { CardPlaceholderDirective } from '../../directives/card-placeholder.directive';\nimport { CardTemplateDirective } from '../../directives/card-template.directive';\nimport { ColumnDragPreviewDirective } from '../../directives/column-drag-preview.directive';\nimport { ColumnPlaceholderDirective } from '../../directives/column-placeholder.directive';\nimport { Board } from '../../models/board';\nimport { BoardCard } from '../../models/board-card';\nimport { BoardColumn } from '../../models/board-column';\nimport { createNativeDragImage, resolveHubAccent } from 'ng-hub-ui-utils';\nimport { moveItemInArray, transferArrayItem } from '../../models/array-helpers';\nimport { BoardDragItem, CardDragDropEvent, ColumnDragDropEvent } from '../../models/drag-drop-event';\nimport { ReachedEndEvent } from '../../models/reached-end-event';\n\n/**\n * Internal interface for tracking drag state.\n */\ninterface DragState {\n\ttype: 'column' | 'card';\n\tsourceColumnIndex: number;\n\tsourceCardIndex?: number;\n\titem: BoardColumn | BoardCard;\n\telement?: HTMLElement;\n}\n\n/**\n * Internal interface tracking an in-progress keyboard move of a card.\n * Captured when the card is grabbed and updated on every arrow-key move so the\n * original position can be restored when the move is cancelled.\n */\ninterface KeyboardMoveState {\n\t/** The card currently grabbed for a keyboard move. */\n\tcard: BoardCard;\n\t/** Column index the card occupied when it was grabbed. */\n\tsourceColumnIndex: number;\n\t/** Card index the card occupied when it was grabbed. */\n\tsourceCardIndex: number;\n\t/** Column index the card currently occupies. */\n\tcurrentColumnIndex: number;\n\t/** Card index the card currently occupies. */\n\tcurrentCardIndex: number;\n}\n\n/**\n * Monotonic counter used to derive unique, SSR-safe ids per board instance.\n */\nlet nextHubBoardInstanceId = 0;\n\n/**\n * Defines how the dragged element behaves visually during drag operations.\n * - 'ghost': Element becomes semi-transparent but remains visible and occupies space\n * - 'hide': Element is hidden but still occupies space (invisible placeholder)\n * - 'collapse': Element is completely hidden and its space is collapsed\n * @publicApi\n */\nexport type DragBehavior = 'ghost' | 'hide' | 'collapse';\n\n/**\n * Standalone Kanban-style board component that provides column-based drag-and-drop,\n * custom templates and infinite-scroll detection.\n *\n * @publicApi\n */\n@Component({\n\tselector: 'hub-board, hub-ui-board',\n\ttemplateUrl: './board.component.html',\n\tstyleUrl: './board.component.scss',\n\timports: [NgClass, NgTemplateOutlet],\n\thost: {\n\t\tclass: 'hub-board',\n\t\trole: 'list',\n\t\t'[attr.aria-label]': 'boardLabel()',\n\t\t'[attr.data-variant]': 'variant() ?? null',\n\t\t'[style.--hub-board-accent]': 'groupAccent()'\n\t}\n})\nexport class HubBoardComponent {\n\t/**\n\t * Reference to the host element, used to relocate keyboard focus after\n\t * Angular re-renders a moved card.\n\t */\n\tprivate readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\t/**\n\t * Reactive input containing the full board definition (columns and cards).\n\t */\n\treadonly board = input<Board>();\n\n\t/**\n\t * Accessible label exposed on the board container through `aria-label`.\n\t * Defaults to `'Board'`.\n\t */\n\treadonly boardLabel = input<string>('Board');\n\n\t/**\n\t * Unique, SSR-safe id prefix for this board instance. Used to build stable\n\t * element ids (column groups, keyboard hint) that never collide when several\n\t * boards coexist on the same page.\n\t */\n\treadonly boardInstanceId = `hub-board-${nextHubBoardInstanceId++}`;\n\n\t/**\n\t * Id of the visually hidden keyboard usage hint referenced by every\n\t * focusable card through `aria-describedby`.\n\t */\n\treadonly keyboardHintId = `${this.boardInstanceId}-keyboard-hint`;\n\n\t/**\n\t * Semantic accent applied to the drag/drop placeholder. The built-in values\n\t * (`primary` / `success` / `danger` / `warning` / `info`) render with the\n\t * design-system tints; any other string is also accepted — the board reads\n\t * `--hub-sys-color-<variant>` from the host application, so a custom accent\n\t * palette interconnects with no changes to this library. Defaults to `primary`.\n\t */\n\treadonly variant = input<'primary' | 'success' | 'danger' | 'warning' | 'info' | (string & {}) | undefined>(undefined);\n\n\t/**\n\t * Inline accent fed to the board styles through the single `--hub-board-accent`\n\t * slot. A bareword — a built-in variant, a registered accent or a CSS named\n\t * colour — resolves to `var(--hub-sys-color-<variant>, <variant>)`, so the\n\t * design-system token drives the colour when present and the raw word is the\n\t * fallback. A literal `#hex` / `rgb()` / `oklch()` / `var()` is passed through\n\t * unchanged. Returns `null` when no variant is set, keeping the `primary` default.\n\t */\n\treadonly groupAccent = computed(() => resolveHubAccent(this.variant()));\n\n\t/**\n\t * Pixel threshold used when determining whether a column has reached scroll end.\n\t * Allows for fractional scroll values across different browsers.\n\t */\n\tprivate readonly scrollDetectionPadding = 1;\n\n\t/**\n\t * Internal signal to track column updates and force re-renders.\n\t */\n\tprivate readonly _columnsVersion = signal(0);\n\n\t/**\n\t * Derived list of board columns exposed as a signal to the template.\n\t * Depends on both the board input and internal version counter to ensure\n\t * re-renders after in-place array mutations.\n\t */\n\tcolumns: Signal<Array<BoardColumn>> = computed(() => {\n\t\t// Subscribe to version changes to force re-computation after mutations\n\t\tthis._columnsVersion();\n\t\treturn this.board()?.columns ?? [];\n\t});\n\n\t/**\n\t * When true, column reordering via drag-and-drop is disabled.\n\t */\n\treadonly columnSortingDisabled = input<boolean>(false);\n\n\t/**\n\t * Controls how dragged elements behave visually during drag operations.\n\t * - 'ghost': Element becomes semi-transparent (50% opacity) but remains visible\n\t * - 'hide': Element is hidden but still occupies its space\n\t * - 'collapse': Element is completely hidden and its space is collapsed (default)\n\t */\n\treadonly dragBehavior = input<DragBehavior>('collapse');\n\n\t/**\n\t * Custom card template supplied via the `cardTpt` structural directive.\n\t */\n\treadonly cardTpt = contentChild(CardTemplateDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom column header template supplied via the `columnHeaderTpt` structural directive.\n\t */\n\treadonly columnHeaderTpt = contentChild(BoardColumnHeaderDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom column footer template supplied via the `columnFooterTpt` structural directive.\n\t */\n\treadonly columnFooterTpt = contentChild(BoardColumnFooterDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom card placeholder template supplied via the `cardPlaceholder` structural directive.\n\t * Used to customize the appearance of the drop zone when dragging cards.\n\t */\n\treadonly cardPlaceholderTpt = contentChild(CardPlaceholderDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom column placeholder template supplied via the `columnPlaceholder` structural directive.\n\t * Used to customize the appearance of the drop zone when dragging columns.\n\t */\n\treadonly columnPlaceholderTpt = contentChild(ColumnPlaceholderDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom card drag preview template supplied via the `cardDragPreview` structural directive.\n\t * Used to customize the visual element that follows the cursor when dragging cards.\n\t * The template receives `card` (the dragged card) and `column` (the source column) as context.\n\t */\n\treadonly cardDragPreviewTpt = contentChild(CardDragPreviewDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Custom column drag preview template supplied via the `columnDragPreview` structural directive.\n\t * Used to customize the visual element that follows the cursor when dragging columns.\n\t * The template receives `column` (the dragged column) as context.\n\t */\n\treadonly columnDragPreviewTpt = contentChild(ColumnDragPreviewDirective, {\n\t\tread: TemplateRef<unknown>\n\t});\n\n\t/**\n\t * Reference to the hidden container where drag preview elements are rendered.\n\t */\n\treadonly dragPreviewContainer = viewChild<ElementRef<HTMLElement>>('dragPreviewContainer');\n\n\t/**\n\t * Disposer for the currently active custom drag preview, or `null`.\n\t */\n\tprivate dragPreviewDestroy: (() => void) | null = null;\n\n\t/**\n\t * Emits each time a card is clicked within the board.\n\t */\n\treadonly onCardClick = output<BoardCard>();\n\n\t/**\n\t * Emits when a card has been repositioned, either within the same column or into another column.\n\t */\n\treadonly onCardMoved = output<CardDragDropEvent<any>>();\n\n\t/**\n\t * Emits when columns are reordered through drag-and-drop.\n\t */\n\treadonly onColumnMoved = output<ColumnDragDropEvent<any>>();\n\n\t/**\n\t * Emits when a column body is scrolled to its end, enabling infinite-scroll behaviour.\n\t */\n\treadonly reachedEnd = output<ReachedEndEvent>();\n\n\t/**\n\t * Internal drag state tracking.\n\t */\n\treadonly dragState = signal<DragState | null>(null);\n\n\t/**\n\t * Signal for tracking the currently hovered column index during card drag.\n\t */\n\treadonly hoveredColumnIndex = signal<number | null>(null);\n\n\t/**\n\t * Signal for tracking the drop indicator position within a column.\n\t */\n\treadonly dropIndicatorIndex = signal<number | null>(null);\n\n\t/**\n\t * Signal for tracking the column drop indicator position.\n\t */\n\treadonly columnDropIndicatorIndex = signal<number | null>(null);\n\n\t/**\n\t * Signal tracking the in-progress keyboard move of a card, or `null` when\n\t * no card is grabbed.\n\t */\n\treadonly keyboardMoveState = signal<KeyboardMoveState | null>(null);\n\n\t/**\n\t * Message rendered inside the visually hidden `aria-live` region so screen\n\t * readers announce keyboard grab, move, drop and cancel actions.\n\t */\n\treadonly announcement = signal<string>('');\n\n\t/**\n\t * Alternation flag used by {@link announce} so consecutive identical\n\t * messages still trigger a live-region announcement.\n\t */\n\tprivate announcementToggle = false;\n\n\t/**\n\t * Default predicate that allows any card to be dropped into any column.\n\t *\n\t * @returns Always `true`, indicating that drop operations are permitted.\n\t */\n\tdefaultEnterPredicateFn = () => true;\n\n\t/**\n\t * Returns the card currently being dragged, if any.\n\t *\n\t * @returns The dragged card or null if no card is being dragged.\n\t */\n\tget draggedCard(): BoardCard | null {\n\t\tconst state = this.dragState();\n\t\treturn state?.type === 'card' ? (state.item as BoardCard) : null;\n\t}\n\n\t/**\n\t * Returns the column currently being dragged, if any.\n\t *\n\t * @returns The dragged column or null if no column is being dragged.\n\t */\n\tget draggedColumn(): BoardColumn | null {\n\t\tconst state = this.dragState();\n\t\treturn state?.type === 'column' ? (state.item as BoardColumn) : null;\n\t}\n\n\t/**\n\t * Emits the clicked card through {@link onCardClick}.\n\t *\n\t * @param item - The card that triggered the click event.\n\t */\n\tcardClick(item: BoardCard) {\n\t\tthis.onCardClick.emit(item);\n\t}\n\n\t/**\n\t * Track function for columns to ensure proper re-rendering.\n\t * Uses column id if available, otherwise falls back to index.\n\t *\n\t * @param index - The index of the column.\n\t * @param column - The column object.\n\t * @returns A unique identifier for the column.\n\t */\n\ttrackColumnById(index: number, column: BoardColumn): string | number {\n\t\treturn (column as any).id ?? index;\n\t}\n\n\t/**\n\t * Builds the stable DOM id of a column group. Uses the column id when\n\t * available (falling back to its index) prefixed by the board instance id.\n\t *\n\t * @param index - The index of the column.\n\t * @param column - The column object.\n\t * @returns A stable, board-scoped element id for the column group.\n\t */\n\tcolumnGroupId(index: number, column: BoardColumn): string {\n\t\treturn `${this.boardInstanceId}-column-${this.trackColumnById(index, column)}`;\n\t}\n\n\t/**\n\t * Checks if the given card is currently grabbed for a keyboard move.\n\t *\n\t * @param card - The card to check.\n\t * @returns Whether the card is grabbed.\n\t */\n\tisCardGrabbed(card: BoardCard): boolean {\n\t\treturn this.keyboardMoveState()?.card === card;\n\t}\n\n\t/**\n\t * Checks if the given column is currently being dragged.\n\t *\n\t * @param column - The column to check.\n\t * @returns Whether the column is being dragged.\n\t */\n\tisDraggingColumn(column: BoardColumn): boolean {\n\t\tconst state = this.dragState();\n\t\treturn state?.type === 'column' && state.item === column;\n\t}\n\n\t/**\n\t * Checks if the given card is currently being dragged.\n\t *\n\t * @param card - The card to check.\n\t * @returns Whether the card is being dragged.\n\t */\n\tisDraggingCard(card: BoardCard): boolean {\n\t\tconst state = this.dragState();\n\t\treturn state?.type === 'card' && state.item === card;\n\t}\n\n\t/**\n\t * Handles the drag start event for columns.\n\t *\n\t * @param event - The native drag event.\n\t * @param column - The column being dragged.\n\t * @param columnIndex - The index of the column in the board.\n\t */\n\tonColumnDragStart(event: DragEvent, column: BoardColumn, columnIndex: number): void {\n\t\tif (this.columnSortingDisabled() || column.disabled) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tconst element = event.currentTarget as HTMLElement;\n\n\t\tif (event.dataTransfer) {\n\t\t\tevent.dataTransfer.effectAllowed = 'move';\n\t\t\tevent.dataTransfer.setData('text/plain', `column:${columnIndex}`);\n\n\t\t\t// Use custom drag preview if template is provided\n\t\t\tconst previewTemplate = this.columnDragPreviewTpt();\n\t\t\tif (previewTemplate) {\n\t\t\t\tconst previewElement = this.createDragPreview(previewTemplate, { column });\n\t\t\t\tif (previewElement) {\n\t\t\t\t\tevent.dataTransfer.setDragImage(previewElement, 0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Set drag state after a micro-delay to allow the browser to capture the drag image\n\t\t// before we hide the element\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.dragState.set({\n\t\t\t\ttype: 'column',\n\t\t\t\tsourceColumnIndex: columnIndex,\n\t\t\t\titem: column,\n\t\t\t\telement\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles the drag end event for columns.\n\t *\n\t * @param _event - The native drag event (unused).\n\t */\n\tonColumnDragEnd(_event: DragEvent): void {\n\t\tthis.destroyDragPreview();\n\t\tthis.columnDropIndicatorIndex.set(null);\n\t\tthis.dragState.set(null);\n\t}\n\n\t/**\n\t * Handles the drag over event for the board container.\n\t * Calculates the drop position based on mouse position relative to columns.\n\t *\n\t * @param event - The native drag event.\n\t */\n\tonBoardDragOver(event: DragEvent): void {\n\t\tconst state = this.dragState();\n\t\tif (!state || state.type !== 'column') {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tif (event.dataTransfer) {\n\t\t\tevent.dataTransfer.dropEffect = 'move';\n\t\t}\n\n\t\t// Find which column we're over based on mouse position\n\t\tconst boardElement = event.currentTarget as HTMLElement;\n\t\tconst columnElements = boardElement.querySelectorAll('.hub-board__column-container');\n\t\tconst mouseX = event.clientX;\n\n\t\tlet dropIndex = this.columns().length; // Default to end\n\n\t\tfor (let i = 0; i < columnElements.length; i++) {\n\t\t\tconst columnElement = columnElements[i] as HTMLElement;\n\t\t\tconst rect = columnElement.getBoundingClientRect();\n\t\t\tconst columnMiddle = rect.left + rect.width / 2;\n\n\t\t\tif (mouseX < columnMiddle) {\n\t\t\t\tdropIndex = i;\n\t\t\t\tbreak;\n\t\t\t} else if (mouseX < rect.right) {\n\t\t\t\tdropIndex = i + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.columnDropIndicatorIndex.set(dropIndex);\n\t}\n\n\t/**\n\t * Handles the drop event for the board container (column reordering).\n\t *\n\t * @param event - The native drag event.\n\t */\n\tonBoardDrop(event: DragEvent): void {\n\t\tevent.preventDefault();\n\t\tconst state = this.dragState();\n\n\t\tif (!state || state.type !== 'column') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dropIndicator = this.columnDropIndicatorIndex();\n\t\tif (dropIndicator === null) {\n\t\t\t// No valid drop position - reset state\n\t\t\tthis.columnDropIndicatorIndex.set(null);\n\t\t\tthis.dragState.set(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst columns = this.columns();\n\t\tconst previousIndex = state.sourceColumnIndex;\n\n\t\t// Calculate the actual target index\n\t\t// If dropping after the source, we need to subtract 1 because the source will be removed first\n\t\tlet currentIndex = dropIndicator;\n\t\tif (dropIndicator > previousIndex) {\n\t\t\tcurrentIndex = dropIndicator - 1;\n\t\t}\n\n\t\tif (previousIndex !== currentIndex) {\n\t\t\tmoveItemInArray(columns, previousIndex, currentIndex);\n\n\t\t\t// Force re-render by incrementing the version counter\n\t\t\tthis._columnsVersion.update((v) => v + 1);\n\n\t\t\tconst dropEvent: ColumnDragDropEvent = {\n\t\t\t\tpreviousIndex,\n\t\t\t\tcurrentIndex,\n\t\t\t\tcontainer: { data: columns },\n\t\t\t\tpreviousContainer: { data: columns },\n\t\t\t\titem: { data: state.item as BoardColumn },\n\t\t\t\tisPointerOverContainer: true\n\t\t\t};\n\n\t\t\tthis.onColumnMoved.emit(dropEvent);\n\t\t}\n\n\t\tthis.columnDropIndicatorIndex.set(null);\n\t\tthis.dragState.set(null);\n\t}\n\n\t/**\n\t * Handles the drag start event for cards.\n\t *\n\t * @param event - The native drag event.\n\t * @param card - The card being dragged.\n\t * @param columnIndex - The index of the column containing the card.\n\t * @param cardIndex - The index of the card within the column.\n\t */\n\tonCardDragStart(event: DragEvent, card: BoardCard, columnIndex: number, cardIndex: number): void {\n\t\tif (card.disabled) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tevent.stopPropagation();\n\n\t\tconst element = event.currentTarget as HTMLElement;\n\t\tconst sourceColumn = this.columns()[columnIndex];\n\n\t\tif (event.dataTransfer) {\n\t\t\tevent.dataTransfer.effectAllowed = 'move';\n\t\t\tevent.dataTransfer.setData('text/plain', `card:${columnIndex}:${cardIndex}`);\n\n\t\t\t// Use custom drag preview if template is provided\n\t\t\tconst previewTemplate = this.cardDragPreviewTpt();\n\t\t\tif (previewTemplate) {\n\t\t\t\tconst previewElement = this.createDragPreview(previewTemplate, { card, column: sourceColumn });\n\t\t\t\tif (previewElement) {\n\t\t\t\t\tevent.dataTransfer.setDragImage(previewElement, 0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Set drag state after a micro-delay to allow the browser to capture the drag image\n\t\t// before we hide the element\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.dragState.set({\n\t\t\t\ttype: 'card',\n\t\t\t\tsourceColumnIndex: columnIndex,\n\t\t\t\tsourceCardIndex: cardIndex,\n\t\t\t\titem: card,\n\t\t\t\telement\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles the drag end event for cards.\n\t *\n\t * @param _event - The native drag event (unused).\n\t */\n\tonCardDragEnd(_event: DragEvent): void {\n\t\tthis.destroyDragPreview();\n\t\tthis.hoveredColumnIndex.set(null);\n\t\tthis.dropIndicatorIndex.set(null);\n\t\tthis.dragState.set(null);\n\t}\n\n\t/**\n\t * Handles the drag over event for column bodies (card drop zones).\n\t *\n\t * @param event - The native drag event.\n\t * @param column - The column being dragged over.\n\t * @param columnIndex - The index of the column.\n\t */\n\tonCardDragOver(event: DragEvent, column: BoardColumn, columnIndex: number): void {\n\t\tconst state = this.dragState();\n\t\tif (!state || state.type !== 'card') {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the column accepts this card via predicate\n\t\tconst predicate = column.predicate ?? this.defaultEnterPredicateFn;\n\t\tconst dragItem: BoardDragItem<BoardCard> = { data: state.item as BoardCard, element: state.element };\n\n\t\tif (!predicate(dragItem) || column.cardSortingDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (event.dataTransfer) {\n\t\t\tevent.dataTransfer.dropEffect = 'move';\n\t\t}\n\n\t\tthis.hoveredColumnIndex.set(columnIndex);\n\n\t\t// Calculate drop position based on mouse Y position\n\t\tconst containerElement = event.currentTarget as HTMLElement;\n\t\tconst cards = containerElement.querySelectorAll('.hub-board__card:not(.hub-board__card--dragging)');\n\t\tconst mouseY = event.clientY;\n\n\t\tlet dropIndex = column.cards.length;\n\n\t\tfor (let i = 0; i < cards.length; i++) {\n\t\t\tconst cardElement = cards[i] as HTMLElement;\n\t\t\tconst rect = cardElement.getBoundingClientRect();\n\t\t\tconst cardMiddle = rect.top + rect.height / 2;\n\n\t\t\tif (mouseY < cardMiddle) {\n\t\t\t\t// Adjust index to account for the dragged card if in same column\n\t\t\t\tif (state.sourceColumnIndex === columnIndex && state.sourceCardIndex !== undefined) {\n\t\t\t\t\tdropIndex = i <= state.sourceCardIndex ? i : i;\n\t\t\t\t} else {\n\t\t\t\t\tdropIndex = i;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.dropIndicatorIndex.set(dropIndex);\n\t}\n\n\t/**\n\t * Handles the drag leave event for column bodies.\n\t *\n\t * @param event - The native drag event.\n\t * @param columnIndex - The index of the column being left.\n\t */\n\tonCardDragLeave(event: DragEvent, columnIndex: number): void {\n\t\tconst relatedTarget = event.relatedTarget as HTMLElement | null;\n\t\tconst currentTarget = event.currentTarget as HTMLElement;\n\n\t\t// Only clear if we're actually leaving the container (not entering a child)\n\t\tif (!relatedTarget || !currentTarget.contains(relatedTarget)) {\n\t\t\tif (this.hoveredColumnIndex() === columnIndex) {\n\t\t\t\tthis.hoveredColumnIndex.set(null);\n\t\t\t\tthis.dropIndicatorIndex.set(null);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles the drop event for cards.\n\t *\n\t * @param event - The native drag event.\n\t * @param column - The target column.\n\t * @param columnIndex - The index of the target column.\n\t */\n\tonCardDrop(event: DragEvent, column: BoardColumn, columnIndex: number): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tconst state = this.dragState();\n\t\tif (!state || state.type !== 'card' || state.sourceCardIndex === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst columns = this.columns();\n\t\tconst sourceColumn = columns[state.sourceColumnIndex];\n\t\tconst targetColumn = column;\n\n\t\tconst previousIndex = state.sourceCardIndex;\n\t\tlet currentIndex = this.dropIndicatorIndex() ?? targetColumn.cards.length;\n\n\t\t// Adjust for same-column moves\n\t\tif (state.sourceColumnIndex === columnIndex && previousIndex < currentIndex) {\n\t\t\tcurrentIndex--;\n\t\t}\n\n\t\tconst isSameContainer = state.sourceColumnIndex === columnIndex;\n\n\t\tif (isSameContainer) {\n\t\t\tif (previousIndex !== currentIndex) {\n\t\t\t\tmoveItemInArray(targetColumn.cards, previousIndex, currentIndex);\n\t\t\t}\n\t\t} else {\n\t\t\ttransferArrayItem(sourceColumn.cards, targetColumn.cards, previousIndex, currentIndex);\n\t\t}\n\n\t\t// Force re-render by incrementing the version counter\n\t\tthis._columnsVersion.update((v) => v + 1);\n\n\t\tthis.emitCardMoved(sourceColumn, targetColumn, state.item as BoardCard, previousIndex, currentIndex);\n\n\t\tthis.hoveredColumnIndex.set(null);\n\t\tthis.dropIndicatorIndex.set(null);\n\t\tthis.dragState.set(null);\n\t}\n\n\t/**\n\t * Handles keyboard interaction on a card, implementing the keyboard\n\t * reordering model:\n\t *\n\t * - `Space` / `Enter` on a focused card grabs it (or drops it when already\n\t *   grabbed, committing the move through the same event path as a pointer\n\t *   drop).\n\t * - While grabbed, `ArrowUp` / `ArrowDown` move the card within its column\n\t *   and `ArrowLeft` / `ArrowRight` move it to the adjacent column,\n\t *   respecting the same acceptance rules as the drag path (column\n\t *   `predicate` and `cardSortingDisabled`).\n\t * - `Escape` cancels the move and restores the original position.\n\t *\n\t * @param event - The native keyboard event.\n\t * @param card - The card that received the key press.\n\t * @param columnIndex - The index of the column containing the card.\n\t * @param cardIndex - The index of the card within the column.\n\t */\n\tonCardKeydown(event: KeyboardEvent, card: BoardCard, columnIndex: number, cardIndex: number): void {\n\t\tif (card.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst state = this.keyboardMoveState();\n\n\t\tif (!state) {\n\t\t\tif (event.key === ' ' || event.key === 'Enter') {\n\t\t\t\tthis.grabCard(event, card, columnIndex, cardIndex);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Only the grabbed card reacts while a keyboard move is in progress.\n\t\tif (state.card !== card) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase ' ':\n\t\t\tcase 'Enter':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.dropGrabbedCard(state);\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.cancelGrabbedCard(state);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.moveGrabbedCardWithinColumn(state, -1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.moveGrabbedCardWithinColumn(state, 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.moveGrabbedCardToColumn(state, -1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowRight':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.moveGrabbedCardToColumn(state, 1);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Grabs a card for a keyboard move, mirroring the drag-start restrictions\n\t * (disabled cards and columns with `cardSortingDisabled` cannot start a move).\n\t *\n\t * @param event - The keyboard event that initiated the grab.\n\t * @param card - The card to grab.\n\t * @param columnIndex - The index of the column containing the card.\n\t * @param cardIndex - The index of the card within the column.\n\t */\n\tprivate grabCard(event: KeyboardEvent, card: BoardCard, columnIndex: number, cardIndex: number): void {\n\t\tconst column = this.columns()[columnIndex];\n\t\tif (!column || column.cardSortingDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.keyboardMoveState.set({\n\t\t\tcard,\n\t\t\tsourceColumnIndex: columnIndex,\n\t\t\tsourceCardIndex: cardIndex,\n\t\t\tcurrentColumnIndex: columnIndex,\n\t\t\tcurrentCardIndex: cardIndex\n\t\t});\n\t\tthis.announce(\n\t\t\t`Card \"${card.title}\" grabbed. Position ${cardIndex + 1} of ${column.cards.length} in \"${column.title}\". ` +\n\t\t\t\t`Use the arrow keys to move, Space or Enter to drop, Escape to cancel.`\n\t\t);\n\t}\n\n\t/**\n\t * Moves the grabbed card one position up or down within its current column.\n\t *\n\t * @param state - The active keyboard move state.\n\t * @param delta - `-1` to move up, `1` to move down.\n\t */\n\tprivate moveGrabbedCardWithinColumn(state: KeyboardMoveState, delta: -1 | 1): void {\n\t\tconst column = this.columns()[state.currentColumnIndex];\n\t\tconst targetIndex = state.currentCardIndex + delta;\n\n\t\tif (!column || targetIndex < 0 || targetIndex >= column.cards.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tmoveItemInArray(column.cards, state.currentCardIndex, targetIndex);\n\t\tthis._columnsVersion.update((v) => v + 1);\n\t\tthis.keyboardMoveState.set({ ...state, currentCardIndex: targetIndex });\n\t\tthis.announce(\n\t\t\t`Card \"${state.card.title}\" moved to \"${column.title}\", position ${targetIndex + 1} of ${column.cards.length}.`\n\t\t);\n\t\tthis.focusCard(state.currentColumnIndex, targetIndex);\n\t}\n\n\t/**\n\t * Moves the grabbed card to the adjacent column, enforcing the same\n\t * acceptance rules as the pointer drag path (the target column `predicate`\n\t * and `cardSortingDisabled`).\n\t *\n\t * @param state - The active keyboard move state.\n\t * @param delta - `-1` to move to the previous column, `1` to the next one.\n\t */\n\tprivate moveGrabbedCardToColumn(state: KeyboardMoveState, delta: -1 | 1): void {\n\t\tconst columns = this.columns();\n\t\tconst targetColumnIndex = state.currentColumnIndex + delta;\n\t\tconst targetColumn = columns[targetColumnIndex];\n\n\t\tif (!targetColumn) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Enforce the same acceptance rules as the pointer drag-over path.\n\t\tconst predicate = targetColumn.predicate ?? this.defaultEnterPredicateFn;\n\t\tif (!predicate({ data: state.card }) || targetColumn.cardSortingDisabled) {\n\t\t\tthis.announce(`Card \"${state.card.title}\" cannot be moved to \"${targetColumn.title}\".`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst sourceColumn = columns[state.currentColumnIndex];\n\t\tconst targetIndex = Math.min(state.currentCardIndex, targetColumn.cards.length);\n\n\t\ttransferArrayItem(sourceColumn.cards, targetColumn.cards, state.currentCardIndex, targetIndex);\n\t\tthis._columnsVersion.update((v) => v + 1);\n\t\tthis.keyboardMoveState.set({\n\t\t\t...state,\n\t\t\tcurrentColumnIndex: targetColumnIndex,\n\t\t\tcurrentCardIndex: targetIndex\n\t\t});\n\t\tthis.announce(\n\t\t\t`Card \"${state.card.title}\" moved to \"${targetColumn.title}\", position ${targetIndex + 1} of ${targetColumn.cards.length}.`\n\t\t);\n\t\tthis.focusCard(targetColumnIndex, targetIndex);\n\t}\n\n\t/**\n\t * Commits the keyboard move, emitting {@link onCardMoved} through the same\n\t * path as a pointer drop. Dropping a card that was never moved is a no-op\n\t * (the grab is simply released without emitting).\n\t *\n\t * @param state - The active keyboard move state.\n\t */\n\tprivate dropGrabbedCard(state: KeyboardMoveState): void {\n\t\tconst columns = this.columns();\n\t\tconst sourceColumn = columns[state.sourceColumnIndex];\n\t\tconst targetColumn = columns[state.currentColumnIndex];\n\n\t\tthis.keyboardMoveState.set(null);\n\n\t\tif (!sourceColumn || !targetColumn) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst moved = state.sourceColumnIndex !== state.currentColumnIndex || state.sourceCardIndex !== state.currentCardIndex;\n\t\tif (moved) {\n\t\t\tthis.emitCardMoved(sourceColumn, targetColumn, state.card, state.sourceCardIndex, state.currentCardIndex);\n\t\t}\n\n\t\tthis.announce(\n\t\t\t`Card \"${state.card.title}\" dropped in \"${targetColumn.title}\", position ${state.currentCardIndex + 1} of ${targetColumn.cards.length}.`\n\t\t);\n\t}\n\n\t/**\n\t * Cancels the keyboard move, restoring the card to the position it occupied\n\t * when it was grabbed. No {@link onCardMoved} event is emitted.\n\t *\n\t * @param state - The active keyboard move state.\n\t */\n\tprivate cancelGrabbedCard(state: KeyboardMoveState): void {\n\t\tconst columns = this.columns();\n\t\tconst currentColumn = columns[state.currentColumnIndex];\n\t\tconst sourceColumn = columns[state.sourceColumnIndex];\n\n\t\tif (currentColumn && sourceColumn) {\n\t\t\tif (state.currentColumnIndex === state.sourceColumnIndex) {\n\t\t\t\tif (state.currentCardIndex !== state.sourceCardIndex) {\n\t\t\t\t\tmoveItemInArray(currentColumn.cards, state.currentCardIndex, state.sourceCardIndex);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttransferArrayItem(\n\t\t\t\t\tcurrentColumn.cards,\n\t\t\t\t\tsourceColumn.cards,\n\t\t\t\t\tstate.currentCardIndex,\n\t\t\t\t\tMath.min(state.sourceCardIndex, sourceColumn.cards.length)\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._columnsVersion.update((v) => v + 1);\n\t\t}\n\n\t\tthis.keyboardMoveState.set(null);\n\t\tthis.announce(`Move cancelled. Card \"${state.card.title}\" returned to its original position.`);\n\t\tthis.focusCard(state.sourceColumnIndex, state.sourceCardIndex);\n\t}\n\n\t/**\n\t * Builds and emits the {@link onCardMoved} event. Shared by the pointer\n\t * drop and keyboard commit paths so both emit an identical payload shape.\n\t *\n\t * @param sourceColumn - The column the card was moved from.\n\t * @param targetColumn - The column the card was moved to.\n\t * @param card - The moved card.\n\t * @param previousIndex - The card index before the move.\n\t * @param currentIndex - The card index after the move.\n\t */\n\tprivate emitCardMoved(\n\t\tsourceColumn: BoardColumn,\n\t\ttargetColumn: BoardColumn,\n\t\tcard: BoardCard,\n\t\tpreviousIndex: number,\n\t\tcurrentIndex: number\n\t): void {\n\t\tconst dropEvent: CardDragDropEvent = {\n\t\t\tpreviousIndex,\n\t\t\tcurrentIndex,\n\t\t\tcontainer: { data: targetColumn },\n\t\t\tpreviousContainer: { data: sourceColumn },\n\t\t\titem: { data: card },\n\t\t\tisPointerOverContainer: true\n\t\t};\n\n\t\tthis.onCardMoved.emit(dropEvent);\n\t}\n\n\t/**\n\t * Sets the given announcement message on the polite live region. Alternates\n\t * a trailing no-break space so consecutive identical messages are still\n\t * re-announced by screen readers.\n\t *\n\t * @param message - The message to announce.\n\t */\n\tprivate announce(message: string): void {\n\t\tthis.announcementToggle = !this.announcementToggle;\n\t\tthis.announcement.set(this.announcementToggle ? message : `${message}\\u00A0`);\n\t}\n\n\t/**\n\t * Restores keyboard focus to the card at the given coordinates after the\n\t * next render. Needed because browsers blur an element when Angular\n\t * relocates it in the DOM during a keyboard move. Only ever called from\n\t * keyboard handlers, so it is SSR-safe.\n\t *\n\t * @param columnIndex - The index of the column containing the card.\n\t * @param cardIndex - The index of the card within the column.\n\t */\n\tprivate focusCard(columnIndex: number, cardIndex: number): void {\n\t\trequestAnimationFrame(() => {\n\t\t\tconst card = this.elementRef.nativeElement.querySelector<HTMLElement>(\n\t\t\t\t`[data-column-index=\"${columnIndex}\"] .hub-board__card[data-card-index=\"${cardIndex}\"]`\n\t\t\t);\n\t\t\tcard?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Determines if a column should show the drop indicator.\n\t *\n\t * @param columnIndex - The index position to check for the drop indicator.\n\t * @returns Whether the drop indicator should be shown at this position.\n\t */\n\tshouldShowColumnDropIndicator(columnIndex: number): boolean {\n\t\tconst state = this.dragState();\n\t\tif (state?.type !== 'column') {\n\t\t\treturn false;\n\t\t}\n\t\treturn this.columnDropIndicatorIndex() === columnIndex;\n\t}\n\n\t/**\n\t * Determines if a card drop indicator should be shown at a specific position.\n\t *\n\t * @param columnIndex - The index of the column.\n\t * @param cardIndex - The index where the indicator would appear.\n\t * @returns Whether the drop indicator should be shown.\n\t */\n\tshouldShowCardDropIndicator(columnIndex: number, cardIndex: number): boolean {\n\t\tconst state = this.dragState();\n\t\tif (state?.type !== 'card') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.hoveredColumnIndex() === columnIndex && this.dropIndicatorIndex() === cardIndex;\n\t}\n\n\t/**\n\t * Emits {@link reachedEnd} once a column body is scrolled to its bottom.\n\t *\n\t * @param index - Index of the scrolled column within the board.\n\t * @param event - Browser scroll event originating from the column body element.\n\t */\n\tonScroll(index: number, event: Event) {\n\t\tconst el = event.target as HTMLElement | null;\n\t\tif (!el) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scrolledToBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - this.scrollDetectionPadding;\n\n\t\tif (!scrolledToBottom) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst column = this.board()?.columns?.[index];\n\t\tif (!column) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reachedEnd.emit({\n\t\t\tindex,\n\t\t\tdata: column\n\t\t});\n\t}\n\n\t/**\n\t * Creates a custom drag preview element from a template and renders it in a hidden container.\n\t * The element must be in the DOM for setDragImage to work properly.\n\t *\n\t * @param template - The template to render as the drag preview.\n\t * @param context - The context to pass to the template.\n\t * @returns The native HTML element to use as the drag image, or null if creation failed.\n\t */\n\tprivate createDragPreview(template: TemplateRef<unknown>, context: Record<string, unknown>): HTMLElement | null {\n\t\t// Destroy any existing preview first.\n\t\tthis.destroyDragPreview();\n\n\t\tconst container = this.dragPreviewContainer();\n\t\tif (!container) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Render the template into the hidden container using the shared drag-image helper.\n\t\tconst image = createNativeDragImage(template, context, container.nativeElement);\n\t\tif (!image) {\n\t\t\treturn null;\n\t\t}\n\t\tthis.dragPreviewDestroy = image.destroy;\n\t\treturn image.node;\n\t}\n\n\t/**\n\t * Destroys the current drag preview view and cleans up related resources. The disposer\n\t * returned by `createNativeDragImage` removes both the embedded view and the rendered\n\t * nodes, so no manual container clearing is required.\n\t */\n\tprivate destroyDragPreview(): void {\n\t\tthis.dragPreviewDestroy?.();\n\t\tthis.dragPreviewDestroy = null;\n\t}\n}\n","@if (columns().length) {\n<div class=\"hub-board__drop-list\" (dragover)=\"onBoardDragOver($event)\" (drop)=\"onBoardDrop($event)\">\n\t<div class=\"hub-board__columns\">\n\t\t@for (column of columns(); let index = $index; track trackColumnById($index, column)) {\n\t\t<!-- Column placeholder (before column) -->\n\t\t@if (shouldShowColumnDropIndicator(index)) {\n\t\t<div class=\"hub-board__column-placeholder\">\n\t\t\t@if (columnPlaceholderTpt()) {\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"columnPlaceholderTpt()!\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ column: draggedColumn }\"\n\t\t\t></ng-container>\n\t\t\t}\n\t\t</div>\n\t\t}\n\t\t<div\n\t\t\tclass=\"hub-board__column-container\"\n\t\t\trole=\"group\"\n\t\t\t[class.hub-board__column-container--disabled]=\"column.disabled\"\n\t\t\t[class.hub-board__column-container--dragging-ghost]=\"isDraggingColumn(column) && dragBehavior() === 'ghost'\"\n\t\t\t[class.hub-board__column-container--dragging-hide]=\"isDraggingColumn(column) && dragBehavior() === 'hide'\"\n\t\t\t[class.hub-board__column-container--dragging-collapse]=\"isDraggingColumn(column) && dragBehavior() === 'collapse'\"\n\t\t\t[attr.id]=\"columnGroupId(index, column)\"\n\t\t\t[attr.aria-label]=\"column.title\"\n\t\t\t[attr.draggable]=\"!columnSortingDisabled() && !column.disabled\"\n\t\t\t[attr.data-column-index]=\"index\"\n\t\t\t(dragstart)=\"onColumnDragStart($event, column, index)\"\n\t\t\t(dragend)=\"onColumnDragEnd($event)\"\n\t\t>\n\t\t\t<div class=\"hub-board__column\" [ngClass]=\"column.classlist\" [style]=\"column.style\">\n\t\t\t\t<div class=\"hub-board__column-header\">\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t[ngTemplateOutlet]=\"columnHeaderTpt() || defaultColumnHeaderTpt\"\n\t\t\t\t\t\t[ngTemplateOutletContext]=\"{ column: column }\"\n\t\t\t\t\t>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"hub-board__column-body\"\n\t\t\t\t\trole=\"list\"\n\t\t\t\t\t[class.hub-board__column-body--drag-over]=\"hoveredColumnIndex() === index\"\n\t\t\t\t\t(scroll)=\"onScroll(index, $event)\"\n\t\t\t\t\t(dragover)=\"onCardDragOver($event, column, index)\"\n\t\t\t\t\t(dragleave)=\"onCardDragLeave($event, index)\"\n\t\t\t\t\t(drop)=\"onCardDrop($event, column, index)\"\n\t\t\t\t>\n\t\t\t\t\t@for (card of column.cards; let cardIndex = $index; track card) {\n\t\t\t\t\t<!-- Card placeholder (before card) -->\n\t\t\t\t\t@if (shouldShowCardDropIndicator(index, cardIndex)) {\n\t\t\t\t\t<div class=\"hub-board__card-placeholder\">\n\t\t\t\t\t\t@if (cardPlaceholderTpt()) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"cardPlaceholderTpt()!\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{ card: draggedCard, column: column }\"\n\t\t\t\t\t\t></ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"hub-board__card\"\n\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\t[class.hub-board__card--disabled]=\"card.disabled\"\n\t\t\t\t\t\t[class.hub-board__card--grabbed]=\"isCardGrabbed(card)\"\n\t\t\t\t\t\t[class.hub-board__card--dragging-ghost]=\"isDraggingCard(card) && dragBehavior() === 'ghost'\"\n\t\t\t\t\t\t[class.hub-board__card--dragging-hide]=\"isDraggingCard(card) && dragBehavior() === 'hide'\"\n\t\t\t\t\t\t[class.hub-board__card--dragging-collapse]=\"isDraggingCard(card) && dragBehavior() === 'collapse'\"\n\t\t\t\t\t\t[attr.draggable]=\"!card.disabled && !column.cardSortingDisabled\"\n\t\t\t\t\t\t[attr.tabindex]=\"card.disabled ? null : 0\"\n\t\t\t\t\t\t[attr.aria-describedby]=\"card.disabled ? null : keyboardHintId\"\n\t\t\t\t\t\t[attr.data-card-index]=\"cardIndex\"\n\t\t\t\t\t\t(dragstart)=\"onCardDragStart($event, card, index, cardIndex)\"\n\t\t\t\t\t\t(dragend)=\"onCardDragEnd($event)\"\n\t\t\t\t\t\t(click)=\"cardClick(card)\"\n\t\t\t\t\t\t(keydown)=\"onCardKeydown($event, card, index, cardIndex)\"\n\t\t\t\t\t\t(mousedown)=\"card.disabled ? $event.stopPropagation() : null\"\n\t\t\t\t\t\t[ngClass]=\"card.classlist\"\n\t\t\t\t\t\t[style]=\"card.style\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"hub-board__card-body\">\n\t\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t\t[ngTemplateOutlet]=\"cardTpt() || defaultCardTpt\"\n\t\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\t\t\titem: card,\n\t\t\t\t\t\t\t\t\tcolumn\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\t<!-- Card placeholder at the end -->\n\t\t\t\t\t@if (shouldShowCardDropIndicator(index, column.cards.length)) {\n\t\t\t\t\t<div class=\"hub-board__card-placeholder\">\n\t\t\t\t\t\t@if (cardPlaceholderTpt()) {\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"cardPlaceholderTpt()!\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"{ card: draggedCard, column: column }\"\n\t\t\t\t\t\t></ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\n\t\t\t\t@if (columnFooterTpt()) {\n\t\t\t\t<div class=\"hub-board__column-footer\">\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t[ngTemplateOutlet]=\"columnFooterTpt() ?? null\"\n\t\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t\tcolumn: column\n\t\t\t\t\t\t}\"\n\t\t\t\t\t>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t\t}\n\t\t<!-- Column placeholder at the end -->\n\t\t@if (shouldShowColumnDropIndicator(columns().length)) {\n\t\t<div class=\"hub-board__column-placeholder\">\n\t\t\t@if (columnPlaceholderTpt()) {\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"columnPlaceholderTpt()!\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ column: draggedColumn }\"\n\t\t\t></ng-container>\n\t\t\t}\n\t\t</div>\n\t\t}\n\t</div>\n</div>\n}\n\n<ng-template #defaultCardTpt let-item=\"item\">\n\t<h6 class=\"hub-board__card-title\">{{ item.title }}</h6>\n\t<p class=\"hub-board__card-subtitle\">{{ item.description }}</p>\n</ng-template>\n\n<ng-template #defaultColumnHeaderTpt let-column=\"column\">\n\t<div class=\"d-flex flex-column\">\n\t\t<h5 class=\"hub-board__column-header-title\">\n\t\t\t{{ column.title }}\n\t\t</h5>\n\t\t<h6 class=\"hub-board__column-header-subtitle\">\n\t\t\t{{ column.description }}\n\t\t</h6>\n\t</div>\n</ng-template>\n\n<!-- Visually hidden keyboard usage hint referenced by every focusable card -->\n<span class=\"hub-board__visually-hidden\" [attr.id]=\"keyboardHintId\"\n\t>Press Space or Enter to grab the card, use the arrow keys to move it, Space or Enter to drop it, Escape to cancel the\n\tmove.</span\n>\n\n<!-- Polite live region announcing keyboard grab, move, drop and cancel actions -->\n<div class=\"hub-board__visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">{{ announcement() }}</div>\n\n<!-- Hidden container for rendering drag preview elements -->\n<div #dragPreviewContainer class=\"hub-board__drag-preview-container\" aria-hidden=\"true\"></div>\n","import { NgModule } from '@angular/core';\nimport { HubBoardComponent } from './components/board/board.component';\nimport { BoardColumnFooterDirective } from './directives/board-column-footer.directive';\nimport { BoardColumnHeaderDirective } from './directives/board-column-header.directive';\nimport { CardPlaceholderDirective } from './directives/card-placeholder.directive';\nimport { CardTemplateDirective } from './directives/card-template.directive';\nimport { ColumnPlaceholderDirective } from './directives/column-placeholder.directive';\n\n/**\n * Angular module that provides board functionality with drag-and-drop support.\n * \n * This module includes all the necessary components and directives for creating\n * Kanban-style boards with customizable columns, cards, and templates.\n * \n * @deprecated Use standalone components instead. Import individual components and directives directly.\n * @publicApi\n * \n * @example\n * ```typescript\n * // Legacy module approach (not recommended)\n * import { BoardModule } from 'ng-hub-ui-board';\n * \n * @NgModule({\n *   imports: [BoardModule]\n * })\n * export class AppModule {}\n * \n * // Recommended standalone approach\n * import { HubBoardComponent, CardTemplateDirective } from 'ng-hub-ui-board';\n * \n * @Component({\n *   standalone: true,\n *   imports: [HubBoardComponent, CardTemplateDirective]\n * })\n * export class MyComponent {}\n * ```\n */\n@NgModule({\n\tdeclarations: [],\n\timports: [\n\t\tHubBoardComponent,\n\t\tCardTemplateDirective,\n\t\tBoardColumnHeaderDirective,\n\t\tBoardColumnFooterDirective,\n\t\tCardPlaceholderDirective,\n\t\tColumnPlaceholderDirective\n\t],\n\texports: [\n\t\tHubBoardComponent,\n\t\tCardTemplateDirective,\n\t\tBoardColumnHeaderDirective,\n\t\tBoardColumnFooterDirective,\n\t\tCardPlaceholderDirective,\n\t\tColumnPlaceholderDirective\n\t]\n})\nexport class BoardModule {}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Converts a hexadecimal color string into its inverted counterpart, offering both\n * high-contrast black/white and full-spectrum inversion modes.\n *\n * @publicApi\n */\n@Pipe({\n\tname: 'invertColor',\n\tstandalone: true\n})\nexport class InvertColorPipe implements PipeTransform {\n\t/**\n\t * Inverts a HEX color value.\n\t *\n\t * @param hex - Color expressed as a 3- or 6-digit HEX string with or without a hash prefix.\n\t * @param bw - When `true`, returns either black or white based on perceived brightness to maximise contrast.\n\t * @returns The inverted color represented as a 6-digit HEX string (always prefixed with `#`).\n\t * @throws Error if the provided value cannot be parsed as a valid HEX color.\n\t */\n\ttransform(hex: string, bw: boolean): string {\n\t\tif (!hex) {\n\t\t\treturn '#000000';\n\t\t}\n\n\t\tlet normalizedHex = hex;\n\t\tif (normalizedHex.indexOf('#') === 0) {\n\t\t\tnormalizedHex = normalizedHex.slice(1);\n\t\t}\n\n\t\tif (normalizedHex.length === 3) {\n\t\t\t// Convert shorthand notation (e.g., #abc) to full length (#aabbcc)\n\t\t\tnormalizedHex =\n\t\t\t\tnormalizedHex[0] +\n\t\t\t\tnormalizedHex[0] +\n\t\t\t\tnormalizedHex[1] +\n\t\t\t\tnormalizedHex[1] +\n\t\t\t\tnormalizedHex[2] +\n\t\t\t\tnormalizedHex[2];\n\t\t}\n\n\t\tif (normalizedHex.length !== 6) {\n\t\t\tthrow new Error('Invalid HEX color.');\n\t\t}\n\n\t\tconst r = parseInt(normalizedHex.slice(0, 2), 16);\n\t\tconst g = parseInt(normalizedHex.slice(2, 4), 16);\n\t\tconst b = parseInt(normalizedHex.slice(4, 6), 16);\n\n\t\tif (bw) {\n\t\t\t// http://stackoverflow.com/a/3943023/112731\n\t\t\treturn r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF';\n\t\t}\n\n\t\tconst invertedR = (255 - r).toString(16).padStart(2, '0');\n\t\tconst invertedG = (255 - g).toString(16).padStart(2, '0');\n\t\tconst invertedB = (255 - b).toString(16).padStart(2, '0');\n\n\t\treturn `#${invertedR}${invertedG}${invertedB}`;\n\t}\n}\n","/**\n * Represents a drag-and-drop event for board operations.\n * This interface replaces the CDK's CdkDragDrop to provide a lightweight,\n * dependency-free alternative.\n *\n * @template C The type of the container data.\n * @template P The type of the previous container data (defaults to C).\n * @template I The type of the dragged item data (defaults to any).\n * @publicApi\n */\nexport interface BoardDragDropEvent<C, P = C, I = any> {\n\t/**\n\t * The index of the item in its previous container before dragging.\n\t */\n\tpreviousIndex: number;\n\n\t/**\n\t * The index where the item was dropped in the current container.\n\t */\n\tcurrentIndex: number;\n\n\t/**\n\t * Data associated with the container where the item was dropped.\n\t */\n\tcontainer: BoardDropContainer<C>;\n\n\t/**\n\t * Data associated with the container from which the item was dragged.\n\t */\n\tpreviousContainer: BoardDropContainer<P>;\n\n\t/**\n\t * The dragged item data.\n\t */\n\titem: BoardDragItem<I>;\n\n\t/**\n\t * Whether the item was dropped in the same container it started in.\n\t */\n\tisPointerOverContainer: boolean;\n\n\t/**\n\t * The distance the item was dragged.\n\t */\n\tdistance?: { x: number; y: number };\n\n\t/**\n\t * The point where the item was dropped.\n\t */\n\tdropPoint?: { x: number; y: number };\n}\n\n/**\n * Represents a drop container in the board.\n *\n * @template T The type of data associated with the container.\n * @publicApi\n */\nexport interface BoardDropContainer<T> {\n\t/**\n\t * The data associated with this container.\n\t */\n\tdata: T;\n\n\t/**\n\t * The DOM element of the container.\n\t */\n\telement?: HTMLElement;\n}\n\n/**\n * Represents a dragged item in the board.\n *\n * @template T The type of data associated with the item.\n * @publicApi\n */\nexport interface BoardDragItem<T> {\n\t/**\n\t * The data associated with this item.\n\t */\n\tdata: T;\n\n\t/**\n\t * The DOM element of the dragged item.\n\t */\n\telement?: HTMLElement;\n}\n\n/**\n * Type alias for card drag-drop events.\n * @publicApi\n */\nexport type CardDragDropEvent<T = any> = BoardDragDropEvent<\n\timport('./board-column').BoardColumn<T>,\n\timport('./board-column').BoardColumn<T>,\n\timport('./board-card').BoardCard<T>\n>;\n\n/**\n * Type alias for column drag-drop events.\n * @publicApi\n */\nexport type ColumnDragDropEvent<T = any> = BoardDragDropEvent<\n\timport('./board-column').BoardColumn<T>[],\n\timport('./board-column').BoardColumn<T>[],\n\timport('./board-column').BoardColumn<T>\n>;\n\n// The array move/transfer helpers used when reordering cards and columns now live in the\n// shared `ng-hub-ui-utils` drag-and-drop core and are re-exported from `./array-helpers`\n// (kept in a dedicated file so the external re-export does not sit alongside the inline\n// `import('./board-column')` type references above, which trips ng-packagr's compiler).\n","/*\n * Public API Surface of board\n */\n\n// module\nexport * from './lib/board.module';\n\n// directives\nexport * from './lib/directives/board-column-footer.directive';\nexport * from './lib/directives/board-column-header.directive';\nexport * from './lib/directives/card-drag-preview.directive';\nexport * from './lib/directives/card-placeholder.directive';\nexport * from './lib/directives/card-template.directive';\nexport * from './lib/directives/column-drag-preview.directive';\nexport * from './lib/directives/column-placeholder.directive';\n\n// components\nexport * from './lib/components/board/board.component';\n\n// pipes\nexport * from './lib/pipes/invert-color.pipe';\n\n// models\nexport * from './lib/models/array-helpers';\nexport * from './lib/models/board';\nexport * from './lib/models/board-card';\nexport * from './lib/models/board-column';\nexport * from './lib/models/drag-drop-event';\nexport * from './lib/models/reached-end-event';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}