{"version":3,"file":"ngx-core-components-views.mjs","sources":["../../../projects/ngx-core-components/views/tree-view/tree-view.component.ts","../../../projects/ngx-core-components/views/list-view/list-view.component.ts","../../../projects/ngx-core-components/views/kanban/kanban.component.ts","../../../projects/ngx-core-components/views/timeline/timeline.component.ts","../../../projects/ngx-core-components/views/scheduler/scheduler.component.ts","../../../projects/ngx-core-components/views/virtual-list/virtual-list.component.ts","../../../projects/ngx-core-components/views/image-compare/image-compare.component.ts","../../../projects/ngx-core-components/views/key-value-list/key-value-list.component.ts","../../../projects/ngx-core-components/views/org-chart/org-chart.component.ts","../../../projects/ngx-core-components/views/json-viewer/json-viewer.component.ts","../../../projects/ngx-core-components/views/calendar/calendar.component.ts","../../../projects/ngx-core-components/views/public-api.ts","../../../projects/ngx-core-components/views/ngx-core-components-views.ts"],"sourcesContent":["import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed, OnInit\n} from '@angular/core';\nimport { NgTemplateOutlet, CommonModule } from '@angular/common';\n\nexport interface TreeNode {\n  id: string;\n  label: string;\n  icon?: string;\n  children?: TreeNode[];\n  hasChildren?: boolean;\n  disabled?: boolean;\n  data?: unknown;\n}\n\nexport interface TreeNodeEvent { node: TreeNode; }\n\n@Component({\n  selector: 'ngx-tree-view',\n  standalone: true,\n  imports: [CommonModule, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-tree-wrapper\" [class.dark]=\"theme() === 'dark'\">\n      <!-- Search Panel -->\n      @if (showSearch()) {\n        <div class=\"tree-search-bar\">\n          <input\n            type=\"text\"\n            class=\"tree-search-input\"\n            [placeholder]=\"searchPlaceholder()\"\n            [value]=\"searchQuery()\"\n            (input)=\"onSearchInput($event)\"\n          />\n          @if (searchQuery()) {\n            <button class=\"tree-clear-btn\" (click)=\"clearSearch()\">✕</button>\n          }\n        </div>\n      }\n\n      <!-- Tree Nodes Scroll Container -->\n      <div class=\"ngx-tree-view\" role=\"tree\" (keydown)=\"onKeyDown($event)\" tabindex=\"0\">\n        @for (node of filteredNodes(); track node.id) {\n          <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: node, depth: 0 }\"/>\n        }\n\n        <ng-template #nodeTemplate let-node=\"node\" let-depth=\"depth\">\n          <div\n            class=\"tree-node\"\n            [class.selected]=\"selectedId() === node.id\"\n            [class.focused]=\"focusedId() === node.id\"\n            [class.disabled]=\"node.disabled\"\n            role=\"treeitem\"\n            [attr.aria-expanded]=\"isExpanded(node.id)\"\n            [attr.aria-selected]=\"selectedId() === node.id\"\n            [attr.aria-disabled]=\"node.disabled || null\"\n            (click)=\"!node.disabled && onNodeClick(node, $event)\"\n          >\n            <!-- Expand/collapse -->\n            @if (hasNodeChildren(node)) {\n              <button\n                class=\"tree-expand-btn\"\n                (click)=\"toggleExpand(node, $event)\"\n                [attr.aria-label]=\"isExpanded(node.id) ? 'Collapse' : 'Expand'\"\n              >\n                <span class=\"expand-icon\" [class.expanded]=\"isExpanded(node.id)\">&#9654;</span>\n              </button>\n            } @else {\n              <span class=\"tree-leaf-spacer\"></span>\n            }\n\n            <!-- Checkbox -->\n            @if (checkable()) {\n              <input\n                type=\"checkbox\"\n                class=\"tree-checkbox\"\n                [checked]=\"isChecked(node.id)\"\n                [indeterminate]=\"isIndeterminate(node.id)\"\n                (change)=\"onCheck(node)\"\n                (click)=\"$event.stopPropagation()\"\n              />\n            }\n\n            <!-- Icon -->\n            @if (node.icon) {\n              <span class=\"tree-icon\">{{ node.icon }}</span>\n            }\n\n            <!-- Label -->\n            <span class=\"tree-label\">{{ node.label }}</span>\n\n            <!-- Inline Hover Actions -->\n            @if (showActions() && !node.disabled) {\n              <div class=\"tree-node-actions\" (click)=\"$event.stopPropagation()\">\n                <button class=\"action-btn add\" (click)=\"onAction(node, 'add')\" title=\"Add Subnode\">➕</button>\n                <button class=\"action-btn edit\" (click)=\"onAction(node, 'edit')\" title=\"Edit Node\">✏️</button>\n                <button class=\"action-btn delete\" (click)=\"onAction(node, 'delete')\" title=\"Delete Node\">🗑️</button>\n              </div>\n            }\n          </div>\n\n          <!-- Nested Children with गाइड Lines -->\n          @if (isExpanded(node.id) && node.children) {\n            <div class=\"tree-node-children-group\">\n              @for (child of node.children; track child.id) {\n                <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: child, depth: depth + 1 }\"/>\n              }\n            </div>\n          }\n        </ng-template>\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    .ngx-tree-wrapper {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n      width: 100%;\n    }\n\n    /* Search Bar Input */\n    .tree-search-bar {\n      position: relative;\n      display: flex;\n      align-items: center;\n      width: 100%;\n    }\n    .tree-search-input {\n      width: 100%;\n      padding: 8px 32px 8px 12px;\n      font-size: 13px;\n      border: 1px solid var(--border-color, #cbd5e1);\n      border-radius: 8px;\n      outline: none;\n      background: var(--bg-secondary, #ffffff);\n      color: var(--text-primary, #0f172a);\n      transition: all 0.2s ease;\n    }\n    .tree-search-input:focus {\n      border-color: var(--primary-color, #4f46e5);\n      box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.12);\n    }\n    .tree-clear-btn {\n      position: absolute;\n      right: 10px;\n      background: none;\n      border: none;\n      cursor: pointer;\n      color: #94a3b8;\n      font-size: 11px;\n      padding: 4px;\n    }\n    .tree-clear-btn:hover {\n      color: #64748b;\n    }\n\n    /* Tree View Main Container */\n    .ngx-tree-view {\n      background: var(--bg-primary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 8px;\n      overflow-y: auto;\n      max-height: 480px;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      outline: none;\n    }\n\n    .dark .ngx-tree-view {\n      background: var(--bg-secondary, #1e293b);\n      border-color: rgba(255, 255, 255, 0.08);\n    }\n\n    /* Tree Node Item Row */\n    .tree-node {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      height: 34px;\n      padding: 0 8px;\n      cursor: pointer;\n      user-select: none;\n      border-radius: 8px;\n      margin: 1px 0;\n      transition: background 0.15s ease, color 0.15s ease;\n      position: relative;\n    }\n    .tree-node:hover {\n      background: rgba(15, 23, 42, 0.04);\n    }\n    .dark .tree-node:hover {\n      background: rgba(255, 255, 255, 0.04);\n    }\n\n    .tree-node.selected {\n      background: rgba(79, 70, 229, 0.08);\n      color: var(--primary-color, #4f46e5);\n    }\n    .dark .tree-node.selected {\n      background: rgba(99, 102, 241, 0.16);\n      color: #818cf8;\n    }\n\n    .tree-node.focused {\n      box-shadow: inset 0 0 0 1.5px var(--primary-color, #4f46e5);\n    }\n    .tree-node.disabled {\n      opacity: 0.45;\n      cursor: not-allowed;\n      pointer-events: none;\n    }\n\n    /* Expand button */\n    .tree-expand-btn {\n      width: 20px;\n      height: 20px;\n      background: none;\n      border: none;\n      cursor: pointer;\n      padding: 0;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex-shrink: 0;\n      border-radius: 4px;\n      color: #94a3b8;\n      transition: background 0.15s;\n    }\n    .tree-expand-btn:hover {\n      background: rgba(15, 23, 42, 0.08);\n      color: #475569;\n    }\n    .dark .tree-expand-btn:hover {\n      background: rgba(255, 255, 255, 0.08);\n      color: #cbd5e1;\n    }\n    .expand-icon {\n      font-size: 8px;\n      transition: transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);\n      display: inline-block;\n    }\n    .expand-icon.expanded {\n      transform: rotate(90deg);\n    }\n\n    .tree-leaf-spacer {\n      width: 20px;\n      flex-shrink: 0;\n    }\n\n    /* Tri-state Checkbox */\n    .tree-checkbox {\n      width: 14px;\n      height: 14px;\n      cursor: pointer;\n      flex-shrink: 0;\n      accent-color: var(--primary-color, #4f46e5);\n      border-radius: 4px;\n    }\n\n    .tree-icon {\n      font-size: 14px;\n      flex-shrink: 0;\n    }\n\n    .tree-label {\n      font-size: 13px;\n      color: var(--text-primary, #1e293b);\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      flex: 1;\n    }\n    .selected .tree-label {\n      font-weight: 600;\n    }\n    .dark .tree-label {\n      color: #cbd5e1;\n    }\n\n    /* Inline action buttons */\n    .tree-node-actions {\n      display: none;\n      align-items: center;\n      gap: 4px;\n      margin-left: auto;\n      padding-left: 8px;\n    }\n    .tree-node:hover .tree-node-actions {\n      display: flex;\n    }\n    .action-btn {\n      background: none;\n      border: none;\n      cursor: pointer;\n      font-size: 10px;\n      padding: 4px;\n      border-radius: 4px;\n      transition: all 0.15s;\n      opacity: 0.65;\n    }\n    .action-btn:hover {\n      opacity: 1;\n      background: rgba(15, 23, 42, 0.08);\n    }\n    .dark .action-btn:hover {\n      background: rgba(255, 255, 255, 0.08);\n    }\n\n    /* Nesting Guide Lines */\n    .tree-node-children-group {\n      position: relative;\n      border-left: 1px solid rgba(15, 23, 42, 0.08);\n      margin-left: 17px; /* Aligns with the center of the expand button */\n      padding-left: 10px;\n    }\n\n    .dark .tree-node-children-group {\n      border-left-color: rgba(255, 255, 255, 0.08);\n    }\n  `]\n})\nexport class TreeViewComponent implements OnInit {\n  nodes = input<TreeNode[]>([]);\n  selectable = input<boolean>(true);\n  checkable = input<boolean>(false);\n  selectedId = input<string | null>(null);\n  expandedIds = input<string[]>([]);\n  showSearch = input<boolean>(false);\n  searchPlaceholder = input<string>('Search nodes...');\n  showActions = input<boolean>(false);\n  theme = input<'light' | 'dark'>('light');\n\n  // Outputs\n  nodeSelect = output<TreeNodeEvent>();\n  nodeExpand = output<TreeNodeEvent>();\n  nodeCollapse = output<TreeNodeEvent>();\n  checkChange = output<{ node: TreeNode; checked: boolean }>();\n  actionClick = output<{ node: TreeNode; action: 'add' | 'edit' | 'delete' }>();\n\n  // State Signals\n  private expandedSet = signal<Set<string>>(new Set());\n  private checkedSet = signal<Set<string>>(new Set());\n  private indeterminateSet = signal<Set<string>>(new Set());\n  focusedId = signal<string | null>(null);\n  searchQuery = signal<string>('');\n\n  ngOnInit(): void {\n    // Sync initial expanded ids\n    if (this.expandedIds().length > 0) {\n      this.expandedSet.set(new Set(this.expandedIds()));\n    }\n    this.updateAncestorCheckStates();\n  }\n\n  isExpanded(id: string): boolean {\n    return this.expandedSet().has(id) || this.expandedIds().includes(id);\n  }\n\n  isChecked(id: string): boolean {\n    return this.checkedSet().has(id);\n  }\n\n  isIndeterminate(id: string): boolean {\n    return this.indeterminateSet().has(id);\n  }\n\n  hasNodeChildren(node: TreeNode): boolean {\n    return !!(node.children?.length || node.hasChildren);\n  }\n\n  // Computed signal that filters the nodes reactively based on searchQuery\n  filteredNodes = computed(() => {\n    const query = this.searchQuery().trim().toLowerCase();\n    if (!query) {\n      return this.nodes();\n    }\n\n    const expanded = new Set(this.expandedSet());\n\n    const filterList = (list: TreeNode[]): { match: TreeNode[]; hasMatch: boolean } => {\n      const match: TreeNode[] = [];\n      let hasAnyMatch = false;\n\n      for (const node of list) {\n        const matchesSelf = node.label.toLowerCase().includes(query);\n        let childrenMatches: TreeNode[] = [];\n        let hasChildrenMatch = false;\n\n        if (node.children) {\n          const res = filterList(node.children);\n          childrenMatches = res.match;\n          hasChildrenMatch = res.hasMatch;\n        }\n\n        if (matchesSelf || hasChildrenMatch) {\n          hasAnyMatch = true;\n          // Auto-expand paths to matching elements\n          if (hasChildrenMatch) {\n            expanded.add(node.id);\n          }\n          match.push({\n            ...node,\n            children: node.children ? childrenMatches : undefined\n          });\n        }\n      }\n\n      return { match, hasMatch: hasAnyMatch };\n    };\n\n    const result = filterList(this.nodes()).match;\n\n    // Trigger expansion outside signal computation loop\n    setTimeout(() => {\n      this.expandedSet.set(expanded);\n    }, 0);\n\n    return result;\n  });\n\n  onSearchInput(event: Event): void {\n    const val = (event.target as HTMLInputElement).value;\n    this.searchQuery.set(val);\n  }\n\n  clearSearch(): void {\n    this.searchQuery.set('');\n  }\n\n  onNodeClick(node: TreeNode, e: MouseEvent): void {\n    e.stopPropagation();\n    this.focusedId.set(node.id);\n    if (this.selectable()) {\n      this.nodeSelect.emit({ node });\n    }\n  }\n\n  toggleExpand(node: TreeNode, e: MouseEvent): void {\n    e.stopPropagation();\n    const s = new Set(this.expandedSet());\n    if (s.has(node.id)) {\n      s.delete(node.id);\n      this.nodeCollapse.emit({ node });\n    } else {\n      s.add(node.id);\n      this.nodeExpand.emit({ node });\n    }\n    this.expandedSet.set(s);\n  }\n\n  onCheck(node: TreeNode): void {\n    const s = new Set(this.checkedSet());\n    const checked = !s.has(node.id);\n\n    // Recursively check/uncheck descendants\n    const toggleDescendants = (n: TreeNode, checkVal: boolean) => {\n      if (checkVal) {\n        s.add(n.id);\n      } else {\n        s.delete(n.id);\n      }\n      if (n.children) {\n        for (const child of n.children) {\n          toggleDescendants(child, checkVal);\n        }\n      }\n    };\n\n    toggleDescendants(node, checked);\n    this.checkedSet.set(s);\n\n    // Calculate indeterminate and checked states up the chain\n    this.updateAncestorCheckStates();\n\n    this.checkChange.emit({ node, checked });\n  }\n\n  updateAncestorCheckStates() {\n    const checked = new Set(this.checkedSet());\n    const indeterminate = new Set<string>();\n\n    const evaluate = (n: TreeNode): 'checked' | 'unchecked' | 'indeterminate' => {\n      if (!n.children || n.children.length === 0) {\n        return checked.has(n.id) ? 'checked' : 'unchecked';\n      }\n\n      let checkedCount = 0;\n      let indeterminateCount = 0;\n\n      for (const child of n.children) {\n        const state = evaluate(child);\n        if (state === 'checked') checkedCount++;\n        else if (state === 'indeterminate') indeterminateCount++;\n      }\n\n      if (checkedCount === n.children.length) {\n        checked.add(n.id);\n        indeterminate.delete(n.id);\n        return 'checked';\n      } else if (checkedCount > 0 || indeterminateCount > 0) {\n        checked.delete(n.id);\n        indeterminate.add(n.id);\n        return 'indeterminate';\n      } else {\n        checked.delete(n.id);\n        indeterminate.delete(n.id);\n        return 'unchecked';\n      }\n    };\n\n    for (const root of this.nodes()) {\n      evaluate(root);\n    }\n\n    this.checkedSet.set(checked);\n    this.indeterminateSet.set(indeterminate);\n  }\n\n  onAction(node: TreeNode, action: 'add' | 'edit' | 'delete'): void {\n    this.actionClick.emit({ node, action });\n  }\n\n  onKeyDown(e: KeyboardEvent): void {\n    const flat = this.flatVisibleIds();\n    const cur = this.focusedId();\n    const idx = flat.indexOf(cur ?? '');\n    if (e.key === 'ArrowDown') {\n      e.preventDefault();\n      if (idx < flat.length - 1) this.focusedId.set(flat[idx + 1]);\n    }\n    if (e.key === 'ArrowUp') {\n      e.preventDefault();\n      if (idx > 0) this.focusedId.set(flat[idx - 1]);\n    }\n    if (e.key === 'Enter' || e.key === ' ') {\n      if (cur) {\n        const node = this.findNode(cur, this.nodes());\n        if (node) {\n          this.nodeSelect.emit({ node });\n        }\n      }\n    }\n  }\n\n  private flatVisibleIds(): string[] {\n    const ids: string[] = [];\n    const collect = (nodes: TreeNode[]) => {\n      for (const n of nodes) {\n        ids.push(n.id);\n        if (this.isExpanded(n.id) && n.children) collect(n.children);\n      }\n    };\n    collect(this.filteredNodes());\n    return ids;\n  }\n\n  private findNode(id: string, nodes: TreeNode[]): TreeNode | null {\n    for (const n of nodes) {\n      if (n.id === id) return n;\n      if (n.children) {\n        const found = this.findNode(id, n.children);\n        if (found) return found;\n      }\n    }\n    return null;\n  }\n\n  /** Expand all nodes that have children. */\n  expandAll(): void {\n    const ids = new Set<string>();\n    const collect = (nodes: TreeNode[]) => {\n      for (const n of nodes) {\n        if (this.hasNodeChildren(n)) {\n          ids.add(n.id);\n          if (n.children) collect(n.children);\n        }\n      }\n    };\n    collect(this.nodes());\n    this.expandedSet.set(ids);\n  }\n\n  /** Collapse all nodes. */\n  collapseAll(): void {\n    this.expandedSet.set(new Set());\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, signal, computed, effect,\n  ContentChild, TemplateRef, inject\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\n\nexport interface ListViewItemClickEvent<T = unknown> { item: T; index: number; }\nexport interface ListViewSelectionEvent<T = unknown> { selectedItems: T[]; }\nexport interface ListViewPageChangeEvent {\n  page: number;\n  pageSize: number;\n  totalItems: number;\n  totalPages: number;\n}\n\n@Component({\n  selector: 'ngx-list-view',\n  standalone: true,\n  imports: [NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-list-view\">\n      <!-- Header slot -->\n      <ng-content select=\"[listHeader]\"/>\n\n      <!-- Loading -->\n      @if (loading()) {\n        <div class=\"lv-loading\">\n          <div class=\"lv-spinner\"></div>\n          <span>{{ i18n.common.loading }}</span>\n        </div>\n      } @else if (totalItems() === 0) {\n        <div class=\"lv-empty\">{{ i18n.common.noData }}</div>\n      } @else {\n        <div class=\"lv-list\" role=\"listbox\" [attr.aria-multiselectable]=\"multiselect()\">\n          @for (item of visibleItems(); track trackFn(item, pageStartIndex() + $index); let i = $index) {\n            <div\n              class=\"lv-item\"\n              [class.lv-alt]=\"(pageStartIndex() + i) % 2 === 1\"\n              [class.lv-selected]=\"isSelected(item)\"\n              role=\"option\"\n              [attr.aria-selected]=\"isSelected(item)\"\n              (click)=\"onItemClick(item, pageStartIndex() + i)\"\n            >\n              @if (itemTemplate) {\n                <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: pageStartIndex() + i }\"/>\n              } @else {\n                <span class=\"lv-default-text\">{{ getLabel(item) }}</span>\n              }\n            </div>\n          }\n        </div>\n\n        @if (pageSize() > 0 && totalPages() > 1) {\n          <div class=\"lv-pager\">\n            <button class=\"lv-pager-btn\" type=\"button\" [disabled]=\"currentPage() === 1\" (click)=\"goToPreviousPage()\">{{ i18n.pagination.previousPage }}</button>\n            <div class=\"lv-pager-meta\">{{ i18n.pagination.page }} {{ currentPage() }} {{ i18n.pagination.of }} {{ totalPages() }} <span class=\"lv-pager-count\">{{ totalItems() }} items</span></div>\n            <button class=\"lv-pager-btn\" type=\"button\" [disabled]=\"currentPage() === totalPages()\" (click)=\"goToNextPage()\">{{ i18n.pagination.nextPage }}</button>\n          </div>\n        }\n      }\n\n      <!-- Footer slot -->\n      <ng-content select=\"[listFooter]\"/>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-list-view {\n      border: 1px solid var(--ngx-list-border, #dee2e6); border-radius: var(--ngx-list-radius, 4px);\n      background: var(--ngx-list-bg, #fff); overflow: hidden; font-family: inherit;\n    }\n    .lv-list { overflow-y: auto; }\n    .lv-item {\n      padding: 10px 16px; cursor: pointer; border-bottom: 1px solid var(--ngx-list-border, #dee2e6);\n      transition: background 0.1s; color: var(--ngx-list-text, #212529); font-size: 13px;\n    }\n    .lv-item:last-child { border-bottom: none; }\n    .lv-item:hover { background: var(--ngx-list-hover-bg, #f1f3f5); }\n    .lv-item.lv-alt { background: var(--ngx-list-alt-bg, #f8f9fa); }\n    .lv-item.lv-alt:hover { background: var(--ngx-list-hover-bg, #f1f3f5); }\n    .lv-item.lv-selected { background: var(--ngx-list-selected-bg, #e8f0fe); color: var(--ngx-list-selected-color, #1a73e8); font-weight: 500; }\n    .lv-item.lv-selected:hover { background: var(--ngx-list-selected-bg, #e8f0fe); }\n    .lv-default-text { display: block; }\n    .lv-loading, .lv-empty {\n      display: flex; align-items: center; justify-content: center; gap: 8px;\n      padding: 32px; color: #adb5bd; font-size: 13px;\n    }\n    .lv-spinner {\n      width: 20px; height: 20px; border: 2px solid #dee2e6; border-top-color: #4a90d9;\n      border-radius: 50%; animation: spin 0.7s linear infinite;\n    }\n    .lv-pager {\n      display: flex; align-items: center; justify-content: space-between; gap: 12px;\n      padding: 10px 14px; border-top: 1px solid var(--ngx-list-border, #dee2e6); background: #fafbfc;\n    }\n    .lv-pager-btn {\n      border: 1px solid #ced4da; background: #fff; color: #495057; border-radius: 4px;\n      padding: 6px 10px; font-size: 12px; cursor: pointer; font-family: inherit;\n    }\n    .lv-pager-btn:hover:not(:disabled) { background: #f1f3f5; }\n    .lv-pager-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n    .lv-pager-meta { font-size: 12px; color: #495057; }\n    .lv-pager-count { color: #6c757d; }\n    @keyframes spin { to { transform: rotate(360deg); } }\n  `]\n})\nexport class ListViewComponent<T = unknown> {\n  i18n = inject(NGX_CORE_I18N);\n\n  items = input<T[]>([]);\n  selectable = input<boolean>(true);\n  multiselect = input<boolean>(false);\n  loading = input<boolean>(false);\n  labelField = input<string>('label');\n  pageSize = input<number>(0);\n\n  itemClick = output<ListViewItemClickEvent<T>>();\n  selectionChange = output<ListViewSelectionEvent<T>>();\n  pageChange = output<ListViewPageChangeEvent>();\n\n  @ContentChild('itemTemplate') itemTemplate?: TemplateRef<{ $implicit: T; index: number }>;\n\n  selectedItems = signal<Set<T>>(new Set());\n  currentPage = signal(1);\n  totalItems = computed(() => this.items().length);\n  totalPages = computed(() => {\n    const size = this.pageSize();\n    if (size <= 0) {\n      return this.totalItems() > 0 ? 1 : 0;\n    }\n    return Math.max(1, Math.ceil(this.totalItems() / size));\n  });\n  pageStartIndex = computed(() => this.pageSize() > 0 ? (this.currentPage() - 1) * this.pageSize() : 0);\n  visibleItems = computed(() => {\n    const size = this.pageSize();\n    if (size <= 0) {\n      return this.items();\n    }\n\n    return this.items().slice(this.pageStartIndex(), this.pageStartIndex() + size);\n  });\n\n  constructor() {\n    effect(() => {\n      if (this.pageSize() <= 0) {\n        if (this.currentPage() !== 1) {\n          this.currentPage.set(1);\n        }\n        return;\n      }\n\n      const maxPage = this.totalPages();\n      if (maxPage > 0 && this.currentPage() > maxPage) {\n        this.currentPage.set(maxPage);\n        this.emitPageChange();\n      }\n    });\n  }\n\n  isSelected(item: T): boolean { return this.selectedItems().has(item); }\n\n  onItemClick(item: T, index: number): void {\n    this.itemClick.emit({ item, index });\n    if (!this.selectable()) return;\n    const s = new Set(this.selectedItems());\n    if (this.multiselect()) {\n      s.has(item) ? s.delete(item) : s.add(item);\n    } else {\n      if (s.has(item) && s.size === 1) s.clear();\n      else { s.clear(); s.add(item); }\n    }\n    this.selectedItems.set(s);\n    this.selectionChange.emit({ selectedItems: [...s] });\n  }\n\n  goToPreviousPage(): void {\n    this.setPage(this.currentPage() - 1);\n  }\n\n  goToNextPage(): void {\n    this.setPage(this.currentPage() + 1);\n  }\n\n  private setPage(page: number): void {\n    const nextPage = Math.max(1, Math.min(this.totalPages(), page));\n    if (nextPage === this.currentPage()) {\n      return;\n    }\n\n    this.currentPage.set(nextPage);\n    this.emitPageChange();\n  }\n\n  private emitPageChange(): void {\n    this.pageChange.emit({\n      page: this.currentPage(),\n      pageSize: this.pageSize(),\n      totalItems: this.totalItems(),\n      totalPages: this.totalPages(),\n    });\n  }\n\n  getLabel(item: T): string {\n    if (typeof item === 'string' || typeof item === 'number') return String(item);\n    const r = item as Record<string, unknown>;\n    return String(r[this.labelField()] ?? r['label'] ?? r['name'] ?? r['title'] ?? JSON.stringify(item));\n  }\n\n  trackFn(item: T, index: number): string {\n    if (typeof item === 'object' && item !== null) {\n      const r = item as Record<string, unknown>;\n      return String(r['id'] ?? r['key'] ?? index);\n    }\n    return String(index);\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  QueryList,\n  ViewChildren,\n  computed,\n  effect,\n  input,\n  output,\n  signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  KanbanCard,\n  KanbanCardMoveEvent,\n  KanbanColumn,\n  KanbanMoveRejectedEvent,\n  KanbanSwimlane,\n} from './models';\n\nconst DEFAULT_LANE_ID = '__default__';\n\ninterface SwimlaneSection {\n  id: string;\n  title: string;\n  description?: string;\n  isDefault: boolean;\n}\n\n@Component({\n  selector: 'ngx-kanban',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-kanban-board\" [class.has-swimlanes]=\"swimlaneSections().length > 1\">\n      @for (lane of swimlaneSections(); track lane.id) {\n        <section class=\"kanban-swimlane\">\n          @if (!lane.isDefault) {\n            <header class=\"swimlane-header\">\n              <div>\n                <h3>{{ lane.title }}</h3>\n                @if (lane.description) { <p>{{ lane.description }}</p> }\n              </div>\n            </header>\n          }\n\n          <div class=\"kanban-columns\">\n            @for (col of columns(); track col.id) {\n              <div\n                class=\"kanban-column\"\n                [class.drag-over]=\"activeDropTarget() === dropKey(col.id, lane.id)\"\n                [class.wip-reached]=\"isWipReached(col.id, lane.id)\"\n                (dragover)=\"onColumnDragOver($event, col.id, lane.id)\"\n                (dragenter)=\"activeDropTarget.set(dropKey(col.id, lane.id))\"\n                (dragleave)=\"onDragLeave(col.id, lane.id)\"\n                (drop)=\"onColumnDrop($event, col.id, lane.id)\"\n              >\n                <div class=\"column-header\" [style.border-top-color]=\"col.color || 'var(--primary-color)'\">\n                  <div class=\"column-title-section\">\n                    <span class=\"column-indicator\" [style.background-color]=\"col.color || 'var(--primary-color)'\"></span>\n                    <h4 class=\"column-title\">{{ col.title }}</h4>\n                    <span class=\"card-count-badge\" [class.limit-reached]=\"isWipReached(col.id, lane.id)\">\n                      {{ getCardsForColumn(col.id, lane.id).length }}@if (col.wipLimit) { /{{ col.wipLimit }} }\n                    </span>\n                  </div>\n\n                  <button class=\"add-card-btn\" type=\"button\" (click)=\"toggleAddInput(col.id, lane.id)\" title=\"Add card\">\n                    +\n                  </button>\n                </div>\n\n                <div class=\"column-cards-list\">\n                  @if (columnAddStates()[dropKey(col.id, lane.id)]) {\n                    <div class=\"card-creator-box\">\n                      <input\n                        #titleInput\n                        type=\"text\"\n                        class=\"creator-input\"\n                        placeholder=\"Enter a title for this card...\"\n                        [attr.data-add-key]=\"dropKey(col.id, lane.id)\"\n                        [value]=\"newCardTitles()[dropKey(col.id, lane.id)] || ''\"\n                        (input)=\"updateNewTitle(col.id, lane.id, $any($event.target).value)\"\n                        (keydown.enter)=\"addCard(col.id, lane.id)\"\n                        (keydown.escape)=\"toggleAddInput(col.id, lane.id)\"\n                      />\n                      <div class=\"creator-actions\">\n                        <button class=\"creator-btn btn-add\" type=\"button\" (click)=\"addCard(col.id, lane.id)\">Add Card</button>\n                        <button class=\"creator-btn btn-cancel\" type=\"button\" (click)=\"toggleAddInput(col.id, lane.id)\">Cancel</button>\n                      </div>\n                    </div>\n                  }\n\n                  @if (getCardsForColumn(col.id, lane.id).length === 0 && !columnAddStates()[dropKey(col.id, lane.id)]) {\n                    <div class=\"column-empty-state\">No cards here.</div>\n                  }\n\n                  @for (card of getCardsForColumn(col.id, lane.id); track card.id; let cardIndex = $index) {\n                    <article\n                      [attr.id]=\"'k-card-' + card.id\"\n                      class=\"kanban-card\"\n                      [draggable]=\"!dragHandleOnly()\"\n                      [class.dragging]=\"activeDraggingCardId() === card.id\"\n                      [attr.tabindex]=\"dragHandleOnly() ? -1 : 0\"\n                      [attr.aria-grabbed]=\"activeDraggingCardId() === card.id\"\n                      (dragstart)=\"onDragStart($event, card)\"\n                      (dragover)=\"onCardDragOver($event)\"\n                      (drop)=\"onCardDrop($event, col.id, lane.id, cardIndex)\"\n                      (dragend)=\"onDragEnd()\"\n                      (click)=\"onCardClick(card)\"\n                      (keydown)=\"onCardKeyDown($event, card, col.id, lane.id, cardIndex)\"\n                    >\n                      <div class=\"card-topline\">\n                        <button\n                          [attr.id]=\"'k-handle-' + card.id\"\n                          class=\"drag-handle\"\n                          type=\"button\"\n                          draggable=\"true\"\n                          title=\"Drag card\"\n                          [attr.tabindex]=\"dragHandleOnly() ? 0 : -1\"\n                          (click)=\"$event.stopPropagation()\"\n                          (dragstart)=\"onDragStart($event, card)\"\n                          (dragend)=\"onDragEnd()\"\n                          (keydown)=\"onCardKeyDown($event, card, col.id, lane.id, cardIndex)\"\n                        >::</button>\n\n                        @if (card.priority || (card.tags && card.tags.length > 0)) {\n                          <div class=\"card-meta-header\">\n                            @if (card.priority) {\n                              <span\n                                class=\"priority-badge\"\n                                [class.priority-low]=\"card.priority === 'low'\"\n                                [class.priority-medium]=\"card.priority === 'medium'\"\n                                [class.priority-high]=\"card.priority === 'high'\"\n                              >\n                                {{ card.priority }}\n                              </span>\n                            }\n                            <div class=\"card-tag-pills\">\n                              @for (tag of card.tags; track tag) {\n                                <span class=\"card-tag\">{{ tag }}</span>\n                              }\n                            </div>\n                          </div>\n                        }\n                      </div>\n\n                      <div class=\"card-content\">\n                        <h5 class=\"card-title\">{{ card.title }}</h5>\n                        @if (card.description) {\n                          <p class=\"card-desc\">{{ card.description }}</p>\n                        }\n                      </div>\n\n                      <div class=\"card-footer\">\n                        @if (card.dueDate) {\n                          <div class=\"card-due-date\" [class.overdue]=\"isOverdue(card.dueDate)\">\n                            Due {{ formatDueDate(card.dueDate) }}\n                          </div>\n                        } @else {\n                          <div class=\"spacer\"></div>\n                        }\n\n                        <div class=\"card-actions\">\n                          <button class=\"card-delete-action\" type=\"button\" (click)=\"deleteCard($event, card.id)\" title=\"Delete card\">\n                            x\n                          </button>\n                          @if (card.assignee) {\n                            <div class=\"assignee-avatar\" [title]=\"card.assignee.name\">\n                              @if (card.assignee.avatarUrl) {\n                                <img [src]=\"card.assignee.avatarUrl\" [alt]=\"card.assignee.name\" />\n                              } @else {\n                                <span>{{ card.assignee.initials }}</span>\n                              }\n                            </div>\n                          }\n                        </div>\n                      </div>\n                    </article>\n                  }\n                </div>\n              </div>\n            }\n          </div>\n        </section>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; width: 100%; height: 100%; }\n    .ngx-kanban-board { display: flex; flex-direction: column; gap: 16px; overflow: auto; height: 100%; padding: 4px; }\n    .kanban-swimlane { display: flex; flex-direction: column; gap: 10px; min-width: min-content; }\n    .swimlane-header { position: sticky; left: 0; z-index: 2; display: flex; justify-content: space-between; align-items: center; padding: 4px 2px; color: var(--text-primary, #212529); }\n    .swimlane-header h3 { margin: 0; font-size: 13px; font-weight: 800; }\n    .swimlane-header p { margin: 3px 0 0; font-size: 11px; color: var(--text-secondary, #6c757d); }\n    .kanban-columns { display: flex; align-items: flex-start; gap: 20px; min-width: min-content; }\n    .kanban-column { flex: 0 0 290px; width: 290px; max-height: 100%; display: flex; flex-direction: column; background: var(--bg-secondary, #ffffff); border: 1px solid var(--border-color, #dee2e6); border-radius: 12px; box-shadow: var(--shadow-sm, 0 1px 3px rgba(0,0,0,0.05)); transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); overflow: hidden; }\n    .kanban-column.drag-over { border-color: var(--primary-color, #6366f1); box-shadow: 0 0 0 3px var(--primary-glow, rgba(99, 102, 241, 0.15)); background: var(--border-light, #fafafa); }\n    .kanban-column.wip-reached:not(.drag-over) { border-color: var(--ngx-kanban-limit, #f59e0b); }\n    .column-header { padding: 14px 16px 10px; border-top: 3px solid var(--primary-color, #6366f1); display: flex; justify-content: space-between; align-items: center; background: var(--border-light, #fafafa); border-bottom: 1px solid var(--border-color, #dee2e6); }\n    .column-title-section { display: flex; align-items: center; gap: 8px; min-width: 0; }\n    .column-indicator { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }\n    .column-title { margin: 0; font-size: 14px; font-weight: 700; color: var(--text-primary, #212529); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n    .card-count-badge { font-size: 11px; font-weight: 700; color: var(--text-secondary, #6c757d); background: var(--border-color, #e9ecef); padding: 2px 7px; border-radius: 99px; }\n    .card-count-badge.limit-reached { color: #92400e; background: #fef3c7; }\n    .add-card-btn { background: none; border: none; cursor: pointer; color: var(--text-secondary, #6c757d); font-size: 16px; width: 24px; height: 24px; border-radius: 4px; transition: all 0.15s; display: flex; align-items: center; justify-content: center; }\n    .add-card-btn:hover, .add-card-btn:focus-visible { background: var(--border-color, #e9ecef); color: var(--text-primary, #212529); outline: none; }\n    .column-cards-list { flex: 1; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 12px; min-height: 100px; }\n    .column-empty-state { padding: 24px 16px; text-align: center; font-size: 12px; color: var(--text-secondary, #888); font-style: italic; border: 1px dashed var(--border-color, #e2e8f0); border-radius: 8px; }\n    .kanban-card { background: var(--bg-secondary, #ffffff); border: 1px solid var(--border-color, #dee2e6); border-radius: 10px; padding: 12px; cursor: grab; box-shadow: 0 1px 2px rgba(0,0,0,0.04); transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); display: flex; flex-direction: column; gap: 10px; user-select: none; }\n    .kanban-card:hover { border-color: var(--primary-color, #6366f1); box-shadow: var(--shadow-md, 0 4px 6px rgba(0,0,0,0.08)); transform: translateY(-1px); }\n    .kanban-card:hover .card-delete-action { opacity: 1; }\n    .kanban-card.dragging { opacity: 0.35; border-style: dashed; border-color: var(--primary-color, #6366f1); background: var(--border-light, #f8f9fa); }\n    .card-topline { display: flex; align-items: flex-start; gap: 8px; }\n    .drag-handle { flex: 0 0 auto; width: 22px; height: 22px; border: 1px solid var(--border-color, #dee2e6); border-radius: 5px; background: var(--border-light, #f8f9fa); color: var(--text-secondary, #6c757d); cursor: grab; font-size: 10px; line-height: 1; }\n    .card-meta-header { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }\n    .priority-badge { font-size: 9px; font-weight: 700; text-transform: uppercase; padding: 2px 6px; border-radius: 4px; letter-spacing: 0.5px; }\n    .priority-badge.priority-low { background: #e6f4e9; color: #1e7e34; }\n    .priority-badge.priority-medium { background: #fff3cd; color: #856404; }\n    .priority-badge.priority-high { background: #fce8e6; color: #c53929; }\n    .card-tag-pills { display: flex; gap: 4px; flex-wrap: wrap; }\n    .card-tag { font-size: 9px; font-weight: 600; color: var(--text-secondary, #6c757d); background: var(--border-light, #f1f3f5); border: 1px solid var(--border-color, #e9ecef); padding: 1px 6px; border-radius: 4px; }\n    .card-content { display: flex; flex-direction: column; gap: 4px; }\n    .card-title { margin: 0; font-size: 13px; font-weight: 650; color: var(--text-primary, #212529); line-height: 1.4; }\n    .card-desc { margin: 0; font-size: 12px; color: var(--text-secondary, #6c757d); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n    .card-footer { display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--border-light, #f1f3f5); padding-top: 8px; font-size: 11px; }\n    .spacer { flex: 1; }\n    .card-due-date { color: var(--text-secondary, #6c757d); font-weight: 500; }\n    .card-due-date.overdue { color: #dc3545; font-weight: 650; }\n    .card-actions { display: flex; align-items: center; gap: 8px; }\n    .card-delete-action { background: none; border: none; cursor: pointer; color: #adb5bd; width: 22px; height: 22px; border-radius: 4px; opacity: 0; transition: all 0.15s; font-size: 13px; display: flex; align-items: center; justify-content: center; }\n    .card-delete-action:hover, .card-delete-action:focus-visible { opacity: 1; color: #dc3545; background: #fce8e6; outline: none; }\n    .assignee-avatar { width: 24px; height: 24px; border-radius: 50%; background: var(--primary-color, #6366f1); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; overflow: hidden; border: 1px solid var(--bg-secondary, #fff); }\n    .assignee-avatar img { width: 100%; height: 100%; object-fit: cover; }\n    .card-creator-box { background: var(--bg-secondary, #ffffff); border: 1px solid var(--primary-color, #6366f1); border-radius: 8px; padding: 10px; box-shadow: 0 2px 8px rgba(99, 102, 241, 0.15); display: flex; flex-direction: column; gap: 8px; }\n    .creator-input { width: 100%; border: 1px solid var(--border-color, #dee2e6); border-radius: 6px; padding: 6px 10px; font-size: 12px; background: var(--bg-secondary, #fff); color: var(--text-primary, #212529); outline: none; }\n    .creator-input:focus { border-color: var(--primary-color, #6366f1); }\n    .creator-actions { display: flex; justify-content: flex-end; gap: 6px; }\n    .creator-btn { border: none; border-radius: 4px; padding: 4px 10px; font-size: 11px; font-weight: 650; cursor: pointer; font-family: inherit; }\n    .creator-btn.btn-add { background: var(--primary-color, #6366f1); color: #fff; }\n    .creator-btn.btn-add:hover { background: var(--primary-hover, #4f46e5); }\n    .creator-btn.btn-cancel { background: var(--border-light, #f8f9fa); color: var(--text-secondary, #495057); border: 1px solid var(--border-color, #dee2e6); }\n    .creator-btn.btn-cancel:hover { background: var(--border-color, #e9ecef); }\n  `]\n})\nexport class KanbanComponent {\n  columns = input<KanbanColumn[]>([]);\n  cards = input<KanbanCard[]>([]);\n  swimlanes = input<KanbanSwimlane[]>([]);\n  optimisticUpdates = input(true);\n  dragHandleOnly = input(false);\n  allowSameColumnReorder = input(true);\n\n  cardMoved = output<KanbanCardMoveEvent>();\n  cardMoveRejected = output<KanbanMoveRejectedEvent>();\n  cardClicked = output<KanbanCard>();\n  cardAdded = output<{ columnId: string; title: string; swimlaneId?: string; card: KanbanCard }>();\n  cardDeleted = output<string>();\n\n  cardsState = signal<KanbanCard[]>([]);\n  columnAddStates = signal<Record<string, boolean>>({});\n  newCardTitles = signal<Record<string, string>>({});\n  activeDraggingCardId = signal<string | null>(null);\n  activeDropTarget = signal<string | null>(null);\n\n  @ViewChildren('titleInput') titleInputs?: QueryList<ElementRef<HTMLInputElement>>;\n\n  swimlaneSections = computed<SwimlaneSection[]>(() => {\n    const lanes = this.swimlanes();\n    if (!lanes.length) {\n      return [{ id: DEFAULT_LANE_ID, title: '', isDefault: true }];\n    }\n    return lanes.map(lane => ({ ...lane, isDefault: false }));\n  });\n\n  constructor() {\n    effect(() => {\n      this.cardsState.set(this.cards());\n    });\n  }\n\n  dropKey(columnId: string, laneId: string): string {\n    return `${laneId}::${columnId}`;\n  }\n\n  getCardsForColumn(columnId: string, laneId = DEFAULT_LANE_ID): KanbanCard[] {\n    return this.cardsState().filter(card => card.columnId === columnId && this.cardLaneId(card) === laneId);\n  }\n\n  isWipReached(columnId: string, laneId = DEFAULT_LANE_ID): boolean {\n    const limit = this.columns().find(col => col.id === columnId)?.wipLimit;\n    return !!limit && this.getCardsForColumn(columnId, laneId).length >= limit;\n  }\n\n  onDragStart(event: DragEvent, card: KanbanCard): void {\n    event.stopPropagation();\n    this.activeDraggingCardId.set(card.id);\n    if (event.dataTransfer) {\n      event.dataTransfer.setData('text/plain', card.id);\n      event.dataTransfer.effectAllowed = 'move';\n    }\n  }\n\n  onDragEnd(): void {\n    this.activeDraggingCardId.set(null);\n    this.activeDropTarget.set(null);\n  }\n\n  onCardKeyDown(event: KeyboardEvent, card: KanbanCard, currentColumnId: string, laneId: string, currentIndex: number): void {\n    const keys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'];\n    if (!keys.includes(event.key)) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    const colIndex = this.columns().findIndex(c => c.id === currentColumnId);\n    let targetColumnId = currentColumnId;\n    let targetIndex = currentIndex;\n\n    if (event.key === 'ArrowLeft') {\n      if (colIndex > 0) {\n        targetColumnId = this.columns()[colIndex - 1].id;\n        targetIndex = 0;\n      }\n    } else if (event.key === 'ArrowRight') {\n      if (colIndex < this.columns().length - 1) {\n        targetColumnId = this.columns()[colIndex + 1].id;\n        targetIndex = 0;\n      }\n    } else if (event.key === 'ArrowUp') {\n      if (currentIndex > 0) {\n        targetIndex = currentIndex - 1;\n      }\n    } else if (event.key === 'ArrowDown') {\n      const colCards = this.getCardsForColumn(currentColumnId, laneId);\n      if (currentIndex < colCards.length - 1) {\n        targetIndex = currentIndex + 2; // moveCard adjustedIndex adjustment\n      }\n    }\n\n    if (targetColumnId !== currentColumnId || targetIndex !== currentIndex) {\n      this.moveCard(card.id, targetColumnId, laneId, targetIndex);\n      setTimeout(() => {\n        const elementId = this.dragHandleOnly() ? `k-handle-${card.id}` : `k-card-${card.id}`;\n        document.getElementById(elementId)?.focus();\n      }, 0);\n    }\n  }\n\n  onColumnDragOver(event: DragEvent, columnId: string, laneId: string): void {\n    event.preventDefault();\n    event.dataTransfer?.setData('text/target-column', columnId);\n    this.activeDropTarget.set(this.dropKey(columnId, laneId));\n  }\n\n  onCardDragOver(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  onDragLeave(columnId: string, laneId: string): void {\n    if (this.activeDropTarget() === this.dropKey(columnId, laneId)) {\n      this.activeDropTarget.set(null);\n    }\n  }\n\n  onColumnDrop(event: DragEvent, targetColumnId: string, targetLaneId: string): void {\n    event.preventDefault();\n    this.activeDropTarget.set(null);\n    const cardId = this.draggedCardId(event);\n    if (!cardId) return;\n    this.moveCard(cardId, targetColumnId, targetLaneId, this.getCardsForColumn(targetColumnId, targetLaneId).length);\n  }\n\n  onCardDrop(event: DragEvent, targetColumnId: string, targetLaneId: string, targetIndex: number): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.activeDropTarget.set(null);\n\n    const cardId = this.draggedCardId(event);\n    if (!cardId) return;\n\n    const target = event.currentTarget as HTMLElement;\n    const insertAfter = event.offsetY > target.clientHeight / 2;\n    this.moveCard(cardId, targetColumnId, targetLaneId, targetIndex + (insertAfter ? 1 : 0));\n  }\n\n  onCardClick(card: KanbanCard): void {\n    this.cardClicked.emit(card);\n  }\n\n  toggleAddInput(columnId: string, laneId = DEFAULT_LANE_ID): void {\n    const key = this.dropKey(columnId, laneId);\n    const active = this.columnAddStates()[key];\n    this.columnAddStates.update(state => ({ ...state, [key]: !active }));\n    if (!active) {\n      this.newCardTitles.update(state => ({ ...state, [key]: '' }));\n      setTimeout(() => this.focusAddInput(key), 0);\n    }\n  }\n\n  updateNewTitle(columnId: string, laneId: string, value: string): void {\n    const key = this.dropKey(columnId, laneId);\n    this.newCardTitles.update(state => ({ ...state, [key]: value }));\n  }\n\n  addCard(columnId: string, laneId = DEFAULT_LANE_ID): void {\n    const key = this.dropKey(columnId, laneId);\n    const title = (this.newCardTitles()[key] || '').trim();\n    if (!title) return;\n\n    if (this.isWipReached(columnId, laneId)) {\n      this.cardMoveRejected.emit({ cardId: '', toColumnId: columnId, reason: 'wip-limit' });\n      return;\n    }\n\n    const newCard: KanbanCard = {\n      id: 'card-' + Date.now() + '-' + Math.floor(Math.random() * 1000),\n      title,\n      columnId,\n      swimlaneId: laneId === DEFAULT_LANE_ID ? undefined : laneId,\n      priority: 'low',\n    };\n\n    if (this.optimisticUpdates()) {\n      this.cardsState.update(cards => [...cards, newCard]);\n    }\n\n    this.cardAdded.emit({ columnId, title, swimlaneId: newCard.swimlaneId, card: newCard });\n    this.newCardTitles.update(state => ({ ...state, [key]: '' }));\n    this.columnAddStates.update(state => ({ ...state, [key]: false }));\n  }\n\n  deleteCard(event: MouseEvent, cardId: string): void {\n    event.stopPropagation();\n    if (this.optimisticUpdates()) {\n      this.cardsState.update(cards => cards.filter(card => card.id !== cardId));\n    }\n    this.cardDeleted.emit(cardId);\n  }\n\n  isOverdue(dueDate: Date): boolean {\n    const today = new Date();\n    today.setHours(0, 0, 0, 0);\n    return new Date(dueDate).getTime() < today.getTime();\n  }\n\n  formatDueDate(date: Date): string {\n    return new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n  }\n\n  private moveCard(cardId: string, targetColumnId: string, targetLaneId: string, targetIndex: number): void {\n    const cards = this.cardsState();\n    const sourceCard = cards.find(card => card.id === cardId);\n    if (!sourceCard) return;\n\n    const fromColumnId = sourceCard.columnId;\n    const fromLaneId = this.cardLaneId(sourceCard);\n    const fromIndex = this.getCardsForColumn(fromColumnId, fromLaneId).findIndex(card => card.id === cardId);\n    const sameBucket = fromColumnId === targetColumnId && fromLaneId === targetLaneId;\n\n    if (sameBucket && (!this.allowSameColumnReorder() || fromIndex === targetIndex || fromIndex + 1 === targetIndex)) {\n      return;\n    }\n\n    if (!sameBucket && this.isWipReached(targetColumnId, targetLaneId)) {\n      this.cardMoveRejected.emit({ cardId, toColumnId: targetColumnId, reason: 'wip-limit' });\n      return;\n    }\n\n    const adjustedIndex = sameBucket && fromIndex < targetIndex ? targetIndex - 1 : targetIndex;\n    const event: KanbanCardMoveEvent = {\n      cardId,\n      fromColumnId,\n      toColumnId: targetColumnId,\n      fromSwimlaneId: fromLaneId === DEFAULT_LANE_ID ? undefined : fromLaneId,\n      toSwimlaneId: targetLaneId === DEFAULT_LANE_ID ? undefined : targetLaneId,\n      fromIndex,\n      toIndex: Math.max(0, adjustedIndex),\n    };\n\n    if (this.optimisticUpdates()) {\n      this.cardsState.set(this.reorderCards(cards, sourceCard, targetColumnId, targetLaneId, adjustedIndex));\n    }\n\n    this.cardMoved.emit(event);\n  }\n\n  private reorderCards(cards: KanbanCard[], sourceCard: KanbanCard, targetColumnId: string, targetLaneId: string, targetIndex: number): KanbanCard[] {\n    const movedCard: KanbanCard = {\n      ...sourceCard,\n      columnId: targetColumnId,\n      swimlaneId: targetLaneId === DEFAULT_LANE_ID ? undefined : targetLaneId,\n    };\n    const remaining = cards.filter(card => card.id !== sourceCard.id);\n    const targetCards = remaining.filter(card => card.columnId === targetColumnId && this.cardLaneId(card) === targetLaneId);\n    const clampedIndex = Math.max(0, Math.min(targetIndex, targetCards.length));\n    const targetCard = targetCards[clampedIndex];\n\n    if (targetCard) {\n      const globalIndex = remaining.findIndex(card => card.id === targetCard.id);\n      return [...remaining.slice(0, globalIndex), movedCard, ...remaining.slice(globalIndex)];\n    }\n\n    const lastIndex = this.findLastIndex(remaining, card => card.columnId === targetColumnId && this.cardLaneId(card) === targetLaneId);\n    const insertIndex = lastIndex === -1 ? remaining.length : lastIndex + 1;\n    return [...remaining.slice(0, insertIndex), movedCard, ...remaining.slice(insertIndex)];\n  }\n\n  private draggedCardId(event: DragEvent): string | null {\n    return event.dataTransfer?.getData('text/plain') || this.activeDraggingCardId();\n  }\n\n  private cardLaneId(card: KanbanCard): string {\n    return card.swimlaneId || DEFAULT_LANE_ID;\n  }\n\n  private focusAddInput(key: string): void {\n    const input = this.titleInputs?.find(ref => ref.nativeElement.dataset['addKey'] === key);\n    input?.nativeElement.focus();\n  }\n\n  private findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n    for (let i = items.length - 1; i >= 0; i--) {\n      if (predicate(items[i])) return i;\n    }\n    return -1;\n  }\n}\n","import { Component, ChangeDetectionStrategy, input, computed, Directive, TemplateRef, contentChild, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface TimelineItem {\n  id?: string | number;\n  title: string;\n  subtitle?: string;\n  description?: string;\n  timestamp: string | Date;\n  icon?: string;\n  color?: string;\n  status?: 'success' | 'warning' | 'error' | 'info' | 'default';\n  active?: boolean;\n}\n\n@Directive({\n  selector: '[ngxTimelineMarkerTemplate]',\n  standalone: true\n})\nexport class NgxTimelineMarkerTemplateDirective {\n  constructor(public templateRef: TemplateRef<any>) {}\n}\n\n@Directive({\n  selector: '[ngxTimelineCardTemplate]',\n  standalone: true\n})\nexport class NgxTimelineCardTemplateDirective {\n  constructor(public templateRef: TemplateRef<any>) {}\n}\n\n@Component({\n  selector: 'ngx-timeline',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-timeline\"\n      [class.orientation-horizontal]=\"orientation() === 'horizontal'\"\n      [class.orientation-vertical]=\"orientation() === 'vertical'\"\n      [class.alternating]=\"alternating()\"\n    >\n      <!-- Timeline Central Track Line -->\n      <div class=\"timeline-track\"></div>\n\n      <!-- Timeline Items List -->\n      <div class=\"timeline-items\">\n        @for (item of items(); track item.id || item.title; let i = $index) {\n          <div\n            class=\"timeline-item\"\n            [class.align-left]=\"alternating() && i % 2 === 0\"\n            [class.align-right]=\"alternating() && i % 2 !== 0\"\n            [class.status-success]=\"item.status === 'success'\"\n            [class.status-warning]=\"item.status === 'warning'\"\n            [class.status-error]=\"item.status === 'error'\"\n            [class.status-info]=\"item.status === 'info'\"\n            [class.clickable]=\"clickable()\"\n            [class.active-item]=\"item.active\"\n            [class.item-selected]=\"selectedItem() === item\"\n            [style.--item-color]=\"item.color || 'var(--primary-color)'\"\n            [style.--item-index]=\"i\"\n            [attr.tabindex]=\"clickable() ? 0 : null\"\n            (click)=\"onItemClick(item)\"\n            (keydown.enter)=\"onItemClick(item)\"\n            (keydown.space)=\"$event.preventDefault(); onItemClick(item)\"\n          >\n            @if (orientation() === 'horizontal') {\n              <!-- UPPER HALF -->\n              <div class=\"timeline-item-half upper-half\">\n                @if (!alternating() || i % 2 === 0) {\n                  <!-- Card Template -->\n                  @if (cardTemplate()) {\n                    <ng-container *ngTemplateOutlet=\"cardTemplate()!.templateRef; context: { $implicit: item, item: item, index: i }\" />\n                  } @else {\n                    <div class=\"timeline-card\">\n                      <div class=\"card-arrow\"></div>\n                      <div class=\"card-header\">\n                        <span class=\"item-time\">\n                          @if (isDate(item.timestamp)) {\n                            {{ asDate(item.timestamp) | date:'mediumDate' }}\n                          } @else {\n                            {{ item.timestamp }}\n                          }\n                        </span>\n                        @if (item.subtitle) {\n                          <span class=\"item-subtitle\">{{ item.subtitle }}</span>\n                        }\n                      </div>\n                      <h4 class=\"item-title\">{{ item.title }}</h4>\n                      @if (item.description) {\n                        <p class=\"item-desc\">{{ item.description }}</p>\n                      }\n                    </div>\n                  }\n                }\n              </div>\n\n              <!-- MIDDLE MARKER -->\n              <div class=\"timeline-marker\">\n                @if (markerTemplate()) {\n                  <ng-container *ngTemplateOutlet=\"markerTemplate()!.templateRef; context: { $implicit: item, item: item, index: i }\" />\n                } @else {\n                  <span class=\"marker-dot\" [class.marker-dot-active]=\"item.active\">\n                    @if (item.icon) {\n                      <span class=\"marker-icon\">{{ item.icon }}</span>\n                    }\n                  </span>\n                }\n              </div>\n\n              <!-- LOWER HALF -->\n              <div class=\"timeline-item-half lower-half\">\n                @if (alternating() && i % 2 !== 0) {\n                  <!-- Card Template -->\n                  @if (cardTemplate()) {\n                    <ng-container *ngTemplateOutlet=\"cardTemplate()!.templateRef; context: { $implicit: item, item: item, index: i }\" />\n                  } @else {\n                    <div class=\"timeline-card\">\n                      <div class=\"card-arrow\"></div>\n                      <div class=\"card-header\">\n                        <span class=\"item-time\">\n                          @if (isDate(item.timestamp)) {\n                            {{ asDate(item.timestamp) | date:'mediumDate' }}\n                          } @else {\n                            {{ item.timestamp }}\n                          }\n                        </span>\n                        @if (item.subtitle) {\n                          <span class=\"item-subtitle\">{{ item.subtitle }}</span>\n                        }\n                      </div>\n                      <h4 class=\"item-title\">{{ item.title }}</h4>\n                      @if (item.description) {\n                        <p class=\"item-desc\">{{ item.description }}</p>\n                      }\n                    </div>\n                  }\n                }\n              </div>\n            } @else {\n              <!-- VERTICAL LAYOUT -->\n              <div class=\"timeline-marker\">\n                @if (markerTemplate()) {\n                  <ng-container *ngTemplateOutlet=\"markerTemplate()!.templateRef; context: { $implicit: item, item: item, index: i }\" />\n                } @else {\n                  <span class=\"marker-dot\" [class.marker-dot-active]=\"item.active\">\n                    @if (item.icon) {\n                      <span class=\"marker-icon\">{{ item.icon }}</span>\n                    }\n                  </span>\n                }\n              </div>\n\n              @if (cardTemplate()) {\n                <ng-container *ngTemplateOutlet=\"cardTemplate()!.templateRef; context: { $implicit: item, item: item, index: i }\" />\n              } @else {\n                <div class=\"timeline-card\">\n                  <div class=\"card-arrow\"></div>\n                  <div class=\"card-header\">\n                    <span class=\"item-time\">\n                      @if (isDate(item.timestamp)) {\n                        {{ asDate(item.timestamp) | date:'mediumDate' }}\n                      } @else {\n                        {{ item.timestamp }}\n                      }\n                    </span>\n                    @if (item.subtitle) {\n                      <span class=\"item-subtitle\">{{ item.subtitle }}</span>\n                    }\n                  </div>\n                  <h4 class=\"item-title\">{{ item.title }}</h4>\n                  @if (item.description) {\n                    <p class=\"item-desc\">{{ item.description }}</p>\n                  }\n                </div>\n              }\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    .ngx-timeline {\n      position: relative;\n      width: 100%;\n      box-sizing: border-box;\n      padding: 24px 0;\n    }\n\n    /* Core Track Line CSS styling */\n    .timeline-track {\n      position: absolute;\n      background: var(--border-color, #e2e8f0);\n      z-index: 1;\n      transition: background-color 0.2s ease;\n    }\n\n    .orientation-vertical .timeline-track {\n      top: 0;\n      bottom: 0;\n      left: 20px;\n      width: 4px;\n      transform: translateX(-50%);\n    }\n\n    .orientation-vertical.alternating .timeline-track {\n      left: 50%;\n    }\n\n    .orientation-horizontal .timeline-track {\n      left: 0;\n      right: 0;\n      top: 50%;\n      height: 4px;\n      transform: translateY(-50%);\n    }\n\n    /* Timeline Items Lists */\n    .timeline-items {\n      display: flex;\n      position: relative;\n      z-index: 2;\n    }\n\n    .orientation-vertical .timeline-items {\n      flex-direction: column;\n      gap: 28px;\n    }\n\n    .orientation-horizontal .timeline-items {\n      flex-direction: row;\n      justify-content: flex-start;\n      gap: 24px;\n      width: max-content;\n      padding: 24px 16px;\n    }\n\n    /* Single Timeline Item Wrapper */\n    .timeline-item {\n      position: relative;\n      display: flex;\n      box-sizing: border-box;\n      outline: none;\n      opacity: 0;\n      animation: timelineItemEntrance 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      animation-delay: calc(var(--item-index, 0) * 0.08s);\n    }\n\n    @keyframes timelineItemEntrance {\n      from {\n        opacity: 0;\n        transform: translateY(16px);\n      }\n      to {\n        opacity: 1;\n        transform: translateY(0);\n      }\n    }\n\n    .orientation-vertical .timeline-item {\n      padding-left: 48px;\n      width: 100%;\n    }\n\n    .orientation-vertical.alternating .timeline-item {\n      padding-left: 0;\n      width: 50%;\n    }\n\n    .orientation-vertical.alternating .timeline-item.align-left {\n      align-self: flex-start;\n      padding-right: 36px;\n      flex-direction: row-reverse;\n    }\n\n    .orientation-vertical.alternating .timeline-item.align-right {\n      align-self: flex-end;\n      padding-left: 36px;\n    }\n\n    .orientation-horizontal .timeline-item {\n      flex-direction: column;\n      align-items: center;\n      width: 240px;\n      min-width: 240px;\n      height: 320px;\n    }\n\n    /* Clickable cursor override */\n    .timeline-item.clickable {\n      cursor: pointer;\n    }\n\n    /* Marker Dots indicators */\n    .timeline-marker {\n      position: absolute;\n      z-index: 5;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .orientation-vertical .timeline-marker {\n      left: 20px;\n      top: 14px;\n      transform: translateX(-50%);\n    }\n\n    .orientation-vertical.alternating .timeline-marker {\n      left: 100%;\n      top: 18px;\n    }\n\n    .orientation-vertical.alternating .timeline-item.align-left .timeline-marker {\n      left: 100%;\n      transform: translateX(-50%);\n    }\n    \n    .orientation-vertical.alternating .timeline-item.align-right .timeline-marker {\n      left: 0;\n      transform: translateX(-50%);\n    }\n\n    .orientation-horizontal .timeline-marker {\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      height: 30px;\n      width: 100%;\n    }\n\n    .marker-dot {\n      width: 18px;\n      height: 18px;\n      border-radius: 50%;\n      background: var(--bg-secondary, #ffffff);\n      border: 3px solid var(--item-color);\n      box-shadow: 0 0 0 3px rgba(255,255,255,1), var(--shadow-sm);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    \n    .timeline-item:hover .marker-dot {\n      transform: scale(1.18);\n      box-shadow: 0 0 0 4px rgba(255,255,255,1), 0 0 0 6px var(--item-color), var(--shadow-md);\n      background: var(--item-color);\n      color: #fff;\n    }\n\n    .marker-icon {\n      font-size: 9px;\n      line-height: 1;\n      display: block;\n    }\n\n    /* Pulsing active marker dot */\n    .marker-dot-active {\n      position: relative;\n    }\n\n    .marker-dot-active::after {\n      content: '';\n      position: absolute;\n      top: -6px;\n      left: -6px;\n      right: -6px;\n      bottom: -6px;\n      border-radius: 50%;\n      border: 2px solid var(--item-color);\n      animation: markerPulse 1.8s infinite ease-out;\n      opacity: 0;\n      pointer-events: none;\n    }\n\n    @keyframes markerPulse {\n      0% {\n        transform: scale(0.85);\n        opacity: 0.6;\n      }\n      100% {\n        transform: scale(1.6);\n        opacity: 0;\n      }\n    }\n\n    /* Content Card overlays - Glassmorphism defaults */\n    .timeline-card {\n      background: var(--ngx-timeline-card-bg, rgba(255, 255, 255, 0.7));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      border: 1px solid var(--ngx-timeline-card-border, rgba(226, 232, 240, 0.8));\n      border-radius: 12px;\n      padding: 16px 18px;\n      box-shadow: var(--shadow-sm, 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03));\n      position: relative;\n      width: 100%;\n      box-sizing: border-box;\n      transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    .timeline-item:hover .timeline-card {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -2px rgba(0, 0, 0, 0.04));\n      border-color: var(--item-color);\n    }\n\n    .timeline-item.item-selected .timeline-card {\n      border-color: var(--item-color);\n      box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15), var(--shadow-md);\n      background: var(--ngx-timeline-card-selected-bg, rgba(255, 255, 255, 0.95));\n    }\n\n    .timeline-item.clickable:focus-visible .timeline-card {\n      box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--item-color);\n    }\n\n    /* Arrow Styling */\n    .card-arrow {\n      position: absolute;\n      width: 8px;\n      height: 8px;\n      background: inherit;\n      border: 1px solid inherit;\n      border-color: inherit;\n      border-style: solid;\n      z-index: 2;\n    }\n\n    /* Vertical orientations */\n    .orientation-vertical .timeline-card .card-arrow {\n      top: 18px;\n      left: -5px;\n      border-width: 0 0 1px 1px;\n      transform: rotate(45deg);\n    }\n\n    .orientation-vertical.alternating .timeline-item.align-left .timeline-card .card-arrow {\n      left: auto;\n      right: -5px;\n      border-width: 1px 1px 0 0;\n      transform: rotate(45deg);\n    }\n\n    /* Horizontal orientations */\n    .orientation-horizontal .timeline-item-half {\n      height: 145px;\n      width: 100%;\n      display: flex;\n      justify-content: center;\n      box-sizing: border-box;\n    }\n\n    .orientation-horizontal .upper-half {\n      align-items: flex-end;\n      padding-bottom: 12px;\n    }\n\n    .orientation-horizontal .lower-half {\n      align-items: flex-start;\n      padding-top: 12px;\n    }\n\n    .orientation-horizontal .upper-half .timeline-card .card-arrow {\n      bottom: -5px;\n      left: 50%;\n      transform: translateX(-50%) rotate(45deg);\n      border-width: 0 1px 1px 0;\n    }\n\n    .orientation-horizontal .lower-half .timeline-card .card-arrow {\n      top: -5px;\n      left: 50%;\n      transform: translateX(-50%) rotate(45deg);\n      border-width: 1px 0 0 1px;\n    }\n\n    .card-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: 12px;\n      margin-bottom: 8px;\n    }\n\n    .item-time {\n      font-size: 11px;\n      font-weight: 700;\n      color: var(--text-secondary, #64748b);\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n\n    .item-subtitle {\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--item-color);\n      background: var(--border-light, #f1f5f9);\n      padding: 2px 6px;\n      border-radius: 4px;\n      transition: background-color 0.2s ease;\n    }\n\n    .item-title {\n      margin: 0 0 6px;\n      font-size: 14px;\n      font-weight: 750;\n      color: var(--text-primary, #0f172a);\n    }\n\n    .item-desc {\n      margin: 0;\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      line-height: 1.5;\n    }\n\n    /* Cards alignment logic arrows in alternating layout */\n    .orientation-vertical.alternating .timeline-item.align-left .timeline-card {\n      text-align: right;\n    }\n    .orientation-vertical.alternating .timeline-item.align-left .card-header {\n      flex-direction: row-reverse;\n    }\n\n    /* Status State overrides */\n    .status-success { --item-color: #10b981 !important; }\n    .status-warning { --item-color: #f59e0b !important; }\n    .status-error   { --item-color: #ef4444 !important; }\n    .status-info    { --item-color: #3b82f6 !important; }\n\n    /* Dark Theme Support */\n    .ngx-timeline.dark .timeline-track { background: #334155; }\n    .ngx-timeline.dark .timeline-card {\n      background: var(--ngx-timeline-card-bg-dark, rgba(30, 41, 59, 0.7));\n      border-color: var(--ngx-timeline-card-border-dark, rgba(71, 85, 105, 0.8));\n    }\n    .ngx-timeline.dark .item-subtitle { background: #334155; }\n    .ngx-timeline.dark .item-title { color: #f8fafc; }\n    .ngx-timeline.dark .item-desc { color: #94a3b8; }\n    .ngx-timeline.dark .item-time { color: #94a3b8; }\n    .ngx-timeline.dark .timeline-item.item-selected .timeline-card {\n      background: var(--ngx-timeline-card-selected-bg-dark, rgba(30, 41, 59, 0.95));\n    }\n  `]\n})\nexport class TimelineComponent {\n  items = input<TimelineItem[]>([]);\n  orientation = input<'vertical' | 'horizontal'>('vertical');\n  alternating = input<boolean>(false);\n  clickable = input<boolean>(false);\n  selectedItem = input<TimelineItem | null>(null);\n\n  itemClick = output<TimelineItem>();\n\n  markerTemplate = contentChild(NgxTimelineMarkerTemplateDirective);\n  cardTemplate = contentChild(NgxTimelineCardTemplateDirective);\n\n  isDate(val: string | Date): boolean {\n    return val instanceof Date;\n  }\n\n  asDate(val: string | Date): Date {\n    return val as Date;\n  }\n\n  onItemClick(item: TimelineItem): void {\n    if (this.clickable()) {\n      this.itemClick.emit(item);\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, HostListener, computed, effect, input, output, signal, OnInit, OnDestroy, Directive, TemplateRef, inject, contentChild } from '@angular/core';\nimport { SchedulerEvent, SchedulerEventChangeEvent, SchedulerSlotClickEvent, SchedulerResource, SchedulerSlotRangeSelectEvent } from './models';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\n\n@Directive({\n  selector: '[ngxSchedulerEventTemplate]',\n  standalone: true\n})\nexport class NgxSchedulerEventTemplateDirective {\n  templateRef = inject(TemplateRef);\n}\n\ninterface TimeSlot {\n  hour: number;\n  minute: number;\n  key: string;\n}\n\ninterface ResolvedSchedulerEvent {\n  id: string;\n  event: SchedulerEvent;\n  start: Date;\n  end: Date;\n}\n\ninterface SchedulerEventLayout extends ResolvedSchedulerEvent {\n  top: number;\n  height: number;\n  left: number;\n  width: number;\n}\n\ninterface ResizeState {\n  event: SchedulerEvent;\n  edge: 'start' | 'end';\n  start: Date;\n  end: Date;\n  originY: number;\n}\n\n@Component({\n  selector: 'ngx-scheduler',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"ngx-scheduler-wrapper\" [class.dark]=\"theme() === 'dark'\">\n      \n      <!-- Scheduler Toolbar -->\n      <div class=\"scheduler-toolbar\">\n        <div class=\"nav-controls\">\n          <div class=\"nav-buttons-group\">\n            <button class=\"tool-btn nav-arrow\" type=\"button\" (click)=\"navigate(-1)\" aria-label=\"Previous period\">\n              <svg class=\"icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/></svg>\n            </button>\n            <button class=\"tool-btn today-btn\" type=\"button\" (click)=\"goToToday()\">{{ i18n.scheduler.today }}</button>\n            <button class=\"tool-btn nav-arrow\" type=\"button\" (click)=\"navigate(1)\" aria-label=\"Next period\">\n              <svg class=\"icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/></svg>\n            </button>\n          </div>\n          <h2 class=\"current-period-label\">{{ periodLabel() }}</h2>\n        </div>\n\n        <div class=\"toolbar-actions\">\n          <!-- Keyword Search -->\n          @if (showSearch()) {\n            <div class=\"search-box-container\">\n              <svg class=\"search-icon\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/></svg>\n              <input type=\"text\" \n                     class=\"search-input\" \n                     [placeholder]=\"i18n.common.search\" \n                     [value]=\"searchQuery()\" \n                     (input)=\"onSearchInput($event)\" />\n            </div>\n          }\n\n          <!-- Resource Select Filter (Week/Month View) -->\n          @if (resources().length > 0 && activeMode() !== 'day') {\n            <div class=\"resource-filter-container\">\n              <select class=\"resource-select\" [value]=\"selectedResourceId() || ''\" (change)=\"onResourceFilterChange($event)\">\n                <option value=\"\">All Resources</option>\n                @for (res of resources(); track res.id) {\n                  <option [value]=\"res.id\">{{ res.name }}</option>\n                }\n              </select>\n            </div>\n          }\n\n          <!-- Export Dropdown -->\n          <div class=\"export-dropdown-wrapper\">\n            <button class=\"tool-btn export-toggle-btn\" type=\"button\" (click)=\"showExportDropdown.set(!showExportDropdown())\">\n              <span>Export</span>\n              <svg class=\"dropdown-arrow-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7 10l5 5 5-5z\"/></svg>\n            </button>\n            \n            @if (showExportDropdown()) {\n              <div class=\"export-menu-dropdown\">\n                <button class=\"export-item\" (click)=\"exportToICS(); showExportDropdown.set(false)\">\n                  <svg class=\"export-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z\"/></svg>\n                  <span>iCalendar (.ics)</span>\n                </button>\n                <button class=\"export-item\" (click)=\"exportToJSON(); showExportDropdown.set(false)\">\n                  <svg class=\"export-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\n                  <span>JSON format</span>\n                </button>\n                <button class=\"export-item\" (click)=\"exportToCSV(); showExportDropdown.set(false)\">\n                  <svg class=\"export-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/></svg>\n                  <span>CSV document</span>\n                </button>\n              </div>\n            }\n          </div>\n\n          <!-- View Switches -->\n          <div class=\"view-switch-controls\">\n            @for (mode of viewModes; track mode) {\n              <button\n                type=\"button\"\n                class=\"view-btn\"\n                [class.active]=\"activeMode() === mode\"\n                (click)=\"activeMode.set(mode)\"\n              >\n                {{ getViewModeLabel(mode) }}\n              </button>\n            }\n          </div>\n        </div>\n      </div>\n\n      <!-- Scheduler Body -->\n      <div class=\"scheduler-body\" (click)=\"showExportDropdown.set(false); activeMonthPopoverDate.set(null)\">\n        @if (activeMode() === 'day' || activeMode() === 'week') {\n          <div class=\"time-grid-container\">\n            \n            <!-- Grid Header -->\n            <div class=\"time-grid-header\">\n              <div class=\"time-axis-header\"></div>\n              <div class=\"columns-headers-wrap\">\n                @for (col of activeColumns(); track col.resource ? col.resource.id : dateKey(col.date)) {\n                  <div class=\"column-header-cell\" [class.today]=\"isToday(col.date)\">\n                    @if (col.resource) {\n                      <div class=\"resource-header-card\">\n                        @if (col.resource.avatarUrl) {\n                          <img [src]=\"col.resource.avatarUrl\" [alt]=\"col.resource.name\" class=\"resource-avatar\" />\n                        } @else {\n                          <div class=\"resource-initials\" [style.background-color]=\"col.resource.color || 'var(--primary-color)'\">\n                            {{ getInitials(col.resource.name) }}\n                          </div>\n                        }\n                        <div class=\"resource-info\">\n                          <span class=\"resource-name\">{{ col.resource.name }}</span>\n                          <span class=\"resource-desc\">{{ col.resource.description || 'Team Member' }}</span>\n                        </div>\n                      </div>\n                    } @else {\n                      <span class=\"day-name\">{{ formatDate(col.date, { weekday: 'short' }) }}</span>\n                      <span class=\"day-num\">{{ formatDate(col.date, { day: 'numeric' }) }}</span>\n                    }\n                  </div>\n                }\n              </div>\n            </div>\n\n            <!-- All-Day Events row -->\n            @if (hasAllDayEvents()) {\n              <div class=\"all-day-row-container\">\n                <div class=\"all-day-label-cell\">{{ i18n.scheduler.allDay }}</div>\n                <div class=\"all-day-columns-wrap\">\n                  @for (col of activeColumns(); track col.resource ? col.resource.id : dateKey(col.date)) {\n                    <div class=\"all-day-column-cell\">\n                      @for (evt of getAllDayEventsForColumn(col); track evt.id) {\n                        <div class=\"all-day-event-block\"\n                             [class.meeting]=\"evt.event.category === 'meeting'\"\n                             [class.task]=\"evt.event.category === 'task'\"\n                             [class.important]=\"evt.event.category === 'important'\"\n                             [class.warning]=\"evt.event.category === 'warning'\"\n                             [class.milestone]=\"evt.event.category === 'milestone'\"\n                             [class.personal]=\"evt.event.category === 'personal'\"\n                             [class.completed]=\"evt.event.completed\"\n                             [ngStyle]=\"getEventStyles(evt.event)\"\n                             (click)=\"clickEvent(evt.event); $event.stopPropagation()\"\n                             [title]=\"evt.event.title\"\n                        >\n                          <div class=\"all-day-event-indicator\"></div>\n                          \n                          @if (evt.event.category === 'task') {\n                            <input type=\"checkbox\"\n                                   class=\"task-completion-checkbox all-day-task-checkbox\"\n                                   [checked]=\"evt.event.completed || false\"\n                                   (click)=\"$event.stopPropagation()\"\n                                   (change)=\"toggleTaskCompletion(evt.event, $event)\" />\n                          }\n\n                          <span class=\"all-day-event-title\">{{ evt.event.title }}</span>\n                          <button class=\"event-delete-btn all-day-del\" \n                                  type=\"button\" \n                                  aria-label=\"Delete event\"\n                                  (click)=\"deleteEvent(evt.event, $event)\">\n                            <svg class=\"delete-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M19 4h-3.5l-1-1h-5l-1 1H5v2h14V4zM6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12z\"/></svg>\n                          </button>\n                        </div>\n                      }\n                    </div>\n                  }\n                </div>\n              </div>\n            }\n\n            <!-- Grid Body -->\n            <div class=\"time-grid-body\">\n              <div class=\"time-axis-labels\">\n                @for (h of hours(); track h) {\n                  <div class=\"time-label\">{{ formatHour(h) }}</div>\n                }\n              </div>\n\n              <div class=\"columns-body-wrap\" [style.min-height.px]=\"hours().length * hourHeight\">\n                <div class=\"hourly-grid-lines\">\n                  @for (h of hours(); track h) {\n                    <div class=\"grid-line\"></div>\n                  }\n                </div>\n\n                @for (col of activeColumns(); track col.resource ? col.resource.id : dateKey(col.date)) {\n                  <div class=\"column-body-cell\">\n                    \n                    <!-- Interactive Slot Overlay -->\n                    <div class=\"interactive-slots-overlay\">\n                      @for (slot of timeSlots(); track slot.key) {\n                        <div\n                          class=\"slot-trigger\"\n                          [class.non-business-slot]=\"isNonBusinessHour(slot.hour)\"\n                          [style.height.px]=\"slotHeight()\"\n                          (click)=\"clickSlot(col.date, slot.hour, slot.minute, col.resource?.id)\"\n                          (pointerdown)=\"onSlotPointerDown($event, col.date, slot.hour, slot.minute, col.resource?.id)\"\n                          (pointerenter)=\"onSlotPointerEnter($event, col.date, slot.hour, slot.minute, col.resource?.id)\"\n                          (dragover)=\"onSlotDragOver($event)\"\n                          (drop)=\"onSlotDrop($event, col.date, slot.hour, slot.minute, col.resource?.id)\"\n                        ></div>\n                      }\n                    </div>\n\n                    <!-- Live Current Time Indicator Line -->\n                    @if (isToday(col.date) && currentTimeTop(); as lineTop) {\n                      <div class=\"current-time-line\" [style.top.%]=\"lineTop\">\n                        <div class=\"line-dot\"></div>\n                      </div>\n                    }\n\n                    <!-- Drag Select Preview Block -->\n                    @if (getDragSelectionLayout(col); as previewLayout) {\n                      <div class=\"drag-select-preview\"\n                           [style.top.%]=\"previewLayout.top\"\n                           [style.height.%]=\"previewLayout.height\">\n                        <div class=\"preview-inner\">\n                          <svg class=\"plus-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>\n                          <span>Create Event</span>\n                        </div>\n                      </div>\n                    }\n\n                    <!-- Event Cards -->\n                    @for (layout of getEventLayoutsForColumn(col); track layout.id) {\n                      <div\n                        class=\"scheduler-event-card\"\n                        [class.meeting]=\"layout.event.category === 'meeting'\"\n                        [class.task]=\"layout.event.category === 'task'\"\n                        [class.important]=\"layout.event.category === 'important'\"\n                        [class.warning]=\"layout.event.category === 'warning'\"\n                        [class.milestone]=\"layout.event.category === 'milestone'\"\n                        [class.personal]=\"layout.event.category === 'personal'\"\n                        [class.completed]=\"layout.event.completed\"\n                        [style.top.%]=\"layout.top\"\n                        [style.height.%]=\"layout.height\"\n                        [style.left.%]=\"layout.left\"\n                        [style.width.%]=\"layout.width\"\n                        [ngStyle]=\"getEventStyles(layout.event)\"\n                        draggable=\"true\"\n                        (dragstart)=\"onEventDragStart($event, layout)\"\n                        (dragend)=\"onEventDragEnd()\"\n                        (click)=\"clickEvent(layout.event)\"\n                        (keydown.enter)=\"clickEvent(layout.event)\"\n                        [title]=\"eventTitle(layout)\"\n                        tabindex=\"0\"\n                      >\n                        <button\n                          class=\"resize-handle resize-start\"\n                          type=\"button\"\n                          aria-label=\"Resize event start\"\n                          (click)=\"$event.stopPropagation()\"\n                          (pointerdown)=\"startResize($event, layout, 'start')\"\n                        ></button>\n                        \n                        @if (eventTemplate()) {\n                          <ng-container *ngTemplateOutlet=\"eventTemplate()!.templateRef; context: { $implicit: layout.event, event: layout.event, layout: layout }\" />\n                        } @else {\n                          <div class=\"event-color-indicator\"></div>\n                          \n                          <!-- Task Completion Checkbox -->\n                          @if (layout.event.category === 'task') {\n                            <input type=\"checkbox\"\n                                   class=\"task-completion-checkbox\"\n                                   [checked]=\"layout.event.completed || false\"\n                                   (click)=\"$event.stopPropagation()\"\n                                   (change)=\"toggleTaskCompletion(layout.event, $event)\" />\n                          }\n\n                          <div class=\"event-details\">\n                            <div class=\"event-header-row\">\n                              <span class=\"event-title\">{{ layout.event.title }}</span>\n                              @if (layout.event.recurrence) {\n                                <svg class=\"recurrence-icon-svg\" viewBox=\"0 0 24 24\" title=\"Recurring series\"><path fill=\"currentColor\" d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L4.7 18.7c-1.07-1.63-1.7-3.6-1.7-5.7 0-5.52 4.48-10 10-10zm7.76 5.74L18.3 10.3c1.07 1.63 1.7 3.6 1.7 5.7 0 5.52-4.48 10-10 10v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"/></svg>\n                              }\n                            </div>\n                            \n                            <span class=\"event-time\">\n                              {{ formatEventTime(layout.start, layout.end) }}\n                              @if (layout.event.resourceId; as resId) {\n                                • {{ getResourceName(resId) }}\n                              }\n                            </span>\n                          </div>\n\n                          <!-- Card Delete Quick Action -->\n                          <button class=\"event-delete-btn\" \n                                  type=\"button\" \n                                  aria-label=\"Delete event\"\n                                  (click)=\"deleteEvent(layout.event, $event)\">\n                            <svg class=\"delete-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M19 4h-3.5l-1-1h-5l-1 1H5v2h14V4zM6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12z\"/></svg>\n                          </button>\n                        }\n\n                        <button\n                          class=\"resize-handle resize-end\"\n                          type=\"button\"\n                          aria-label=\"Resize event end\"\n                          (click)=\"$event.stopPropagation()\"\n                          (pointerdown)=\"startResize($event, layout, 'end')\"\n                        ></button>\n                      </div>\n                    }\n                  </div>\n                }\n              </div>\n            </div>\n          </div>\n        }\n\n        @if (activeMode() === 'month') {\n          <div class=\"month-grid-container\">\n            <div class=\"month-grid-header\">\n              @for (dayName of weekDayLabels(); track dayName) {\n                <div class=\"month-header-cell\">{{ dayName }}</div>\n              }\n            </div>\n\n            <div class=\"month-grid-body\">\n              @for (cell of activeColumns(); track dateKey(cell.date)) {\n                <div\n                  class=\"month-day-cell\"\n                  [class.today]=\"isToday(cell.date)\"\n                  [class.other-month]=\"isOtherMonth(cell.date)\"\n                  (click)=\"clickSlot(cell.date, 9, 0)\"\n                >\n                  <span class=\"month-day-number\">{{ formatDate(cell.date, { day: 'numeric' }) }}</span>\n\n                  <div class=\"month-day-events-list\">\n                    @for (evt of getEventsForDate(cell.date).slice(0, 2); track evt.id) {\n                      <div\n                        class=\"month-event-item\"\n                        [class.meeting]=\"evt.event.category === 'meeting'\"\n                        [class.task]=\"evt.event.category === 'task'\"\n                        [class.important]=\"evt.event.category === 'important'\"\n                        [class.warning]=\"evt.event.category === 'warning'\"\n                        [class.milestone]=\"evt.event.category === 'milestone'\"\n                        [class.personal]=\"evt.event.category === 'personal'\"\n                        [class.completed]=\"evt.event.completed\"\n                        [ngStyle]=\"getEventStyles(evt.event)\"\n                        (click)=\"clickEvent(evt.event); $event.stopPropagation()\"\n                        (keydown.enter)=\"clickEvent(evt.event); $event.stopPropagation()\"\n                        [title]=\"evt.event.title\"\n                        tabindex=\"0\"\n                      >\n                        @if (evt.event.recurrence) {\n                          <svg class=\"month-recurrence-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L4.7 18.7c-1.07-1.63-1.7-3.6-1.7-5.7 0-5.52 4.48-10 10-10zm7.76 5.74L18.3 10.3c1.07 1.63 1.7 3.6 1.7 5.7 0 5.52-4.48 10-10 10v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"/></svg>\n                        }\n                        @if (eventTemplate()) {\n                          <ng-container *ngTemplateOutlet=\"eventTemplate()!.templateRef; context: { $implicit: evt.event, event: evt.event, layout: evt }\" />\n                        } @else {\n                          {{ evt.event.title }}\n                        }\n                      </div>\n                    }\n                    @if (getEventsForDate(cell.date).length > 2) {\n                      <button \n                        class=\"month-more-indicator\" \n                        type=\"button\" \n                        (click)=\"openMonthPopover($event, cell.date)\"\n                      >\n                        +{{ getEventsForDate(cell.date).length - 2 }} more\n                      </button>\n                    }\n                  </div>\n\n                  <!-- Month Events Popover -->\n                  @if (activeMonthPopoverDate() && isSameDate(activeMonthPopoverDate()!, cell.date)) {\n                    <div class=\"month-events-popover\" (click)=\"$event.stopPropagation()\">\n                      <div class=\"popover-header\">\n                        <span class=\"popover-date\">{{ formatDate(cell.date, { weekday: 'short', month: 'short', day: 'numeric' }) }}</span>\n                        <button class=\"popover-close\" type=\"button\" (click)=\"closeMonthPopover($event)\">×</button>\n                      </div>\n                      <div class=\"popover-body\">\n                        @for (evt of getEventsForDate(cell.date); track evt.id) {\n                          <div\n                            class=\"month-event-item popover-event-item\"\n                            [class.meeting]=\"evt.event.category === 'meeting'\"\n                            [class.task]=\"evt.event.category === 'task'\"\n                            [class.important]=\"evt.event.category === 'important'\"\n                            [class.warning]=\"evt.event.category === 'warning'\"\n                            [class.milestone]=\"evt.event.category === 'milestone'\"\n                            [class.personal]=\"evt.event.category === 'personal'\"\n                            [class.completed]=\"evt.event.completed\"\n                            [ngStyle]=\"getEventStyles(evt.event)\"\n                            (click)=\"clickEvent(evt.event); activeMonthPopoverDate.set(null); $event.stopPropagation()\"\n                            (keydown.enter)=\"clickEvent(evt.event); activeMonthPopoverDate.set(null); $event.stopPropagation()\"\n                            [title]=\"evt.event.title\"\n                            tabindex=\"0\"\n                          >\n                            @if (evt.event.recurrence) {\n                              <svg class=\"month-recurrence-icon-svg\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L4.7 18.7c-1.07-1.63-1.7-3.6-1.7-5.7 0-5.52 4.48-10 10-10zm7.76 5.74L18.3 10.3c1.07 1.63 1.7 3.6 1.7 5.7 0 5.52-4.48 10-10 10v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"/></svg>\n                            }\n                            @if (eventTemplate()) {\n                              <ng-container *ngTemplateOutlet=\"eventTemplate()!.templateRef; context: { $implicit: evt.event, event: evt.event, layout: evt }\" />\n                            } @else {\n                              {{ evt.event.title }}\n                            }\n                          </div>\n                        }\n                      </div>\n                    </div>\n                  }\n                </div>\n              }\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host { display: block; width: 100%; height: 100%; }\n    .ngx-scheduler-wrapper { display: flex; flex-direction: column; height: 100%; min-height: 500px; border: 1px solid var(--border-color, #cbd5e1); border-radius: var(--radius-md, 12px); background: var(--bg-secondary, #ffffff); color: var(--text-primary, #0f172a); box-shadow: var(--shadow-md, 0 4px 6px -1px rgba(0, 0, 0, 0.08)); font-family: var(--ngx-font-family, sans-serif); overflow: hidden; transition: all 0.25s; }\n    .scheduler-toolbar { display: flex; justify-content: space-between; align-items: center; padding: 14px 20px; background: var(--border-light, #f1f5f9); border-bottom: 1px solid var(--border-color, #cbd5e1); gap: 16px; flex-wrap: wrap; }\n    .nav-controls { display: flex; align-items: center; gap: 14px; }\n    .nav-buttons-group { display: flex; align-items: center; border: 1px solid var(--border-color, #cbd5e1); border-radius: 8px; overflow: hidden; background: var(--bg-secondary, #ffffff); box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05)); }\n    .tool-btn { background: var(--bg-secondary, #ffffff); border: none; border-right: 1px solid var(--border-color, #cbd5e1); padding: 6px 12px; font-size: 12px; font-weight: 650; cursor: pointer; color: var(--text-primary, #0f172a); transition: all 0.2s; display: flex; align-items: center; justify-content: center; }\n    .tool-btn:last-child { border-right: none; }\n    .tool-btn:hover, .tool-btn:focus-visible { background: var(--border-light, #f1f5f9); color: var(--primary-color, #4f46e5); outline: none; }\n    .tool-btn.nav-arrow { padding: 8px 10px; }\n    .today-btn { font-weight: 750; }\n    .icon-svg, .dropdown-arrow-svg, .export-icon-svg, .recurrence-icon-svg, .month-recurrence-icon-svg, .delete-icon-svg, .plus-icon-svg { width: 16px; height: 16px; display: inline-block; vertical-align: middle; }\n    .current-period-label { margin: 0; font-size: 16px; font-weight: 800; min-width: 180px; }\n    .toolbar-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }\n    \n    /* Search Box styling */\n    .search-box-container { display: flex; align-items: center; background: var(--bg-secondary, #ffffff); border: 1px solid var(--border-color, #cbd5e1); border-radius: 8px; padding: 5px 12px; min-width: 200px; gap: 8px; box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05)); }\n    .search-icon { width: 15px; height: 15px; color: var(--text-secondary, #64748b); }\n    .search-input { border: none; background: transparent; font-size: 12px; color: var(--text-primary, #0f172a); outline: none; width: 100%; font-family: inherit; }\n    .search-input::placeholder { color: var(--text-secondary, #94a3b8); }\n    \n    /* Resource Select styling */\n    .resource-filter-container { display: flex; align-items: center; background: var(--bg-secondary, #ffffff); border: 1px solid var(--border-color, #cbd5e1); border-radius: 8px; padding: 5px 10px; box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05)); }\n    .resource-select { border: none; background: transparent; font-size: 12px; font-weight: 650; color: var(--text-primary, #0f172a); outline: none; cursor: pointer; font-family: inherit; }\n    \n    /* Export Dropdown styling */\n    .export-dropdown-wrapper { position: relative; }\n    .export-toggle-btn { display: flex; align-items: center; gap: 6px; font-weight: 650; border: 1px solid var(--border-color, #cbd5e1); border-radius: 8px; box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05)); }\n    .dropdown-arrow-svg { width: 14px; height: 14px; opacity: 0.7; }\n    .export-menu-dropdown { position: absolute; top: calc(100% + 4px); right: 0; background: var(--bg-secondary, #ffffff); border: 1px solid var(--border-color, #cbd5e1); border-radius: 8px; box-shadow: var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)); z-index: 100; min-width: 170px; display: flex; flex-direction: column; padding: 4px; overflow: hidden; animation: slideDown 0.15s ease-out; }\n    .export-item { display: flex; align-items: center; gap: 10px; border: none; background: none; padding: 8px 12px; font-size: 12px; text-align: left; cursor: pointer; color: var(--text-primary, #334155); border-radius: 6px; font-family: inherit; font-weight: 600; transition: background 0.15s; }\n    .export-item:hover { background: var(--border-light, #f1f5f9); color: var(--primary-color, #4f46e5); }\n    .export-icon-svg { width: 14px; height: 14px; color: var(--text-secondary, #64748b); }\n\n    /* View Switch Controls */\n    .view-switch-controls { display: flex; border: 1px solid var(--border-color, #cbd5e1); border-radius: 8px; overflow: hidden; box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05)); }\n    .view-btn { background: var(--bg-secondary, #ffffff); border: none; border-right: 1px solid var(--border-color, #cbd5e1); padding: 6px 14px; font-size: 12px; font-weight: 650; color: var(--text-secondary, #475569); cursor: pointer; transition: all 0.2s; font-family: inherit; }\n    .view-btn:last-child { border-right: none; }\n    .view-btn.active { background: var(--primary-color, #4f46e5); color: #ffffff; }\n    \n    .scheduler-body { flex: 1; overflow: auto; background: var(--bg-secondary, #ffffff); display: flex; flex-direction: column; }\n    .time-grid-container { display: flex; flex-direction: column; flex: 1; min-width: 600px; }\n    .time-grid-header { display: flex; background: var(--border-light, #f8fafc); border-bottom: 1px solid var(--border-color, #cbd5e1); position: sticky; top: 0; z-index: 10; }\n    .time-axis-header { width: 70px; flex-shrink: 0; border-right: 1px solid var(--border-color, #cbd5e1); }\n    .columns-headers-wrap { flex: 1; display: flex; }\n    .column-header-cell { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 10px 0; border-right: 1px solid var(--border-color, #e2e8f0); min-width: 120px; }\n    .column-header-cell:last-child { border-right: none; }\n    .column-header-cell.today { background: var(--primary-glow, rgba(79, 70, 229, 0.03)); }\n    .column-header-cell.today .day-num { background: var(--primary-color, #4f46e5); color: #ffffff; width: 26px; height: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; margin-top: 2px; }\n    .day-name { font-size: 11px; font-weight: 650; color: var(--text-secondary, #64748b); text-transform: uppercase; letter-spacing: 0.5px; }\n    .day-num { font-size: 14px; margin-top: 4px; color: var(--text-primary, #0f172a); }\n\n    /* Resource Header Styling */\n    .resource-header-card { display: flex; align-items: center; gap: 10px; padding: 4px 12px; width: 100%; text-align: left; }\n    .resource-avatar { width: 32px; height: 32px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-light, #e2e8f0); }\n    .resource-initials { width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 750; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.2); }\n    .resource-info { display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n    .resource-name { font-size: 13px; font-weight: 750; color: var(--text-primary, #0f172a); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .resource-desc { font-size: 10px; color: var(--text-secondary, #64748b); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n\n    /* All-Day Events row styling */\n    .all-day-row-container { display: flex; background: var(--border-light, #f8fafc); border-bottom: 1px solid var(--border-color, #cbd5e1); z-index: 8; position: relative; }\n    .all-day-label-cell { width: 70px; flex-shrink: 0; border-right: 1px solid var(--border-color, #cbd5e1); font-size: 10px; font-weight: 750; color: var(--text-secondary, #64748b); display: flex; align-items: center; justify-content: flex-end; padding-right: 10px; text-transform: uppercase; letter-spacing: 0.5px; }\n    .all-day-columns-wrap { flex: 1; display: flex; min-height: 38px; padding: 4px 0; }\n    .all-day-column-cell { flex: 1; display: flex; flex-direction: column; gap: 4px; padding: 0 4px; border-right: 1px solid var(--border-light, #e2e8f0); min-width: 120px; box-sizing: border-box; justify-content: center; }\n    .all-day-column-cell:last-child { border-right: none; }\n    .all-day-event-block { display: flex; align-items: center; gap: 6px; border-radius: 6px; padding: 4px 8px; font-size: 11px; font-weight: 700; cursor: pointer; border: 1px solid transparent; box-shadow: var(--shadow-sm); position: relative; overflow: hidden; min-height: 22px; transition: transform 0.15s; }\n    .all-day-event-block:hover { transform: translateY(-1px); }\n    .all-day-event-block.completed .all-day-event-title { text-decoration: line-through; opacity: 0.65; }\n    .all-day-event-indicator { width: 4px; height: 12px; border-radius: 2px; background: currentColor; flex-shrink: 0; }\n    .all-day-event-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0; }\n    .event-delete-btn.all-day-del { opacity: 0; position: absolute; right: 4px; top: 2px; width: 18px; height: 18px; }\n    .all-day-event-block:hover .event-delete-btn.all-day-del { opacity: 1; }\n\n    .time-grid-body { display: flex; flex: 1; position: relative; }\n    .time-axis-labels { width: 70px; flex-shrink: 0; border-right: 1px solid var(--border-color, #cbd5e1); background: var(--border-light, #f8fafc); user-select: none; }\n    .time-label { height: 60px; font-size: 11px; font-weight: 650; color: var(--text-secondary, #64748b); text-align: right; padding-right: 10px; margin-top: -6px; }\n    .columns-body-wrap { flex: 1; display: flex; position: relative; }\n    .hourly-grid-lines { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1; }\n    .grid-line { height: 60px; border-bottom: 1px solid var(--border-light, #e2e8f0); }\n    \n    .column-body-cell { flex: 1; border-right: 1px solid var(--border-light, #e2e8f0); position: relative; z-index: 2; min-width: 120px; }\n    .column-body-cell:last-child { border-right: none; }\n    .interactive-slots-overlay { position: absolute; inset: 0; display: flex; flex-direction: column; z-index: 1; }\n    .slot-trigger { flex: 0 0 auto; cursor: cell; transition: background 0.15s; }\n    .slot-trigger:hover { background: var(--primary-glow, rgba(79, 70, 229, 0.02)); }\n    .slot-trigger.non-business-slot { background: var(--border-light, #f8fafc); opacity: 0.85; background-image: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(148, 163, 184, 0.04) 10px, rgba(148, 163, 184, 0.04) 20px); }\n\n    /* Task completion checkbox styling */\n    .task-completion-checkbox {\n      width: 14px;\n      height: 14px;\n      margin: 0;\n      cursor: pointer;\n      flex-shrink: 0;\n      accent-color: var(--primary-color, #4f46e5);\n      border-radius: 4px;\n      border: 1px solid var(--border-color, #cbd5e1);\n      outline: none;\n      align-self: center;\n      transition: accent-color 0.15s;\n      z-index: 5;\n    }\n    .all-day-task-checkbox {\n      width: 12px;\n      height: 12px;\n    }\n\n    /* Live Current Time Indicator styling */\n    .current-time-line { position: absolute; left: 0; right: 0; height: 2px; background: #ef4444; z-index: 10; pointer-events: none; }\n    .line-dot { position: absolute; left: -4px; top: -3px; width: 8px; height: 8px; border-radius: 50%; background: #ef4444; box-shadow: 0 0 6px rgba(239, 68, 68, 0.8); animation: pulse-glow 2s infinite; }\n\n    @keyframes pulse-glow {\n      0% { transform: scale(1); box-shadow: 0 0 4px 0px rgba(239, 68, 68, 0.8); }\n      50% { transform: scale(1.35); box-shadow: 0 0 12px 4px rgba(239, 68, 68, 0.45); }\n      100% { transform: scale(1); box-shadow: 0 0 4px 0px rgba(239, 68, 68, 0.8); }\n    }\n\n    /* Drag Selection Preview styling */\n    .drag-select-preview { position: absolute; left: 4px; right: 4px; border: 2px dashed var(--primary-color, #4f46e5); border-radius: 8px; background: rgba(79, 70, 229, 0.08); z-index: 5; pointer-events: none; display: flex; align-items: center; justify-content: center; box-sizing: border-box; }\n    .preview-inner { display: flex; align-items: center; gap: 6px; color: var(--primary-color, #4f46e5); font-size: 11px; font-weight: 750; background: #ffffff; padding: 4px 10px; border-radius: 20px; box-shadow: var(--shadow-sm); border: 1px solid rgba(79, 70, 229, 0.2); }\n    .plus-icon-svg { color: var(--primary-color, #4f46e5); width: 14px; height: 14px; }\n\n    /* Event Cards styling */\n    .scheduler-event-card { position: absolute; right: auto; border-radius: 8px; padding: 8px 10px; font-size: 12px; line-height: 1.4; cursor: grab; display: flex; gap: 8px; z-index: 3; box-shadow: var(--shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.05)); transition: transform 0.2s, box-shadow 0.2s; overflow: hidden; border: 1px solid transparent; min-height: 28px; outline: none; }\n    .scheduler-event-card:hover { transform: translateY(-1px); box-shadow: var(--shadow-md, 0 4px 6px -1px rgba(0, 0, 0, 0.1)); z-index: 4; }\n    .scheduler-event-card:focus-visible { border-color: var(--primary-color, #4f46e5); box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.25); }\n    .scheduler-event-card.completed .event-title { text-decoration: line-through; opacity: 0.65; }\n    .event-color-indicator { width: 3px; height: 100%; border-radius: 2px; flex-shrink: 0; background: currentColor; }\n    .event-details { display: flex; flex-direction: column; gap: 2px; overflow: hidden; min-width: 0; flex: 1; }\n    .event-header-row { display: flex; justify-content: space-between; align-items: flex-start; gap: 4px; width: 100%; }\n    .event-title { font-weight: 750; color: inherit; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .event-time { font-size: 10px; opacity: 0.82; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .recurrence-icon-svg { color: currentColor; opacity: 0.65; width: 13px; height: 13px; flex-shrink: 0; margin-top: 1px; }\n\n    /* Card Delete Button */\n    .event-delete-btn { position: absolute; top: 6px; right: 6px; border: none; background: rgba(255,255,255,0.75); border-radius: 4px; width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; cursor: pointer; color: var(--ngx-schedule-important-text, #ef4444); opacity: 0; transition: opacity 0.15s, background 0.15s; }\n    .event-delete-btn:hover { background: #ffffff; color: #dc2626; transform: scale(1.05); }\n    .scheduler-event-card:hover .event-delete-btn { opacity: 1; }\n    .delete-icon-svg { width: 12px; height: 12px; }\n\n    /* Resize Handles */\n    .resize-handle { position: absolute; left: 0; right: 0; height: 8px; border: 0; background: transparent; cursor: ns-resize; display: flex; align-items: center; justify-content: center; z-index: 10; transition: background 0.15s; }\n    .resize-handle::after { content: ''; width: 24px; height: 2px; background: rgba(0,0,0,0.15); border-radius: 1px; opacity: 0; transition: opacity 0.15s; }\n    .ngx-scheduler-wrapper.dark .resize-handle::after { background: rgba(255,255,255,0.25); }\n    .scheduler-event-card:hover .resize-handle::after { opacity: 1; }\n    .resize-handle:hover { background: rgba(0, 0, 0, 0.05); }\n    .ngx-scheduler-wrapper.dark .resize-handle:hover { background: rgba(255, 255, 255, 0.05); }\n    .resize-start { top: 0; }\n    .resize-end { bottom: 0; }\n\n    /* Month Grid layout */\n    .month-grid-container { display: flex; flex-direction: column; flex: 1; min-height: 500px; }\n    .month-grid-header { display: flex; background: var(--border-light, #f8fafc); border-bottom: 1px solid var(--border-color, #cbd5e1); position: sticky; top: 0; z-index: 10; }\n    .month-header-cell { flex: 1; text-align: center; padding: 10px 0; font-size: 11px; font-weight: 750; color: var(--text-secondary, #64748b); text-transform: uppercase; letter-spacing: 0.5px; border-right: 1px solid var(--border-color, #cbd5e1); }\n    .month-header-cell:last-child { border-right: none; }\n    .month-grid-body { display: grid; grid-template-columns: repeat(7, minmax(110px, 1fr)); grid-auto-rows: minmax(100px, 1fr); flex: 1; }\n    .month-day-cell { border-right: 1px solid var(--border-light, #e2e8f0); border-bottom: 1px solid var(--border-light, #e2e8f0); padding: 6px; display: flex; flex-direction: column; gap: 6px; cursor: pointer; position: relative; transition: background 0.15s; }\n    .month-day-cell:nth-child(7n) { border-right: none; }\n    .month-day-cell:hover { background: var(--primary-glow, rgba(79, 70, 229, 0.01)); }\n    .month-day-cell.today { background: var(--primary-glow, rgba(79, 70, 229, 0.02)); }\n    .month-day-cell.today .month-day-number { background: var(--primary-color, #4f46e5); color: #ffffff; width: 22px; height: 22px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; }\n    .month-day-cell.other-month { opacity: 0.45; }\n    .month-day-number { font-size: 11px; font-weight: 650; color: var(--text-secondary, #475569); width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; }\n    \n    .month-day-events-list { display: flex; flex-direction: column; gap: 4px; overflow-y: auto; max-height: 90px; }\n    .month-event-item { font-size: 10px; font-weight: 650; padding: 2px 6px; border-radius: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; transition: transform 0.1s; display: flex; align-items: center; outline: none; }\n    .month-event-item:hover { transform: scale(1.02); }\n    .month-event-item:focus-visible { box-shadow: 0 0 0 2px var(--primary-color, #4f46e5); }\n    .month-event-item.completed { text-decoration: line-through; opacity: 0.65; }\n    .month-recurrence-icon-svg { color: currentColor; opacity: 0.8; width: 11px; height: 11px; margin-right: 3px; display: inline-block; flex-shrink: 0; }\n\n    /* Month popover styles */\n    .month-more-indicator { background: var(--primary-glow, rgba(79, 70, 229, 0.08)); color: var(--primary-color, #4f46e5); border: none; border-radius: 4px; font-size: 10px; font-weight: 700; padding: 3px 6px; cursor: pointer; text-align: left; transition: background 0.15s; width: 100%; outline: none; }\n    .month-more-indicator:hover { background: rgba(79, 70, 229, 0.15); }\n    .month-more-indicator:focus-visible { box-shadow: 0 0 0 2px var(--primary-color, #4f46e5); }\n    .month-events-popover { position: absolute; top: 4px; left: 4px; right: 4px; background: var(--bg-secondary, #ffffff); border: 1px solid var(--border-color, #cbd5e1); border-radius: 8px; box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); z-index: 100; display: flex; flex-direction: column; padding: 8px; min-width: 180px; animation: popoverFadeIn 0.15s ease-out; }\n    .popover-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; border-bottom: 1px solid var(--border-light, #e2e8f0); padding-bottom: 4px; }\n    .popover-date { font-size: 11px; font-weight: 750; color: var(--text-secondary, #475569); }\n    .popover-close { background: none; border: none; font-size: 16px; font-weight: 700; color: #94a3b8; cursor: pointer; line-height: 1; padding: 0 2px; }\n    .popover-close:hover { color: #475569; }\n    .popover-body { display: flex; flex-direction: column; gap: 4px; max-height: 200px; overflow-y: auto; }\n    .popover-event-item { margin-bottom: 2px; }\n\n    @keyframes popoverFadeIn {\n      from { opacity: 0; transform: scale(0.95); }\n      to { opacity: 1; transform: scale(1); }\n    }\n\n    /* Theme Categories */\n    .meeting { background-color: var(--ngx-schedule-meeting-bg, rgba(59, 130, 246, 0.07)); border-color: var(--ngx-schedule-meeting-border, rgba(59, 130, 246, 0.15)); color: var(--ngx-schedule-meeting-text, #2563eb); border-left: 4px solid #3b82f6 !important; }\n    .task { background-color: var(--ngx-schedule-task-bg, rgba(16, 185, 129, 0.07)); border-color: var(--ngx-schedule-task-border, rgba(16, 185, 129, 0.15)); color: var(--ngx-schedule-task-text, #059669); border-left: 4px solid #10b981 !important; }\n    .important { background-color: var(--ngx-schedule-important-bg, rgba(239, 68, 68, 0.07)); border-color: var(--ngx-schedule-important-border, rgba(239, 68, 68, 0.15)); color: var(--ngx-schedule-important-text, #dc2626); border-left: 4px solid #ef4444 !important; }\n    .warning { background-color: var(--ngx-schedule-warning-bg, rgba(245, 158, 11, 0.07)); border-color: var(--ngx-schedule-warning-border, rgba(245, 158, 11, 0.15)); color: var(--ngx-schedule-warning-text, #d97706); border-left: 4px solid #f59e0b !important; }\n    .milestone { background-color: var(--ngx-schedule-milestone-bg, rgba(139, 92, 246, 0.07)); border-color: var(--ngx-schedule-milestone-border, rgba(139, 92, 246, 0.15)); color: var(--ngx-schedule-milestone-text, #7c3aed); border-left: 4px solid #8b5cf6 !important; }\n    .personal { background-color: var(--ngx-schedule-personal-bg, rgba(20, 184, 166, 0.07)); border-color: var(--ngx-schedule-personal-border, rgba(20, 184, 166, 0.15)); color: var(--ngx-schedule-personal-text, #0d9488); border-left: 4px solid #14b8a6 !important; }\n    \n    /* Dark Theme Support */\n    .ngx-scheduler-wrapper.dark { border-color: #1f2937; background: #0f172a; color: #f8fafc; }\n    .ngx-scheduler-wrapper.dark .scheduler-toolbar, .ngx-scheduler-wrapper.dark .time-grid-header, .ngx-scheduler-wrapper.dark .time-axis-labels, .ngx-scheduler-wrapper.dark .month-grid-header { background: #1e293b; border-color: #1f2937; }\n    \n    .ngx-scheduler-wrapper.dark .nav-buttons-group,\n    .ngx-scheduler-wrapper.dark .search-box-container,\n    .ngx-scheduler-wrapper.dark .resource-filter-container,\n    .ngx-scheduler-wrapper.dark .export-menu-dropdown { background: #0f172a; border-color: #1f2937; }\n    \n    .ngx-scheduler-wrapper.dark .tool-btn, .ngx-scheduler-wrapper.dark .view-btn { background: #0f172a; border-color: #1f2937; color: #94a3b8; }\n    .ngx-scheduler-wrapper.dark .view-btn.active { background: var(--primary-color, #6366f1); color: #ffffff; }\n    .ngx-scheduler-wrapper.dark .grid-line, .ngx-scheduler-wrapper.dark .column-body-cell, .ngx-scheduler-wrapper.dark .month-day-cell { border-color: #1f2937; }\n    \n    .ngx-scheduler-wrapper.dark .search-input,\n    .ngx-scheduler-wrapper.dark .resource-select { color: #f8fafc; }\n    .ngx-scheduler-wrapper.dark .export-item { color: #cbd5e1; }\n    .ngx-scheduler-wrapper.dark .export-item:hover { background: #1e293b; color: #6366f1; }\n    .ngx-scheduler-wrapper.dark .resource-name { color: #f8fafc; }\n    .ngx-scheduler-wrapper.dark .resource-desc { color: #94a3b8; }\n\n    .ngx-scheduler-wrapper.dark .all-day-row-container { background: #1e293b; border-color: #1f2937; }\n    .ngx-scheduler-wrapper.dark .all-day-column-cell { border-color: #1f2937; }\n    .ngx-scheduler-wrapper.dark .all-day-event-block { border-color: transparent; }\n    .ngx-scheduler-wrapper.dark .slot-trigger.non-business-slot { background: #0f172a; background-image: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(31, 41, 55, 0.25) 10px, rgba(31, 41, 55, 0.25) 20px); }\n\n    .ngx-scheduler-wrapper.dark .preview-inner { background: #0f172a; border-color: rgba(99, 102, 241, 0.4); color: #818cf8; }\n    .ngx-scheduler-wrapper.dark .plus-icon-svg { color: #818cf8; }\n    .ngx-scheduler-wrapper.dark .event-delete-btn { background: rgba(15, 23, 42, 0.6); color: #f87171; }\n    .ngx-scheduler-wrapper.dark .event-delete-btn:hover { background: #1e293b; }\n    .ngx-scheduler-wrapper.dark .task-completion-checkbox { border-color: #374151; background: #1f2937; }\n    .ngx-scheduler-wrapper.dark .month-events-popover { background: #1e293b; border-color: #374151; }\n    .ngx-scheduler-wrapper.dark .popover-date { color: #94a3b8; }\n    .ngx-scheduler-wrapper.dark .popover-header { border-color: #374151; }\n\n    @keyframes slideDown {\n      from { opacity: 0; transform: translateY(-4px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n  `]\n})\nexport class SchedulerComponent implements OnInit, OnDestroy {\n  i18n = inject(NGX_CORE_I18N);\n\n  getViewModeLabel(mode: string): string {\n    if (mode === 'day') return this.i18n.scheduler.day;\n    if (mode === 'week') return this.i18n.scheduler.week;\n    if (mode === 'month') return this.i18n.scheduler.month;\n    return mode;\n  }\n\n  readonly hourHeight = 60;\n  viewModes: ('day' | 'week' | 'month')[] = ['day', 'week', 'month'];\n\n  // Component inputs\n  events = input<SchedulerEvent[]>([]);\n  currentDate = input<Date>(new Date());\n  viewMode = input<'day' | 'week' | 'month'>('week');\n  theme = input<'light' | 'dark'>('light');\n  businessHoursStart = input<number>(8);\n  businessHoursEnd = input<number>(20);\n  weekStartsOn = input<0 | 1 | 2 | 3 | 4 | 5 | 6>(0);\n  timeZone = input<string | undefined>(undefined);\n  slotMinutes = input<number>(60);\n\n  // New Enterprise feature inputs\n  resources = input<SchedulerResource[]>([]);\n  enableDragToCreate = input<boolean>(true);\n  showSearch = input<boolean>(true);\n  showWorkHoursOnly = input<boolean>(true);\n\n  // Component outputs\n  eventClick = output<SchedulerEvent>();\n  slotClick = output<SchedulerSlotClickEvent>();\n  eventTimeChange = output<SchedulerEventChangeEvent>();\n  slotRangeSelect = output<SchedulerSlotRangeSelectEvent>();\n  eventDelete = output<SchedulerEvent>();\n  currentDateChange = output<Date>();\n\n  // State Management\n  activeDate = signal<Date>(new Date());\n  activeMode = signal<'day' | 'week' | 'month'>('week');\n  selectedResourceId = signal<string | null>(null);\n  searchQuery = signal<string>('');\n  dragSelectStart = signal<{ date: Date; hour: number; minute: number; resourceId?: string } | null>(null);\n  dragSelectCurrent = signal<{ date: Date; hour: number; minute: number; resourceId?: string } | null>(null);\n  showExportDropdown = signal<boolean>(false);\n  activeMonthPopoverDate = signal<Date | null>(null);\n\n  eventTemplate = contentChild(NgxSchedulerEventTemplateDirective);\n\n  openMonthPopover(event: MouseEvent, date: Date): void {\n    event.stopPropagation();\n    this.activeMonthPopoverDate.set(date);\n  }\n\n  closeMonthPopover(event: MouseEvent): void {\n    event.stopPropagation();\n    this.activeMonthPopoverDate.set(null);\n  }\n\n  @HostListener('window:keydown', ['$event'])\n  handleKeyDown(event: KeyboardEvent): void {\n    const activeEl = document.activeElement;\n    if (activeEl) {\n      const tagName = activeEl.tagName.toLowerCase();\n      if (tagName === 'input' || tagName === 'textarea' || tagName === 'select' || activeEl.getAttribute('contenteditable') === 'true') {\n        return;\n      }\n    }\n\n    switch (event.key.toLowerCase()) {\n      case 't':\n        this.goToToday();\n        event.preventDefault();\n        break;\n      case 'd':\n        this.activeMode.set('day');\n        event.preventDefault();\n        break;\n      case 'w':\n        this.activeMode.set('week');\n        event.preventDefault();\n        break;\n      case 'm':\n        this.activeMode.set('month');\n        event.preventDefault();\n        break;\n      case 'arrowleft':\n        this.navigate(-1);\n        event.preventDefault();\n        break;\n      case 'arrowright':\n        this.navigate(1);\n        event.preventDefault();\n        break;\n    }\n  }\n\n  // Live Current-Time Indicator State\n  now = signal<Date>(new Date());\n  private timeIntervalId?: any;\n\n  private activeDragEvent = signal<ResolvedSchedulerEvent | null>(null);\n  private resizeState: ResizeState | null = null;\n\n  constructor() {\n    effect(() => {\n      this.activeDate.set(this.currentDate());\n    }, { allowSignalWrites: true });\n\n    effect(() => {\n      this.activeMode.set(this.viewMode());\n    }, { allowSignalWrites: true });\n  }\n\n  ngOnInit() {\n    if (typeof window !== 'undefined') {\n      this.timeIntervalId = setInterval(() => {\n        this.now.set(new Date());\n      }, 30000);\n    }\n  }\n\n  ngOnDestroy() {\n    if (this.timeIntervalId) {\n      clearInterval(this.timeIntervalId);\n    }\n  }\n\n  // Filter events based on keyword and resource selector\n  filteredEvents = computed(() => {\n    let list = this.events();\n    const query = this.searchQuery().toLowerCase().trim();\n    if (query) {\n      list = list.filter(evt =>\n        evt.title.toLowerCase().includes(query) ||\n        (evt.description && evt.description.toLowerCase().includes(query)) ||\n        (evt.category && evt.category.toLowerCase().includes(query))\n      );\n    }\n\n    const selectedRes = this.selectedResourceId();\n    const mode = this.activeMode();\n    if (selectedRes && mode !== 'day') {\n      list = list.filter(evt => evt.resourceId === selectedRes);\n    }\n\n    return list;\n  });\n\n  hasAllDayEvents = computed(() => {\n    return this.filteredEvents().some(evt => evt.isAllDay === true);\n  });\n\n  currentTimeTop = computed(() => {\n    const currentTime = this.now();\n    const startHour = this.showWorkHoursOnly() ? this.normalizedStartHour() : 0;\n    const endHour = this.showWorkHoursOnly() ? this.normalizedEndHour() : 24;\n    const hour = currentTime.getHours() + currentTime.getMinutes() / 60;\n    \n    if (hour < startHour || hour > endHour) return null;\n    const pct = ((hour - startHour) / (endHour - startHour)) * 100;\n    return pct;\n  });\n\n  hours = computed(() => {\n    const start = this.showWorkHoursOnly() ? this.normalizedStartHour() : 0;\n    const end = this.showWorkHoursOnly() ? this.normalizedEndHour() : 24;\n    const list: number[] = [];\n    for (let i = start; i < end; i++) list.push(i);\n    return list;\n  });\n\n  timeSlots = computed<TimeSlot[]>(() => {\n    const slots: TimeSlot[] = [];\n    const minutes = this.normalizedSlotMinutes();\n    for (const hour of this.hours()) {\n      for (let minute = 0; minute < 60; minute += minutes) {\n        slots.push({ hour, minute, key: `${hour}:${minute}` });\n      }\n    }\n    return slots;\n  });\n\n  activeColumns = computed<{ date: Date; resource?: SchedulerResource }[]>(() => {\n    const mode = this.activeMode();\n    const date = this.activeDate();\n    const resList = this.resources();\n\n    if (mode === 'day') {\n      if (resList.length > 0) {\n        return resList.map(res => ({ date, resource: res }));\n      }\n      return [{ date }];\n    }\n    if (mode === 'week') {\n      const days = this.getWeekDays(this.getStartOfWeek(date));\n      return days.map(d => ({ date: d }));\n    }\n    const monthDays = this.getMonthDays(date);\n    return monthDays.map(d => ({ date: d }));\n  });\n\n  weekDayLabels = computed(() => {\n    const base = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n    const start = this.weekStartsOn();\n    return [...base.slice(start), ...base.slice(0, start)];\n  });\n\n  periodLabel = computed(() => {\n    const mode = this.activeMode();\n    const date = this.activeDate();\n\n    if (mode === 'day') {\n      return this.formatDate(date, { month: 'long', day: 'numeric', year: 'numeric' });\n    }\n\n    if (mode === 'week') {\n      const cols = this.activeColumns();\n      const start = cols[0].date;\n      const end = cols[6].date;\n      if (start.getMonth() === end.getMonth()) {\n        return `${this.formatDate(start, { month: 'long' })} ${this.formatDate(start, { year: 'numeric' })}`;\n      }\n      return `${this.formatDate(start, { month: 'short' })} - ${this.formatDate(end, { month: 'short', year: 'numeric' })}`;\n    }\n\n    return this.formatDate(date, { month: 'long', year: 'numeric' });\n  });\n\n  slotHeight(): number {\n    return this.hourHeight * (this.normalizedSlotMinutes() / 60);\n  }\n\n  navigate(direction: number): void {\n    const mode = this.activeMode();\n    const current = new Date(this.activeDate());\n    if (mode === 'day') current.setDate(current.getDate() + direction);\n    else if (mode === 'week') current.setDate(current.getDate() + direction * 7);\n    else current.setMonth(current.getMonth() + direction);\n    this.activeDate.set(current);\n    this.currentDateChange.emit(current);\n  }\n\n  goToToday(): void {\n    const today = new Date();\n    this.activeDate.set(today);\n    this.currentDateChange.emit(today);\n  }\n\n  getEventsForDate(date: Date): ResolvedSchedulerEvent[] {\n    return this.filteredEvents()\n      .flatMap(event => this.resolveEventForDate(event, date))\n      .sort((a, b) => a.start.getTime() - b.start.getTime());\n  }\n\n  getEventsForColumn(col: { date: Date; resource?: SchedulerResource }): ResolvedSchedulerEvent[] {\n    return this.filteredEvents()\n      .filter(evt => !evt.isAllDay)\n      .flatMap(event => this.resolveEventForDate(event, col.date))\n      .filter(resolved => {\n        if (col.resource) {\n          return resolved.event.resourceId === col.resource.id;\n        }\n        return true;\n      })\n      .sort((a, b) => a.start.getTime() - b.start.getTime());\n  }\n\n  getAllDayEventsForColumn(col: { date: Date; resource?: SchedulerResource }): ResolvedSchedulerEvent[] {\n    return this.filteredEvents()\n      .filter(evt => evt.isAllDay === true)\n      .flatMap(event => this.resolveEventForDate(event, col.date))\n      .filter(resolved => {\n        if (col.resource) {\n          return resolved.event.resourceId === col.resource.id;\n        }\n        return true;\n      })\n      .sort((a, b) => a.start.getTime() - b.start.getTime());\n  }\n\n  getEventLayoutsForColumn(col: { date: Date; resource?: SchedulerResource }): SchedulerEventLayout[] {\n    const events = this.getEventsForColumn(col);\n    const groups: ResolvedSchedulerEvent[][] = [];\n    let group: ResolvedSchedulerEvent[] = [];\n    let groupEnd = 0;\n\n    for (const event of events) {\n      if (!group.length || event.start.getTime() < groupEnd) {\n        group.push(event);\n        groupEnd = Math.max(groupEnd, event.end.getTime());\n      } else {\n        groups.push(group);\n        group = [event];\n        groupEnd = event.end.getTime();\n      }\n    }\n    if (group.length) groups.push(group);\n\n    return groups.flatMap(eventsGroup => this.layoutOverlapGroup(eventsGroup));\n  }\n\n  clickEvent(event: SchedulerEvent): void {\n    this.eventClick.emit(event);\n  }\n\n  clickSlot(date: Date, hour: number, minute = 0, resourceId?: string): void {\n    const targetDate = new Date(date);\n    targetDate.setHours(hour, minute, 0, 0);\n    this.slotClick.emit({ date: targetDate, hour, minute, resourceId });\n  }\n\n  deleteEvent(event: SchedulerEvent, clickEvent: MouseEvent): void {\n    clickEvent.stopPropagation();\n    this.eventDelete.emit(event);\n  }\n\n  toggleTaskCompletion(event: SchedulerEvent, clickEvent: Event): void {\n    const isChecked = (clickEvent.target as HTMLInputElement).checked;\n    this.eventTimeChange.emit({\n      event: { ...event, completed: isChecked },\n      start: event.start,\n      end: event.end\n    });\n  }\n\n  getEventStyles(event: SchedulerEvent): { [key: string]: string } {\n    const styles: { [key: string]: string } = {};\n    if (event.color) {\n      const color = event.color;\n      if (color.startsWith('#')) {\n        styles['background-color'] = `${color}12`;\n        styles['border-color'] = `${color}33`;\n        styles['color'] = color;\n        styles['border-left'] = `4px solid ${color}`;\n      } else {\n        styles['background-color'] = color;\n        styles['color'] = '#ffffff';\n      }\n    }\n    return styles;\n  }\n\n  onSearchInput(event: Event): void {\n    const val = (event.target as HTMLInputElement).value;\n    this.searchQuery.set(val);\n  }\n\n  onResourceFilterChange(event: Event): void {\n    const val = (event.target as HTMLSelectElement).value;\n    this.selectedResourceId.set(val || null);\n  }\n\n  isNonBusinessHour(hour: number): boolean {\n    return hour < this.normalizedStartHour() || hour >= this.normalizedEndHour();\n  }\n\n  // Pointer drag-to-create handlers\n  onSlotPointerDown(event: PointerEvent, date: Date, hour: number, minute: number, resourceId?: string): void {\n    if (!this.enableDragToCreate() || event.button !== 0) return;\n    const target = event.target as HTMLElement;\n    if (target.closest('.scheduler-event-card')) return;\n\n    event.preventDefault();\n    (event.target as HTMLElement).setPointerCapture(event.pointerId);\n\n    this.dragSelectStart.set({ date, hour, minute, resourceId });\n    this.dragSelectCurrent.set({ date, hour, minute, resourceId });\n  }\n\n  onSlotPointerEnter(event: PointerEvent, date: Date, hour: number, minute: number, resourceId?: string): void {\n    const start = this.dragSelectStart();\n    if (!start) return;\n\n    if (this.dateKey(start.date) === this.dateKey(date) && start.resourceId === resourceId) {\n      this.dragSelectCurrent.set({ date, hour, minute, resourceId });\n    }\n  }\n\n  @HostListener('window:pointerup', ['$event'])\n  onWindowPointerUp(event: PointerEvent): void {\n    const start = this.dragSelectStart();\n    const current = this.dragSelectCurrent();\n    if (start && current) {\n      try {\n        const capturedEl = document.querySelector(':focus') || event.target as HTMLElement;\n        if (capturedEl && 'releasePointerCapture' in capturedEl) {\n          (capturedEl as any).releasePointerCapture(event.pointerId);\n        }\n      } catch (e) {}\n\n      const colDate = new Date(start.date);\n      const startMinutes = start.hour * 60 + start.minute;\n      const currentMinutes = current.hour * 60 + current.minute;\n      \n      const minMinutes = Math.min(startMinutes, currentMinutes);\n      const maxMinutes = Math.max(startMinutes, currentMinutes) + this.normalizedSlotMinutes();\n\n      const startDate = new Date(colDate);\n      startDate.setHours(Math.floor(minMinutes / 60), minMinutes % 60, 0, 0);\n\n      const endDate = new Date(colDate);\n      endDate.setHours(Math.floor(maxMinutes / 60), maxMinutes % 60, 0, 0);\n\n      this.slotRangeSelect.emit({\n        start: startDate,\n        end: endDate,\n        resourceId: start.resourceId\n      });\n\n      this.dragSelectStart.set(null);\n      this.dragSelectCurrent.set(null);\n    }\n  }\n\n  getDragSelectionLayout(col: { date: Date; resource?: SchedulerResource }): { top: number; height: number } | null {\n    const start = this.dragSelectStart();\n    const current = this.dragSelectCurrent();\n    if (!start || !current) return null;\n\n    if (this.dateKey(start.date) !== this.dateKey(col.date) || start.resourceId !== col.resource?.id) {\n      return null;\n    }\n\n    const startMinutes = start.hour * 60 + start.minute;\n    const currentMinutes = current.hour * 60 + current.minute;\n\n    const minMinutes = Math.min(startMinutes, currentMinutes);\n    const maxMinutes = Math.max(startMinutes, currentMinutes) + this.normalizedSlotMinutes();\n\n    const startRange = this.showWorkHoursOnly() ? this.normalizedStartHour() : 0;\n    const endRange = this.showWorkHoursOnly() ? this.normalizedEndHour() : 24;\n    const totalHours = endRange - startRange;\n\n    const startHourFraction = minMinutes / 60;\n    const endHourFraction = maxMinutes / 60;\n\n    const top = ((startHourFraction - startRange) / totalHours) * 100;\n    const height = ((endHourFraction - startHourFraction) / totalHours) * 100;\n\n    return {\n      top: Math.max(0, Math.min(100, top)),\n      height: Math.max(2, Math.min(100 - top, height))\n    };\n  }\n\n  onSlotDragOver(event: DragEvent): void {\n    if (this.activeDragEvent()) event.preventDefault();\n  }\n\n  onEventDragStart(event: DragEvent, layout: SchedulerEventLayout): void {\n    this.activeDragEvent.set(layout);\n    if (event.dataTransfer) {\n      event.dataTransfer.effectAllowed = 'move';\n      event.dataTransfer.setData('text/plain', layout.event.id);\n    }\n  }\n\n  onEventDragEnd(): void {\n    this.activeDragEvent.set(null);\n  }\n\n  onSlotDrop(event: DragEvent, date: Date, hour: number, minute = 0, resourceId?: string): void {\n    event.preventDefault();\n    const dragged = this.activeDragEvent();\n    if (!dragged) return;\n\n    const duration = dragged.end.getTime() - dragged.start.getTime();\n    const start = new Date(date);\n    start.setHours(hour, minute, 0, 0);\n    const end = new Date(start.getTime() + duration);\n\n    const updatedEvent = { ...dragged.event };\n    if (resourceId !== undefined) {\n      updatedEvent.resourceId = resourceId;\n    }\n\n    this.eventTimeChange.emit({\n      event: updatedEvent,\n      start,\n      end,\n      occurrenceStart: dragged.start,\n      occurrenceEnd: dragged.end,\n    });\n    this.activeDragEvent.set(null);\n  }\n\n  startResize(event: PointerEvent, layout: SchedulerEventLayout, edge: 'start' | 'end'): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.resizeState = {\n      event: layout.event,\n      edge,\n      start: layout.start,\n      end: layout.end,\n      originY: event.clientY,\n    };\n  }\n\n  @HostListener('window:pointerup', ['$event'])\n  finishResize(event: PointerEvent): void {\n    if (!this.resizeState) return;\n    const state = this.resizeState;\n    const deltaSlots = Math.round((event.clientY - state.originY) / this.slotHeight());\n    const deltaMs = deltaSlots * this.normalizedSlotMinutes() * 60 * 1000;\n    const minDuration = this.normalizedSlotMinutes() * 60 * 1000;\n    let start = new Date(state.start);\n    let end = new Date(state.end);\n\n    if (state.edge === 'start') {\n      start = new Date(Math.min(state.start.getTime() + deltaMs, state.end.getTime() - minDuration));\n    } else {\n      end = new Date(Math.max(state.end.getTime() + deltaMs, state.start.getTime() + minDuration));\n    }\n\n    this.eventTimeChange.emit({\n      event: state.event,\n      start,\n      end,\n      occurrenceStart: state.start,\n      occurrenceEnd: state.end,\n    });\n    this.resizeState = null;\n  }\n\n  @HostListener('window:pointercancel')\n  cancelResize(): void {\n    this.resizeState = null;\n  }\n\n  isToday(date: Date): boolean {\n    return this.isSameDate(date, new Date());\n  }\n\n  isOtherMonth(date: Date): boolean {\n    return date.getMonth() !== this.activeDate().getMonth();\n  }\n\n  formatHour(hour: number): string {\n    const ampm = hour >= 12 ? 'PM' : 'AM';\n    const hr = hour % 12 === 0 ? 12 : hour % 12;\n    return `${hr} ${ampm}`;\n  }\n\n  formatDate(date: Date, options: Intl.DateTimeFormatOptions): string {\n    try {\n      return new Intl.DateTimeFormat('en-US', { ...options, timeZone: this.timeZone() }).format(date);\n    } catch {\n      return new Intl.DateTimeFormat('en-US', options).format(date);\n    }\n  }\n\n  formatEventTime(start: Date, end: Date): string {\n    return `${this.formatDate(start, { hour: 'numeric', minute: '2-digit' })} - ${this.formatDate(end, { hour: 'numeric', minute: '2-digit' })}`;\n  }\n\n  eventTitle(layout: SchedulerEventLayout): string {\n    const description = layout.event.description ? ` (${layout.event.description})` : '';\n    return `${layout.event.title}${description}`;\n  }\n\n  dateKey(date: Date): string {\n    if (!this.timeZone()) {\n      return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\n    }\n\n    try {\n      const parts = new Intl.DateTimeFormat('en-US', {\n        timeZone: this.timeZone(),\n        year: 'numeric',\n        month: '2-digit',\n        day: '2-digit',\n      }).formatToParts(date);\n      const get = (type: string) => parts.find(part => part.type === type)?.value ?? '';\n      return `${get('year')}-${get('month')}-${get('day')}`;\n    } catch {\n      return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\n    }\n  }\n\n  getInitials(name: string): string {\n    if (!name) return '';\n    return name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2);\n  }\n\n  getResourceName(resourceId: string): string {\n    const res = this.resources().find(r => r.id === resourceId);\n    return res ? res.name : '';\n  }\n\n  // Export methods\n  exportToICS(): void {\n    const evts = this.filteredEvents();\n    let ics = [\n      'BEGIN:VCALENDAR',\n      'VERSION:2.0',\n      'PRODID:-//Antigravity//NGX Core Components Scheduler//EN',\n      'CALSCALE:GREGORIAN',\n      'METHOD:PUBLISH'\n    ];\n\n    for (const e of evts) {\n      const pad = (num: number) => String(num).padStart(2, '0');\n      const formatICSDate = (d: Date) => {\n        return `${d.getUTCFullYear()}${pad(d.getUTCMonth() + 1)}${pad(d.getUTCDate())}T${pad(d.getUTCHours())}${pad(d.getUTCMinutes())}${pad(d.getUTCSeconds())}Z`;\n      };\n\n      ics.push('BEGIN:VEVENT');\n      ics.push(`UID:${e.id}`);\n      ics.push(`DTSTAMP:${formatICSDate(new Date())}`);\n      ics.push(`DTSTART:${formatICSDate(e.start)}`);\n      ics.push(`DTEND:${formatICSDate(e.end)}`);\n      ics.push(`SUMMARY:${e.title.replace(/[,;]/g, '\\\\$&')}`);\n      if (e.description) {\n        ics.push(`DESCRIPTION:${e.description.replace(/[,;]/g, '\\\\$&')}`);\n      }\n      if (e.category) {\n        ics.push(`CATEGORIES:${e.category.toUpperCase()}`);\n      }\n      ics.push('END:VEVENT');\n    }\n\n    ics.push('END:VCALENDAR');\n    this.downloadFile(ics.join('\\r\\n'), 'calendar.ics', 'text/calendar');\n  }\n\n  exportToJSON(): void {\n    const evts = this.filteredEvents();\n    const data = JSON.stringify(evts, null, 2);\n    this.downloadFile(data, 'calendar_events.json', 'application/json');\n  }\n\n  exportToCSV(): void {\n    const evts = this.filteredEvents();\n    const headers = ['ID', 'Title', 'Description', 'Start', 'End', 'Category', 'Resource ID', 'All Day'];\n    const rows = evts.map(e => [\n      e.id,\n      `\"${e.title.replace(/\"/g, '\"\"')}\"`,\n      `\"${(e.description || '').replace(/\"/g, '\"\"')}\"`,\n      e.start.toISOString(),\n      e.end.toISOString(),\n      e.category || '',\n      e.resourceId || '',\n      e.isAllDay ? 'TRUE' : 'FALSE'\n    ]);\n\n    const csvContent = [headers.join(','), ...rows.map(r => r.join(','))].join('\\n');\n    this.downloadFile(csvContent, 'calendar_events.csv', 'text/csv');\n  }\n\n  private downloadFile(content: string, filename: string, contentType: string): void {\n    const blob = new Blob([content], { type: contentType });\n    const url = URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = filename;\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n    URL.revokeObjectURL(url);\n  }\n\n  private layoutOverlapGroup(events: ResolvedSchedulerEvent[]): SchedulerEventLayout[] {\n    const columnEnds: Date[] = [];\n    const placements = events.map(event => {\n      let column = columnEnds.findIndex(end => event.start >= end);\n      if (column === -1) {\n        column = columnEnds.length;\n        columnEnds.push(event.end);\n      } else {\n        columnEnds[column] = event.end;\n      }\n      return { event, column };\n    });\n\n    const columnCount = Math.max(1, columnEnds.length);\n    return placements.map(({ event, column }) => ({\n      ...event,\n      top: this.getEventTop(event.start),\n      height: this.getEventHeight(event.start, event.end),\n      left: column * (100 / columnCount) + 1,\n      width: Math.max(8, 100 / columnCount - 2),\n    }));\n  }\n\n  private resolveEventForDate(event: SchedulerEvent, date: Date): ResolvedSchedulerEvent[] {\n    if (event.recurrence) {\n      const occurrence = this.resolveRecurringOccurrence(event, date);\n      return occurrence ? [occurrence] : [];\n    }\n\n    const dayStart = this.startOfDay(date);\n    const dayEnd = this.endOfDay(date);\n    if (!this.rangesOverlap(event.start, event.end, dayStart, dayEnd)) return [];\n\n    return [{\n      id: `${event.id}-${this.dateKey(date)}`,\n      event,\n      start: new Date(Math.max(event.start.getTime(), dayStart.getTime())),\n      end: new Date(Math.min(event.end.getTime(), dayEnd.getTime())),\n    }];\n  }\n\n  private resolveRecurringOccurrence(event: SchedulerEvent, date: Date): ResolvedSchedulerEvent | null {\n    const recurrence = event.recurrence;\n    if (!recurrence) return null;\n\n    const startDay = this.startOfDay(event.start);\n    const targetDay = this.startOfDay(date);\n    if (targetDay < startDay) return null;\n    if (recurrence.until && targetDay > this.startOfDay(recurrence.until)) return null;\n\n    const interval = Math.max(1, recurrence.interval ?? 1);\n    const diffDays = Math.floor((targetDay.getTime() - startDay.getTime()) / 86400000);\n    let occurrenceIndex = 0;\n    let occurs = false;\n\n    if (recurrence.frequency === 'daily') {\n      occurs = diffDays % interval === 0;\n      occurrenceIndex = Math.floor(diffDays / interval);\n    } else if (recurrence.frequency === 'weekly') {\n      const days = recurrence.daysOfWeek?.length ? recurrence.daysOfWeek : [event.start.getDay()];\n      const diffWeeks = Math.floor(diffDays / 7);\n      occurs = diffWeeks % interval === 0 && days.includes(targetDay.getDay());\n      occurrenceIndex = diffWeeks;\n    } else {\n      const diffMonths = (targetDay.getFullYear() - startDay.getFullYear()) * 12 + targetDay.getMonth() - startDay.getMonth();\n      occurs = diffMonths % interval === 0 && targetDay.getDate() === startDay.getDate();\n      occurrenceIndex = diffMonths;\n    }\n\n    if (!occurs || (recurrence.count && occurrenceIndex >= recurrence.count)) return null;\n\n    const duration = event.end.getTime() - event.start.getTime();\n    const start = new Date(targetDay);\n    start.setHours(event.start.getHours(), event.start.getMinutes(), event.start.getSeconds(), event.start.getMilliseconds());\n    const end = new Date(start.getTime() + duration);\n\n    return {\n      id: `${event.id}-r-${this.dateKey(targetDay)}`,\n      event,\n      start,\n      end,\n    };\n  }\n\n  private getEventTop(start: Date): number {\n    const startHour = start.getHours() + start.getMinutes() / 60;\n    const startRange = this.showWorkHoursOnly() ? this.normalizedStartHour() : 0;\n    const endRange = this.showWorkHoursOnly() ? this.normalizedEndHour() : 24;\n    const totalHours = endRange - startRange;\n    const pct = ((startHour - startRange) / totalHours) * 100;\n    return Math.max(0, Math.min(100, pct));\n  }\n\n  private getEventHeight(start: Date, end: Date): number {\n    const startHour = start.getHours() + start.getMinutes() / 60;\n    const endHour = end.getHours() + end.getMinutes() / 60;\n    const startRange = this.showWorkHoursOnly() ? this.normalizedStartHour() : 0;\n    const endRange = this.showWorkHoursOnly() ? this.normalizedEndHour() : 24;\n    const totalHours = endRange - startRange;\n    const pct = ((endHour - startHour) / totalHours) * 100;\n    return Math.max(8, Math.min(100 - this.getEventTop(start), pct));\n  }\n\n  private getStartOfWeek(date: Date): Date {\n    const res = new Date(date);\n    const day = res.getDay();\n    const diff = (day - this.weekStartsOn() + 7) % 7;\n    res.setDate(res.getDate() - diff);\n    res.setHours(0, 0, 0, 0);\n    return res;\n  }\n\n  private getWeekDays(start: Date): Date[] {\n    return Array.from({ length: 7 }, (_, i) => {\n      const day = new Date(start);\n      day.setDate(start.getDate() + i);\n      return day;\n    });\n  }\n\n  private getMonthDays(date: Date): Date[] {\n    const firstDay = new Date(date.getFullYear(), date.getMonth(), 1);\n    const startOfWeek = this.getStartOfWeek(firstDay);\n    return Array.from({ length: 42 }, (_, i) => {\n      const day = new Date(startOfWeek);\n      day.setDate(startOfWeek.getDate() + i);\n      return day;\n    });\n  }\n\n  protected isSameDate(d1: Date, d2: Date): boolean {\n    return this.dateKey(d1) === this.dateKey(d2);\n  }\n\n  private startOfDay(date: Date): Date {\n    const next = new Date(date);\n    next.setHours(0, 0, 0, 0);\n    return next;\n  }\n\n  private endOfDay(date: Date): Date {\n    const next = new Date(date);\n    next.setHours(23, 59, 59, 999);\n    return next;\n  }\n\n  private rangesOverlap(start: Date, end: Date, rangeStart: Date, rangeEnd: Date): boolean {\n    return start <= rangeEnd && end >= rangeStart;\n  }\n\n  private normalizedStartHour(): number {\n    return Math.max(0, Math.min(23, Math.floor(this.businessHoursStart())));\n  }\n\n  private normalizedEndHour(): number {\n    return Math.max(this.normalizedStartHour() + 1, Math.min(24, Math.ceil(this.businessHoursEnd())));\n  }\n\n  private normalizedSlotMinutes(): number {\n    const minutes = Math.floor(this.slotMinutes());\n    return [5, 10, 15, 20, 30, 60].includes(minutes) ? minutes : 60;\n  }\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  output,\n  signal,\n  computed,\n  ElementRef,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface VirtualListItem {\n  id: string | number;\n  [key: string]: unknown;\n}\n\nexport interface VirtualListItemClickEvent<T> {\n  item: T;\n  index: number;\n}\n\n@Component({\n  selector: 'ngx-virtual-list',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  template: `\n    <div\n      #scrollContainer\n      class=\"vl-container\"\n      [style.height]=\"containerHeight() + 'px'\"\n      (scroll)=\"onScroll()\"\n    >\n      <!-- Total height spacer -->\n      <div class=\"vl-spacer\" [style.height]=\"totalHeight() + 'px'\"></div>\n\n      <!-- Visible items absolute-positioned window -->\n      <div\n        class=\"vl-window\"\n        [style.transform]=\"'translateY(' + offsetY() + 'px)'\"\n      >\n        @for (entry of visibleItems(); track entry.index) {\n          <div\n            class=\"vl-row\"\n            [class.vl-row--selected]=\"selectedIndex() === entry.index\"\n            [class.vl-row--striped]=\"striped() && entry.index % 2 !== 0\"\n            [style.height]=\"itemHeight() + 'px'\"\n            role=\"option\"\n            [attr.aria-selected]=\"selectedIndex() === entry.index\"\n            tabindex=\"0\"\n            (click)=\"handleItemClick(entry.item, entry.index)\"\n            (keydown.enter)=\"handleItemClick(entry.item, entry.index)\"\n            (keydown.space)=\"handleItemClick(entry.item, entry.index); $event.preventDefault()\"\n          >\n            @if (renderTemplate()) {\n              <ng-container *ngTemplateOutlet=\"renderTemplate()!; context: { $implicit: entry.item, index: entry.index }\"></ng-container>\n            } @else {\n              <span class=\"vl-default-label\">{{ getLabel(entry.item) }}</span>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Empty state -->\n      @if (items().length === 0) {\n        <div class=\"vl-empty\">\n          <span class=\"vl-empty-icon\">📋</span>\n          <span>{{ emptyText() }}</span>\n        </div>\n      }\n    </div>\n\n    <!-- Footer info bar -->\n    @if (showCount()) {\n      <div class=\"vl-footer\">\n        <span>Showing {{ visibleItems().length }} of {{ items().length }} items</span>\n      </div>\n    }\n  `,\n  styles: [`\n    :host {\n      display: block;\n      font-family: inherit;\n    }\n\n    .vl-container {\n      position: relative;\n      overflow-y: auto;\n      overflow-x: hidden;\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 10px;\n      background: var(--bg-primary, #ffffff);\n      scroll-behavior: auto;\n    }\n\n    .vl-container::-webkit-scrollbar {\n      width: 6px;\n    }\n    .vl-container::-webkit-scrollbar-track {\n      background: transparent;\n    }\n    .vl-container::-webkit-scrollbar-thumb {\n      background: var(--border-color, #cbd5e1);\n      border-radius: 3px;\n    }\n    .vl-container::-webkit-scrollbar-thumb:hover {\n      background: var(--text-secondary, #94a3b8);\n    }\n\n    .vl-spacer {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 1px;\n      pointer-events: none;\n    }\n\n    .vl-window {\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      will-change: transform;\n    }\n\n    .vl-row {\n      display: flex;\n      align-items: center;\n      padding: 0 16px;\n      cursor: pointer;\n      border-bottom: 1px solid var(--border-color, #f1f5f9);\n      transition: background-color 0.12s ease;\n      box-sizing: border-box;\n      gap: 12px;\n    }\n\n    .vl-row:hover {\n      background: var(--bg-hover, rgba(79, 70, 229, 0.04));\n    }\n\n    .vl-row--selected {\n      background: var(--primary-glow, rgba(79, 70, 229, 0.08));\n      border-left: 3px solid var(--primary-color, #4f46e5);\n    }\n\n    .vl-row--striped:not(.vl-row--selected) {\n      background: var(--bg-secondary, #f8fafc);\n    }\n\n    .vl-default-label {\n      font-size: 13px;\n      color: var(--text-primary, #0f172a);\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    .vl-empty {\n      position: absolute;\n      inset: 0;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      gap: 12px;\n      color: var(--text-secondary, #64748b);\n      font-size: 14px;\n    }\n\n    .vl-empty-icon {\n      font-size: 36px;\n      opacity: 0.6;\n    }\n\n    .vl-footer {\n      padding: 8px 16px;\n      background: var(--bg-secondary, #f8fafc);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-top: none;\n      border-radius: 0 0 10px 10px;\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n    }\n  `]\n})\nexport class VirtualListComponent<T extends VirtualListItem = VirtualListItem> {\n  @ViewChild('scrollContainer') scrollContainer!: ElementRef<HTMLDivElement>;\n\n  // ---------- Inputs ----------\n  items = input<T[]>([]);\n  itemHeight = input<number>(48);\n  containerHeight = input<number>(400);\n  overscan = input<number>(5);\n  striped = input<boolean>(false);\n  showCount = input<boolean>(true);\n  emptyText = input<string>('No items to display');\n  labelKey = input<string>('label');\n  renderTemplate = input<import('@angular/core').TemplateRef<{ $implicit: T; index: number }> | null>(null);\n\n  // ---------- Outputs ----------\n  itemClick = output<VirtualListItemClickEvent<T>>();\n\n  // ---------- Internal state ----------\n  private scrollTop = signal<number>(0);\n  selectedIndex = signal<number>(-1);\n\n  // ---------- Computed ----------\n  totalHeight = computed(() => this.items().length * this.itemHeight());\n\n  startIndex = computed(() => {\n    const raw = Math.floor(this.scrollTop() / this.itemHeight());\n    return Math.max(0, raw - this.overscan());\n  });\n\n  endIndex = computed(() => {\n    const visible = Math.ceil(this.containerHeight() / this.itemHeight());\n    const raw = Math.floor(this.scrollTop() / this.itemHeight()) + visible;\n    return Math.min(this.items().length - 1, raw + this.overscan());\n  });\n\n  visibleItems = computed(() => {\n    const arr: { item: T; index: number }[] = [];\n    const start = this.startIndex();\n    const end = this.endIndex();\n    const all = this.items();\n    for (let i = start; i <= end; i++) {\n      arr.push({ item: all[i], index: i });\n    }\n    return arr;\n  });\n\n  offsetY = computed(() => this.startIndex() * this.itemHeight());\n\n  // ---------- Event handlers ----------\n  onScroll(): void {\n    const el = this.scrollContainer?.nativeElement;\n    if (el) {\n      this.scrollTop.set(el.scrollTop);\n    }\n  }\n\n  handleItemClick(item: T, index: number): void {\n    this.selectedIndex.set(index);\n    this.itemClick.emit({ item, index });\n  }\n\n  getLabel(item: T): string {\n    const key = this.labelKey();\n    const val = (item as Record<string, unknown>)[key];\n    return val != null ? String(val) : String(item['id'] ?? '');\n  }\n\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  signal,\n  computed,\n  HostListener,\n  OnInit,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n  selector: 'ngx-image-compare',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-image-compare\"\n      [class.dark]=\"theme() === 'dark'\"\n      [class.dragging]=\"isDragging()\"\n      [attr.id]=\"id()\"\n      tabindex=\"0\"\n      (keydown)=\"onKeyDown($event)\"\n      aria-label=\"Image comparison slider\"\n    >\n      <!-- After Image (Background layer) -->\n      <div class=\"ngx-image-compare__layer after\">\n        <img [src]=\"afterImage()\" class=\"ngx-image-compare__image\" alt=\"After image\" />\n        @if (afterLabel()) {\n          <div class=\"ngx-image-compare__label after\">{{ afterLabel() }}</div>\n        }\n      </div>\n\n      <!-- Before Image (Overlay layer clipped dynamically) -->\n      <div\n        class=\"ngx-image-compare__layer before\"\n        [style.clipPath]=\"clipPathStyle()\"\n      >\n        <img [src]=\"beforeImage()\" class=\"ngx-image-compare__image\" alt=\"Before image\" />\n        @if (beforeLabel()) {\n          <div class=\"ngx-image-compare__label before\">{{ beforeLabel() }}</div>\n        }\n      </div>\n\n      <!-- Drag Divider Handle -->\n      <div\n        class=\"ngx-image-compare__handle\"\n        [class.vertical]=\"orientation() === 'vertical'\"\n        [style.left.%]=\"orientation() === 'horizontal' ? sliderPos() : 50\"\n        [style.top.%]=\"orientation() === 'vertical' ? sliderPos() : 50\"\n      >\n        <div class=\"ngx-image-compare__line\"></div>\n        <div class=\"ngx-image-compare__circle\">\n          <svg class=\"handle-arrow-icon\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n            @if (orientation() === 'horizontal') {\n              <polyline points=\"8 18 2 12 8 6\" />\n              <polyline points=\"16 6 22 12 16 18\" />\n            } @else {\n              <polyline points=\"18 8 12 2 6 8\" />\n              <polyline points=\"6 16 12 22 18 16\" />\n            }\n          </svg>\n        </div>\n        <div class=\"ngx-image-compare__line\"></div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      user-select: none;\n      -webkit-user-select: none;\n    }\n\n    .ngx-image-compare {\n      position: relative;\n      width: 100%;\n      height: 450px;\n      border-radius: 16px;\n      overflow: hidden;\n      cursor: ew-resize;\n      background: #f1f5f9;\n      box-shadow: \n        0 10px 25px -5px rgba(0, 0, 0, 0.05),\n        0 8px 10px -6px rgba(0, 0, 0, 0.05);\n      border: 1px solid rgba(0, 0, 0, 0.04);\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      transition: box-shadow 0.2s ease;\n    }\n\n    .ngx-image-compare:focus-visible {\n      outline: none;\n      box-shadow: 0 0 0 3px var(--primary-color, #3b82f6);\n    }\n\n    .ngx-image-compare.dragging {\n      cursor: ew-resize !important;\n    }\n\n    .ngx-image-compare.dark {\n      background: #0f172a;\n      border-color: rgba(255, 255, 255, 0.06);\n    }\n\n    /* Layers positioning */\n    .ngx-image-compare__layer {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      overflow: hidden;\n    }\n\n    .ngx-image-compare__layer.before {\n      z-index: 2;\n    }\n\n    .ngx-image-compare__layer.after {\n      z-index: 1;\n    }\n\n    .ngx-image-compare__image {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n      display: block;\n      pointer-events: none;\n    }\n\n    /* Labels styling */\n    .ngx-image-compare__label {\n      position: absolute;\n      bottom: 20px;\n      padding: 6px 12px;\n      font-size: 11px;\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      border-radius: 6px;\n      background: rgba(255, 255, 255, 0.65);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      border: 1px solid rgba(255, 255, 255, 0.4);\n      color: #0f172a;\n      z-index: 5;\n    }\n\n    .ngx-image-compare__label.before {\n      left: 20px;\n    }\n\n    .ngx-image-compare__label.after {\n      right: 20px;\n    }\n\n    .dark .ngx-image-compare__label {\n      background: rgba(15, 23, 42, 0.65);\n      border-color: rgba(255, 255, 255, 0.08);\n      color: #f1f5f9;\n    }\n\n    /* Divider Handle styles */\n    .ngx-image-compare__handle {\n      position: absolute;\n      z-index: 10;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n      transition: box-shadow 0.2s ease;\n    }\n\n    /* Horizontal orientation */\n    .ngx-image-compare__handle:not(.vertical) {\n      top: 0;\n      bottom: 0;\n      width: 2px;\n      flex-direction: column;\n      transform: translateX(-50%);\n    }\n\n    /* Vertical orientation */\n    .ngx-image-compare__handle.vertical {\n      left: 0;\n      right: 0;\n      height: 2px;\n      flex-direction: row;\n      transform: translateY(-50%);\n      cursor: ns-resize;\n    }\n\n    .ngx-image-compare:has(.ngx-image-compare__handle.vertical) {\n      cursor: ns-resize;\n    }\n\n    /* Lines */\n    .ngx-image-compare__line {\n      flex-grow: 1;\n      background: rgba(255, 255, 255, 0.9);\n      box-shadow: 0 0 6px rgba(0, 0, 0, 0.2);\n    }\n\n    .ngx-image-compare__handle:not(.vertical) .ngx-image-compare__line {\n      width: 2px;\n    }\n\n    .ngx-image-compare__handle.vertical .ngx-image-compare__line {\n      height: 2px;\n    }\n\n    /* Drag circle */\n    .ngx-image-compare__circle {\n      width: 36px;\n      height: 36px;\n      border-radius: 50%;\n      background: rgba(255, 255, 255, 0.85);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      border: 2px solid #ffffff;\n      color: #0f172a;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: \n        0 4px 10px rgba(0, 0, 0, 0.15),\n        inset 0 1px 0 rgba(255, 255, 255, 0.8);\n      z-index: 11;\n      transition: all 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);\n    }\n\n    .ngx-image-compare:hover .ngx-image-compare__circle {\n      transform: scale(1.08);\n      box-shadow: \n        0 0 0 4px rgba(255, 255, 255, 0.25),\n        0 8px 16px rgba(0, 0, 0, 0.2);\n    }\n\n    .ngx-image-compare.dragging .ngx-image-compare__circle {\n      transform: scale(1.15);\n      background: var(--primary-color, #3b82f6);\n      border-color: var(--primary-color, #3b82f6);\n      color: #ffffff;\n      box-shadow: \n        0 0 0 6px rgba(59, 130, 246, 0.25),\n        0 12px 24px rgba(0, 0, 0, 0.25);\n    }\n\n    .dark .ngx-image-compare__circle {\n      background: rgba(15, 23, 42, 0.85);\n      border-color: rgba(255, 255, 255, 0.1);\n      color: #cbd5e1;\n    }\n\n    .dark .ngx-image-compare.dragging .ngx-image-compare__circle {\n      background: var(--primary-color, #3b82f6);\n      border-color: var(--primary-color, #3b82f6);\n      color: #ffffff;\n    }\n\n    .handle-arrow-icon {\n      transition: transform 0.2s ease;\n    }\n  `]\n})\nexport class ImageCompareComponent implements OnInit {\n  // Inputs\n  beforeImage = input.required<string>();\n  afterImage = input.required<string>();\n  beforeLabel = input<string>('Before');\n  afterLabel = input<string>('After');\n  startOffset = input<number>(50);\n  orientation = input<'horizontal' | 'vertical'>('horizontal');\n  theme = input<'light' | 'dark'>('light');\n  id = input<string>('ngx-img-compare-' + Math.random().toString(36).substring(2, 9));\n\n  // Internal Signals\n  sliderPos = signal<number>(50);\n  isDragging = signal<boolean>(false);\n\n  // Computed clip-path style based on slide percent\n  clipPathStyle = computed(() => {\n    const pos = this.sliderPos();\n    if (this.orientation() === 'horizontal') {\n      return `inset(0 ${100 - pos}% 0 0)`;\n    } else {\n      return `inset(0 0 ${100 - pos}% 0)`;\n    }\n  });\n\n  ngOnInit() {\n    this.sliderPos.set(Math.max(0, Math.min(100, this.startOffset())));\n  }\n\n  @HostListener('mousedown', ['$event'])\n  onDragStart(event: MouseEvent) {\n    event.preventDefault();\n    this.isDragging.set(true);\n    this.updatePositionFromEvent(event.clientX, event.clientY);\n  }\n\n  @HostListener('touchstart', ['$event'])\n  onTouchStart(event: TouchEvent) {\n    this.isDragging.set(true);\n    this.updatePositionFromEvent(event.touches[0].clientX, event.touches[0].clientY);\n  }\n\n  @HostListener('document:mousemove', ['$event'])\n  onMouseMove(event: MouseEvent) {\n    if (!this.isDragging()) return;\n    this.updatePositionFromEvent(event.clientX, event.clientY);\n  }\n\n  @HostListener('document:touchmove', ['$event'])\n  onTouchMove(event: TouchEvent) {\n    if (!this.isDragging()) return;\n    this.updatePositionFromEvent(event.touches[0].clientX, event.touches[0].clientY);\n  }\n\n  @HostListener('document:mouseup')\n  @HostListener('document:touchend')\n  onDragEnd() {\n    this.isDragging.set(false);\n  }\n\n  private updatePositionFromEvent(clientX: number, clientY: number) {\n    const host = document.getElementById(this.id());\n    if (!host) return;\n    const rect = host.getBoundingClientRect();\n    this.updateSliderPosition(clientX, clientY, rect);\n  }\n\n  private updateSliderPosition(clientX: number, clientY: number, rect: DOMRect) {\n    let pos = 50;\n    if (this.orientation() === 'horizontal') {\n      const x = clientX - rect.left;\n      pos = (x / rect.width) * 100;\n    } else {\n      const y = clientY - rect.top;\n      pos = (y / rect.height) * 100;\n    }\n    this.sliderPos.set(Math.max(0, Math.min(100, pos)));\n  }\n\n  onKeyDown(event: KeyboardEvent) {\n    if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n      this.sliderPos.set(Math.max(0, this.sliderPos() - 2));\n      event.preventDefault();\n    } else if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n      this.sliderPos.set(Math.min(100, this.sliderPos() + 2));\n      event.preventDefault();\n    }\n  }\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  output,\n  signal,\n  computed,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nexport interface KeyValueItem {\n  key: string;\n  value: any;\n  label: string;\n  group?: string;\n  type?: 'text' | 'badge' | 'code';\n  badgeVariant?: 'default' | 'success' | 'danger' | 'warning' | 'info';\n  copyable?: boolean;\n}\n\n@Component({\n  selector: 'ngx-key-value-list',\n  standalone: true,\n  imports: [CommonModule, FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-key-value-list\"\n      [class.dark]=\"theme() === 'dark'\"\n      [class.striped]=\"striped()\"\n      [class.layout-vertical]=\"layout() === 'vertical'\"\n    >\n      <!-- Search Input Header -->\n      @if (searchable()) {\n        <div class=\"ngx-key-value-list__search-wrap\">\n          <svg class=\"search-icon\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <circle cx=\"11\" cy=\"11\" r=\"8\"/>\n            <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\n          </svg>\n          <input\n            type=\"text\"\n            class=\"ngx-key-value-list__search-input\"\n            placeholder=\"Search properties...\"\n            [ngModel]=\"searchTerm()\"\n            (ngModelChange)=\"searchTerm.set($event)\"\n          />\n          @if (searchTerm()) {\n            <button class=\"clear-search\" (click)=\"searchTerm.set('')\" aria-label=\"Clear search\">✕</button>\n          }\n        </div>\n      }\n\n      <!-- Groups List -->\n      @if (groupKeys().length === 0) {\n        <div class=\"ngx-key-value-list__empty\">No properties match search filter</div>\n      } @else {\n        <div class=\"ngx-key-value-list__groups\">\n          @for (group of groupKeys(); track group) {\n            <div class=\"ngx-key-value-list__group-card\" [class.collapsed]=\"!isGroupExpanded(group)\">\n              <!-- Group Header (Only show if group is not empty string) -->\n              @if (group) {\n                <div\n                  class=\"ngx-key-value-list__group-header\"\n                  (click)=\"toggleGroup(group)\"\n                  role=\"button\"\n                  tabindex=\"0\"\n                  (keydown.enter)=\"toggleGroup(group)\"\n                >\n                  <span class=\"group-title\">{{ group }}</span>\n                  <span class=\"group-count\">({{ groupedFilteredItems()[group].length }})</span>\n                  <svg class=\"chevron-icon\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                    <polyline points=\"6 9 12 15 18 9\"></polyline>\n                  </svg>\n                </div>\n              }\n\n              <!-- Group Rows -->\n              @if (isGroupExpanded(group)) {\n                <div class=\"ngx-key-value-list__rows\">\n                  @for (item of groupedFilteredItems()[group]; track item.key) {\n                    <div\n                      class=\"ngx-key-value-list__row\"\n                      (click)=\"onRowClick(item)\"\n                    >\n                      <!-- Key Label -->\n                      <div class=\"ngx-key-value-list__label\">{{ item.label }}</div>\n\n                      <!-- Value Renderer -->\n                      <div class=\"ngx-key-value-list__value-container\">\n                        <div class=\"ngx-key-value-list__value-wrapper\">\n                          @switch (item.type) {\n                            @case ('badge') {\n                              <span\n                                class=\"ngx-key-value-list__badge\"\n                                [class]=\"item.badgeVariant || 'default'\"\n                              >\n                                {{ item.value }}\n                              </span>\n                            }\n                            @case ('code') {\n                              <code class=\"ngx-key-value-list__code\">{{ item.value }}</code>\n                            }\n                            @default {\n                              <span class=\"ngx-key-value-list__text\">{{ item.value }}</span>\n                            }\n                          }\n\n                          <!-- Copy Action Button -->\n                          @if (item.copyable) {\n                            <button\n                              class=\"ngx-key-value-list__copy-btn\"\n                              (click)=\"copyValue(item.value, item.key, $event)\"\n                              [class.copied]=\"copiedKey() === item.key\"\n                              [attr.aria-label]=\"'Copy ' + item.label\"\n                            >\n                              @if (copiedKey() === item.key) {\n                                <span class=\"copied-tooltip\">Copied!</span>\n                                <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n                                  <polyline points=\"20 6 9 17 4 12\"></polyline>\n                                </svg>\n                              } @else {\n                                <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                                  <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n                                  <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n                                </svg>\n                              }\n                            </button>\n                          }\n                        </div>\n                      </div>\n                    </div>\n                  }\n                </div>\n              }\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    .ngx-key-value-list {\n      width: 100%;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      color: #334155;\n    }\n\n    .ngx-key-value-list.dark {\n      color: #cbd5e1;\n    }\n\n    /* ── Search Bar ── */\n    .ngx-key-value-list__search-wrap {\n      position: relative;\n      width: 100%;\n      margin-bottom: 16px;\n      display: flex;\n      align-items: center;\n    }\n\n    .search-icon {\n      position: absolute;\n      left: 12px;\n      color: #94a3b8;\n    }\n\n    .ngx-key-value-list__search-input {\n      width: 100%;\n      padding: 8px 36px 8px 36px;\n      font-size: 13px;\n      border-radius: 8px;\n      border: 1px solid #cbd5e1;\n      background: rgba(255, 255, 255, 0.7);\n      outline: none;\n      transition: all 0.2s ease;\n    }\n\n    .ngx-key-value-list__search-input:focus {\n      border-color: var(--primary-color, #3b82f6);\n      box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n    }\n\n    .dark .ngx-key-value-list__search-input {\n      border-color: rgba(255, 255, 255, 0.08);\n      background: rgba(15, 23, 42, 0.4);\n      color: #f1f5f9;\n    }\n\n    .clear-search {\n      position: absolute;\n      right: 12px;\n      border: none;\n      background: transparent;\n      color: #94a3b8;\n      cursor: pointer;\n      font-size: 11px;\n      padding: 4px;\n    }\n\n    /* ── Empty results ── */\n    .ngx-key-value-list__empty {\n      padding: 24px;\n      text-align: center;\n      font-size: 13px;\n      color: #64748b;\n      background: rgba(0, 0, 0, 0.02);\n      border-radius: 8px;\n    }\n\n    .dark .ngx-key-value-list__empty {\n      color: #94a3b8;\n      background: rgba(255, 255, 255, 0.02);\n    }\n\n    /* ── Collapsible Groups ── */\n    .ngx-key-value-list__groups {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n    }\n\n    .ngx-key-value-list__group-card {\n      border-radius: 12px;\n      background: rgba(255, 255, 255, 0.4);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      border: 1px solid rgba(0, 0, 0, 0.04);\n      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);\n      overflow: hidden;\n      transition: all 0.2s ease;\n    }\n\n    .dark .ngx-key-value-list__group-card {\n      background: rgba(30, 32, 48, 0.35);\n      border-color: rgba(255, 255, 255, 0.05);\n    }\n\n    .ngx-key-value-list__group-header {\n      padding: 12px 18px;\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      cursor: pointer;\n      background: rgba(0, 0, 0, 0.02);\n      border-bottom: 1px solid rgba(0, 0, 0, 0.03);\n      user-select: none;\n      outline: none;\n    }\n\n    .dark .ngx-key-value-list__group-header {\n      background: rgba(255, 255, 255, 0.02);\n      border-bottom-color: rgba(255, 255, 255, 0.03);\n    }\n\n    .group-title {\n      font-size: 12px;\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      color: #475569;\n    }\n\n    .dark .group-title {\n      color: #94a3b8;\n    }\n\n    .group-count {\n      font-size: 11px;\n      color: #94a3b8;\n    }\n\n    .chevron-icon {\n      margin-left: auto;\n      color: #94a3b8;\n      transition: transform 0.2s ease;\n    }\n\n    .collapsed .chevron-icon {\n      transform: rotate(-90deg);\n    }\n\n    .collapsed .ngx-key-value-list__group-header {\n      border-bottom-color: transparent;\n    }\n\n    /* ── Rows layout ── */\n    .ngx-key-value-list__rows {\n      display: flex;\n      flex-direction: column;\n    }\n\n    .ngx-key-value-list__row {\n      display: flex;\n      align-items: center;\n      padding: 10px 18px;\n      border-bottom: 1px solid rgba(0, 0, 0, 0.03);\n      font-size: 13px;\n      min-height: 42px;\n      box-sizing: border-box;\n    }\n\n    .ngx-key-value-list__row:last-child {\n      border-bottom: none;\n    }\n\n    .dark .ngx-key-value-list__row {\n      border-bottom-color: rgba(255, 255, 255, 0.03);\n    }\n\n    /* Column labels */\n    .ngx-key-value-list__label {\n      width: 35%;\n      font-weight: 600;\n      color: #64748b;\n      padding-right: 16px;\n      box-sizing: border-box;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    .dark .ngx-key-value-list__label {\n      color: #94a3b8;\n    }\n\n    /* Column values */\n    .ngx-key-value-list__value-container {\n      width: 65%;\n      display: flex;\n      align-items: center;\n    }\n\n    .ngx-key-value-list__value-wrapper {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      max-width: 100%;\n    }\n\n    .ngx-key-value-list__text {\n      color: #0f172a;\n      font-weight: 500;\n    }\n\n    .dark .ngx-key-value-list__text {\n      color: #f1f5f9;\n    }\n\n    /* striped row shading */\n    .striped .ngx-key-value-list__row:nth-child(even) {\n      background: rgba(0, 0, 0, 0.015);\n    }\n\n    .dark.striped .ngx-key-value-list__row:nth-child(even) {\n      background: rgba(255, 255, 255, 0.01);\n    }\n\n    /* ── Render types ── */\n\n    /* Badges */\n    .ngx-key-value-list__badge {\n      display: inline-flex;\n      font-size: 10px;\n      font-weight: 700;\n      padding: 2px 8px;\n      border-radius: 4px;\n      text-transform: capitalize;\n    }\n\n    .ngx-key-value-list__badge.default {\n      background: #f1f5f9;\n      color: #475569;\n    }\n    .ngx-key-value-list__badge.success {\n      background: rgba(16, 185, 129, 0.1);\n      color: #10b981;\n    }\n    .ngx-key-value-list__badge.danger {\n      background: rgba(239, 68, 68, 0.1);\n      color: #ef4444;\n    }\n    .ngx-key-value-list__badge.warning {\n      background: rgba(245, 158, 11, 0.1);\n      color: #f59e0b;\n    }\n    .ngx-key-value-list__badge.info {\n      background: rgba(59, 130, 246, 0.1);\n      color: #3b82f6;\n    }\n\n    .dark .ngx-key-value-list__badge.default {\n      background: rgba(255, 255, 255, 0.08);\n      color: #cbd5e1;\n    }\n\n    /* Code blocks */\n    .ngx-key-value-list__code {\n      font-family: monospace;\n      font-size: 12px;\n      background: #f1f5f9;\n      padding: 2px 6px;\n      border-radius: 4px;\n      color: #e11d48;\n      border: 1px solid rgba(0, 0, 0, 0.04);\n    }\n\n    .dark .ngx-key-value-list__code {\n      background: rgba(15, 23, 42, 0.5);\n      border-color: rgba(255, 255, 255, 0.04);\n      color: #f43f5e;\n    }\n\n    /* Copy Button */\n    .ngx-key-value-list__copy-btn {\n      position: relative;\n      border: none;\n      background: transparent;\n      color: #94a3b8;\n      padding: 4px;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      border-radius: 4px;\n      transition: all 0.2s ease;\n    }\n\n    .ngx-key-value-list__copy-btn:hover {\n      background: rgba(0, 0, 0, 0.04);\n      color: #475569;\n    }\n\n    .ngx-key-value-list__copy-btn.copied {\n      color: #10b981 !important;\n    }\n\n    .dark .ngx-key-value-list__copy-btn:hover {\n      background: rgba(255, 255, 255, 0.05);\n      color: #e2e8f0;\n    }\n\n    /* Tooltip */\n    .copied-tooltip {\n      position: absolute;\n      bottom: 22px;\n      left: 50%;\n      transform: translateX(-50%);\n      font-size: 10px;\n      background: #0f172a;\n      color: #ffffff;\n      padding: 2px 6px;\n      border-radius: 4px;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      white-space: nowrap;\n      pointer-events: none;\n      animation: tooltipPop 0.15s ease-out forwards;\n    }\n\n    @keyframes tooltipPop {\n      from { opacity: 0; transform: translateX(-50%) translateY(4px); }\n      to { opacity: 1; transform: translateX(-50%) translateY(0); }\n    }\n\n    /* ── Vertical Layout ── */\n    .layout-vertical .ngx-key-value-list__row {\n      flex-direction: column;\n      align-items: flex-start;\n      gap: 4px;\n      padding: 12px 18px;\n    }\n\n    .layout-vertical .ngx-key-value-list__label {\n      width: 100%;\n      padding-right: 0;\n    }\n\n    .layout-vertical .ngx-key-value-list__value-container {\n      width: 100%;\n    }\n  `]\n})\nexport class KeyValueListComponent {\n  // Inputs\n  items = input<KeyValueItem[]>([]);\n  layout = input<'horizontal' | 'vertical'>('horizontal');\n  striped = input<boolean>(false);\n  searchable = input<boolean>(false);\n  theme = input<'light' | 'dark'>('light');\n  id = input<string>('ngx-kv-list-' + Math.random().toString(36).substring(2, 9));\n\n  // Outputs\n  valueClick = output<{ key: string; value: any }>();\n\n  // Internal signals\n  searchTerm = signal<string>('');\n  copiedKey = signal<string | null>(null);\n  collapsedGroups = signal<Set<string>>(new Set());\n\n  // Search filtering\n  filteredItems = computed(() => {\n    const term = this.searchTerm().toLowerCase().trim();\n    const rawItems = this.items() || [];\n    if (!term) return rawItems;\n    return rawItems.filter(\n      item =>\n        item.label.toLowerCase().includes(term) ||\n        String(item.value).toLowerCase().includes(term)\n    );\n  });\n\n  // Group calculations\n  groupedFilteredItems = computed(() => {\n    const list = this.filteredItems();\n    const groups: { [key: string]: KeyValueItem[] } = {};\n\n    list.forEach(item => {\n      const gName = item.group || '';\n      if (!groups[gName]) {\n        groups[gName] = [];\n      }\n      groups[gName].push(item);\n    });\n\n    return groups;\n  });\n\n  groupKeys = computed(() => {\n    return Object.keys(this.groupedFilteredItems());\n  });\n\n  toggleGroup(group: string) {\n    this.collapsedGroups.update(set => {\n      const next = new Set(set);\n      if (next.has(group)) {\n        next.delete(group);\n      } else {\n        next.add(group);\n      }\n      return next;\n    });\n  }\n\n  isGroupExpanded(group: string) {\n    return !this.collapsedGroups().has(group);\n  }\n\n  copyValue(val: any, key: string, event: MouseEvent) {\n    event.stopPropagation(); // Avoid triggering row clicks\n    const textStr = String(val);\n\n    navigator.clipboard.writeText(textStr).then(() => {\n      this.copiedKey.set(key);\n      setTimeout(() => {\n        if (this.copiedKey() === key) {\n          this.copiedKey.set(null);\n        }\n      }, 2000);\n    });\n  }\n\n  onRowClick(item: KeyValueItem) {\n    this.valueClick.emit({ key: item.key, value: item.value });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, input, output } from '@angular/core';\n\nexport interface OrgChartNode {\n  id: string;\n  label: string;\n  title?: string;\n  subtitle?: string;\n  avatarUrl?: string;\n  meta?: string;\n  children?: OrgChartNode[];\n}\n\n@Component({\n  selector: 'ngx-org-chart',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"ngx-org-chart\" [class.compact]=\"compact()\">\n      @if (root()) {\n        <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: root(), level: 0 }\"></ng-container>\n      }\n    </div>\n\n    <ng-template #nodeTemplate let-node=\"node\" let-level=\"level\">\n      <div class=\"org-node-wrap\" [style.--level]=\"level\">\n        <button class=\"org-node\" type=\"button\" (click)=\"nodeSelected.emit(node)\">\n          @if (node.avatarUrl) {\n            <img class=\"org-avatar\" [src]=\"node.avatarUrl\" [alt]=\"node.label\" />\n          } @else {\n            <span class=\"org-avatar initials\">{{ initials(node.label) }}</span>\n          }\n          <span class=\"org-copy\">\n            <strong>{{ node.label }}</strong>\n            @if (node.title) { <span>{{ node.title }}</span> }\n            @if (node.subtitle) { <small>{{ node.subtitle }}</small> }\n            @if (node.meta) { <em>{{ node.meta }}</em> }\n          </span>\n        </button>\n\n        @if (node.children?.length) {\n          <div class=\"org-children\">\n            @for (child of node.children; track child.id) {\n              <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: child, level: level + 1 }\"></ng-container>\n            }\n          </div>\n        }\n      </div>\n    </ng-template>\n  `,\n  styles: [`\n    :host { display: block; width: 100%; overflow: auto; }\n    .ngx-org-chart { display: flex; justify-content: center; min-width: max-content; padding: 16px; font-family: var(--ngx-font-family, inherit); color: var(--text-primary, #111827); }\n    .org-node-wrap { display: flex; flex-direction: column; align-items: center; position: relative; }\n    .org-node { display: grid; grid-template-columns: 42px minmax(130px, 1fr); align-items: center; gap: 10px; min-width: 220px; max-width: 280px; border: 1px solid var(--border-color, #dbe3ee); border-radius: 8px; background: var(--bg-secondary, #ffffff); box-shadow: var(--shadow-sm, 0 1px 3px rgba(15,23,42,0.08)); color: inherit; cursor: pointer; font: inherit; padding: 10px; text-align: left; }\n    .org-node:hover, .org-node:focus-visible { border-color: var(--primary-color, #4f46e5); box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.12)); outline: none; }\n    .org-avatar { width: 42px; height: 42px; border-radius: 50%; object-fit: cover; background: var(--primary-color, #4f46e5); color: #fff; display: inline-flex; align-items: center; justify-content: center; font-weight: 800; font-size: 13px; }\n    .org-copy { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n    .org-copy strong, .org-copy span, .org-copy small, .org-copy em { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n    .org-copy strong { font-size: 13px; }\n    .org-copy span { font-size: 12px; color: var(--text-secondary, #475569); }\n    .org-copy small { font-size: 11px; color: var(--text-secondary, #64748b); }\n    .org-copy em { font-size: 10px; color: var(--primary-color, #4f46e5); font-style: normal; font-weight: 700; }\n    .org-children { display: flex; gap: 18px; justify-content: center; position: relative; padding-top: 26px; }\n    .org-children::before { content: ''; position: absolute; top: 12px; left: 50%; width: 1px; height: 14px; background: var(--border-color, #cbd5e1); }\n    .org-children > .org-node-wrap::before { content: ''; position: absolute; top: -14px; left: 50%; width: 1px; height: 14px; background: var(--border-color, #cbd5e1); }\n    .compact .org-node { grid-template-columns: 32px minmax(100px, 1fr); min-width: 170px; padding: 8px; }\n    .compact .org-avatar { width: 32px; height: 32px; font-size: 11px; }\n    @media (max-width: 640px) {\n      .ngx-org-chart { justify-content: flex-start; padding: 10px; }\n      .org-children { gap: 10px; }\n    }\n  `]\n})\nexport class OrgChartComponent {\n  root = input<OrgChartNode | null>(null);\n  compact = input(false);\n\n  nodeSelected = output<OrgChartNode>();\n\n  initials(label: string): string {\n    return label\n      .split(/\\s+/)\n      .filter(Boolean)\n      .slice(0, 2)\n      .map(part => part[0]?.toUpperCase())\n      .join('');\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n@Component({\n  selector: 'ngx-json-viewer',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"ngx-json-viewer\">\n      <ng-container *ngTemplateOutlet=\"valueTemplate; context: { key: rootName(), value: data(), path: '$', depth: 0 }\"></ng-container>\n    </div>\n\n    <ng-template #valueTemplate let-key=\"key\" let-value=\"value\" let-path=\"path\" let-depth=\"depth\">\n      <div class=\"json-row\" [style.padding-left.px]=\"depth * 16\">\n        @if (isExpandable(value)) {\n          <button class=\"toggle\" type=\"button\" (click)=\"toggle(path)\">\n            {{ isExpanded(path, depth) ? '-' : '+' }}\n          </button>\n        } @else {\n          <span class=\"toggle-spacer\"></span>\n        }\n\n        <span class=\"json-key\">{{ key }}</span>\n        <span class=\"colon\">:</span>\n\n        @if (isExpandable(value)) {\n          <span class=\"json-summary\">{{ summary(value) }}</span>\n        } @else {\n          <span class=\"json-value\" [class.string]=\"isString(value)\" [class.nullish]=\"value === null\">{{ formatPrimitive(value) }}</span>\n        }\n      </div>\n\n      @if (isExpandable(value) && isExpanded(path, depth)) {\n        @for (childKey of objectKeys(value); track childKey) {\n          <ng-container *ngTemplateOutlet=\"valueTemplate; context: { key: childKey, value: childValue(value, childKey), path: path + '.' + childKey, depth: depth + 1 }\"></ng-container>\n        }\n      }\n    </ng-template>\n  `,\n  styles: [`\n    :host { display: block; }\n    .ngx-json-viewer { padding: 10px; border: 1px solid var(--border-color, #dbe3ee); border-radius: 8px; background: var(--bg-secondary, #ffffff); color: var(--text-primary, #0f172a); font-family: var(--ngx-monospace-font-family, 'Cascadia Code', Consolas, monospace); font-size: 12px; overflow: auto; }\n    .json-row { display: flex; align-items: center; min-height: 24px; gap: 5px; white-space: nowrap; }\n    .toggle, .toggle-spacer { width: 18px; height: 18px; flex: 0 0 18px; }\n    .toggle { display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--border-color, #dbe3ee); border-radius: 4px; background: var(--border-light, #f8fafc); color: var(--text-secondary, #475569); cursor: pointer; font: inherit; line-height: 1; }\n    .toggle:hover, .toggle:focus-visible { border-color: var(--primary-color, #4f46e5); outline: none; }\n    .json-key { color: var(--ngx-json-key, #7c3aed); font-weight: 700; }\n    .colon { color: var(--text-secondary, #64748b); }\n    .json-summary { color: var(--text-secondary, #64748b); }\n    .json-value { color: var(--ngx-json-number, #0f766e); }\n    .json-value.string { color: var(--ngx-json-string, #b45309); }\n    .json-value.nullish { color: var(--ngx-json-null, #64748b); font-style: italic; }\n  `]\n})\nexport class JsonViewerComponent {\n  data = input<JsonValue | unknown>(null);\n  rootName = input('root');\n  expandedDepth = input(1);\n\n  private toggled = signal<Record<string, boolean>>({});\n  private expandedDefaults = computed(() => Math.max(0, this.expandedDepth()));\n\n  toggle(path: string): void {\n    this.toggled.update(state => ({ ...state, [path]: !this.isExpanded(path, path.split('.').length - 1) }));\n  }\n\n  isExpanded(path: string, depth: number): boolean {\n    const explicit = this.toggled()[path];\n    if (explicit !== undefined) return explicit;\n    return depth < this.expandedDefaults();\n  }\n\n  isExpandable(value: unknown): boolean {\n    return value !== null && typeof value === 'object';\n  }\n\n  isString(value: unknown): boolean {\n    return typeof value === 'string';\n  }\n\n  objectKeys(value: unknown): string[] {\n    if (Array.isArray(value)) return value.map((_, index) => String(index));\n    if (value && typeof value === 'object') return Object.keys(value as Record<string, unknown>);\n    return [];\n  }\n\n  childValue(value: unknown, key: string): unknown {\n    return Array.isArray(value) ? value[Number(key)] : (value as Record<string, unknown>)?.[key];\n  }\n\n  summary(value: unknown): string {\n    if (Array.isArray(value)) return `Array(${value.length})`;\n    return `Object(${Object.keys(value as Record<string, unknown>).length})`;\n  }\n\n  formatPrimitive(value: unknown): string {\n    if (typeof value === 'string') return `\"${value}\"`;\n    if (value === null) return 'null';\n    return String(value);\n  }\n}\n","import {\n  Component, input, output, signal, computed, model, ContentChild, TemplateRef,\n  ElementRef, ViewChildren, QueryList, ChangeDetectionStrategy, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface CalendarEvent {\n  id?: string;\n  title: string;\n  date: Date | string;\n  color?: string;\n  description?: string;\n}\n\nexport interface CalendarCell {\n  date: Date;\n  dayNumber: number;\n  isCurrentMonth: boolean;\n  isToday: boolean;\n  isSelected: boolean;\n  isFocused: boolean;\n  events: CalendarEvent[];\n  isRangeStart?: boolean;\n  isRangeEnd?: boolean;\n  isInRange?: boolean;\n  isDisabled?: boolean;\n}\n\n@Component({\n  selector: 'ngx-calendar',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-calendar-container\"\n      role=\"application\"\n      aria-label=\"Interactive Calendar\"\n    >\n      <!-- HEADER -->\n      <div class=\"ngx-calendar-header\">\n        <h2 class=\"ngx-calendar-title\" aria-live=\"polite\">\n          @if (currentView() === 'month') {\n            <button class=\"ngx-calendar-title-link\" (click)=\"setView('month-picker')\" type=\"button\">\n              {{ monthLabel() }}\n            </button>\n          } @else if (currentView() === 'month-picker') {\n            <button class=\"ngx-calendar-title-link\" (click)=\"setView('year-picker')\" type=\"button\">\n              {{ activeMonthDate().getFullYear() }}\n            </button>\n          } @else {\n            <span class=\"ngx-calendar-title-static\">\n              Select Year\n            </span>\n          }\n        </h2>\n        <div class=\"ngx-calendar-actions\">\n          @if (currentView() === 'month') {\n            <button\n              class=\"ngx-cal-btn prev-btn\"\n              (click)=\"prevMonth()\"\n              type=\"button\"\n              aria-label=\"Previous Month\"\n            >\n              ‹\n            </button>\n            <button\n              class=\"ngx-cal-btn today-btn\"\n              (click)=\"goToToday()\"\n              type=\"button\"\n              aria-label=\"Go to Today\"\n            >\n              Today\n            </button>\n            <button\n              class=\"ngx-cal-btn next-btn\"\n              (click)=\"nextMonth()\"\n              type=\"button\"\n              aria-label=\"Next Month\"\n            >\n              ›\n            </button>\n          } @else if (currentView() === 'month-picker') {\n            <button\n              class=\"ngx-cal-btn prev-btn\"\n              (click)=\"changeYear(-1)\"\n              type=\"button\"\n              aria-label=\"Previous Year\"\n            >\n              ‹\n            </button>\n            <button\n              class=\"ngx-cal-btn back-btn\"\n              (click)=\"setView('month')\"\n              type=\"button\"\n            >\n              Back\n            </button>\n            <button\n              class=\"ngx-cal-btn next-btn\"\n              (click)=\"changeYear(1)\"\n              type=\"button\"\n              aria-label=\"Next Year\"\n            >\n              ›\n            </button>\n          } @else {\n            <button\n              class=\"ngx-cal-btn prev-btn\"\n              (click)=\"changeYearRange(-12)\"\n              type=\"button\"\n              aria-label=\"Previous Years\"\n            >\n              ‹\n            </button>\n            <button\n              class=\"ngx-cal-btn back-btn\"\n              (click)=\"setView('month-picker')\"\n              type=\"button\"\n            >\n              Back\n            </button>\n            <button\n              class=\"ngx-cal-btn next-btn\"\n              (click)=\"changeYearRange(12)\"\n              type=\"button\"\n              aria-label=\"Next Years\"\n            >\n              ›\n            </button>\n          }\n        </div>\n      </div>\n\n      <!-- MAIN VIEW AREA -->\n      <div class=\"ngx-calendar-view-area\">\n        <!-- MONTH VIEW (GRID) -->\n        @if (currentView() === 'month') {\n          <div\n            class=\"ngx-calendar-grid\"\n            role=\"grid\"\n            [attr.aria-label]=\"monthLabel()\"\n          >\n            <!-- WEEKDAYS HEADER -->\n            <div class=\"ngx-calendar-row weekdays-row\" role=\"row\">\n              @for (day of weekDays(); track day) {\n                <div\n                  class=\"ngx-calendar-weekday\"\n                  role=\"columnheader\"\n                  [attr.aria-label]=\"day\"\n                >\n                  {{ day.slice(0, 3) }}\n                </div>\n              }\n            </div>\n\n            <!-- DAYS GRID -->\n            <div class=\"ngx-calendar-body\">\n              @for (row of gridRows(); track $index) {\n                <div class=\"ngx-calendar-row\" role=\"row\">\n                  @for (cell of row; track cell.date.getTime()) {\n                    <div\n                      #cellEl\n                      class=\"ngx-calendar-cell\"\n                      [class.current-month]=\"cell.isCurrentMonth\"\n                      [class.other-month]=\"!cell.isCurrentMonth\"\n                      [class.today]=\"cell.isToday\"\n                      [class.selected]=\"cell.isSelected\"\n                      [class.focused]=\"cell.isFocused\"\n                      [class.has-events]=\"cell.events.length > 0\"\n                      [class.range-start]=\"cell.isRangeStart\"\n                      [class.range-end]=\"cell.isRangeEnd\"\n                      [class.in-range]=\"cell.isInRange\"\n                      [class.disabled]=\"cell.isDisabled\"\n                      role=\"gridcell\"\n                      [attr.aria-selected]=\"cell.isSelected\"\n                      [attr.aria-disabled]=\"cell.isDisabled\"\n                      [attr.aria-label]=\"cell.date | date:'longDate'\"\n                      [attr.tabindex]=\"cell.isFocused && !readonly() && !cell.isDisabled ? '0' : '-1'\"\n                      (click)=\"selectCell(cell)\"\n                      (keydown)=\"onCellKeyDown($event, cell)\"\n                    >\n                      <!-- Cell Header (Day Number) -->\n                      <div class=\"cell-header\">\n                        <span class=\"day-number\">{{ cell.dayNumber }}</span>\n                        @if (cell.isToday) {\n                          <span class=\"today-indicator\" aria-hidden=\"true\"></span>\n                        }\n                      </div>\n\n                      <!-- Events List or Custom Day Template -->\n                      <div class=\"cell-content\">\n                        @if (dayTemplate()) {\n                          <ng-container\n                            *ngTemplateOutlet=\"dayTemplate()!; context: { $implicit: cell.date, events: cell.events }\"\n                          ></ng-container>\n                        } @else {\n                          @for (event of cell.events.slice(0, 3); track event.title) {\n                            <div\n                              class=\"calendar-event-pill\"\n                              [style.border-left-color]=\"event.color || '#4f46e5'\"\n                              [attr.title]=\"event.title + (event.description ? ': ' + event.description : '')\"\n                              (click)=\"onEventClick($event, event)\"\n                            >\n                              {{ event.title }}\n                            </div>\n                          }\n                          @if (cell.events.length > 3) {\n                            <div class=\"events-overflow-indicator\">\n                              +{{ cell.events.length - 3 }} more\n                            </div>\n                          }\n                        }\n                      </div>\n                    </div>\n                  }\n                </div>\n              }\n            </div>\n          </div>\n        }\n\n        <!-- MONTH PICKER GRID -->\n        @if (currentView() === 'month-picker') {\n          <div class=\"ngx-calendar-picker-grid month-picker-grid\">\n            @for (month of monthsList(); track $index) {\n              <button\n                class=\"ngx-picker-item\"\n                [class.active]=\"isCurrentActiveMonth($index)\"\n                (click)=\"selectMonth($index)\"\n                type=\"button\"\n              >\n                {{ month.slice(0, 3) }}\n              </button>\n            }\n          </div>\n        }\n\n        <!-- YEAR PICKER GRID -->\n        @if (currentView() === 'year-picker') {\n          <div class=\"ngx-calendar-picker-grid year-picker-grid\">\n            @for (year of yearPickerYears(); track year) {\n              <button\n                class=\"ngx-picker-item\"\n                [class.active]=\"isCurrentActiveYear(year)\"\n                (click)=\"selectYear(year)\"\n                type=\"button\"\n              >\n                {{ year }}\n              </button>\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      --ngx-calendar-border: #cbd5e1;\n      --ngx-calendar-bg: #ffffff;\n      --ngx-calendar-header-bg: #f8fafc;\n      --ngx-calendar-text: #0f172a;\n      --ngx-calendar-text-muted: #64748b;\n      --ngx-calendar-cell-other-bg: #f8fafc;\n      --ngx-calendar-hover-bg: #f1f5f9;\n      --ngx-calendar-focus-shadow: 0 0 0 3px rgba(79, 70, 229, 0.2);\n      --ngx-calendar-active-color: #4f46e5;\n      --ngx-calendar-selected-bg: rgba(79, 70, 229, 0.05);\n      --ngx-calendar-selected-border: #4f46e5;\n      \n      --event-pill-bg: #f1f5f9;\n      --event-pill-text: #334155;\n    }\n\n    :host-context(body.dark),\n    :host-context(.dark),\n    :host-context(.dark-theme) {\n      --ngx-calendar-border: #334155;\n      --ngx-calendar-bg: #0f172a;\n      --ngx-calendar-header-bg: #1e293b;\n      --ngx-calendar-text: #f8fafc;\n      --ngx-calendar-text-muted: #94a3b8;\n      --ngx-calendar-cell-other-bg: #0b0f19;\n      --ngx-calendar-hover-bg: #1e293b;\n      --ngx-calendar-focus-shadow: 0 0 0 3px rgba(129, 140, 248, 0.25);\n      --ngx-calendar-active-color: #818cf8;\n      --ngx-calendar-selected-bg: rgba(129, 140, 248, 0.08);\n      --ngx-calendar-selected-border: #818cf8;\n      \n      --event-pill-bg: #1e293b;\n      --event-pill-text: #cbd5e1;\n    }\n\n    .ngx-calendar-container {\n      display: flex;\n      flex-direction: column;\n      border: 1px solid var(--ngx-calendar-border);\n      border-radius: 12px;\n      background: var(--ngx-calendar-bg);\n      color: var(--ngx-calendar-text);\n      font-family: inherit;\n      overflow: hidden;\n      box-shadow: 0 4px 20px -2px rgba(0, 0, 0, 0.05);\n      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    /* HEADER */\n    .ngx-calendar-header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 16px 24px;\n      background: var(--ngx-calendar-header-bg);\n      border-bottom: 1px solid var(--ngx-calendar-border);\n    }\n\n    .ngx-calendar-title {\n      margin: 0;\n      font-size: 18px;\n      font-weight: 700;\n      letter-spacing: -0.3px;\n    }\n\n    .ngx-calendar-title-link {\n      background: none;\n      border: none;\n      font-size: inherit;\n      font-weight: inherit;\n      color: inherit;\n      cursor: pointer;\n      padding: 0;\n      font-family: inherit;\n      transition: color 0.2s ease;\n      display: inline-flex;\n      align-items: center;\n    }\n\n    .ngx-calendar-title-link:hover {\n      color: var(--ngx-calendar-active-color);\n    }\n\n    .ngx-calendar-title-static {\n      font-size: inherit;\n      font-weight: inherit;\n      color: inherit;\n    }\n\n    .ngx-calendar-actions {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n\n    .ngx-cal-btn {\n      background: var(--ngx-calendar-bg);\n      border: 1px solid var(--ngx-calendar-border);\n      border-radius: 8px;\n      color: var(--ngx-calendar-text);\n      font-size: 13px;\n      font-weight: 600;\n      padding: 6px 12px;\n      cursor: pointer;\n      font-family: inherit;\n      transition: all 0.2s ease;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .ngx-cal-btn:hover {\n      background: var(--ngx-calendar-hover-bg);\n      border-color: var(--ngx-calendar-active-color);\n      color: var(--ngx-calendar-active-color);\n    }\n\n    .prev-btn, .next-btn {\n      font-size: 16px;\n      width: 32px;\n      height: 32px;\n      padding: 0;\n    }\n\n    /* VIEW AREA */\n    .ngx-calendar-view-area {\n      position: relative;\n      width: 100%;\n      background: var(--ngx-calendar-bg);\n    }\n\n    /* GRID */\n    .ngx-calendar-grid {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n    }\n\n    .ngx-calendar-row {\n      display: grid;\n      grid-template-columns: repeat(7, 1fr);\n      width: 100%;\n    }\n\n    /* WEEKDAYS */\n    .weekdays-row {\n      border-bottom: 1px solid var(--ngx-calendar-border);\n      background: var(--ngx-calendar-header-bg);\n    }\n\n    .ngx-calendar-weekday {\n      padding: 12px 6px;\n      text-align: center;\n      font-size: 12px;\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      color: var(--ngx-calendar-text-muted);\n    }\n\n    /* CELLS */\n    .ngx-calendar-body {\n      display: flex;\n      flex-direction: column;\n    }\n\n    .ngx-calendar-cell {\n      min-height: 100px;\n      border-right: 1px solid var(--ngx-calendar-border);\n      border-bottom: 1px solid var(--ngx-calendar-border);\n      padding: 8px;\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      position: relative;\n      outline: none;\n      background: var(--ngx-calendar-bg);\n    }\n\n    .ngx-calendar-row .ngx-calendar-cell:last-child {\n      border-right: none;\n    }\n\n    .ngx-calendar-body .ngx-calendar-row:last-child .ngx-calendar-cell {\n      border-bottom: none;\n    }\n\n    .ngx-calendar-cell.other-month {\n      background: var(--ngx-calendar-cell-other-bg);\n    }\n\n    .ngx-calendar-cell.other-month .day-number {\n      color: var(--ngx-calendar-text-muted);\n      opacity: 0.6;\n    }\n\n    .ngx-calendar-cell:not(.selected):not(.disabled):hover {\n      background: var(--ngx-calendar-hover-bg);\n      cursor: pointer;\n    }\n\n    /* Selection & Focus States */\n    .ngx-calendar-cell.selected {\n      background: var(--ngx-calendar-selected-bg);\n    }\n\n    .ngx-calendar-cell.selected::after {\n      content: '';\n      position: absolute;\n      inset: 0;\n      border: 2px solid var(--ngx-calendar-selected-border);\n      border-radius: 4px;\n      pointer-events: none;\n      animation: select-pulse 0.25s ease-out;\n    }\n\n    .ngx-calendar-cell.focused {\n      z-index: 2;\n    }\n    \n    .ngx-calendar-cell.focused:focus-visible {\n      box-shadow: var(--ngx-calendar-focus-shadow);\n      border-color: var(--ngx-calendar-active-color);\n    }\n\n    /* Range Selection CSS */\n    .ngx-calendar-cell.in-range {\n      background: var(--ngx-calendar-selected-bg) !important;\n    }\n\n    .ngx-calendar-cell.range-start {\n      border-top-left-radius: 8px;\n      border-bottom-left-radius: 8px;\n      background: var(--ngx-calendar-selected-bg) !important;\n    }\n\n    .ngx-calendar-cell.range-end {\n      border-top-right-radius: 8px;\n      border-bottom-right-radius: 8px;\n      background: var(--ngx-calendar-selected-bg) !important;\n    }\n\n    .ngx-calendar-cell.range-start::after {\n      content: '';\n      position: absolute;\n      inset: 0;\n      border: 2px solid var(--ngx-calendar-selected-border);\n      border-radius: 8px 0 0 8px;\n      pointer-events: none;\n    }\n\n    .ngx-calendar-cell.range-end::after {\n      content: '';\n      position: absolute;\n      inset: 0;\n      border: 2px solid var(--ngx-calendar-selected-border);\n      border-radius: 0 8px 8px 0;\n      pointer-events: none;\n    }\n\n    /* Disabled Cell CSS */\n    .ngx-calendar-cell.disabled {\n      opacity: 0.35;\n      pointer-events: none;\n      background: var(--ngx-calendar-cell-other-bg);\n      cursor: not-allowed;\n    }\n\n    .ngx-calendar-cell.disabled .day-number {\n      text-decoration: line-through;\n      color: var(--ngx-calendar-text-muted);\n    }\n\n    .cell-header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      margin-bottom: 4px;\n    }\n\n    .day-number {\n      font-size: 13px;\n      font-weight: 600;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 24px;\n      height: 24px;\n      border-radius: 50%;\n      transition: all 0.2s ease;\n    }\n\n    .today .day-number {\n      background: var(--ngx-calendar-active-color);\n      color: #ffffff !important;\n      box-shadow: 0 2px 8px rgba(79, 70, 229, 0.3);\n    }\n\n    .today-indicator {\n      width: 5px;\n      height: 5px;\n      border-radius: 50%;\n      background: var(--ngx-calendar-active-color);\n      margin-right: 4px;\n    }\n\n    /* Events Content */\n    .cell-content {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: 3px;\n      overflow: hidden;\n    }\n\n    .calendar-event-pill {\n      font-size: 11px;\n      font-weight: 550;\n      padding: 3px 6px;\n      border-radius: 4px;\n      border-left: 3px solid #4f46e5;\n      background: var(--event-pill-bg);\n      color: var(--event-pill-text);\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      transition: transform 0.15s ease, background-color 0.15s ease;\n    }\n\n    .calendar-event-pill:hover {\n      transform: translateX(2px);\n      background: var(--ngx-calendar-hover-bg);\n    }\n\n    .events-overflow-indicator {\n      font-size: 10px;\n      font-weight: 700;\n      color: var(--ngx-calendar-active-color);\n      padding-left: 6px;\n      margin-top: 2px;\n    }\n\n    /* PICKER GRID */\n    .ngx-calendar-picker-grid {\n      display: grid;\n      grid-template-columns: repeat(4, 1fr);\n      gap: 12px;\n      padding: 24px;\n      background: var(--ngx-calendar-bg);\n      animation: view-fade-in 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    @keyframes view-fade-in {\n      from { opacity: 0; transform: scale(0.97); }\n      to { opacity: 1; transform: scale(1); }\n    }\n\n    .ngx-picker-item {\n      background: var(--ngx-calendar-bg);\n      border: 1px solid var(--ngx-calendar-border);\n      border-radius: 8px;\n      color: var(--ngx-calendar-text);\n      padding: 16px 8px;\n      font-size: 14px;\n      font-weight: 600;\n      cursor: pointer;\n      text-align: center;\n      font-family: inherit;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    .ngx-picker-item:hover {\n      background: var(--ngx-calendar-hover-bg);\n      border-color: var(--ngx-calendar-active-color);\n      color: var(--ngx-calendar-active-color);\n      transform: translateY(-1px);\n    }\n\n    .ngx-picker-item.active {\n      background: var(--ngx-calendar-active-color);\n      color: #ffffff;\n      border-color: var(--ngx-calendar-active-color);\n      box-shadow: 0 4px 12px rgba(79, 70, 229, 0.25);\n    }\n\n    @keyframes select-pulse {\n      0% { transform: scale(0.98); opacity: 0.7; }\n      100% { transform: scale(1); opacity: 1; }\n    }\n\n    @media (max-width: 768px) {\n      .ngx-calendar-cell {\n        min-height: 70px;\n        padding: 4px;\n      }\n      .calendar-event-pill {\n        display: none;\n      }\n      .ngx-calendar-cell.has-events::after {\n        content: '•';\n        position: absolute;\n        bottom: 2px;\n        left: 50%;\n        transform: translateX(-50%);\n        color: var(--ngx-calendar-active-color);\n        font-size: 16px;\n      }\n      .ngx-calendar-picker-grid {\n        grid-template-columns: repeat(3, 1fr);\n      }\n    }\n  `]\n})\nexport class CalendarComponent {\n  value = model<Date | null>(null);\n  rangeStart = model<Date | null>(null);\n  rangeEnd = model<Date | null>(null);\n  events = input<CalendarEvent[]>([]);\n  readonly = input(false);\n  selectionMode = input<'single' | 'range'>('single');\n  min = input<Date | string | null>(null);\n  max = input<Date | string | null>(null);\n\n  // Content Projection for custom cell\n  @ContentChild('dayTemplate') dayTemplateSignal?: TemplateRef<{ $implicit: Date, events: CalendarEvent[] }>;\n\n  dayTemplate = computed(() => this.dayTemplateSignal);\n\n  activeMonthDate = signal<Date>(new Date());\n  focusedDate = signal<Date>(new Date());\n  currentView = signal<'month' | 'month-picker' | 'year-picker'>('month');\n  yearPickerStart = signal<number>(new Date().getFullYear() - 5);\n\n  dateSelect = output<Date>();\n  rangeSelect = output<{ start: Date | null; end: Date | null }>();\n  monthChange = output<{ year: number; month: number }>();\n  eventClick = output<CalendarEvent>();\n\n  weekDays = signal<string[]>([\n    'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n  ]);\n\n  monthsList = signal<string[]>([\n    'January', 'February', 'March', 'April', 'May', 'June',\n    'July', 'August', 'September', 'October', 'November', 'December'\n  ]);\n\n  @ViewChildren('cellEl') cellElements!: QueryList<ElementRef<HTMLDivElement>>;\n\n  monthLabel = computed(() => {\n    return this.activeMonthDate().toLocaleDateString('en-US', {\n      month: 'long',\n      year: 'numeric'\n    });\n  });\n\n  yearPickerYears = computed(() => {\n    const start = this.yearPickerStart();\n    return Array.from({ length: 12 }, (_, i) => start + i);\n  });\n\n  // Flat 42 cell list computed signal\n  gridCells = computed(() => {\n    const activeDate = this.activeMonthDate();\n    const year = activeDate.getFullYear();\n    const month = activeDate.getMonth();\n\n    const firstDay = new Date(year, month, 1);\n    const startDayOfWeek = firstDay.getDay();\n    const totalDays = new Date(year, month + 1, 0).getDate();\n    const prevMonthTotalDays = new Date(year, month, 0).getDate();\n\n    const cells: CalendarCell[] = [];\n    const selectedVal = this.value();\n    const focusedVal = this.focusedDate();\n    const rangeStartVal = this.rangeStart();\n    const rangeEndVal = this.rangeEnd();\n\n    // Previous month cells\n    for (let i = startDayOfWeek - 1; i >= 0; i--) {\n      const day = prevMonthTotalDays - i;\n      const date = new Date(year, month - 1, day);\n      cells.push(this.createCellObj(date, day, false, selectedVal, focusedVal, rangeStartVal, rangeEndVal));\n    }\n\n    // Current month cells\n    for (let day = 1; day <= totalDays; day++) {\n      const date = new Date(year, month, day);\n      cells.push(this.createCellObj(date, day, true, selectedVal, focusedVal, rangeStartVal, rangeEndVal));\n    }\n\n    // Next month cells\n    const remainingCells = 42 - cells.length;\n    for (let day = 1; day <= remainingCells; day++) {\n      const date = new Date(year, month + 1, day);\n      cells.push(this.createCellObj(date, day, false, selectedVal, focusedVal, rangeStartVal, rangeEndVal));\n    }\n\n    return cells;\n  });\n\n  // Group cells by 7 for visual rows\n  gridRows = computed(() => {\n    const cells = this.gridCells();\n    const rows: CalendarCell[][] = [];\n    for (let i = 0; i < cells.length; i += 7) {\n      rows.push(cells.slice(i, i + 7));\n    }\n    return rows;\n  });\n\n  private createCellObj(\n    date: Date,\n    dayNumber: number,\n    isCurrentMonth: boolean,\n    selectedVal: Date | null,\n    focusedVal: Date,\n    rangeStartVal: Date | null,\n    rangeEndVal: Date | null\n  ): CalendarCell {\n    const isRangeStart = rangeStartVal ? this.isSameDay(date, rangeStartVal) : false;\n    const isRangeEnd = rangeEndVal ? this.isSameDay(date, rangeEndVal) : false;\n    const isInRange = rangeStartVal && rangeEndVal && date >= rangeStartVal && date <= rangeEndVal;\n    const isDisabled = this.isDateDisabled(date);\n\n    return {\n      date,\n      dayNumber,\n      isCurrentMonth,\n      isToday: this.isSameDay(date, new Date()),\n      isSelected: this.selectionMode() === 'range'\n        ? (isRangeStart || isRangeEnd)\n        : (selectedVal ? this.isSameDay(date, selectedVal) : false),\n      isFocused: this.isSameDay(date, focusedVal),\n      events: this.getEventsForDate(date),\n      isRangeStart,\n      isRangeEnd,\n      isInRange: !!isInRange,\n      isDisabled\n    };\n  }\n\n  private isSameDay(d1: Date, d2: Date): boolean {\n    return (\n      d1.getFullYear() === d2.getFullYear() &&\n      d1.getMonth() === d2.getMonth() &&\n      d1.getDate() === d2.getDate()\n    );\n  }\n\n  private isDateDisabled(date: Date): boolean {\n    const minVal = this.min();\n    const maxVal = this.max();\n    \n    // Reset times for exact day comparisons\n    const checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\n    if (minVal) {\n      const minDate = typeof minVal === 'string' ? new Date(minVal) : minVal;\n      const minCheck = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());\n      if (checkDate < minCheck) return true;\n    }\n    if (maxVal) {\n      const maxDate = typeof maxVal === 'string' ? new Date(maxVal) : maxVal;\n      const maxCheck = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());\n      if (checkDate > maxCheck) return true;\n    }\n    return false;\n  }\n\n  private getEventsForDate(date: Date): CalendarEvent[] {\n    return this.events().filter(e => {\n      const eDate = typeof e.date === 'string' ? new Date(e.date) : e.date;\n      return this.isSameDay(date, eDate);\n    });\n  }\n\n  prevMonth(): void {\n    const current = this.activeMonthDate();\n    const prev = new Date(current.getFullYear(), current.getMonth() - 1, 1);\n    this.activeMonthDate.set(prev);\n    // Align focus with 1st of the new active month\n    this.focusedDate.set(prev);\n    this.emitMonthChange();\n  }\n\n  nextMonth(): void {\n    const current = this.activeMonthDate();\n    const next = new Date(current.getFullYear(), current.getMonth() + 1, 1);\n    this.activeMonthDate.set(next);\n    // Align focus with 1st of the new active month\n    this.focusedDate.set(next);\n    this.emitMonthChange();\n  }\n\n  goToToday(): void {\n    const today = new Date();\n    this.activeMonthDate.set(new Date(today.getFullYear(), today.getMonth(), 1));\n    this.focusedDate.set(today);\n    this.emitMonthChange();\n  }\n\n  selectCell(cell: CalendarCell): void {\n    if (this.readonly() || cell.isDisabled) return;\n\n    if (this.selectionMode() === 'range') {\n      const clickedDate = cell.date;\n      const start = this.rangeStart();\n      const end = this.rangeEnd();\n\n      if (!start || (start && end)) {\n        this.rangeStart.set(clickedDate);\n        this.rangeEnd.set(null);\n        this.rangeSelect.emit({ start: clickedDate, end: null });\n      } else {\n        if (clickedDate < start) {\n          this.rangeStart.set(clickedDate);\n          this.rangeEnd.set(start);\n          this.rangeSelect.emit({ start: clickedDate, end: start });\n        } else {\n          this.rangeEnd.set(clickedDate);\n          this.rangeSelect.emit({ start, end: clickedDate });\n        }\n      }\n    } else {\n      this.value.set(cell.date);\n      this.dateSelect.emit(cell.date);\n    }\n\n    this.focusedDate.set(cell.date);\n\n    // If clicked other month day, snap page view\n    if (!cell.isCurrentMonth) {\n      this.activeMonthDate.set(new Date(cell.date.getFullYear(), cell.date.getMonth(), 1));\n      this.emitMonthChange();\n    }\n  }\n\n  private emitMonthChange(): void {\n    const active = this.activeMonthDate();\n    this.monthChange.emit({\n      year: active.getFullYear(),\n      month: active.getMonth()\n    });\n  }\n\n  setView(view: 'month' | 'month-picker' | 'year-picker'): void {\n    this.currentView.set(view);\n    if (view === 'year-picker') {\n      const year = this.activeMonthDate().getFullYear();\n      this.yearPickerStart.set(year - 5);\n    }\n  }\n\n  isCurrentActiveMonth(monthIdx: number): boolean {\n    return this.activeMonthDate().getMonth() === monthIdx;\n  }\n\n  isCurrentActiveYear(year: number): boolean {\n    return this.activeMonthDate().getFullYear() === year;\n  }\n\n  selectMonth(monthIdx: number): void {\n    const current = this.activeMonthDate();\n    const updated = new Date(current.getFullYear(), monthIdx, 1);\n    this.activeMonthDate.set(updated);\n    this.focusedDate.set(updated);\n    this.setView('month');\n    this.emitMonthChange();\n  }\n\n  selectYear(year: number): void {\n    const current = this.activeMonthDate();\n    const updated = new Date(year, current.getMonth(), 1);\n    this.activeMonthDate.set(updated);\n    this.focusedDate.set(updated);\n    this.setView('month-picker');\n    this.emitMonthChange();\n  }\n\n  changeYear(delta: number): void {\n    const current = this.activeMonthDate();\n    const updated = new Date(current.getFullYear() + delta, current.getMonth(), 1);\n    this.activeMonthDate.set(updated);\n    this.focusedDate.set(updated);\n    this.emitMonthChange();\n  }\n\n  changeYearRange(delta: number): void {\n    this.yearPickerStart.update(start => start + delta);\n  }\n\n  onEventClick(event: MouseEvent, calEvent: CalendarEvent): void {\n    event.stopPropagation();\n    if (this.readonly()) return;\n    this.eventClick.emit(calEvent);\n  }\n\n  // Keyboard navigation\n  onCellKeyDown(event: KeyboardEvent, cell: CalendarCell): void {\n    if (this.readonly() || cell.isDisabled) return;\n\n    let handled = false;\n    const currentFocus = new Date(this.focusedDate());\n\n    switch (event.key) {\n      case 'ArrowLeft':\n        currentFocus.setDate(currentFocus.getDate() - 1);\n        handled = true;\n        break;\n      case 'ArrowRight':\n        currentFocus.setDate(currentFocus.getDate() + 1);\n        handled = true;\n        break;\n      case 'ArrowUp':\n        currentFocus.setDate(currentFocus.getDate() - 7);\n        handled = true;\n        break;\n      case 'ArrowDown':\n        currentFocus.setDate(currentFocus.getDate() + 7);\n        handled = true;\n        break;\n      case 'Enter':\n      case ' ':\n        this.selectCell(cell);\n        handled = true;\n        break;\n    }\n\n    if (handled) {\n      event.preventDefault();\n      \n      // Prevent moving focus to a disabled date\n      if (this.isDateDisabled(currentFocus)) {\n        return;\n      }\n\n      this.focusedDate.set(currentFocus);\n\n      // Check if we navigated to a date outside the current active month, and auto-snap activeMonth\n      const active = this.activeMonthDate();\n      if (\n        currentFocus.getFullYear() !== active.getFullYear() ||\n        currentFocus.getMonth() !== active.getMonth()\n      ) {\n        this.activeMonthDate.set(new Date(currentFocus.getFullYear(), currentFocus.getMonth(), 1));\n        this.emitMonthChange();\n      }\n\n      // Delay focus slightly so angular updates DOM tab-indices\n      setTimeout(() => {\n        const activeCellEl = this.cellElements.find(el => \n          el.nativeElement.getAttribute('tabindex') === '0'\n        );\n        if (activeCellEl) {\n          activeCellEl.nativeElement.focus();\n        }\n      }, 0);\n    }\n  }\n}\n","/*\n * Public API Surface — secondary entry point: ngx-core-components/views\n */\n\n// Tree View — hierarchical/nested data with expand/collapse\nexport { TreeViewComponent } from './tree-view/tree-view.component';\nexport type { TreeNode, TreeNodeEvent } from './tree-view/tree-view.component';\n\n// List View — flat data arrays with selection and custom templates\nexport { ListViewComponent } from './list-view/list-view.component';\nexport type {\n  ListViewItemClickEvent,\n  ListViewSelectionEvent,\n  ListViewPageChangeEvent,\n} from './list-view/list-view.component';\n\n// Kanban Board — visual drag-and-drop workflow task board\nexport { KanbanComponent } from './kanban/kanban.component';\nexport type {\n  KanbanCard,\n  KanbanColumn,\n  KanbanSwimlane,\n  KanbanCardMoveEvent,\n  KanbanMoveRejectedEvent,\n} from './kanban/models';\n\n// Timeline Component — chronological events list vertical/horizontal\nexport { TimelineComponent, NgxTimelineMarkerTemplateDirective, NgxTimelineCardTemplateDirective } from './timeline/timeline.component';\nexport type { TimelineItem } from './timeline/timeline.component';\n\n// Scheduler Component — Day/Week/Month appointment planner\nexport { SchedulerComponent, NgxSchedulerEventTemplateDirective } from './scheduler/scheduler.component';\nexport type {\n  SchedulerEvent,\n  SchedulerRecurrence,\n  SchedulerSlotClickEvent,\n  SchedulerEventChangeEvent,\n  SchedulerResource,\n  SchedulerSlotRangeSelectEvent,\n} from './scheduler/models';\n\n// Virtual List — high-performance windowed list for large datasets\nexport { VirtualListComponent } from './virtual-list/virtual-list.component';\nexport type { VirtualListItem, VirtualListItemClickEvent } from './virtual-list/virtual-list.component';\n\n// Image Compare Slider\nexport { ImageCompareComponent } from './image-compare/image-compare.component';\n\n// Key Value Details List\nexport { KeyValueListComponent } from './key-value-list/key-value-list.component';\nexport type { KeyValueItem } from './key-value-list/key-value-list.component';\n\n// Org Chart\nexport { OrgChartComponent } from './org-chart/org-chart.component';\nexport type { OrgChartNode } from './org-chart/org-chart.component';\n\n// JSON Viewer\nexport { JsonViewerComponent } from './json-viewer/json-viewer.component';\n\n// Calendar View — interactive month calendar with event indicators\nexport { CalendarComponent } from './calendar/calendar.component';\nexport type { CalendarEvent, CalendarCell } from './calendar/calendar.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}