setIsEditing(true)}
onClick={handleClick}
// eslint-disable-next-line react/no-danger
dangerouslySetInnerHTML={{ __html: renderedHtml }}
/>
) : (
setIsEditing(true)}
>
Double-click to write…
)}
);
}
// ── Main panel manager ───────────────────────────────────────────────
interface HelpPanelManagerProps {
tabs: HelpTab[];
activeTab: string;
onTabSelect: (label: string) => void;
onTabClose: (label: string) => void;
onTabContentChange: (label: string, value: string) => void;
onOpenJournal: () => void;
onOpenDoc: (filename: string) => void;
}
function HelpPanelManager({ tabs, activeTab, onTabSelect, onTabClose, onTabContentChange, onOpenJournal, onOpenDoc }: HelpPanelManagerProps) {
const [collapsed, setCollapsed] = useState(false);
useEffect(() => {
const handler = (e: KeyboardEvent) => {
if (e.key === 'Escape' && activeTab) {
if (e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLInputElement) return;
onTabClose(activeTab);
}
};
document.addEventListener('keydown', handler);
return () => document.removeEventListener('keydown', handler);
}, [activeTab, onTabClose]);
if (tabs.length === 0) return null;
const active = tabs.find((t) => t.label === activeTab) || tabs[0];
return ReactDOM.createPortal(
{/* Tab bar */}
{tabs.map((t) => (
onTabSelect(t.label)}
>
{t.label}
))}
{!tabs.some((t) => t.type === 'journal') && (
)}
{/* Content */}
{!collapsed && (
active.type === 'journal' ? (
onTabContentChange(active.label, val)}
onOpenDoc={onOpenDoc}
/>
) : (
)
)}
,
document.body,
);
}
export default HelpPanelManager;