Files
Netcatty/components/ui/switch.tsx
T
LAPTOP-O016UC3M\Qi Chen d719dfdc69 Add integrated FIDO2 SSH key generation workflow
Implements a comprehensive UI and backend bridge for FIDO2 hardware and platform authenticator SSH key creation, including device selection, PIN entry, and touch prompts. Modernizes the key generation panel with enhanced options, feedback, and error handling, and establishes Electron IPC support for seamless device communication.

Improves security, user experience, and support for modern authentication hardware.
2025-12-16 11:40:43 +08:00

63 lines
1.9 KiB
TypeScript

import * as React from "react"
import { cn } from "../../lib/utils"
export interface SwitchProps
extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {
checked?: boolean;
onCheckedChange?: (checked: boolean) => void;
}
const Switch = React.forwardRef<HTMLInputElement, SwitchProps>(
({ className, checked, onCheckedChange, disabled, ...props }, ref) => {
const handleClick = () => {
if (!disabled && onCheckedChange) {
onCheckedChange(!checked);
}
};
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
if (!disabled && onCheckedChange) {
onCheckedChange(!checked);
}
}
};
return (
<div
role="switch"
aria-checked={checked}
tabIndex={disabled ? -1 : 0}
onClick={handleClick}
onKeyDown={handleKeyDown}
className={cn(
"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent 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",
checked ? "bg-primary" : "bg-input",
disabled && "cursor-not-allowed opacity-50",
className
)}
>
<input
type="checkbox"
className="sr-only"
ref={ref}
checked={checked}
disabled={disabled}
onChange={(e) => onCheckedChange?.(e.target.checked)}
{...props}
/>
<span
className={cn(
"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform",
checked ? "translate-x-5" : "translate-x-0"
)}
/>
</div>
)
}
)
Switch.displayName = "Switch"
export { Switch }