菜单

布局组件

相关源文件

布局组件为应用程序提供结构组织和导航功能。它们专注于侧边栏、导航菜单和可滚动区域的可组合模式。

概述

布局组件系统包含三个主要组件及其关联的子组件

组件结构映射到代码实体

来源

侧边栏系统提供了一个围绕上下文提供者模式构建的全面布局解决方案。它包含 24 个导出的组件和实用程序,用于创建响应式、可折叠的侧边栏。

核心架构 - 代码实体映射

组件层级结构

来源

常量和配置

侧边栏系统定义了几个控制其行为的常量

常量目的
SIDEBAR_COOKIE_NAME"sidebar_state"用于持久化的 Cookie 名称
SIDEBAR_COOKIE_MAX_AGE60 * 60 * 24 * 7一周过期
SIDEBAR_WIDTH"16rem"默认桌面宽度
SIDEBAR_WIDTH_MOBILE"18rem"移动端覆盖宽度
SIDEBAR_WIDTH_ICON"3rem"折叠图标模式宽度
SIDEBAR_KEYBOARD_SHORTCUT"b"键盘快捷键

配置属性

组件属性类型
侧边栏side"left" | "right"放置侧边
侧边栏variant"sidebar" | "floating" | "inset"视觉变体
侧边栏collapsible"offcanvas" | "icon" | "none"折叠行为
SidebarProviderdefaultOpen布尔值初始状态
SidebarMenuButtonvariant"default" | "outline"按钮样式
SidebarMenuButtonsize"default" | "sm" | "lg"按钮大小

来源

SidebarProvider 实现

SidebarProvider 通过 React 上下文模式管理侧边栏状态。它集成了移动端检测、键盘快捷键和基于 Cookie 的持久化

状态管理架构

组件属性和类型

SidebarProvider 接受这些属性,扩展了 React.ComponentProps<"div">

  • defaultOpen?: boolean - 初始打开状态(默认值:true
  • open?: boolean - 受控打开状态
  • onOpenChange?: (open: boolean) => void - 状态更改回调

SidebarContextProps 接口

来源

Sidebar 组件通过条件逻辑处理响应式渲染和变体样式

渲染逻辑流程

变体和侧边样式

该组件使用 cn() 实用程序,并根据属性进行条件类设置

  • 变体处理variant === "floating" || variant === "inset" 控制内边距和宽度计算
  • 侧边定位side === "left"side === "right" 确定 left-0right-0
  • 可折叠状态:数据属性触发不同的宽度和位置样式

组件结构

扩展了 React.ComponentProps<"div"> 并添加了额外属性

  • side?: "left" | "right"(默认值:"left"
  • variant?: "sidebar" | "floating" | "inset"(默认值:"sidebar"
  • collapsible?: "offcanvas" | "icon" | "none"(默认值:"offcanvas"

来源

结构化组件

侧边栏系统包含几个用于布局和交互的结构化组件

容器组件

组件目的主要功能
SidebarHeader固定顶部区域flex flex-col gap-2 p-2
SidebarContent可滚动主区域flex min-h-0 flex-1 flex-col gap-2 overflow-auto
SidebarFooter固定底部区域flex flex-col gap-2 p-2
SidebarGroup内容区域relative flex w-full min-w-0 flex-col p-2
SidebarInset主内容包装器处理 variant=inset 间距

交互式组件

组件扩展核心功能
SidebarTrigger按钮调用 toggleSidebar(),使用 PanelLeft 图标
SidebarRailbutton隐式切换轨道,光标调整大小指示器
SidebarSeparatorSeparator带有侧边栏主题的水平分隔符
SidebarInput输入带有侧边栏特定样式的输入字段

实用组件

该系统提供了几个实用组件以增强功能

  • SidebarMenuSkeleton - 带有随机宽度的加载状态
  • 所有组件都使用 data-sidebar 属性进行样式挂钩
  • 组件集成了 group-data-[collapsible=icon] 类以实现响应式行为

来源

侧边栏导航系统使用结构化的菜单组件层次结构

SidebarMenuButton 使用 cva() 进行变体管理

组件特性

组件主要属性特殊功能
SidebarMenuButtonasChild, isActive, tooltipTooltipContent 集成
SidebarMenuActionshowOnHover绝对定位,悬停透明度
SidebarMenuBadge标准 div 属性根据尺寸响应定位顶部值
SidebarMenuSub标准 ul 属性边框左样式,图标折叠时隐藏

来源

CSS 变量和主题化

侧边栏系统使用独立于主主题系统的专用 CSS 变量。这些变量在侧边栏安装指南中有详细说明

浅色主题变量

深色主题变量

Tailwind 配置

Tailwind 配置需要侧边栏颜色实用程序

来源

实现示例

基本侧边栏结构

高级模式 - 嵌套侧边栏

该系统支持复杂的布局,例如sidebar-09中的嵌套侧边栏

使用 useSidebar 进行状态管理

来源

NavigationMenu 组件包装了 @radix-ui/react-navigation-menu 并使用了 shadcn/ui 的样式。它提供了带视口管理和动画的下拉导航。

组件架构映射

实现细节

根组件接受一个 viewport 布尔属性来控制视口渲染

样式系统

使用 cva() 为触发器样式进行全面的状态类设置

来源

组件功能和属性

核心组件

组件基本元素主要属性目的
NavigationMenuNavigationMenuPrimitive.Rootviewport?: boolean带可选视口的根容器
NavigationMenuListNavigationMenuPrimitive.List标准 div 属性菜单项的 Flex 容器
NavigationMenuItemNavigationMenuPrimitive.Item标准属性单个菜单项包装器

交互式组件

组件基本元素主要功能
NavigationMenuTriggerNavigationMenuPrimitive.Trigger包含 ChevronDownIcon,旋转动画
NavigationMenuContentNavigationMenuPrimitive.Content复杂的动画类,视口感知样式
NavigationMenuLinkNavigationMenuPrimitive.Link活动状态样式,焦点管理

布局组件

  • NavigationMenuViewport - 包装在定位 div 中,处理高度/宽度 CSS 变量
  • NavigationMenuIndicator - 包含旋转边框元素以进行视觉指示

数据属性

所有组件都使用 data-slot 属性作为样式钩子

  • data-slot="navigation-menu"
  • data-slot="navigation-menu-list"
  • data-slot="navigation-menu-trigger"
  • 等等。

来源

动画和样式功能

视口管理

该组件包含复杂的视口处理

动画类

使用广泛的 Tailwind 动画实用工具

  • data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out
  • data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out
  • data-[motion=from-end]:slide-in-from-right-52
  • data-[state=open]:animate-in data-[state=closed]:animate-out

焦点管理

实现全面的焦点样式

  • focus-visible:ring-ring/50
  • focus-visible:ring-[3px] focus-visible:outline-1
  • outline-none transition-[color,box-shadow]

图标集成

  • 使用 Lucide React 的 ChevronDownIcon
  • 旋转动画:group-data-[state=open]:rotate-180
  • 尺寸和定位:relative top-[1px] ml-1 size-3

来源

实现示例

基本导航结构

无视口导航

适用于没有下拉视口的简单布局

使用 navigationMenuTriggerStyle

用于匹配触发器外观的自定义按钮样式

来源

滚动区域

ScrollArea 组件包装了 @radix-ui/react-scroll-area,用于提供自定义滚动条样式和焦点管理。

组件结构映射

实现细节

ScrollArea 函数

SCROLLBAR 函数

处理垂直和水平方向

来源

功能和样式

焦点管理

视口包含全面的焦点样式

  • focus-visible:ring-ring/50 - 环颜色带不透明度
  • focus-visible:ring-[3px] focus-visible:outline-1 - 环尺寸和轮廓
  • transition-[color,box-shadow] - 平滑焦点过渡

特定于方向的样式

方向目的
vertical (垂直)h-full w-2.5 border-l border-l-transparent全高,窄宽度,左边框
horizontal (水平)h-2.5 flex-col border-t border-t-transparent窄高度,列 Flex,上边框

滚动条组件

  • SCROLLBAR:容器带 touch-none select-none 用于移动端交互
  • ScrollAreaThumb:使用 bg-border relative flex-1 rounded-full 进行视觉样式设计
  • 自动边角ScrollAreaPrimitive.Corner 处理边角情况

数据属性

使用 data-slot 属性作为样式钩子

  • data-slot="scroll-area"
  • data-slot="scroll-area-viewport"
  • data-slot="scroll-area-scrollbar"
  • data-slot="scroll-area-thumb"

来源

实现示例

基本垂直滚动

水平滚动

需要显式 SCROLLBAR 并设置 orientation="horizontal"

两种方向

该组件自动包含 ScrollAreaPrimitive.Corner 来处理两个滚动条的交叉点。

来源

组件集成模式

布局组件旨在协同工作,以实现常见的应用程序模式。注册表中包含几个展示集成的块示例。

复杂布局示例 - sidebar-16

来自块注册表的站点标题和侧边栏模式

嵌套侧边栏模式 - sidebar-09

具有多个面板的复杂嵌套侧边栏

与其他组件的集成

布局组件可与核心 shadcn/ui 组件集成

布局组件集成对象模式
SidebarProviderTooltipProvider包装整个侧边栏系统
SidebarContentScrollArea可滚动内容区域
SidebarMenuButtonButtonTooltip交互式菜单项
Sidebar (移动端)SheetSheetContent移动响应式覆盖层
NavigationMenuRadix primitives下拉导航

来源

注册表依赖模式

布局组件在注册表中具有特定的依赖模式

块依赖

复杂的块,例如 sidebar-09 结合了多个系统

模块核心依赖项附加依赖
sidebar-09sidebarbreadcrumbseparatorcollapsibledropdown-menuavatarswitchlabel
sidebar-16sidebarbreadcrumbseparatorcollapsibledropdown-menuavatarbuttonlabel

集成优势

  1. 可组合的架构:每个组件都专注于特定的功能
  2. 共享依赖:像 cn()cva() 和 hooks 这样的通用工具
  3. 一致的 API:跨组件具有相似的属性模式
  4. 注册表管理:自动依赖解析与安装

来源

实施指南

上下文与状态管理

  1. SidebarProvider 作用域:包裹整个应用布局,而非单个页面
  2. 状态持久化:使用 defaultOpen 并与 Cookie 集成以保存用户偏好
  3. 移动端响应式:让 useIsMobile() Hook 自动处理响应式行为
  4. 受控与非受控组件:使用 open/onOpenChange 进行程序化控制

组件组合

  1. 数据属性:利用 data-sidebardata-slotdata-state 进行 CSS 目标定位
  2. 条件渲染:对于静态布局,使用 collapsible="none"
  3. 样式选择:根据布局需求选择合适的 variant
  4. 菜单结构:遵循 SidebarMenuSidebarMenuItemSidebarMenuButton 的层级结构

样式和主题

  1. CSS 变量:使用专用的侧边栏变量,而非全局主题颜色
  2. 类组合:利用 cn() 实用函数进行条件样式设置
  3. CVA 集成:使用 cva() 模式来定义组件变体
  4. 数据驱动样式:利用 group-data-[state]: 和类似的 CSS 选择器

性能考量

  1. 懒加载:考虑使用 React.Suspense 配合 SidebarMenuSkeleton 进行动态内容加载
  2. 记忆化:在 Provider 上下文中,使用 React.useMemoReact.useCallback
  3. 包大小:仅从注册表中导入所需的组件
  4. 动画性能:使用 CSS 过渡来处理状态更改

来源

迁移考量

升级或切换主题时,请考虑

  1. CSS 变量:特定主题的变量可能不同
  2. 组件结构:某些组件的层级结构可能会发生变化
  3. 样式和默认值:默认值和样式行为可能存在差异
  4. 响应式逻辑:移动断点和行为可能有所不同

来源