import React from "react"; import { cn } from "../../lib/cn"; /* Варианты размера контейнера */ const sizeVariants = { sm: "h-6 w-10", md: "h-7 w-12", lg: "h-8 w-14", }; /* Варианты для скользящего шарика */ const switchVariants = { size: { sm: "h-4 w-4", md: "h-5 w-5", lg: "h-6 w-6", }, activeSize: { sm: "group-active:w-5", md: "group-active:w-6", lg: "group-active:w-7", }, iconSize: { sm: "h-3 w-3", md: "h-[0.875rem] w-[0.875rem]", lg: "h-4 w-4", }, }; const colorsVariants = { default: "bg-default", primary: "bg-liquid-brightmain", secondary: "bg-liquid-darkmain", success: "bg-liquid-green", warning: "bg-liquid-orange", danger: "bg-liquid-red", }; const focuseOutlineVariants = { default: "[&:focus-visible+*]:outline-default", primary: "[&:focus-visible+*]:outline-liquid-brightmain", secondary: "[&:focus-visible+*]:outline-liquid-darkmain", success: "[&:focus-visible+*]:outline-liquid-green", warning: "[&:focus-visible+*]:outline-liquid-orange", danger: "[&:focus-visible+*]:outline-liquid-red", }; /** * Иконка солнца */ const sun = ( ); /** * Иконка луны */ const moon = ( ); interface SwitchProps { size?: "sm" | "md" | "lg"; disabled?: boolean; color?: | "default" | "primary" | "secondary" | "success" | "warning" | "danger"; label?: string; variant?: "default" | "label" | "icon" | "theme"; className?: string; defaultState?: boolean; onChange: (state: boolean) => void; } export const Switch: React.FC = ({ size = "sm", disabled = false, color = "primary", label = "", variant = "default", className, onChange, defaultState = false, }) => { const [active, setActive] = React.useState(defaultState); React.useEffect(() => onChange(active), [active]); return ( {/* Основной контейнер, */} {/* Скрытый checkbox */} { setActive(!active); }} /> {/* Шарик */} {variant == "theme" && ( <> {moon} {sun} > )} {variant == "label" && ( {label} )} ); };