fix: 移动端侧边栏响应式布局
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
dab36ca327
commit
dff9f90bf2
33
src/App.tsx
33
src/App.tsx
@ -1,4 +1,4 @@
|
|||||||
import { useEffect } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import { Sidebar } from './components/sidebar/Sidebar'
|
import { Sidebar } from './components/sidebar/Sidebar'
|
||||||
import { Editor } from './components/editor/Editor'
|
import { Editor } from './components/editor/Editor'
|
||||||
import { AiPanel } from './components/ai/AiPanel'
|
import { AiPanel } from './components/ai/AiPanel'
|
||||||
@ -7,6 +7,7 @@ import { seedIfEmpty, deduplicateDB } from './db'
|
|||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const { loadAll, theme, focusMode, aiPanelOpen, toggleFocusMode, toggleAiPanel, createNote, activeFolderId } = useAppStore()
|
const { loadAll, theme, focusMode, aiPanelOpen, toggleFocusMode, toggleAiPanel, createNote, activeFolderId } = useAppStore()
|
||||||
|
const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.documentElement.setAttribute('data-theme', theme)
|
document.documentElement.setAttribute('data-theme', theme)
|
||||||
@ -31,10 +32,34 @@ export default function App() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex h-screen w-full overflow-hidden" style={{ background: 'var(--bg)' }}>
|
<div className="flex h-screen w-full overflow-hidden" style={{ background: 'var(--bg)' }}>
|
||||||
<div className={`sidebar-panel${focusMode ? ' hidden' : ''}`} style={{ width: 260 }}>
|
<>
|
||||||
<Sidebar />
|
{mobileSidebarOpen && (
|
||||||
|
<div
|
||||||
|
className="fixed inset-0 z-30"
|
||||||
|
style={{ background: 'rgba(0,0,0,0.4)' }}
|
||||||
|
onClick={() => setMobileSidebarOpen(false)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<div
|
||||||
|
className={`sidebar-panel${focusMode ? ' hidden' : ''}`}
|
||||||
|
style={{ width: 260 }}
|
||||||
|
data-mobile-open={mobileSidebarOpen}
|
||||||
|
>
|
||||||
|
<Sidebar />
|
||||||
|
</div>
|
||||||
|
{!focusMode && (
|
||||||
|
<button
|
||||||
|
className="mobile-menu-btn"
|
||||||
|
onClick={() => setMobileSidebarOpen(v => !v)}
|
||||||
|
aria-label="打开菜单"
|
||||||
|
>
|
||||||
|
☰
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
<div className="flex-1 min-w-0 h-full flex flex-col editor-main">
|
||||||
|
<Editor />
|
||||||
</div>
|
</div>
|
||||||
<Editor />
|
|
||||||
{aiPanelOpen && <AiPanel />}
|
{aiPanelOpen && <AiPanel />}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -286,6 +286,51 @@
|
|||||||
animation: ai-blink 0.8s ease infinite;
|
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 ── */
|
/* ── Print / PDF export ── */
|
||||||
@media print {
|
@media print {
|
||||||
aside, [data-ai-panel], .floating-toolbar, .editor-toolbar,
|
aside, [data-ai-panel], .floating-toolbar, .editor-toolbar,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user