import { useMemo, useState } from "react"; import { COVERS } from "./constants.jsx"; export function EditNotebookModal({ notebook, onClose, onSave, dark, defaultMaxVersions }) { const [name, setName] = useState(notebook.name); const [sel, setSel] = useState(notebook.cover); // Empty means "use the server's default", which is why it is a string here and // not a number with a stand-in value. const [versions, setVersions] = useState(notebook.maxVersions == null ? "" : String(notebook.maxVersions)); const save = () => { if (!name.trim()) return; const n = versions.trim() === "" ? null : Math.max(1, Math.round(Number(versions))); onSave({ name: name.trim(), cover: sel, maxVersions: Number.isFinite(n) ? n : null }); }; const T = useMemo( () => ({ bg: dark ? "#161b22" : "#fff", border: dark ? "#30363d" : "#d0d7de", text: dark ? "#e6edf3" : "#1f2328", muted: dark ? "#8b949e" : "#656d76", active: dark ? "#388bfd" : "#0969da", }), [dark] ); return (
e.stopPropagation()} >

Edit Notebook

setName(e.target.value)} autoFocus style={{ width: "100%", padding: "10px 14px", borderRadius: 10, border: `1px solid ${T.border}`, background: dark ? "#0d1117" : "#f6f8fa", color: T.text, fontSize: 14, outline: "none", marginBottom: 16, boxSizing: "border-box", }} onKeyDown={(e) => { if (e.key === "Enter") save(); }} />
setVersions(e.target.value)} placeholder={defaultMaxVersions ? String(defaultMaxVersions) : "Default"} aria-label="Versions per note" style={{ width: 110, padding: "8px 12px", borderRadius: 10, border: `1px solid ${T.border}`, background: dark ? "#0d1117" : "#f6f8fa", color: T.text, fontSize: 14, outline: "none", boxSizing: "border-box", }} onKeyDown={(e) => { if (e.key === "Enter") save(); }} />
Older versions are only deleted once newer ones push them out — never by age. Leave it empty for the server's default{defaultMaxVersions ? `, which is ${defaultMaxVersions}` : ""}.
Cover style
{COVERS.map((c, i) => ( ))}
); } export function CreateNotebookModal({ onClose, onCreate, dark }) { const [name, setName] = useState(""); const [sel, setSel] = useState(0); const T = useMemo( () => ({ bg: dark ? "#161b22" : "#fff", border: dark ? "#30363d" : "#d0d7de", text: dark ? "#e6edf3" : "#1f2328", muted: dark ? "#8b949e" : "#656d76", active: dark ? "#388bfd" : "#0969da", }), [dark] ); return (
e.stopPropagation()} >

New Notebook

setName(e.target.value)} placeholder="Notebook name..." autoFocus style={{ width: "100%", padding: "10px 14px", borderRadius: 10, border: `1px solid ${T.border}`, background: dark ? "#0d1117" : "#f6f8fa", color: T.text, fontSize: 14, outline: "none", marginBottom: 16, boxSizing: "border-box", }} onKeyDown={(e) => { if (e.key === "Enter" && name.trim()) onCreate({ name: name.trim(), cover: sel }); }} />
Choose cover style
{COVERS.map((c, i) => ( ))}
); }