{"version":3,"file":"ngwr-tree.mjs","sources":["../../../projects/lib/tree/tree.ts","../../../projects/lib/tree/tree.html","../../../projects/lib/tree/ngwr-tree.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n  Component,\n  DestroyRef,\n  ElementRef,\n  TemplateRef,\n  ViewContainerRef,\n  ViewEncapsulation,\n  computed,\n  effect,\n  forwardRef,\n  inject,\n  input,\n  model,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { readI18nText, useI18nFormatter } from 'ngwr/i18n';\nimport { WR_OVERLAY } from 'ngwr/overlay';\nimport { noop } from 'ngwr/utils';\n\nimport type { WrTreeNode, WrTreeSelectionMode } from './interfaces';\n\ninterface FlatNode<TId> {\n  readonly node: WrTreeNode<TId>;\n  readonly depth: number;\n  readonly hasChildren: boolean;\n}\n\ninterface SelectedChip<TId> {\n  readonly id: TId;\n  readonly label: string;\n}\n\nlet panelUid = 0;\n\n/**\n * Hierarchical tree. Data-driven — pass `[nodes]` with optional `children`\n * arrays. Supports single / multi selection (two-way `[(selected)]`),\n * controlled expand state (two-way `[(expanded)]`), and full keyboard\n * navigation.\n *\n * Two render shapes, picked by `[openOn]`:\n * - `'inline'` (default) — renders the tree list in-place. Use as a display\n *   widget or form-less hierarchical picker.\n * - `'overlay'` — renders a `<wr-select>`-style trigger button (with chips\n *   in multi mode) that opens a popover containing the tree. Acts as a\n *   `ControlValueAccessor` — bind via `[(ngModel)]`, `[formControl]`, or\n *   `formControlName`. Replaces the standalone `<wr-tree-select>`.\n *\n * Value type in `overlay` mode: `TId | null` in single mode,\n * `readonly TId[]` in multi mode.\n *\n * @example\n * ```html\n * <!-- Inline tree (display widget) -->\n * <wr-tree [nodes]=\"folders\" [(selected)]=\"picked\" [(expanded)]=\"open\" />\n *\n * <!-- Form-bound combobox -->\n * <wr-tree\n *   openOn=\"overlay\"\n *   [nodes]=\"folders\"\n *   selectionMode=\"single\"\n *   [(ngModel)]=\"picked\"\n *   placeholder=\"Pick a folder\"\n * />\n * ```\n *\n * @see https://ngwr.dev/components/tree\n */\n@Component({\n  selector: 'wr-tree',\n  templateUrl: './tree.html',\n  encapsulation: ViewEncapsulation.None,\n  host: { '[class]': 'classes()' },\n  imports: [NgTemplateOutlet],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      // eslint-disable-next-line @angular-eslint/no-forward-ref\n      useExisting: forwardRef(() => WrTree),\n      multi: true,\n    },\n  ],\n})\nexport class WrTree<TId = string> implements ControlValueAccessor {\n  /** Tree data. */\n  readonly nodes = input<readonly WrTreeNode<TId>[]>([]);\n\n  /** Selected node ids (two-way bindable). */\n  readonly selected = model<readonly TId[]>([]);\n\n  /** Expanded node ids (two-way bindable). */\n  readonly expanded = model<readonly TId[]>([]);\n\n  /** Selection behavior. @default 'single' */\n  readonly selectionMode = input<WrTreeSelectionMode>('single');\n\n  /** Disable the whole tree. @default false */\n  readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n  // Overlay-mode inputs (ignored when openOn='inline')\n\n  /** Render shape. @default 'inline' */\n  readonly openOn = input<'inline' | 'overlay'>('inline');\n\n  /** Placeholder shown on the trigger when no node is selected. */\n  readonly placeholder = input<string>('');\n\n  /** Show a clear-all (×) button on the trigger when at least one node is selected. @default true */\n  readonly clearable = input(true, { transform: coerceBooleanProperty });\n\n  /**\n   * Cap on the number of chips rendered on the trigger before\n   * collapsing the rest into `+N more` (multi mode only). `0` = render\n   * every chip. @default 0\n   */\n  readonly maxTagCount = input(0, {\n    transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n  });\n\n  /** Auto-expand every node that has children on first open of the overlay. @default false */\n  readonly defaultExpandAll = input(false, { transform: coerceBooleanProperty });\n\n  // Internals\n\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly overlay = inject(WR_OVERLAY);\n  private readonly vcr = inject(ViewContainerRef);\n  private readonly scrollStrategies = inject(ScrollStrategyOptions);\n  private readonly destroyRef = inject(DestroyRef);\n\n  /** Currently focused row's index in the flattened visible list. */\n  protected readonly focusedIndex = signal(0);\n\n  /** Resolved ARIA labels — pick up live locale changes via re-render. */\n  protected readonly clearLabel = readI18nText('tree.clearSelection', 'Clear selection');\n  protected readonly expandLabel = readI18nText('tree.expand', 'Expand');\n  protected readonly collapseLabel = readI18nText('tree.collapse', 'Collapse');\n  protected readonly chipRemoveLabel = useI18nFormatter('tree.removeItem', 'Remove {{label}}');\n\n  /** Flattened list of currently visible nodes — what the template renders. */\n  protected readonly flat = computed<readonly FlatNode<TId>[]>(() => {\n    const expanded = new Set(this.expanded());\n    const out: FlatNode<TId>[] = [];\n    const walk = (list: readonly WrTreeNode<TId>[], depth: number): void => {\n      for (const node of list) {\n        const hasChildren = (node.children?.length ?? 0) > 0;\n        out.push({ node, depth, hasChildren });\n        if (hasChildren && expanded.has(node.id)) walk(node.children!, depth + 1);\n      }\n    };\n    walk(this.nodes(), 0);\n    return out;\n  });\n\n  protected readonly selectedSet = computed(() => new Set(this.selected()));\n  protected readonly expandedSet = computed(() => new Set(this.expanded()));\n\n  protected readonly isOverlay = computed(() => this.openOn() === 'overlay');\n  protected readonly isMulti = computed(() => this.selectionMode() === 'multi');\n  protected readonly hasSelection = computed(() => this.selected().length > 0);\n\n  /** Overlay-mode trigger label / chip map. */\n  private readonly labelMap = computed<ReadonlyMap<TId, string>>(() => {\n    const map = new Map<TId, string>();\n    const walk = (list: readonly WrTreeNode<TId>[]): void => {\n      for (const n of list) {\n        map.set(n.id, n.label);\n        if (n.children?.length) walk(n.children);\n      }\n    };\n    walk(this.nodes());\n    return map;\n  });\n\n  protected readonly selectedChips = computed<readonly SelectedChip<TId>[]>(() => {\n    const map = this.labelMap();\n    return this.selected().map<SelectedChip<TId>>(id => ({ id, label: map.get(id) ?? String(id) }));\n  });\n\n  protected readonly visibleChips = computed<readonly SelectedChip<TId>[]>(() => {\n    const cap = this.maxTagCount();\n    const chips = this.selectedChips();\n    return cap > 0 && chips.length > cap ? chips.slice(0, cap) : chips;\n  });\n\n  protected readonly hiddenChipCount = computed(() => {\n    const cap = this.maxTagCount();\n    const total = this.selectedChips().length;\n    return cap > 0 && total > cap ? total - cap : 0;\n  });\n\n  protected readonly singleLabel = computed<string | null>(() => {\n    if (this.isMulti()) return null;\n    const first = this.selected()[0];\n    if (first == null) return null;\n    return this.labelMap().get(first) ?? null;\n  });\n\n  /** Overlay open state. Only meaningful when `openOn='overlay'`. */\n  protected readonly open = signal(false);\n\n  /** Trigger / panel id for `aria-controls`. */\n  protected readonly panelId = `wr-tree-panel-${++panelUid}`;\n\n  private readonly disabledFromCva = signal(false);\n\n  protected readonly isDisabled = computed(() => this.disabled() || this.disabledFromCva());\n\n  protected readonly classes = computed(() => {\n    const parts = ['wr-tree'];\n    if (this.isDisabled()) parts.push('wr-tree--disabled');\n    if (this.isOverlay()) {\n      parts.push('wr-tree--combobox');\n      if (this.open()) parts.push('wr-tree--open');\n      if (this.isMulti()) parts.push('wr-tree--multi');\n    }\n    return parts.join(' ');\n  });\n\n  protected readonly panelTpl = viewChild('panelTpl', { read: TemplateRef });\n\n  private overlayRef: OverlayRef | null = null;\n\n  // ControlValueAccessor\n\n  private onChange: (value: TId | readonly TId[] | null) => void = noop;\n  /** @internal exposed so the trigger can fire on blur. */\n  protected onTouched: () => void = noop;\n\n  constructor() {\n    // Drive the overlay open/close in response to the `open` signal.\n    effect(() => {\n      if (!this.isOverlay()) return;\n      if (this.open()) {\n        this.openOverlay();\n        if (this.defaultExpandAll() && this.expanded().length === 0) {\n          this.expanded.set(this.collectExpandableIds(this.nodes()));\n        }\n      } else {\n        this.closeOverlay();\n      }\n    });\n\n    this.destroyRef.onDestroy(() => this.closeOverlay());\n  }\n\n  writeValue(value: unknown): void {\n    if (this.isMulti()) {\n      this.selected.set(Array.isArray(value) ? (value as readonly TId[]) : []);\n    } else if (value == null) {\n      this.selected.set([]);\n    } else {\n      this.selected.set([value as TId]);\n    }\n  }\n\n  registerOnChange(fn: (value: TId | readonly TId[] | null) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabledFromCva.set(coerceBooleanProperty(isDisabled));\n    if (isDisabled) this.open.set(false);\n  }\n\n  // Template handlers\n\n  protected onRowClick(flat: FlatNode<TId>, event: MouseEvent): void {\n    if (this.isDisabled() || flat.node.disabled) return;\n    if (flat.hasChildren && (event.target as HTMLElement).closest('.wr-tree__toggle')) {\n      this.toggleExpanded(flat.node.id);\n      return;\n    }\n    this.focusIndex(this.flat().indexOf(flat));\n    this.select(flat.node.id, event.ctrlKey || event.metaKey);\n  }\n\n  protected onToggleClick(node: WrTreeNode<TId>, event: MouseEvent): void {\n    event.stopPropagation();\n    if (this.isDisabled() || node.disabled) return;\n    this.toggleExpanded(node.id);\n  }\n\n  protected onKeydown(event: KeyboardEvent): void {\n    if (this.isDisabled()) return;\n    const flat = this.flat();\n    const i = this.focusedIndex();\n    const current = flat[i];\n    if (!current) return;\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        this.focusIndex(Math.min(flat.length - 1, i + 1));\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        this.focusIndex(Math.max(0, i - 1));\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        if (current.hasChildren && !this.expandedSet().has(current.node.id)) {\n          this.toggleExpanded(current.node.id);\n        } else if (current.hasChildren) {\n          this.focusIndex(Math.min(flat.length - 1, i + 1));\n        }\n        break;\n      case 'ArrowLeft':\n        event.preventDefault();\n        if (current.hasChildren && this.expandedSet().has(current.node.id)) {\n          this.toggleExpanded(current.node.id);\n        } else if (current.depth > 0) {\n          for (let j = i - 1; j >= 0; j--) {\n            if (flat[j].depth < current.depth) {\n              this.focusIndex(j);\n              break;\n            }\n          }\n        }\n        break;\n      case 'Home':\n        event.preventDefault();\n        this.focusIndex(0);\n        break;\n      case 'End':\n        event.preventDefault();\n        this.focusIndex(flat.length - 1);\n        break;\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        if (!current.node.disabled) this.select(current.node.id, event.ctrlKey || event.metaKey);\n        break;\n      default:\n        break;\n    }\n  }\n\n  // Overlay-mode trigger handlers\n\n  protected onTriggerClick(): void {\n    if (this.isDisabled()) return;\n    this.open.update(v => !v);\n  }\n\n  protected removeChip(id: TId, event: Event): void {\n    event.stopPropagation();\n    if (this.isDisabled()) return;\n    const next = this.selected().filter(x => x !== id);\n    this.selected.set(next);\n    this.emit();\n  }\n\n  protected clearSelection(event: Event): void {\n    event.stopPropagation();\n    if (this.isDisabled()) return;\n    this.selected.set([]);\n    if (this.isMulti()) {\n      this.onChange([]);\n    } else {\n      this.onChange(null);\n    }\n    this.onTouched();\n  }\n\n  // Selection / expansion plumbing\n\n  private toggleExpanded(id: TId): void {\n    const set = new Set(this.expanded());\n    if (set.has(id)) set.delete(id);\n    else set.add(id);\n    this.expanded.set([...set]);\n  }\n\n  private select(id: TId, additive: boolean): void {\n    const mode = this.selectionMode();\n    if (mode === 'none') return;\n    if (mode === 'single') {\n      this.selected.set([id]);\n    } else {\n      const set = new Set(this.selected());\n      if (additive) {\n        if (set.has(id)) set.delete(id);\n        else set.add(id);\n      } else {\n        // Plain click toggles single id in multi mode — common UX.\n        if (set.size === 1 && set.has(id)) set.delete(id);\n        else {\n          set.clear();\n          set.add(id);\n        }\n      }\n      this.selected.set([...set]);\n    }\n\n    // Overlay mode: propagate to CVA, close on single-mode pick.\n    if (this.isOverlay()) {\n      this.emit();\n      if (mode === 'single' && this.selected().length > 0) {\n        this.open.set(false);\n      }\n    }\n  }\n\n  private emit(): void {\n    this.onTouched();\n    if (this.isMulti()) {\n      this.onChange(this.selected());\n    } else {\n      this.onChange(this.selected()[0] ?? null);\n    }\n  }\n\n  private focusIndex(i: number): void {\n    this.focusedIndex.set(i);\n    // Defer to next frame so the DOM has updated row classes/tabindex.\n    queueMicrotask(() => {\n      const root = this.overlayRef?.overlayElement ?? this.host.nativeElement;\n      const row = root.querySelector<HTMLElement>(`[data-tree-index=\"${i}\"]`);\n      row?.focus();\n    });\n  }\n\n  // Overlay\n\n  private collectExpandableIds(list: readonly WrTreeNode<TId>[]): readonly TId[] {\n    const out: TId[] = [];\n    const walk = (items: readonly WrTreeNode<TId>[]): void => {\n      for (const n of items) {\n        if (n.children?.length) {\n          out.push(n.id);\n          walk(n.children);\n        }\n      }\n    };\n    walk(list);\n    return out;\n  }\n\n  private openOverlay(): void {\n    if (this.overlayRef) return;\n    const tpl = this.panelTpl();\n    if (!tpl) return;\n\n    const positionStrategy = this.overlay\n      .position()\n      .flexibleConnectedTo(this.host)\n      .withPositions([\n        { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n        { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n      ])\n      .withPush(true);\n\n    this.overlayRef = this.overlay.create({\n      positionStrategy,\n      scrollStrategy: this.scrollStrategies.reposition(),\n      width: this.host.nativeElement.getBoundingClientRect().width,\n      panelClass: 'wr-tree-overlay',\n    });\n\n    this.overlayRef.attach(new TemplatePortal(tpl, this.vcr));\n\n    this.overlayRef\n      .outsidePointerEvents()\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(event => {\n        if (this.host.nativeElement.contains(event.target as Node)) return;\n        this.open.set(false);\n      });\n\n    this.overlayRef\n      .keydownEvents()\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(event => {\n        if (event.key === 'Escape') {\n          event.preventDefault();\n          this.open.set(false);\n        }\n      });\n  }\n\n  private closeOverlay(): void {\n    if (!this.overlayRef) return;\n    this.overlayRef.dispose();\n    this.overlayRef = null;\n  }\n}\n","@if (isOverlay()) {\n  <button\n    type=\"button\"\n    class=\"wr-tree__trigger\"\n    role=\"combobox\"\n    [disabled]=\"isDisabled()\"\n    [attr.aria-haspopup]=\"'tree'\"\n    [attr.aria-expanded]=\"open()\"\n    [attr.aria-controls]=\"panelId\"\n    [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n    (click)=\"onTriggerClick()\"\n    (blur)=\"onTouched()\"\n  >\n    @if (isMulti()) {\n      @if (hasSelection()) {\n        <span class=\"wr-tree__chips\">\n          @for (chip of visibleChips(); track chip.id) {\n            <span class=\"wr-tree__chip\">\n              <span class=\"wr-tree__chip-label\">{{ chip.label }}</span>\n              <span\n                class=\"wr-tree__chip-remove\"\n                role=\"button\"\n                [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n                tabindex=\"-1\"\n                (click)=\"removeChip(chip.id, $event)\"\n                (keydown.enter)=\"removeChip(chip.id, $event)\"\n                (keydown.space)=\"removeChip(chip.id, $event)\"\n              >\n                <svg\n                  class=\"wr-icon__svg\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"2\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                >\n                  <path d=\"M18 6 6 18\" />\n                  <path d=\"m6 6 12 12\" />\n                </svg>\n              </span>\n            </span>\n          }\n          @if (hiddenChipCount(); as extra) {\n            <span class=\"wr-tree__chip wr-tree__chip--more\">+{{ extra }} more</span>\n          }\n        </span>\n      } @else {\n        <span class=\"wr-tree__placeholder\">{{ placeholder() }}</span>\n      }\n    } @else {\n      @if (singleLabel(); as label) {\n        <span class=\"wr-tree__value\">{{ label }}</span>\n      } @else {\n        <span class=\"wr-tree__placeholder\">{{ placeholder() }}</span>\n      }\n    }\n\n    @if (clearable() && hasSelection() && !isDisabled()) {\n      <span\n        class=\"wr-tree__clear\"\n        role=\"button\"\n        [attr.aria-label]=\"clearLabel\"\n        tabindex=\"-1\"\n        (click)=\"clearSelection($event)\"\n        (keydown.enter)=\"clearSelection($event)\"\n        (keydown.space)=\"clearSelection($event)\"\n      >\n        <svg\n          class=\"wr-icon__svg\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M18 6 6 18\" />\n          <path d=\"m6 6 12 12\" />\n        </svg>\n      </span>\n    }\n\n    <svg\n      class=\"wr-icon__svg wr-tree__chevron\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      stroke-width=\"2\"\n      stroke-linecap=\"round\"\n      stroke-linejoin=\"round\"\n      aria-hidden=\"true\"\n    >\n      <path d=\"m6 9 6 6 6-6\" />\n    </svg>\n  </button>\n\n  <!-- Tree list lives inside the overlay panel. -->\n  <ng-template #panelTpl>\n    <div class=\"wr-tree-panel\" [attr.id]=\"panelId\">\n      <ng-container [ngTemplateOutlet]=\"listTpl\" />\n    </div>\n  </ng-template>\n} @else {\n  <ng-container [ngTemplateOutlet]=\"listTpl\" />\n}\n\n<!-- Shared row list — rendered inline (default) or projected into the\n     overlay panel (when openOn=\"overlay\"). -->\n<ng-template #listTpl>\n  <!-- Roving tabindex: the tree owns keyboard focus and routes arrow keys\n       to its currently-focused row. -->\n  <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n  <ul class=\"wr-tree__list\" role=\"tree\" (keydown)=\"onKeydown($event)\">\n    @for (entry of flat(); track entry.node.id) {\n      <!-- Click handler lives on focusable rows; keyboard handling is owned\n           by the parent <ul> via the roving-tabindex pattern. -->\n      <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events -->\n      <li\n        class=\"wr-tree__row\"\n        role=\"treeitem\"\n        [class.wr-tree__row--selected]=\"selectedSet().has(entry.node.id)\"\n        [class.wr-tree__row--disabled]=\"entry.node.disabled\"\n        [attr.aria-level]=\"entry.depth + 1\"\n        [attr.aria-expanded]=\"entry.hasChildren ? expandedSet().has(entry.node.id) : null\"\n        [attr.aria-selected]=\"selectionMode() === 'none' ? null : selectedSet().has(entry.node.id)\"\n        [attr.aria-disabled]=\"entry.node.disabled || isDisabled() || null\"\n        [attr.data-tree-index]=\"$index\"\n        [attr.tabindex]=\"$index === focusedIndex() ? 0 : -1\"\n        [style.--wr-tree-depth]=\"entry.depth\"\n        (click)=\"onRowClick(entry, $event)\"\n      >\n        @if (entry.hasChildren) {\n          <button\n            type=\"button\"\n            class=\"wr-tree__toggle\"\n            tabindex=\"-1\"\n            [attr.aria-label]=\"expandedSet().has(entry.node.id) ? collapseLabel : expandLabel\"\n            (click)=\"onToggleClick(entry.node, $event)\"\n          >\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n              <path d=\"M3 1 L7 5 L3 9 Z\" fill=\"currentColor\" />\n            </svg>\n          </button>\n        } @else {\n          <span class=\"wr-tree__toggle wr-tree__toggle--leaf\" aria-hidden=\"true\"></span>\n        }\n        <span class=\"wr-tree__label\">{{ entry.node.label }}</span>\n      </li>\n    }\n  </ul>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}