components/ui/switch.tsx (43 lines of code) (raw):

import * as React from "react"; import * as SwitchPrimitives from "@radix-ui/react-switch"; import { cn } from "@/lib/utils"; export type SwitchProps = React.ComponentPropsWithoutRef< typeof SwitchPrimitives.Root > & { mode?: "default" | "custom"; }; const Switch = React.forwardRef< React.ElementRef<typeof SwitchPrimitives.Root>, SwitchProps >(({ className, mode = "default", ...props }, ref) => ( <SwitchPrimitives.Root className={cn( "peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50", mode === "custom" ? "bg-custom-background" : "data-[state=checked]:bg-primary data-[state=unchecked]:bg-input", className )} {...props} ref={ref} > <SwitchPrimitives.Thumb className={cn( "pointer-events-none block h-4 w-4 rounded-full shadow-lg ring-0 transition-transform", mode === "custom" ? "bg-custom-thumb" : "bg-background", "data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0" )} /> </SwitchPrimitives.Root> )); // Add custom styles for the 'custom' mode const customStyles = ` .bg-custom-background { background-color: #f0f0f0; } .bg-custom-thumb { background-color: #ff6347; } `; // Inject custom styles into the document if (typeof document !== "undefined") { const style = document.createElement("style"); style.textContent = customStyles; document.head.append(style); } Switch.displayName = "Switch"; // Example usage of the Switch component to avoid unused variable warning const ExampleUsage = () => <Switch mode="custom" />; export { Switch, ExampleUsage };