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,