支持侧边栏折叠为图标模式

This commit is contained in:
JSR
2026-03-18 18:47:35 +08:00
parent 4fb017ab4a
commit 0ef074a3cc
+45 -22
View File
@@ -9,6 +9,8 @@ import {
FileTextOutlined, FileTextOutlined,
CloudOutlined, CloudOutlined,
UploadOutlined, UploadOutlined,
MenuFoldOutlined,
MenuUnfoldOutlined,
} from "@ant-design/icons" } from "@ant-design/icons"
import { useState, useEffect } from "react" import { useState, useEffect } from "react"
import { useTranslation } from "react-i18next" import { useTranslation } from "react-i18next"
@@ -30,6 +32,7 @@ interface DbStatus {
export function Sidebar({ activeMenu, permission, onMenuChange }: SidebarProps): React.JSX.Element { export function Sidebar({ activeMenu, permission, onMenuChange }: SidebarProps): React.JSX.Element {
const { t } = useTranslation() const { t } = useTranslation()
const [collapsed, setCollapsed] = useState(false)
const [dbStatus, setDbStatus] = useState<DbStatus>({ type: "sqlite", connected: true }) const [dbStatus, setDbStatus] = useState<DbStatus>({ type: "sqlite", connected: true })
const [syncLoading, setSyncLoading] = useState(false) const [syncLoading, setSyncLoading] = useState(false)
const [messageApi, contextHolder] = message.useMessage() const [messageApi, contextHolder] = message.useMessage()
@@ -176,6 +179,8 @@ export function Sidebar({ activeMenu, permission, onMenuChange }: SidebarProps):
<Sider <Sider
className="ss-sidebar" className="ss-sidebar"
width={200} width={200}
collapsed={collapsed}
collapsedWidth={80}
style={{ style={{
background: "var(--ss-sidebar-bg)", background: "var(--ss-sidebar-bg)",
borderRight: "1px solid var(--ss-border-color)", borderRight: "1px solid var(--ss-border-color)",
@@ -188,43 +193,61 @@ export function Sidebar({ activeMenu, permission, onMenuChange }: SidebarProps):
data-tauri-drag-region data-tauri-drag-region
style={ style={
{ {
padding: "32px 24px 16px", padding: collapsed ? "24px 8px 12px" : "32px 24px 16px",
textAlign: "center", textAlign: "center",
WebkitAppRegion: "drag", WebkitAppRegion: "drag",
userSelect: "none", userSelect: "none",
flexShrink: 0, flexShrink: 0,
position: "relative",
} as React.CSSProperties } as React.CSSProperties
} }
> >
<Button
type="text"
size="small"
onClick={() => setCollapsed((prev) => !prev)}
icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
style={{
position: "absolute",
top: "8px",
right: "8px",
WebkitAppRegion: "no-drag",
}}
/>
<img <img
src={appLogo} src={appLogo}
style={{ width: "48px", height: "48px", marginBottom: "12px" }} style={{ width: "48px", height: "48px", marginBottom: collapsed ? "0" : "12px" }}
alt="logo" alt="logo"
/> />
<h2 {!collapsed && (
style={{ <>
color: "var(--ss-sidebar-text, var(--ss-text-main))", <h2
margin: 0, style={{
fontSize: "20px", color: "var(--ss-sidebar-text, var(--ss-text-main))",
}} margin: 0,
> fontSize: "20px",
SecScore }}
</h2> >
<div SecScore
style={{ </h2>
fontSize: "12px", <div
color: "var(--ss-sidebar-text, var(--ss-text-main))", style={{
opacity: 0.8, fontSize: "12px",
marginTop: "4px", color: "var(--ss-sidebar-text, var(--ss-text-main))",
}} opacity: 0.8,
> marginTop: "4px",
{t("settings.about.appName")} }}
</div> >
{t("settings.about.appName")}
</div>
</>
)}
</div> </div>
<div style={{ flex: 1, overflowY: "auto", display: "flex", flexDirection: "column" }}> <div style={{ flex: 1, overflowY: "auto", display: "flex", flexDirection: "column" }}>
<Menu <Menu
mode="inline" mode="inline"
inlineCollapsed={collapsed}
selectedKeys={[activeMenu]} selectedKeys={[activeMenu]}
onClick={({ key }) => onMenuChange(key)} onClick={({ key }) => onMenuChange(key)}
style={{ style={{
@@ -236,7 +259,7 @@ export function Sidebar({ activeMenu, permission, onMenuChange }: SidebarProps):
/> />
</div> </div>
{dbStatus.type === "postgresql" && ( {!collapsed && dbStatus.type === "postgresql" && (
<Card <Card
size="small" size="small"
style={{ style={{