定价

Badge 使用手册

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

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

组件介绍

用紧凑的数字、文字或圆点提示未读数量与状态,可搭配按钮、头像和导航项使用。

使用选择

用于简短状态或数量提示。需要用户点击执行动作时使用 Button;输入中的可操作标签按 Chip 或 Tag 的交互选择。

  • children 优先于 count;显式 dot 只显示圆点,不显示内容。

  • 数量默认最大显示 99,零默认隐藏;使用 max / showZero 修改。Avatar 或 Icon 上的角标用 as="badge"。

快速开始

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

<script lang="ts">	import { Avatar, Badge } from '@snowui-design-system/components';	import { AvatarAbstract03 } from '@snowui-design-system/resource-svelte';</script> <div style="display: flex; align-items: center; flex-wrap: wrap; gap: var(--gap-4) var(--gap-3);">	<Avatar fallbackColor="orange" aria-label="Release notifications" size={48}><Badge as="badge" count={5} /></Avatar>	<Avatar fallbackColor="cyan" aria-label="Documentation inbox" size={48} badgePosition="bottom"><Badge as="badge" count={120} max={99} color="Orange" /></Avatar>	<Avatar src={AvatarAbstract03} aria-label="New components" size={48}><Badge as="badge" count="New" color="Red" /></Avatar>	<Avatar fallbackColor="red" aria-label="Maintainer online" size={48} badgePosition="bottom"><Badge as="badge" dot color="Green" /></Avatar></div>

API

关键字 类型 默认值 描述
variant "filled" | "border" "filled" 视觉变体。border 与 Kbd 默认 border 视觉一致:透明背景、内描边、继承文字色、0×4px padding 与 6px 圆角
count number | string — 徽标数字或文字;数字超过 max 显示 max+,普通字符串保持原文。0 和字符串 "0" 默认隐藏,showZero 可保留;stateCount 命中状态时覆盖此值。
stateCount StateValueMap<number | string> — 根据最近父级 Frame 状态映射 count,用于声明式控制 Badge 显隐
dot boolean — true 强制圆点,false 使用内容模式;未传时仅在解析后的 count 为 undefined 且没有 children 时自动显示圆点。
max number 99 数字模式的最大值 (超过显示 max+)
showZero boolean false false 时隐藏数值 0、字符串 "0" 及无内容的非圆点徽标;true 保留。圆点与 loading 显示不受零值隐藏控制。
color SnowUIColor | string "Brand" filled 与 dot 的填充颜色,支持 PascalCase 语义色及 CSS 颜色值;filled 文字保持白色,border 内容模式仍使用透明背景与继承文字色。
size ResourceSize — 12/16/20/24/28/32/40/48/80;未指定时读取父级尺寸上下文。border 内容模式保持文字 Hug;作为 Avatar/Icon 角标时尺寸由宿主角标协议解析。
children Snippet — 自定义徽标内容,显示优先于 count;有 children 且未指定 dot 时使用内容模式,dot=true 时不渲染这些内容。

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

使用边界与详细说明

关键字 (Keyword)

关键字 类型 默认值 描述
as string — 向外部宿主声明角色;"badge" 使 Icon/Avatar 按其角标协议定位并配置此 Badge,不改变其 dot/count 内容选择。

布局模型

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

Badge 的根节点是 inline-level 定位外壳,内容整体 Hug:

  • 根节点保持 inline-flex,负责宿主定位、尺寸测量和 Frame 位移动效;默认 flex-shrink: 0,在窄横向容器内保留文字与内边距,不被相邻内容挤瘦。

  • 内层 .snowui-badge-surface 负责 background / padding / radius / min-width / font-size / line-height,并作为完整视觉 Badge 承担 scale / opacity / blur 动效。

  • 内部 snowui-morph-container 使用 Grid Stacking 保持数字变化时的布局稳定性;内容层以容器 50% 为锚点并回移自身 50%,固定尺寸小于文字最小宽度时仍以 Badge 中心为原点对称溢出,不依赖 Grid 的安全溢出回退。文字和数字均保持严格几何居中。这是 Badge 私有结构,不改变主布局模型。

  • dot 模式仍属于内联外壳布局的特化:外壳收敛为固定点尺寸,padding 清零。

  • as="badge" 只表示 Badge 作为 Icon / Avatar 的外层挂件角色,不改变 Badge 内部布局模型。

布局变量链:

变量 默认来源 用途
--snowui-badge-padding calc(var(--padding-1) * 0.75) calc(var(--padding-1) * 1.5) 数字/文本模式内边距
--snowui-badge-radius var(--radius-20) 数字/文本模式圆角
--snowui-badge-font-size var(--text-12) 文本字号
--snowui-badge-line-height 1 数字垂直居中
--snowui-badge-dot-size calc(var(--size-4) * 1.5 / 4) 点模式尺寸
--snowui-badge-background resolveSnowUIColor(color) 数字和 Dot 模式的填充色

variant="border" 复用 Kbd 默认描边视觉的同一组 Token 值,但仍保持 Badge 的状态标签语义与 <span>/Frame 外壳:

属性 border 值
Padding var(--padding-0) var(--padding-1)(0px 4px)
Radius calc(var(--radius-1) * 1.5)(6px)
Font / Line height var(--text-12) / var(--leading-12)
Background / Color transparent / inherit
Border inset 0 0 0 var(--border-1) var(--black-10)

border 只作用于文本内容模式;dot 继续使用 Dot 视觉。作为 Button、SidebarItem 等宿主的后代时,border 保持文本 Hug,不继承宿主的固定方形尺寸上下文。 border 的内部 morph 文字层继承 var(--leading-12),不使用 filled Badge 的紧凑 line-height: 1;因此可见高度与 Kbd 默认 border 一致。

color 使用 SnowUI 公共语意色协议,严格区分大小写:

<Badge count={1} color="Blue" /><Badge count={2} color="Red" /><Badge dot color="Green" /><Badge count="New" variant="border" />

角色化组合

 <Icon size={24}>    {#snippet badge()}        <Badge as="badge" count={5} />    {/snippet}    <Bell /></Icon>  <Badge count={99} max={99} /><Badge dot />

智能行为

  1. 自动隐藏: count 模式默认仅在数值大于等于 1 时出现;数值为 0 且 showZero=false 时自动隐藏,退场期间保留最后一次可见值(例如从 1 退场,不显示 0)

  2. 溢出格式化: 超过 max 自动显示为 max+

  3. 自动内容: 无 count 时尝试从父元素获取文本

  4. 角色感知尺寸继承:

    • 独立使用: 自动读取父级 Frame (如列表项容器) 的尺寸上下文完成自适应缩放。

    • 作为徽标 (as="badge"): 忽略负级 Group 的尺寸上下文,优先保持徽标比例并由宿主(Avatar/Icon)驱动定位。

默认动效

Badge 的显示 / 隐藏使用两条并行动效,与 transitions.dev Notification badge 的结构一致:

  • Frame currentState="Appear/Disappear" 与 whileAppear / whileDisappear 负责定位外壳:出现时从左下偏移滑到锚点,退场时不反向位移。

  • 内层 .snowui-badge-surface 是完整视觉外壳,负责 scale / opacity / blur:出现时整体从 scale(0)、opacity: 0、blur(2px) 回弹至正常状态;退场时以中心点将包括背景、padding 和数字在内的整个 Badge 缩小至 0。

  • 内部 .snowui-morph-container 只负责 Grid Stacking 和内容居中,不承担出退场动效。

隐藏时 Badge 会短暂保留节点 180ms,再从 DOM 中移除。默认退场不做反向位移,只让 Badge 整体以中心点缩小、渐隐并增加模糊。whileAppear / whileDisappear={true} 使用 Badge 完整默认 Frame 动效;显式对象是完整视觉通道声明,只执行对象中声明的通道并继承 Badge 默认时序;传 false 可关闭对应 Frame 动效。prefers-reduced-motion: reduce 会关闭 slide / pop / blur 过渡。

私有动效变量:

变量 默认值 用途
--snowui-badge-motion-offset-x -8.2px 外层出现位移的 X 起点
--snowui-badge-motion-offset-y 12.4px 外层出现位移的 Y 起点
--snowui-badge-motion-blur 2px Badge 整体隐藏时的模糊
--snowui-badge-motion-pop-duration 500ms Badge 整体出现 scale / blur 时长
--snowui-badge-motion-fade-duration 400ms Badge 整体出现 opacity 时长
--snowui-badge-motion-pop-close-duration 180ms Badge 整体隐藏 scale / blur 时长
--snowui-badge-motion-fade-close-duration 180ms Badge 整体隐藏 opacity 时长
--snowui-badge-motion-pop-easing cubic-bezier(0.34, 1.36, 0.64, 1) Badge 整体出现缓动
--snowui-badge-motion-close-easing cubic-bezier(0.4, 0, 0.2, 1) Badge 整体隐藏缓动

Badge 样式覆盖

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

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

变量 用途与默认参考
--snowui-badge-dot-size-override dot 模式尺寸(尺寸 px,默认值见组件源码)
--snowui-badge-font-size-override font-size(默认值见组件源码)
--snowui-badge-height-override 高度(默认值见组件源码)
--snowui-badge-line-height-override line-height(filled 默认 1;border 默认 var(--leading-12))
--snowui-badge-min-width-override 最小宽度(默认值见组件源码)
--snowui-badge-padding-override padding y+x(filled 默认 calc(--padding-1 * 0.75) calc(--padding-1 * 1.5);border 默认 0 var(--padding-1))
--snowui-badge-radius-override border-radius(filled 默认 var(--radius-full);border 默认 calc(var(--radius-1) * 1.5))
--snowui-badge-size-override 整体尺寸(尺寸 px,默认值见组件源码)
--snowui-badge-width-override 宽度(默认值见组件源码)

设计指南 · Token · 组合边界

Badge 类型与状态

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

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

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

共享 Frame API · 返回 API

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

StateValueMap

来源:components/src/logic/frame-types.ts

export type StateValueMap<T = any> = Partial<Record<CoreState, T>>;

CoreState

来源:components/src/logic/frame-types.ts

export type CoreState =    | "StartLoad"    | "Load"    | "Reload"    | "Appear"    | "Disappear"    | "Idle"    | "Active"    | "Disabled"    | "Validating"    | "Uploading"    | "Editing"    | (string & {});

SnowUIColor

来源:components/src/lib/color.ts

export type SnowUIColor = keyof typeof SNOWUI_COLOR_TOKENS;

ResourceSize

来源:components/src/context.ts

export type ResourceSize = 12 | 16 | 20 | 24 | 28 | 32 | 40 | 48 | 80;