prompt-area 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +120 -0
- package/dist/action-bar/index.d.ts +60 -0
- package/dist/action-bar/index.js +5 -0
- package/dist/action-bar/index.js.map +1 -0
- package/dist/chat-prompt-layout/index.d.ts +53 -0
- package/dist/chat-prompt-layout/index.js +5 -0
- package/dist/chat-prompt-layout/index.js.map +1 -0
- package/dist/chunk-ANZZEZP2.js +38 -0
- package/dist/chunk-ANZZEZP2.js.map +1 -0
- package/dist/chunk-BPJO4DGM.js +198 -0
- package/dist/chunk-BPJO4DGM.js.map +1 -0
- package/dist/chunk-BWVBDP7C.js +38 -0
- package/dist/chunk-BWVBDP7C.js.map +1 -0
- package/dist/chunk-E7HUXORB.js +2692 -0
- package/dist/chunk-E7HUXORB.js.map +1 -0
- package/dist/chunk-NF2LHZIE.js +12 -0
- package/dist/chunk-NF2LHZIE.js.map +1 -0
- package/dist/chunk-UBBCAMJA.js +116 -0
- package/dist/chunk-UBBCAMJA.js.map +1 -0
- package/dist/chunk-XDKRP7UE.js +125 -0
- package/dist/chunk-XDKRP7UE.js.map +1 -0
- package/dist/compact-prompt-area/index.d.ts +86 -0
- package/dist/compact-prompt-area/index.js +6 -0
- package/dist/compact-prompt-area/index.js.map +1 -0
- package/dist/helpers/index.d.ts +374 -0
- package/dist/helpers/index.js +291 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt-area/index.d.ts +327 -0
- package/dist/prompt-area/index.js +6 -0
- package/dist/prompt-area/index.js.map +1 -0
- package/dist/status-bar/index.d.ts +50 -0
- package/dist/status-bar/index.js +5 -0
- package/dist/status-bar/index.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/tailwind.css +181 -0
- package/dist/types-C4BgDEpe.d.ts +271 -0
- package/package.json +102 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/prompt-area/prompt-area-engine.ts","../src/prompt-area/prompt-area-list-ops.ts","../src/prompt-area/dom-helpers.ts","../src/prompt-area/cursor-helpers.ts","../src/prompt-area/clipboard-helpers.ts","../src/prompt-area/use-prompt-area-events.ts","../src/prompt-area/use-trigger-search.ts","../src/prompt-area/use-prompt-area.ts","../src/prompt-area/trigger-popover.tsx","../src/prompt-area/animated-placeholder.tsx","../src/prompt-area/remove-button.tsx","../src/prompt-area/image-strip.tsx","../src/prompt-area/file-strip.tsx","../src/prompt-area/prompt-area.tsx"],"names":["matchingTrigger","afterClosing","afterOpening","newSegments","range","useRef","useCallback","useState","editor","useEffect","segments","jsx","jsxs","useMemo"],"mappings":"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","file":"chunk-E7HUXORB.js","sourcesContent":["/**\n * Pure logic engine for the PromptArea component.\n * No DOM dependencies - fully testable in Node.\n */\nimport type { Segment, ChipSegment, TriggerConfig, TriggerPosition, ActiveTrigger } from './types'\n\n// ---------------------------------------------------------------------------\n// Serialization\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an array of segments to a plain text string.\n * Chips are represented as `{trigger}{displayText}` (e.g., \"@Alice\").\n */\nexport function segmentsToPlainText(segments: Segment[]): string {\n return segments\n .map((seg) => {\n if (seg.type === 'text') return seg.text\n return `${seg.trigger}${seg.displayText}`\n })\n .join('')\n}\n\n/**\n * Converts plain text into a single text segment.\n * Used for initial value conversion from plain strings.\n */\nexport function plainTextToSegments(text: string): Segment[] {\n if (!text) return []\n return [{ type: 'text', text }]\n}\n\n// ---------------------------------------------------------------------------\n// Trigger position validation\n// ---------------------------------------------------------------------------\n\n/**\n * Checks whether a trigger character at the given position in text\n * is valid according to the position rule.\n *\n * @param text - The full text content\n * @param charIndex - The index of the trigger character in the text\n * @param position - The position rule to validate against\n */\nexport function isValidTriggerPosition(\n text: string,\n charIndex: number,\n position: TriggerPosition,\n): boolean {\n if (charIndex === 0) return true\n\n const prevChar = text[charIndex - 1]\n\n if (position === 'start') {\n return prevChar === '\\n'\n }\n\n // position === 'any': valid after any whitespace\n return prevChar === ' ' || prevChar === '\\n' || prevChar === '\\t'\n}\n\n// ---------------------------------------------------------------------------\n// Trigger detection\n// ---------------------------------------------------------------------------\n\n/**\n * Scans backwards from the cursor position to detect if the user is\n * currently typing a trigger word.\n *\n * Returns the active trigger info, or null if no trigger is active.\n *\n * @param text - The full plain text content\n * @param cursorPos - The cursor position (character offset from start)\n * @param triggers - Available trigger configurations\n */\nexport function detectActiveTrigger(\n text: string,\n cursorPos: number,\n triggers: TriggerConfig[],\n): ActiveTrigger | null {\n if (!text || cursorPos === 0 || triggers.length === 0) return null\n\n // Scan backwards from cursor to find the nearest trigger character.\n // Stop at whitespace (trigger word has ended) or start of text.\n for (let i = cursorPos - 1; i >= 0; i--) {\n const char = text[i]\n\n // If we hit whitespace before finding a trigger, check if this whitespace\n // is immediately followed by a trigger character\n if (char === ' ' || char === '\\n' || char === '\\t') {\n // The character after this whitespace could be a trigger\n if (i + 1 < cursorPos) {\n const nextChar = text[i + 1]\n const matchingTrigger = triggers.find((t) => t.char === nextChar)\n if (matchingTrigger && isValidTriggerPosition(text, i + 1, matchingTrigger.position)) {\n return {\n config: matchingTrigger,\n startOffset: i + 1,\n query: text.slice(i + 2, cursorPos),\n }\n }\n }\n // No trigger found after this whitespace, stop searching\n return null\n }\n\n // Check if this character is a trigger character\n const matchingTrigger = triggers.find((t) => t.char === char)\n if (matchingTrigger && isValidTriggerPosition(text, i, matchingTrigger.position)) {\n return {\n config: matchingTrigger,\n startOffset: i,\n query: text.slice(i + 1, cursorPos),\n }\n }\n }\n\n return null\n}\n\n// ---------------------------------------------------------------------------\n// Chip resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves an active trigger into a chip within the segments array.\n * Replaces the trigger text (trigger char + query) with a chip segment.\n *\n * @param segments - Current document segments\n * @param activeTrigger - The active trigger to resolve\n * @param chip - The chip data (value, displayText, optional data)\n * @returns New segments array with the chip inserted, and the new cursor position\n */\nexport function resolveChip(\n segments: Segment[],\n activeTrigger: ActiveTrigger,\n chip: { value: string; displayText: string; data?: unknown; autoResolved?: boolean },\n): { segments: Segment[]; cursorOffset: number } {\n const triggerStart = activeTrigger.startOffset\n const triggerEnd = triggerStart + 1 + activeTrigger.query.length // +1 for trigger char\n\n // Build the new segments by mapping plain text positions back to segment boundaries\n const newSegments: Segment[] = []\n let offset = 0\n\n for (const seg of segments) {\n if (seg.type === 'chip') {\n const chipText = `${seg.trigger}${seg.displayText}`\n const chipStart = offset\n const chipEnd = offset + chipText.length\n\n // If the trigger range overlaps with this chip, something is wrong.\n // Chips should not be partially replaced.\n if (chipEnd <= triggerStart || chipStart >= triggerEnd) {\n newSegments.push(seg)\n }\n offset = chipEnd\n } else {\n const textStart = offset\n const textEnd = offset + seg.text.length\n\n if (textEnd <= triggerStart) {\n // Entirely before the trigger - keep as-is\n newSegments.push(seg)\n } else if (textStart >= triggerEnd) {\n // Entirely after the trigger - keep as-is\n newSegments.push(seg)\n } else {\n // This text segment contains (part of) the trigger range\n const beforeText = seg.text.slice(0, Math.max(0, triggerStart - textStart))\n const afterText = seg.text.slice(Math.min(seg.text.length, triggerEnd - textStart))\n\n if (beforeText) {\n newSegments.push({ type: 'text', text: beforeText })\n }\n\n const newChip: ChipSegment = {\n type: 'chip',\n trigger: activeTrigger.config.char,\n value: chip.value,\n displayText: chip.displayText,\n ...(chip.data !== undefined ? { data: chip.data } : {}),\n ...(chip.autoResolved ? { autoResolved: true } : {}),\n }\n newSegments.push(newChip)\n\n // Add trailing space after chip, then any remaining text\n if (afterText) {\n newSegments.push({ type: 'text', text: ' ' + afterText.replace(/^\\s/, '') })\n } else {\n newSegments.push({ type: 'text', text: ' ' })\n }\n }\n\n offset = textEnd\n }\n }\n\n // Merge adjacent text segments\n const merged = mergeAdjacentTextSegments(newSegments)\n\n // Cursor should be placed after the chip + trailing space.\n // Find the *last* matching chip so duplicates resolve correctly.\n let lastChipEndOffset = -1\n let runningOffset = 0\n for (const seg of merged) {\n if (seg.type === 'text') {\n runningOffset += seg.text.length\n } else {\n runningOffset += seg.trigger.length + seg.displayText.length\n if (\n seg.value === chip.value &&\n seg.displayText === chip.displayText &&\n seg.trigger === activeTrigger.config.char\n ) {\n lastChipEndOffset = runningOffset\n }\n }\n }\n // +1 accounts for the trailing space after the chip\n const cursorOffset = lastChipEndOffset === -1 ? runningOffset : lastChipEndOffset + 1\n\n return { segments: merged, cursorOffset }\n}\n\n// ---------------------------------------------------------------------------\n// Chip removal\n// ---------------------------------------------------------------------------\n\n/**\n * Removes a chip at the given segment index and merges adjacent text segments.\n *\n * @param segments - Current document segments\n * @param index - The segment index to remove\n * @returns New segments array with the chip removed\n */\nexport function removeChipAtIndex(segments: Segment[], index: number): Segment[] {\n if (index < 0 || index >= segments.length) return segments\n if (segments[index].type !== 'chip') return segments\n\n const result = [...segments.slice(0, index), ...segments.slice(index + 1)]\n return mergeAdjacentTextSegments(result)\n}\n\n/**\n * Reverts an auto-resolved chip at the given segment index back to plain text.\n * The text includes the trigger character + display text (e.g., \"#readme\").\n *\n * @param segments - Current document segments\n * @param index - The segment index to revert\n * @returns New segments with the chip replaced by text, or null if not applicable\n */\nexport function revertChipAtIndex(\n segments: Segment[],\n index: number,\n): { segments: Segment[]; revertedText: string } | null {\n if (index < 0 || index >= segments.length) return null\n const seg = segments[index]\n if (seg.type !== 'chip' || !seg.autoResolved) return null\n\n const revertedText = `${seg.trigger}${seg.displayText}`\n const result = [\n ...segments.slice(0, index),\n { type: 'text' as const, text: revertedText },\n ...segments.slice(index + 1),\n ]\n return { segments: mergeAdjacentTextSegments(result), revertedText }\n}\n\n// ---------------------------------------------------------------------------\n// Paste: resolve trigger patterns in segments\n// ---------------------------------------------------------------------------\n\n/**\n * Scans text segments for trigger patterns and auto-resolves them into chips.\n * Only resolves triggers that have `resolveOnSpace: true`.\n *\n * Trigger patterns must appear at word boundaries: start of text, after\n * whitespace, or after a newline. This avoids false positives like email\n * addresses (user@example.com).\n */\nexport function resolveTriggersInSegments(\n segments: Segment[],\n triggers: TriggerConfig[],\n): Segment[] {\n const autoResolveTriggers = triggers.filter((t) => t.resolveOnSpace)\n if (autoResolveTriggers.length === 0) return segments\n\n const triggerChars = new Set(autoResolveTriggers.map((t) => t.char))\n const result: Segment[] = []\n\n for (const seg of segments) {\n if (seg.type === 'chip') {\n result.push(seg)\n continue\n }\n\n const parts = splitTextByTriggerPatterns(seg.text, autoResolveTriggers, triggerChars)\n result.push(...parts)\n }\n\n return mergeAdjacentTextSegments(result)\n}\n\n/**\n * Splits a text string into text and chip segments based on trigger patterns.\n * A trigger pattern is: (start-of-string | whitespace) + trigger_char + word_chars\n * followed by whitespace or end-of-string.\n */\nfunction splitTextByTriggerPatterns(\n text: string,\n triggers: TriggerConfig[],\n triggerChars: Set<string>,\n): Segment[] {\n if (!text) return []\n\n const segments: Segment[] = []\n let i = 0\n\n while (i < text.length) {\n const char = text[i]\n\n if (triggerChars.has(char)) {\n const isAtBoundary =\n i === 0 || text[i - 1] === ' ' || text[i - 1] === '\\n' || text[i - 1] === '\\t'\n\n if (isAtBoundary) {\n const trigger = triggers.find((t) => t.char === char)\n if (trigger && isValidTriggerPosition(text, i, trigger.position)) {\n let end = i + 1\n while (\n end < text.length &&\n text[end] !== ' ' &&\n text[end] !== '\\n' &&\n text[end] !== '\\t'\n ) {\n end++\n }\n\n const query = text.slice(i + 1, end)\n if (query.length > 0) {\n // Treat both undefined and '' from onSelect as \"no custom label\"\n // and fall back to the query — an empty displayText would render\n // a blank chip.\n const displayText = trigger.onSelect?.({ value: query, label: query }) || query\n segments.push({\n type: 'chip',\n trigger: char,\n value: query,\n displayText,\n autoResolved: true,\n })\n i = end\n continue\n }\n }\n }\n }\n\n const start = i\n i++\n while (\n i < text.length &&\n !(\n triggerChars.has(text[i]) &&\n (text[i - 1] === ' ' || text[i - 1] === '\\n' || text[i - 1] === '\\t')\n )\n ) {\n i++\n }\n segments.push({ type: 'text', text: text.slice(start, i) })\n }\n\n return segments\n}\n\n// ---------------------------------------------------------------------------\n// Text range replacement\n// ---------------------------------------------------------------------------\n\n/**\n * Replaces a range of plain text within the segments array.\n * Handles segment boundaries correctly, preserving chip segments.\n *\n * @param segments - Current document segments\n * @param start - Start offset in plain text\n * @param end - End offset in plain text\n * @param replacement - The replacement text\n * @returns New segments array with the replacement applied\n */\nexport function replaceTextRange(\n segments: Segment[],\n start: number,\n end: number,\n replacement: string,\n): Segment[] {\n const newSegments: Segment[] = []\n let offset = 0\n let inserted = false\n\n for (const seg of segments) {\n if (seg.type === 'chip') {\n const chipText = `${seg.trigger}${seg.displayText}`\n const chipStart = offset\n const chipEnd = offset + chipText.length\n\n // For insertion (start === end), insert before this chip if position matches\n if (!inserted && start === end && chipStart === start) {\n newSegments.push({ type: 'text', text: replacement })\n inserted = true\n }\n\n if (chipEnd <= start || chipStart >= end) {\n newSegments.push(seg)\n }\n // Chips within the range are removed\n offset = chipEnd\n } else {\n const textStart = offset\n const textEnd = offset + seg.text.length\n\n // Check if this segment contains the insertion/replacement point\n const isBefore = start === end ? textEnd < start : textEnd <= start\n const isAfter = start === end ? textStart > end : textStart >= end\n\n if (isBefore) {\n // Entirely before the range\n newSegments.push(seg)\n } else if (isAfter) {\n // Entirely after the range\n newSegments.push(seg)\n } else {\n // Overlaps with the range (or contains the insertion point)\n const beforeText = seg.text.slice(0, Math.max(0, start - textStart))\n const afterText = seg.text.slice(Math.min(seg.text.length, end - textStart))\n\n if (beforeText) {\n newSegments.push({ type: 'text', text: beforeText })\n }\n // Insert replacement only once (when we first enter the range)\n if (!inserted && textStart <= start) {\n newSegments.push({ type: 'text', text: replacement })\n inserted = true\n }\n if (afterText) {\n newSegments.push({ type: 'text', text: afterText })\n }\n }\n\n offset = textEnd\n }\n }\n\n // Fallback: if replacement wasn't inserted (e.g., insertion at very end)\n if (!inserted && replacement) {\n newSegments.push({ type: 'text', text: replacement })\n }\n\n return mergeAdjacentTextSegments(newSegments)\n}\n\n// ---------------------------------------------------------------------------\n// Markdown formatting shortcuts\n// ---------------------------------------------------------------------------\n\n/**\n * Toggles markdown wrap markers around a selected text range.\n * If the selection is already wrapped with the marker, unwraps it.\n * If not wrapped, wraps it.\n *\n * @param segments - Current document segments\n * @param selectionStart - Start offset in plain text\n * @param selectionEnd - End offset in plain text\n * @param marker - The markdown marker (e.g., '**' for bold, '*' for italic)\n * @returns New segments and selection offsets, or null if selection is collapsed\n */\nexport function toggleMarkdownWrap(\n segments: Segment[],\n selectionStart: number,\n selectionEnd: number,\n marker: string,\n): { segments: Segment[]; selectionStart: number; selectionEnd: number } | null {\n if (selectionStart === selectionEnd) return null\n\n const plainText = segmentsToPlainText(segments)\n const markerLen = marker.length\n\n // Check if already wrapped\n const hasOpeningMarker =\n selectionStart >= markerLen &&\n plainText.slice(selectionStart - markerLen, selectionStart) === marker\n const hasClosingMarker =\n selectionEnd + markerLen <= plainText.length &&\n plainText.slice(selectionEnd, selectionEnd + markerLen) === marker\n\n let isWrapped = hasOpeningMarker && hasClosingMarker\n\n // For single-char markers (e.g., '*'), ensure we're not matching\n // inside a multi-char marker (e.g., '**')\n if (isWrapped && markerLen === 1) {\n const charBeforeOpening =\n selectionStart > markerLen ? plainText[selectionStart - markerLen - 1] : ''\n const charAfterClosing =\n selectionEnd + markerLen < plainText.length ? plainText[selectionEnd + markerLen] : ''\n if (charBeforeOpening === marker || charAfterClosing === marker) {\n isWrapped = false\n }\n }\n\n if (isWrapped) {\n // Unwrap: remove closing marker first (preserves start offsets), then opening\n const afterClosing = replaceTextRange(segments, selectionEnd, selectionEnd + markerLen, '')\n const afterOpening = replaceTextRange(\n afterClosing,\n selectionStart - markerLen,\n selectionStart,\n '',\n )\n return {\n segments: afterOpening,\n selectionStart: selectionStart - markerLen,\n selectionEnd: selectionEnd - markerLen,\n }\n }\n\n // Wrap: insert closing marker first (preserves start offsets), then opening\n const afterClosing = replaceTextRange(segments, selectionEnd, selectionEnd, marker)\n const afterOpening = replaceTextRange(afterClosing, selectionStart, selectionStart, marker)\n return {\n segments: afterOpening,\n selectionStart: selectionStart + markerLen,\n selectionEnd: selectionEnd + markerLen,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Inline markdown parsing\n// ---------------------------------------------------------------------------\n\nexport type MarkdownToken =\n | { type: 'plain'; text: string }\n | { type: 'bold'; text: string }\n | { type: 'italic'; text: string }\n | { type: 'bold-italic'; text: string }\n | { type: 'url'; text: string }\n\n/**\n * Parses text for simple inline markdown: bold, italic, bold-italic, and URLs.\n * Does NOT handle block-level markdown (lists, headings, etc.).\n */\nexport function parseInlineMarkdown(text: string): MarkdownToken[] {\n if (!text) return []\n\n const tokens: MarkdownToken[] = []\n // Regex patterns for inline markdown elements:\n // 1. ***text*** or ___text___ -> bold-italic\n // 2. **text** or __text__ -> bold\n // 3. *text* or _text_ -> italic\n // 4. https://... or http://... -> URL\n const pattern = /(\\*{3}(.+?)\\*{3})|(\\*{2}(.+?)\\*{2})|(\\*(.+?)\\*)|(https?:\\/\\/[^\\s),]+)/g\n\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = pattern.exec(text)) !== null) {\n // Add any plain text before this match\n if (match.index > lastIndex) {\n tokens.push({ type: 'plain', text: text.slice(lastIndex, match.index) })\n }\n\n if (match[1] && match[2]) {\n // ***bold-italic***\n tokens.push({ type: 'bold-italic', text: match[2] })\n } else if (match[3] && match[4]) {\n // **bold**\n tokens.push({ type: 'bold', text: match[4] })\n } else if (match[5] && match[6]) {\n // *italic*\n tokens.push({ type: 'italic', text: match[6] })\n } else if (match[7]) {\n // URL\n tokens.push({ type: 'url', text: match[7] })\n }\n\n lastIndex = match.index + match[0].length\n }\n\n // Add any remaining plain text\n if (lastIndex < text.length) {\n tokens.push({ type: 'plain', text: text.slice(lastIndex) })\n }\n\n return tokens\n}\n\n// ---------------------------------------------------------------------------\n// Segment comparison\n// ---------------------------------------------------------------------------\n\n/**\n * Shallow equality check for two segment arrays.\n * Compares type, text, trigger, value, displayText, and autoResolved fields.\n * Avoids JSON.stringify overhead for the common case.\n */\nexport function segmentsEqual(a: Segment[], b: Segment[]): boolean {\n if (a === b) return true\n if (a.length !== b.length) return false\n\n for (let i = 0; i < a.length; i++) {\n const sa = a[i]\n const sb = b[i]\n if (sa.type !== sb.type) return false\n if (sa.type === 'text') {\n if (sb.type !== 'text' || sa.text !== sb.text) return false\n } else {\n if (\n sb.type !== 'chip' ||\n sa.trigger !== sb.trigger ||\n sa.value !== sb.value ||\n sa.displayText !== sb.displayText ||\n sa.autoResolved !== sb.autoResolved\n )\n return false\n }\n }\n return true\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Merges adjacent text segments into single text segments.\n * Also removes empty text segments.\n */\nexport function mergeAdjacentTextSegments(segments: Segment[]): Segment[] {\n const result: Segment[] = []\n\n for (const seg of segments) {\n if (seg.type === 'text' && seg.text === '') continue\n\n const last = result[result.length - 1]\n if (seg.type === 'text' && last?.type === 'text') {\n // Merge with previous text segment\n result[result.length - 1] = { type: 'text', text: last.text + seg.text }\n } else {\n result.push(seg)\n }\n }\n\n return result\n}\n","/**\n * List auto-formatting logic for the PromptArea component.\n * Pure — no DOM dependencies, fully testable in Node.\n */\nimport type { Segment } from './types'\nimport { replaceTextRange, segmentsToPlainText } from './prompt-area-engine'\n\n/**\n * Information about a list line at a given cursor position.\n */\nexport type ListContext = {\n /** Offset in plain text where the line begins */\n lineStart: number\n /** The full prefix including indentation (e.g., \" • \") */\n prefix: string\n /** Number of indentation levels (each = 2 spaces) */\n indent: number\n /** Type of list */\n listType: 'bullet' | 'numbered'\n /** For numbered lists, the number */\n number?: number\n /** Offset in plain text where content after the prefix starts */\n contentStart: number\n}\n\n/**\n * Detects if the cursor is in a list line and returns context about it.\n *\n * @param text - The full plain text content\n * @param cursorPos - The cursor position (character offset from start)\n * @returns List context if the cursor is in a list line, null otherwise\n */\nexport function getListContext(text: string, cursorPos: number): ListContext | null {\n const lineStart = text.lastIndexOf('\\n', cursorPos - 1) + 1\n const lineEnd = text.indexOf('\\n', cursorPos)\n const line = text.slice(lineStart, lineEnd === -1 ? text.length : lineEnd)\n\n const bulletMatch = line.match(/^(\\s*)([•\\-*]) /)\n if (bulletMatch) {\n const indentStr = bulletMatch[1]\n return {\n lineStart,\n prefix: bulletMatch[0],\n indent: Math.floor(indentStr.length / 2),\n listType: 'bullet',\n contentStart: lineStart + bulletMatch[0].length,\n }\n }\n\n const numberMatch = line.match(/^(\\s*)(\\d+)\\. /)\n if (numberMatch) {\n const indentStr = numberMatch[1]\n return {\n lineStart,\n prefix: numberMatch[0],\n indent: Math.floor(indentStr.length / 2),\n listType: 'numbered',\n number: parseInt(numberMatch[2], 10),\n contentStart: lineStart + numberMatch[0].length,\n }\n }\n\n return null\n}\n\n/**\n * Detects if the user just typed a list trigger pattern (e.g., \"- \" or \"* \")\n * and returns the segments with the replacement applied.\n */\nexport function autoFormatListPrefix(\n segments: Segment[],\n cursorPos: number,\n): { segments: Segment[]; cursorOffset: number } | null {\n const plainText = segmentsToPlainText(segments)\n const lineStart = plainText.lastIndexOf('\\n', cursorPos - 1) + 1\n const lineText = plainText.slice(lineStart, cursorPos)\n\n const match = lineText.match(/^(\\s*)[-*] $/)\n if (!match) return null\n\n const indent = match[1]\n const replacement = `${indent}• `\n const rangeStart = lineStart\n const rangeEnd = lineStart + lineText.length\n\n const newSegments = replaceTextRange(segments, rangeStart, rangeEnd, replacement)\n return {\n segments: newSegments,\n cursorOffset: lineStart + replacement.length,\n }\n}\n\n/**\n * Handles Enter key in a list line — continues the list or exits.\n */\nexport function insertListContinuation(\n segments: Segment[],\n cursorPos: number,\n): { segments: Segment[]; cursorOffset: number } | null {\n const plainText = segmentsToPlainText(segments)\n const ctx = getListContext(plainText, cursorPos)\n if (!ctx) return null\n\n const lineEnd = plainText.indexOf('\\n', cursorPos)\n const lineContent = plainText.slice(ctx.contentStart, lineEnd === -1 ? plainText.length : lineEnd)\n\n if (lineContent.trim() === '') {\n const newSegments = replaceTextRange(\n segments,\n ctx.lineStart,\n ctx.lineStart + ctx.prefix.length,\n '',\n )\n return {\n segments: newSegments,\n cursorOffset: ctx.lineStart,\n }\n }\n\n const indent = ' '.repeat(ctx.indent)\n let nextPrefix: string\n if (ctx.listType === 'bullet') {\n nextPrefix = `${indent}• `\n } else {\n const nextNum = (ctx.number ?? 1) + 1\n nextPrefix = `${indent}${nextNum}. `\n }\n\n const insertion = `\\n${nextPrefix}`\n const newSegments = replaceTextRange(segments, cursorPos, cursorPos, insertion)\n return {\n segments: newSegments,\n cursorOffset: cursorPos + insertion.length,\n }\n}\n\n/**\n * Indents a list item by one level (adds 2 spaces before the prefix).\n */\nexport function indentListItem(\n segments: Segment[],\n cursorPos: number,\n): { segments: Segment[]; cursorOffset: number } | null {\n const plainText = segmentsToPlainText(segments)\n const ctx = getListContext(plainText, cursorPos)\n if (!ctx) return null\n\n const newSegments = replaceTextRange(segments, ctx.lineStart, ctx.lineStart, ' ')\n return {\n segments: newSegments,\n cursorOffset: cursorPos + 2,\n }\n}\n\n/**\n * Outdents a list item by one level (removes 2 spaces from before the prefix).\n */\nexport function outdentListItem(\n segments: Segment[],\n cursorPos: number,\n): { segments: Segment[]; cursorOffset: number } | null {\n const plainText = segmentsToPlainText(segments)\n const ctx = getListContext(plainText, cursorPos)\n if (!ctx || ctx.indent === 0) return null\n\n const newSegments = replaceTextRange(segments, ctx.lineStart, ctx.lineStart + 2, '')\n return {\n segments: newSegments,\n cursorOffset: Math.max(ctx.lineStart, cursorPos - 2),\n }\n}\n\n/**\n * Removes the list prefix from the current line (e.g., on Backspace).\n */\nexport function removeListPrefix(\n segments: Segment[],\n cursorPos: number,\n): { segments: Segment[]; cursorOffset: number } | null {\n const plainText = segmentsToPlainText(segments)\n const ctx = getListContext(plainText, cursorPos)\n if (!ctx) return null\n\n if (cursorPos > ctx.contentStart) return null\n\n const newSegments = replaceTextRange(\n segments,\n ctx.lineStart,\n ctx.contentStart,\n ' '.repeat(ctx.indent),\n )\n return {\n segments: newSegments,\n cursorOffset: ctx.lineStart + ctx.indent * 2,\n }\n}\n\n/**\n * Normalizes markdown list prefixes in segments:\n * - When markdown is enabled, converts \"- \" at line starts to \"• \"\n * - When markdown is disabled, converts \"• \" at line starts to \"- \"\n */\nexport function normalizeListPrefixes(segments: Segment[], markdownEnabled: boolean): Segment[] {\n let changed = false\n const result = segments.map((seg) => {\n if (seg.type !== 'text') return seg\n const newText = markdownEnabled\n ? seg.text.replace(/(^|\\n)(\\s*)- /g, '$1$2• ')\n : seg.text.replace(/(^|\\n)(\\s*)• /g, '$1$2- ')\n if (newText === seg.text) return seg\n changed = true\n return { ...seg, text: newText }\n })\n return changed ? result : segments\n}\n","/**\n * Type-safe DOM helper functions for PromptArea.\n *\n * These replace all `as` type assertions with proper type guards,\n * following the codebase rule: \"Never use `any` or `as` assertions.\"\n */\n\n// ---------------------------------------------------------------------------\n// Type Guards\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard: checks if a DOM node is an HTMLElement.\n */\nexport function isHTMLElement(node: Node): node is HTMLElement {\n return node instanceof HTMLElement\n}\n\n/**\n * Type guard: checks if a DOM node is a chip element\n * (an HTMLElement with data-chip-trigger attribute).\n */\nexport function isChipElement(node: Node): node is HTMLElement {\n return node instanceof HTMLElement && node.dataset.chipTrigger !== undefined\n}\n\n/**\n * Type guard: checks if a DOM node is a BR element.\n */\nexport function isBRElement(node: Node): node is HTMLBRElement {\n return node instanceof HTMLBRElement\n}\n\n/**\n * Type guard: checks if a DOM node is a Text node.\n */\nexport function isTextNode(node: Node): node is Text {\n return node instanceof Text\n}\n\n/**\n * Checks whether a chip element was auto-resolved (created by pressing space\n * on resolveOnSpace triggers, rather than explicit dropdown selection).\n */\nexport function getChipAutoResolved(node: Node): boolean {\n return isChipElement(node) && node.dataset.chipAutoResolved === 'true'\n}\n\n/**\n * Type guard: checks if a DOM node is a URL link element\n * (an HTMLAnchorElement with data-url attribute).\n */\nexport function isLinkElement(node: Node): node is HTMLAnchorElement {\n return node instanceof HTMLAnchorElement && node.dataset.url === 'true'\n}\n\n// ---------------------------------------------------------------------------\n// Safe JSON\n// ---------------------------------------------------------------------------\n\n/**\n * Safely parses a JSON string, returning `unknown` instead of `any`.\n * Returns `undefined` if parsing fails.\n */\nexport function safeJsonParse(json: string): unknown {\n try {\n // JSON.parse returns `any` by default. We narrow it to `unknown`\n // which is the safest pattern — callers must validate before use.\n const parsed: unknown = JSON.parse(json)\n return parsed\n } catch {\n return undefined\n }\n}\n\n/**\n * Safely serializes a value to JSON, returning undefined on failure.\n */\nexport function safeJsonStringify(value: unknown): string | undefined {\n try {\n return JSON.stringify(value)\n } catch {\n return undefined\n }\n}\n\n// ---------------------------------------------------------------------------\n// DOM reading helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Reads the chip trigger character from a chip element's dataset.\n * Returns undefined if the node is not a chip element.\n */\nexport function getChipTrigger(node: Node): string | undefined {\n if (!isChipElement(node)) return undefined\n return node.dataset.chipTrigger\n}\n\n/**\n * Reads the chip value from a chip element's dataset.\n */\nexport function getChipValue(node: Node): string | undefined {\n if (!isChipElement(node)) return undefined\n return node.dataset.chipValue\n}\n\n/**\n * Reads the chip display text from a chip element's dataset.\n */\nexport function getChipDisplay(node: Node): string | undefined {\n if (!isChipElement(node)) return undefined\n return node.dataset.chipDisplay ?? node.textContent ?? undefined\n}\n\n/**\n * Reads and safely parses the chip data from a chip element's dataset.\n */\nexport function getChipData(node: Node): unknown {\n if (!isChipElement(node)) return undefined\n const raw = node.dataset.chipData\n if (!raw) return undefined\n return safeJsonParse(raw)\n}\n\n// ---------------------------------------------------------------------------\n// DOM manipulation helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Finds the index of a direct child node within a parent element.\n * Returns -1 if not found.\n */\nexport function indexOfChildNode(parent: HTMLElement, child: Node): number {\n const children = parent.childNodes\n for (let i = 0; i < children.length; i++) {\n if (children[i] === child) return i\n }\n return -1\n}\n\n/**\n * Gets the direct child of `ancestor` that contains `descendant`.\n * Walks up from descendant until we find a node whose parent is ancestor.\n * Returns null if descendant is not inside ancestor.\n */\nexport function getDirectChildContaining(ancestor: HTMLElement, descendant: Node): Node | null {\n let node: Node | null = descendant\n while (node !== null) {\n if (node.parentNode === ancestor) return node\n node = node.parentNode\n }\n return null\n}\n\n/**\n * Unwraps a block element (div, p) by replacing it with its child nodes\n * plus a trailing BR. Used for browser DOM normalization.\n */\nexport function unwrapBlockElement(parent: HTMLElement, block: HTMLElement): void {\n const fragment = document.createDocumentFragment()\n\n // Move all children to fragment\n while (block.firstChild) {\n fragment.appendChild(block.firstChild)\n }\n\n // Add a BR after the unwrapped content\n fragment.appendChild(document.createElement('br'))\n\n parent.replaceChild(fragment, block)\n}\n\n/**\n * Normalizes the editor DOM after browser mutations.\n *\n * Browsers insert various wrapper elements on Enter/paste:\n * - Chrome wraps new lines in <div>\n * - Safari may use <div><br></div>\n * - Some use <p> tags\n *\n * This function unwraps all non-chip block elements, leaving only:\n * - Text nodes\n * - <br> elements\n * - Chip <span> elements (with data-chip-trigger)\n */\nexport function normalizeEditorDOM(editor: HTMLElement): boolean {\n let changed = false\n const blockTags = new Set(['DIV', 'P', 'SECTION', 'ARTICLE', 'BLOCKQUOTE'])\n\n // Iterate backwards since we're modifying the DOM\n for (let i = editor.childNodes.length - 1; i >= 0; i--) {\n const child = editor.childNodes[i]\n\n // Skip non-element nodes, chip elements, and BR elements\n if (!(child instanceof HTMLElement)) continue\n if (child.dataset.chipTrigger !== undefined) continue\n if (child instanceof HTMLBRElement) continue\n\n const tag = child.tagName\n if (blockTags.has(tag)) {\n unwrapBlockElement(editor, child)\n changed = true\n } else if (\n tag === 'FONT' ||\n tag === 'B' ||\n tag === 'I' ||\n tag === 'U' ||\n tag === 'STRONG' ||\n tag === 'EM' ||\n tag === 'A' ||\n tag === 'SPAN'\n ) {\n // Unwrap inline formatting/decoration elements (browser-inserted or markdown decorations)\n const text = child.textContent ?? ''\n if (text) {\n editor.replaceChild(document.createTextNode(text), child)\n } else {\n editor.removeChild(child)\n }\n changed = true\n }\n }\n\n // Merge adjacent text nodes\n editor.normalize()\n\n return changed\n}\n\n// ---------------------------------------------------------------------------\n// URL decoration\n// ---------------------------------------------------------------------------\n\n/** URL pattern for detecting URLs in text content */\nconst URL_PATTERN = /https?:\\/\\/[^\\s),]+/g\n\n/**\n * Walks direct-child text nodes in the editor and wraps URL text in\n * `<a>` elements for visual styling and clickability.\n *\n * This is a DOM-only decoration — it does NOT modify the segment model.\n * The `<a>` elements are stripped by `normalizeEditorDOM` on every input cycle,\n * so they are re-applied fresh each time.\n *\n * @param editor - The contentEditable root element\n * @returns Whether any decorations were applied\n */\nexport function decorateURLsInEditor(editor: HTMLElement): boolean {\n let decorated = false\n\n // Collect text nodes first (avoid modifying while iterating)\n const textNodes: Text[] = []\n for (let i = 0; i < editor.childNodes.length; i++) {\n const node = editor.childNodes[i]\n if (isTextNode(node) && node.textContent) {\n textNodes.push(node)\n }\n }\n\n for (const textNode of textNodes) {\n const text = textNode.textContent ?? ''\n URL_PATTERN.lastIndex = 0\n const matches: Array<{ url: string; index: number }> = []\n let match: RegExpExecArray | null\n\n while ((match = URL_PATTERN.exec(text)) !== null) {\n // Trim trailing punctuation that's likely not part of the URL\n let url = match[0]\n while (url.length > 0 && /[.;:!?]$/.test(url)) {\n url = url.slice(0, -1)\n }\n if (url.length > 0) {\n matches.push({ url, index: match.index })\n }\n }\n\n if (matches.length === 0) continue\n\n const parent = textNode.parentNode\n if (!parent) continue\n\n // Validate URLs upfront – only keep those with safe protocols (CWE-79)\n const safeMatches: Array<{ url: string; href: string; index: number }> = []\n for (const { url, index } of matches) {\n try {\n const parsed = new URL(url)\n if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n safeMatches.push({ url, href: parsed.href, index })\n }\n } catch {\n // skip malformed URLs\n }\n }\n\n if (safeMatches.length === 0) continue\n\n decorated = true\n const fragment = document.createDocumentFragment()\n let lastIndex = 0\n\n for (const { url, href, index } of safeMatches) {\n // Text before this URL\n if (index > lastIndex) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, index)))\n }\n\n // Create the link element\n const anchor = document.createElement('a')\n anchor.href = href\n anchor.target = '_blank'\n anchor.rel = 'noopener noreferrer'\n anchor.dataset.url = 'true'\n anchor.className = 'text-primary hover:text-primary/80 underline cursor-pointer'\n anchor.textContent = url\n fragment.appendChild(anchor)\n\n lastIndex = index + url.length\n }\n\n // Text after the last URL\n if (lastIndex < text.length) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)))\n }\n\n parent.replaceChild(fragment, textNode)\n }\n\n return decorated\n}\n\n// ---------------------------------------------------------------------------\n// Markdown inline decoration\n// ---------------------------------------------------------------------------\n\n/** Pattern to find ***bold-italic***, **bold**, and *italic* markdown spans */\nconst MARKDOWN_INLINE_PATTERN = /(\\*{3})(.+?)\\*{3}|(\\*{2})(.+?)\\*{2}|(\\*)(.+?)\\*/g\n\n/**\n * Walks direct-child text nodes in the editor and wraps markdown-formatted\n * text (`**bold**`, `*italic*`, `***bold-italic***`) in styled `<span>` elements.\n *\n * This is a DOM-only decoration — it does NOT modify the segment model.\n * The `<span>` elements are stripped by `normalizeEditorDOM` on every input cycle,\n * so they are re-applied fresh each time.\n *\n * The `*` markers stay visible in the text; only the CSS styling changes.\n *\n * @param editor - The contentEditable root element\n * @returns Whether any decorations were applied\n */\nexport function decorateMarkdownInEditor(editor: HTMLElement): boolean {\n let decorated = false\n\n // Collect text nodes first (avoid modifying while iterating)\n const textNodes: Text[] = []\n for (let i = 0; i < editor.childNodes.length; i++) {\n const node = editor.childNodes[i]\n if (isTextNode(node) && node.textContent) {\n textNodes.push(node)\n }\n }\n\n for (const textNode of textNodes) {\n const text = textNode.textContent ?? ''\n MARKDOWN_INLINE_PATTERN.lastIndex = 0\n const matches: Array<{\n fullMatch: string\n marker: string\n content: string\n index: number\n className: string\n }> = []\n let match: RegExpExecArray | null\n\n while ((match = MARKDOWN_INLINE_PATTERN.exec(text)) !== null) {\n if (match[1] && match[2]) {\n // ***bold-italic***\n matches.push({\n fullMatch: match[0],\n marker: match[1],\n content: match[2],\n index: match.index,\n className: 'font-bold italic',\n })\n } else if (match[3] && match[4]) {\n // **bold**\n matches.push({\n fullMatch: match[0],\n marker: match[3],\n content: match[4],\n index: match.index,\n className: 'font-bold',\n })\n } else if (match[5] && match[6]) {\n // *italic*\n matches.push({\n fullMatch: match[0],\n marker: match[5],\n content: match[6],\n index: match.index,\n className: 'italic',\n })\n }\n }\n\n if (matches.length === 0) continue\n\n decorated = true\n const parent = textNode.parentNode\n if (!parent) continue\n\n const fragment = document.createDocumentFragment()\n let lastIndex = 0\n\n for (const { fullMatch, marker, content, index, className } of matches) {\n // Text before this match\n if (index > lastIndex) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, index)))\n }\n\n // Parent span — textContent still returns full match (e.g. \"**world**\")\n const span = document.createElement('span')\n span.dataset.md = 'true'\n\n // Opening marker (visually hidden)\n const openMarker = document.createElement('span')\n openMarker.className = 'prompt-area-md-marker'\n openMarker.textContent = marker\n\n // Styled content\n const styledContent = document.createElement('span')\n styledContent.className = className\n styledContent.textContent = content\n\n // Closing marker (visually hidden)\n const closeMarker = document.createElement('span')\n closeMarker.className = 'prompt-area-md-marker'\n closeMarker.textContent = marker\n\n span.appendChild(openMarker)\n span.appendChild(styledContent)\n span.appendChild(closeMarker)\n fragment.appendChild(span)\n\n lastIndex = index + fullMatch.length\n }\n\n // Text after the last match\n if (lastIndex < text.length) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)))\n }\n\n parent.replaceChild(fragment, textNode)\n }\n\n return decorated\n}\n\n// ---------------------------------------------------------------------------\n// Selection helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the first Range from the current window selection, or null if\n * there is no selection or it has no ranges.\n */\nexport function getSelectionRange(): Range | null {\n const sel = window.getSelection()\n if (!sel || sel.rangeCount === 0) return null\n return sel.getRangeAt(0)\n}\n","/**\n * Cursor/selection utilities for the PromptArea contentEditable.\n *\n * Invariants:\n * - All functions are synchronous. Never return a promise or cross a microtask\n * boundary after a DOM mutation — that can cause the browser to fire\n * `selectionchange` and reset the caret.\n * - Never cache a `Selection` or `Range` across calls. Ranges become detached\n * after DOM mutations. Each function calls `window.getSelection()` or\n * `getSelectionRange()` fresh.\n * - Chip nodes are treated atomically via `isChipElement` — we never descend\n * into a contentEditable=false subtree when mapping offsets.\n */\nimport {\n getDirectChildContaining,\n getSelectionRange,\n indexOfChildNode,\n isBRElement,\n isChipElement,\n isHTMLElement,\n} from './dom-helpers'\n\nexport type SavedCursor = {\n nodeIndex: number\n offset: number\n}\n\nexport function saveCursorPosition(editor: HTMLElement): SavedCursor | null {\n const range = getSelectionRange()\n if (!range) return null\n if (!editor.contains(range.startContainer)) return null\n\n const node = range.startContainer\n if (node === editor) {\n return { nodeIndex: range.startOffset, offset: 0 }\n }\n\n // Walk up to find the direct child of editor using type-safe helper\n const directChild = getDirectChildContaining(editor, node)\n if (!directChild) return null\n\n const nodeIndex = indexOfChildNode(editor, directChild)\n return { nodeIndex, offset: range.startOffset }\n}\n\nexport function restoreCursorPosition(editor: HTMLElement, saved: SavedCursor): void {\n const sel = window.getSelection()\n if (!sel) return\n\n const childNodes = editor.childNodes\n if (childNodes.length === 0) return\n\n const range = document.createRange()\n\n if (saved.nodeIndex >= childNodes.length) {\n const lastChild = childNodes[childNodes.length - 1]\n if (lastChild.nodeType === Node.TEXT_NODE) {\n range.setStart(lastChild, (lastChild.textContent ?? '').length)\n } else {\n range.setStartAfter(lastChild)\n }\n } else {\n const targetNode = childNodes[saved.nodeIndex]\n if (targetNode.nodeType === Node.TEXT_NODE) {\n const maxOffset = (targetNode.textContent ?? '').length\n range.setStart(targetNode, Math.min(saved.offset, maxOffset))\n } else {\n range.setStartAfter(targetNode)\n }\n }\n\n range.collapse(true)\n sel.removeAllRanges()\n sel.addRange(range)\n}\n\nexport function getCursorOffset(editor: HTMLElement): number | null {\n const range = getSelectionRange()\n if (!range) return null\n if (!editor.contains(range.startContainer)) return null\n\n const preRange = document.createRange()\n preRange.selectNodeContents(editor)\n preRange.setEnd(range.startContainer, range.startOffset)\n\n return getTextLengthInRange(preRange)\n}\n\n/**\n * Create a collapsed Range at the given plain-text offset inside the editor.\n * Returns null if the offset can't be mapped to a DOM position.\n */\nexport function createRangeAtOffset(editor: HTMLElement, targetOffset: number): Range | null {\n const pos = findDOMPosition(editor, targetOffset)\n if (!pos) return null\n\n const range = document.createRange()\n range.setStart(pos.node, pos.offset)\n range.collapse(true)\n return range\n}\n\nexport function setCursorAtOffset(editor: HTMLElement, targetOffset: number): void {\n const sel = window.getSelection()\n if (!sel) return\n\n const pos = findDOMPosition(editor, targetOffset)\n if (pos) {\n const range = document.createRange()\n range.setStart(pos.node, pos.offset)\n range.collapse(true)\n sel.removeAllRanges()\n sel.addRange(range)\n return\n }\n\n // Fallback: place cursor at end\n const range = document.createRange()\n range.selectNodeContents(editor)\n range.collapse(false)\n sel.removeAllRanges()\n sel.addRange(range)\n}\n\nexport function getTextLengthInRange(range: Range): number {\n const fragment = range.cloneContents()\n let length = 0\n\n const walk = (node: Node): void => {\n if (node.nodeType === Node.TEXT_NODE) {\n length += (node.textContent ?? '').length\n } else if (isChipElement(node)) {\n // Type-safe chip reading\n const trigger = node.dataset.chipTrigger ?? ''\n const display = node.dataset.chipDisplay ?? node.textContent ?? ''\n length += trigger.length + display.length\n } else if (isHTMLElement(node) && node.tagName === 'BR') {\n if (node.dataset.sentinel) return // skip sentinel <br>\n length += 1\n } else if (isHTMLElement(node)) {\n node.childNodes.forEach(walk)\n }\n }\n\n fragment.childNodes.forEach(walk)\n return length\n}\n\n/**\n * Returns the start and end plain-text offsets of the current selection.\n * Returns null if there's no selection or it's outside the editor.\n */\nexport function getSelectionOffsets(editor: HTMLElement): { start: number; end: number } | null {\n const range = getSelectionRange()\n if (!range) return null\n if (!editor.contains(range.startContainer)) return null\n\n const startRange = document.createRange()\n startRange.selectNodeContents(editor)\n startRange.setEnd(range.startContainer, range.startOffset)\n const start = getTextLengthInRange(startRange)\n\n if (range.collapsed) return { start, end: start }\n\n const endRange = document.createRange()\n endRange.selectNodeContents(editor)\n endRange.setEnd(range.endContainer, range.endOffset)\n const end = getTextLengthInRange(endRange)\n\n return { start, end }\n}\n\n/**\n * Sets a (potentially non-collapsed) selection at the given plain-text offsets.\n * Used to restore selection after markdown wrap/unwrap operations.\n */\nexport function setSelectionAtOffsets(\n editor: HTMLElement,\n startOffset: number,\n endOffset: number,\n): void {\n const sel = window.getSelection()\n if (!sel) return\n\n if (startOffset === endOffset) {\n setCursorAtOffset(editor, startOffset)\n return\n }\n\n const startPos = findDOMPosition(editor, startOffset)\n const endPos = findDOMPosition(editor, endOffset)\n if (!startPos || !endPos) return\n\n const range = document.createRange()\n range.setStart(startPos.node, startPos.offset)\n range.setEnd(endPos.node, endPos.offset)\n sel.removeAllRanges()\n sel.addRange(range)\n}\n\n/**\n * Maps a plain-text offset to a DOM node + offset pair.\n * Recurses into decoration elements (markdown spans, URL anchors).\n */\nexport function findDOMPosition(\n container: HTMLElement,\n targetOffset: number,\n): { node: Node; offset: number } | null {\n let remaining = targetOffset\n\n for (let i = 0; i < container.childNodes.length; i++) {\n const child = container.childNodes[i]\n\n if (child.nodeType === Node.TEXT_NODE) {\n const len = (child.textContent ?? '').length\n if (remaining <= len) {\n return { node: child, offset: remaining }\n }\n remaining -= len\n } else if (isChipElement(child)) {\n const trigger = child.dataset.chipTrigger ?? ''\n const display = child.dataset.chipDisplay ?? child.textContent ?? ''\n const chipLen = trigger.length + display.length\n if (remaining <= chipLen) {\n // Position after the chip element\n return { node: container, offset: i + 1 }\n }\n remaining -= chipLen\n } else if (isBRElement(child)) {\n if (child.dataset.sentinel) continue // skip sentinel <br>\n if (remaining <= 1) {\n return { node: container, offset: i + 1 }\n }\n remaining -= 1\n } else if (isHTMLElement(child)) {\n // Decoration element (markdown span, URL anchor) — recurse\n const textLen = (child.textContent ?? '').length\n if (remaining <= textLen) {\n const result = findDOMPosition(child, remaining)\n if (result) return result\n }\n remaining -= textLen\n }\n }\n\n // Fallback: end of container\n return { node: container, offset: container.childNodes.length }\n}\n","/**\n * Clipboard-related DOM utilities for the PromptArea component.\n * Handles serializing selections and inserting pasted segments at the cursor.\n *\n * Not merged into dom-helpers.ts to avoid overcrowding that file with\n * clipboard I/O concerns alongside its DOM traversal and chip-accessor helpers.\n */\nimport type { Segment, ChipSegment } from './types'\nimport {\n getChipAutoResolved,\n getChipData,\n getChipDisplay,\n getChipTrigger,\n getChipValue,\n getSelectionRange,\n isChipElement,\n isHTMLElement,\n} from './dom-helpers'\nimport { mergeAdjacentTextSegments } from './prompt-area-engine'\nimport { getTextLengthInRange } from './cursor-helpers'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * Serializes a DocumentFragment (from selection) to plain text,\n * converting chip elements to their `trigger + displayText` form.\n */\nexport function serializeFragmentToPlainText(fragment: DocumentFragment): string {\n let text = ''\n\n const walk = (node: Node): void => {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent ?? ''\n } else if (isChipElement(node)) {\n const trigger = getChipTrigger(node) ?? ''\n const display = getChipDisplay(node) ?? ''\n text += trigger + display\n } else if (isHTMLElement(node) && node.tagName === 'BR') {\n text += '\\n'\n } else {\n node.childNodes.forEach(walk)\n }\n }\n\n fragment.childNodes.forEach(walk)\n return text\n}\n\n/**\n * Serializes a DocumentFragment to an array of Segment objects,\n * preserving chip data for internal copy/paste.\n */\nexport function serializeFragmentToSegments(fragment: DocumentFragment): Segment[] {\n const segments: Segment[] = []\n\n const walk = (node: Node): void => {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? ''\n if (text) {\n segments.push({ type: 'text', text })\n }\n } else if (isChipElement(node)) {\n const trigger = getChipTrigger(node)\n const chipValue = getChipValue(node)\n const display = getChipDisplay(node)\n const data = getChipData(node)\n const autoResolved = getChipAutoResolved(node)\n\n if (trigger && chipValue !== undefined && display) {\n const chip: ChipSegment = {\n type: 'chip',\n trigger,\n value: chipValue,\n displayText: display,\n ...(data !== undefined ? { data } : {}),\n ...(autoResolved ? { autoResolved: true } : {}),\n }\n segments.push(chip)\n }\n } else if (isHTMLElement(node) && node.tagName === 'BR') {\n segments.push({ type: 'text', text: '\\n' })\n } else {\n node.childNodes.forEach(walk)\n }\n }\n\n fragment.childNodes.forEach(walk)\n return segments\n}\n\n/**\n * Parses segment JSON from the clipboard. Returns null if invalid.\n */\nexport function parseSegmentsFromClipboard(json: string): Segment[] | null {\n try {\n const parsed: unknown = JSON.parse(json)\n if (!Array.isArray(parsed)) return null\n\n const segments: Segment[] = []\n for (const item of parsed) {\n if (!isRecord(item)) return null\n\n if (item.type === 'text' && typeof item.text === 'string') {\n segments.push({ type: 'text', text: item.text })\n } else if (\n item.type === 'chip' &&\n typeof item.trigger === 'string' &&\n typeof item.value === 'string' &&\n typeof item.displayText === 'string'\n ) {\n const chip: ChipSegment = {\n type: 'chip',\n trigger: item.trigger,\n value: item.value,\n displayText: item.displayText,\n ...(item.data !== undefined ? { data: item.data } : {}),\n ...(item.autoResolved ? { autoResolved: true } : {}),\n }\n segments.push(chip)\n } else {\n return null\n }\n }\n\n return segments\n } catch {\n return null\n }\n}\n\n/**\n * Inserts pasted segments at the current cursor position within existing segments.\n * Splits any text segment that straddles the cursor so the pasted content lands\n * exactly at the cursor and nothing before or after is lost.\n */\nexport function insertSegmentsAtCursor(\n currentSegments: Segment[],\n pastedSegments: Segment[],\n editor: HTMLElement,\n): Segment[] {\n const range = getSelectionRange()\n if (!range) return [...currentSegments, ...pastedSegments]\n\n const preRange = document.createRange()\n preRange.selectNodeContents(editor)\n preRange.setEnd(range.startContainer, range.startOffset)\n const cursorOffset = getTextLengthInRange(preRange)\n\n const result: Segment[] = []\n let offset = 0\n let inserted = false\n\n const insertOnce = (): void => {\n if (!inserted) {\n result.push(...pastedSegments)\n inserted = true\n }\n }\n\n for (const seg of currentSegments) {\n if (seg.type === 'chip') {\n const chipLen = seg.trigger.length + seg.displayText.length\n if (offset >= cursorOffset) insertOnce()\n result.push(seg)\n offset += chipLen\n continue\n }\n\n const segEnd = offset + seg.text.length\n if (segEnd <= cursorOffset) {\n // Entirely before the cursor\n result.push(seg)\n } else if (offset >= cursorOffset) {\n // Entirely after the cursor\n insertOnce()\n result.push(seg)\n } else {\n // Cursor falls inside this text segment — split it.\n const splitAt = cursorOffset - offset\n const before = seg.text.slice(0, splitAt)\n const after = seg.text.slice(splitAt)\n if (before) result.push({ type: 'text', text: before })\n insertOnce()\n if (after) result.push({ type: 'text', text: after })\n }\n offset = segEnd\n }\n\n insertOnce()\n return mergeAdjacentTextSegments(result)\n}\n","'use client'\n\nimport { useCallback, useRef } from 'react'\nimport type { Segment, ChipSegment, TriggerConfig } from './types'\nimport { resolveTriggersInSegments } from './prompt-area-engine'\nimport { normalizeEditorDOM, safeJsonStringify, getSelectionRange } from './dom-helpers'\nimport {\n serializeFragmentToPlainText,\n serializeFragmentToSegments,\n parseSegmentsFromClipboard,\n insertSegmentsAtCursor,\n} from './clipboard-helpers'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype EventHandlerDeps = {\n editorRef: React.RefObject<HTMLDivElement | null>\n readSegmentsFromDOM: () => Segment[]\n onChange: (segments: Segment[]) => void\n renderSegmentsToDOM: (segments: Segment[]) => void\n runTriggerDetection: () => void\n dismissTrigger: () => void\n triggers: TriggerConfig[]\n onPaste?: (data: { segments: Segment[]; source: 'internal' | 'external' }) => void\n onUndo?: (segments: Segment[]) => void\n onRedo?: (segments: Segment[]) => void\n onChipAdd?: (chip: ChipSegment) => void\n onImagePaste?: (file: File) => void\n}\n\ntype PromptAreaEventHandlers = {\n handlePaste: (e: React.ClipboardEvent<HTMLDivElement>) => void\n handleCopy: (e: React.ClipboardEvent<HTMLDivElement>) => void\n handleCut: (e: React.ClipboardEvent<HTMLDivElement>) => void\n handleDrop: (e: React.DragEvent<HTMLDivElement>) => void\n handleDragOver: (e: React.DragEvent<HTMLDivElement>) => void\n handleCompositionStart: () => void\n handleCompositionEnd: () => void\n handleBlur: () => void\n handleKeyDownForUndoRedo: (e: React.KeyboardEvent<HTMLDivElement>) => boolean\n pushUndo: (segments: Segment[]) => void\n resetUndoHistory: () => void\n isComposing: React.RefObject<boolean>\n}\n\n// ---------------------------------------------------------------------------\n// Undo/Redo Stack\n// ---------------------------------------------------------------------------\n\nconst MAX_UNDO_HISTORY = 100\n\n/** Delay before dismissing trigger on blur, so popover clicks register first */\nexport const BLUR_DELAY_MS = 150\n\ntype UndoState = {\n undoStack: Segment[][]\n redoStack: Segment[][]\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Encapsulates all edge-case event handlers for the prompt area component:\n * paste, copy, cut, drag/drop, IME composition, blur, and undo/redo.\n */\nexport function usePromptAreaEvents(deps: EventHandlerDeps): PromptAreaEventHandlers {\n const {\n editorRef,\n readSegmentsFromDOM,\n onChange,\n renderSegmentsToDOM,\n runTriggerDetection,\n dismissTrigger,\n triggers,\n onPaste: onPasteCallback,\n onUndo,\n onRedo,\n onChipAdd,\n onImagePaste,\n } = deps\n\n const isComposing = useRef(false)\n\n // -----------------------------------------------------------------------\n // Undo/redo stack (MAX_UNDO_HISTORY entries; clears redo on new push).\n // Invariants: stacks live in refs (not useState) so pushUndo /\n // resetUndoHistory / handleKeyDownForUndoRedo keep stable identity.\n // Destabilizing this would re-create handleInput / handleKeyDown /\n // imperative handle on every render and silently regress IME + debounced\n // undo in the parent hook.\n // -----------------------------------------------------------------------\n const undoState = useRef<UndoState>({ undoStack: [], redoStack: [] })\n\n const pushUndo = useCallback((segments: Segment[]) => {\n const state = undoState.current\n state.undoStack.push(segments)\n if (state.undoStack.length > MAX_UNDO_HISTORY) {\n state.undoStack.shift()\n }\n // Clear redo stack on new change\n state.redoStack = []\n }, [])\n\n const resetUndoHistory = useCallback(() => {\n undoState.current = { undoStack: [], redoStack: [] }\n }, [])\n\n // -----------------------------------------------------------------------\n // Paste: strip HTML, insert plain text only\n // -----------------------------------------------------------------------\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const editor = editorRef.current\n if (!editor) return\n\n // Check for image files in clipboard before processing text\n // Some browsers/OSes provide pasted images via `items` instead of `files` (e.g. screenshots)\n const imageFile =\n Array.from(e.clipboardData.files).find((f) => f.type.startsWith('image/')) ??\n (() => {\n const item = Array.from(e.clipboardData.items).find((i) => i.type.startsWith('image/'))\n return item?.getAsFile() ?? null\n })()\n if (imageFile) {\n onImagePaste?.(imageFile)\n return\n }\n\n // Record undo snapshot\n const currentSegments = readSegmentsFromDOM()\n pushUndo(currentSegments)\n\n // Check for internal segment data (copy/paste within the editor)\n const segmentJson = e.clipboardData.getData('text/prompt-area-segments')\n if (segmentJson) {\n const parsed = parseSegmentsFromClipboard(segmentJson)\n if (parsed && parsed.length > 0) {\n // Insert the copied segments at cursor position\n const range = getSelectionRange()\n if (!range) return\n\n range.deleteContents()\n\n // Merge pasted segments into current segments at cursor position\n const beforePaste = readSegmentsFromDOM()\n const merged = insertSegmentsAtCursor(beforePaste, parsed, editor)\n onChange(merged)\n renderSegmentsToDOM(merged)\n\n // Notify: internal paste with chip data preserved\n onPasteCallback?.({ segments: merged, source: 'internal' })\n for (const seg of parsed) {\n if (seg.type === 'chip') {\n onChipAdd?.(seg)\n }\n }\n\n runTriggerDetection()\n return\n }\n }\n\n // Fall back to plain text paste\n const text = e.clipboardData.getData('text/plain')\n if (!text) return\n\n // Insert plain text at cursor position using Selection API\n const range = getSelectionRange()\n if (!range) return\n\n range.deleteContents()\n\n // Handle multi-line paste: split into lines with BR elements\n const lines = text.split('\\n')\n const fragment = document.createDocumentFragment()\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i]) {\n fragment.appendChild(document.createTextNode(lines[i]))\n }\n if (i < lines.length - 1) {\n fragment.appendChild(document.createElement('br'))\n }\n }\n\n range.insertNode(fragment)\n\n // Move cursor to end of pasted content\n range.collapse(false)\n const sel = window.getSelection()\n sel?.removeAllRanges()\n sel?.addRange(range)\n\n // Normalize DOM, sync model, detect triggers\n normalizeEditorDOM(editor)\n const newSegments = readSegmentsFromDOM()\n\n // Auto-resolve trigger patterns in pasted text (e.g., #readme -> chip)\n const resolvedSegments = resolveTriggersInSegments(newSegments, triggers)\n\n if (resolvedSegments !== newSegments) {\n onChange(resolvedSegments)\n renderSegmentsToDOM(resolvedSegments)\n\n // Notify about auto-resolved chips from pasted text\n for (const seg of resolvedSegments) {\n if (\n seg.type === 'chip' &&\n !newSegments.some(\n (s) =>\n s.type === 'chip' &&\n s.trigger === seg.trigger &&\n s.value === seg.value &&\n s.displayText === seg.displayText,\n )\n ) {\n onChipAdd?.(seg)\n }\n }\n } else {\n onChange(newSegments)\n }\n\n onPasteCallback?.({ segments: resolvedSegments, source: 'external' })\n runTriggerDetection()\n },\n [\n editorRef,\n readSegmentsFromDOM,\n onChange,\n pushUndo,\n runTriggerDetection,\n renderSegmentsToDOM,\n triggers,\n onPasteCallback,\n onChipAdd,\n onImagePaste,\n ],\n )\n\n // -----------------------------------------------------------------------\n // Copy: serialize chips into plain text\n // -----------------------------------------------------------------------\n\n const handleCopy = useCallback((e: React.ClipboardEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const range = getSelectionRange()\n if (!range) return\n\n const fragment = range.cloneContents()\n\n // Walk fragment and serialize, converting chips to their text representation\n const plainText = serializeFragmentToPlainText(fragment)\n e.clipboardData.setData('text/plain', plainText)\n\n // Also serialize chip segments as JSON for internal paste\n const fragmentSegments = serializeFragmentToSegments(fragment)\n const hasChips = fragmentSegments.some((s) => s.type === 'chip')\n if (hasChips) {\n const json = safeJsonStringify(fragmentSegments)\n if (json) {\n e.clipboardData.setData('text/prompt-area-segments', json)\n }\n }\n }, [])\n\n // -----------------------------------------------------------------------\n // Cut: copy + delete\n // -----------------------------------------------------------------------\n\n const handleCut = useCallback(\n (e: React.ClipboardEvent<HTMLDivElement>) => {\n // First, do the copy\n handleCopy(e)\n\n // Then delete the selection\n const range = getSelectionRange()\n if (!range) return\n\n const currentSegments = readSegmentsFromDOM()\n pushUndo(currentSegments)\n\n range.deleteContents()\n\n const editor = editorRef.current\n if (editor) {\n normalizeEditorDOM(editor)\n }\n\n const newSegments = readSegmentsFromDOM()\n onChange(newSegments)\n runTriggerDetection()\n },\n [handleCopy, editorRef, readSegmentsFromDOM, onChange, pushUndo, runTriggerDetection],\n )\n\n // -----------------------------------------------------------------------\n // Drag & Drop: prevent to avoid unpredictable DOM mutations\n // -----------------------------------------------------------------------\n\n const handleDrop = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n }, [])\n\n // -----------------------------------------------------------------------\n // IME Composition: track state, defer trigger detection\n // -----------------------------------------------------------------------\n\n const handleCompositionStart = useCallback(() => {\n isComposing.current = true\n }, [])\n\n const handleCompositionEnd = useCallback(() => {\n isComposing.current = false\n // Run trigger detection after composition ends\n runTriggerDetection()\n }, [runTriggerDetection])\n\n // -----------------------------------------------------------------------\n // Blur: dismiss trigger dropdown with delay (so popover clicks work)\n // -----------------------------------------------------------------------\n\n const handleBlur = useCallback(() => {\n setTimeout(() => {\n const editor = editorRef.current\n if (!editor) return\n\n // Only dismiss if focus didn't move to an element within the editor container\n const activeEl = document.activeElement\n if (activeEl && editor.parentElement?.contains(activeEl)) return\n\n dismissTrigger()\n }, BLUR_DELAY_MS)\n }, [editorRef, dismissTrigger])\n\n // -----------------------------------------------------------------------\n // Undo/Redo: intercept Ctrl+Z / Ctrl+Shift+Z\n // -----------------------------------------------------------------------\n\n const handleKeyDownForUndoRedo = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>): boolean => {\n const isMeta = e.metaKey || e.ctrlKey\n\n if (!isMeta || e.key !== 'z') return false\n\n e.preventDefault()\n const state = undoState.current\n\n if (e.shiftKey) {\n // Redo: Ctrl+Shift+Z\n if (state.redoStack.length === 0) return true\n\n const segments = state.redoStack.pop()\n if (!segments) return true\n\n const current = readSegmentsFromDOM()\n state.undoStack.push(current)\n\n onChange(segments)\n renderSegmentsToDOM(segments)\n onRedo?.(segments)\n } else {\n // Undo: Ctrl+Z\n if (state.undoStack.length === 0) return true\n\n const segments = state.undoStack.pop()\n if (!segments) return true\n\n const current = readSegmentsFromDOM()\n state.redoStack.push(current)\n\n onChange(segments)\n renderSegmentsToDOM(segments)\n onUndo?.(segments)\n }\n\n return true\n },\n [readSegmentsFromDOM, onChange, renderSegmentsToDOM, onUndo, onRedo],\n )\n\n return {\n handlePaste,\n handleCopy,\n handleCut,\n handleDrop,\n handleDragOver,\n handleCompositionStart,\n handleCompositionEnd,\n handleBlur,\n handleKeyDownForUndoRedo,\n pushUndo,\n resetUndoHistory,\n isComposing,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { TriggerConfig, TriggerSuggestion } from './types'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype UseTriggerSearchReturn = {\n suggestions: TriggerSuggestion[]\n suggestionsLoading: boolean\n suggestionsError: string | null\n /** Run a search for the given query using the trigger's onSearch config. */\n search: (query: string, config: TriggerConfig) => void\n /** Cancel any in-flight search and reset state. */\n reset: () => void\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Manages async trigger search lifecycle: debouncing, AbortController\n * cancellation, race-condition prevention, loading/error state.\n *\n * Extracted from `usePromptArea` so the main hook stays focused on\n * editing concerns while this hook owns the data-fetching side.\n */\nexport function useTriggerSearch(): UseTriggerSearchReturn {\n const [suggestions, setSuggestions] = useState<TriggerSuggestion[]>([])\n const [suggestionsLoading, setSuggestionsLoading] = useState(false)\n const [suggestionsError, setSuggestionsError] = useState<string | null>(null)\n\n // Version counter – belt-and-suspenders alongside AbortController\n const searchVersion = useRef(0)\n // AbortController for cancelling in-flight async searches\n const abortController = useRef<AbortController | null>(null)\n // Debounce timer for search queries\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const reset = useCallback(() => {\n abortController.current?.abort()\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\n setSuggestions([])\n setSuggestionsLoading(false)\n setSuggestionsError(null)\n }, [])\n\n const search = useCallback((query: string, config: TriggerConfig) => {\n if (!config.onSearch) return\n\n // Cancel any previous in-flight request and pending debounce\n abortController.current?.abort()\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\n\n setSuggestionsLoading(true)\n setSuggestionsError(null)\n searchVersion.current++\n const version = searchVersion.current\n\n const controller = new AbortController()\n abortController.current = controller\n const { onSearch, onSearchError, searchDebounceMs } = config\n\n const executeSearch = () => {\n const result = onSearch(query, { signal: controller.signal })\n\n if (result instanceof Promise) {\n void result.then(\n (items) => {\n if (controller.signal.aborted || searchVersion.current !== version) return\n setSuggestions(items)\n setSuggestionsLoading(false)\n },\n (error: unknown) => {\n if (controller.signal.aborted || searchVersion.current !== version) return\n // Silently ignore AbortError (expected when superseded)\n if (error instanceof DOMException && error.name === 'AbortError') return\n setSuggestionsError(error instanceof Error ? error.message : 'Search failed')\n setSuggestionsLoading(false)\n onSearchError?.(error)\n },\n )\n } else {\n setSuggestions(result)\n setSuggestionsLoading(false)\n }\n }\n\n // Debounce subsequent searches but fire immediately for the initial empty query\n if (searchDebounceMs && searchDebounceMs > 0 && query.length > 0) {\n debounceTimer.current = setTimeout(executeSearch, searchDebounceMs)\n } else {\n executeSearch()\n }\n }, [])\n\n // Clean up on unmount\n useEffect(() => {\n return () => {\n abortController.current?.abort()\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\n }\n }, [])\n\n return {\n suggestions,\n suggestionsLoading,\n suggestionsError,\n search,\n reset,\n }\n}\n","'use client'\n\nimport { cn } from '@/lib/utils'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n Segment,\n TriggerConfig,\n ActiveTrigger,\n TriggerSuggestion,\n ChipSegment,\n PromptAreaHandle,\n} from './types'\nimport {\n detectActiveTrigger,\n segmentsToPlainText,\n segmentsEqual,\n resolveChip,\n removeChipAtIndex,\n revertChipAtIndex,\n replaceTextRange,\n toggleMarkdownWrap,\n} from './prompt-area-engine'\nimport {\n getListContext,\n autoFormatListPrefix,\n insertListContinuation,\n indentListItem,\n outdentListItem,\n removeListPrefix,\n normalizeListPrefixes,\n} from './prompt-area-list-ops'\nimport {\n isHTMLElement,\n isChipElement,\n isLinkElement,\n isBRElement,\n getChipTrigger,\n getChipValue,\n getChipDisplay,\n getChipData,\n getChipAutoResolved,\n getDirectChildContaining,\n indexOfChildNode,\n normalizeEditorDOM,\n decorateURLsInEditor,\n decorateMarkdownInEditor,\n safeJsonStringify,\n getSelectionRange,\n} from './dom-helpers'\nimport {\n saveCursorPosition,\n restoreCursorPosition,\n getCursorOffset,\n setCursorAtOffset,\n createRangeAtOffset,\n getSelectionOffsets,\n setSelectionAtOffsets,\n} from './cursor-helpers'\nimport { usePromptAreaEvents } from './use-prompt-area-events'\nimport { useTriggerSearch } from './use-trigger-search'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype UsePromptAreaOptions = {\n value: Segment[]\n onChange: (segments: Segment[]) => void\n triggers?: TriggerConfig[]\n onSubmit?: (segments: Segment[]) => void\n onEscape?: () => void\n onChipClick?: (chip: ChipSegment) => void\n onChipAdd?: (chip: ChipSegment) => void\n onChipDelete?: (chip: ChipSegment) => void\n onLinkClick?: (url: string) => void\n onPaste?: (data: { segments: Segment[]; source: 'internal' | 'external' }) => void\n onUndo?: (segments: Segment[]) => void\n onRedo?: (segments: Segment[]) => void\n onImagePaste?: (file: File) => void\n markdown?: boolean\n}\n\ntype UsePromptAreaReturn = {\n editorRef: React.RefObject<HTMLDivElement | null>\n activeTrigger: ActiveTrigger | null\n suggestions: TriggerSuggestion[]\n suggestionsLoading: boolean\n suggestionsError: string | null\n selectedSuggestionIndex: number\n handleInput: () => void\n handleKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void\n handleClick: (e: React.MouseEvent<HTMLDivElement>) => void\n selectSuggestion: (suggestion: TriggerSuggestion) => void\n dismissTrigger: () => void\n handle: PromptAreaHandle\n triggerRect: DOMRect | null\n eventHandlers: {\n onPaste: (e: React.ClipboardEvent<HTMLDivElement>) => void\n onCopy: (e: React.ClipboardEvent<HTMLDivElement>) => void\n onCut: (e: React.ClipboardEvent<HTMLDivElement>) => void\n onDrop: (e: React.DragEvent<HTMLDivElement>) => void\n onDragOver: (e: React.DragEvent<HTMLDivElement>) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n onBlur: () => void\n }\n}\n\n/** Debounce interval for grouping typed characters into a single undo snapshot */\nconst UNDO_DEBOUNCE_MS = 300\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function usePromptArea({\n value,\n onChange,\n triggers = [],\n onSubmit,\n onEscape,\n onChipClick,\n onChipAdd,\n onChipDelete,\n onLinkClick,\n onPaste,\n onUndo,\n onRedo,\n onImagePaste,\n markdown: markdownEnabled = true,\n}: UsePromptAreaOptions): UsePromptAreaReturn {\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [activeTrigger, setActiveTrigger] = useState<ActiveTrigger | null>(null)\n const [selectedSuggestionIndex, setSelectedSuggestionIndex] = useState(0)\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null)\n\n const {\n suggestions,\n suggestionsLoading,\n suggestionsError,\n search: runSearch,\n reset: resetSearch,\n } = useTriggerSearch()\n\n // Guard against circular DOM <-> model syncs\n const isSyncing = useRef(false)\n const lastRenderedValue = useRef<Segment[]>([])\n\n // Debounced undo: groups consecutive keystrokes into a single undo snapshot\n const undoTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const undoBaseState = useRef<Segment[] | null>(null)\n\n // -----------------------------------------------------------------------\n // DOM -> Model: read segments from the contentEditable DOM\n // -----------------------------------------------------------------------\n\n const readSegmentsFromDOM = useCallback((): Segment[] => {\n const editor = editorRef.current\n if (!editor) return []\n\n const segments: Segment[] = []\n\n for (let i = 0; i < editor.childNodes.length; i++) {\n const node = editor.childNodes[i]\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? ''\n if (text) {\n segments.push({ type: 'text', text })\n }\n } else if (isChipElement(node)) {\n // Type-safe chip reading via type guards\n const trigger = getChipTrigger(node)\n const chipValue = getChipValue(node)\n const display = getChipDisplay(node)\n const data = getChipData(node)\n\n if (trigger && chipValue !== undefined && display) {\n const autoResolved = getChipAutoResolved(node)\n segments.push({\n type: 'chip',\n trigger,\n value: chipValue,\n displayText: display,\n ...(data !== undefined ? { data } : {}),\n ...(autoResolved ? { autoResolved: true } : {}),\n })\n }\n } else if (isBRElement(node)) {\n if (node.dataset.sentinel) continue // skip sentinel <br>\n segments.push({ type: 'text', text: '\\n' })\n } else if (isHTMLElement(node)) {\n // Unknown element — extract text content\n const text = node.textContent ?? ''\n if (text) {\n segments.push({ type: 'text', text })\n }\n }\n }\n\n return segments\n }, [])\n\n // -----------------------------------------------------------------------\n // Model -> DOM: render segments into the contentEditable div\n // -----------------------------------------------------------------------\n\n const renderSegmentsToDOM = useCallback(\n (segments: Segment[]) => {\n const editor = editorRef.current\n if (!editor) return\n\n isSyncing.current = true\n\n const savedCursor = saveCursorPosition(editor)\n\n // Clear DOM safely (no innerHTML assignment)\n while (editor.firstChild) {\n editor.removeChild(editor.firstChild)\n }\n\n for (const seg of segments) {\n if (seg.type === 'text') {\n const lines = seg.text.split('\\n')\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n if (lines[lineIdx]) {\n editor.appendChild(document.createTextNode(lines[lineIdx]))\n }\n if (lineIdx < lines.length - 1) {\n editor.appendChild(document.createElement('br'))\n }\n }\n } else {\n // Render chip as non-editable span\n const chip = document.createElement('span')\n chip.contentEditable = 'false'\n chip.dataset.chipTrigger = seg.trigger\n chip.dataset.chipValue = seg.value\n chip.dataset.chipDisplay = seg.displayText\n if (seg.data !== undefined) {\n const json = safeJsonStringify(seg.data)\n if (json) {\n chip.dataset.chipData = json\n }\n }\n if (seg.autoResolved) {\n chip.dataset.chipAutoResolved = 'true'\n }\n const triggerConfig = triggers.find((t) => t.char === seg.trigger)\n const chipStyle = triggerConfig?.chipStyle ?? 'pill'\n chip.dataset.chipStyle = chipStyle\n chip.className = cn(\n 'prompt-area-chip',\n chipStyle === 'inline' && 'prompt-area-chip--inline',\n triggerConfig?.chipClassName,\n )\n chip.textContent = `${seg.trigger}${seg.displayText}`\n chip.setAttribute('role', 'button')\n chip.setAttribute('tabindex', '-1')\n editor.appendChild(chip)\n }\n }\n\n // Append sentinel <br> so trailing newlines are visible in contentEditable\n if (editor.lastChild && isBRElement(editor.lastChild)) {\n const sentinel = document.createElement('br')\n sentinel.dataset.sentinel = 'true'\n editor.appendChild(sentinel)\n }\n\n // Decorate URLs and markdown formatting in text nodes\n decorateURLsInEditor(editor)\n if (markdownEnabled) decorateMarkdownInEditor(editor)\n\n if (savedCursor) {\n restoreCursorPosition(editor, savedCursor)\n }\n\n lastRenderedValue.current = segments\n isSyncing.current = false\n },\n [triggers, markdownEnabled],\n )\n\n // -----------------------------------------------------------------------\n // Trigger detection (extracted so events module can call it)\n // -----------------------------------------------------------------------\n\n const runTriggerDetection = useCallback(() => {\n const editor = editorRef.current\n if (!editor) return\n\n const segments = readSegmentsFromDOM()\n const plainText = segmentsToPlainText(segments)\n const cursorPos = getCursorOffset(editor)\n\n if (cursorPos === null) return\n\n const detected = detectActiveTrigger(plainText, cursorPos, triggers)\n\n if (detected) {\n setActiveTrigger(detected)\n setSelectedSuggestionIndex(0)\n\n // Position the popover at the trigger character, not the cursor.\n // Build a range at detected.startOffset so the dropdown anchors to\n // the trigger char even when the cursor has moved past it.\n const triggerRange = createRangeAtOffset(editor, detected.startOffset)\n if (triggerRange) {\n const rect = triggerRange.getBoundingClientRect()\n // A zero rect means the range couldn't be mapped (e.g. after DOM\n // re-render). Skip updating triggerRect so we keep the last valid one.\n if (rect.height > 0 || rect.left > 0 || rect.top > 0) {\n setTriggerRect(rect)\n }\n }\n\n // Fetch suggestions for dropdown mode\n if (detected.config.mode === 'dropdown' && detected.config.onSearch) {\n runSearch(detected.query, detected.config)\n }\n\n // Fire callback for callback mode\n if (detected.config.mode === 'callback' && detected.config.onActivate) {\n detected.config.onActivate({\n text: plainText,\n cursorPosition: cursorPos,\n insertChip: (chip) => {\n const chipResult = resolveChip(segments, detected, {\n value: chip.value,\n displayText: chip.displayText,\n data: chip.data,\n })\n onChange(chipResult.segments)\n renderSegmentsToDOM(chipResult.segments)\n\n onChipAdd?.({\n type: 'chip',\n trigger: detected.config.char,\n value: chip.value,\n displayText: chip.displayText,\n ...(chip.data !== undefined ? { data: chip.data } : {}),\n })\n\n const editor = editorRef.current\n if (editor) {\n setCursorAtOffset(editor, chipResult.cursorOffset)\n }\n },\n })\n }\n } else {\n setActiveTrigger(null)\n resetSearch()\n }\n }, [\n triggers,\n readSegmentsFromDOM,\n onChange,\n renderSegmentsToDOM,\n onChipAdd,\n resetSearch,\n runSearch,\n ])\n\n // -----------------------------------------------------------------------\n // Dismiss trigger\n // -----------------------------------------------------------------------\n\n const dismissTrigger = useCallback(() => {\n setActiveTrigger(null)\n setSelectedSuggestionIndex(0)\n resetSearch()\n }, [resetSearch])\n\n // -----------------------------------------------------------------------\n // Wire up edge-case event handlers\n // -----------------------------------------------------------------------\n\n const events = usePromptAreaEvents({\n editorRef,\n readSegmentsFromDOM,\n onChange,\n renderSegmentsToDOM,\n runTriggerDetection,\n dismissTrigger,\n triggers,\n onPaste,\n onUndo,\n onRedo,\n onChipAdd,\n onImagePaste,\n })\n\n // -----------------------------------------------------------------------\n // Sync value prop -> DOM on external changes\n // -----------------------------------------------------------------------\n\n useEffect(() => {\n if (isSyncing.current) return\n if (segmentsEqual(value, lastRenderedValue.current)) return\n\n // Normalize list prefixes (e.g., \"- \" → \"• \" when markdown is on)\n // so externally-provided segments render bullet characters correctly.\n if (markdownEnabled) {\n const normalized = normalizeListPrefixes(value, true)\n if (normalized !== value) {\n onChange(normalized)\n return // onChange will trigger a re-render with the normalized value\n }\n }\n\n renderSegmentsToDOM(value)\n }, [value, renderSegmentsToDOM, markdownEnabled, onChange])\n\n // Re-render when markdown mode changes to apply/strip decorations\n // Also convert bullet characters: • ↔ - in text segments\n const prevMarkdown = useRef(markdownEnabled)\n useEffect(() => {\n if (prevMarkdown.current === markdownEnabled) return\n prevMarkdown.current = markdownEnabled\n\n const converted = normalizeListPrefixes(value, markdownEnabled)\n if (converted !== value) {\n onChange(converted)\n } else {\n renderSegmentsToDOM(value)\n }\n }, [markdownEnabled, renderSegmentsToDOM, value, onChange])\n\n // Clean up undo debounce timer on unmount\n useEffect(() => {\n return () => {\n if (undoTimer.current) clearTimeout(undoTimer.current)\n }\n }, [])\n\n // -----------------------------------------------------------------------\n // Handle input events\n // -----------------------------------------------------------------------\n\n const handleInput = useCallback(() => {\n if (isSyncing.current) return\n\n // During IME composition, sync model but skip trigger detection\n if (events.isComposing.current) {\n const segments = readSegmentsFromDOM()\n lastRenderedValue.current = segments\n onChange(segments)\n return\n }\n\n const editor = editorRef.current\n\n // Capture cursor offset BEFORE normalizeEditorDOM strips <a> elements,\n // otherwise the anchor node becomes detached and we lose the position.\n const savedCursorOffset = editor ? getCursorOffset(editor) : null\n\n if (editor) {\n // Normalize browser-inserted block elements (div, p, font, a, etc.)\n normalizeEditorDOM(editor)\n }\n\n const segments = readSegmentsFromDOM()\n\n // Check for list auto-formatting (e.g., \"- \" -> \"bullet \")\n if (markdownEnabled && editor && savedCursorOffset !== null) {\n const formatted = autoFormatListPrefix(segments, savedCursorOffset)\n if (formatted) {\n lastRenderedValue.current = formatted.segments\n onChange(formatted.segments)\n renderSegmentsToDOM(formatted.segments)\n setCursorAtOffset(editor, formatted.cursorOffset)\n runTriggerDetection()\n return\n }\n }\n\n // Debounced undo: capture the pre-edit state at the start of a typing\n // session and push it to the undo stack after UNDO_DEBOUNCE_MS of idle.\n if (!undoBaseState.current) {\n undoBaseState.current = lastRenderedValue.current\n }\n\n lastRenderedValue.current = segments\n onChange(segments)\n if (undoTimer.current) clearTimeout(undoTimer.current)\n undoTimer.current = setTimeout(() => {\n if (undoBaseState.current) {\n events.pushUndo(undoBaseState.current)\n undoBaseState.current = null\n }\n undoTimer.current = null\n }, UNDO_DEBOUNCE_MS)\n\n // Decorate URLs and markdown formatting in text nodes\n if (editor) {\n decorateURLsInEditor(editor)\n if (markdownEnabled) decorateMarkdownInEditor(editor)\n if (savedCursorOffset !== null) {\n setCursorAtOffset(editor, savedCursorOffset)\n }\n }\n\n runTriggerDetection()\n }, [\n onChange,\n readSegmentsFromDOM,\n runTriggerDetection,\n renderSegmentsToDOM,\n markdownEnabled,\n events,\n ])\n\n // -----------------------------------------------------------------------\n // Chip click delegation\n // -----------------------------------------------------------------------\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target\n if (!(target instanceof Node)) return\n\n const editor = editorRef.current\n if (!editor) return\n\n // Walk from the click target up to find a link or chip element\n let node: Node | null = target\n while (node && node !== editor) {\n // Check for URL link click — only navigate on Cmd/Ctrl+Click;\n // plain click just positions the cursor for editing.\n if (isLinkElement(node)) {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault()\n onLinkClick?.(node.href)\n window.open(node.href, '_blank', 'noopener,noreferrer')\n return\n }\n // Plain click: let the browser place the cursor inside the link text\n break\n }\n\n if (isChipElement(node)) {\n // Spawn ripple effect\n const chipEl = node as HTMLElement\n const rect = chipEl.getBoundingClientRect()\n const ripple = document.createElement('span')\n ripple.className = 'prompt-area-chip-ripple'\n const size = Math.max(rect.width, rect.height)\n ripple.style.width = `${size}px`\n ripple.style.height = `${size}px`\n ripple.style.left = `${e.clientX - rect.left - size / 2}px`\n ripple.style.top = `${e.clientY - rect.top - size / 2}px`\n chipEl.appendChild(ripple)\n ripple.addEventListener('animationend', () => ripple.remove())\n\n if (!onChipClick) return\n const trigger = getChipTrigger(node)\n const chipValue = getChipValue(node)\n const display = getChipDisplay(node)\n const data = getChipData(node)\n\n if (trigger && chipValue !== undefined && display) {\n const autoResolved = getChipAutoResolved(node)\n const chip: ChipSegment = {\n type: 'chip',\n trigger,\n value: chipValue,\n displayText: display,\n ...(data !== undefined ? { data } : {}),\n ...(autoResolved ? { autoResolved: true } : {}),\n }\n onChipClick(chip)\n }\n return\n }\n node = node.parentNode\n }\n },\n [onChipClick, onLinkClick],\n )\n\n // -----------------------------------------------------------------------\n // Remove a chip node from DOM and sync model\n // -----------------------------------------------------------------------\n\n const removeChipNodeFromDOM = useCallback(\n (editor: HTMLElement, chipNode: HTMLElement): boolean => {\n const segments = readSegmentsFromDOM()\n const chipIdx = indexOfChildNode(editor, chipNode)\n if (chipIdx === -1) return false\n\n // Map DOM child index to segment index\n let segIdx = 0\n for (let i = 0; i < chipIdx; i++) {\n const child = editor.childNodes[i]\n if (child.nodeType === Node.TEXT_NODE && (child.textContent ?? '') !== '') {\n segIdx++\n } else if (isChipElement(child)) {\n segIdx++\n } else if (isBRElement(child)) {\n segIdx++\n }\n }\n\n const deletedChip = segments[segIdx]\n const newSegments = removeChipAtIndex(segments, segIdx)\n onChange(newSegments)\n renderSegmentsToDOM(newSegments)\n\n if (deletedChip?.type === 'chip') {\n onChipDelete?.(deletedChip)\n }\n\n return true\n },\n [readSegmentsFromDOM, onChange, renderSegmentsToDOM, onChipDelete],\n )\n\n // -----------------------------------------------------------------------\n // Revert an auto-resolved chip back to plain text\n // -----------------------------------------------------------------------\n\n const revertChipNodeToText = useCallback(\n (editor: HTMLElement, chipNode: HTMLElement): boolean => {\n const segments = readSegmentsFromDOM()\n const chipIdx = indexOfChildNode(editor, chipNode)\n if (chipIdx === -1) return false\n\n // Map DOM child index to segment index\n let segIdx = 0\n for (let i = 0; i < chipIdx; i++) {\n const child = editor.childNodes[i]\n if (child.nodeType === Node.TEXT_NODE && (child.textContent ?? '') !== '') {\n segIdx++\n } else if (isChipElement(child)) {\n segIdx++\n } else if (isBRElement(child)) {\n segIdx++\n }\n }\n\n const revertedChip = segments[segIdx]\n const result = revertChipAtIndex(segments, segIdx)\n if (!result) return false\n\n // Compute cursor target: plain text offset at end of reverted text\n let targetOffset = 0\n for (let i = 0; i < segIdx; i++) {\n const s = segments[i]\n if (s.type === 'text') {\n targetOffset += s.text.length\n } else {\n targetOffset += s.trigger.length + s.displayText.length\n }\n }\n targetOffset += result.revertedText.length\n\n onChange(result.segments)\n renderSegmentsToDOM(result.segments)\n setCursorAtOffset(editor, targetOffset)\n\n if (revertedChip?.type === 'chip') {\n onChipDelete?.(revertedChip)\n }\n\n return true\n },\n [readSegmentsFromDOM, onChange, renderSegmentsToDOM, onChipDelete],\n )\n\n // -----------------------------------------------------------------------\n // Chip backspace (delete chip behind cursor as whole unit)\n // -----------------------------------------------------------------------\n\n const handleChipBackspace = useCallback((): boolean => {\n const editor = editorRef.current\n if (!editor) return false\n\n const range = getSelectionRange()\n if (!range || !range.collapsed) return false\n\n const node = range.startContainer\n const offset = range.startOffset\n\n // Case 1: cursor is at the editor level (between child nodes)\n if (node === editor && offset > 0) {\n const prevChild = editor.childNodes[offset - 1]\n if (prevChild && isChipElement(prevChild)) {\n if (getChipAutoResolved(prevChild)) {\n return revertChipNodeToText(editor, prevChild)\n }\n return removeChipNodeFromDOM(editor, prevChild)\n }\n }\n\n // Case 2: cursor is at start of a text node, check previous sibling\n if (node.nodeType === Node.TEXT_NODE && offset === 0) {\n const directChild = getDirectChildContaining(editor, node)\n if (!directChild) return false\n\n let prevSibling = directChild.previousSibling\n while (\n prevSibling &&\n prevSibling.nodeType === Node.TEXT_NODE &&\n prevSibling.textContent === ''\n ) {\n prevSibling = prevSibling.previousSibling\n }\n if (prevSibling && isChipElement(prevSibling)) {\n if (getChipAutoResolved(prevSibling)) {\n return revertChipNodeToText(editor, prevSibling)\n }\n return removeChipNodeFromDOM(editor, prevSibling)\n }\n }\n\n return false\n }, [removeChipNodeFromDOM, revertChipNodeToText])\n\n // -----------------------------------------------------------------------\n // Chip forward delete (delete chip in front of cursor)\n // -----------------------------------------------------------------------\n\n const handleChipForwardDelete = useCallback((): boolean => {\n const editor = editorRef.current\n if (!editor) return false\n\n const range = getSelectionRange()\n if (!range || !range.collapsed) return false\n\n const node = range.startContainer\n const offset = range.startOffset\n\n // Case 1: cursor at the editor level\n if (node === editor && offset < editor.childNodes.length) {\n const nextChild = editor.childNodes[offset]\n if (nextChild && isChipElement(nextChild)) {\n return removeChipNodeFromDOM(editor, nextChild)\n }\n }\n\n // Case 2: cursor at end of a text node, check next sibling\n if (node.nodeType === Node.TEXT_NODE && offset === (node.textContent ?? '').length) {\n const directChild = getDirectChildContaining(editor, node)\n if (!directChild) return false\n\n let nextSibling = directChild.nextSibling\n while (\n nextSibling &&\n nextSibling.nodeType === Node.TEXT_NODE &&\n nextSibling.textContent === ''\n ) {\n nextSibling = nextSibling.nextSibling\n }\n if (nextSibling && isChipElement(nextSibling)) {\n return removeChipNodeFromDOM(editor, nextSibling)\n }\n }\n\n return false\n }, [removeChipNodeFromDOM])\n\n // -----------------------------------------------------------------------\n // Auto-resolve active trigger on space\n // -----------------------------------------------------------------------\n\n const autoResolveActiveTrigger = useCallback(\n (trigger: ActiveTrigger) => {\n const segments = readSegmentsFromDOM()\n const query = trigger.query\n\n // Create a synthetic suggestion so onSelect can customize display text\n const syntheticSuggestion: TriggerSuggestion = {\n value: query,\n label: query,\n }\n\n const displayText = trigger.config.onSelect?.(syntheticSuggestion) ?? query\n\n const chipData = {\n value: query,\n displayText: displayText || query,\n autoResolved: true,\n }\n const result = resolveChip(segments, trigger, chipData)\n\n onChange(result.segments)\n renderSegmentsToDOM(result.segments)\n\n onChipAdd?.({\n type: 'chip',\n trigger: trigger.config.char,\n ...chipData,\n })\n\n // Position cursor after the auto-resolved chip + trailing space\n const editor = editorRef.current\n if (editor) {\n setCursorAtOffset(editor, result.cursorOffset)\n }\n\n dismissTrigger()\n },\n [readSegmentsFromDOM, onChange, renderSegmentsToDOM, dismissTrigger, onChipAdd],\n )\n\n // -----------------------------------------------------------------------\n // Select a suggestion from the dropdown\n // -----------------------------------------------------------------------\n\n const selectSuggestionInternal = useCallback(\n (suggestion: TriggerSuggestion) => {\n if (!activeTrigger) return\n\n const segments = readSegmentsFromDOM()\n const displayText = activeTrigger.config.onSelect?.(suggestion) ?? suggestion.label\n\n const chipData = {\n value: suggestion.value,\n displayText: displayText || suggestion.label,\n data: suggestion.data,\n }\n const result = resolveChip(segments, activeTrigger, chipData)\n\n onChange(result.segments)\n renderSegmentsToDOM(result.segments)\n\n onChipAdd?.({\n type: 'chip',\n trigger: activeTrigger.config.char,\n ...chipData,\n })\n\n // Position cursor after the chip + trailing space\n const editor = editorRef.current\n if (editor) {\n setCursorAtOffset(editor, result.cursorOffset)\n }\n\n dismissTrigger()\n\n // Refocus editor after popover interaction\n setTimeout(() => {\n editorRef.current?.focus()\n }, 0)\n },\n [activeTrigger, readSegmentsFromDOM, onChange, renderSegmentsToDOM, dismissTrigger, onChipAdd],\n )\n\n const selectSuggestion = selectSuggestionInternal\n\n // -----------------------------------------------------------------------\n // Handle key events\n // -----------------------------------------------------------------------\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const applyEditResult = (\n editor: HTMLDivElement,\n result: { segments: Segment[]; cursorOffset: number },\n ) => {\n lastRenderedValue.current = result.segments\n onChange(result.segments)\n renderSegmentsToDOM(result.segments)\n setCursorAtOffset(editor, result.cursorOffset)\n }\n\n const tryListContinuation = (editor: HTMLDivElement): boolean => {\n if (!markdownEnabled) return false\n const segments = readSegmentsFromDOM()\n const cursorPos = getCursorOffset(editor)\n if (cursorPos === null) return false\n const plainText = segmentsToPlainText(segments)\n if (!getListContext(plainText, cursorPos)) return false\n const result = insertListContinuation(segments, cursorPos)\n if (result) applyEditResult(editor, result)\n return true\n }\n\n // 1. Flush pending undo debounce so Cmd+Z has the latest checkpoint\n if ((e.metaKey || e.ctrlKey) && e.key === 'z' && undoBaseState.current) {\n if (undoTimer.current) {\n clearTimeout(undoTimer.current)\n undoTimer.current = null\n }\n events.pushUndo(undoBaseState.current)\n undoBaseState.current = null\n }\n\n // 1a. Undo/redo intercept\n if (events.handleKeyDownForUndoRedo(e)) return\n\n // 1.5 Markdown formatting shortcuts (Cmd+B bold, Cmd+I italic)\n if (\n markdownEnabled &&\n (e.metaKey || e.ctrlKey) &&\n !e.shiftKey &&\n (e.key === 'b' || e.key === 'i')\n ) {\n e.preventDefault()\n const editor = editorRef.current\n if (!editor) return\n\n const offsets = getSelectionOffsets(editor)\n if (!offsets || offsets.start === offsets.end) return\n\n const marker = e.key === 'b' ? '**' : '*'\n const currentSegments = readSegmentsFromDOM()\n events.pushUndo(currentSegments)\n\n const result = toggleMarkdownWrap(currentSegments, offsets.start, offsets.end, marker)\n if (!result) return\n\n lastRenderedValue.current = result.segments\n onChange(result.segments)\n renderSegmentsToDOM(result.segments)\n setSelectionAtOffsets(editor, result.selectionStart, result.selectionEnd)\n return\n }\n\n // 2. Trigger dropdown navigation\n if (activeTrigger && activeTrigger.config.mode === 'dropdown' && suggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setSelectedSuggestionIndex((prev) => Math.min(prev + 1, suggestions.length - 1))\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n setSelectedSuggestionIndex((prev) => Math.max(prev - 1, 0))\n return\n }\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault()\n const selected = suggestions[selectedSuggestionIndex]\n if (selected) {\n selectSuggestionInternal(selected)\n }\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n dismissTrigger()\n return\n }\n }\n\n // 2.5. Auto-resolve on Space when trigger has resolveOnSpace\n if (e.key === ' ' && activeTrigger && activeTrigger.config.resolveOnSpace) {\n const query = activeTrigger.query.trim()\n if (query.length > 0) {\n e.preventDefault()\n autoResolveActiveTrigger(activeTrigger)\n return\n }\n }\n\n // 2.6. Tab/Shift+Tab for list indentation (only when trigger dropdown is NOT open)\n if (markdownEnabled && e.key === 'Tab' && !activeTrigger) {\n const editor = editorRef.current\n if (editor) {\n const segments = readSegmentsFromDOM()\n const plainText = segmentsToPlainText(segments)\n const cursorPos = getCursorOffset(editor)\n if (cursorPos !== null) {\n const ctx = getListContext(plainText, cursorPos)\n if (ctx) {\n e.preventDefault()\n const result = e.shiftKey\n ? outdentListItem(segments, cursorPos)\n : indentListItem(segments, cursorPos)\n if (result) applyEditResult(editor, result)\n return\n }\n }\n }\n }\n\n // 2.8 Shift+Enter: insert newline at model level (avoids browser's broken\n // contentEditable behavior near <a> elements)\n if (e.key === 'Enter' && e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n const editor = editorRef.current\n if (editor) {\n // Check for list continuation first (same as Enter)\n if (tryListContinuation(editor)) return\n // Fallback: plain newline (existing behavior)\n const offsets = getSelectionOffsets(editor)\n if (offsets) {\n const currentSegments = readSegmentsFromDOM()\n events.pushUndo(currentSegments)\n const newSegments = replaceTextRange(currentSegments, offsets.start, offsets.end, '\\n')\n applyEditResult(editor, { segments: newSegments, cursorOffset: offsets.start + 1 })\n }\n }\n return\n }\n\n // 3. Submit on Enter (without Shift), skip during IME\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n // 3a. Check for list continuation first (only when markdown is enabled)\n const editor = editorRef.current\n if (editor && tryListContinuation(editor)) {\n e.preventDefault()\n return\n }\n\n // 3b. Submit (if no list context)\n if (onSubmit) {\n e.preventDefault()\n onSubmit(readSegmentsFromDOM())\n return\n }\n }\n\n // 4. Escape\n if (e.key === 'Escape' && onEscape) {\n onEscape()\n return\n }\n\n // 4.5 Non-collapsed selection delete (Backspace/Delete across <a> boundaries)\n if ((e.key === 'Backspace' || e.key === 'Delete') && !e.nativeEvent.isComposing) {\n const editor = editorRef.current\n if (editor) {\n const offsets = getSelectionOffsets(editor)\n if (offsets && offsets.start !== offsets.end) {\n e.preventDefault()\n const currentSegments = readSegmentsFromDOM()\n events.pushUndo(currentSegments)\n const newSegments = replaceTextRange(currentSegments, offsets.start, offsets.end, '')\n applyEditResult(editor, { segments: newSegments, cursorOffset: offsets.start })\n runTriggerDetection()\n return\n }\n }\n }\n\n // 5. Backspace: check list prefix removal, then chip deletion\n if (e.key === 'Backspace') {\n const editor = editorRef.current\n if (editor) {\n const segments = readSegmentsFromDOM()\n const cursorPos = getCursorOffset(editor)\n if (markdownEnabled && cursorPos !== null) {\n const result = removeListPrefix(segments, cursorPos)\n if (result) {\n e.preventDefault()\n applyEditResult(editor, result)\n runTriggerDetection()\n return\n }\n }\n }\n if (handleChipBackspace()) {\n e.preventDefault()\n runTriggerDetection()\n return\n }\n }\n\n // 6. Delete (forward): delete chip as whole unit\n if (e.key === 'Delete' && handleChipForwardDelete()) {\n e.preventDefault()\n runTriggerDetection()\n return\n }\n },\n [\n activeTrigger,\n suggestions,\n selectedSuggestionIndex,\n onSubmit,\n onEscape,\n readSegmentsFromDOM,\n onChange,\n renderSegmentsToDOM,\n markdownEnabled,\n dismissTrigger,\n handleChipBackspace,\n handleChipForwardDelete,\n autoResolveActiveTrigger,\n runTriggerDetection,\n selectSuggestionInternal,\n events,\n ],\n )\n\n // -----------------------------------------------------------------------\n // Imperative handle (memoized to avoid identity changes)\n // -----------------------------------------------------------------------\n\n const handle: PromptAreaHandle = useMemo(\n () => ({\n focus: () => editorRef.current?.focus(),\n blur: () => editorRef.current?.blur(),\n insertChip: (chip) => {\n const segments = readSegmentsFromDOM()\n const newChip: ChipSegment = { type: 'chip', ...chip }\n const newSegments: Segment[] = [...segments, newChip, { type: 'text', text: ' ' }]\n onChange(newSegments)\n renderSegmentsToDOM(newSegments)\n onChipAdd?.(newChip)\n },\n getPlainText: () => segmentsToPlainText(readSegmentsFromDOM()),\n clear: () => {\n onChange([])\n const editor = editorRef.current\n if (editor) {\n while (editor.firstChild) editor.removeChild(editor.firstChild)\n }\n events.resetUndoHistory()\n if (undoTimer.current) {\n clearTimeout(undoTimer.current)\n undoTimer.current = null\n }\n undoBaseState.current = null\n },\n }),\n [readSegmentsFromDOM, onChange, renderSegmentsToDOM, onChipAdd, events],\n )\n\n // -----------------------------------------------------------------------\n // Compose event handlers\n // -----------------------------------------------------------------------\n\n const eventHandlers = useMemo(\n () => ({\n onPaste: events.handlePaste,\n onCopy: events.handleCopy,\n onCut: events.handleCut,\n onDrop: events.handleDrop,\n onDragOver: events.handleDragOver,\n onCompositionStart: events.handleCompositionStart,\n onCompositionEnd: events.handleCompositionEnd,\n onBlur: events.handleBlur,\n }),\n [\n events.handlePaste,\n events.handleCopy,\n events.handleCut,\n events.handleDrop,\n events.handleDragOver,\n events.handleCompositionStart,\n events.handleCompositionEnd,\n events.handleBlur,\n ],\n )\n\n return {\n editorRef,\n activeTrigger,\n suggestions,\n suggestionsLoading,\n suggestionsError,\n selectedSuggestionIndex,\n handleInput,\n handleKeyDown,\n handleClick,\n selectSuggestion,\n dismissTrigger,\n handle,\n triggerRect,\n eventHandlers,\n }\n}\n","'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport type { TriggerSuggestion } from './types'\n\ntype TriggerPopoverProps = {\n suggestions: TriggerSuggestion[]\n loading: boolean\n error?: string | null\n emptyMessage?: string\n selectedIndex: number\n onSelect: (suggestion: TriggerSuggestion) => void\n onDismiss: () => void\n triggerRect: DOMRect | null\n triggerChar: string\n}\n\n/**\n * Floating popover that displays trigger suggestions.\n * Positioned relative to the trigger character location in the editor.\n */\nexport function TriggerPopover({\n suggestions,\n loading,\n error,\n emptyMessage,\n selectedIndex,\n onSelect,\n onDismiss,\n triggerRect,\n triggerChar,\n}: TriggerPopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null)\n const selectedRef = useRef<HTMLButtonElement>(null)\n\n // Scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: 'nearest' })\n }, [selectedIndex])\n\n // Click outside to dismiss\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target\n if (popoverRef.current && target instanceof Node && !popoverRef.current.contains(target)) {\n onDismiss()\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [onDismiss])\n\n if (!triggerRect) return null\n if (suggestions.length === 0 && !loading && !error && !emptyMessage) return null\n\n // Position the popover below the trigger character, clamped to viewport\n const popoverMaxWidth = Math.min(320, window.innerWidth - 16)\n const left = Math.min(triggerRect.left, window.innerWidth - popoverMaxWidth - 8)\n const style: React.CSSProperties = {\n position: 'fixed',\n left: `${Math.max(8, left)}px`,\n top: `${triggerRect.bottom + 4}px`,\n zIndex: 50,\n maxWidth: `${popoverMaxWidth}px`,\n }\n\n return (\n <div\n ref={popoverRef}\n className={cn(\n 'max-h-[240px] min-w-[200px] overflow-y-auto',\n 'bg-popover rounded-xl border p-2 shadow-md',\n 'animate-in fade-in-0 zoom-in-95',\n )}\n style={style}\n role=\"listbox\"\n aria-label={`${triggerChar} suggestions`}>\n {loading ? (\n <div\n role=\"option\"\n aria-selected={false}\n className=\"text-muted-foreground px-3 py-2 text-sm\">\n Loading suggestions...\n </div>\n ) : error ? (\n <div role=\"option\" aria-selected={false} className=\"text-destructive px-3 py-2 text-sm\">\n {error}\n </div>\n ) : suggestions.length === 0 && emptyMessage ? (\n <div\n role=\"option\"\n aria-selected={false}\n className=\"text-muted-foreground px-3 py-2 text-sm\">\n {emptyMessage}\n </div>\n ) : (\n suggestions.map((suggestion, index) => (\n <button\n key={suggestion.value}\n ref={index === selectedIndex ? selectedRef : undefined}\n type=\"button\"\n role=\"option\"\n aria-selected={index === selectedIndex}\n className={cn(\n 'text-foreground flex w-full items-start gap-2 rounded-lg px-3 py-2 text-left text-sm',\n 'hover:bg-accent cursor-pointer transition-colors',\n index === selectedIndex && 'bg-accent',\n )}\n onMouseDown={(e) => {\n e.preventDefault() // Prevent blur on the editor\n onSelect(suggestion)\n }}>\n {suggestion.icon && <span className=\"mt-0.5 shrink-0\">{suggestion.icon}</span>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium\">{suggestion.label}</div>\n {suggestion.description && (\n <div className=\"text-muted-foreground truncate text-xs\">\n {suggestion.description}\n </div>\n )}\n </div>\n </button>\n ))\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\n\ntype AnimatedPlaceholderProps = {\n texts: string[]\n interval?: number\n}\n\n/**\n * Cross-fading placeholder that rotates through `texts`.\n *\n * Each text is keyed so React remounts it on change, replaying the\n * `tw-animate-css` enter animation (slide down + fade in). No animation\n * library is required.\n */\nexport function AnimatedPlaceholder({ texts, interval = 3000 }: AnimatedPlaceholderProps) {\n const [index, setIndex] = useState(0)\n\n useEffect(() => {\n if (texts.length <= 1) return\n\n const id = setInterval(() => {\n setIndex((prev) => (prev + 1) % texts.length)\n }, interval)\n\n return () => clearInterval(id)\n }, [texts.length, interval])\n\n return (\n <div\n className=\"pointer-events-none absolute top-0 left-0 overflow-hidden text-sm leading-relaxed select-none\"\n style={{ color: 'var(--prompt-area-placeholder, var(--muted-foreground))' }}\n aria-hidden=\"true\">\n <div\n key={index}\n className=\"animate-in fade-in-0 slide-in-from-top-4 duration-300 ease-in-out\">\n {texts[index]}\n </div>\n </div>\n )\n}\n","import { cn } from '@/lib/utils'\n\ntype RemoveButtonProps = {\n onClick: () => void\n label: string\n className?: string\n}\n\nexport function RemoveButton({ onClick, label, className }: RemoveButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className={cn(\n 'absolute top-0.5 right-0.5 grid h-3.5 w-3.5 cursor-pointer place-items-center',\n 'rounded-full bg-black/60 text-white hover:bg-black/80 dark:bg-white/60 dark:text-black dark:hover:bg-white/80',\n 'transition-colors',\n className,\n )}\n aria-label={label}>\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\">\n <line x1=\"2.75\" y1=\"2.75\" x2=\"7.25\" y2=\"7.25\" />\n <line x1=\"7.25\" y1=\"2.75\" x2=\"2.75\" y2=\"7.25\" />\n </svg>\n </button>\n )\n}\n","'use client'\n\nimport { cn } from '@/lib/utils'\nimport { RemoveButton } from './remove-button'\nimport type { PromptAreaImage } from './types'\n\ntype ImageStripProps = {\n images: PromptAreaImage[]\n onRemove?: (image: PromptAreaImage) => void\n onClick?: (image: PromptAreaImage) => void\n className?: string\n}\n\nexport function ImageStrip({ images, onRemove, onClick, className }: ImageStripProps) {\n if (images.length === 0) return null\n\n return (\n <div className={cn('flex flex-wrap gap-2', className)} role=\"list\" aria-label=\"Attached images\">\n {images.map((image) => (\n <div\n key={image.id}\n role=\"listitem\"\n className={cn(\n 'border-border relative h-16 w-16 flex-shrink-0 overflow-hidden rounded-md border',\n onClick && 'cursor-pointer',\n )}\n onClick={() => onClick?.(image)}>\n {/* eslint-disable-next-line @next/next/no-img-element -- registry component used outside Next.js */}\n <img\n src={image.url}\n alt={image.alt ?? 'Attached image'}\n className=\"h-full w-full object-cover\"\n />\n {image.loading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/40\">\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent\" />\n </div>\n )}\n {onRemove && (\n <RemoveButton\n onClick={() => onRemove(image)}\n label={`Remove ${image.alt ?? 'image'}`}\n />\n )}\n </div>\n ))}\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport { cn } from '@/lib/utils'\nimport { RemoveButton } from './remove-button'\nimport type { PromptAreaFile } from './types'\n\ntype IconProps = { className?: string }\n\n/** Shared SVG wrapper matching the lucide icon defaults (no dependency). */\nfunction Svg({ className, children }: IconProps & { children: React.ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}>\n {children}\n </svg>\n )\n}\n\nconst FileBody = (\n <>\n <path d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\" />\n <path d=\"M14 2v5a1 1 0 0 0 1 1h5\" />\n </>\n)\n\nconst File = ({ className }: IconProps) => <Svg className={className}>{FileBody}</Svg>\nconst FileText = ({ className }: IconProps) => (\n <Svg className={className}>\n {FileBody}\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </Svg>\n)\nconst FileSpreadsheet = ({ className }: IconProps) => (\n <Svg className={className}>\n {FileBody}\n <path d=\"M8 13h2\" />\n <path d=\"M14 13h2\" />\n <path d=\"M8 17h2\" />\n <path d=\"M14 17h2\" />\n </Svg>\n)\nconst FileCode = ({ className }: IconProps) => (\n <Svg className={className}>\n {FileBody}\n <path d=\"M10 12.5 8 15l2 2.5\" />\n <path d=\"m14 12.5 2 2.5-2 2.5\" />\n </Svg>\n)\nconst ImageIcon = ({ className }: IconProps) => (\n <Svg className={className}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </Svg>\n)\n\ntype FileStripProps = {\n files: PromptAreaFile[]\n onRemove?: (file: PromptAreaFile) => void\n onClick?: (file: PromptAreaFile) => void\n className?: string\n}\n\n/** Threshold above which collapse activates automatically. */\nconst COLLAPSE_THRESHOLD = 3\n\n/** Pick a lucide icon key based on MIME type. */\nfunction getFileIconKey(type?: string): 'pdf' | 'spreadsheet' | 'code' | 'image' | 'default' {\n if (!type) return 'default'\n if (type === 'application/pdf') return 'pdf'\n if (type.includes('spreadsheet') || type === 'text/csv') return 'spreadsheet'\n if (\n type.startsWith('text/') ||\n type.includes('javascript') ||\n type.includes('json') ||\n type.includes('xml')\n )\n return 'code'\n if (type.startsWith('image/')) return 'image'\n return 'default'\n}\n\nconst FILE_ICONS = {\n pdf: FileText,\n spreadsheet: FileSpreadsheet,\n code: FileCode,\n image: ImageIcon,\n default: File,\n} as const\n\n/** Format bytes into a human-readable string. */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\n/** Extract a short extension label from a filename (e.g., \"PDF\", \"CSV\"). */\nfunction getExtensionLabel(name: string): string | null {\n const dot = name.lastIndexOf('.')\n if (dot === -1 || dot === name.length - 1) return null\n return name.slice(dot + 1).toUpperCase()\n}\n\nfunction FileCard({\n file,\n compact,\n onRemove,\n onClick,\n}: {\n file: PromptAreaFile\n compact: boolean\n onRemove?: (file: PromptAreaFile) => void\n onClick?: (file: PromptAreaFile) => void\n}) {\n const ext = getExtensionLabel(file.name)\n const sizeStr = file.size != null ? formatFileSize(file.size) : null\n const meta = [ext, sizeStr].filter(Boolean).join(' · ')\n\n return (\n <div\n role=\"listitem\"\n className={cn(\n 'border-border relative flex flex-shrink-0 items-center gap-2 overflow-hidden rounded-lg border transition-colors',\n 'hover:bg-accent',\n compact ? 'h-10 w-36 px-2' : 'h-14 w-48 px-3',\n onClick && 'cursor-pointer',\n )}\n onClick={() => onClick?.(file)}>\n {(() => {\n const Icon = FILE_ICONS[getFileIconKey(file.type)]\n return (\n <Icon\n className={cn('text-muted-foreground flex-shrink-0', compact ? 'h-4 w-4' : 'h-5 w-5')}\n />\n )\n })()}\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn('truncate font-medium', compact ? 'text-xs' : 'text-sm')}\n title={file.name}>\n {file.name}\n </div>\n {!compact && meta && <div className=\"text-muted-foreground truncate text-xs\">{meta}</div>}\n </div>\n\n {file.loading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/40\">\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent\" />\n </div>\n )}\n\n {onRemove && <RemoveButton onClick={() => onRemove(file)} label={`Remove ${file.name}`} />}\n </div>\n )\n}\n\nexport function FileStrip({ files, onRemove, onClick, className }: FileStripProps) {\n const [expanded, setExpanded] = useState(false)\n const popoverRef = useRef<HTMLDivElement>(null)\n const toggleRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n if (!expanded) return\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node\n if (\n popoverRef.current &&\n !popoverRef.current.contains(target) &&\n !toggleRef.current?.contains(target)\n ) {\n setExpanded(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [expanded])\n\n if (files.length === 0) return null\n\n const collapsible = files.length > COLLAPSE_THRESHOLD\n const compact = collapsible\n const hiddenCount = files.length - COLLAPSE_THRESHOLD\n const visibleFiles = files.slice(0, COLLAPSE_THRESHOLD)\n\n return (\n <div className={cn('relative', className)}>\n <div className=\"flex flex-wrap gap-2\" role=\"list\" aria-label=\"Attached files\">\n {(collapsible ? visibleFiles : files).map((file) => (\n <FileCard\n key={file.id}\n file={file}\n compact={compact}\n onRemove={onRemove}\n onClick={onClick}\n />\n ))}\n {collapsible && (\n <div role=\"listitem\">\n <button\n ref={toggleRef}\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n className={cn(\n 'border-border text-muted-foreground hover:bg-accent flex flex-shrink-0 cursor-pointer items-center justify-center rounded-lg border transition-colors',\n compact ? 'h-10 px-3 text-xs' : 'h-14 px-4 text-sm',\n )}>\n {expanded ? 'Show less' : `+${hiddenCount} more`}\n </button>\n </div>\n )}\n </div>\n\n {expanded && (\n <div\n ref={popoverRef}\n className={cn(\n 'bg-popover border-border absolute bottom-full left-0 z-10 mb-2 max-h-48 overflow-y-auto rounded-lg border p-2 shadow-lg',\n )}>\n <div className=\"flex flex-wrap gap-2\" role=\"list\" aria-label=\"More attached files\">\n {files.slice(COLLAPSE_THRESHOLD).map((file) => (\n <FileCard\n key={file.id}\n file={file}\n compact={compact}\n onRemove={onRemove}\n onClick={onClick}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\nimport { cn } from '@/lib/utils'\nimport type { PromptAreaProps, PromptAreaHandle } from './types'\nimport { usePromptArea } from './use-prompt-area'\nimport { BLUR_DELAY_MS } from './use-prompt-area-events'\nimport { TriggerPopover } from './trigger-popover'\nimport { AnimatedPlaceholder } from './animated-placeholder'\nimport { ImageStrip } from './image-strip'\nimport { FileStrip } from './file-strip'\n\n/**\n * PromptArea - A lightweight rich text input with trigger support.\n *\n * Uses contentEditable to support inline chips (immutable pills) for\n * mentions, commands, and other triggered tokens. Each trigger character\n * can be configured to show a dropdown or fire a callback.\n *\n * @example\n * ```tsx\n * const [segments, setSegments] = useState<Segment[]>([])\n *\n * <PromptArea\n * value={segments}\n * onChange={setSegments}\n * triggers={[\n * { char: '@', position: 'any', mode: 'dropdown', onSearch: searchUsers },\n * { char: '/', position: 'start', mode: 'dropdown', onSearch: searchCommands },\n * { char: '#', position: 'any', mode: 'dropdown', onSearch: searchTags },\n * ]}\n * placeholder=\"Type a message...\"\n * onSubmit={handleSubmit}\n * autoGrow\n * />\n * ```\n */\nexport function PromptArea({\n value,\n onChange,\n triggers,\n placeholder,\n className,\n disabled = false,\n markdown,\n onSubmit,\n onEscape,\n onChipClick,\n onChipAdd,\n onChipDelete,\n onLinkClick,\n onPaste,\n onUndo,\n onRedo,\n minHeight = 80,\n maxHeight,\n autoFocus = false,\n autoGrow = false,\n 'aria-label': ariaLabel,\n 'data-test-id': dataTestId,\n images = [],\n imagePosition = 'above',\n onImagePaste,\n onImageRemove,\n onImageClick,\n files = [],\n filePosition = 'above',\n onFileRemove,\n onFileClick,\n ref,\n}: PromptAreaProps & { ref?: React.Ref<PromptAreaHandle> }) {\n const {\n editorRef,\n activeTrigger,\n suggestions,\n suggestionsLoading,\n suggestionsError,\n selectedSuggestionIndex,\n handleInput,\n handleKeyDown,\n handleClick,\n selectSuggestion,\n dismissTrigger,\n handle,\n triggerRect,\n eventHandlers,\n } = usePromptArea({\n value,\n onChange,\n triggers,\n onSubmit,\n onEscape,\n onChipClick,\n onChipAdd,\n onChipDelete,\n onLinkClick,\n onPaste,\n onUndo,\n onRedo,\n onImagePaste,\n markdown,\n })\n\n // Expose imperative handle via ref\n useImperativeHandle(ref, () => handle, [handle])\n\n // Auto-focus on mount\n useEffect(() => {\n if (autoFocus) {\n editorRef.current?.focus()\n }\n }, [autoFocus, editorRef])\n\n // -----------------------------------------------------------------------\n // Auto-grow: expand on focus/input, shrink on blur\n // -----------------------------------------------------------------------\n\n const [isFocused, setIsFocused] = useState(false)\n const [editorHeight, setEditorHeight] = useState<number | undefined>(undefined)\n\n const syncHeight = useCallback(() => {\n const el = editorRef.current\n if (!el) return\n // Temporarily set height to auto so scrollHeight reflects true content height\n el.style.height = 'auto'\n const contentHeight = el.scrollHeight\n el.style.height = `${contentHeight}px`\n setEditorHeight(contentHeight)\n }, [editorRef])\n\n const handleFocus = useCallback(() => {\n if (!autoGrow) return\n setIsFocused(true)\n syncHeight()\n }, [autoGrow, syncHeight])\n\n const handleBlurWithShrink = useCallback(() => {\n eventHandlers.onBlur()\n if (!autoGrow) return\n setTimeout(() => {\n const editor = editorRef.current\n if (!editor) return\n // Only shrink if focus truly left the component\n const activeEl = document.activeElement\n if (activeEl && editor.parentElement?.contains(activeEl)) return\n setIsFocused(false)\n setEditorHeight(undefined)\n }, BLUR_DELAY_MS)\n }, [eventHandlers, autoGrow, editorRef])\n\n const handleInputWithGrow = useCallback(() => {\n handleInput()\n if (autoGrow && isFocused) {\n syncHeight()\n }\n }, [handleInput, autoGrow, isFocused, syncHeight])\n\n // Re-measure on value changes (chip insertion, undo/redo, programmatic updates)\n useEffect(() => {\n if (autoGrow && isFocused) {\n requestAnimationFrame(() => syncHeight())\n }\n }, [value, autoGrow, isFocused, syncHeight])\n\n // -----------------------------------------------------------------------\n // Overflow indicator: detect when collapsed content is clipped\n // -----------------------------------------------------------------------\n\n const [hasOverflow, setHasOverflow] = useState(false)\n const overflowTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n if (!autoGrow) return\n\n const checkOverflow = () => {\n if (isFocused) {\n setHasOverflow(false)\n return\n }\n const el = editorRef.current\n if (!el) return\n setHasOverflow(el.scrollHeight > el.clientHeight)\n }\n\n // Delay the check so the CSS height transition (150ms) finishes first;\n // on initial mount there is no transition so the check still runs quickly.\n const delay = isFocused ? 0 : 160\n overflowTimerRef.current = setTimeout(checkOverflow, delay)\n return () => {\n if (overflowTimerRef.current !== null) {\n clearTimeout(overflowTimerRef.current)\n }\n }\n }, [autoGrow, isFocused, value, editorRef])\n\n // -----------------------------------------------------------------------\n // Compute editor style\n // -----------------------------------------------------------------------\n\n const editorStyle = useMemo((): React.CSSProperties => {\n if (!autoGrow) {\n return {\n minHeight: `${minHeight}px`,\n ...(maxHeight ? { maxHeight: `${maxHeight}px`, overflowY: 'auto' as const } : {}),\n }\n }\n return {\n height: isFocused && editorHeight ? `${editorHeight}px` : `${minHeight}px`,\n minHeight: `${minHeight}px`,\n maxHeight: '70dvh',\n overflowY: isFocused ? 'auto' : ('hidden' as const),\n transition: 'height 150ms ease-out',\n }\n }, [autoGrow, minHeight, maxHeight, isFocused, editorHeight])\n\n const isEmpty =\n value.length === 0 || (value.length === 1 && value[0].type === 'text' && value[0].text === '')\n\n const imageStrip =\n images.length > 0 ? (\n <ImageStrip\n images={images}\n onRemove={onImageRemove}\n onClick={onImageClick}\n className={imagePosition === 'above' ? 'pb-2' : 'pt-2'}\n />\n ) : null\n\n const fileStrip =\n files.length > 0 ? (\n <FileStrip\n files={files}\n onRemove={onFileRemove}\n onClick={onFileClick}\n className={filePosition === 'above' ? 'pb-2' : 'pt-2'}\n />\n ) : null\n\n return (\n <div className={cn('prompt-area-container relative', className)}>\n {imagePosition === 'above' && imageStrip}\n {filePosition === 'above' && fileStrip}\n\n {/* Editor + placeholder wrapper */}\n <div className=\"relative\">\n <div\n ref={editorRef}\n contentEditable={!disabled}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-label={ariaLabel ?? 'Text input'}\n aria-multiline=\"true\"\n aria-disabled={disabled || undefined}\n data-test-id={dataTestId}\n className={cn(\n 'prompt-area-editor',\n 'w-full min-w-0 break-words whitespace-pre-wrap outline-none',\n 'text-sm leading-relaxed',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n style={editorStyle}\n onFocus={handleFocus}\n onInput={autoGrow ? handleInputWithGrow : handleInput}\n onKeyDown={handleKeyDown}\n onClick={handleClick}\n onPaste={eventHandlers.onPaste}\n onCopy={eventHandlers.onCopy}\n onCut={eventHandlers.onCut}\n onDrop={eventHandlers.onDrop}\n onDragOver={eventHandlers.onDragOver}\n onCompositionStart={eventHandlers.onCompositionStart}\n onCompositionEnd={eventHandlers.onCompositionEnd}\n onBlur={autoGrow ? handleBlurWithShrink : eventHandlers.onBlur}\n />\n\n {/* Overflow gradient indicator – visible when auto-grow is collapsed and content is clipped */}\n {autoGrow && hasOverflow && !isFocused && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-auto absolute right-0 bottom-0 left-0 cursor-pointer\"\n style={{ height: '32px' }}\n onClick={() => editorRef.current?.focus()}>\n <div\n className=\"h-full w-full\"\n style={{\n background:\n 'linear-gradient(to bottom, transparent, color-mix(in srgb, var(--prompt-area-surface, var(--background)) 80%, transparent), var(--prompt-area-surface, var(--background)))',\n }}\n />\n </div>\n )}\n\n {/* Placeholder overlay */}\n {isEmpty &&\n placeholder &&\n (Array.isArray(placeholder) ? (\n <AnimatedPlaceholder texts={placeholder} />\n ) : (\n <div\n className=\"pointer-events-none absolute top-0 left-0 text-sm leading-relaxed select-none\"\n style={{ color: 'var(--prompt-area-placeholder, var(--muted-foreground))' }}\n aria-hidden=\"true\">\n {placeholder}\n </div>\n ))}\n </div>\n\n {filePosition === 'below' && fileStrip}\n {imagePosition === 'below' && imageStrip}\n\n {/* Trigger suggestion popover */}\n {activeTrigger && activeTrigger.config.mode === 'dropdown' && (\n <TriggerPopover\n suggestions={suggestions}\n loading={suggestionsLoading}\n error={suggestionsError}\n emptyMessage={activeTrigger.config.emptyMessage}\n selectedIndex={selectedSuggestionIndex}\n onSelect={selectSuggestion}\n onDismiss={dismissTrigger}\n triggerRect={triggerRect}\n triggerChar={activeTrigger.config.char}\n />\n )}\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
|
|
5
|
+
// src/lib/cn.ts
|
|
6
|
+
function cn(...inputs) {
|
|
7
|
+
return twMerge(clsx(inputs));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { cn };
|
|
11
|
+
//# sourceMappingURL=chunk-NF2LHZIE.js.map
|
|
12
|
+
//# sourceMappingURL=chunk-NF2LHZIE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/cn.ts"],"names":[],"mappings":";;;;AAUO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-NF2LHZIE.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Merge class names with Tailwind-aware conflict resolution.\n *\n * Bundled into the npm package so consumers don't need a `@/lib/utils`\n * helper. The package build aliases `@/lib/utils` to this module, while\n * the shadcn registry continues to rely on the consumer's own utils.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"]}
|