"use client"; import { Button } from "@/components/ui/button"; import { cn } from "@/utils/cn"; import { composeEventHandlers } from "@radix-ui/primitive"; import { useComposedRefs } from "@radix-ui/react-compose-refs"; import { Primitive } from "@radix-ui/react-primitive"; import { Slot } from "@radix-ui/react-slot"; import * as React from "react"; import { use } from "react"; export type InputBaseContextProps = Pick< InputBaseProps, "autoFocus" | "disabled" > & { controlRef: React.RefObject; onFocusedChange: (focused: boolean) => void; }; const InputBaseContext = React.createContext({ autoFocus: false, controlRef: { current: null }, disabled: false, onFocusedChange: () => {} }); function useInputBase() { const context = use(InputBaseContext); if (!context) { throw new Error("useInputBase must be used within a ."); } return context; } export interface InputBaseProps extends React.ComponentProps { autoFocus?: boolean; disabled?: boolean; error?: boolean; } function InputBase({ autoFocus, disabled, className, onClick, error, ...props }: InputBaseProps) { const [focused, setFocused] = React.useState(false); const controlRef = React.useRef(null); const handleClick = React.useCallback>((event) => { onClick?.(event); if (event.defaultPrevented) return; if (controlRef.current && event.currentTarget === event.target) { controlRef.current.focus(); } }, [onClick]); return ( ); } function InputBaseFlexWrapper({ className, ...props }: React.ComponentProps) { return ( ); } function InputBaseControl({ ref, onFocus, onBlur, ...props }: React.ComponentProps) { const { controlRef, autoFocus, disabled, onFocusedChange } = useInputBase(); const composedRefs = useComposedRefs(controlRef, ref); return ( onFocusedChange(true))} onBlur={composeEventHandlers(onBlur, () => onFocusedChange(false))} {...{ disabled }} {...props} /> ); } export interface InputBaseAdornmentProps extends React.ComponentProps<"div"> { asChild?: boolean; } function InputBaseAdornment({ className, asChild, children, ...props }: InputBaseAdornmentProps) { // eslint-disable-next-line no-nested-ternary const Comp = asChild ? Slot : typeof children === "string" ? "p" : "div"; return ( {children} ); } function InputBaseAdornmentButton({ type = "button", variant = "ghost", size = "icon", disabled: disabledProp, className, ...props }: React.ComponentProps) { const { disabled } = useInputBase(); return (