mirror of
https://github.com/JefferyHcool/BiliNote.git
synced 2026-09-05 07:36:45 +08:00
Merge pull request #300 from JefferyHcool/feature/ui-optimize
feat(ui): 工作区和生成历史面板支持折叠/展开
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import React, { FC } from 'react'
|
import React, { FC, useRef, useState } from 'react'
|
||||||
import { SlidersHorizontal } from 'lucide-react'
|
import { SlidersHorizontal, PanelLeftClose, PanelLeftOpen, History as HistoryIcon } from 'lucide-react'
|
||||||
import {
|
import {
|
||||||
Tooltip,
|
Tooltip,
|
||||||
TooltipContent,
|
TooltipContent,
|
||||||
@@ -7,24 +7,39 @@ import {
|
|||||||
TooltipTrigger,
|
TooltipTrigger,
|
||||||
} from '@/components/ui/tooltip.tsx'
|
} from '@/components/ui/tooltip.tsx'
|
||||||
|
|
||||||
import { useState } from 'react'
|
|
||||||
import { Link } from 'react-router-dom'
|
import { Link } from 'react-router-dom'
|
||||||
import { ResizablePanel, ResizablePanelGroup, ResizableHandle } from '@/components/ui/resizable'
|
import { ResizablePanel, ResizablePanelGroup, ResizableHandle } from '@/components/ui/resizable'
|
||||||
import {ScrollArea} from "@/components/ui/scroll-area.tsx";
|
import { ScrollArea } from "@/components/ui/scroll-area.tsx"
|
||||||
|
import type { ImperativePanelHandle } from 'react-resizable-panels'
|
||||||
import logo from '@/assets/icon.svg'
|
import logo from '@/assets/icon.svg'
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
NoteForm: React.ReactNode
|
NoteForm: React.ReactNode
|
||||||
Preview: React.ReactNode
|
Preview: React.ReactNode
|
||||||
History: React.ReactNode
|
History: React.ReactNode
|
||||||
}
|
}
|
||||||
|
|
||||||
const HomeLayout: FC<IProps> = ({ NoteForm, Preview, History }) => {
|
const HomeLayout: FC<IProps> = ({ NoteForm, Preview, History }) => {
|
||||||
const [, setShowSettings] = useState(false)
|
const [, setShowSettings] = useState(false)
|
||||||
|
const [isLeftCollapsed, setIsLeftCollapsed] = useState(false)
|
||||||
|
const [isMiddleCollapsed, setIsMiddleCollapsed] = useState(false)
|
||||||
|
const leftPanelRef = useRef<ImperativePanelHandle>(null)
|
||||||
|
const middlePanelRef = useRef<ImperativePanelHandle>(null)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex h-screen flex-col overflow-hidden">
|
<div className="flex h-screen flex-col overflow-hidden">
|
||||||
<ResizablePanelGroup direction="horizontal" className="h-full w-full">
|
<ResizablePanelGroup direction="horizontal" className="h-full w-full">
|
||||||
{/* 左边表单 */}
|
{/* 左边表单 */}
|
||||||
<ResizablePanel defaultSize={23} minSize={10} maxSize={35}>
|
<ResizablePanel
|
||||||
|
ref={leftPanelRef}
|
||||||
|
defaultSize={23}
|
||||||
|
minSize={10}
|
||||||
|
maxSize={35}
|
||||||
|
collapsible
|
||||||
|
collapsedSize={0}
|
||||||
|
onCollapse={() => setIsLeftCollapsed(true)}
|
||||||
|
onExpand={() => setIsLeftCollapsed(false)}
|
||||||
|
>
|
||||||
<aside className="flex h-full flex-col overflow-hidden border-r border-neutral-200 bg-white">
|
<aside className="flex h-full flex-col overflow-hidden border-r border-neutral-200 bg-white">
|
||||||
<header className="flex h-16 items-center justify-between px-6">
|
<header className="flex h-16 items-center justify-between px-6">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
@@ -33,7 +48,22 @@ const HomeLayout: FC<IProps> = ({ NoteForm, Preview, History }) => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="text-2xl font-bold text-gray-800">BiliNote</div>
|
<div className="text-2xl font-bold text-gray-800">BiliNote</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div className="flex items-center gap-1">
|
||||||
|
<TooltipProvider>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<button
|
||||||
|
onClick={() => leftPanelRef.current?.collapse()}
|
||||||
|
className="text-muted-foreground hover:text-primary cursor-pointer rounded p-1 hover:bg-neutral-100"
|
||||||
|
>
|
||||||
|
<PanelLeftClose className="h-5 w-5" />
|
||||||
|
</button>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>
|
||||||
|
<span>收起工作区</span>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
<TooltipProvider>
|
<TooltipProvider>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger onClick={() => setShowSettings(true)}>
|
<TooltipTrigger onClick={() => setShowSettings(true)}>
|
||||||
@@ -49,24 +79,89 @@ const HomeLayout: FC<IProps> = ({ NoteForm, Preview, History }) => {
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<ScrollArea className="flex-1 overflow-auto">
|
<ScrollArea className="flex-1 overflow-auto">
|
||||||
<div className=' p-4' >{NoteForm}</div>
|
<div className="p-4">{NoteForm}</div>
|
||||||
</ScrollArea>
|
</ScrollArea>
|
||||||
</aside>
|
</aside>
|
||||||
</ResizablePanel>
|
</ResizablePanel>
|
||||||
|
|
||||||
<ResizableHandle />
|
<ResizableHandle />
|
||||||
|
|
||||||
|
{/* 左面板折叠时的展开按钮 */}
|
||||||
|
{isLeftCollapsed && (
|
||||||
|
<TooltipProvider>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<button
|
||||||
|
onClick={() => leftPanelRef.current?.expand()}
|
||||||
|
className="flex h-full w-8 shrink-0 items-center justify-center border-r border-neutral-200 bg-white hover:bg-neutral-50"
|
||||||
|
>
|
||||||
|
<PanelLeftOpen className="h-4 w-4 text-muted-foreground" />
|
||||||
|
</button>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent side="right">
|
||||||
|
<span>展开工作区</span>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* 中间历史 */}
|
{/* 中间历史 */}
|
||||||
<ResizablePanel defaultSize={16} minSize={10} maxSize={30}>
|
<ResizablePanel
|
||||||
|
ref={middlePanelRef}
|
||||||
|
defaultSize={16}
|
||||||
|
minSize={10}
|
||||||
|
maxSize={30}
|
||||||
|
collapsible
|
||||||
|
collapsedSize={0}
|
||||||
|
onCollapse={() => setIsMiddleCollapsed(true)}
|
||||||
|
onExpand={() => setIsMiddleCollapsed(false)}
|
||||||
|
>
|
||||||
<aside className="flex h-full flex-col overflow-hidden border-r border-neutral-200 bg-white">
|
<aside className="flex h-full flex-col overflow-hidden border-r border-neutral-200 bg-white">
|
||||||
|
<header className="flex h-10 shrink-0 items-center justify-between border-b border-neutral-100 px-3">
|
||||||
|
<span className="text-sm font-medium text-gray-600">生成历史</span>
|
||||||
|
<TooltipProvider>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<button
|
||||||
|
onClick={() => middlePanelRef.current?.collapse()}
|
||||||
|
className="text-muted-foreground hover:text-primary cursor-pointer rounded p-1 hover:bg-neutral-100"
|
||||||
|
>
|
||||||
|
<PanelLeftClose className="h-4 w-4" />
|
||||||
|
</button>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>
|
||||||
|
<span>收起历史</span>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
|
</header>
|
||||||
<ScrollArea className="flex-1 overflow-auto">
|
<ScrollArea className="flex-1 overflow-auto">
|
||||||
<div className="">{History}</div>
|
<div>{History}</div>
|
||||||
</ScrollArea>
|
</ScrollArea>
|
||||||
</aside>
|
</aside>
|
||||||
</ResizablePanel>
|
</ResizablePanel>
|
||||||
|
|
||||||
<ResizableHandle />
|
<ResizableHandle />
|
||||||
|
|
||||||
|
{/* 中间面板折叠时的展开按钮 */}
|
||||||
|
{isMiddleCollapsed && (
|
||||||
|
<TooltipProvider>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<button
|
||||||
|
onClick={() => middlePanelRef.current?.expand()}
|
||||||
|
className="flex h-full w-8 shrink-0 items-center justify-center border-r border-neutral-200 bg-white hover:bg-neutral-50"
|
||||||
|
>
|
||||||
|
<HistoryIcon className="h-4 w-4 text-muted-foreground" />
|
||||||
|
</button>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent side="right">
|
||||||
|
<span>展开历史</span>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* 右边预览 */}
|
{/* 右边预览 */}
|
||||||
<ResizablePanel defaultSize={61} minSize={30}>
|
<ResizablePanel defaultSize={61} minSize={30}>
|
||||||
<main className="flex h-full flex-col overflow-hidden bg-white p-6">{Preview}</main>
|
<main className="flex h-full flex-col overflow-hidden bg-white p-6">{Preview}</main>
|
||||||
|
|||||||
Reference in New Issue
Block a user