// aerOS — overlays: Toast, Modal, ConfirmDialog, Sheet. Exports to window. const { useState: _uS, useEffect: _uE, useCallback: _uC, useRef: _uR } = React; /* ----------------------------- Toast ----------------------------- */ const ToastCtx = React.createContext(null); function useToast() { return React.useContext(ToastCtx); } function ToastProvider({ children }) { const [toasts, setToasts] = _uS([]); const push = _uC((t) => { const id = Math.random().toString(36).slice(2); setToasts(ts => [...ts, { id, tone: 'ok', ...t }]); setTimeout(() => setToasts(ts => ts.filter(x => x.id !== id)), t.duration || 3200); }, []); const api = React.useMemo(() => ({ push, ok: (msg, title) => push({ tone: 'ok', msg, title }), error: (msg, title) => push({ tone: 'danger', msg, title }), info: (msg, title) => push({ tone: 'info', msg, title }), warn: (msg, title) => push({ tone: 'warn', msg, title }), }), [push]); const icons = { ok: Icon.checkCircle, danger: Icon.alert, info: Icon.info, warn: Icon.alert }; return ( {children}
{toasts.map(t => (
{icons[t.tone]({ size: 18 })}
{t.title &&
{t.title}
} {t.msg &&
{t.msg}
}
))}
); } /* ----------------------------- Modal ----------------------------- */ function Modal({ open, onClose, title, subtitle, children, footer, width = 560, icon }) { _uE(() => { if (!open) return; const onKey = e => { if (e.key === 'Escape') onClose && onClose(); }; window.addEventListener('keydown', onKey); const prev = document.body.style.overflow; document.body.style.overflow = 'hidden'; return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = prev; }; }, [open, onClose]); if (!open) return null; return (
{ if (e.target === e.currentTarget) onClose && onClose(); }} style={{ position: 'fixed', inset: 0, background: 'rgba(15,23,42,0.5)', backdropFilter: 'blur(2px)', display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 8000, padding: 20, animation: 'ds-fade-in 150ms ease' }}>
{title && (
{icon && {typeof icon === 'function' ? icon({ size: 19 }) : icon}}

{title}

{subtitle &&
{subtitle}
}
)}
{children}
{footer && }
); } /* ----------------------------- Sheet (side drawer) ----------------------------- */ function Sheet({ open, onClose, title, subtitle, children, footer, width = 460, side = 'right' }) { _uE(() => { if (!open) return; const onKey = e => { if (e.key === 'Escape') onClose && onClose(); }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [open, onClose]); if (!open) return null; return (
{ if (e.target === e.currentTarget) onClose && onClose(); }} style={{ position: 'fixed', inset: 0, background: 'rgba(15,23,42,0.5)', backdropFilter: 'blur(2px)', display: 'flex', justifyContent: side === 'right' ? 'flex-end' : 'flex-start', zIndex: 8000, animation: 'ds-fade-in 150ms ease' }}>

{title}

{subtitle &&
{subtitle}
}
{children}
{footer && }
); } /* ----------------------------- ConfirmDialog ----------------------------- */ function ConfirmDialog({ open, onClose, onConfirm, title, message, confirmLabel = 'Onayla', cancelLabel = 'Vazgeç', tone = 'danger' }) { return (
{Icon.alert({ size: 21 })}

{title}

{message}

); } const _sheetKeyframes = document.createElement('style'); _sheetKeyframes.textContent = '@keyframes ds-sheet-in { from { transform: translateX(100%); } to { transform: translateX(0); } }'; document.head.appendChild(_sheetKeyframes); Object.assign(window, { ToastProvider, useToast, Modal, Sheet, ConfirmDialog });