import { Component, createEffect, createMemo, createSignal } from "solid-js"; import { useLocation } from "@solidjs/router"; // 导入组件以注册自定义元素 import "./components"; import { Article, MobileSidebar, DesktopSidebar, DocDialog, DataSourceDialog, } from "./components"; import { generateToc, type FileNode, type TocNode } from "./data-loader"; const App: Component = () => { const location = useLocation(); const [isSidebarOpen, setIsSidebarOpen] = createSignal(false); const [isDocOpen, setIsDocOpen] = createSignal(false); const [isDataSourceOpen, setIsDataSourceOpen] = createSignal(false); // Sidebar and TOC data — reload when source changes const [fileTree, setFileTree] = createSignal([]); const [pathHeadings, setPathHeadings] = createSignal< Record >({}); const [tocKey, setTocKey] = createSignal(0); const loadToc = async () => { const toc = await generateToc(); setFileTree(toc.fileTree); setPathHeadings(toc.pathHeadings); }; // Load TOC on mount and when source changes createEffect(() => { void tocKey(); void loadToc(); }); const handleSourceChanged = () => { setTocKey((k) => k + 1); }; const currentPath = createMemo(() => { // 根据路由加载对应的 markdown 文件 let path = decodeURIComponent(location.pathname); if (!path) path = "/content/"; if (path.endsWith("/")) path += "index"; if (!path.endsWith(".md")) path += ".md"; return path; }); return (
{/* 桌面端固定侧边栏 */} {/* 移动端抽屉式侧边栏 */} setIsSidebarOpen(false)} fileTree={fileTree()} pathHeadings={pathHeadings()} />
{/* 仅在移动端显示菜单按钮 */}

TTRPG Tools

{/* fill th rest of the space*/}
setIsDocOpen(false)} /> setIsDataSourceOpen(false)} onSourceChanged={handleSourceChanged} />
); }; export default App;