{"version":3,"file":"talenra-ngx-base-table.mjs","sources":["../../../projects/ngx-base/table/src/table/table.types.ts","../../../projects/ngx-base/table/src/table/table.navigation.ts","../../../projects/ngx-base/table/src/table/table.scroll-indicator.ts","../../../projects/ngx-base/table/src/table/table.selection.utils.ts","../../../projects/ngx-base/table/src/table/table.selection.ts","../../../projects/ngx-base/table/src/table/table.translations.ts","../../../projects/ngx-base/table/src/table/table.resize.ts","../../../projects/ngx-base/table/src/cell-renderer/cell-renderer.directive.ts","../../../projects/ngx-base/table/src/table/table.component.ts","../../../projects/ngx-base/table/src/table/table.component.html","../../../projects/ngx-base/table/src/table-toolbar/table-toolbar.component.ts","../../../projects/ngx-base/table/src/table-toolbar/table-toolbar.component.html","../../../projects/ngx-base/table/talenra-ngx-base-table.ts"],"sourcesContent":["import { Type } from '@angular/core';\n\n/**\n * Values accepted by the `TableColumn`'s `align` property.\n *\n * ### Import\n *\n * ```typescript\n * import { TableColumnHAlign } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport const TableColumnHAlign = {\n  Center: 'center',\n  Left: 'left',\n  Right: 'right',\n} as const;\n\n/**\n * Type of values accepted by the `TableColumn`'s `align` property.\n * Used to configure horizontal alignment of content in table rows.\n *\n * ### Import\n *\n * ```typescript\n * import { TTableColumnHAlign } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport type TTableColumnHAlign = (typeof TableColumnHAlign)[keyof typeof TableColumnHAlign];\n\n/**\n * Values accepted by Table's `selectionMode` property.\n *\n * ```html\n * <talenra-table [data]=\"data\" selectionMode=\"single row\"></talenra-table>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { TableSelectionMode } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport const TableSelectionMode = {\n  None: 'none',\n  SingleRow: 'single row',\n  MultiRow: 'multi row',\n} as const;\n\n/**\n * Type of values accepted by Table's `selectionMode` property.\n *\n * ### Import\n *\n * ```typescript\n * import { TTableSelectionMode } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport type TTableSelectionMode = (typeof TableSelectionMode)[keyof typeof TableSelectionMode];\n\n/**\n * Type of table column width definition. Used to define optional min-/max-width of a column. Values are defined as CSS\n * length units (e.g. '120px', '50%', 'auto').\n *\n * ### Import\n *\n * ```typescript\n * import { TTableColumnWidth } from '@talenra/ngx-base/table';\n * ```\n */\nexport type TTableColumnWidth = {\n  min?: string;\n  max?: string;\n};\n\n/**\n * Defines a column in the Table component.\n *\n * ```typescript\n * protected readonly columns: TableColumn[] = [\n *   { identifier: 'author', label: 'Author' },\n *   { identifier: 'title', label: 'Title' },\n *   { identifier: 'pages': label: 'Pages', align: TableColumnHAlign.Right },\n *   { identifier: 'price', label: 'Price', align: TableColumnHAlign.Right },\n * ];\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { ITableColumn } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport interface ITableColumn {\n  /** Unique identifier for the column. */\n  identifier: string;\n  /** Field name in the data object. Used to map the data object's field to the corresponding column. */\n  field: string;\n  /** Label displayed in the table's header. */\n  label?: string;\n  /**\n   * Horizontal alignment of content in the column. Note that this setting affects table body's cells (`td`) only.\n   * Header cells (`th`) are always left-aligned.\n   */\n  hAlign?: TTableColumnHAlign;\n  /**\n   * Width of the column. Provide a CSS length unit string (e.g. `'250px'`) to define the exact width of the column or a\n   * range object (e.g. `{ min: '120px', max: '500px'}`). As the table is always the same width as its container,\n   * effective column width might deviate from the specified values.\n   */\n  width?: string | TTableColumnWidth;\n  /**\n   * Custom renderer component. Use a renderer if rendering a simple string value does not match your requirements.\n   *\n   * @see {@link TableComponent#columns}\n   * @see {@link ITableCellRenderer}\n   */\n  renderer?: Type<unknown>;\n  /**\n   * Disables row selection for the column. Use to prevent interferences when implementing a custom renderer with\n   * event handlers.\n   */\n  disableRowSelection?: boolean;\n  /** Determines whether the column is sortable. */\n  sortable?: boolean;\n  /**\n   * Determines whether the column is user-resizable. If set `true`, the user can resize the column width by dragging\n   * the column separator in the Table head.\n   */\n  resizable?: boolean;\n}\n\n/**\n * Represents a single data row. Table data is represented by an array of objects of this type (`ITableRow[]`).\n *\n * ```typescript\n * protected readonly data: ITableRow[] = [\n *   {\n *     identifier: \"e5472204-4410-479a-9e90-c591dc8329e5\",\n *     author: \"Gabrielle-Suzanne Barbot de Villeneuve\",\n *     title: \"La Belle et la Bête\",\n *     isbn: \"978-1-910-88006-7\",\n *   },\n *   // ...\n * ]\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { ITableRow } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport interface ITableRow {\n  /** Unique identifier for the row (e.g. existing id from DB, GUID or array index).  */\n  identifier: string;\n  /** Determines whether the row is selected. */\n  isSelected?: boolean;\n  /**\n   * Data rendered in the table row. Each field of the object represents a table cell. Object keys must match column's\n   * `field`s.\n   */\n  [field: string]: unknown;\n}\n\n/**\n * Type of event emitted by the Table component when the row is un-/selected by the user.\n *\n * ### Import\n *\n * ```typescript\n * import { ITableRowSelectionChange } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport interface ITableRowSelectionChange {\n  /** Reference to the affected row */\n  row: ITableRow;\n  /** Selection state of the row (selected or not) */\n  isSelected: boolean;\n}\n\n/**\n * Type of event emitted by the Table component when the row is double-clicked by the user.\n *\n * ### Import\n *\n * ```typescript\n * import { ITableRowDoubleClick } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport interface ITableRowDoubleClick {\n  /** Reference to the affected row */\n  row: ITableRow;\n  /** Mouse event */\n  event: MouseEvent;\n}\n\n/**\n * Values accepted by TableSort's `direction` property.\n **\n * ### Import\n *\n * ```typescript\n * import { TableSortDirection } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport const TableSortDirection = {\n  Ascending: 'ascending',\n  Descending: 'descending',\n} as const;\n\n/**\n * Type of values accepted by TableSorts's `direction` property.\n *\n * ### Import\n *\n * ```typescript\n * import { TTableSortDirection } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport type TTableSortDirection = (typeof TableSortDirection)[keyof typeof TableSortDirection];\n\n/**\n * Type used by the sort property of the Table component to define the sorting column and direction.\n *\n * ### Import\n *\n * ```typescript\n * import { ITableSortState } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent}\n */\nexport interface ITableSortState {\n  /** The column used for sorting. Must match a field name defined in TableColumn. */\n  field: string;\n  /** Selection state of the row (selected or not) */\n  direction: TTableSortDirection;\n}\n\n/**\n * Type for custom translations used in Table component.\n *\n * ### Import\n *\n * ```typescript\n * import { ITableTranslations } from '@talenra/ngx-base/table';\n * ```\n *\n * @see {@link TableComponent#translations}\n */\nexport interface ITableTranslations {\n  /** Message displayed if table has no entries. */\n  noEntries?: string;\n}\n","import { Clipboard } from '@angular/cdk/clipboard';\nimport { inject } from '@angular/core';\nimport { TableComponent } from './table.component';\nimport { TableSelection } from './table.selection';\nimport { ITableColumn, ITableRow, TableSelectionMode } from './table.types';\n\n/** @internal */\ntype TCoords = {\n  row: number; // -1 → head, >=0 → index of data row\n  col: number;\n};\n\n/**\n * Handles highlighting and keyboard navigation for the TableComponent.\n *\n * @internal\n */\nexport class TableNavigation {\n  /** Field having focus (keyboard) */\n  private get focus(): TCoords {\n    return this._focus;\n  }\n  private set focus(coords: TCoords) {\n    const focusElm: HTMLElement | null = this.getElmAt(coords);\n    if (!focusElm) return;\n    // Blur active element but keep the focus on the wrapping element as we need focus for keyboard navigation.\n    const activeElm: HTMLElement | null = document.activeElement as HTMLElement;\n    if (activeElm) {\n      activeElm.blur();\n      this.wrapperElm?.focus({ preventScroll: true });\n    }\n    // Finally focus the relevant element and update the focus coords.\n    focusElm.focus({ preventScroll: true });\n    focusElm.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n    this._focus = coords;\n  }\n  private _focus: TCoords = { row: 0, col: 0 };\n  /** Field having hover (pointer) */\n  private hover: TCoords = { row: -1, col: -1 };\n\n  /** Reference to the element the focus shall be returned to if not used by a specific table cell. */\n  private wrapperElm?: HTMLElement;\n  /** Reference to table head element (<thead>) */\n  private theadElm?: HTMLElement;\n  /** Reference to table body element (<tbody>) */\n  private tbodyElm?: HTMLElement;\n\n  /** CDK clipboard util */\n  private clipboard: Clipboard = inject(Clipboard);\n\n  /** @internal */\n  constructor(\n    private table: TableComponent,\n    private selection: TableSelection\n  ) {}\n\n  /**\n   * Invoked by TableComponent after view is initialized to provide references to the relevant HTML elements (which are\n   * not available at construction time).\n   */\n  init(wrapperElm: HTMLElement, thead: HTMLElement, tbody: HTMLElement): void {\n    this.wrapperElm = wrapperElm;\n    this.theadElm = thead;\n    this.tbodyElm = tbody;\n  }\n\n  /** Returns the relevant HTML element for a given table coordiante. */\n  private getElmAt(coords: TCoords): HTMLElement | null {\n    // Determine whether the relevant cell is part of table head and whether we have to deal with a checkbox column\n    const isHead: boolean = coords.row < 0;\n    const hasCheckbox: boolean = this.table.selectionMode() === TableSelectionMode.MultiRow;\n    // Guard: Exit early if element reference is missing\n    if ((!isHead && !this.tbodyElm) || (isHead && !this.theadElm)) return null;\n    // Determine the relevant elements\n    const areaElm: HTMLElement = (isHead ? this.theadElm : this.tbodyElm) as HTMLElement;\n    const rowElm: HTMLTableRowElement = areaElm.getElementsByTagName('tr')[isHead ? 0 : coords.row];\n    if (!rowElm) return null;\n    const cellElm: HTMLTableCellElement = rowElm.getElementsByTagName(isHead ? 'th' : 'td')[\n      coords.col + (hasCheckbox ? 1 : 0)\n    ];\n    if (!cellElm) return null;\n    // Return the relevant cell element – or, in case the cell contains a custom renderer with tabindex >= 0 – the\n    // renderer element. Checking the tabindex determines whether the cell contains \"focusable\" content. Which\n    // currently can only be the case if a custom cell renderer is used which explicitly sets tabindex.\n    const rendererElm: HTMLElement | null = (this.table.useResponsiveMode() ? cellElm.children[1] : cellElm)\n      ?.firstElementChild as HTMLElement;\n    return rendererElm?.tabIndex >= 0 ? rendererElm : cellElm;\n  }\n\n  /** Determines whether the row at a given index is highlighted. Typically used in template. */\n  isRowHovered(rowIndex: number): boolean {\n    return rowIndex === this.hover.row;\n  }\n\n  /** Determines whether a given column head is highlighted. Typically used in template. */\n  isFieldHovered(cell: TCoords): boolean {\n    return cell.row === this.hover.row && cell.col === this.hover.col;\n  }\n\n  /**\n   * Handles hover and blur actions. Triggerd from the template.\n   * @param cell – The cell to highlight (hover) or null to remove highlighting completely (blur)\n   */\n  onHover(cell: TCoords | null): void {\n    this.hover = { row: -1, col: -1, ...cell };\n  }\n\n  /**\n   * Focus handler. Bypasses focus setter method (which takes care about updating focus) as setting focus is done by\n   * the browser if `focus` event is triggered.\n   */\n  onFocus(cell: TCoords): void {\n    this._focus = cell;\n  }\n\n  /** Prevents the default browser behavior for certain keys. */\n  private preventScroll(event: KeyboardEvent): void {\n    // Tab is blockes as it interferes with checkboxes in selection-mode \"multi row\".\n    if ([' ', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'End', 'Enter', 'Home'].includes(event.key)) {\n      event.preventDefault();\n    }\n  }\n\n  /** Dispatches key events */\n  handleKeydown(event: KeyboardEvent): void {\n    this.preventScroll(event);\n    const rows: ITableRow[] = this.table.data();\n    const cols: ITableColumn[] = this.table.columns();\n    // No rows to navigate\n    if (!rows.length) return;\n    switch (event.key) {\n      // Arrow up/down: Step through rows\n      case 'ArrowUp':\n      case 'ArrowDown':\n        const direction: number = event.key === 'ArrowUp' ? -1 : 1;\n        // While in responsive mode, navigate through columns, not rows\n        if (this.table.isResponsive) {\n          // Modifier used to include the checkbox column added when Table is in multi-row selection mode\n          const colModifier: number = this.table.selectionMode() === TableSelectionMode.MultiRow ? 1 : 0;\n          const colsCount: number = cols.length + colModifier;\n          // Calculate and normalize the column index to be within the bounds of the columns array\n          let col: number = (this.focus.col + direction + colsCount) % colsCount;\n          // Update row if required\n          col = colModifier && col === colsCount - colModifier ? -1 : col;\n          const row: number = col === this.focus.col + direction ? this.focus.row : this.focus.row + direction;\n          // Limit row to be within the bounds of the rows array\n          if (row < 0 || row >= rows.length) return;\n          this.focus = { row, col };\n        }\n        // In regular mode (not responsive), we can navigate through rows\n        else {\n          const previousFocus: TCoords = { ...this.focus };\n          this.focus = {\n            ...this.focus,\n            row: Math.max(-1, Math.min(rows.length - 1, this.focus.row + direction)),\n          };\n          // In multi-row selection mode, we support cumulative selection using Shift key\n          if (event.shiftKey && this.table.selectionMode() === TableSelectionMode.MultiRow) {\n            // Skip if table header is getting focus\n            if (this.focus.row < 0) return;\n            const row: ITableRow = rows[this.focus.row];\n            const previousRow: ITableRow = rows[previousFocus.row];\n            const previousRowNeighbor: ITableRow | undefined = rows[previousFocus.row - direction];\n            if (row.isSelected) {\n              // The current row is already selected. We only need to take care about the previous row. Its selection\n              // state should be same as its other neighbor row (not the direction we are navigating to).\n              previousRowNeighbor &&\n                previousRowNeighbor.isSelected !== previousRow.isSelected &&\n                this.selection.toggleRow(previousRow, { cumulate: true });\n            } else {\n              // The current row is not selected. First we add the previous row to the selection if it is not selected.\n              previousRow && !previousRow.isSelected && this.selection.toggleRow(previousRow, { cumulate: true });\n              // Then we add the current row to the selection.\n              this.selection.toggleRow(row, { cumulate: true });\n            }\n          }\n        }\n        break;\n      // Arrow left/right: Step through cols\n      case 'ArrowLeft':\n      case 'ArrowRight':\n        if (this.table.isResponsive) return; // No support for left/right navigation in responsive mode\n        this.focus = {\n          ...this.focus,\n          col: Math.max(\n            this.table.selectionMode() === TableSelectionMode.MultiRow ? -1 : 0, // Allow focus on column with index -1 if in multi-select mode (checkbox)\n            Math.min(cols.length - 1, this.focus.col + (event.key === 'ArrowLeft' ? -1 : 1))\n          ),\n        };\n        break;\n      // Home: Navigate to first row\n      case 'Home':\n        this.focus = { ...this.focus, row: 0 };\n        break;\n      // End: Navigate to last row\n      case 'End':\n        this.focus = { ...this.focus, row: rows.length - 1 };\n        break;\n      // Enter/Space: Select highlighted row\n      case 'Enter':\n      case ' ':\n        const col: ITableColumn = cols[this.focus.col];\n        // Select row\n        if (this.focus.row >= 0 && !col?.disableRowSelection) {\n          this.table.selectionMode() === TableSelectionMode.MultiRow\n            ? // Toggle current row, keep selection (cumulative)\n              this.selection.toggleRow(rows[this.focus.row], { cumulate: true })\n            : // Toggle current row, reset selection\n              this.table.toggleRowSelection(rows[this.focus.row]);\n        } else if (this.focus.row === -1) {\n          // Sort col\n          this.focus.col >= 0 && col?.sortable && this.table.sortBy(col.field);\n          // Select all\n          if (this.focus.col === -1) {\n            this.selection.selectAllChecked = !this.selection.selectAllChecked;\n            this.selection.selectAllRows();\n          }\n        }\n        break;\n    }\n  }\n\n  /** Handle copy-to-clipboard */\n  copyToClipboard(): void {\n    // Get the cell content\n    const row: ITableRow | undefined = this.table.data()[this.focus.row];\n    const col: ITableColumn | undefined = this.table.columns()[this.focus.col];\n    // Grab the column's head label or the current cell's value\n    const content: unknown = this.focus.row === -1 ? col?.label || '' : col?.field ? row[col.field] : '';\n    // Copy content to clipboard\n    this.clipboard.copy(String(content));\n  }\n}\n","import { DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, debounceTime, fromEvent, tap, throttleTime } from 'rxjs';\n\n/**\n * Interface for the visibility of the scroll indicators.\n *\n * @internal\n */\nexport interface TableScrollIndicatorVisibility {\n  left: boolean;\n  right: boolean;\n}\n\n/**\n * Controls the table's scroll indicator (gradient).\n *\n * Required as a pure CSS solution does not offer the flexibility needed for styling (we want the gradient to be\n * transparent on _top_ of content and backgrounds).\n *\n * s. https://codepen.io/huijing/details/XBGaNQ\n *\n * @internal\n */\nexport class TableScrollIndicator {\n  /** The scrolling element */\n  private element: HTMLElement;\n\n  /** Determines whether the scroll indicators are visible. */\n  public visibility: BehaviorSubject<TableScrollIndicatorVisibility> =\n    new BehaviorSubject<TableScrollIndicatorVisibility>({\n      left: false,\n      right: false,\n    });\n\n  /** @internal */\n  constructor(\n    element: HTMLElement,\n    private destroyRef: DestroyRef\n  ) {\n    this.element = element;\n    this.init();\n    this.recalculate();\n  }\n\n  /** Adds subscription for window resize and element scroll. */\n  private init(): void {\n    // Subscribe to window resize\n    fromEvent(window, 'resize')\n      .pipe(\n        takeUntilDestroyed(this.destroyRef),\n        debounceTime(250),\n        tap(() => this.recalculate())\n      )\n      .subscribe();\n    // Subscribe to element scroll\n    fromEvent(this.element, 'scroll')\n      .pipe(\n        takeUntilDestroyed(this.destroyRef),\n        throttleTime(100),\n        tap(() => this.recalculate()),\n        debounceTime(250),\n        tap(() => this.recalculate())\n      )\n      .subscribe();\n  }\n\n  // Updates the scroll indicators states.\n  recalculate(): void {\n    const visibility: TableScrollIndicatorVisibility = {\n      left: this.element.scrollLeft > 0,\n      right: this.element.scrollLeft < this.element.scrollWidth - this.element.clientWidth,\n    };\n    // No propagation if visibility did not change\n    if (visibility.left === this.visibility.value.left && visibility.right === this.visibility.value.right) return;\n    // Propagate changes\n    this.visibility.next(visibility);\n  }\n}\n","import { TRange } from './table.selection';\nimport { ITableRow } from './table.types';\n\n/**\n * Return whether the given row index is within the current selection range.\n */\nexport const inRange = (index: number, range: TRange): boolean => {\n  return index >= Math.min(range.from, range.to) && index <= Math.max(range.from, range.to);\n};\n\n/**\n * Returns the index of the closest row matching the given condition. In case where two rows are equally close, the\n * row above/before the given index is returned.\n *\n * @param index Index of the row to start the search from\n * @param rows Array of rows to search in\n * @param compareFn Matcher function to determine whether a row matches the condition\n * @returns The index of the closest row matching the condition or `null` if no match was found\n */\nexport const closestRowIndex = (\n  index: number,\n  rows: ITableRow[],\n  compareFn: (row: ITableRow) => boolean\n): number | null => {\n  if (index < 0 || index >= rows.length) return null;\n  let range: number | null = 1;\n  while (range !== null) {\n    const rowBefore: ITableRow | undefined = rows[index - range];\n    if (rowBefore && compareFn(rowBefore)) return index - range;\n    const rowAfter: ITableRow | undefined = rows[index + range];\n    if (rowAfter && compareFn(rowAfter)) return index + range;\n    range = rowBefore || rowAfter ? range + 1 : null;\n  }\n  return null;\n};\n","import { TableComponent } from './table.component';\nimport { ITableRow, TableSelectionMode } from './table.types';\nimport { closestRowIndex, inRange } from './table.selection.utils';\n\n/**\n * Type used to define selection ranges. Do not export this type without prefixing its name (e.g.\n * `TTableSelectionRange`).\n *\n * @internal\n */\nexport type TRange = { from: number; to: number };\n\n/**\n * Handles row selection for the TableComponent.\n *\n * @internal\n */\nexport class TableSelection {\n  /** Checked state of the \"select all\" checkbox displayed when selection mode is \"multi\". */\n  selectAllChecked: boolean = false;\n\n  /** Indeterminate state of the \"select all\" checkbox displayed when selection mode is \"multi\". */\n  selectAllIndeterminate: boolean = false;\n\n  /**\n   * Index of the most recent row selected without shift key pressed. Used to select ranges (shift key, batch select).\n   */\n  get selectionAnchor(): number | null {\n    return this._selectionAnchor;\n  }\n  set selectionAnchor(index: number | null) {\n    if (typeof index === 'number' && index !== this._selectionAnchor) {\n      const isInRange: boolean = inRange(index, this.selectionRange);\n      this._selectionAnchor = isInRange ? index + 1 : index;\n      // Reset selection range when anchor is updated, except when the new anchor is within the current range (Case G)\n      if (!isInRange) this.selectionRange = { from: index, to: index };\n    }\n  }\n  private _selectionAnchor: number | null = null;\n\n  /**\n   * Range of the rows added to selection using range (shift key). Used to unselect these rows when a new range is\n   * selected.\n   */\n  private selectionRange: TRange = { from: 0, to: 0 };\n\n  /** @internal */\n  constructor(private table: TableComponent) {}\n\n  /**\n   * Handler for un-/selecting rows. Toggles the given row's selection state.\n   *\n   * Options: `cumulate` - If `true`, the given row's selection state will be toggled without affecting other rows.\n   * Otherwise, all other rows will be unselected.\n   */\n  toggleRow(row: ITableRow, options: { cumulate: boolean } = { cumulate: false }): void {\n    // Ignore if row selection is disabled\n    if (this.table.selectionMode() === TableSelectionMode.None) return;\n    // Loop through table data\n    const length: number = this.table.data().length;\n    for (let i = 0; i < length; i++) {\n      const currentRow: ITableRow = this.table.data()[i];\n      if (this.table.selectionMode() === TableSelectionMode.SingleRow || !options.cumulate) {\n        // Unselect all other rows\n        if (!currentRow.isSelected || currentRow.identifier === row.identifier) continue;\n        this.updateRowState(currentRow, false);\n      }\n    }\n    // Toggle given row's selection state\n    this.updateRowState(row, !row.isSelected);\n    // Trigger change detection\n    this.table.data.set([...this.table.data()]);\n  }\n\n  /**\n   * Handler for selecting a range of rows. Unselects all rows from a previous range selection (if existing) and then\n   * selects the rows in the current range.\n   */\n  selectRange(row: ITableRow): void {\n    // Helper to determine min/max value of a given range\n    const rangeEdge = (range: TRange, edge: 'min' | 'max'): number => Math[edge](range.from, range.to);\n    // Get the index of the given row (takes current sort into account)\n    const rowIndex: number = this.table.data().indexOf(row);\n    // Selection anchor not set yet: Try to set it based on current selection (pre-selected, e.g. restored state) or fallback to zero.\n    this._selectionAnchor =\n      this.selectionAnchor ?? closestRowIndex(rowIndex, this.table.data(), (row) => !!row.isSelected) ?? 0;\n    // The next selection range\n    const selectionRange: TRange = { from: this.selectionAnchor ?? rowIndex, to: rowIndex };\n    // Determine whether the current selection range should be kept (case G)\n    const keepRange: boolean =\n      this.selectionRange.to > this.selectionRange.from && selectionRange.to > this.selectionRange.to;\n    // Unselect rows curent selection range unless it should be kept\n    if (!keepRange) {\n      for (let i: number = rangeEdge(this.selectionRange, 'min'); i <= rangeEdge(this.selectionRange, 'max'); i++) {\n        !inRange(i, selectionRange) && this.updateRowState(this.table.data()[i], false);\n      }\n    }\n    // Select rows in current selection range\n    for (let i: number = rangeEdge(selectionRange, 'min'); i <= rangeEdge(selectionRange, 'max'); i++) {\n      this.updateRowState(this.table.data()[i], true);\n    }\n    // Update selection range\n    this.selectionRange = selectionRange;\n  }\n\n  /** Handler for un-/selecting _all_ rows. */\n  selectAllRows(): void {\n    // Loop through table data\n    const length: number = this.table.data().length;\n    for (let i = 0; i < length; i++) {\n      const row: ITableRow = this.table.data()[i];\n      // Skip iteration if row is already in the desired state\n      if (row.isSelected === this.selectAllChecked) continue;\n      // Un-/select current row\n      this.updateRowState(row, this.selectAllChecked);\n    }\n    // Trigger change detection\n    this.table.data.set([...this.table.data()]);\n  }\n\n  /** Update the \"all\" checkbox state. */\n  updateCheckboxState(): void {\n    // Skip calculation if not required (performance optimization)\n    if (this.table.selectionMode() !== TableSelectionMode.MultiRow) return;\n    // Count selected rows\n    let selectedCount: number = 0;\n    const length: number = this.table.data().length;\n    for (let i: number = 0; i < length; i++) {\n      if (this.table.data()[i].isSelected) selectedCount++;\n    }\n    // Update checkbox' checked and indeterminate state\n    this.selectAllChecked = !!length && selectedCount === length;\n    this.selectAllIndeterminate = selectedCount > 0 && selectedCount < length;\n  }\n\n  /** Helper: Update a given row's selected state and emit a `rowSelectionChange` event. */\n  private updateRowState(row: ITableRow, isSelected: boolean): void {\n    // Skip if row is already in the desired state → do not emit event\n    if (row.isSelected === isSelected) return;\n    // Update state and emit event\n    row.isSelected = isSelected;\n    this.table.rowSelectionChange.emit({ row, isSelected });\n  }\n}\n","import { Dictionary } from '@talenra/ngx-base/shared';\n\n/**\n * Default translations for the Table component\n *\n * @internal\n */\nexport const translations: Dictionary = {\n  'de-CH': {\n    noEntries: 'Keine Einträge',\n  },\n  'fr-CH': {\n    noEntries: 'Aucune entrée',\n  },\n  'it-CH': {\n    noEntries: 'Nessuna voce',\n  },\n  'en-US': {\n    noEntries: 'No entries',\n  },\n};\n","import { CdkDragEnd, CdkDragMove } from '@angular/cdk/drag-drop';\nimport { TableComponent } from './table.component';\nimport { ITableColumn, TableSelectionMode } from './table.types';\n\n/** Keep a minimal column width when column is user-resized. */\nconst MIN_WIDTH: number = 60;\n\n/**\n * Handles resizing of table columns.\n *\n * @internal\n */\nexport class TableResize {\n  /** Reference to table head element (<thead>) */\n  private theadElm?: HTMLElement;\n\n  /** Reference to table body element (<tbody>) */\n  private tbodyElm?: HTMLElement;\n\n  /** Initial width of the currently resizing column */\n  private initialWidth: number = 0;\n\n  /** Indicates whether a resize operation (drag) is ongoing. */\n  isResizing: boolean = false;\n\n  /** @internal */\n  constructor(private table: TableComponent) {}\n\n  /**\n   * Invoked by TableComponent after view is initialized to provide references to the relevant HTML elements (which are\n   * not available at construction time).\n   */\n  init(thead: HTMLElement, tbody: HTMLElement): void {\n    this.theadElm = thead;\n    this.tbodyElm = tbody;\n  }\n\n  /** Invoked when the drag handle is clicked. */\n  clicked(event: MouseEvent): void {\n    // Stop the event to prevent sorting, which is the default behavior when clicking a header cell.\n    event.stopPropagation();\n  }\n\n  /** Invoked when drag handle is about to be dragged. */\n  dragStarted(columnIndex: number): void {\n    // Store the initial width of the column being resized.\n    this.initialWidth = this.getWidthOfColumn(columnIndex) || this.initialWidth;\n    this.isResizing = true;\n  }\n\n  /** Invoked when drag action is in progress. */\n  dragMoved(columnIndex: number, event: CdkDragMove): void {\n    event.source.reset();\n    this.updateColumnWidth(columnIndex, event.distance.x);\n  }\n\n  /** Invoked when drag action has ended. */\n  dragEnded(columnIndex: number, event: CdkDragEnd): void {\n    event.source.reset();\n    this.updateColumnWidth(columnIndex, event.distance.x);\n    // Reset resize indicator in the _next_ event loop.\n    setTimeout(() => {\n      this.isResizing = false;\n    });\n  }\n\n  /**\n   * Helper: Evaluates the first cell of the column at a given index and returns its width in px. As the table might\n   * have a header row only (no data) or only data rows (no header), we need to check both thead and tbody elements.\n   */\n  private getWidthOfColumn(index: number): number | null {\n    // Guard: Exit early if element reference is missing\n    if (!this.theadElm && !this.tbodyElm) return null;\n    // Multi-row selection: Take the checkbox column into account\n    const hasCheckbox: boolean = this.table.selectionMode() === TableSelectionMode.MultiRow;\n    // Get the first row of the table\n    const rowElm: HTMLTableRowElement | undefined = (this.theadElm || this.tbodyElm)?.getElementsByTagName('tr')[0];\n    // Guard: Exit early if we could not find a row element\n    if (!rowElm) return null;\n    // Get the cell element at the given index\n    const cellElm: HTMLTableCellElement = rowElm.getElementsByTagName(this.theadElm ? 'th' : 'td')[\n      index + (hasCheckbox ? 1 : 0)\n    ];\n    // Return the cell's width in px or null if the cell element is missing\n    return cellElm?.clientWidth || null;\n  }\n\n  /** Update the table's columns data while updating the affected column's width. */\n  private updateColumnWidth(columnIndex: number, offset: number): void {\n    this.table.columns.update((columns: ITableColumn[]): ITableColumn[] => {\n      // Clone the columns array to trigger change detection.\n      const columnsCopy: ITableColumn[] = [...columns];\n      columnsCopy[columnIndex].width = `${Math.max(MIN_WIDTH, this.initialWidth + offset)}px`;\n      return columnsCopy;\n    });\n  }\n}\n","import {\n  ApplicationRef,\n  ComponentRef,\n  Directive,\n  OnInit,\n  Type,\n  ViewContainerRef,\n  createComponent,\n  inject,\n  input,\n} from '@angular/core';\nimport { ITableCellRenderer } from './cell-renderer.types';\nimport { ITableColumn, ITableRow } from '../table/table.types';\n\n/**\n * Renders a provided custom component in a Table component's cell.\n *\n * ```html\n * @if (column.renderer) {\n *   <ng-container talenraTableCellRenderer [column]=\"column\" [row]=\"row\" [cell]=\"row[column.field]\"></ng-container>\n * }\n *\n * @internal\n */\n@Directive({\n  selector: '[talenraTableCellRenderer]',\n})\nexport class TableCellRendererDirective implements OnInit {\n  /** Reference to the hosting Table's context, typically the Table's parent component. */\n  contextRef = input<unknown>();\n  /** The colum the cell belongs to */\n  column = input.required<ITableColumn>();\n  /** The row the cell belongs to */\n  row = input.required<ITableRow>();\n  /** The cell value */\n  cell = input.required<unknown>();\n\n  private appRef: ApplicationRef = inject(ApplicationRef);\n  private container: ViewContainerRef = inject(ViewContainerRef);\n\n  /** @internal */\n  ngOnInit() {\n    this.renderComponent();\n  }\n\n  /** Render the custom component */\n  private renderComponent() {\n    // Guard: Exit early if no renderer is provided\n    if (!this.column().renderer) return;\n    // Create the renderer component\n    const componentRef: ComponentRef<unknown> = createComponent(this.column().renderer as Type<unknown>, {\n      environmentInjector: this.appRef.injector,\n    });\n    // Attach the renderer component to the view\n    this.container.insert(componentRef.hostView);\n    // Provide the renderer component with data\n    (componentRef.instance as ITableCellRenderer).onContext({\n      contextRef: this.contextRef(),\n      column: this.column(),\n      row: this.row(),\n      value: this.cell(),\n    });\n  }\n}\n","import { BreakpointObserver } from '@angular/cdk/layout';\n\nimport {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  DestroyRef,\n  ElementRef,\n  inject,\n  input,\n  LOCALE_ID,\n  model,\n  output,\n  OutputEmitterRef,\n  ViewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@talenra/ngx-base/checkbox';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { MessageComponent } from '@talenra/ngx-base/message';\nimport { ScrollContainerComponent } from '@talenra/ngx-base/scroll-container';\nimport { FieldUnderlineComponent, TLocale } from '@talenra/ngx-base/shared';\nimport { SkeletonComponent } from '@talenra/ngx-base/skeleton';\nimport { TooltipDirective } from '@talenra/ngx-base/tooltip';\nimport { asapScheduler } from 'rxjs';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { DoubleClickDirective, getPlatform, Platform, TPlatform } from '@talenra/ngx-base/dev-kit';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { TableNavigation } from './table.navigation';\nimport { TableScrollIndicator } from './table.scroll-indicator';\nimport { TableSelection } from './table.selection';\nimport { translations } from './table.translations';\nimport {\n  ITableColumn,\n  ITableRow,\n  ITableRowDoubleClick,\n  ITableRowSelectionChange,\n  ITableSortState,\n  ITableTranslations,\n  TableSelectionMode,\n  TableSortDirection,\n  TTableColumnHAlign,\n  TTableSelectionMode,\n} from './table.types';\nimport { TableResize } from './table.resize';\nimport { TableCellRendererDirective } from '../cell-renderer/cell-renderer.directive';\n\n/**\n * Breakpoint (viewport width) to be matched for responsive mode. Must align with breakpoint set in stylesheet.\n *\n * @internal\n */\nconst responsiveBreakpoint: string = '(max-width: 47.99em)'; // equals `stylebox.mq($until: \"s\")` → 768px\n\n/**\n * The Table component renders tabular data.\n *\n * ### Basic usage example\n *\n * ```typescript\n * // Component class\n * import { ITableColumn, ITableRow } from '@talenra/ngx-base/table';\n *\n * protected readonly columns: ITableColumn[] = [\n *   { identifier: '0', field: 'author', label: 'Author' },\n *   { identifier: '1', field: 'title', label: 'Title' },\n *   { identifier: '2', field: 'isbn', label: 'ISBN' },\n * ];\n *\n * protected readonly data: ITableRow[] = [\n *   {\n *     identifier: \"e5472204-4410-479a-9e90-c591dc8329e5\",\n *     author: \"Gabrielle-Suzanne Barbot de Villeneuve\",\n *     title: \"La Belle et la Bête\",\n *     isbn: \"978-1-910-88006-7\",\n *   },\n *   {\n *     identifier: \"6cf48942-341d-4b3d-b76a-be444a3f46dc\",\n *     author: \"Mary Shelley\",\n *     title: \"Frankenstein; or, The Modern Prometheus\",\n *     isbn: \"978-1-530-27844-2\",\n *   },\n *   {\n *     identifier: \"0e1ea95b-5e9b-4638-be2d-419c1455ea2e\",\n *     author: \"Herman Melville\",\n *     title: \"Moby-Dick; or, The Whale\",\n *     isbn: \"978-1-530-69790-8\",\n *   }\n * ]\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-table [columns]=\"columns\" [data]=\"data\"></talenra-table>\n * ```\n *\n * ### Column configuration\n *\n * Input property `columns` is key to to configure the Table and assign keys from your data object to Table columns.\n *\n * ### Custom cell-renderer\n *\n * String values are supported out of the box. Provide a cell-renderer component if you need to display more complex\n * data or UI (icons, checkboxes, links, graphs, …). The custom cell-renderer component has access to the cell's\n * context.\n *\n * ### Features\n *\n * - Sorting (s. {@link #columns|columns})\n * - Optional horizontal alignment per column (s. {@link #columns|columns})\n * - Optional column min-/max-width per column (s. {@link #columns|columns})\n * - Optional custom cell renderer component to display non-string content (s. {@link #columns|columns})\n * - Optional custom translations (s. {@link #translations|translations})\n * - Optional row selection (none, single or multi) (s. {@link #selectable|selectable})\n * - Skeleton loader (s. {@link #isLoading|isLoading})\n * - Responsive mode: Display rows \"card style\" on small viewports (breakpoint is currently not configurable) (s. {@link #useResponsiveMode|useResponsiveMode})\n * - Scroll indicators (vertical gradients if content has overflow)\n * - Support for appearance schemes and color themes\n *\n * ### Layout\n *\n * The width of tables is controlled by the containing element. Tables are the same width as their container.\n *\n * ### Import\n *\n * ```typescript\n * import { TableComponent } from '@talenra/ngx-base/table';\n * ```\n *\n * <example-url>../../#/table</example-url>\n */\n@Component({\n  selector: 'talenra-table',\n  imports: [\n    NgTemplateOutlet,\n    FormsModule,\n    CheckboxComponent,\n    FieldUnderlineComponent,\n    IconComponent,\n    MessageComponent,\n    ScrollContainerComponent,\n    SkeletonComponent,\n    TableCellRendererDirective,\n    TooltipDirective,\n    DragDropModule,\n    DoubleClickDirective,\n  ],\n  templateUrl: './table.component.html',\n  styleUrls: ['./table.component.scss', './table.responsive.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '(keydown)': 'handleKeydown($event)',\n    '(focusin)': 'trackFocus($event)',\n    '(focusout)': 'trackFocus($event)',\n    // Copy to clipboard: Use modifier key `meta` on macOS, `ctrl` on other platforms\n    '(document:keydown.control.c)': 'copyToClipboard($event)',\n    '(document:keydown.meta.c)': 'copyToClipboard($event)',\n    // Prevent text selection when modifier key is pressed (used for row selection)\n    '(document:keydown.shift)': 'updateTextSelection($event)',\n    '(document:keydown.meta)': 'updateTextSelection($event)',\n    '(document:keydown.control)': 'updateTextSelection($event)',\n    // Host classes\n    '[class.has-header]': 'hasHeader()',\n    '[class.responsive]': 'useResponsiveMode()',\n    '[class.selectable]': 'selectionMode() !== \"none\"',\n    '[class.prevent-select]': 'preventTextSelection',\n    '[class.scroll-indicator--left]': 'scrollIndicator?.visibility.value.left',\n    '[class.scroll-indicator--right]': 'scrollIndicator?.visibility.value.right',\n  },\n})\nexport class TableComponent implements AfterViewInit {\n  /**\n   * Array of column definitions. Used to configure the table's columns including the column header.\n   *\n   * While the `field` property is used to map provided data to columns, the `label` property is displayed to the user\n   * in the column header. Please refer to {@link ITableColumn} for full documentation.\n   *\n   * ```typescript\n   * // Component class\n   * import { ITableColumn, TableColumnHAlign, ITableRow } from '@talenra/ngx-base/table';\n   *\n   * protected readonly columns: ITableColumn[] = [\n   *   { identifier: '0', field: 'author', label: 'Author' },\n   *   { identifier: '1', field: 'title', label: 'Title', width: { min: '150px', max: '500px' } },\n   *   { identifier: '2', field: 'pages', label: 'Pages', hAlign: TableColumnHAlign.Right },\n   * ];\n   *\n   * protected readonly data: ITableRow[] = [\n   *   {\n   *     identifier: \"0e1ea95b-5e9b-4638-be2d-419c1455ea2e\",\n   *     author: \"Herman Melville\",\n   *     title: \"Moby-Dick; or, The Whale\",\n   *     pages: \"450\",\n   *   },\n   *   // ...\n   * ]\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-table [columns]=\"columns\" [data]=\"data\"></talenra-table>\n   * ```\n   *\n   * ### Custom cell renderer\n   *\n   * Out of the box, the Table renders string values. Custom renderer component allow you to implement more complex\n   * layout, interaction: From a simple icon indicating state to a button or a complex chart – all these use-cases\n   * involve a custom cell-renderer component.\n   *\n   * Your custom component will be rendered in the table cell and be provided with context (table data). This requires\n   * to implement the `ITableCellRenderer` interface as in the example below.\n   *\n   * ```typescript\n   * // Custom cell renderer component\n   * import { ITableCellContext, ITableCellRenderer } from '@talenra/ngx-base/table';\n   *\n   * export class MyRendererComponent implements ITableCellRenderer {\n   *   private destroyRef: DestroyRef = inject(DestroyRef);\n   *   // Reference to the app/component. Used for binding in both directions.\n   *   private contextRef: MyHostComponent | undefined;\n   *   // The table cell's value (s. `onContext` method)\n   *   protected rating: number = 0;\n   *\n   *   // Invoked by Table component to provide the cell renderer with context.\n   *   // Example of how to implement App → Renderer data flow.\n   *   onContext({ contextRef, value }: ITableCellContext): void {\n   *     this.contextRef = contextRef as MyHostComponent;\n   *     this.rating = value as number;\n   *     // App → Renderer data flow\n   *     this.contextRef?.myProperty$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value: string) => {\n   *       // Do something with `value`\n   *     });\n   *   }\n   *\n   *   // Example of how to implement Renderer → App data flow\n   *   private myHandler(): void {\n   *     if (!this.contextRef) return;\n   *     // Renderer → App data flow\n   *     this.contextRef.myHandlerMethod(this.rating);\n   *   }\n   * }\n   * ```\n   *\n   * The renderer component is then assigned to a column as in the example below.\n   *\n   * ```typescript\n   * import { MyRendererComponent } from './my-renderer.component'\n   *\n   * protected readonly columns: TableColumn[] = [\n   *   ...\n   *   { identifier: '3': field: 'rating', label: 'Rating', renderer: MyRendererComponent,\n   * ];\n   * ```\n   *\n   * ### Two-way binding\n   *\n   * An event is emitted when columns is updated. Listen to the event to persist the column configuration (e.g. store\n   * column widths when resized by the user).\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-table [(columns)]=\"columns\" (columnsChange)=\"columnsChange($event)\" ...></talenra-table>\n   * ```\n   *\n   * ```typescript\n   * // Component class\n   * protected columnsChange(columns: ITableColumn[]): void {\n   *  console.log('Columns updated', columns);\n   * }\n   * ```\n   *\n   * @see {@link ITableColumn}\n   * @see {@link ITableCellContext}\n   */\n  columns = model<ITableColumn[]>([]);\n\n  /**\n   * Table data, represented by an array of table rows.\n   *\n   * The provided data's fields are matched to the Table's columns based on the `ITableColumn`'s `field` property.\n   *\n   * ```typescript\n   * // Component class\n   * import { ITableColumn, ITableRow } from '@talenra/ngx-base/table';\n   *\n   * protected readonly columns: ITableColumn[] = [\n   *   { identifier: '0', field: 'author', label: 'Author' },\n   *   { identifier: '1', field: 'title', label: 'Title' },\n   *   { identifier: '2', field: 'isbn', label: 'ISBN' },\n   * ];\n   *\n   * protected readonly data: ITableRow[] = [\n   *   {\n   *     identifier: \"0e1ea95b-5e9b-4638-be2d-419c1455ea2e\",\n   *     author: \"Herman Melville\",\n   *     title: \"Moby-Dick; or, The Whale\",\n   *     isbn: \"978-1-530-69790-8\",\n   *   },\n   *   // ...\n   * ]\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-table [columns]=\"columns\" [data]=\"data\"></talenra-table>\n   * ```\n   *\n   * @see {@link ITableRow}\n   */\n  data = model<ITableRow[]>([]);\n\n  /**\n   * Optional custom translations to override defaults used in the UI.\n   *\n   * ```html\n   * <talenra-table ... [translations]=\"{ noEntries: 'No entries found.' }\"></talenra-table>\n   * ```\n   *\n   * @see {@link ITableTranslations}\n   */\n  translations = input<ITableTranslations>({});\n\n  /**\n   * Reference to your app's context. This is typically the component hosting the Table component.\n   *\n   * Context reference is used for data flow between cell renderer components and your app. You can safely omit it if\n   * you're not using a custom cell-renderer.\n   *\n   * ```typescript\n   * // Component class\n   * protected contextRef = this;\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-table ... [contextRef]=\"contextRef\"></talenra-table>\n   * ```\n   *\n   * @see {@link ITableCellContext}\n   */\n  contextRef = input<unknown>();\n\n  /**\n   * Determines whether the optimized responsive layout is used on small viewports.\n   *\n   * ```html\n   * <talenra-table ... useResponsiveMode><talenra-table>\n   * ```\n   */\n  useResponsiveMode = input(false, { transform: booleanAttribute });\n\n  /**\n   * Determines whether the table is currently rendered in responsive mode. Requires `useResponsiveMode` to be `true`\n   * _and_ a viewport small enough to match the media query condition.\n   *\n   * @internal\n   */\n  isResponsive: boolean = false;\n\n  /**\n   * Determines whether the table is loading data. If set to `true`, a skeleton is displayed.\n   *\n   * ```html\n   * <talenra-table ... [isLoading]=\"dataLoaded | async\"></talenra-table>\n   * ```\n   */\n  isLoading = input(false, { transform: booleanAttribute });\n\n  /**\n   * The current sort state. Input a value to pre-set sort and/or use two-way binding to update the sort state\n   * programmatically.\n   *\n   * Note that the Table component _does not sort data_. It is up to the consuming app to update data based on the sort\n   * state. Here's an implementation example.\n   *\n   * ```typescript\n   * // Component class\n   * import { ITableSortState, TableSortDirection } from '@talenra/ngx-base/table';\n   *\n   * protected sortState: ITableSortState | null = { field: 'author', direction: TableSortDirection.Ascending }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-table ... [(sortState)]=\"sortState\"></talenra-table>\n   * ```\n   *\n   * `sortStateChange` event is emitted when sortState is changed by the user. Contains the current sortState or `null`\n   * if the table is not sorted.\n   *\n   * ```typescript\n   * // Component class\n   * protected sortStateChange(sortState: ITableSortState | null): void {\n   *   // Update data based on sortState\n   * }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-table ... (sortStateChange)=\"sortStateChange($event)\"></talenra-table>\n   * ```\n   */\n  sortState = model<ITableSortState | null>(null);\n\n  /**\n   * Event emitted when a row is un-/selected. Contains the relevant row and its selection state.\n   *\n   * ```typescript\n   * // Component class\n   * protected rowSelectionChange(event: ITableRowSelectionChange): void {\n   *   console.log(`${event.row.identifier} was ${event.isSelected ? 'selected' : 'unselected'}`);\n   * }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-table ... (rowSelectionChange)=\"rowSelectionChange($event)\" selectable></talenra-table>\n   * ```\n   */\n  rowSelectionChange: OutputEmitterRef<ITableRowSelectionChange> = output<ITableRowSelectionChange>();\n\n  /**\n   * Determines whether rows are selectable or not. Supports single-row or multi-row selection.\n   *\n   * ```html\n   * <talenra-table ... selectionMode=\"single row\"></talenra-table>\n   * ```\n   *\n   * @see {@link TableSelectionMode}\n   */\n  selectionMode = input<TTableSelectionMode>(TableSelectionMode.None);\n\n  /**\n   * Determines whether row double click event is emitted. If double click support is turned on, single click (used\n   * for row selection) is slightly delayed.\n   *\n   * ```html\n   * <talenra-table ... (rowDoubleClick)=\"handleRowDoubleClick($event)\" emitRowDoubleClick></talenra-table>\n   * ```\n   */\n  emitRowDoubleClick = input(false, { transform: booleanAttribute });\n\n  /**\n   * Event emitted if a row is double clicked. Contains the relevant row and the mouse event. Requires\n   * `emitRowDoubleClick` to be set to `true`.\n   *\n   * ```html\n   * <talenra-table ... (rowDoubleClick)=\"handleRowDoubleClick($event)\" emitRowDoubleClick></talenra-table>\n   * ```\n   *\n   * @see {@link ITableRowDoubleClick}\n   */\n  rowDoubleClick = output<ITableRowDoubleClick>();\n\n  /**\n   * Array to remember alignment for each colum. Algnment data is read from input property `columns` and applied to all\n   * `th` and `td` elements.\n   */\n  protected columnAlignment = computed<TTableColumnHAlign[]>(() =>\n    this.columns().map((column) => column.hAlign || 'left')\n  );\n\n  /** Min-/max-width presets */\n  protected columnWidth = computed<{ minWidth?: string; maxWidth?: string }[]>(() =>\n    this.columns().map((column: ITableColumn) => {\n      return !column.width\n        ? { minWidth: 'auto', maxWidth: 'none' } // Default to natural width\n        : typeof column.width === 'string'\n          ? { width: column.width, minWidth: column.width, maxWidth: column.width } // Enforce string values (e.g. '10px')\n          : { minWidth: column.width.min || 'auto', maxWidth: column.width.max || 'none' }; // Set range\n    })\n  );\n\n  /**\n   * Determines whether the table header is displayed. It is displayed only if at least one of the columns has a label.\n   */\n  protected hasHeader = computed<boolean>(() => this.columns().some((column: ITableColumn) => !!column.label));\n\n  /** Instance of the scroll indicator controller. Used to show/hide scroll indicators. */\n  protected scrollIndicator!: TableScrollIndicator;\n\n  /** Reference to the scroll container. Provides a reference to the scroll element. */\n  @ViewChild(ScrollContainerComponent)\n  private scrollContainer!: ScrollContainerComponent;\n\n  /** Reference to the table head element. */\n  @ViewChild('thead', { read: ElementRef })\n  private headElmRef!: ElementRef;\n\n  /** Reference to the table body element. */\n  @ViewChild('tbody', { read: ElementRef })\n  private bodyElmRef!: ElementRef;\n\n  /** Keyboard navigation */\n  protected navigation!: TableNavigation;\n\n  /** Track whether the component or any of its children has focus. */\n  private hasFocus: boolean = false;\n\n  /** Row selection */\n  protected selection!: TableSelection;\n\n  /** Column resize */\n  protected resize!: TableResize;\n\n  /** Number of skeleton rows displayed in loading mode */\n  protected skeletonRows = Array.from({ length: 5 });\n\n  protected readonly String = String;\n  private destroyRef: DestroyRef = inject(DestroyRef);\n  private changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n  private locale: string = inject(LOCALE_ID);\n  private breakpointObserver: BreakpointObserver = inject(BreakpointObserver);\n\n  // --- Lifecycle ---\n\n  /** @internal */\n  constructor() {\n    this.selection = new TableSelection(this);\n    this.navigation = new TableNavigation(this, this.selection);\n    this.resize = new TableResize(this);\n    // Subscribe for breakpoint updates (viewport width changes)\n    this.breakpointObserver.observe(responsiveBreakpoint).subscribe(() => this.updateResponsive());\n    // Update scroll indicators when responsive changes\n    toObservable(this.useResponsiveMode)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => {\n        this.scrollIndicator?.recalculate();\n        this.updateResponsive();\n      });\n    // Update scroll indicators when isLoading changes\n    toObservable(this.isLoading)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.scrollIndicator?.recalculate());\n    // Update scroll indicators and scroll bar when columns change (column width might change)\n    toObservable(this.columns)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => {\n        this.scrollIndicator?.recalculate();\n        this.scrollContainer?.recalculate();\n      });\n    // Update scroll indicators after data has changed\n    toObservable(this.data)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => {\n        this.scrollIndicator?.recalculate();\n        this.selection.updateCheckboxState();\n      });\n    // Update checkbox state when row selection mode changed\n    toObservable(this.selectionMode)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => {\n        this.selection.updateCheckboxState();\n        this.scrollIndicator?.recalculate();\n      });\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    // Prevent ExpressionChangedAfterItHasBeenCheckedError\n    asapScheduler.schedule(() => {\n      // Create scroll indicator instance\n      this.scrollIndicator = new TableScrollIndicator(this.scrollContainer.scrollElement, this.destroyRef);\n      // Trigger change detection when scroll indicators change visibility\n      this.scrollIndicator.visibility\n        .pipe(takeUntilDestroyed(this.destroyRef))\n        .subscribe(() => this.changeDetector.markForCheck());\n    });\n    // Provide the the required template elements to the navigation controller\n    this.navigation.init(\n      this.scrollContainer.scrollElement,\n      this.headElmRef.nativeElement,\n      this.bodyElmRef.nativeElement\n    );\n    // Provide the the required template elements to the resize controller\n    this.resize.init(this.headElmRef.nativeElement, this.bodyElmRef.nativeElement);\n  }\n\n  // --- Row selection ---\n\n  /**\n   * Handler for un-/selecting rows. Used by navigation, thus exposed via API but not officially documented.\n   *\n   * @internal\n   */\n  toggleRowSelection(row: ITableRow): void {\n    this.selection.toggleRow(row);\n  }\n\n  /**\n   * Handler for pointer-triggered row selection actions. Determines behaviour based on pressed modifier key(s)\n   * (e.g. meta key).\n   */\n  protected onToggleClick(\n    row: ITableRow,\n    event: MouseEvent,\n    options: { cumulate: boolean } = { cumulate: false }\n  ): void {\n    // Update selection anchor index unless shift key is pressed\n    if (!event.shiftKey) {\n      const anchorIndex: number = this.data().indexOf(row);\n      if (anchorIndex >= 0) this.selection.selectionAnchor = anchorIndex;\n    }\n    if (this.selectionMode() === TableSelectionMode.MultiRow && event.shiftKey) {\n      // Range selection (shift key pressed in multi-row selection mode)\n      this.selection.selectRange(row);\n    } else {\n      // Single row selection\n      const modifierKeyDown: boolean = event.metaKey || event.ctrlKey;\n      this.selection.toggleRow(row, {\n        cumulate: this.selectionMode() === TableSelectionMode.MultiRow && (options.cumulate || modifierKeyDown),\n      });\n    }\n  }\n\n  /**\n   * Stores whether a relevant modifier key is pressed (e.g. shift). Used to suppress browser's text selection which\n   * leads to unwanted behavior as the shift key is used for selection.\n   */\n  private preventTextSelection: boolean = false;\n\n  /** Listener for relevant modifier keys. */\n  private updateTextSelection(event: KeyboardEvent): void {\n    this.preventTextSelection = event.type === 'keydown';\n  }\n\n  // --- Double click ---\n\n  /** Emit double click event */\n  protected onRowDoubleClick(row: ITableRow, event: MouseEvent): void {\n    this.rowDoubleClick.emit({ row, event } as ITableRowDoubleClick);\n  }\n\n  // --- Sort ---\n\n  /**\n   * Handler for sorting. Used by template and navigation. Thus exposed via API but not officially documented.\n   *\n   * @internal\n   */\n  sortBy(field: string): void {\n    if (this.resize.isResizing) return; // Skip sorting while column resize (drag) is in progress\n    const isFieldSorted: boolean = this.sortState()?.field === field;\n    this.sortState.set(\n      isFieldSorted && this.sortState()?.direction === TableSortDirection.Descending\n        ? null\n        : { field, direction: isFieldSorted ? TableSortDirection.Descending : TableSortDirection.Ascending }\n    );\n  }\n\n  /** Returns whether the given column is highlighted. Columns are highlighted if currently used for sorting. */\n  protected highlightColumn(column: ITableColumn): boolean {\n    return !!column.sortable && this.sortState()?.field === column.field;\n  }\n\n  // --- Navigation & keyboard shortcuts ---\n\n  /** Keep track of host element's focus */\n  private trackFocus(event: FocusEvent): void {\n    this.hasFocus = event.type === 'focusin';\n  }\n\n  private handleKeydown(event: KeyboardEvent): void {\n    this.navigation.handleKeydown(event);\n  }\n\n  /** Delegate copy-to-clipboard requests to keyboard navigation controller. */\n  private copyToClipboard(event: KeyboardEvent): void {\n    if (!this.hasFocus) return;\n    const platform: TPlatform = getPlatform();\n    // Mimic behavior of the current platform: Exit early if modifier key does not match operating system default\n    if (platform === Platform.MacOS && !event.metaKey) return;\n    if (platform !== Platform.MacOS && !event.ctrlKey) return;\n    // Finally copy the focused value to clipboard\n    this.navigation.copyToClipboard();\n  }\n\n  // --- Responsive mode ---\n\n  /** Checks whether the table is currently rendered in responsive mode and updates `isResponsive` accordingly. */\n  private updateResponsive(): void {\n    this.isResponsive = this.useResponsiveMode() && this.breakpointObserver.isMatched(responsiveBreakpoint);\n  }\n\n  // --- Template helpers ---\n\n  /** Returns a translated string or – if available – an override. */\n  protected translate(key: string): string {\n    return { ...translations[this.locale as TLocale], ...this.translations() }[key] || '';\n  }\n\n  /** Returns the number of columns of the table. Adds an extra column if in multi-row-selection mode (checkboxes). */\n  protected get columnCount(): number {\n    return this.columns().length + (this.selectionMode() === TableSelectionMode.MultiRow ? 1 : 0);\n  }\n}\n","<talenra-scroll-container>\n  <table>\n    <thead #thead>\n      <tr [class.loading]=\"isLoading()\">\n        @if (hasHeader()) {\n          @if (isLoading()) {\n            <th [attr.colspan]=\"columnCount\">\n              <talenra-skeleton class=\"skeleton-row\" />\n            </th>\n          } @else {\n            @if (selectionMode() === 'multi row') {\n              <th class=\"checkbox-cell\" [attr.tabindex]=\"0\" (focusin)=\"navigation.onFocus({ row: -1, col: -1 })\">\n                <talenra-checkbox\n                  [(ngModel)]=\"selection.selectAllChecked\"\n                  [indeterminate]=\"selection.selectAllIndeterminate\"\n                  (click)=\"selection.selectAllRows()\"\n                  [disabled]=\"!data().length\" />\n                <div class=\"th-separator\"></div>\n              </th>\n            }\n            @for (column of columns(); track column.identifier) {\n              <th\n                [talenraTooltip]=\"column.label ? column.label : ''\"\n                [talenraTooltipDisabled]=\"cellMask.clientWidth === cellMask.scrollWidth\"\n                [attr.tabindex]=\"0\"\n                [class.highlight]=\"highlightColumn(column)\"\n                [class.sortable]=\"column.sortable\"\n                [style]=\"columnWidth()[$index]\"\n                (mouseout)=\"navigation.onHover(null)\"\n                (mouseover)=\"navigation.onHover({ row: -1, col: $index })\"\n                (focusin)=\"navigation.onFocus({ row: -1, col: $index })\"\n                (click)=\"column.sortable && sortBy(column.field)\">\n                <div class=\"cell-mask\" #cellMask>\n                  @if (column.sortable) {\n                    <div class=\"th-container\">\n                      <span class=\"th-label\">{{ column.label }}</span>\n                      <talenra-icon\n                        class=\"th-icon\"\n                        [name]=\"\n                          sortState()?.field !== column.field ? 'sort' : 'sort-' + sortState()?.direction + '-duplex'\n                        \" />\n                    </div>\n                  } @else {\n                    <span class=\"th-label\">{{ column.label }}</span>\n                  }\n                </div>\n                <div class=\"th-separator\"></div>\n                @if (column.resizable) {\n                  <div\n                    class=\"th-resize-handle\"\n                    (click)=\"resize.clicked($event)\"\n                    cdkDrag\n                    cdkDragLockAxis=\"x\"\n                    (cdkDragStarted)=\"resize.dragStarted($index)\"\n                    (cdkDragMoved)=\"resize.dragMoved($index, $event)\"\n                    (cdkDragEnded)=\"resize.dragEnded($index, $event)\"></div>\n                }\n                <talenra-field-underline\n                  class=\"th-underline\"\n                  [hasFocus]=\"column.sortable && navigation.isFieldHovered({ row: -1, col: $index })\" />\n              </th>\n            }\n          }\n        }\n      </tr>\n    </thead>\n    <tbody #tbody>\n      @if (isLoading()) {\n        @for (skeletonRow of skeletonRows; track $index) {\n          <tr class=\"loading\">\n            <td [attr.colspan]=\"columnCount\">\n              <talenra-skeleton class=\"skeleton-row\"></talenra-skeleton>\n            </td>\n          </tr>\n        }\n      } @else if (!data().length) {\n        <tr>\n          <td [attr.colspan]=\"columnCount\">\n            <talenra-message kind=\"ghost\" size=\"s\">{{ translate('noEntries') }}</talenra-message>\n          </td>\n        </tr>\n      } @else {\n        @for (row of data(); track row.identifier; let rowIndex = $index) {\n          <tr [class.selected]=\"row.isSelected\" [class.hover]=\"navigation.isRowHovered(rowIndex)\">\n            @if (selectionMode() === 'multi row') {\n              <td class=\"checkbox-cell\" [attr.tabindex]=\"1\" (focusin)=\"navigation.onFocus({ row: rowIndex, col: -1 })\">\n                <talenra-checkbox\n                  pointerDisabled\n                  [ngModel]=\"row.isSelected\"\n                  (click)=\"onToggleClick(row, $event, { cumulate: true })\" />\n              </td>\n            }\n            @for (column of columns(); track column.identifier; let colIndex = $index) {\n              <ng-template #cell>\n                @if (column.renderer) {\n                  <ng-container\n                    talenraTableCellRenderer\n                    [contextRef]=\"contextRef()\"\n                    [column]=\"column\"\n                    [row]=\"row\"\n                    [cell]=\"row[column.field]\" />\n                } @else {\n                  {{ row[column.field] }}\n                }\n              </ng-template>\n              <td\n                #cellTd\n                [talenraTooltip]=\"String(row[column.field])\"\n                [talenraTooltipDisabled]=\"cellTd.clientWidth === cellTd.scrollWidth\"\n                [attr.tabindex]=\"column.renderer ? 1 : 0\"\n                [class.highlight]=\"highlightColumn(column)\"\n                [class.custom-renderer]=\"column.renderer\"\n                [style]=\"columnWidth()[$index]\"\n                [class]=\"'align--' + columnAlignment()[colIndex]\"\n                (mouseout)=\"!column.disableRowSelection && navigation.onHover(null)\"\n                (mouseover)=\"!column.disableRowSelection && navigation.onHover({ row: rowIndex, col: colIndex })\"\n                (focusin)=\"navigation.onFocus({ row: rowIndex, col: colIndex })\"\n                (click)=\"!emitRowDoubleClick() && !column.disableRowSelection && onToggleClick(row, $event)\"\n                (singleClick)=\"emitRowDoubleClick() && !column.disableRowSelection && onToggleClick(row, $event)\"\n                (doubleClick)=\"emitRowDoubleClick() && !column.disableRowSelection && onRowDoubleClick(row, $event)\">\n                @if (useResponsiveMode()) {\n                  <span class=\"responsive-th\">{{ column.label }}</span>\n                  <span><ng-container *ngTemplateOutlet=\"cell\" /></span>\n                } @else {\n                  <ng-container *ngTemplateOutlet=\"cell\" />\n                }\n              </td>\n            }\n          </tr>\n        }\n      }\n    </tbody>\n  </table>\n</talenra-scroll-container>\n","import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChild } from '@angular/core';\nimport { PaginatorComponent } from '@talenra/ngx-base/paginator';\nimport { SearchInputComponent } from '@talenra/ngx-base/search';\n\n/**\n * TableToolbar is a wrapper component for SearchField and Paginator components while both are optional. It is used in\n * context of a Table component and takes care of the layout. SearchField and Paginator are provided by the consuming\n * app which is also responsible to handle the respective events and to implement the required logic.\n *\n * ```html\n * <talenra-table-toolbar>\n *   <talenra-search-field showIcon>\n *     <input talenra-search [(ngModel)]=\"filterQuery\" (ngModelChange)=\"filterData()\" />\n *   </talenra-search-field>\n *   <talenra-paginator [(state)]=\"paginatorState\" (stateChange)=\"paginate()\"></talenra-paginator>\n * </talenra-table-toolbar>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { TableToolbarComponent } from '@talenra/ngx-base/table';\n * ```\n *\n * <example-url>../../#/table</example-url>\n */\n@Component({\n  selector: 'talenra-table-toolbar',\n  templateUrl: './table-toolbar.component.html',\n  styleUrl: './table-toolbar.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '[class.has-search]': '!!searchInput',\n    '[class.has-paginator]': '!!paginator',\n  },\n})\nexport class TableToolbarComponent implements AfterContentInit {\n  @ContentChild(SearchInputComponent) private searchInput?: SearchInputComponent;\n  @ContentChild(PaginatorComponent) private paginator?: PaginatorComponent;\n\n  /** @internal */\n  ngAfterContentInit(): void {\n    if (this.searchInput) this.searchInput.kind = 'no-indent';\n  }\n}\n","<div class=\"container\">\n  <ng-content />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}