// ============================================================================ // modals.jsx — Add / Edit pour entrées (mot de passe + Wi-Fi). // Toutes les modifs passent par la callback onSave qui re-chiffre le coffre // côté app.jsx puis pousse via PUT /api.php?action=vault. // ============================================================================ (function (global) { 'use strict'; const { useState, useMemo } = React; // ─── Modal de base : header + corps + footer + Esc/Backdrop ────────────── function ModalShell({ title, subtitle, children, onCancel, footer }) { React.useEffect(() => { const onKey = (e) => { if (e.key === 'Escape') onCancel(); }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [onCancel]); return (
e.stopPropagation()}>

{title}

{subtitle &&

{subtitle}

}
{children}
{footer}
); } // ─── Champ texte étiqueté ──────────────────────────────────────────────── function TextField({ label, value, onChange, type = 'text', placeholder, autoFocus, required, mono }) { return ( ); } function Textarea({ label, value, onChange, placeholder, rows = 3 }) { return (