import { mergeProps } from "@base-ui/react/merge-props"; import { useRender } from "@base-ui/react/use-render"; import { ChevronDownIcon, XIcon } from "lucide-react"; import type { ComponentProps } from "react"; import { cn } from "~/lib/utils"; import { Button, buttonVariants } from "../ui/button"; import { ScrollArea } from "../ui/scroll-area"; export type ComposerBannerVariant = "default" | "error" | "info" | "success" | "warning"; const surfaceColors = cn( "[--chat-composer-attached-surface:var(--chat-composer-glass-surface,var(--card))]", "dark:[--chat-composer-attached-surface:var(--chat-composer-glass-surface,color-mix(in_srgb,var(--background)_96%,var(--color-white)))]", "[html[data-theme-id]_&]:[--chat-composer-attached-surface:var(--app-theme-surface-raised)]", ); const neutralOutline = cn( "[--chat-composer-attached-outline:var(--chat-composer-outline,color-mix(in_srgb,var(--contrast-foreground)_8%,transparent))]", "dark:[--chat-composer-attached-outline:var(--chat-composer-outline,color-mix(in_srgb,var(--color-white)_5%,transparent))]", "[html[data-theme-id]_&]:[--chat-composer-attached-outline:var(--chat-composer-outline,var(--app-theme-toolbar-border))]", "dark:[html[data-theme-id]:not([data-theme-id=t3-chat])_&]:[--chat-composer-attached-outline:var(--chat-composer-outline,color-mix(in_srgb,var(--app-theme-input)_30%,var(--background)))]", "dark:[html[data-theme-id=t3-chat]_&]:[--chat-composer-attached-outline:#241e28]", ); const variantColors: Record = { default: neutralOutline, error: "[--chat-composer-attached-outline:color-mix(in_srgb,var(--error)_32%,transparent)] [--chat-composer-attached-tint:color-mix(in_srgb,var(--error)_8%,transparent)]", info: "[--chat-composer-attached-outline:color-mix(in_srgb,var(--info)_32%,transparent)] [--chat-composer-attached-tint:color-mix(in_srgb,var(--info)_4%,transparent)]", success: "[--chat-composer-attached-outline:color-mix(in_srgb,var(--success)_32%,transparent)] [--chat-composer-attached-tint:color-mix(in_srgb,var(--success)_4%,transparent)]", warning: "[--chat-composer-attached-outline:color-mix(in_srgb,var(--warning)_28%,transparent)] [--chat-composer-attached-tint:color-mix(in_srgb,var(--warning)_8%,transparent)]", }; /** Shared glass and attachment seam, also used by the command menu without banner row padding. */ function Surface({ placement = "attached", variant = "default", className, ...props }: ComponentProps<"div"> & { placement?: "attached" | "floating"; variant?: ComposerBannerVariant; }) { return (
); } // A peeking notice uses the first hidden notice's severity, never the attached row's. const peekBorder: Record = { default: "border-(--chat-composer-attached-outline)", error: "border-destructive/24", info: "border-info/24", success: "border-success/24", warning: "border-warning/24", }; function Peek({ className, variant = "default", ...props }: ComponentProps<"button"> & { variant?: ComposerBannerVariant }) { return ( ); } export const ComposerBanner = { Surface, Peek, Attachment, Dock, Column, Root, Row, Icon, Content, Separator, Actions, Children, Scroll, Count, Body, Dot, ToggleIcon, Dismiss, };