定价

CodeBlock 使用手册

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

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

组件介绍

清晰展示可复制的代码,支持语法着色、行号、全屏查看和尺寸调整,适合文档与开发工具。

使用选择

用于展示可复制的代码;使用其内置复制与展开能力。需要编辑代码时先核对支持范围,不假定展示组件是编辑器。

  • 通过 code 提供代码;默认显示复制与展开按钮,visibleLines 控制初始可见行数。

  • singleLine 是单行展示,没有语言、行号、展开面板或纵向滚动;as="trailing" 替换右侧动作区。

快速开始

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

<script lang="ts">	import { CodeBlock } from '@snowui-design-system/components';	const exampleCode = ["import { Button } from '@snowui-design-system/components';", '', "const launchLabel = 'Explore components';", '', '<Button variant="filled" href="/components">', '  {launchLabel}', '</Button>'].join('\n');</script> <CodeBlock style="background-color: var(--background-1);" code={exampleCode} language="svelte" showLineNumbers visibleLines={7} />

API

关键字 类型 默认值 描述
variant "default" | "singleLine" "default" singleLine 使用 Input 同类 Leading / Content / Trailing 三槽布局;固定为单行展示,不生成高度拖拽、语言、行号、全屏或纵向滚动结构
code string "" 要显示的代码字符串
language string "" 语言标识,同时选择格式化解析器;支持 svelte、js/javascript、jsx、ts/typescript、tsx、html、css/scss/less、json/jsonc、yaml/yml、markdown/md、graphql/gql。空值根据代码识别 Svelte/HTML、JSON 或 JS/TS;未知的显式语言保留原文。
format boolean true 默认按 language 格式化代码;普通态、全屏、行号与复制共享格式化结果。设为 false 保留原文;singleLine 始终保留原文。解析失败、未知语言或输入超过 200,000 字符时保留原文。
showLanguage boolean true 是否显示语言标识
showLineNumbers boolean false 是否显示代码行号;普通态与全屏态保持一致,避免切换末帧发生代码横向跳变
showCopyButton boolean true 是否显示复制按钮
showExpandButton boolean true 是否显示全屏放大按钮
horizontalScrollbarVisibility "always" | "hover" "always" 横向滚动条在内容溢出时常显,或仅在鼠标移入代码块时显示
visibleLines number 5 默认状态最多显示几行代码;内容不足时自适应高度,超出后滚动;全屏模式不受此限制
copyTimeout number 2000 复制成功图标(Check)的停留时长(ms),超时后恢复 Copy 图标
children Snippet — 代码内容或附件源;纯文本会作为代码,as="trailing" 会替换右侧动作区
parts ComponentPartsOf<{ Indicator: typeof Indicator; CopyButton: typeof CopyButton; ExpandButton: typeof ExpandButton; }> — 仅配置内置 CopyButton、ExpandButton、Indicator;显式 children 配件不继承,操作按钮可通过 emphasis 配置强调程度。

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

使用边界与详细说明

内置组件双模式

  • parts.Indicator:配置内置 resize Indicator。

  • 需要替换手柄结构时使用文档既有 Indicator as 职责;外置显式 Props 高于 part。

代码块组件,支持语法显示、基础语法着色、行号、复制到剪贴板与全屏放大。全屏放大/缩小使用共享元素转场的 layout 策略:实际过渡位置与尺寸,不缩放代码字形;图标切换动效使用 REPLACEMENT_APPEAR_MOTION,避免继承浮层类动效语义。


关键字速查

类别 关键字
内容 code, language, children
功能开关 format, showLanguage, showLineNumbers, showCopyButton, showExpandButton
布局 variant="default|singleLine", visibleLines, 默认态拖拽高度
行为 copyTimeout;复制能力由默认内置 CopyButton 承担
默认内置组件 parts.CopyButton 配置内置 bare CopyButton;parts.ExpandButton 配置内置 bare ExpandButton;parts.Indicator 配置缩放手柄
外置配件槽位 singleLine 支持 as="leading";全部变体支持 as="trailing";兼容 data-as="copy-icon", data-as="copied-icon", data-as="expand-icon", data-as="collapse-icon",前两者映射到 CopyButton icon/successIcon
Frame 透传 class, style, ...rest


singleLine 单行变体

variant="singleLine" 面向 import、install command、短配置值等独占一行的只读代码条。它仍使用 <pre><code>、内置轻量语法着色和 CopyButton,不改用 Input,也不引入表单语义。

布局参考 Input 的三槽协议:

槽位 尺寸 内容
Leading Hug 可选外置 as="leading" 配件
Content Fill / min-width: 0 单行高亮代码;超宽时仅横向滚动
Trailing Hug 外置 as="trailing",否则为默认内置 CopyButton

单行态固定隐藏语言、行号和全屏按钮;visibleLines、showLanguage、showLineNumbers、showExpandButton 在该变体中不产生对应结构。根层不生成 Indicator,不接受拖拽高度,也不创建纵向 scrollbar / fade;内容横向溢出时默认常显 Overlay 横向滚动条,也可通过 horizontalScrollbarVisibility="hover" 改为仅在鼠标移入代码块时显示。默认 padding 与 Input 标准态一致:上下 --padding-3(12px)、左右 --padding-4(16px);gap 首选 --gap-2(8px),有效间距至少4 CSS px并保留更大覆盖;复用Frame singleLine保持方向,Content继续Fill,附件不压缩;显式开启响应式时,继续按Frame原协议压缩/恢复首选间距。圆角为 --radius-4(16px)。

<CodeBlock    variant="singleLine"    code="import { Button } from '@snowui-design-system/components';"/>

需要 Leading 配件时:

<CodeBlock variant="singleLine" code="pnpm add @snowui-design-system/components">    <Icon as="leading"><Package /></Icon></CodeBlock>

自动代码格式化

默认 format={true}。使用 Prettier 的浏览器入口与官方 Svelte 插件,按需加载解析器;统一 Tab 缩进(宽度 4)、80 字符目标行宽、JS 单引号、分号、无尾逗号和多属性逐行排版。保留 Svelte 区块顺序和文本空白语义;长字符串不会强制截断。HTML/Markdown 中的空白和代码内容由对应解析器处理,不使用正则改写源码。

  • code 或 children 文本是只读输入;只格式化展示副本,不修改调用方的数据或示例执行代码。

  • 普通态、全屏、行号、高亮和复制共享同一份可见文本。

  • format={false}、variant="singleLine"、不支持的显式语言、无效语法或超过 200,000 字符的输入保持原文;格式化不是 lint,不执行代码或补全缺失逻辑。

  • SSR 先输出原文,客户端加载解析器后更新显示;加载期间原文仍可读可复制。异步结果仅提交到对应的当前输入,切换代码、语言或开关不会应用过期结果。依赖加载失败时保留原文。

  • 解析器来自随包声明的 MIT 依赖 prettier / prettier-plugin-svelte;运行时不向格式化服务发送代码。格式化模块位于 internal/code-block/format.ts,由 CodeBlock 拥有,未新增 Frame 能力或公共格式化 API。

<CodeBlock language="svelte" code={exampleSource} /><CodeBlock language="svelte" code={exampleSource} format={false} />

语法着色

language="text"(别名 plain、plaintext、txt)保留原文与换行;英文标识和数字使用关键字粉色,http/https URL 使用注释灰色,其余正文使用默认文字色。文本中的 // 不启动注释;字体、字号和行高与其他语言共用同一套继承规则。仅保留复制操作时,传入 showLanguage={false} 和 showExpandButton={false};默认开关不变。

当使用 code prop 时,组件内置轻量语法着色规则,覆盖 JS / TS / JSON / HTML / CSS 常见 token。规则来自参考仓库中 shiki / rehype-pretty-code 的高亮分层思路,但当前实现不新增依赖。

颜色按 Figma 设计稿固定写死,并已在 scripts/check-standards.js 中登记为 CodeBlock.svelte 例外:

token 颜色
背景 --background-2
默认文本 / 标点 --black-100
行号 --black-20
注释 / 灰色代码 --black-40
语言标识 --black-40
按钮区 内置操作显式使用 Button bare emphasis="muted":--black-100 × opacity: 0.4(视觉等同 --black-40)
关键字 / 数字 / literal #ff32c6
函数 / 调用对象 #ffac60
属性 / 方法 #1ac69c
字符串 #3fa4ff
变量 #c478ff

外置 style 的 background / background-* 声明在普通态、全屏进入、全屏展示和退出期间保持生效。全屏层同步这些声明及其依赖的外置 CSS 变量,保留 Token 解析与动态更新;普通态的宽高、定位和内边距不随之带入全屏。未设置外置背景时继续使用默认 Background/2。

代码块根容器默认设置 font-size: var(--text-12) 与 line-height: var(--leading-12);内部行号、pre、code、代码行全部继承根容器排版。font-family 默认继承外部上下文,不设置具体字体族,忽略设计稿中的字体设置。

默认态与全屏态的右上 CopyButton / ExpandButton 仍使用 bare emphasis="muted" 的图标强调与复制反馈;每个按钮独立使用上下 4px、左右 8px 的 padding、8px 圆角、半透明代码块语义背景及 20px backdrop blur,hover 时继续由 Button 将强调度提升到 100%。键盘焦点有可见轮廓。singleLine 的行内 trailing 复制按钮不使用这组右上视觉。

语言标签与动作组之间的有效间距至少4 CSS px;普通态与全屏态一致,纯图标组和代码字符/行号间距不由本规则改写。工具栏使用内部 Pin 布局固定到 pin-top-right,距上边缘 8px、右边缘 4px;过长语言标签在可用宽度内省略。代码内容和纵向滚动条从工具栏下方开始,不被按钮覆盖。右下角尺寸手柄复用 Indicator appearance="corner",仅角点附近可拖动,默认同时调整宽高;常态 2px / Black/10,自身 hover、focus 或 dragging 时变为 4px / Black/20。


内置 Icon

默认图标由真实CopyButton/ExpandButton子组件拥有并经内部ComponentIcon解析;调用方无需额外import这些内部依赖:

图标 用途
Copy 复制按钮默认状态
Check 复制成功后短暂显示
ArrowsOutSimple 放大按钮默认状态(进入全屏)
ArrowsInSimple 全屏状态下的缩小按钮

外置 Icon 替换

推荐使用与 Input 一致的 as="trailing" 写法替换右侧默认动作区:

<CodeBlock code="console.log('hello')">    <Icon as="trailing"><Lightning /></Icon></CodeBlock>

也保留精确替换单个内置图标的兼容入口:

data-as 值 替换的内置图标
copy-icon 复制图标(Copy)
copied-icon 复制成功图标(Check)
expand-icon 放大图标(ArrowsOutSimple)
collapse-icon 缩小图标(ArrowsInSimple)

Icon 动效行为

场景 动效
点击复制 Copy 消失 → Check 进入(REPLACEMENT_APPEAR_MOTION 内容替换进入 preset),停留 copyTimeout ms
复制超时 Check 消失 → Copy 出现(同上)
点击放大 ArrowsOutSimple 消失 → ArrowsInSimple 出现(同上)
点击缩小 / Esc ArrowsInSimple 消失 → ArrowsOutSimple 出现(同上)
全屏进入 先捕获普通态位置;全屏覆盖层使用共享元素 layout 策略实际过渡 top / left / width / height,代码字号和行高保持不变
全屏退出 全屏覆盖层以同一 layout 策略缩回普通态位置后卸载;普通态代码结构始终保持最终布局,不在末帧增删行号

图标替换进入动效引用 REPLACEMENT_APPEAR_MOTION。具体 duration / easing / scale 以 motion preset catalog 为准,Frame appear 桥接变量名仅作为兼容入口保留。


滚动条与高度

默认代码区高度由代码内容和 visibleLines 共同控制:内容不足 visibleLines 时按内容自适应(hug 高度),内容超过后固定到 visibleLines 行并滚动。默认 visibleLines={5},与 Textarea 的自动高度上限保持一致。右下角提供与 Textarea 一致的拖拽手柄;拖拽后进入手动高度,代码区占满容器剩余高度并滚动。

消费方可通过 style 提供初始高度;首次拖拽后,交互产生的手动高度优先于初始 style 中的 height,避免外部初始值持续覆盖拖拽写回。其余用户样式仍保持最高合并优先级。

当代码区发生垂直滚动时,顶部和尾部会显示透明渐隐。渐隐复用 layout.css 的 .snowui-scroll-mask 通用能力(即「内容渐隐层」基础共享能力的 CSS 静态形态,能力总览见 ../lib/edge-fade.md(源码参考:components/src/lib/edge-fade.md)),通过 mask-image 只改变内容 alpha,不绘制可见色块。滚动条复用 scrollbar.css 的通用浮层滚动条:

结构 说明
.snowui-overlay-scrollbar-viewport 可滚动 viewport,隐藏原生滚动条
.snowui-overlay-scrollbar 自定义纵向 / 横向轨道,不占布局尺寸;横向溢出时默认常显,可按宿主 hover 显隐
.snowui-overlay-scrollbar-thumb Thumb 视觉与拖拽逻辑由通用样式 / hook 统一管理
.snowui-scroll-mask + data-scroll-mask 顶部 / 尾部滚动透明渐隐
.snowui-indicator-corner 右下角通用 Indicator 双轴手柄;位置由 Indicator 默认规则统一管理

CodeBlock 的默认态、全屏态和 singleLine 都由 useOverlayScrollbar 管理横向溢出;默认态和全屏态同时管理纵向溢出。组件只声明轨道定位,滚动条尺寸、显隐、hover 形态与鼠标拖拽由共享样式承接。纵向条随宿主 hover 显隐;横向条默认在内容溢出时始终显示,horizontalScrollbarVisibility="hover" 时随宿主 hover 显隐。


Frame 能力接入说明

Frame 能力 接入层 说明
普通 Frame 根 Frame 容器不触发默认 hover 动效;singleLine 固定复用 Frame singleLine + Auto Layout 三槽协议
enableResponsive 根 Frame 默认 false(代码块本身不需要容器断点响应)
enableContext 根 Frame 默认 false
enableScaleObserver 根 Frame 默认 false
enableDefaultMotion 根 Frame 默认 true
stateContent 复制按钮内部 Frame 驱动 Copy ↔ Check 图标交叉淡化
共享元素布局转场 根 Frame / 全屏覆盖层 Frame 捕获普通态矩形,并使用 strategy: "layout" 实际过渡位置和尺寸;避免 scale() 缩放代码
Appear 全屏覆盖层 Frame 提供布局转场时序桥接变量
Icon 按钮 CopyButton/ExpandButton的真实Button宿主 通过公开Props与parts配置,显式配件保持自身输入(内置Icon规范§2.7)

基础用法

<CodeBlock code={`const x = 1;`} language="ts" />

children 直接写代码

<CodeBlock language="ts">{`const x = 1;console.log(x);`}</CodeBlock>

显示行号

<CodeBlock code={codeStr} language="tsx" showLineNumbers />

设置显示行数

<CodeBlock code={codeStr} language="tsx" visibleLines={8} />

隐藏按钮

<CodeBlock code={codeStr} showCopyButton={false} showExpandButton={false} />

隐藏语言标识

<CodeBlock code={codeStr} language="tsx" showLanguage={false} />

自定义复制超时

<CodeBlock code={codeStr} copyTimeout={3000} />

外置 trailing Icon

<CodeBlock language="bash">    <Icon as="trailing"><Lightning /></Icon>    {`pnpm installpnpm build`}</CodeBlock>

布局模型

默认态主布局模型:复合管理布局(参见 LayoutProtocol.md §12.6(源码参考:specs/maintainers/LayoutProtocol.md))。singleLine 改用槽位宿主布局,根层直接管理 Leading / Content / Trailing,且不生成下列默认态的滚动、全屏与 resize 子树。

组件内部包含:

  • 工具栏区域(固定在顶部,不随代码滚动)

  • 可滚动代码区域(overflow-x: auto)

  • 全屏覆盖层(position: fixed,按需渲染)


CodeBlock 样式覆盖

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

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

变量 用途与默认参考
--snowui-button-background-override 背景(默认值见组件源码)
--snowui-button-padding-override padding y+x
--snowui-button-radius-override border-radius
--snowui-code-block-bg-override 背景(默认值见组件源码)
--snowui-code-block-code-gap-override 代码区 gap(默认值见组件源码)
--snowui-code-block-content-height-override 代码区高度(默认 5lh,约 5 行)
--snowui-code-block-fg-override 前景色(默认 #1c1c1c;语法着色色值固定在组件内)
--snowui-code-block-gap-override 操作按钮 gap(默认 var(--gap-2) = 8px)
--snowui-code-block-padding-override 整体 padding(默认态 20px;singleLine 上下 12px / 左右 16px)
--snowui-code-block-padding-x-override 左右 padding(默认态 var(--padding-5) = 20px;singleLine var(--padding-4) = 16px)
--snowui-code-block-padding-y-override 上下 padding(默认态 var(--padding-5) = 20px;singleLine var(--padding-3) = 12px)
--snowui-code-block-radius-override 圆角(默认 var(--radius-4) = 16px)
--snowui-code-block-scroll-mask-size-override 滚动边缘透明渐隐尺寸(默认 32px)

设计指南 · Token · 组合边界

CodeBlock 类型与状态

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

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

继承声明:Partial<FrameProps>。继承能力以基类公开文档为准;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}`;