import { useEffect, useRef, type DialogHTMLAttributes, type ReactNode, type SyntheticEvent } from "react"; // окно: родной держит фокус и закрывает фон; Esc — onClose, закрытие по фону — на стороне использующего. // Остальные атрибуты (onCancel, onClick, aria-labelledby …) проходят насквозь и могут переопределить поведение по // умолчанию; нативное событие close — onNativeClose (имя onClose занято запросом закрытия). type Rest = Omit, "className" | "children" | "onClose" | "aria-label">; export function Dialog({ label, onClose, onNativeClose, size = "md", className, children, ...rest }: { label: string; onClose(): void; onNativeClose?(e: SyntheticEvent): void; size?: "sm" | "md" | "lg"; className?: string; children: ReactNode; } & Rest) { const ref = useRef(null); useEffect(() => { const d = ref.current; if (d && !d.open) d.showModal(); }, []); return ( { e.preventDefault(); onClose(); }} {...rest} onClose={onNativeClose}> {children} ); }