import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'; import * as AvatarPrimitive from '@radix-ui/react-avatar'; import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; import { ClassProp } from 'class-variance-authority/types'; import { ClassValue } from 'clsx'; import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'; import { ComponentProps } from 'react'; import * as DialogPrimitive from '@radix-ui/react-dialog'; import { ElementType } from 'react'; import { ForwardRefExoticComponent } from 'react'; import { GroupProps } from 'react-resizable-panels'; import { HTMLAttributes } from 'react'; import { JSXElementConstructor } from 'react'; import * as LabelPrimitive from '@radix-ui/react-label'; import { MemoExoticComponent } from 'react'; import { PanelProps } from 'react-resizable-panels'; import * as ProgressPrimitive from '@radix-ui/react-progress'; import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'; import * as React_2 from 'react'; import { ReactElement } from 'react'; import type { ReactNode } from 'react'; import { RefAttributes } from 'react'; import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'; import * as SelectPrimitive from '@radix-ui/react-select'; import * as SeparatorPrimitive from '@radix-ui/react-separator'; import { SeparatorProps } from 'react-resizable-panels'; import * as SliderPrimitive from '@radix-ui/react-slider'; import { StickToBottom } from 'use-stick-to-bottom'; import * as TabsPrimitive from '@radix-ui/react-tabs'; import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'; import * as TogglePrimitive from '@radix-ui/react-toggle'; import * as TooltipPrimitive from '@radix-ui/react-tooltip'; import { useStickToBottomContext } from 'use-stick-to-bottom'; import { VariantProps } from 'class-variance-authority'; export declare function Alert({ className, variant, ref, ...props }: React_2.HTMLAttributes & VariantProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace Alert { var displayName: string; } export declare function AlertDescription({ className, ref, ...props }: React_2.HTMLAttributes & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace AlertDescription { var displayName: string; } export declare const AlertDialog: React_2.FC; export declare const AlertDialogAction: React_2.ForwardRefExoticComponent, "ref"> & React_2.RefAttributes>; export declare const AlertDialogCancel: React_2.ForwardRefExoticComponent, "ref"> & React_2.RefAttributes>; export declare function AlertDialogContent({ className, onOpenAutoFocus, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace AlertDialogContent { var displayName: string | undefined; } export declare const AlertDialogDescription: React_2.ForwardRefExoticComponent, "ref"> & React_2.RefAttributes>; export declare function AlertDialogFooter({ className, ...props }: React_2.HTMLAttributes): React_2.JSX.Element; export declare namespace AlertDialogFooter { var displayName: string; } export declare function AlertDialogHeader({ className, ...props }: React_2.HTMLAttributes): React_2.JSX.Element; export declare namespace AlertDialogHeader { var displayName: string; } export declare function AlertDialogOverlay({ className, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace AlertDialogOverlay { var displayName: string | undefined; } export declare const AlertDialogPortal: React_2.FC; export declare const AlertDialogTitle: React_2.ForwardRefExoticComponent, "ref"> & React_2.RefAttributes>; export declare const AlertDialogTrigger: React_2.ForwardRefExoticComponent>; export declare const AlertTitle: React_2.ForwardRefExoticComponent & React_2.RefAttributes>; declare const alertVariants: (props?: ({ variant?: "default" | "destructive" | "info" | "success" | "warning" | null | undefined; } & ClassProp) | undefined) => string; export declare function Avatar({ className, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace Avatar { var displayName: string | undefined; } export declare function AvatarFallback({ className, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace AvatarFallback { var displayName: string | undefined; } export declare function AvatarImage({ className, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace AvatarImage { var displayName: string | undefined; } export declare function Badge({ className, variant, ...props }: BadgeProps): React_2.JSX.Element; declare interface BadgeProps extends React_2.HTMLAttributes, VariantProps { } declare const badgeVariants: (props?: ({ variant?: "default" | "destructive" | "draft" | "info" | "outline" | "secondary" | "success" | "warning" | null | undefined; } & ClassProp) | undefined) => string; export declare function Button({ className, variant, size, shape, asChild, type, ref, ...props }: ButtonProps): React_2.JSX.Element; export declare namespace Button { var displayName: string; } export declare function ButtonGroup({ className, orientation, ...props }: Omit, 'ref'> & VariantProps): React_2.JSX.Element; export declare function ButtonGroupSeparator({ className, orientation, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare function ButtonGroupText({ className, asChild, ...props }: Omit, 'ref'> & { asChild?: boolean; }): React_2.JSX.Element; declare const buttonGroupVariants: (props?: ({ orientation?: "horizontal" | "vertical" | null | undefined; } & ClassProp) | undefined) => string; export declare interface ButtonProps extends React_2.ButtonHTMLAttributes, VariantProps { asChild?: boolean; isLoading?: boolean; ref?: React_2.Ref; } declare const buttonVariants: (props?: ({ variant?: "default" | "destructive" | "ghost" | "link" | "outline" | "secondary" | "tertiary" | null | undefined; size?: "compact" | "default" | "icon" | "icon-md" | "icon-sm" | "icon-xs" | "lg" | "sm" | null | undefined; shape?: "default" | "pill" | null | undefined; } & ClassProp) | undefined) => string; export declare function Card({ className, variant, ref, ...props }: CardProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace Card { var displayName: string; } export declare function CardContent({ className, padding, ref, ...props }: React_2.HTMLAttributes & VariantProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace CardContent { var displayName: string; } declare const cardContentVariants: (props?: ({ padding?: "default" | "none" | null | undefined; } & ClassProp) | undefined) => string; export declare function CardDescription({ className, ref, ...props }: React_2.HTMLAttributes & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace CardDescription { var displayName: string; } export declare function CardFooter({ className, padding, ref, ...props }: React_2.HTMLAttributes & VariantProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace CardFooter { var displayName: string; } declare const cardFooterVariants: (props?: ({ padding?: "default" | "none" | null | undefined; } & ClassProp) | undefined) => string; export declare function CardHeader({ className, padding, ref, ...props }: React_2.HTMLAttributes & VariantProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace CardHeader { var displayName: string; } declare const cardHeaderVariants: (props?: ({ padding?: "default" | "none" | null | undefined; } & ClassProp) | undefined) => string; declare interface CardProps extends React_2.HTMLAttributes, VariantProps { } export declare function CardTitle({ className, ref, ...props }: React_2.HTMLAttributes & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace CardTitle { var displayName: string; } declare const cardVariants: (props?: ({ variant?: "default" | "transparent" | null | undefined; } & ClassProp) | undefined) => string; /** How long a pause can be before the next message starts a new group. */ export declare const CHAT_GROUPING_WINDOW_MS: number; export declare interface ChatGroupableMessage { /** * Identity to group by. `null` never groups — use it for system notices and * anything else that should always stand alone. */ readonly authorKey: string | null; /** When the message was sent, in epoch milliseconds. */ readonly sentAt: number; /** * Set `false` to force a message to stand alone regardless of its author — * deleted, redacted, or otherwise structurally different rows. * @default true */ readonly groupable?: boolean; } /** * A message log that follows new content, groups consecutive messages from one * speaker, and offers a way back to the bottom once the reader scrolls away. * * Structural chrome only. It never looks inside an item beyond the four fields * it needs to sequence them — identity, time, groupability, and a key — so the * body, avatar, actions, attachments, and every product concept stay with the * caller's `renderItem`. That is what lets one implementation of the sequencing * rules serve surfaces whose rows have nothing else in common. * * Layout contract: needs a definite height, like `Conversation`. Put the * composer *outside* this element, or every reply pushes it further down. */ export declare function ChatTranscript({ contentClassName, emptyState, footer, grouping, header, items, renderDaySeparator, renderItem, scrollButtonLabel, windowMs, ...props }: ChatTranscriptProps): React_2.JSX.Element; export declare namespace ChatTranscript { var displayName: string; } export declare interface ChatTranscriptItem extends ChatGroupableMessage { /** Stable across renders — it is the React key and the memo boundary. */ readonly id: string; } export declare interface ChatTranscriptItemContext { /** Position in the rendered list. */ readonly index: number; /** * This item continues the group above it: the row should hide its avatar * and header. */ readonly isGrouped: boolean; /** This item is the first of a new calendar day. */ readonly isFirstOfDay: boolean; } export declare interface ChatTranscriptProps extends Omit, 'children'> { /** Classes for the message list, not the scroller. */ contentClassName?: string; /** Shown instead of the list when there are no items. */ emptyState?: React_2.ReactNode; /** Inside the scroller, below the last item. Typing indicators go here. */ footer?: React_2.ReactNode; /** * Turn off author grouping entirely — for transcripts where every row is a * distinct event rather than a person speaking. * @default true */ grouping?: boolean; /** Inside the scroller, above the first item. "Show earlier messages". */ header?: React_2.ReactNode; items: readonly TItem[]; /** * Rendered before the first item of each new day. Omit for a transcript * short enough that the date never matters. */ renderDaySeparator?: (context: { readonly index: number; readonly item: TItem; }) => React_2.ReactNode; renderItem: (item: TItem, context: ChatTranscriptItemContext) => React_2.ReactNode; /** * Visible text on the jump-to-latest control. Omit for the compact circular * icon; either form carries an accessible name. */ scrollButtonLabel?: React_2.ReactNode; /** How long a pause can be before the next message starts a new group. */ windowMs?: number; } export declare const Checkbox: React_2.ForwardRefExoticComponent, "ref"> & React_2.RefAttributes>; /** Merge conditional classes while resolving Tailwind utility conflicts. */ export declare function cn(...inputs: ClassValue[]): string; /** * CodeBlock component for displaying syntax-highlighted code. * * Uses prism-react-renderer for React-native syntax highlighting, * avoiding dangerouslySetInnerHTML for security and React 19 Compiler compatibility. * * Supports dark/light theme switching via CSS classes. * * @example * ```tsx * * * * ``` */ export declare const CodeBlock: React_2.MemoExoticComponent<({ code, language, highlight, wrapLongLines, showLineNumbers, command, collapsible, defaultExpanded, className, children, ...props }: CodeBlockProps) => React_2.JSX.Element>; export declare const CodeBlockCopyButton: React_2.MemoExoticComponent<({ onCopy, onError, timeout, children, className, ...props }: CodeBlockCopyButtonProps) => React_2.JSX.Element>; declare type CodeBlockCopyButtonProps = ComponentProps & { onCopy?: () => void; onError?: (error: Error) => void; timeout?: number; }; declare type CodeBlockProps = HTMLAttributes & { code: string; language: SupportedLanguage; /** Disable Prism tokenization for unusually large payloads. */ highlight?: boolean; /** Wrap long lines instead of requiring horizontal scrolling. */ wrapLongLines?: boolean; showLineNumbers?: boolean; command?: string | string[]; collapsible?: boolean; defaultExpanded?: boolean; }; export declare const Collapsible: ForwardRefExoticComponent>; export declare const CollapsibleContent: ForwardRefExoticComponent>; export declare const CollapsibleTrigger: ForwardRefExoticComponent>; /** * Scroll container for a message log that follows new content until the reader * scrolls away, then stays put until they come back. * * Layout contract — `Conversation` must be a flex child with a definite * height (`min-h-0 flex-1` inside a `flex flex-col` whose own height is * bounded). `StickToBottom` sizes its scrollport with `height: 100%`, which * collapses to `auto` against an indefinite parent; the log then grows without * bound and the *outer* element scrolls instead of the scrollport, so pinning * silently stops working while the page still looks scrollable. * * Three nested elements, only the middle one scrolls: * * Conversation → this element. `role="log"`, positioning context * for `ConversationScrollButton`. * scrollport → library-owned; the actual scrolling element. * Style it with `ConversationContent`'s * `scrollClassName`, not `className`. * ConversationContent → the message list. `className` lands here. */ export declare const Conversation: ({ className, ...props }: ConversationProps) => React_2.JSX.Element; /** * The message list. `className` styles the list; `scrollClassName` styles the * scrollport that wraps it — see `Conversation` for why they are different * elements. */ export declare const ConversationContent: ({ className, ...props }: ConversationContentProps) => React_2.JSX.Element; export declare type ConversationContentProps = ComponentProps; export declare const ConversationEmptyState: ({ className, title, description, icon, children, ...props }: ConversationEmptyStateProps) => React_2.JSX.Element; export declare type ConversationEmptyStateProps = ComponentProps<'div'> & { title?: string; description?: string; icon?: React_2.ReactNode; }; export declare type ConversationProps = ComponentProps; /** * "Jump to the newest message", rendered only while the log is scrolled away * from the bottom. * * Must be a descendant of `Conversation` — it reads `isAtBottom` from * `StickToBottom`'s context rather than taking it as a prop, so the caller * cannot desynchronise the button from the scroller it controls. * * Pass `children` for the labelled pill form; omit it for the compact circular * icon. Either way the control has an accessible name. */ export declare const ConversationScrollButton: ({ children, className, label, ...props }: ConversationScrollButtonProps) => React_2.JSX.Element | null; export declare type ConversationScrollButtonProps = ComponentProps & { /** * Accessible name for the icon-only form. Ignored when `children` supplies * visible text, because a visible label *is* the accessible name and * shadowing it with `aria-label` is what makes voice control miss the * control the user can see. */ label?: string; }; export declare const Dialog: React_2.FC; export declare const DialogClose: React_2.ForwardRefExoticComponent>; export declare function DialogContent({ className, children, ref, container, hideCloseButton, onOpenAutoFocus, onEscapeKeyDown, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; container?: HTMLElement | null; hideCloseButton?: boolean; }): React_2.JSX.Element; export declare namespace DialogContent { var displayName: string | undefined; } export declare function DialogDescription({ className, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace DialogDescription { var displayName: string | undefined; } export declare function DialogFooter({ className, ...props }: React_2.HTMLAttributes): React_2.JSX.Element; export declare namespace DialogFooter { var displayName: string; } export declare function DialogHeader({ className, ...props }: React_2.HTMLAttributes): React_2.JSX.Element; export declare namespace DialogHeader { var displayName: string; } export declare function DialogOverlay({ className, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace DialogOverlay { var displayName: string | undefined; } export declare const DialogPortal: React_2.FC; export declare const DialogTitle: React_2.ForwardRefExoticComponent, "ref"> & React_2.RefAttributes>; export declare const DialogTrigger: React_2.ForwardRefExoticComponent>; export declare function Empty({ className, ref, size, variant, ...props }: React_2.HTMLAttributes & VariantProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace Empty { var displayName: string; } export declare function EmptyContent({ className, ref, ...props }: React_2.HTMLAttributes & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace EmptyContent { var displayName: string; } export declare function EmptyDescription({ className, ref, ...props }: React_2.HTMLAttributes & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace EmptyDescription { var displayName: string; } export declare function EmptyHeader({ className, ref, ...props }: React_2.HTMLAttributes & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace EmptyHeader { var displayName: string; } export declare function EmptyMedia({ className, variant, ref, ...props }: React_2.HTMLAttributes & VariantProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace EmptyMedia { var displayName: string; } declare const emptyMediaVariants: (props?: ({ variant?: "default" | "icon" | null | undefined; } & ClassProp) | undefined) => string; export declare function EmptyTitle(props: React_2.HTMLAttributes): React_2.JSX.Element; export declare namespace EmptyTitle { var displayName: string; } declare const emptyVariants: (props?: ({ size?: "compact" | "default" | null | undefined; variant?: "default" | "outline" | null | undefined; } & ClassProp) | undefined) => string; export declare function Field({ className, orientation, ...props }: React_2.ComponentProps<'div'> & VariantProps): React_2.JSX.Element; export declare function FieldContent({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function FieldDescription({ className, ...props }: React_2.ComponentProps<'p'>): React_2.JSX.Element; export declare function FieldError({ className, children, errors, ...props }: React_2.ComponentProps<'div'> & { errors?: Array<{ message?: string; } | undefined>; }): React_2.JSX.Element | null; export declare function FieldGroup({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function FieldLabel({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare function FieldLegend({ className, variant, ...props }: React_2.ComponentProps<'legend'> & { variant?: 'label' | 'legend'; }): React_2.JSX.Element; export declare function FieldSeparator({ children, className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function FieldSet({ className, ...props }: React_2.ComponentProps<'fieldset'>): React_2.JSX.Element; export declare function FieldTitle({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; declare const fieldVariants: (props?: ({ orientation?: "horizontal" | "responsive" | "vertical" | null | undefined; } & ClassProp) | undefined) => string; export declare function H1({ asChild, className, ...props }: Omit): React_2.JSX.Element; export declare function H2({ asChild, className, ...props }: Omit): React_2.JSX.Element; export declare function H3({ asChild, className, ...props }: Omit): React_2.JSX.Element; export declare function H4({ asChild, className, ...props }: Omit): React_2.JSX.Element; export declare const H5: React_2.ForwardRefExoticComponent & React_2.RefAttributes>; export declare function H6({ asChild, className, ...props }: Omit): React_2.JSX.Element; declare interface HeadingProps extends React_2.HTMLAttributes, VariantProps { asChild?: boolean; /** Render compact (14px) while keeping the heading's semantic level. */ size?: HeadingSize; } declare type HeadingSize = keyof typeof headingSizeOverrides; /** * Optional visual size overrides, decoupled from the semantic level so a * heading can keep its correct outline depth (e.g. h3) while rendering compact. * Applied after `headingVariants` in `cn`, so tailwind-merge always lets the * override win over the level's font-size/leading regardless of class order. */ declare const headingSizeOverrides: { readonly sm: 'text-sm leading-tight font-semibold tracking-normal'; }; declare const headingVariants: (props?: ({ level?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | null | undefined; } & ClassProp) | undefined) => string; /** * Icon component for rendering Lucide React icons * * Uses Lucide's native `size` prop with em units so icons scale with text. * Default size follows text (1em). Use size="md" for 1.25em, size="lg" for 1.5em. * * @example * ```tsx * import { MessageSquare } from 'lucide-react'; * import { Icon } from '@/components/ui/icon'; * * // 1em (default) * // 1.25em * // 1.5em * * ``` */ export declare function Icon({ className, color, icon: IconComponent, size, ...props }: IconProps): React_2.JSX.Element; /** * Patch-stable callable shape for Lucide-compatible icons. * * Lucide's public `LucideIcon` type embeds the physical React type instance * from its installation. Re-exporting it makes linked SDKs reject otherwise * compatible consumer Lucide/React patches. The never-argument callable * proves this is a component without coupling its props or return value. */ export declare type IconComponent = (...arguments_: never[]) => unknown; export declare interface IconProps extends Omit, 'absoluteStrokeWidth' | 'color' | 'ref' | 'size'>, VariantProps { absoluteStrokeWidth?: boolean; icon: IconComponent; } /** * Icon variants for color only - NO size classes. * Size is handled by Lucide's native `size` prop. */ declare const iconVariants: (props?: ({ color?: "default" | "destructive" | "inherit" | "muted" | "primary" | "secondary" | "success" | "warning" | null | undefined; size?: "default" | "lg" | "md" | "sm" | "xl" | "xs" | null | undefined; } & ClassProp) | undefined) => string; export declare function Input({ className, density, type, error, ref, onChange, ...props }: InputProps): React_2.JSX.Element; export declare namespace Input { var displayName: string; } export declare function InputGroup({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function InputGroupAddon({ className, align, ...props }: React_2.ComponentProps<'div'> & VariantProps): React_2.JSX.Element; declare const inputGroupAddonVariants: (props?: ({ align?: "block-end" | "block-start" | "inline-end" | "inline-start" | null | undefined; } & ClassProp) | undefined) => string; export declare function InputGroupButton({ className, type, variant, size, ...props }: Omit, 'size'> & VariantProps): React_2.JSX.Element; /** Input-group actions keep desktop density while remaining 44pt on mobile. */ declare const inputGroupButtonVariants: (props?: ({ size?: "icon-sm" | "icon-xs" | "sm" | "xs" | null | undefined; } & ClassProp) | undefined) => string; export declare function InputGroupInput({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare function InputGroupText({ className, ...props }: React_2.ComponentProps<'span'>): React_2.JSX.Element; export declare function InputGroupTextarea({ className, ref, ...props }: React_2.ComponentProps<'textarea'> & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace InputGroupTextarea { var displayName: string; } declare interface InputProps extends React_2.ComponentProps<'input'> { density?: 'compact' | 'default'; error?: boolean; ref?: React_2.Ref; } export declare function Item({ className, variant, size, asChild, ...props }: React_2.ComponentProps<'div'> & VariantProps & { asChild?: boolean; }): React_2.JSX.Element; export declare function ItemActions({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function ItemContent({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function ItemDescription({ className, ...props }: React_2.ComponentProps<'p'>): React_2.JSX.Element; export declare function ItemFooter({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function ItemGroup({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function ItemHeader({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare function ItemMedia({ className, variant, ...props }: React_2.ComponentProps<'div'> & VariantProps): React_2.JSX.Element; declare const itemMediaVariants: (props?: ({ variant?: "default" | "icon" | "image" | null | undefined; } & ClassProp) | undefined) => string; export declare function ItemSeparator({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare function ItemTitle({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; declare const itemVariants: (props?: ({ variant?: "default" | "muted" | "outline" | null | undefined; size?: "default" | "sm" | null | undefined; } & ClassProp) | undefined) => string; export declare function Label({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare const Loader: ({ className, size, ...props }: LoaderProps) => React_2.JSX.Element; export declare type LoaderProps = HTMLAttributes & { size?: number; }; export declare const Message: ({ className, from, ...props }: MessageProps) => React_2.JSX.Element; /** * Standardized muted-to-foreground hover treatment for icon-sized floating * controls so wrapped actions keep the same affordance across rows. */ export declare const MESSAGE_FLOATING_ACTION_BUTTON_CLASS = "text-muted-foreground hover:text-foreground hover:bg-muted/50 outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:ring-transparent"; /** * Shared interactive surface for opaque content sections (reasoning, tools, * etc.) so the row's hover treatment stays in sync with the parent row and * floating toolbar affordance. */ export declare const MESSAGE_ROW_SURFACE_CLASS = "relative -mx-3 rounded-lg px-3 py-0 transition-colors"; export declare const MessageAction: ({ tooltip, children, label, variant, size, ...props }: MessageActionProps) => React_2.JSX.Element; export declare type MessageActionProps = ComponentProps & { tooltip?: string; label?: string; }; export declare const MessageActions: ({ className, children, ...props }: MessageActionsProps) => React_2.JSX.Element; export declare type MessageActionsProps = ComponentProps<'div'>; export declare const MessageContent: ({ children, className, ...props }: MessageContentProps) => React_2.JSX.Element; export declare type MessageContentProps = HTMLAttributes; /** * Standardized icon-only floating button with consistent surface styling, * optional tooltip copy, and a safe accessible-name fallback chain * (`aria-label` → `label` → string `tooltip`). */ export declare function MessageFloatingActionButton({ children, className, label, tooltip, variant, size, 'aria-label': ariaLabel, ...props }: MessageFloatingActionButtonProps): React_2.JSX.Element; export declare interface MessageFloatingActionButtonProps extends ComponentProps { label?: string; tooltip?: ReactNode; } /** * Positions a compact toolbar above the top-right edge of the parent * `MessageRow`. Reveals on hover or focus-within of the row; can be force-shown * via `isOpen` while a nested menu / popover is open. */ export declare function MessageFloatingActions({ children, className, isOpen, role, 'aria-label': ariaLabel, ...props }: MessageFloatingActionsProps): React_2.JSX.Element; export declare interface MessageFloatingActionsProps extends ComponentProps<'div'> { /** Keeps the toolbar visible while a nested menu / popover owns focus. */ isOpen?: boolean; } export declare type MessageProps = HTMLAttributes & { from: UIMessage['role']; }; export declare function MessageRow({ avatar, authorName, timestamp, badge, headerActions, children, reactions, footer, actions, isGrouped, from, className, ...rest }: MessageRowProps): React_2.JSX.Element; export declare interface MessageRowProps extends Omit, 'children' | 'role'> { /** Avatar element rendered in the gutter when not grouped. */ avatar?: ReactNode; /** Author name slot. A string is rendered as bold text; any node is rendered as-is. */ authorName?: ReactNode; /** * Timestamp slot. Rendered inline next to the author name when not grouped, * and as a hover-revealed gutter overlay (right-aligned with where the * avatar's right edge would be) when grouped. */ timestamp?: ReactNode; /** Optional badge after the author name (e.g. an AI Agent chip). */ badge?: ReactNode; /** Optional trailing header controls (right-justified in the header row). */ headerActions?: ReactNode; /** The message body. */ children: ReactNode; /** * Reaction pills slot — rendered inside the hover surface, immediately below * the message body, so hover/focus on reactions extends the row treatment. */ reactions?: ReactNode; /** * Footer slot — rendered inside the hover surface, below the reactions row. * Typical usage: thread-reply indicators or read receipts that should be part * of the message's hover treatment. */ footer?: ReactNode; /** * Floating actions slot — rendered outside the top edge of the row. Typical * usage is to pass a `` element here. */ actions?: ReactNode; /** * When true, the avatar and header are hidden; on hover/focus a small * timestamp appears right-aligned with where the avatar's right edge sits. */ isGrouped?: boolean; /** Variant flag forwarded to the inner `Message` (sets `is-user` / `is-assistant`). */ from?: 'user' | 'assistant' | 'system'; } export declare const MessageToolbar: ({ className, children, ...props }: MessageToolbarProps) => React_2.JSX.Element; export declare type MessageToolbarProps = ComponentProps<'div'>; /** * Canonical "return to the previous view" affordance for mini-app screens. * * Full-screen mini-app views (for example a feedback form opened from a * course) must always expose a reliable way back to the surface that launched * them. Reusing this component keeps that affordance — icon, label, and * accessible name — consistent with the rest of the mini-app chrome instead of * each view hand-rolling (or forgetting) its own back control. */ export declare function MiniAppBackButton({ label, size, type, variant, ...props }: MiniAppBackButtonProps): React_2.JSX.Element; export declare namespace MiniAppBackButton { var displayName: string; } export declare interface MiniAppBackButtonProps extends Omit { /** * Visible label for the control. Defaults to a generic "Back" so the * control always has an accessible name. */ label?: string; } /** * Chrome that stays put while content scrolls past it: a sticky section * header, a table header, a composer pinned under a transcript. * * `'sticky'` rather than `'fixed'`, deliberately. A mini-app is mounted into a * host surface that is not the viewport, so `position: fixed` escapes the * surface and pins to the window — correct in a browser tab, wrong in every * docked panel. If a dock must escape its scroll container, that is a portal * with host-webview occlusion, not this. * * `z-10` by default, which clears ordinary content. A dock that must sit above * another positioned layer should say so through `className` rather than have * this template guess a stacking order it cannot see. */ export declare function MiniAppDock({ className, divider, edge, mode, tone, ...props }: MiniAppDockProps): React_2.JSX.Element; export declare namespace MiniAppDock { var displayName: string; } export declare type MiniAppDockEdge = 'bottom' | 'top'; export declare type MiniAppDockMode = /** Pins to the edge of the nearest scroll container as content passes under. */ 'sticky' /** Not pinned; a flex row that refuses to shrink. */ | 'flex'; export declare interface MiniAppDockProps extends React_2.ComponentPropsWithRef<'div'> { /** @default 'top' */ edge?: MiniAppDockEdge; /** @default 'sticky' */ mode?: MiniAppDockMode; /** Draw the divider between the dock and the content. @default true */ divider?: boolean; /** @default 'opaque' */ tone?: MiniAppDockTone; } export declare type MiniAppDockTone = /** Solid. The only tone that is safe over arbitrary content. */ 'opaque' /** Translucent with a blur, so content shows through as it scrolls under. */ | 'frosted' /** No background at all; the caller paints. */ | 'transparent'; export declare function MiniAppIconButton({ icon, label, size, tooltipSide, type, variant, ...props }: MiniAppIconButtonProps): React_2.JSX.Element; export declare namespace MiniAppIconButton { var displayName: string; } export declare interface MiniAppIconButtonProps extends Omit { icon: IconComponent; label: string; tooltipSide?: React_2.ComponentProps['side']; } /** * A list beside a detail pane above a breakpoint; below it, either stacked or * one at a time. * * Scoped to the shape that is genuinely shared. It deliberately does *not* * cover: a draggable divider (compose `MiniAppSplit`), an off-canvas sheet * (compose `Sheet`, which needs host-webview occlusion this template has no * business owning), width persistence (an app-level storage-key decision), or * three panes. Mini-apps that need those differ from each other in ways a * shared component would have to re-expose as props one-for-one, which is a * config language, not an abstraction. * * Both panes stay mounted in `'swap'` mode — hidden, not unmounted — so scroll * position, form state, and imperative controllers holding element references * survive crossing the breakpoint. */ export declare function MiniAppListDetail({ activePane, backAffordance, className, collapse, detail, detailClassName, emptyDetail, list, listClassName, listWidth, ...props }: MiniAppListDetailProps): React_2.JSX.Element; export declare namespace MiniAppListDetail { var displayName: string; } /** What happens below the breakpoint. */ export declare type MiniAppListDetailCollapse = /** Both panes stay visible, stacked vertically. */ 'stack' /** One pane at a time, chosen by `activePane`. */ | 'swap'; /** Only the widths in real use. Anything else goes through `listClassName`. */ export declare type MiniAppListDetailListWidth = 'lg' | 'md' | 'sm' | 'xl' /** List flexes and the detail pane takes the fixed rail instead. */ | 'flex'; export declare interface MiniAppListDetailProps extends Omit, 'children' | 'onSelect'> { /** * Which pane is showing below the breakpoint. Above it, both are showing and * this is ignored. Uncontrolled default: `'detail'` once `detail` is * non-null, so selecting a row reveals it without the caller wiring state. */ activePane?: 'detail' | 'list'; /** * Rendered above the detail pane, below the breakpoint only. Without a way * back, `collapse='swap'` strands the reader in the detail pane. Wire it to * whatever state feeds `activePane` — this template owns no interaction that * could change the pane itself, so it offers no change callback to mislead * you into thinking it does. */ backAffordance?: React_2.ReactNode; /** @default 'swap' */ collapse?: MiniAppListDetailCollapse; /** The detail pane. `null` shows `emptyDetail` above the breakpoint. */ detail?: React_2.ReactNode; detailClassName?: string; /** Shown in place of an absent detail, above the breakpoint only. */ emptyDetail?: React_2.ReactNode; /** The list or table pane. Always rendered. */ list: React_2.ReactNode; listClassName?: string; /** @default 'md' */ listWidth?: MiniAppListDetailListWidth; } /** * MiniAppMetric - a `Card`-based metric tile (label + value + detail). * * Why custom: shadcn/ui has no metric/stat-tile primitive. This is a thin, * named composition of `Card` parts that fixes the label/value/detail slots and * their token spacing, so miniapp dashboards render metrics consistently * instead of re-deriving the layout from raw `Card` each time. */ export declare function MiniAppMetric({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare namespace MiniAppMetric { var displayName: string; } export declare function MiniAppMetricContent({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare namespace MiniAppMetricContent { var displayName: string; } export declare function MiniAppMetricDetail({ className, ...props }: React_2.ComponentProps<'p'>): React_2.JSX.Element; export declare namespace MiniAppMetricDetail { var displayName: string; } export declare function MiniAppMetricHeader({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare namespace MiniAppMetricHeader { var displayName: string; } export declare function MiniAppMetricLabel({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare namespace MiniAppMetricLabel { var displayName: string; } export declare function MiniAppMetricValue({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare namespace MiniAppMetricValue { var displayName: string; } /** * The root frame of a mini-app screen: full height, does not scroll, pins its * chrome and hands every remaining pixel to the body. * * This is deliberately the *common* shape, not every shape. Frames built on a * grid track, frames positioning a native webview, and frames rendered outside * React keep their own markup — an `as`/`layout`/`rows`/`cols` matrix that * covered all of them would be a class generator wearing a component's * clothes, and Tailwind cannot emit runtime-computed track strings anyway. * * The body wrapper is `min-h-0`, which is the whole point: without it a flex * child refuses to shrink below its content, and the frame scrolls instead of * the body — identical-looking until the toolbar starts sliding away. Each * chrome slot is wrapped in `shrink-0` for the mirror-image reason: chrome * that is allowed to shrink gets squeezed to nothing by a tall body rather * than staying put. */ export declare function MiniAppPage({ as: Component, bodyClassName, children, className, footer, height, minHeight, overflow, statusBar, style, surface, toolbar, ...props }: MiniAppPageProps): React_2.JSX.Element; export declare namespace MiniAppPage { var displayName: string; } export declare function MiniAppPageHeader({ className, ref, ...props }: React_2.ComponentProps<'header'> & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace MiniAppPageHeader { var displayName: string; } export declare function MiniAppPageHeaderActions({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare namespace MiniAppPageHeaderActions { var displayName: string; } export declare function MiniAppPageHeaderContent({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare namespace MiniAppPageHeaderContent { var displayName: string; } export declare function MiniAppPageHeaderDescription({ className, ...props }: React_2.ComponentProps<'p'>): React_2.JSX.Element; export declare namespace MiniAppPageHeaderDescription { var displayName: string; } export declare function MiniAppPageHeaderTitle({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare namespace MiniAppPageHeaderTitle { var displayName: string; } /** * How the frame gets its height. * * These are not interchangeable, which is why the prop exists rather than a * single hard-coded class: a federated surface is sized by its host container * and wants `h-full`, while a mini-app that owns a browser tab wants a * viewport unit — and `h-screen` is wrong on mobile Safari, where `dvh`/`svh` * account for the retracting toolbar. */ export declare type MiniAppPageHeight = 'auto' | 'dvh' | 'fill' | 'svh'; /** * Who owns the scroll. * * `'hidden'` is the default and the shape this template is for: the frame is * fixed and the body scrolls. `'visible'` hands scrolling to the host * container above the frame, which a surface mounted into an already-scrolling * page needs. */ export declare type MiniAppPageOverflow = 'auto' | 'hidden' | 'visible'; export declare interface MiniAppPageProps extends Omit, 'children'> { /** Rendered element. `'main'` when the frame is the document's main region. */ as?: 'div' | 'main' | 'section'; /** The scrolling body. Wrap it in `MiniAppScrollRegion` to make it scroll. */ children?: React_2.ReactNode; /** Extra classes for the body wrapper, not the frame. */ bodyClassName?: string; /** Pinned below the body. Never scrolls. */ footer?: React_2.ReactNode; /** @default 'fill' */ height?: MiniAppPageHeight; /** * Pixel floor below which the frame stops collapsing. An inline style rather * than a class, because the real values in use are arbitrary (320, 360, 420, * 520, 640) and Tailwind cannot emit a class it never sees as a literal. */ minHeight?: number | string; /** @default 'hidden' */ overflow?: MiniAppPageOverflow; /** * Paint the frame's own background and text colour. Turn this off when the * frame sits inside a surface that has already painted, so the two cannot * disagree. @default true */ surface?: boolean; /** Pinned below the toolbar, above the body. For `MiniAppStatusBar`. */ statusBar?: React_2.ReactNode; /** Pinned at the top. Never scrolls. For `MiniAppToolbar`. */ toolbar?: React_2.ReactNode; } /** * The loading, error, and empty screens a mini-app shows before or instead of * its content. * * These are the most-copied blocks in any mini-app — usually three * near-identical early returns in the same file, drifting apart one padding * value at a time. Routing them through one component makes the three states * look like siblings and gives assistive tech a consistent live region: * `role="status"` while loading, `role="alert"` on error. */ export declare function MiniAppPageState({ action, className, description, fill, icon, kind, title, ...props }: MiniAppPageStateProps): React_2.JSX.Element; export declare namespace MiniAppPageState { var displayName: string; } /** How the state block claims space. Mirrors `MiniAppScrollRegion`. */ export declare type MiniAppPageStateFill = 'flex' | 'full' | 'none'; export declare type MiniAppPageStateKind = 'empty' | 'error' | 'loading'; export declare interface MiniAppPageStateProps extends Omit, 'children' | 'title'> { /** Buttons or links. Rendered below the description. */ action?: React_2.ReactNode; description?: React_2.ReactNode; /** @default 'flex' */ fill?: MiniAppPageStateFill; /** * Replaces the default media. `'loading'` supplies a spinner; the other * kinds render nothing unless given an icon. */ icon?: React_2.ReactNode; /** @default 'loading' */ kind?: MiniAppPageStateKind; title?: React_2.ReactNode; } /** * "The body scrolls, the chrome does not" — the one shape every mini-app needs * and every mini-app spells differently. * * The three parts that are easy to get wrong, and are fixed here: * - `min-h-0` on a flex child. Without it the region refuses to shrink below * its content and the *page* scrolls instead, which looks the same until * the chrome starts sliding away. * - `h-full` on the viewport. The Radix root is only `relative`; the viewport * is the scrolling element, so height set on the root alone does nothing. * - A stable hook for tests on the viewport rather than the root. */ export declare function MiniAppScrollRegion({ axis, children, className, fill, region, viewportClassName, viewportProps, ...props }: MiniAppScrollRegionProps): React_2.JSX.Element; export declare namespace MiniAppScrollRegion { var displayName: string; } export declare type MiniAppScrollRegionAxis = 'x' | 'both' | 'y'; /** * The same sizing rules as a plain `className`, for the regions that must stay * native DOM — imperative surfaces, opaque webviews, and anywhere a Radix * portal is not worth the bytes. */ export declare function miniAppScrollRegionClassName(options?: { axis?: MiniAppScrollRegionAxis; className?: string; fill?: MiniAppScrollRegionFill; }): string; /** How the region claims space from its parent. */ export declare type MiniAppScrollRegionFill = /** Parent is a flex container: take the leftover space and allow shrinking. */ 'flex' /** Parent is a grid cell or already sized. */ | 'full' /** Caller sizes the region entirely (fixed heights, min-heights). */ | 'none'; export declare interface MiniAppScrollRegionProps extends Omit { /** @default 'flex' */ fill?: MiniAppScrollRegionFill; /** `'x'` and `'both'` also render a horizontal scrollbar. @default 'y' */ axis?: MiniAppScrollRegionAxis; /** * Stamped on the root as `data-scroll-region` and on the viewport as * `data-scroll-region-viewport`. End-to-end tests need to script the element * that actually has `scrollTop`, which is the viewport, not the root. */ region?: string; } export declare function MiniAppSectionHeader({ className, ...props }: React_2.ComponentProps<'header'>): React_2.JSX.Element; export declare namespace MiniAppSectionHeader { var displayName: string; } export declare function MiniAppSectionHeaderActions({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare namespace MiniAppSectionHeaderActions { var displayName: string; } export declare function MiniAppSectionHeaderContent({ className, ...props }: React_2.ComponentProps<'div'>): React_2.JSX.Element; export declare namespace MiniAppSectionHeaderContent { var displayName: string; } export declare function MiniAppSectionHeaderDescription({ className, ...props }: React_2.ComponentProps<'p'>): React_2.JSX.Element; export declare namespace MiniAppSectionHeaderDescription { var displayName: string; } export declare function MiniAppSectionHeaderTitle({ className, ...props }: React_2.ComponentProps): React_2.JSX.Element; export declare namespace MiniAppSectionHeaderTitle { var displayName: string; } /** * Two panes the reader can resize, with a keyboard-operable handle between * them. * * A named two-slot shape over the `Resizable*` primitives, which have been * available since before the SDK's first release and adopted almost nowhere — * mini-apps hand-roll pointer-capture splitters with their own persistence * instead. Those splitters are the reason this exists: the primitives were * available but not *reachable*, because using them means knowing to compose * three components and that panels clip by default. * * Costs no bundle bytes beyond what `Resizable*` already ships. * * Panes clip rather than scroll, per `ResizablePanel`'s default. Put a * `MiniAppScrollRegion` inside a pane that needs to scroll, so the scroll * owner is a deliberate choice rather than an accident of the drag shell. * * Persistence is the caller's: pass `defaultLayout` and `onLayoutChanged` * through to the underlying group and store the layout wherever the app * already stores its state. Baking in a storage key would have two mini-apps * mounted on one surface fight over the same entry. * * Sizes here are percentages, stated as numbers. The underlying library reads * a bare number as *pixels* and only a string as a percentage, so * `defaultSize={60}` passed straight through would silently produce a 60-pixel * pane. Converting at this boundary is most of why the primitives are worth * wrapping. */ export declare function MiniAppSplit({ className, defaultSize, direction, handle, minSize, primary, primaryClassName, secondary, secondaryClassName, secondaryMinSize, ...props }: MiniAppSplitProps): React_2.JSX.Element; export declare namespace MiniAppSplit { var displayName: string; } export declare interface MiniAppSplitProps extends Omit, 'children'> { /** Starting size of the primary pane, in percent. @default 60 */ defaultSize?: number; /** @default 'horizontal' */ direction?: 'horizontal' | 'vertical'; /** Show a grip on the handle. @default true */ handle?: boolean; /** Smallest the primary pane may become, in percent. @default 20 */ minSize?: number; /** The leading pane. */ primary: React_2.ReactNode; /** Classes for the primary pane. */ primaryClassName?: string; /** The trailing pane. */ secondary: React_2.ReactNode; /** Classes for the secondary pane. */ secondaryClassName?: string; /** Smallest the secondary pane may become, in percent. @default 20 */ secondaryMinSize?: number; } export declare function MiniAppStatusBar({ children, className, tone, ...props }: MiniAppStatusBarProps): React_2.JSX.Element; export declare namespace MiniAppStatusBar { var displayName: string; } export declare interface MiniAppStatusBarProps extends Omit, 'children' | 'variant'> { children: React_2.ReactNode; tone?: 'error' | 'neutral' | 'success'; } export declare function MiniAppToolbar({ className, ref, ...props }: React_2.ComponentProps<'header'> & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace MiniAppToolbar { var displayName: string; } /** * NativeSelect - a token-styled wrapper over the native `` is required instead — OS-native pickers (notably on mobile), * native form semantics, and very large/dynamic option sets where the Radix * popover is too heavy. It applies the same token-based input styling and * chevron affordance so the two stay visually consistent. */ export declare function NativeSelect({ className, density, ref, wrapperClassName, ...props }: React_2.ComponentProps<'select'> & { density?: 'compact' | 'default'; ref?: React_2.Ref; wrapperClassName?: string; }): React_2.JSX.Element; export declare namespace NativeSelect { var displayName: string; } export declare function NativeSelectOptGroup({ className, ref, ...props }: React_2.ComponentProps<'optgroup'> & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace NativeSelectOptGroup { var displayName: string; } export declare function NativeSelectOption({ className, ref, ...props }: React_2.ComponentProps<'option'> & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace NativeSelectOption { var displayName: string; } /** * Host adapter for native surfaces that render above browser content. * Browser-only miniapps intentionally run without an adapter. */ export declare interface NativeViewOcclusionAdapter { acquire(element: HTMLElement, claimId: string): NativeViewOcclusionRelease | Promise; } export declare function NativeViewOcclusionProvider({ adapter, children, }: NativeViewOcclusionProviderProps): React_2.JSX.Element; export declare interface NativeViewOcclusionProviderProps { adapter: NativeViewOcclusionAdapter | null; children: React_2.ReactNode; } export declare type NativeViewOcclusionRelease = () => void; export declare function Progress({ className, value, ref, ...props }: React_2.ComponentPropsWithoutRef & { ref?: React_2.Ref>; }): React_2.JSX.Element; export declare namespace Progress { var displayName: string | undefined; } export declare function RadioCard({ id, value, children, className, control, ref, ...props }: RadioCardProps & { ref?: React_2.Ref; }): React_2.JSX.Element; export declare namespace RadioCard { var displayName: string; } /** * RadioCard - a full card surface that acts as a single radio option. * * Why custom: shadcn/ui ships `RadioGroup`/`RadioGroupItem` but no card-styled * option. This wraps `RadioGroupItem` in a `