Skip to content

Design to Code 导出细节参考 ​

本页整理导出规则和边界。返回第 38 课查看 API 与可交互示例。

概念映射 ​

.ic 概念代码产物
rect/g + display: flex<div> + flex 工具类(flex items-center …)
Flex 方向、对齐、尺寸、间距和内边距Tailwind flex 工具类 / CSS
cornerRadius / fills / strokes / dropShadowrounded-* / bg-* / border / shadow-*
带图片填充的 rect<img src> 与 object-fit / object-position
单层 CSS 渐变填充的 rectCSS background-image
ellipseCSS border-radius: 50%
带纯色填充与描边的叶子 path保留矢量轮廓的内联 SVG <path>
带纯色描边的叶子 line / polyline保留开放线段的内联 SVG <path>
rect / ellipse + clipMode: clip在裁剪元素上使用 CSS overflow: hidden
rotation / scaleX / scaleY围绕局部左上角的 CSS transform
节点级 blendModeCSS mix-blend-mode
visibility: hidden / visibleCSS 可见性,保留布局空间
text + content文本节点;已定义的 $token → 当前文本值
文本装饰的线条、样式、颜色与粗细CSS text-decoration
fontVariant / fontKerningCSS font-variant / font-kerning
wordWrap / wordWrapWidthwhite-space、overflow-wrap 与 max-width
maxLines / textOverflowCSS 多行省略(ellipsis)或按行高裁剪(clip)
iconfont(lucide)lucide-react <Search />
iconfont(其他族)@iconify/react <Icon icon="family:name" />
$color.bg 变量bg-[var(--color-bg)](css-var)/ 字面量(resolved)
reusable 根一个 React 组件定义
ref + descendants 覆盖组件实例 + props
name组件名 / prop 名 / class 名

组件属性 ​

在 componentStructure: 'preserve'(默认,也是 Pencil 的卖点)下,每个 reusable 根会成为一个组件,每个 ref 成为一次实例调用。各实例上出现过的可覆盖属性(content、fills、包括 fontVariant 和 fontKerning 的排版属性、文本装饰、opacity、visibility、cornerRadius、显式 width / height、minWidth / maxWidth / minHeight / maxHeight、padding、margin、flex 间距、flexDirection、alignItems、justifyContent、flexWrap、alignSelf、flexGrow、flexShrink、flexBasis、strokeWidth、strokes 和投影字段)会被提升为 props,默认值取自模板。

.ic 中数值型 lineHeight 表示像素高度,因此 React 导出会补 px,不会将其当成无单位的行高倍率。布尔型 fontKerning 会转为 CSS 的 normal 或 none。

四边间距数组会转为 CSS 简写字符串,文本装饰字段会合并为一个参数,投影字段会合并为一个 boxShadow prop。装饰线粗细为 0 时导出 none,与画布语义一致。

文本 ​

未显式设置 lineHeight 时,文本导出使用无单位的 1.2 行高,使浏览器的 flex 间距接近画布的文本测量结果;显式设置的数值行高仍以像素导出。white-space: pre 会保留显式换行。开启 wordWrap 且 wordWrapWidth 为正数时,会使用 pre-wrap、overflow-wrap: anywhere,并把该宽度作为最大宽度。正数 maxLines 会为默认的 ellipsis 添加 CSS 多行省略,为 clip 添加按行高裁剪。已开启换行的可复用文本如果只修改换行宽度,会生成组件 prop;切换换行开关或修改截断配置则会展开实例,以匹配编辑后的布局。当前画布测量尚未应用 whiteSpace 属性;自定义 textOverflow 标记字符串尚无对应的标准 CSS 实现。

图片与填充 ​

对于可复用图片,仅修改图片 URL 时,实例的 fills 覆盖会绑定到组件的 <img src> 参数。修改填充类型、适配方式、位置或填充透明度时,实例会展开,使生成的元素与样式对应编辑结果。没有子节点的单层图片会在 <img> 上合并填充透明度与节点整体透明度。单层图片填充的椭圆会导出为圆角 <img>。带子节点的图片填充矩形和椭圆会使用定位容器,将装饰性 <img> 放在子节点后方;容器承担节点整体透明度,图片承担填充透明度、适配方式和位置。

矩形只有一层启用的 CSS 线性、径向或锥形渐变填充时,会导出为 CSS background-image。实例仅修改渐变值时会生成组件参数。

矩形和椭圆的多层纯色、受支持的渐变、图片或图案填充会按绘制顺序导出为叠加的背景;单层图案也会导出为 CSS 背景。画布的 conic-gradient(circle at …) 语法会转换为 CSS 的 conic-gradient(at …)。

图片层支持 fill、contain、cover、none、scale-down 和定位,并让子元素处于涂料上方。图案会保留原始平铺尺寸及重复模式。

需要独立透明度、scale-down 或受支持 2D 图案变换时,代码生成器会在子元素下方创建独立裁剪的装饰层;有 CSS 对应模式的图层混合仍限定在填充栈内。尺寸明确的矩形和椭圆支持图案的 matrix、translate、scale、rotate、skewX 和 skewY 变换;画布也会解码 URL 图案并应用变换。

可复用实例修改填充栈或图案时会展开。其他渐变格式、不支持的图案变换语法,以及 linearBurn、linearDodge 等没有 CSS 对应模式的混合效果仍需单独处理。

单层纯色填充的透明度会通过 CSS color-mix 导出,不会连同子元素一起变淡。节点整体透明度仍使用独立的 CSS opacity。可复用实例修改半透明填充时会展开,以保留生成样式中的填充透明度。

变换与布局 ​

节点旋转(弧度)与 scaleX / scaleY 会导出为以 0 0 为原点的 CSS rotate(...) scale(...),顺序与画布局部变换一致。实例修改变换后会展开,以包含修改后的几何效果。

非 flex 容器中的子节点会把画布局部 x / y 导出为相对于容器的 CSS left / top;flex 子节点仍按正常 flex 流布局。Yoga 默认的 flexShrink 为 0,因此节点未指定其他值时,导出会设置 flex-shrink: 0。非 flex 容器里的复用组件实例会增加定位包装元素,修改实例内部子节点的位置时则展开实例以保留编辑。多个顶层节点都有明确尺寸时,导出代码还会创建相对定位的外框,保留它们之间的间距,包括旋转和翻转后的边界。尺寸无法测量的顶层节点仍按普通文档流排列。

节点级 visibility 会导出为 CSS visibility,隐藏节点仍占据布局空间。默认的 inherited 状态对应 CSS 继承。复用组件实例及其子节点修改可见性时,会生成组件参数。

矢量图形 ​

有有效 d 数据的 Path 会导出为内联 SVG。Path 带子节点时,SVG 会放在定位容器的底层,同时保留子节点的局部坐标和矢量轮廓。

由纯色、线性或径向渐变、图片构成的多层填充,会按画布顺序导出为独立 SVG path,并保留各层透明度。具有 CSS 对应模式的混合效果会应用在隔离的 SVG 分组中,仅与下方填充层混合。

上述涂料类型的多层描边会保留各层涂料、透明度、线形/三角形/菱形端点标记、填充规则、宽度、端帽、连接、斜接限制和虚线参数。Path、Line 和 Polyline 会共用描边几何,按画布顺序逐层导出,并支持有 CSS 对应模式的描边层混合。

闭合 Path 的内侧或外侧对齐会对每一层应用裁剪或遮罩;开放路径仍按居中描边导出。渐变和图片涂料会跟随 Path 视口。

Path 图片填充支持 fill、contain、cover、none、scale-down,也支持中间百分比定位。常见的 fill/contain/cover 对齐使用 SVG 图案;其他适配和定位会导出裁剪的 SVG foreignObject,并由 CSS object-fit/object-position 控制。

图片描边在 fill、contain、cover 且各轴定位为 0%、50%、100% 时仍使用 SVG 图案。单层图片描边采用其他适配方式或定位时,会通过定位的 HTML 图片和 SVG 几何遮罩导出,在 Chromium 和 WebKit 中保留端帽、连接、端点标记及内外侧对齐。

采用这些适配方式或定位的多层图片描边也会与 SVG 描边层一起保留画布绘制顺序、受 CSS 支持的混合模式、透明度和端点标记。导出代码中的图片应使用持久 URL 或 data URL。

投影会跟随 SVG 图形轮廓,不会给 Path 的子节点重复加阴影。复用实例修改 Path 的填描、几何、标记、描边对齐或投影时会展开实例,确保 SVG 对应编辑结果。

linearBurn 与 linearDodge 等没有 CSS 对应模式的混合效果、锥形与网格渐变及其他滤镜仍需单独实现。

没有子节点的 Line 与 Polyline 复用同一套 SVG 导出:局部端点或点列表会转换为无填充的开放路径。SVG 视口会跟随几何的局部原点,并让零宽或零高的轴居中,因此偏移的 Path、细水平线和竖线也能正常显示。描边支持单层启用的纯色、线性渐变、径向渐变或图片涂料。线形、三角形和菱形箭头会使用局部 SVG 标记,并跟随描边涂料。复用实例修改线段几何、描边或标记时也会展开。其他线条效果仍需单独实现。

矩形和椭圆的 clipMode: clip 会在导出的 HTML 和 React 代码中裁剪子内容。圆角矩形保留圆角,椭圆使用 border-radius: 50%。复用实例修改裁剪模式时会展开实例以保留该修改。erase 和 soft 蒙版无法直接映射为 CSS overflow,暂不作为裁剪导出。

混合模式 ​

节点级 blendMode 会导出为 CSS mix-blend-mode;实例修改它时也会生成组件参数。light 对应 CSS 的 lighten;没有 CSS 等价物的模式与 SVG 导出一致,按 normal 处理。填充层自身的 blendMode 用于该节点内部的多层填充合成,不会作为节点级 mix-blend-mode 导出。

实际界面示例 ​

第 38 课的示例将运营数据面板、SaaS 定价页和移动端结账页加载到 IC 编辑器画布中。三份设计都包含嵌套 flex 布局与语义化颜色变量;结账页采用 390 × 844 的窄屏画板。你可以在画布中选中、修改节点,再从画布当前文档通过 API.exportCode 更新、复制或下载代码;选择 HTML/CSS 后,点击 HTML 预览 可在沙箱窗口中按画板尺寸查看生成的页面。切换示例会载入另一份可编辑设计。

这些示例在调用 API.exportCode 时按节点 ID 传入 semanticElements,让部分画布矩形和文字在两种导出结果中变成 HTML 页面区域、标题与 <button type="button"> 控件。这份映射属于示例的导出配置;按钮行为和导航仍需在应用中接入。

定价页使用一个 reusable 套餐卡片模板和三个 ref 实例。编辑器会展开实例以便渲染和编辑;此示例会把文字、颜色、排版与文本装饰、透明度、显式尺寸与尺寸约束、间距、Flex 对齐与子项尺寸、纯色描边和投影修改还原为实例覆盖项,供 React 与 .ic 下载使用。Growth 卡片展示了强调色描边。数值型 flexBasis 和尺寸约束在 HTML/CSS 和 React 样式中按像素输出。若卡片结构或不支持的属性被修改,导出会使用展开后的节点,让结果继续与画布一致。

这三个示例的 React 导出也会在 React 19 与 Tailwind CSS 4 环境中运行浏览器测试,并将关键文字位置与 HTML 预览对照,防止生成器改动破坏实际渲染。

下载 .ic 文件后,可在在线应用中通过 Import from… > .ic 继续编辑设计。下载 HTML 文件后可直接用浏览器打开。选择 下载 React 工程 可从当前画布获取包含 Vite、React 19 和 Tailwind CSS 4 的 ZIP。解压后执行 pnpm install 和 pnpm dev 即可运行,导出的组件位于 src/App.tsx;设计使用 Inter 时,工程会在构建时打包字体文件。当前画布使用的临时 blob: 图片会复制到 public/assets,代码改用本地路径;data URL 继续内联,远程 URL 保持原样。工程中的 src/responsive.css 为这三个示例提供窄屏布局,src/App.tsx 仍保留画板尺寸。也可以只下载 .tsx 文件,放入现有项目。目前生成的是展示层代码;导航、结账动作、支付及实时数据仍需在应用中接入。

Released under the MIT License.