import type * as React from "react"; import { forwardRef } from "react"; import { pageBanner, type PageBannerVariantProps } from "@seed-design/css/recipes/page-banner"; import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive"; import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext"; import { DismissibleCloseButton, DismissibleRoot, type DismissibleRootProps, } from "../private/useDismissible"; import clsx from "clsx"; const { withContext, ClassNamesProvider } = createSlotRecipeContext(pageBanner); export interface PageBannerRootProps extends PageBannerVariantProps, DismissibleRootProps {} export const PageBannerRoot = forwardRef( ({ className, ...props }, ref) => { if (props.variant === "solid" && props.tone === "magic") { console.error( `\`${props.tone}\` tone is not available for \`${props.variant}\` variant in PageBanner components. Please use variant="weak" or a different tone instead.`, ); } const [variantProps, otherProps] = pageBanner.splitVariantProps(props); const classNames = pageBanner(variantProps); return ( ); }, ); // Use these instead when ts implements this: // Control flow analysis for destructured rest element of discriminated union // https://github.com/microsoft/TypeScript/issues/15300 // export type PageBannerRootProps = DismissibleRootProps & // ( // | { // variant?: Exclude; // tone?: PageBannerVariantProps["tone"]; // } // | { // variant: Extract; // tone?: Exclude; // } // ); // export const PageBannerRoot = withProvider( // DismissibleRoot, // "root", // ); export interface PageBannerContentProps extends PrimitiveProps, React.HTMLAttributes {} export const PageBannerContent = withContext( Primitive.div, "content", ); export interface PageBannerBodyProps extends PrimitiveProps, React.HTMLAttributes {} export const PageBannerBody = withContext( Primitive.div, "body", ); export interface PageBannerTitleProps extends PrimitiveProps, React.HTMLAttributes {} export const PageBannerTitle = withContext( Primitive.span, "title", ); export interface PageBannerDescriptionProps extends PrimitiveProps, React.HTMLAttributes {} export const PageBannerDescription = withContext( Primitive.span, "description", ); export interface PageBannerButtonProps extends PrimitiveProps, React.ButtonHTMLAttributes {} export const PageBannerButton = withContext( Primitive.button, "button", ); export interface PageBannerCloseButtonProps extends PrimitiveProps, React.ButtonHTMLAttributes {} export const PageBannerCloseButton = withContext( DismissibleCloseButton, "closeButton", );