/** * Form primitives for `cursor/canvas`. Provides themed, controlled form controls * for interactive canvas apps with persistent state. All `onChange` callbacks * receive the **value directly** (not a DOM event), so they pair naturally * with `useCanvasState`: * * ```tsx * const [name, setName] = useCanvasState("name", ""); * * ``` */ import { type CSSProperties, type JSX, type ReactNode } from "react"; export type TextInputProps = { value?: string; /** Called with the new string value on every keystroke. */ onChange?: (value: string) => void; placeholder?: string; disabled?: boolean; type?: "text" | "email" | "password" | "number" | "url" | "search"; style?: CSSProperties; }; /** * Single-line text input (28px height). Use for names, titles, search * queries, and short text fields. * * `onChange` receives the **string value**, not a DOM event — this pairs * directly with `useCanvasState` setters. * * @example * ```tsx * const [name, setName] = useCanvasState("name", ""); * * * ``` */ export declare function TextInput({ value, onChange, placeholder, disabled, type, style }: TextInputProps): JSX.Element; export type TextAreaProps = { value?: string; /** Called with the new string value on every keystroke. */ onChange?: (value: string) => void; placeholder?: string; disabled?: boolean; /** Minimum visible rows. Defaults to 3. */ rows?: number; style?: CSSProperties; }; /** * Multi-line text input that auto-resizes to fit its content. * Use for notes, descriptions, comments, and multi-line text fields. * * The textarea grows as the user types. Set `rows` for the minimum visible * height (defaults to 3). Override with `style={{ height: "100px" }}` for a * fixed size. * * @example * ```tsx * const [notes, setNotes] = useCanvasState("notes", ""); * *