import { type ComponentPropsWithoutRef, type ReactNode } from "react";
/** Border treatment.
 *  - `"default"` — 1-px hairline that lights up `--ods-accent-border` on
 *    focus. Calm, neutral chrome.
 *  - `"ambient"` — animated conic-gradient ring (drives `--ods-gradient-
 *    running-accent` from the token set) plus a soft accent glow halo.
 *    Pairs naturally with `status="running"` where the rotation tightens
 *    to a faster cadence. Respects `prefers-reduced-motion`. */
export type PromptInputBorderStyle = "default" | "ambient";
export interface PromptInputAttachment {
    id: string;
    name: string;
    size?: number;
    type?: string;
    url?: string;
    /** Optional preview thumbnail URL. URLs are passed through
     *  `sanitizeImageUrl` before they hit `src=` so a malicious blob:
     *  reference can't escape into XSS. */
    previewUrl?: string;
}
export interface PromptInputSuggestion {
    id: string;
    label: ReactNode;
    description?: ReactNode;
    icon?: ReactNode;
    insert: string;
}
export interface PromptInputQuickAction {
    id: string;
    label: ReactNode;
    icon?: ReactNode;
    /** When clicked, set this as the input value (or append). */
    prompt: string;
    /** Replace current value (true) or append (false). Default true. */
    replace?: boolean;
}
/** Imperative handle returned via `ref`. Parent layouts often need to
 *  focus the input (after a "Reply" click in a thread, after dismissing
 *  a modal, after a slash-command palette closes) or to programmatically
 *  insert / clear text — exposing only the surface that's actually
 *  useful keeps the contract small. */
export interface PromptInputHandle {
    focus(): void;
    blur(): void;
    clear(): void;
    /** Insert text at the caret. Falls back to appending when not focused. */
    insert(text: string): void;
    /** Programmatically trigger the same submit path as the send button /
     *  Enter key (respects `disabled` + `status==="running"`). */
    submit(): void;
    /** Current value (controlled OR uncontrolled). */
    getValue(): string;
    /** Underlying textarea DOM node — for callers that need to read
     *  selection range, scroll position, etc. */
    getTextarea(): HTMLTextAreaElement | null;
}
type DivPropsBase = Omit<ComponentPropsWithoutRef<"div">, "onChange" | "onSubmit" | "children" | "prefix">;
export interface PromptInputProps extends DivPropsBase {
    value?: string;
    defaultValue?: string;
    onChange?: (value: string) => void;
    onSubmit?: (value: string, attachments: PromptInputAttachment[]) => void | Promise<void>;
    placeholder?: string;
    disabled?: boolean;
    /** Optional visible label rendered above the input. When omitted use
     *  `aria-label` for AT-only labelling. */
    label?: ReactNode;
    /** Show send button. Default true. */
    showSend?: boolean;
    /** "running" disables send + shows stop. "error" tints the border. */
    status?: "idle" | "running" | "error";
    onStop?: () => void;
    /** Custom toolbar slot — left edge of the footer. */
    leftActions?: ReactNode;
    /** Custom toolbar slot — right edge (rendered before the send button). */
    rightActions?: ReactNode;
    /** Attachments rendered as removable chips above the textarea. */
    attachments?: PromptInputAttachment[];
    onRemoveAttachment?: (id: string) => void;
    /** Called when files are pasted or dropped onto the input. */
    onAttachFiles?: (files: File[]) => void;
    /** Slash-command / mention suggestions. */
    suggestions?: PromptInputSuggestion[];
    /** Quick-action chips below the input. Click to fill the prompt. */
    quickActions?: PromptInputQuickAction[];
    /** Maximum visible rows before scrolling. Default 8. */
    maxRows?: number;
    /** Minimum visible rows. Default 1. */
    minRows?: number;
    /** Submit on Enter (without Shift). Default true. */
    submitOnEnter?: boolean;
    /** Caption / hint below the input. */
    hint?: ReactNode;
    /** Maximum character length — shows counter and prevents typing beyond. */
    maxLength?: number;
    /** Show character counter even when no maxLength is set. Default false. */
    showCounter?: boolean;
    /** Recall previously submitted prompts with ↑ when input is empty. */
    history?: string[];
    /** Override the drop-overlay text. */
    dropOverlayLabel?: ReactNode;
    /** Border treatment. Default `"default"` (hairline). `"ambient"` opts
     *  into the animated gradient ring for a "model is thinking" feel. */
    borderStyle?: PromptInputBorderStyle;
    /** Ambient-border rotation cadence in seconds. `"off"` keeps the
     *  gradient static (still tinted, just not animated). Default `6`.
     *  When `status="running"`, the cadence tightens to half this value
     *  (with a 1 s floor) for a "speeding up" feel. Ignored when
     *  `borderStyle !== "ambient"`. */
    ambientSpeed?: number | "off";
}
export declare const PromptInput: import("react").ForwardRefExoticComponent<PromptInputProps & import("react").RefAttributes<PromptInputHandle>>;
export {};
//# sourceMappingURL=PromptInput.d.ts.map