/* ── SuggestionTextarea — Chat textarea with inline ghost text and Tab-to-accept ── */ import { useRef, useCallback, forwardRef, type KeyboardEvent, type ChangeEvent, type TextareaHTMLAttributes } from "react"; interface SuggestionTextareaProps extends TextareaHTMLAttributes { suggestion?: string | null; onAcceptSuggestion?: () => void; } export const SuggestionTextarea = forwardRef( ({ suggestion, onAcceptSuggestion, value, onChange, onKeyDown, className, style, ...props }, ref) => { const ghostRef = useRef(null); const handleKeyDown = useCallback( (e: KeyboardEvent) => { // Tab-to-accept suggestion if (e.key === "Tab" && suggestion && !e.shiftKey) { e.preventDefault(); onAcceptSuggestion?.(); return; } onKeyDown?.(e); }, [suggestion, onAcceptSuggestion, onKeyDown], ); const ghostText = suggestion && !props.disabled ? suggestion : null; return (
{/* Ghost text overlay (invisible text mirror for sizing) */} {/* Ghost text layer (visible overlay) */} {ghostText && (
{value} {ghostText}
)} {/* Actual textarea */}