Files
upload-gltf/components/ui/Modal.tsx
T

61 lines
1.6 KiB
TypeScript

import type { ReactNode } from 'react'
interface ModalProps {
ariaLabelledBy: string
children: ReactNode
}
export default function Modal({ ariaLabelledBy, children }: ModalProps) {
return (
<div
className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm"
role="dialog"
aria-modal="true"
aria-labelledby={ariaLabelledBy}
>
<div className="bg-black-900 border border-white/20 rounded-2xl p-6 max-w-md w-full mx-4 space-y-4">
{children}
</div>
</div>
)
}
interface ModalActionsProps {
cancelLabel: string
confirmLabel: string
onCancel: () => void
onConfirm: () => void
confirmClassName?: string
disabled?: boolean
}
export function ModalActions({
cancelLabel,
confirmLabel,
onCancel,
onConfirm,
confirmClassName = 'bg-white text-[#000000] hover:bg-gray-200',
disabled = false,
}: ModalActionsProps) {
return (
<div className="flex gap-3">
<button
onClick={onCancel}
disabled={disabled}
className="flex-1 bg-black-700 text-gray-300 font-medium text-sm
py-2.5 px-4 rounded-xl border border-white/10 transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed
hover:bg-black-600"
>
{cancelLabel}
</button>
<button
onClick={onConfirm}
disabled={disabled}
className={`flex-1 font-medium text-sm py-2.5 px-4 rounded-xl transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed ${confirmClassName}`}
>
{confirmLabel}
</button>
</div>
)
}