import { useId, type CSSProperties } from "react"; import dwLogo from "./assets/dw.png"; export type UhuruBackgroundPattern = "none" | "grid" | "cross" | "circuit" | "dots"; export type UhuruBackgroundVideo = { src: string; poster?: string; }; export interface UhuruBackgroundConfig { assetOpacity?: number; blur?: number | string; className?: string; fixed?: boolean; image?: string; imageFit?: CSSProperties["objectFit"]; logo?: boolean | string; logoBlur?: number | string; logoOpacity?: number; overlay?: string; overlayOpacity?: number; pattern?: UhuruBackgroundPattern; patternColor?: string; patternOpacity?: number; patternSize?: number | string; position?: string; repeat?: CSSProperties["backgroundRepeat"]; size?: string; video?: string | UhuruBackgroundVideo; zIndex?: number; } function cssSize(value: number | string | undefined) { return typeof value === "number" ? `${value}px` : value; } function circuitTileSize(value: number | string | undefined) { if (typeof value === "number") { return value; } const parsed = value ? Number.parseFloat(value) : Number.NaN; return Number.isFinite(parsed) ? parsed : 200; } function UhuruCircuitPattern({ color, opacity, size, }: { color?: string; opacity?: number; size?: number | string; }) { const patternId = `uhuru-circuit-${useId().replace(/:/g, "")}`; const tileSize = circuitTileSize(size); const scale = tileSize / 200; const stroke = color ?? "currentColor"; return ( ); } export function UhuruBackground({ config }: { config?: UhuruBackgroundConfig }) { if (!config) { return null; } const logoSource = typeof config.logo === "string" ? config.logo : config.logo ? dwLogo : undefined; const videoSource = typeof config.video === "string" ? config.video : config.video?.src; const videoPoster = typeof config.video === "string" ? undefined : config.video?.poster; const hasMedia = Boolean(videoSource || config.image || logoSource); const mediaStyle = { filter: config.blur !== undefined ? `blur(${cssSize(config.blur)})` : undefined, objectFit: config.imageFit ?? "cover", objectPosition: config.position ?? "center", opacity: config.assetOpacity ?? 1, transform: config.blur !== undefined ? "scale(1.04)" : undefined, } satisfies CSSProperties; const patternStyle = { "--uhuru-background-pattern-color": config.patternColor, "--uhuru-background-pattern-opacity": config.patternOpacity, "--uhuru-background-pattern-size": cssSize(config.patternSize), } as CSSProperties; return (