定价

Icon 使用手册

v2.3.4 · @snowui-design-system/components

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

组件介绍

展示 SVG 图标,并统一尺寸与颜色,适合按钮、导航和内容中的视觉标识。

使用选择

用于统一图标宿主与尺寸。优先复用 SnowUI 资源图标;有操作行为时放入 Button 并提供可访问名称,不把装饰图形误作功能图标。

  • 优先提供资源图标;src 与解析后的 icon 均未命中时才渲染 children。

  • size 可继承父级尺寸;角标使用 Badge as="badge"。交互名称应提供给拥有操作的按钮。

  • Accordion 内的 Icon as="leading" 在未显式指定 size 时继承 Accordion 图标尺寸:sm/md/lg 分别为 16/20/24;未声明 leading 的 Icon 不参与这项继承,显式 size 优先。

快速开始

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

<script lang="ts">	import { Icon } from '@snowui-design-system/components';	import { IconSet } from '@snowui-design-system/resource-svelte';	const sizes = [12, 16, 20, 24, 28, 32, 40, 48, 80] as const;</script> <div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--gap-4) var(--gap-3); max-width: 100%;">{#each sizes as size}    <Icon icon={IconSet} {size} aria-label={`Component icon, size ${size}`} />{/each}</div>

API

关键字 类型 默认值 描述
src string — 图标图片 URL
icon Component<any> — 直接渲染 resource-svelte 图标组件。
stateIcon StateValueMap<Component<any> | null> — 根据最近父级 Frame 的 currentState 解析图标。未命中当前状态时回退 Idle,再回退 icon / src / children;状态值为 null 时隐藏 Icon。
size IconSize — 图标尺寸。未显式设置时,自动继承父级 Frame 提供尺寸上下文。
background boolean false 是否显示背景
weight string — 透传给图标资源的视觉权重;资源支持时可用 thin、light、regular、bold、fill、duotone。未设置时由资源或上下文决定,不会凭空生成资源缺少的变体。
as | "badge" | "icon" | "prev" | "next" | "close" | (string & {}) "icon" 角色:作为独立图标、徽标、图片中央图标或 Viewer 控制图标
children Snippet — 图标内容与角标组合;仅当 src 和解析后的 icon 均未命中时渲染;可同时放入资源图标与 Badge as="badge",角标由宿主定位。
badgePosition "top" | "bottom" "top" 作为角标宿主时的位置:top 为右上,bottom 为右下。

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

使用边界与详细说明

布局模型

主布局模型:内禀原子布局。

  • Icon 的根节点是由 size、background padding 与图标资源共同决定的内禀盒,作为其他布局子项时表现为 Hug。

  • as="leading" / "trailing" / "icon" / "badge" / "prev" / "next" / "close" 只声明 Icon 在外部宿主中的角色;进入 Image / ImageViewer 宿主时会由宿主上下文翻译为对应 pin-* 方位。

  • 背景、空占位、badge overlay 与图片资源渲染都是 Icon 私有结构,不对外承诺通用槽位。

  • 外部需要图标加文字排列时,应由 Button、MenuItem、Frame 等宿主组件负责 gap / padding / alignment。

stateIcon 解析规则

  1. Icon 读取最近父级 Frame Context 的 currentState。

  2. 当前状态命中 stateIcon[currentState] 时使用该图标。

  3. 未命中当前状态时回退 stateIcon.Idle。

  4. 仍未解析出图标时回退现有 icon / src / children 渲染规则。

  5. 状态值为 null 时隐藏 Icon,用于 Idle 无图标、Pending 显示 Spinner 这类稳定结构状态流。

  6. stateIcon 只影响 Icon 自身展示,不修改父 Frame 状态。

Load 是 Frame loading / skeleton 协议状态名。若只是按钮任务处理中并需要展示真实 Spinner,优先使用 Pending。

使用示例

 <Icon src="/bell.svg" size={24} />  <Icon size={24}>    <Bell /></Icon>  <Icon background class="bg-black-4">    <Bell size={48} weight="duotone" /></Icon>  <Icon size={32} background class="bg-black-4">    <Badge as="badge" dot />    <Bell /></Icon>  <Button Click="Active" Active={["Idle", "auto"]} whileActive={{ duration: 2000 }}>    <Icon stateIcon={{ Idle: Paperclip, Active: Check }} />    <Text stateText={{ Idle: "复制", Active: "已复制" }} /></Button>  <Button    Click={{ Idle: "Pending", Active: "Idle" }}    Pending={["Active", "auto"]}>    <Icon stateIcon={{ Idle: null, Pending: Spinner, Active: Check }} />    <Text stateText={{ Idle: "Ready", Pending: "Loading...", Active: "Completed" }} /></Button>  <Avatar size={40}>    <Icon as="badge" background class="bg-blue text-white">        <Check />    </Icon></Avatar>

子组件上下文 (Context)

Icon 为子组件 (如 Badge 或 另一个 Icon) 提供自适应定位上下文:

  • badgeStyle: 基于 em 的绝对定位样式,确保图标外缘角落对齐。

  • badgeSize: 默认点状态尺寸 (0.25em)。

- size/weight: Icon 容器默认透传;子图标显式传入时覆盖(不推荐)。

Icon 样式覆盖

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

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

变量 用途与默认参考
--snowui-accordion-icon-size-override 默认展开/收起图标尺寸(默认 sm 16 / md 20 / lg 24)
--snowui-button-icon-size-override 图标尺寸(尺寸 px,默认值见组件源码)
--snowui-icon-background-override 背景(默认值见组件源码)
--snowui-icon-font-size-override font-size(默认值见组件源码)
--snowui-icon-font-weight-override 字重(默认值见组件源码)
--snowui-icon-height-override 高度(默认值见组件源码)
--snowui-icon-line-height-override line-height(默认值见组件源码)
--snowui-icon-min-height-override 最小高度(默认值见组件源码)
--snowui-icon-min-width-override 最小宽度(默认值见组件源码)
--snowui-icon-padding-override padding y+x
--snowui-icon-radius-override border-radius
--snowui-icon-size-override 整体尺寸(尺寸 px,默认值见组件源码)
--snowui-icon-width-override 宽度(默认值见组件源码)

设计指南 · Token · 组合边界

Icon 类型与状态

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

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

继承声明: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 & {});

IconSize

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

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