定价

Toast 使用手册

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

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

组件介绍

用短暂通知反馈操作结果或状态变化,支持图标、操作和富内容,适合保存成功、错误与提醒。

使用选择

用于短暂的操作结果反馈,配合 Toaster 管理展示。通知历史、活动记录使用常驻内容列表,不使用 Toast。

  • 调用 toast 发送短暂反馈,由 Toaster 管理队列;独立渲染时页面负责关闭后的移除。

  • as="toast" 可接入宿主点击触发;leading / trailing 组合附属内容,parts 只配置默认关闭按钮。短标签使用继承的 singleLine 与 Text lines={1};内部有效间距至少4 CSS px,rich 多行正文保持原布局。

快速开始

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

<script lang="ts">	import { Toast, Button, Text } from '@snowui-design-system/components';</script> <div style="display: flex; flex-direction: column; align-items: center; gap: var(--gap-4); max-width: 100%;">	<Toast singleLine><Text lines={1}>Draft saved</Text></Toast>	<Toast positive singleLine><Text lines={1}>Changes published</Text></Toast>	<Toast positive={false} singleLine><Text lines={1}>Connection lost</Text></Toast></div>

API

关键字 类型 默认值 描述
parts ComponentPartsOf<{ Button: typeof Button }> — 配置内置关闭 Button 的外观;事件、关闭语义和 ARIA 由 Toast 管理
id string — 静态使用时透传为 DOM id;template 模式下作为模板 id,供 showToast(id) 激活
template boolean false 模版模式:只注册为命令式 Toast 模板,不直接渲染;用于"一段 Toast 代码 + 一个触发按钮"的写法
as "toast" | undefined — 内嵌模式(v1.1.0):as="toast" 启用 Inline 模式,自动发现宿主父元素并绑定 click 事件触发 Toast。遵循 ComponentGuidelines.md §5(源码参考:specs/maintainers/ComponentGuidelines.md) 三激活模式规范
positive boolean — 语义判定:true=积极(CheckCircle);false=问题(Warning);不传则不渲染内置图标
variant ToastVariant "default" 视觉变体
size ToastSize "md" 仅 default 变体生效
position ToastPosition "top" 用于驱动出入场方向(不直接定位)
onDismiss () => void — 点击关闭 X 时回调(rich 变体)
children Snippet — 正文和 leading / trailing 槽位内容;独立使用时由调用方处理关闭后的移除

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

使用边界与详细说明

Toaster 内置组件双模式

  • Toaster.parts.Toast:统一配置 Toaster 直接生成的 Toast;Toaster.parts.Text 只配置 text 字符串生成的标签,不接管自定义 children。

  • Toast 队列状态、position 与关闭事件由 Toaster 控制;外置显式 Props 高于 part。

Toast 是 SnowUI 的全局通知组件。整套能力由三件交付物组成:

交付物 角色
<Toast /> 单个 Toast 的视觉外壳(三槽位)。可独立用作静态展示,也由 Toaster 内部使用
<Toaster /> 全局 Portal 容器;订阅 store,渲染 6 个位置的堆叠队列。一个应用挂载一次即可
toast(...) 命令式入口;可在任意 .ts / .svelte 中调用

独立 Panel 模式的 Toast 根显式使用 GENERIC_SCALE_APPEAR_MOTION,保持原 Frame generic appear 的 opacity + scale 视觉与标准时序,不再通过 whileAppear={true} 隐式跟随 Frame fallback。Toaster 队列仍使用位置相关的显式 slide + opacity + scale 组合,两层既有视觉均保持不变。

功能概览

  • 6 个固定位置:top / top-left / top-right / bottom / bottom-left / bottom-right,距视口边缘 16px,默认 top

  • 三槽位布局(Leading / Content / Trailing);内置图标支持外置 Icon 替换

  • 默认变体(default):深色 pill,并使用 blur(var(--size-10)) 背景模糊;rich 变体:Background/3 玻璃卡片,复用 .snowui-quick-action-panel 的背景模糊

  • 自动消失:默认 4 秒;duration: 0 表示常驻

  • 自动消失计时在最上层 Toast hover 时暂停,离开 hover 后按剩余时间恢复

  • 多个同位置 Toast 自动堆叠(HeroUI 风格):默认 gap=8、maxVisible=3、scaleStep=0.05、stackOpacityStep=0.2、宽度内容自适应(均可配置)

  • 出现、退出、堆叠前移与最后一层被挤出动效均在 Toast 根元素组合:生命周期使用 transform + opacity,堆叠使用独立 translate + scale,堆叠透明度直接合并进 Frame fade 数值;关闭时先进入 Disappear,动画完成后再从队列移除


布局模型

主布局模型:复合管理布局。

  • Toaster 是页面级 Portal,挂载到 <body> 上,使用 6 个绝对定位区域承载 Toast 栈;每个栈槽位是绝对定位的 Frame,由 currentState="Appear" | "Disappear" 驱动默认动效

  • 栈槽位按 HeroUI 的 index 规则写入 translate / z-index:frontmost index = 0,后层向内侧偏移

  • 非 frontmost Toast 禁止交互,但仍保留真实 Toast 内容;叠层差异由位移、缩放、透明度三种动效组合给出

  • 单条 Toast 内部为槽位宿主布局(Frame row + 三槽位),Leading / Content / Trailing 标准结构

  • 关闭 X 按钮属于 rich 变体的内置 trailing 装饰;通过绝对定位浮在 Toast 右上角,不参与三槽位


toast(input) — 命令式入口

import { toast } from "@snowui-design-system/components"; toast("Done");                                        // 字符串语法 → 等价 { text: "Done" }toast({ text: "Done", positive: true });              // 积极语义 → 绿色 CheckCircletoast({ text: "Something Wrong", positive: false });  // 问题语义 → 黄色 Warningtoast({ text: "Plain Notice" });                      // 不传 positive → 不显示内置图标const id = toast({ text: "持久通知", duration: 0 });dismissToast(id);                                     // 手动关闭showToast("saved-template");                          // 触发 <Toast template id="saved-template">
参数 类型 默认值 说明
positive boolean — 语义判定:true=积极(CheckCircle);false=问题(Warning);不传则不显示内置图标
text string — 命令式快捷文案;Toaster 使用 Text 默认单行截断并提供全文提示
children Snippet — 自定义正文内容;优先级高于 text
leading Snippet — 自定义 Leading 槽 Snippet
trailing Snippet — 自定义 Trailing 槽(rich 变体常用于放 Button)
variant "default" | "rich" "default" 视觉变体
size "sm" | "md" "md" 仅 default 变体生效;rich 固定 md
position ToastPosition "top" 6 个出现位置
duration number 4000 单位 ms;0 表示常驻
onDismiss () => void — 关闭回调

辅助函数:

  • dismissToast(id: string): void — 关闭指定 Toast

  • dismissAllToasts(position?: ToastPosition): void — 关闭全部或指定位置的 Toast

  • showToast(id: string, overrides?: ToastOptions): string | undefined — 通过 <Toast template id="..."> 注册的模板触发通知;overrides 可覆盖位置、时长等运行时参数

<Toaster />

关键字 类型 默认值 说明
offset number 16 视口边缘到 Toast 区域的距离,单位 px
maxVisible number 3 单个位置最多可见的层数;仅限制可见层数,不限制 toast() 入队数量;达到上限后新 Toast 会把当前最后一层挤出
gap number 8 同位置 Toast 之间的视觉偏移,单位 px
scaleStep number 0.05 每层堆叠的缩放衰减系数;index=1 时默认缩放到 0.95
stackOpacityStep number 0.2 每层堆叠的透明度衰减系数;默认第 2 / 3 层为 0.8 / 0.6
stackMinOpacity number 0.6 堆叠条目的最低透明度下限
stackDuration number 300 堆叠组合动效时长,单位 ms
stackEasing string "ease" 堆叠组合动效缓动
width number | string — Toast 区域宽度;默认内容自适应,传入后可固定宽度;窄屏自动限制为 calc(100vw - 2rem)

动效要点

结论:

  • Toast 动效采用单根元素组合结构。whileAppear / whileDisappear 输出生命周期 transform 与 --su-motion-opacity;堆叠位移和缩放分别使用 CSS 独立属性 translate / scale,不会覆盖生命周期 transform。

  • 堆叠透明度直接乘入生命周期 fade 数值;默认第 2 层为 0.8、第 3 层为 0.6,退场时再降低当前透明度的 20%。

  • 退出额外越界距离直接合并进 --snowui-toast-stack-translate-y,与生命周期的百分比位移共同作用,确保深层 Toast 也能越过可视区域边缘。

  • 背景、阴影和 backdrop-filter 始终属于同一个 Toast 根元素,不创建独立 blur plate。

  • maxVisible 只限制可见层数,不限制 toast() 入队数量。超过可见层后,当前最后一层进入 pushed-out,不是丢弃新 Toast。

  • 自动消失计时在同位置任一可见层 hover 时暂停,离开后恢复;只有 idle 层 hover 显示关闭 X,后层不显示 X。

动效参数表

阶段 Frame 动效 触发状态 top 系列参数 bottom 系列参数 时长 缓动 说明
出现 slideFromTop / slideFromBottom currentState="Appear" y: ["-100%", 0], opacity: [0.8, 1], scale: [0.96, 1] y: ["100%", 0], opacity: [0.8, 1], scale: [0.96, 1] 300ms ease 整条 Toast 做轻微透明度与大小补间;rich 保持 Background/3 玻璃背景
退场 slideToTop / slideToBottom currentState="Disappear" y: [0, "-100%"], opacity: [1, 0.8], scale: [1, 0.96] y: [0, "100%"], opacity: [1, 0.8], scale: [1, 0.96] 300ms ease 完全按进入组合动效反向执行;距离、速度、透明度与大小变化均与入场一致
退场额外越界 根元素 translate exiting / pushed-out 额外 -(index * gap + offset + 20px) 额外 index * gap + offset + 20px 300ms ease 与生命周期 transform 独立合成,确保 Toast 越过可视区域边缘 20px
堆叠位移 stackTranslate 栈 index 变化 translateY(index * 8px) translateY(index * -8px) 300ms ease gap=8,由 Toaster 使用时传值;exiting 时在此基础上叠加额外越界位移
堆叠缩放 scale 栈 index 变化 scale=max(0, 1 - index * scaleStep) 同 top 300ms ease 默认 scaleStep=0.05,可由 Toaster 使用时调整
堆叠透明度 Frame fade 栈 index 变化 max(stackMinOpacity, 1 - index * stackOpacityStep) 同 top 300ms ease 直接合并进 appear / disappear fade,默认第 2 / 3 层为 0.8 / 0.6;退场终值为当前值的 80%
层级 栈样式 栈 index 变化 z-index=maxVisible - index + 1 同 top — — frontmost 位于最上层
最后一层被挤出 slide + fade + scale pushed-out 沿入场方向反向位移,opacity: [1, 0.8], scale: [1, 0.96] 沿入场方向反向位移,opacity: [1, 0.8], scale: [1, 0.96] 300ms ease 达到 maxVisible 后,新 Toast 入队时当前最后一层执行专属挤出动效;速度与出现动效一致
后层真实内容 栈样式 index > 0 保留完整 Toast 内容,仅关闭 pointer-events 同 top 跟随 stack transition ease 不再使用空背景壳体模拟堆叠
hover 暂停 计时器 可见层 hover 暂停同位置所有可见层自动消失倒计时 同 top — — idle / stack-1 / stack-n 任一可见层 hover 都暂停整组计时;离开后恢复

<Toast />(视觉单元)

继承 FrameProps(排除 children),并新增:

v2.0.0 起:移除 title / description / icon 三个 prop。文字内容统一通过 children 外置;内置图标由 positive 判定(undefined 时不显示)。


全局挂载 + 命令式触发

<script>    import { Button, Frame, Text, Toast, Toaster, showToast, toast } from "@snowui-design-system/components";</script> <Toaster /> <Button onclick={() => toast("Done")}>Show Toast</Button><Button onclick={() => toast({ text: "Something Wrong", positive: false })}>    Warning</Button><Button    onclick={() =>        toast({            text: "Saved",            positive: true,            variant: "rich",            position: "top-right",        })    }>    Rich Toast</Button>

静态使用(不通过 toast())

<Toast positive>Done</Toast><Toast positive={false}>Something Wrong</Toast><Toast>Plain Notice</Toast><Toast variant="rich" positive>    <Frame column class="flex-1 min-w-0">        <Text>Saved</Text>        <Text class="text-12 text-black-40">Your changes are synced.</Text>    </Frame></Toast>

内嵌模式 (v1.1.0,as="toast")

Toast 作为宿主子节点,点击宿主即触发,无需 id、无需手动 showToast。遵循 ComponentGuidelines.md §5 浮层组件三激活模式规范(源码参考:specs/maintainers/ComponentGuidelines.md)。

<Toaster /> <Button variant="filled">    保存    <Toast as="toast" positive position="top-right">已保存</Toast></Button>

声明式模板 + 按钮触发

<Toaster /> <Toast id="saved-rich-toast" template class="items-start" variant="rich" positive style="width: 15rem;">    <Frame column class="flex-1 min-w-0">        <Text>Text</Text>        <Text class="text-12 text-black-40">Text 2</Text>    </Frame>    <Button as="trailing" variant="gray">Button</Button></Toast> <Button onclick={() => showToast("saved-rich-toast", { position: "top-right" })}>    Add Rich Toast</Button>

替换内置图标

<Toast positive>    <Icon as="leading"><Heart /></Icon>    收藏成功</Toast>

此区域由用户维护;AI 修改前请先取得许可。


Toast 样式覆盖

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

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

变量 用途与默认参考
--snowui-button-opacity-override 不透明度(默认值见组件源码)
--snowui-icon-height-override 高度(默认值见组件源码)
--snowui-icon-width-override 宽度(默认值见组件源码)
--snowui-toast-font-size-override default 变体 font-size(默认 md=var(--text-14) / sm=var(--text-12))
--snowui-toast-gap-override gap(默认 md=var(--gap-2)=8px / sm=var(--gap-1)=4px)
--snowui-toast-line-height-override default 变体 line-height(默认 md=var(--leading-14) / sm=var(--leading-12))
--snowui-toast-padding-override rich 变体整体 padding(默认 var(--padding-3) = 12px)
--snowui-toast-padding-x-override default 变体 padding-x(默认 md=var(--padding-3)=12px / sm=var(--padding-2)=8px)
--snowui-toast-padding-y-override default 变体 padding-y(默认 md=var(--padding-2)=8px / sm=var(--padding-1)=4px)
--snowui-toast-radius-override border-radius(默认 var(--radius-4) = 16px)
--snowui-toast-success-color-override 内置 success 图标颜色(默认 var(--secondary-green) = #71DD8C)
--snowui-toast-warning-color-override 内置 warning 图标颜色(默认 var(--secondary-yellow) = #FFCC00)

设计指南 · Token · 组合边界

Toast 类型与状态

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

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

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

共享 Frame API · 返回 API

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

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}`;

ToastVariant

来源:components/src/logic/toast.svelte.ts

export type ToastVariant = "default" | "rich";

ToastSize

来源:components/src/logic/toast.svelte.ts

export type ToastSize = "sm" | "md";

ToastPosition

来源:components/src/logic/toast.svelte.ts

export type ToastPosition =    | "top"    | "top-left"    | "top-right"    | "bottom"    | "bottom-left"    | "bottom-right";