定价

Text 使用手册

v3.5.4 · @snowui-design-system/components

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

组件介绍

统一展示文本,支持排版与截断,适合正文、标签和受限空间中的信息表达。

使用选择

用于文本语义、截断、展开和提示。默认不启用 hover 动效;静态普通文字可使用语义 HTML,动态数值或文字过渡按动效组件选择。

  • tag 指定文本语义,lines 控制截断,more / tooltip 提供展开与补充提示。

  • 默认不启动 hover 交互;stateText 可按状态替换文字,parts 配置默认 Button / Tooltip。

  • lines=1 缩短可见文字时仍保留完整可访问名称;用于按钮、链接或原生标签时不丢失名称尾部。

快速开始

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

<script lang="ts">	import { Text, Button, Frame } from '@snowui-design-system/components';</script> <div style="width: min(100%, 24rem); min-width: 0;">	<Text lines={1} tooltip style="font-size: var(--text-14); line-height: var(--leading-14); width: 100%;">Design system documentation — component behavior, accessibility, and release notes</Text></div>

API

关键字 类型 默认值 描述
tag string — 根节点标签。 默认行为:span。
stateText StateValueMap<string | number> — 根据最近父级 Frame 的 currentState 渲染文本;未命中当前状态时回退 Idle,再回退 children。
interactive boolean false 是否启用 Text hover 动效;显式传 true 时开启,默认关闭。
lines 0 | 1 | 2 | 3 — 文本截断模式:0=可展开,1/2/3=固定行数。
more boolean false lines=0 时生成内置展开 Button;默认样式为示例 6 的 ArrowLineDown 按钮。
tooltip TooltipProp — Tooltip 配置。支持自动推导、固定文本、Snippet,或传对象仅覆写 Tooltip 位置/偏移等配置。
onTruncate (isTruncated: boolean) => void — 截断状态变化回调。
children Snippet<[any]> — 默认文字或自定义内容,接收含 breakpoint 的渲染上下文;stateText 命中时以对应状态文本替代。
parts ComponentPartsOf<{ Button: typeof Button; Tooltip: typeof Tooltip; }> — 仅配置内置 Button 与 Tooltip;显式 children 中的同名组件不继承。

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

使用边界与详细说明

内置组件双模式

  • parts.Button:配置 lines=0 + more 生成的内置展开按钮。

  • parts.Tooltip:配置截断时内置 Tooltip。

  • 外置 Tooltip 或其他 children 不受 Text 私有 DOM 选择器控制。

继承: 复用 Frame.svelte 的所有通用能力 (交互、动效、响应式、形态等)。 默认能力开关: enableResponsive=false, enableContext=true, enableScaleObserver=false。 核心机制: 采用 组件内聚模式 (Component-owned Truncation),Text 自身直接处理 lines/onTruncate,Frame 仅负责通用能力路由。

未声明 lines 时,截断控制器保持休眠,不读取文本、不排队 rAF,也不登记 MutationObserver / ResizeObserver;动态设置 lines 后再按既有协议激活,不改变默认文本视觉。

布局模型

主布局模型:文本流布局。

  • Text 的主职责是保留 HTML 文本流、语义 tag、截断和 tooltip/more 角色定位,不参与槽位宿主、内联外壳或复合管理布局注册。

  • tag 决定 block / inline-block / list-item / code 等文本流显示模式;lines=0/1/2/3 只改变截断和遮罩,不改变组件的主布局模型。

  • <Tooltip as="tooltip"> 与 <Button as="more"> 是 Text 内的角色子项:Tooltip 负责截断提示,Button 仍按 Button 的内联外壳布局渲染。

  • Text 不使用 padding/gap 管理内部排列,也不通过 margin 改变外部文本流间距;交互位移只能走 transform 变量。

1.1 功能概览

  • 智能截断: Text 直接支持 lines={0|1|2|3} 和 onTruncate;单行模式复用 fitTextToElement(),稳定显示紧跟文字的显式省略符。

  • 全文可访问: 单行截断时,可见短文本只负责视觉;复用现有fullText与包内无障碍隐藏样式提供完整纯文本,避免父Button、链接或原生标签的名称只剩截断前缀。不重复渲染交互Snippet,也不新增测量器。

  • 内置展开: lines=0 时可通过 more 开启内置 ArrowLineDown Button,默认关闭;内置按钮默认开启与 BarChart 模糊浮层一致的背景模糊。

  • 滚动模式: lines=0 未显示 more 按钮时,内容使用 Textarea 同源的上下渐隐与浮层滚动条;显示 more 时改为展开模式且不渲染滚动条。

  • 角色化组合:

    • <Tooltip as="tooltip">: 截断时自动显示的提示。

    • <Button as="more">: "展开/收起" 按钮。

  • 响应式: tag / class 可通过 responsive 进行断点覆写。

  • 动效: 继承 Frame 的所有动效触发器 (whileHover, whileClick 等)。

1.2 关键字定义 (Keywords)

Keyword Type Default Description
variants object undefined 样式变体配置 (供 Layout 使用)。

stateText 解析规则

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

  2. 当前状态命中 stateText[currentState] 时渲染该文本。

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

  4. 未传 stateText 或仍未解析出文本时继续渲染 children。

  5. stateText 只用于同结构文本替换,不承载复杂 DOM。复杂自定义子树仍属于 stateContent 的例外场景。

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

1.3 使用示例

 <Text>普通文本,无截断。</Text>  <Text lines={1}>Very long text that will be truncated...</Text>  <Text lines={1}>    Very long text that will be truncated...    <Tooltip as="tooltip">完整的很长的文本内容...</Tooltip></Text>  <Text lines={3}>长段落将被截断为3行...</Text>  <Text lines={0} class="bg-black-5 p-4 rounded-8">    很长的内容可以展开查看...    <Button as="more" variant="borderless" class="text-blue">        展开全文    </Button></Text>  <Text lines={0} more>    很长的内容可以展开查看。</Text>  <Text lines={0} style="height: 5rem;">    很长的内容可以在约束高度内滚动查看。</Text>  <Text    lines={1}    enableResponsive    class="text-12"    responsive={{        sm: { class: "text-14" },        lg: { class: "text-16" }    }}>    响应式文本...</Text>  <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>

1. 基础样式

属性 值 说明
Class .snowui-text 组件根类名
Box-Sizing border-box 盒模型标准
Min Width 0 防止 flex 溢出
Max Width 100% 限制最大宽度

2. 布局模式 (Layout Modes)

模式 Class Display 适用标签
Block .snowui-text-block block p, h1-h6, div 等
Inline Block .snowui-text-inline-block inline-block span, a, strong 等
List Item .snowui-text-li list-item li
Tooltip 锚点 .snowui-text-trigger-inline inline-flex lines=1 + tooltip 触发区域
Tooltip Hug .snowui-text-tooltip-anchor-hug width: fit-content 截断 tooltip 锚点宽度收缩
Code 覆盖契约 code.snowui-text 组件层不写 font-size/line-height 让 snowui.css 的 code 规则自然生效

3. Hover 交互

默认关闭;仅在 interactive === true 时生效:

Selector 属性 值
.snowui-text-hover-enabled Transition transform 1000ms ease-out
.snowui-text-hover-enabled:hover:not(.snowui-disabled):not(:disabled) Transform 位移 通过 --snowui-text-hover-shift-x 注入
.snowui-text-hover-enabled:hover:not(.snowui-disabled):not(:disabled) Hover 位移变量 --snowui-text-hover-shift-x: 0.285em
.snowui-text-hover-enabled:hover:not(.snowui-disabled):not(:disabled) Cursor default (不强制 pointer)

5. 截断与可展开样式 (lines=0/2/3)

Selector 作用
.snowui-text-truncate-wrapper 包裹内容,保持 width/height: 100%,作为裁剪层承载体。
.snowui-text-collapse-motion-enabled 为 lines=0/2/3 的真实截断/展开链路注入 --snowui-text-collapse-transition,并合并 hover 的 margin/transform 过渡,避免内联 transition 覆盖 hover 缓动。
.snowui-truncate-container[data-lines="0"][data-expanded="false"] > .snowui-text-truncate-wrapper 收起态裁剪,overflow: hidden。
.snowui-text-truncate-wrapper.snowui-scroll-mask 收起态接入「内容渐隐层」基础共享能力的 CSS 静态形态(.snowui-scroll-mask,能力总览见 ../lib/edge-fade.md(源码参考:components/src/lib/edge-fade.md)),通过 data-scroll-mask="bottom" 驱动 mask-image。
.snowui-truncate-container .snowui-text-expand-button Button as="more" 的联动定位:Button 声明为 pin-bottom-right,边缘间距 4px;Text 将其提升到根层,避开内容 mask,并在展开 / 未截断时隐藏。
.snowui-text-multi-line-content.snowui-line-clamp-2/3 多行内容独立承载 display: -webkit-box + line-clamp;Tooltip 留在 Text 根层,不进入被裁切文本。
.snowui-text.snowui-line-clamp-2 固定两行:line-clamp: 2。
.snowui-text.snowui-line-clamp-3 固定三行:line-clamp: 3。


Text 样式覆盖

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

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

变量 用途与默认参考
--snowui-text-collapse-transition-override 折叠过渡(默认值见组件源码)
--snowui-text-hover-transition-override 悬浮过渡(默认值见组件源码)
--snowui-text-mask-height-override 截断底部透明渐隐高度(默认 2em)
--snowui-text-style-override 文本样式(默认值见组件源码)

设计指南 · Token · 组合边界

Text 类型与状态

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

可双向绑定:bind:element。

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

TooltipProp

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

type TooltipProp = boolean | string | Snippet | Record<string, any>;

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