技术栈升级: - JavaScript → TypeScript 5.6(全量类型安全) - 原生 DOM → React 18(函数组件 + Hooks) - 全局变量 → Zustand 5(轻量状态管理) - localStorage → IndexedDB / Dexie.js 4(大容量、异步、索引) - marked.js → unified / remark / rehype(插件化渲染管线) - 无打包 → electron-vite 3(HMR 热更新) - 纯 CSS → CSS Variables + CSS Modules 新增功能: - 标签页状态 IndexedDB 持久化(关闭后可恢复) - 最近打开文件列表 - 大文件虚拟化行号(>2000 行) - 搜索高亮二分查找优化 O(log N) - rehype-sanitize HTML 安全过滤 文件结构: - 7 个源文件 → 51 个模块化文件 - src/main/ 主进程(6 文件) - src/preload/ 预加载(1 文件) - src/renderer/ 渲染进程(42 文件:组件/hooks/stores/lib/db/types/styles) - src/shared/ 共享类型(2 文件) 构建验证: - TypeScript 检查零错误 - electron-vite build 成功 - 产物:main 15kB + preload 2kB + renderer 1.5MB
139 lines
2.8 KiB
CSS
139 lines
2.8 KiB
CSS
/* Markdown Body Styles */
|
|
.markdown-body {
|
|
font-family: var(--font-ui);
|
|
font-size: 15px;
|
|
line-height: 1.7;
|
|
color: var(--text);
|
|
word-wrap: break-word;
|
|
}
|
|
|
|
.markdown-body h1, .markdown-body h2, .markdown-body h3,
|
|
.markdown-body h4, .markdown-body h5, .markdown-body h6 {
|
|
margin-top: 24px;
|
|
margin-bottom: 16px;
|
|
font-weight: 600;
|
|
line-height: 1.25;
|
|
color: var(--text);
|
|
}
|
|
|
|
.markdown-body h1 {
|
|
font-size: 2em;
|
|
padding-bottom: 0.3em;
|
|
border-bottom: 1px solid var(--border);
|
|
}
|
|
|
|
.markdown-body h2 {
|
|
font-size: 1.5em;
|
|
padding-bottom: 0.3em;
|
|
border-bottom: 1px solid var(--border-light);
|
|
}
|
|
|
|
.markdown-body h3 { font-size: 1.25em; }
|
|
.markdown-body h4 { font-size: 1em; }
|
|
.markdown-body h5 { font-size: 0.875em; }
|
|
.markdown-body h6 { font-size: 0.85em; color: var(--text-secondary); }
|
|
|
|
.markdown-body p {
|
|
margin-top: 0;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.markdown-body a {
|
|
color: var(--primary);
|
|
text-decoration: none;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.markdown-body a:hover { text-decoration: underline; }
|
|
.markdown-body strong { font-weight: 600; }
|
|
|
|
.markdown-body img {
|
|
max-width: 100%;
|
|
height: auto;
|
|
border-radius: var(--radius);
|
|
margin: 8px 0;
|
|
}
|
|
|
|
.markdown-body hr {
|
|
height: 2px;
|
|
background: var(--border);
|
|
border: none;
|
|
margin: 24px 0;
|
|
border-radius: 1px;
|
|
}
|
|
|
|
.markdown-body blockquote {
|
|
margin: 0 0 16px 0;
|
|
padding: 4px 16px;
|
|
border-left: 4px solid var(--primary);
|
|
color: var(--text-secondary);
|
|
background: var(--bg-secondary);
|
|
border-radius: 0 var(--radius) var(--radius) 0;
|
|
}
|
|
|
|
.markdown-body blockquote p:last-child { margin-bottom: 0; }
|
|
|
|
.markdown-body ul, .markdown-body ol {
|
|
margin-top: 0;
|
|
margin-bottom: 16px;
|
|
padding-left: 2em;
|
|
}
|
|
|
|
.markdown-body li { margin-top: 4px; }
|
|
.markdown-body li + li { margin-top: 4px; }
|
|
|
|
.markdown-body code {
|
|
font-family: var(--font-mono);
|
|
font-size: 0.9em;
|
|
background: var(--code-bg);
|
|
padding: 2px 6px;
|
|
border-radius: 4px;
|
|
color: #e83e8c;
|
|
}
|
|
|
|
:root.dark .markdown-body code { color: #f48fb1; }
|
|
|
|
.markdown-body pre {
|
|
margin-top: 0;
|
|
margin-bottom: 16px;
|
|
padding: 16px;
|
|
background: var(--code-bg);
|
|
border-radius: var(--radius);
|
|
overflow-x: auto;
|
|
border: 1px solid var(--border-light);
|
|
}
|
|
|
|
.markdown-body pre code {
|
|
padding: 0;
|
|
background: transparent;
|
|
color: inherit;
|
|
font-size: 13px;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.markdown-body table {
|
|
border-collapse: collapse;
|
|
width: 100%;
|
|
margin-bottom: 16px;
|
|
overflow-x: auto;
|
|
display: block;
|
|
}
|
|
|
|
.markdown-body table th, .markdown-body table td {
|
|
padding: 8px 16px;
|
|
border: 1px solid var(--border);
|
|
text-align: left;
|
|
}
|
|
|
|
.markdown-body table th {
|
|
font-weight: 600;
|
|
background: var(--bg-secondary);
|
|
}
|
|
|
|
.markdown-body table tr:nth-child(even) { background: var(--bg-secondary); }
|
|
|
|
.markdown-body input[type="checkbox"] {
|
|
margin-right: 6px;
|
|
accent-color: var(--primary);
|
|
}
|