{"version":3,"sources":["../src/components/InputTag/InputTag.tsx","../src/components/InputTag/adapters.ts"],"names":["useMemo","useState","useRef","cfg","useEffect","useLayoutEffect","useCallback","jsxs","jsx","el","range"],"mappings":"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","file":"chunk-VNDOT3NK.cjs","sourcesContent":["import {\n  type CSSProperties,\n  type ReactNode,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\n\n/**\n * InputTag — attach a `/`-style or `@`-style autocomplete picker to *any*\n * text surface (a `<textarea>`, an `<input>`, a `contenteditable`, a code\n * editor, a sheet cell editor, a whiteboard sticky note…) via an adapter\n * that abstracts the surface's read/write/caret API.\n *\n * The component is \"headless\" in the sense that it has no input of its\n * own — it floats a small picker menu near the surface and writes back\n * through the adapter when the user picks an item.\n *\n *   <textarea ref={ref} value={text} onChange={...} />\n *   <InputTag\n *     adapter={textareaAdapter(ref)}\n *     triggers={{\n *       \"/\": { items: commands, insert: (c) => `${c.name} ` },\n *       \"@\": { items: mentions, insert: (m) => `@${m.name} ` },\n *     }}\n *   />\n *\n * For non-DOM surfaces, write a small adapter that conforms to\n * {@link InputTagAdapter}. Adapters typically run 20–40 lines.\n */\n\n/** What the surface tells the picker on every text/caret change. */\nexport type InputTagAdapterState = {\n  text: string;\n  caretIndex: number;\n};\n\n/**\n * The contract every input surface implements. The picker subscribes to\n * state changes, anchors itself using `getAnchorRect`, intercepts\n * navigation keys via `onKey`, and writes the selected item back through\n * `replaceRange`.\n */\nexport type InputTagAdapter = {\n  /** Push current state whenever text or caret changes. Returns an unsubscribe. */\n  subscribe: (fn: (state: InputTagAdapterState) => void) => () => void;\n  /** Replace text in `[start, end)` with `replacement`. The adapter is\n   *  responsible for moving the caret to the end of the inserted text. */\n  replaceRange: (start: number, end: number, replacement: string) => void;\n  /** Screen-space rect to anchor the picker against. Usually the surface's\n   *  bounding rect; for editors that can compute caret-precise coordinates,\n   *  return a small rect there instead. */\n  getAnchorRect: () => DOMRect | null;\n  /** Subscribe to keydown events on the surface. The handler may return\n   *  `true` to consume the event (the adapter then calls\n   *  `preventDefault` / `stopPropagation`). Returns an unsubscribe. */\n  onKey: (handler: (e: KeyboardEvent) => boolean) => () => void;\n};\n\n/**\n * Per-trigger configuration. `T` is the item shape — typically a\n * `{ id, name, ... }` object, but any shape works as long as `keyOf` /\n * `insert` know how to handle it.\n */\nexport type InputTagTrigger<T> = {\n  /** The pool the picker filters against. */\n  items: T[];\n  /** Text inserted in place of `<triggerChar><query>`. */\n  insert: (item: T, query: string) => string;\n  /** Custom filter. Default: case-insensitive prefix match against\n   *  `String(keyOf(item))`. Pass `() => true` to disable filtering and\n   *  rely on `items` being pre-filtered (e.g. from an async source). */\n  filter?: (item: T, query: string) => boolean;\n  /** How to render each row. Default renders the result of `keyOf(item)`. */\n  render?: (item: T, active: boolean) => ReactNode;\n  /** How to derive a stable key + default label for each item. Default\n   *  reads `item.name` then `item.id` then `String(item)`. */\n  keyOf?: (item: T) => string;\n  /** Optional header label shown above the list. */\n  label?: string;\n};\n\nexport type InputTagTriggers = Record<string, InputTagTrigger<any>>;\n\nexport interface InputTagProps {\n  adapter: InputTagAdapter;\n  triggers: InputTagTriggers;\n  /** Max rows shown. Default 8. */\n  maxItems?: number;\n  /** Where the picker anchors relative to the surface. Default `\"bottom-left\"`. */\n  placement?: \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n  /** Custom class for the popover container. */\n  className?: string;\n  /** Inline style for the popover container. */\n  style?: CSSProperties;\n  /** Fires whenever an item is picked. */\n  onPick?: (info: { triggerChar: string; query: string; item: unknown }) => void;\n};\n\ntype ActiveTrigger = {\n  char: string;\n  start: number;\n  end: number;\n  query: string;\n};\n\nfunction defaultKeyOf(item: unknown): string {\n  if (item && typeof item === \"object\") {\n    const r = item as Record<string, unknown>;\n    if (typeof r.name === \"string\") return r.name;\n    if (typeof r.id === \"string\") return r.id;\n  }\n  return String(item);\n}\n\nfunction defaultFilter(item: unknown, query: string): boolean {\n  if (!query) return true;\n  return defaultKeyOf(item).toLowerCase().includes(query.toLowerCase());\n}\n\n/**\n * Walk back from `caret` to detect an active trigger. A trigger is active\n * when one of the configured characters appears between `caret` and the\n * nearest preceding whitespace (or start-of-text), with no other\n * non-trigger-non-whitespace breaks. The \"query\" is everything after\n * the trigger up to the caret.\n */\nfunction detectTrigger(\n  text: string,\n  caret: number,\n  triggerChars: Set<string>,\n): ActiveTrigger | null {\n  for (let i = caret - 1; i >= 0; i--) {\n    const ch = text[i];\n    if (ch === undefined) break;\n    if (triggerChars.has(ch)) {\n      // Must be at a word boundary: start of text OR preceded by whitespace.\n      if (i === 0 || /\\s/.test(text[i - 1])) {\n        return {\n          char: ch,\n          start: i,\n          end: caret,\n          query: text.slice(i + 1, caret),\n        };\n      }\n      return null;\n    }\n    if (/\\s/.test(ch)) return null;\n  }\n  return null;\n}\n\nexport function InputTag({\n  adapter,\n  triggers,\n  maxItems = 8,\n  placement = \"bottom-left\",\n  className,\n  style,\n  onPick,\n}: InputTagProps) {\n  const triggerChars = useMemo(() => new Set(Object.keys(triggers)), [triggers]);\n  const [active, setActive] = useState<ActiveTrigger | null>(null);\n  const [cursor, setCursor] = useState(0);\n  const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n\n  // Latest state in refs so key handlers see fresh data without re-registering.\n  const stateRef = useRef<InputTagAdapterState>({ text: \"\", caretIndex: 0 });\n  const activeRef = useRef<ActiveTrigger | null>(null);\n  const cursorRef = useRef(0);\n  activeRef.current = active;\n  cursorRef.current = cursor;\n\n  // Filtered items for the active trigger.\n  const items: unknown[] = useMemo(() => {\n    if (!active) return [];\n    const cfg = triggers[active.char];\n    if (!cfg) return [];\n    const filter = cfg.filter ?? defaultFilter;\n    const out: unknown[] = [];\n    for (const item of cfg.items) {\n      if (filter(item, active.query)) out.push(item);\n      if (out.length >= maxItems) break;\n    }\n    return out;\n  }, [active, triggers, maxItems]);\n\n  // Subscribe to text/caret changes.\n  useEffect(() => {\n    return adapter.subscribe((s) => {\n      stateRef.current = s;\n      const next = detectTrigger(s.text, s.caretIndex, triggerChars);\n      setActive((prev) => {\n        // Reset cursor when the trigger char or position changes.\n        if (!prev || !next || prev.char !== next.char || prev.start !== next.start) {\n          setCursor(0);\n        }\n        return next;\n      });\n      if (next) setAnchorRect(adapter.getAnchorRect());\n    });\n  }, [adapter, triggerChars]);\n\n  // Refresh anchor rect on scroll/resize while picker is open.\n  useLayoutEffect(() => {\n    if (!active) return;\n    const update = () => setAnchorRect(adapter.getAnchorRect());\n    update();\n    window.addEventListener(\"scroll\", update, true);\n    window.addEventListener(\"resize\", update);\n    return () => {\n      window.removeEventListener(\"scroll\", update, true);\n      window.removeEventListener(\"resize\", update);\n    };\n  }, [active, adapter]);\n\n  // Clamp cursor when the visible items shrink.\n  useEffect(() => {\n    if (cursor >= items.length) setCursor(Math.max(0, items.length - 1));\n  }, [items.length, cursor]);\n\n  const pickItem = useCallback(\n    (item: unknown) => {\n      const cur = activeRef.current;\n      if (!cur) return;\n      const cfg = triggers[cur.char];\n      if (!cfg) return;\n      const replacement = cfg.insert(item, cur.query);\n      adapter.replaceRange(cur.start, cur.end, replacement);\n      onPick?.({ triggerChar: cur.char, query: cur.query, item });\n      setActive(null);\n    },\n    [adapter, triggers, onPick],\n  );\n\n  // Key handling.\n  useEffect(() => {\n    return adapter.onKey((e) => {\n      const cur = activeRef.current;\n      if (!cur) return false;\n      const visible = items;\n      switch (e.key) {\n        case \"ArrowDown\":\n          if (visible.length === 0) return false;\n          setCursor((c) => (c + 1) % visible.length);\n          return true;\n        case \"ArrowUp\":\n          if (visible.length === 0) return false;\n          setCursor((c) => (c - 1 + visible.length) % visible.length);\n          return true;\n        case \"Enter\":\n        case \"Tab\": {\n          if (visible.length === 0) return false;\n          const idx = Math.min(cursorRef.current, visible.length - 1);\n          pickItem(visible[idx]);\n          return true;\n        }\n        case \"Escape\":\n          setActive(null);\n          return true;\n        default:\n          return false;\n      }\n    });\n  }, [adapter, items, pickItem]);\n\n  if (!active || !anchorRect || items.length === 0) return null;\n\n  const cfg = triggers[active.char];\n  if (!cfg) return null;\n\n  const popStyle = computePopoverStyle(anchorRect, placement);\n\n  return (\n    <div\n      role=\"listbox\"\n      aria-label={cfg.label ?? `Pick a ${active.char === \"/\" ? \"command\" : \"mention\"}`}\n      className={[\n        \"fixed z-50 w-72 overflow-hidden rounded-md border border-zinc-200 bg-white shadow-lg dark:border-zinc-700 dark:bg-zinc-900\",\n        className ?? \"\",\n      ]\n        .filter(Boolean)\n        .join(\" \")}\n      style={{ ...popStyle, ...style }}\n    >\n      {(cfg.label || active.query) && (\n        <div className=\"flex items-center justify-between border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-500 dark:border-zinc-800 dark:bg-zinc-950\">\n          <span>{cfg.label ?? labelForChar(active.char)}</span>\n          {active.query && (\n            <span className=\"font-mono text-[10px] normal-case tracking-normal text-zinc-400\">\n              {active.char}\n              {active.query}\n            </span>\n          )}\n        </div>\n      )}\n      <ul className=\"max-h-60 overflow-y-auto\">\n        {items.map((item, i) => {\n          const renderer = cfg.render ?? ((it: unknown) => <span>{defaultKeyOf(it)}</span>);\n          const active2 = i === cursor;\n          const key = (cfg.keyOf ?? defaultKeyOf)(item);\n          return (\n            <li\n              key={key}\n              role=\"option\"\n              aria-selected={active2}\n              onMouseDown={(e) => {\n                e.preventDefault();\n                pickItem(item);\n              }}\n              onMouseEnter={() => setCursor(i)}\n              className={[\n                \"cursor-pointer px-2 py-1.5 text-[12px]\",\n                active2\n                  ? \"bg-violet-100 dark:bg-violet-900/30\"\n                  : \"hover:bg-zinc-50 dark:hover:bg-zinc-800\",\n              ].join(\" \")}\n            >\n              {renderer(item, active2)}\n            </li>\n          );\n        })}\n      </ul>\n    </div>\n  );\n}\n\nfunction labelForChar(ch: string): string {\n  if (ch === \"/\") return \"Commands\";\n  if (ch === \"@\") return \"Mentions\";\n  if (ch === \"#\") return \"Tags\";\n  if (ch === \":\") return \"Emoji\";\n  return `Trigger ${ch}`;\n}\n\nfunction computePopoverStyle(\n  anchor: DOMRect,\n  placement: NonNullable<InputTagProps[\"placement\"]>,\n): CSSProperties {\n  const offset = 4;\n  switch (placement) {\n    case \"bottom-right\":\n      return { top: anchor.bottom + offset, right: window.innerWidth - anchor.right };\n    case \"top-left\":\n      return { bottom: window.innerHeight - anchor.top + offset, left: anchor.left };\n    case \"top-right\":\n      return { bottom: window.innerHeight - anchor.top + offset, right: window.innerWidth - anchor.right };\n    case \"bottom-left\":\n    default:\n      return { top: anchor.bottom + offset, left: anchor.left };\n  }\n}\n","import type { RefObject } from \"react\";\nimport type { InputTagAdapter } from \"./InputTag\";\n\n/**\n * Built-in DOM adapters. Each one wraps a familiar input element and\n * exposes the {@link InputTagAdapter} contract so `<InputTag>` can\n * attach to it. For non-DOM surfaces (code editor, sheet cell editor,\n * whiteboard sticky note), write your own — the contract is small.\n */\n\n/**\n * Get React's monkey-patched-aside native value setter on a DOM\n * element. Required when programmatically updating `value` on a\n * controlled input: React's intercepted setter would otherwise swallow\n * the change and the consumer's `onChange` would never fire.\n */\nfunction nativeValueSetter(el: HTMLInputElement | HTMLTextAreaElement): ((v: string) => void) | null {\n  const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n  const desc = Object.getOwnPropertyDescriptor(proto, \"value\");\n  if (!desc?.set) return null;\n  return desc.set.bind(el);\n}\n\nfunction replaceInValueElement(\n  el: HTMLInputElement | HTMLTextAreaElement,\n  start: number,\n  end: number,\n  replacement: string,\n): void {\n  const current = el.value;\n  const next = current.slice(0, start) + replacement + current.slice(end);\n  const setter = nativeValueSetter(el);\n  if (setter) {\n    setter(next);\n  } else {\n    el.value = next;\n  }\n  // Dispatch a native `input` event so any controlled-component\n  // onChange handler upstream gets the new value.\n  el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n  // Place caret at the end of the inserted text.\n  const caret = start + replacement.length;\n  el.setSelectionRange(caret, caret);\n  el.focus();\n}\n\nfunction valueElementAdapter(\n  ref: RefObject<HTMLTextAreaElement | HTMLInputElement | null>,\n): InputTagAdapter {\n  return {\n    subscribe(fn) {\n      const handler = () => {\n        const el = ref.current;\n        if (!el) return;\n        fn({\n          text: el.value,\n          caretIndex: el.selectionStart ?? el.value.length,\n        });\n      };\n      const el = ref.current;\n      if (el) {\n        el.addEventListener(\"input\", handler);\n        el.addEventListener(\"click\", handler);\n        el.addEventListener(\"keyup\", handler);\n        el.addEventListener(\"focus\", handler);\n      }\n      return () => {\n        const el2 = ref.current;\n        if (el2) {\n          el2.removeEventListener(\"input\", handler);\n          el2.removeEventListener(\"click\", handler);\n          el2.removeEventListener(\"keyup\", handler);\n          el2.removeEventListener(\"focus\", handler);\n        }\n      };\n    },\n    replaceRange(start, end, replacement) {\n      const el = ref.current;\n      if (!el) return;\n      replaceInValueElement(el, start, end, replacement);\n    },\n    getAnchorRect() {\n      const el = ref.current;\n      return el ? el.getBoundingClientRect() : null;\n    },\n    onKey(handler) {\n      const fn = (e: KeyboardEvent) => {\n        if (handler(e)) {\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      };\n      const el = ref.current;\n      if (el) el.addEventListener(\"keydown\", fn as EventListener);\n      return () => {\n        const el2 = ref.current;\n        if (el2) el2.removeEventListener(\"keydown\", fn as EventListener);\n      };\n    },\n  };\n}\n\n/**\n * Adapter for a DOM `<textarea>`. Works whether the consumer manages\n * `value` via React state (controlled) or lets the DOM hold it\n * (uncontrolled) — `replaceRange` uses React's native value setter and\n * dispatches a native `input` event so the upstream onChange fires.\n */\nexport function textareaAdapter(\n  ref: RefObject<HTMLTextAreaElement | null>,\n): InputTagAdapter {\n  return valueElementAdapter(ref);\n}\n\n/** Adapter for a DOM `<input type=\"text|search|...\">`. */\nexport function inputAdapter(\n  ref: RefObject<HTMLInputElement | null>,\n): InputTagAdapter {\n  return valueElementAdapter(ref);\n}\n\n/**\n * Adapter for any `contenteditable` element. Operates on the element's\n * `textContent`; rich-text editors with their own internal model should\n * write a custom adapter that talks to that model instead.\n */\nexport function contentEditableAdapter(\n  ref: RefObject<HTMLElement | null>,\n): InputTagAdapter {\n  function caretIndex(el: HTMLElement): number {\n    const sel = window.getSelection();\n    if (!sel || sel.rangeCount === 0) return 0;\n    const range = sel.getRangeAt(0).cloneRange();\n    range.selectNodeContents(el);\n    range.setEnd(sel.focusNode!, sel.focusOffset);\n    return range.toString().length;\n  }\n  function setCaret(el: HTMLElement, index: number): void {\n    const sel = window.getSelection();\n    if (!sel) return;\n    const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n    let remaining = index;\n    let node: Node | null = walker.nextNode();\n    while (node) {\n      const len = (node.textContent ?? \"\").length;\n      if (remaining <= len) {\n        const range = document.createRange();\n        range.setStart(node, remaining);\n        range.collapse(true);\n        sel.removeAllRanges();\n        sel.addRange(range);\n        return;\n      }\n      remaining -= len;\n      node = walker.nextNode();\n    }\n    // Past end: place at end.\n    const range = document.createRange();\n    range.selectNodeContents(el);\n    range.collapse(false);\n    sel.removeAllRanges();\n    sel.addRange(range);\n  }\n  return {\n    subscribe(fn) {\n      const handler = () => {\n        const el = ref.current;\n        if (!el) return;\n        fn({ text: el.textContent ?? \"\", caretIndex: caretIndex(el) });\n      };\n      const el = ref.current;\n      if (el) {\n        el.addEventListener(\"input\", handler);\n        el.addEventListener(\"click\", handler);\n        el.addEventListener(\"keyup\", handler);\n        el.addEventListener(\"focus\", handler);\n      }\n      return () => {\n        const el2 = ref.current;\n        if (el2) {\n          el2.removeEventListener(\"input\", handler);\n          el2.removeEventListener(\"click\", handler);\n          el2.removeEventListener(\"keyup\", handler);\n          el2.removeEventListener(\"focus\", handler);\n        }\n      };\n    },\n    replaceRange(start, end, replacement) {\n      const el = ref.current;\n      if (!el) return;\n      const current = el.textContent ?? \"\";\n      const next = current.slice(0, start) + replacement + current.slice(end);\n      el.textContent = next;\n      setCaret(el, start + replacement.length);\n      el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n      el.focus();\n    },\n    getAnchorRect() {\n      const el = ref.current;\n      return el ? el.getBoundingClientRect() : null;\n    },\n    onKey(handler) {\n      const fn = (e: KeyboardEvent) => {\n        if (handler(e)) {\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      };\n      const el = ref.current;\n      if (el) el.addEventListener(\"keydown\", fn as EventListener);\n      return () => {\n        const el2 = ref.current;\n        if (el2) el2.removeEventListener(\"keydown\", fn as EventListener);\n      };\n    },\n  };\n}\n\n/**\n * Adapter for hosts that fully control the text state themselves. Use\n * this when you can't (or don't want to) let the DOM be the source of\n * truth — for code editors with internal state, sheet cell editors, or\n * any host that already has `value` + `onChange` and wants to reach the\n * picker programmatically.\n *\n * The host calls `notify({ text, caretIndex })` after every text or\n * caret change. `<InputTag>` calls `onReplaceRange` to write back.\n */\nexport type ControlledAdapterHandle = InputTagAdapter & {\n  /** Push the latest text + caret to the picker. */\n  notify: (state: { text: string; caretIndex: number }) => void;\n};\n\nexport function controlledAdapter(opts: {\n  /** Element used as anchor + key target. Usually the visible input. */\n  anchorRef: RefObject<HTMLElement | null>;\n  /** Called when the picker writes back an insertion. */\n  onReplaceRange: (start: number, end: number, replacement: string) => void;\n}): ControlledAdapterHandle {\n  let listener: ((s: { text: string; caretIndex: number }) => void) | null = null;\n  let keyHandler: ((e: KeyboardEvent) => boolean) | null = null;\n\n  const installKey = () => {\n    const el = opts.anchorRef.current;\n    if (!el || !keyHandler) return () => {};\n    const fn = (e: KeyboardEvent) => {\n      if (keyHandler && keyHandler(e)) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n    };\n    el.addEventListener(\"keydown\", fn);\n    return () => el.removeEventListener(\"keydown\", fn);\n  };\n\n  return {\n    notify(state) {\n      listener?.(state);\n    },\n    subscribe(fn) {\n      listener = fn;\n      return () => {\n        if (listener === fn) listener = null;\n      };\n    },\n    replaceRange(start, end, replacement) {\n      opts.onReplaceRange(start, end, replacement);\n    },\n    getAnchorRect() {\n      const el = opts.anchorRef.current;\n      return el ? el.getBoundingClientRect() : null;\n    },\n    onKey(handler) {\n      keyHandler = handler;\n      const uninstall = installKey();\n      return () => {\n        if (keyHandler === handler) keyHandler = null;\n        uninstall();\n      };\n    },\n  };\n}\n"]}