WinCode
Sessions

侧边栏自定义

拖拽调整侧边栏宽度、Peek 模式、折叠与展开

侧边栏自定义

侧边栏的可见性、宽度、Peek 模式都由 appStore 管理,并通过 localStorage 持久化。WinCode 把侧边栏做成可完全隐藏、可浮出、可拖拽调整宽度的组件,以适应不同屏幕尺寸。

拖拽调整侧边栏宽度

折叠与展开

操作触发方式源码位置
切换侧边栏标题栏按钮 / 快捷键appStore.toggleSidebar()
请求切换跨组件通信(如键盘 Hook)requestSidebarToggle() 增加计数器,由 AppWorkspace 监听
强制打开打开项目等操作openSidebar()
强制关闭全屏模式等closeSidebar()

开关状态写入 localStorage['sidebar-open'],应用重启后保留。

拖拽调整宽度

侧边栏右侧有一个 ResizeHandle(在 AppWorkspace.tsx 中),鼠标按下后进入拖拽模式:

  • 最小宽度 220 px,最大宽度 420 px(由 clampSidebarWidth 强制)
  • 默认宽度 260 px
  • 拖拽过程中 setSidebarWidth(next, true) 同步写入 localStorage['sidebar-width']
  • 拖拽时添加 resizing 属性到 Sidebar,禁用 transition 以避免卡顿

右 Explorer 面板的宽度同样可拖拽,最小 360 px,与侧边栏独立计算。

Peek 模式

当侧边栏被折叠时,WinCode 不会完全放弃它 —— 而是进入 Peek 模式:

  1. 屏幕左侧保留一条 3 px 宽的触发区(sidebarPeekTriggerRef)
  2. 鼠标进入触发区时,以浮动方式弹出侧边栏(floating 属性)
  3. 鼠标离开侧边栏面板或触发区后自动隐藏
  4. 面板以 translate-x-0 / -translate-x-2 + 淡入淡出过渡,动画时长 200ms

Peek 面板与常规侧边栏共用同一个 Sidebar 组件,只是多了 floatingtemporaryVisible 两个 props:

<Sidebar
  floating                     // 绝对定位 + 阴影
  temporaryVisible={sidebarPeekVisible}  // 临时可见,不依赖 sidebarOpen
  projectRefreshVersion={...}
/>

Peek 模式下点击某个会话,会触发正常的激活逻辑,但不会保持侧边栏打开 —— 需要再次手动展开。

浮动侧边栏的样式

floating 模式启用时:

absolute inset-y-0 left-0 z-30 shadow-[var(--shadow-lg)]

与普通模式的区别:

模式定位阴影占用布局
普通静态 flex 子元素仅右边框占用主工作区宽度
浮动absolute + z-30shadow-lg覆盖在主工作区之上

切换动画

侧边栏展开/折叠有 200ms 的 transition-[width,opacity,transform] 动画:

  • 展开:从 -translate-x-2 opacity-0 过渡到 translate-x-0 opacity-100
  • 折叠:反向过渡
  • 拖拽中或 AppWorkspace 触发的同步动画期间,resizing 属性为 true,此时禁用 transition 以防抖动

相关文档

On this page