mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-10-09 15:58:34 +00:00
d719dfdc69
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.
63 lines
1.9 KiB
TypeScript
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 }
|