定价

Breadcrumb 使用手册

v1.2.0 · @snowui-design-system/components

许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。

组件介绍

展示当前页面的层级路径,帮助用户理解所在位置并返回上级页面。

使用选择

用于表达当前页面的层级路径。平级内容切换用 Tab,应用导航用 Sidebar;路由跳转由页面处理。

  • items 生成路径,最后一项自动成为不可交互的当前页。

  • 显式 children 使用 Button as="item" 与 Text as="separator",会替换 items;parts 仅配置默认生成的内容。

  • 根导航默认名称随LocaleProvider更新,显式ariaLabel优先;路径文字与业务内容保持调用方原文。

快速开始

以下示例展示推荐的基本组合。更多场景与组合限制见后文。

<script lang="ts">	import { Breadcrumb } from '@snowui-design-system/components';</script> <Breadcrumb	ariaLabel="SnowUI component page path"	items={[		{ label: 'Components' },		{ label: 'Navigation' },		{ label: 'Breadcrumb' }	]}/>

API

关键字 类型 默认值 描述
ariaLabel string locale 文案 根导航区域的无障碍标签;省略时随LocaleProvider更新,显式ariaLabel优先
gap number — 继承 Frame 的间距 token 索引,设置路径元素的首选行/列间距;省略保留原首选值,有效间距至少为 4 CSS px,显式零与根字号/间距缩放不压低下限;更大首选间距及根容器原换行合同保留。
variant BreadcrumbVariant "borderless" 内部 Button as="item" 的默认 Button 变体;parts 与子级 Button 显式 variant 可覆盖
children Snippet — 显式声明 Button as="item" 与 Text as="separator",替换内建 items 与 separator;最后一个 item 仍自动成为当前页。
items BreadcrumbItem[] [] 内建路径数据,每项含 label、可选 href/disabled;自动生成 Button 与分隔 Text,最后一项为不可交互的当前页。children 存在时忽略此数组。
separator string "/" 内建路径项之间的分隔文字;仅在 items 模式使用,显式组合时自行声明 as="separator"。
parts ComponentPartsOf<{ Button: typeof Button; Text: typeof Text }> — 配置 items 模式生成的 Button 与分隔 Text;不作用于显式 children,当前页及角色语义仍由 Breadcrumb 接管。

未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。

使用边界与详细说明

功能概览

  • 默认 items API + 显式组合高级 API。

  • 最后一个 as="item" 自动作为当前页面。

  • 可通过 variant 给内部 Button as="item" 提供默认 Button 变体。

  • 非当前 item 默认整体透明度 40%,hover 时恢复 100%。

  • item 属于同一导航复合控件,默认关闭 Button hover 放大;显式 scaleOnHover={true} 可按实例重新开启。

  • 当前页面 item 输出 aria-current="page",不可 hover、不可点击、不可键盘激活。

  • separator 默认使用 14px / 20px 与 black/10%。


子级角色

角色 推荐写法 描述
item <Button as="item">...</Button> 一个面包屑路径片段
separator <Text as="separator">/</Text> 分隔符;显式组合自行声明,默认 items 模式可用 separator prop

SnowUI 组件使用 as="item" / as="separator";原生元素使用 data-as="item" / data-as="separator"。

基础用法

<Breadcrumb>    <Button as="item" href="/dashboards">Dashboards</Button>    <Text as="separator">/</Text>    <Button as="item">Default</Button></Breadcrumb>

统一 Button 变体

<Breadcrumb variant="borderless">    <Button as="item" href="/dashboards">Dashboards</Button>    <Text as="separator">/</Text>    <Button as="item" variant="outline">Custom</Button>    <Text as="separator">/</Text>    <Button as="item">Default</Button></Breadcrumb>

Breadcrumb variant 只作为 item Button 的默认值:未写 variant 的 item 使用 Breadcrumb 的 variant,显式写了 variant 的 Button 保持自己的变体。若 Breadcrumb 不写 variant,Button 继续使用 Button 默认变体。

多级路径

<Breadcrumb>    <Button as="item" href="/">Home</Button>    <Text as="separator">/</Text>    <Button as="item" href="/dashboards">Dashboards</Button>    <Text as="separator">/</Text>    <Button as="item" href="/dashboards/default">Default</Button></Breadcrumb>

最后一个 item 会被自动标记为当前页,即使写了 href 也不会触发点击或跳转。

行为规则

  1. 当前页面固定为 Breadcrumb 内最后一个 as="item" / data-as="item"。

  2. 不提供 currentIndex,不支持指定任意一项为当前页。

  3. 当前项自动设置 aria-current="page"、data-current="page"、tabindex="-1"。

  4. 当前项不会触发 Button hover、click、Enter 或 Space。

  5. separator 自动设置 aria-hidden="true"。

  6. Breadcrumb 的 variant 只影响 Button as="item" 的默认 Button 变体,且不覆盖子级显式 variant。

  7. Breadcrumb 为 item 提供 scaleOnHover=false 默认值;子级 Button 的显式值优先。

布局模型

主布局模型:内联外壳布局。定义见 ../../../specs/maintainers/LayoutProtocol.md §12.4(源码参考:specs/maintainers/LayoutProtocol.md)。

  • Breadcrumb 根是 nav 容器,内部内容整体 Hug。

  • 根容器使用 inline-flex,允许换行。

  • 子级 Button 保留自身内联外壳布局。

  • 子级 Text 保留自身文本流布局。

  • Breadcrumb 只管理根 gap、separator 样式、非当前透明度与最后一项当前态。

  • 路径元素之间的有效行/列间距至少为 4 CSS px;显式 gap={0}、根字号或间距缩放不压低下限,较大首选间距保持。根容器继续允许路径片段换行,不把整条导航强制改成 singleLine;各 Button 内部的图文单行仍由 Button 拥有。

布局变量链:

变量 默认值 用途
--snowui-breadcrumb-row-gap var(--gap-1) 换行时的行间距
--snowui-breadcrumb-column-gap var(--gap-1) item 与 separator 的列间距
--snowui-breadcrumb-separator-font-size var(--text-14) separator 字号
--snowui-breadcrumb-separator-line-height var(--leading-14) separator 行高
--snowui-breadcrumb-separator-color var(--black-10, rgba(0,0,0,0.1)) separator 颜色
--snowui-breadcrumb-inactive-opacity 0.4 非当前 item 默认透明度
--snowui-breadcrumb-inactive-hover-opacity 1 非当前 item hover 透明度

先阅读 完整 LICENSE;同任务、同版本、同范围去重。

优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。

变量 用途与默认参考
--snowui-breadcrumb-column-gap-override 列间距(默认 var(--gap-1) = 4px)
--snowui-breadcrumb-inactive-hover-opacity-override 非当前 item hover 透明度(默认 1)
--snowui-breadcrumb-inactive-opacity-override 非当前 item 默认透明度(默认 0.4)
--snowui-breadcrumb-row-gap-override 换行行距(默认 var(--gap-1) = 4px)
--snowui-breadcrumb-separator-color-override separator color(默认 var(--black-10))
--snowui-breadcrumb-separator-font-size-override separator font-size(默认 var(--text-14) = 14px)
--snowui-breadcrumb-separator-line-height-override separator line-height(默认 var(--leading-14) = 20px)

设计指南 · Token · 组合边界

必填属性:无具名必填属性。

可双向绑定:本组件未声明具名双向绑定属性;状态更新通过公开回调或所属宿主处理。

继承声明:Omit<FrameProps, "children">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。

共享 Frame API · 返回 API

以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。

来源:components/src/context.ts

export type BreadcrumbVariant = "gray" | "filled" | "outline" | "borderless";

来源:components/src/components/Breadcrumb.svelte

export interface BreadcrumbItem {        label: string;        href?: string;        disabled?: boolean;    }

ComponentPartsOf

来源:components/src/logic/component-parts.svelte.ts

export type ComponentPartsOf<    T extends Record<string, Component<any>>,> = {    [K in keyof T]?: ConfigurableComponentPartProps<T[K]>;};

ConfigurableComponentPartProps

来源:components/src/logic/component-parts.svelte.ts

export type ConfigurableComponentPartProps<C extends Component<any>> = Partial<    Omit<ComponentProps<C>, ComponentPartControlledKey>>;

ComponentPartControlledKey

来源:components/src/logic/component-parts.svelte.ts

export type ComponentPartControlledKey =    | "children"    | "as"    | "value"    | "defaultValue"    | "open"    | "selected"    | "checked"    | "disabled"    | "readonly"    | "id"    | `on${string}`    | `aria-${string}`;