diff --git a/src/App.tsx b/src/App.tsx
index f0e98a6..7044905 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,4 +1,4 @@
-import { useEffect } from 'react'
+import { useEffect, useState } from 'react'
import { Sidebar } from './components/sidebar/Sidebar'
import { Editor } from './components/editor/Editor'
import { AiPanel } from './components/ai/AiPanel'
@@ -7,6 +7,7 @@ import { seedIfEmpty, deduplicateDB } from './db'
export default function App() {
const { loadAll, theme, focusMode, aiPanelOpen, toggleFocusMode, toggleAiPanel, createNote, activeFolderId } = useAppStore()
+ const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false)
useEffect(() => {
document.documentElement.setAttribute('data-theme', theme)
@@ -31,10 +32,34 @@ export default function App() {
return (
-
-
+ <>
+ {mobileSidebarOpen && (
+
setMobileSidebarOpen(false)}
+ />
+ )}
+
+
+
+ {!focusMode && (
+
+ )}
+ >
+
+
-
{aiPanelOpen &&
}
)
diff --git a/src/index.css b/src/index.css
index 36ead80..890e427 100644
--- a/src/index.css
+++ b/src/index.css
@@ -286,6 +286,51 @@
animation: ai-blink 0.8s ease infinite;
}
+/* 移动端响应式 */
+.mobile-menu-btn {
+ display: none;
+}
+
+@media (max-width: 640px) {
+ .mobile-menu-btn {
+ display: flex;
+ position: fixed;
+ top: 12px;
+ left: 12px;
+ z-index: 40;
+ width: 36px;
+ height: 36px;
+ align-items: center;
+ justify-content: center;
+ border-radius: 8px;
+ font-size: 18px;
+ background: var(--bg-subtle);
+ border: 1px solid var(--border);
+ color: var(--text);
+ cursor: pointer;
+ }
+
+ .sidebar-panel {
+ position: fixed !important;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ z-index: 35;
+ transform: translateX(-100%);
+ transition: transform 0.22s ease;
+ box-shadow: 4px 0 24px rgba(0,0,0,0.3);
+ }
+
+ .sidebar-panel[data-mobile-open="true"] {
+ transform: translateX(0);
+ }
+
+ .editor-main {
+ margin-left: 0 !important;
+ padding-left: 48px;
+ }
+}
+
/* ── Print / PDF export ── */
@media print {
aside, [data-ai-panel], .floating-toolbar, .editor-toolbar,