// 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 });