{"version":3,"file":"ngwr-mention.mjs","sources":["../../../projects/lib/mention/caret.ts","../../../projects/lib/mention/mention-panel.ts","../../../projects/lib/mention/mention-panel.html","../../../projects/lib/mention/mention.ts","../../../projects/lib/mention/ngwr-mention.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\n/** CSS properties whose values must be copied onto the mirror to match layout. */\nconst MIRROR_PROPS: readonly (keyof CSSStyleDeclaration)[] = [\n  'boxSizing',\n  'width',\n  'height',\n  'overflowX',\n  'overflowY',\n  'borderTopWidth',\n  'borderRightWidth',\n  'borderBottomWidth',\n  'borderLeftWidth',\n  'paddingTop',\n  'paddingRight',\n  'paddingBottom',\n  'paddingLeft',\n  'fontStyle',\n  'fontVariant',\n  'fontWeight',\n  'fontStretch',\n  'fontSize',\n  'fontSizeAdjust',\n  'lineHeight',\n  'fontFamily',\n  'textAlign',\n  'textTransform',\n  'textIndent',\n  'textDecoration',\n  'letterSpacing',\n  'wordSpacing',\n  'tabSize',\n  'whiteSpace',\n  'wordWrap',\n];\n\n/**\n * Compute the viewport coordinates of a textarea / input caret at a given\n * `position`. Uses the \"mirror div\" technique — a hidden div with the\n * same styling holds the text up to the caret, and we read the bounding\n * rect of a probe span placed at the boundary.\n *\n * Returns viewport-relative `{ top, left }` — pass straight to a CDK\n * Overlay anchored at that point.\n */\nexport function getCaretCoordinates(\n  input: HTMLTextAreaElement | HTMLInputElement,\n  position: number\n): { top: number; left: number; lineHeight: number } {\n  const doc = input.ownerDocument;\n  const style = getComputedStyle(input);\n  const mirror = doc.createElement('div');\n\n  for (const prop of MIRROR_PROPS) {\n    // @ts-expect-error — assigning across CSSStyleDeclaration keys.\n    mirror.style[prop] = style[prop];\n  }\n  mirror.style.position = 'absolute';\n  mirror.style.visibility = 'hidden';\n  mirror.style.top = '0';\n  mirror.style.left = '0';\n  mirror.style.whiteSpace = 'pre-wrap';\n  mirror.style.wordWrap = 'break-word';\n\n  // <input> is single-line — force whitespace behaviour so coords are sane.\n  if (input.tagName === 'INPUT') {\n    mirror.style.whiteSpace = 'pre';\n    mirror.style.height = 'auto';\n    mirror.style.width = 'auto';\n    mirror.style.overflow = 'hidden';\n  }\n\n  const before = input.value.substring(0, position);\n  mirror.textContent = before;\n\n  const probe = doc.createElement('span');\n  // Single character so the span has measurable size even at the end.\n  probe.textContent = input.value.substring(position) || '.';\n  mirror.appendChild(probe);\n\n  doc.body.appendChild(mirror);\n  const probeRect = probe.getBoundingClientRect();\n  const mirrorRect = mirror.getBoundingClientRect();\n  const lineHeight = parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.2;\n  doc.body.removeChild(mirror);\n\n  const inputRect = input.getBoundingClientRect();\n  return {\n    top: inputRect.top + (probeRect.top - mirrorRect.top) - input.scrollTop,\n    left: inputRect.left + (probeRect.left - mirrorRect.left) - input.scrollLeft,\n    lineHeight,\n  };\n}\n","/**\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 { Component, ViewEncapsulation, input, output } from '@angular/core';\n\nimport type { WrMentionItem } from './interfaces';\n\n/**\n * Overlay panel rendered by {@link WrMention}. Not intended for\n * direct use — the directive instantiates it via a ComponentPortal.\n */\n@Component({\n  selector: 'wr-mention-panel',\n  templateUrl: './mention-panel.html',\n  encapsulation: ViewEncapsulation.None,\n  host: { class: 'wr-mention-panel' },\n})\nexport class WrMentionPanel {\n  readonly items = input<readonly WrMentionItem[]>([]);\n  readonly activeIndex = input(0);\n  readonly displayWith = input<(item: WrMentionItem) => string>(item => item.label);\n\n  /** Emitted when the user picks an item (click). */\n  readonly picked = output<WrMentionItem>();\n\n  /** Emitted on mouseenter — used by the directive to track hover. */\n  readonly hovered = output<number>();\n\n  protected onPick(item: WrMentionItem, event: MouseEvent): void {\n    // mousedown semantics — keep focus on the input.\n    event.preventDefault();\n    this.picked.emit(item);\n  }\n}\n","@if (items().length === 0) {\n  <div class=\"wr-mention-panel__empty\">No matches</div>\n} @else {\n  <ul class=\"wr-mention-panel__list\" role=\"listbox\">\n    @for (item of items(); track $index) {\n      <li\n        class=\"wr-mention-panel__option\"\n        role=\"option\"\n        [class.wr-mention-panel__option--active]=\"$index === activeIndex()\"\n        [attr.aria-selected]=\"$index === activeIndex()\"\n        (mouseenter)=\"hovered.emit($index)\"\n        (mousedown)=\"onPick(item, $event)\"\n      >\n        {{ displayWith()(item) }}\n      </li>\n    }\n  </ul>\n}\n","/**\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 { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { type ComponentRef, DestroyRef, Directive, ElementRef, inject, input, output, signal } from '@angular/core';\n\nimport { WR_OVERLAY } from 'ngwr/overlay';\n\nimport { getCaretCoordinates } from './caret';\nimport type { WrMentionCommit, WrMentionItem } from './interfaces';\nimport { WrMentionPanel } from './mention-panel';\n\ninterface ActiveState {\n  trigger: string;\n  query: string;\n  startIndex: number;\n}\n\n/**\n * `@`-style mention picker for `<textarea>` and `<input>`. Listens for\n * trigger characters (default `'@'`); when typed at a word boundary, an\n * overlay panel opens at the caret and shows filtered options. Pick with\n * Enter / Tab / click — the trigger + query is replaced with the inserted\n * value plus a trailing space.\n *\n * @example\n * ```html\n * <textarea\n *   wrMention\n *   [wrMentionItems]=\"users\"\n *   [displayWith]=\"userLabel\"\n *   (wrMentionSelected)=\"onMention($event)\"\n * ></textarea>\n * ```\n *\n * @see https://ngwr.dev/components/mention\n */\n@Directive({\n  selector: '[wrMention]',\n  host: {\n    '(input)': 'onInput()',\n    '(click)': 'onClick()',\n    '(keyup)': 'onCaretMove($event)',\n    '(keydown)': 'onKeydown($event)',\n    '(blur)': 'onBlur()',\n  },\n})\nexport class WrMention<T extends WrMentionItem = WrMentionItem> {\n  /** Items to filter against the typed query. */\n  readonly wrMentionItems = input<readonly T[]>([]);\n\n  /** Trigger characters that open the panel. @default ['@'] */\n  readonly triggers = input<readonly string[]>(['@']);\n\n  /** Maps an item to its display label. @default `item.label` */\n  readonly displayWith = input<(item: T) => string>((item: T) => item.label);\n\n  /**\n   * Returns the text to insert into the textarea on commit. Receives the\n   * picked item and the trigger char. @default `${trigger}${displayWith(item)}`\n   */\n  readonly valueWith = input<((item: T, trigger: string) => string) | null>(null);\n\n  /** Custom filter. @default case-insensitive `includes` over `displayWith(item)`. */\n  readonly filterWith = input<((query: string, item: T) => boolean) | null>(null);\n\n  /** Maximum number of items shown in the panel. @default 8 */\n  readonly maxResults = input(8, { transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 8)) });\n\n  /** Emits the selected item, trigger, and query whenever the user commits. */\n  readonly wrMentionSelected = output<WrMentionCommit<T>>();\n\n  private readonly host = inject<ElementRef<HTMLTextAreaElement | HTMLInputElement>>(ElementRef);\n  private readonly overlay = inject(WR_OVERLAY);\n  private readonly scrollStrategies = inject(ScrollStrategyOptions);\n  private readonly destroyRef = inject(DestroyRef);\n\n  private overlayRef: OverlayRef | null = null;\n  private panelRef: ComponentRef<WrMentionPanel> | null = null;\n  private state: ActiveState | null = null;\n  private readonly activeIndex = signal(0);\n  private readonly filteredItems = signal<readonly T[]>([]);\n\n  constructor() {\n    this.destroyRef.onDestroy(() => this.close());\n  }\n\n  // Host listeners\n\n  /** @internal */\n  protected onInput(): void {\n    this.detect();\n  }\n\n  /** @internal */\n  protected onClick(): void {\n    this.detect();\n  }\n\n  /** @internal */\n  protected onCaretMove(event: KeyboardEvent): void {\n    if (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'Enter' || event.key === 'Tab') return;\n    this.detect();\n  }\n\n  /** @internal */\n  protected onKeydown(event: KeyboardEvent): void {\n    if (!this.state) return;\n    const list = this.filteredItems();\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        if (list.length > 0) this.setActive((this.activeIndex() + 1) % list.length);\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        if (list.length > 0) this.setActive((this.activeIndex() - 1 + list.length) % list.length);\n        break;\n      case 'Enter':\n      case 'Tab': {\n        const item = list[this.activeIndex()];\n        if (item) {\n          event.preventDefault();\n          this.commit(item);\n        }\n        break;\n      }\n      case 'Escape':\n        event.preventDefault();\n        this.close();\n        break;\n      default:\n        break;\n    }\n  }\n\n  /** @internal */\n  protected onBlur(): void {\n    // Defer so option mousedown lands first.\n    setTimeout(() => this.close(), 120);\n  }\n\n  // Detection\n\n  private detect(): void {\n    const el = this.host.nativeElement;\n    const caret = el.selectionStart ?? 0;\n    const text = el.value.substring(0, caret);\n    const triggers = this.triggers();\n\n    // Walk back from the caret looking for a trigger char with whitespace\n    // (or start-of-string) immediately before it. Stop on whitespace.\n    let i = caret;\n    while (i > 0) {\n      const ch = text[i - 1];\n      if (triggers.includes(ch)) {\n        const before = i - 2 >= 0 ? text[i - 2] : '';\n        if (i - 2 < 0 || /\\s/.test(before)) {\n          const query = text.substring(i);\n          this.activate(ch, query, i - 1);\n          return;\n        }\n        break;\n      }\n      if (/\\s/.test(ch)) break;\n      i--;\n    }\n    this.close();\n  }\n\n  private activate(trigger: string, query: string, startIndex: number): void {\n    this.state = { trigger, query, startIndex };\n    const filtered = this.filter(query).slice(0, this.maxResults());\n    this.filteredItems.set(filtered);\n    if (filtered.length === 0) {\n      this.close();\n      return;\n    }\n    this.setActive(Math.min(this.activeIndex(), filtered.length - 1));\n    this.open();\n  }\n\n  private filter(query: string): readonly T[] {\n    const items = this.wrMentionItems();\n    const custom = this.filterWith();\n    const display = this.displayWith();\n    if (!query) return items;\n    if (custom) return items.filter(item => custom(query, item));\n    const q = query.toLowerCase();\n    return items.filter(item => display(item).toLowerCase().includes(q));\n  }\n\n  private setActive(i: number): void {\n    this.activeIndex.set(i);\n    this.panelRef?.setInput('activeIndex', i);\n  }\n\n  // Overlay\n\n  private open(): void {\n    const el = this.host.nativeElement;\n    const caret = el.selectionStart ?? 0;\n    const { top, left, lineHeight } = getCaretCoordinates(el, caret);\n    const x = left;\n    const y = top + lineHeight + 4;\n\n    if (!this.overlayRef) {\n      this.overlayRef = this.overlay.create({\n        positionStrategy: this.overlay.position().global().left(`${x}px`).top(`${y}px`),\n        scrollStrategy: this.scrollStrategies.reposition(),\n        panelClass: 'wr-mention-overlay',\n      });\n\n      const portal = new ComponentPortal(WrMentionPanel);\n      const ref = this.overlayRef.attach(portal);\n      this.panelRef = ref;\n      ref.setInput('displayWith', this.displayWith());\n      ref.instance.picked.subscribe(item => this.commit(item as T));\n      ref.instance.hovered.subscribe(i => this.setActive(i));\n    } else {\n      this.overlayRef.updatePositionStrategy(this.overlay.position().global().left(`${x}px`).top(`${y}px`));\n    }\n\n    this.panelRef?.setInput('items', this.filteredItems());\n    this.panelRef?.setInput('activeIndex', this.activeIndex());\n  }\n\n  private close(): void {\n    if (this.overlayRef) {\n      this.overlayRef.dispose();\n      this.overlayRef = null;\n      this.panelRef = null;\n    }\n    this.state = null;\n    this.activeIndex.set(0);\n    this.filteredItems.set([]);\n  }\n\n  private commit(item: T): void {\n    if (!this.state) return;\n    const el = this.host.nativeElement;\n    const value = el.value;\n    const caret = el.selectionStart ?? value.length;\n    const valueFn = this.valueWith();\n    const inserted = valueFn ? valueFn(item, this.state.trigger) : `${this.state.trigger}${this.displayWith()(item)}`;\n    const replacement = `${inserted} `;\n    const before = value.substring(0, this.state.startIndex);\n    const after = value.substring(caret);\n    const next = before + replacement + after;\n    el.value = next;\n    el.dispatchEvent(new Event('input', { bubbles: true }));\n    const nextCaret = (before + replacement).length;\n    el.setSelectionRange(nextCaret, nextCaret);\n    this.wrMentionSelected.emit({ item, trigger: this.state.trigger, query: this.state.query });\n    this.close();\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}