@antfu/design

中文文档
0.6.0发布于 2026/10/01MITES Module构建来源已验证近 30 天下载 3932

适用于devtools-style Vue apps的自定义可调和设计系统——UnoCSS预设,Vue原始人,设计技能,以及11y对比检查

中文使用文档
文档目录19 节
  1. 安装
  2. 快开始
  3. 出口
  4. 正在移动已存在的应用程序
  5. 嵌入阴影根
  6. 无障碍
  7. 构成部分
  8. 行动
  9. 显示
  10. 表单
  11. 重叠
  12. 版式
  13. 反馈
  14. 键
  15. 语义快捷键( M)
  16. 严重性尺度
  17. 类型大小
  18. 动态
  19. 许可证

@antfu/设计

一个可定制的, 可堆叠 devtools-style Vue apps的设计系统: a UnoCSS 预设 (presetAnthonyDesign),一组Vue原始人,一个地基上 设计技能, 和颜色相通的a11y检查。 介于组件之间的东西 图书馆和阴影.

安装

pnpm add @antfu/design unocss vue

快开始

// uno.config.ts
import { presetAnthonyDesign } from '@antfu/design/unocss'
import transformerDirectives from '@unocss/transformer-directives'
import { defineConfig, presetIcons, presetWebFonts, presetWind4 } from 'unocss'

export default defineConfig({
  presets: [
    presetAnthonyDesign({ primary: '#49833E' }),
    presetWind4(), // a base preset is required — bring your own
    presetIcons(),
    presetWebFonts({ fonts: { sans: 'DM Sans', mono: 'DM Mono' } }),
  ],
  // Required — most shipped styles recolor overlays with token `--at-apply`
  // directives; this transformer expands them (and lets you reuse tokens in CSS).
  // (vue-afloat.css is the exception — it themes via vue-afloat's own
  // `--vue-afloat-*` CSS variables and needs no transformer.)
  transformers: [transformerDirectives()],
  // The preset ships no z-index scale (stacking is the app's to own) and blocks
  // plain `z-<number>`. Define the named layers the overlay components use here —
  // these values are yours; tune them to fit your app's stack.
  shortcuts: {
    'z-nav': 'z-[30]',
    'z-dropdown': 'z-[40]',
    'z-tooltip': 'z-[45]',
    'z-toast': 'z-[50]',
    'z-modal-backdrop': 'z-[60]',
    'z-modal-content': 'z-[70]',
    'z-drawer-backdrop': 'z-[80]',
    'z-drawer-content': 'z-[90]',
  },
})

说对了 @unocss/eslint-plugin 对于反馈回路——它会显示块列表提示(例如平面) z-50(单位:千美元) 您的编辑器和CI 而不是静静地在建设时间下降.

// Components are imported by full path (no barrel) — categorized and prefixed:
import ActionButton from '@antfu/design/components/Action/ActionButton.vue'
import DisplayBadge from '@antfu/design/components/Display/DisplayBadge.vue'
import OverlayModal from '@antfu/design/components/Overlay/OverlayModal.vue'
import '@antfu/design/styles.css' // everything, incl. splitpanes/reka/vue-afloat overrides

styles.css 捆绑每个覆盖引擎的覆盖。 如果你不全部使用他们, 樱桃选手没有使用(splitpanes编号 :reka-ui海军陆战队从来就没有过船:

import '@antfu/design/styles/base.css'
import '@antfu/design/styles/scrollbar.css'
import '@antfu/design/styles/vue-afloat.css' // only if you use tooltips

货船 原始内容 .ts 编号 : .vue 来源 (不捆绑)——你的建筑 编成. 没有额外 content 需要配置: UnoCSS 默认扫描匹配 .vue编号 :.tsx (仅将其默认排除为CSS,而非 node_modules, (中文(简体) ), 因此您导入的组件会被自动取出 。 狦 对 设定 content.pipeline.include,注意这一点 替换 默认扫描而不是 扩展它 —— 重复默认值, 否则您自己的源已停止生成 .

这是一个 单人 预设为 非自定义: 它只贡献 antfu设计层(主题符号,语义快捷键,动态规则,严重程度). 由您组成基础预设,图标,字体和重置自己——并添加 @unocss/transformer-directives (运出样式使用符号) --at-apply +,建议, @unocss/eslint-plugin 用于反馈循环.

出口

子路径什麽
./components/*一个可读 .vue 每个组件(例如:. ./components/Display/DisplayBadge.vue(中文(简体) )
./unocss单曲 presetAnthonyDesign 预设
./utils颜色、格式、路径、成像、对比、密钥绑定的帮助者(纯、无国籍)
./composables/*帮助者 : colorScheme (备选方案背景)和 toast (单位:千美元)useToast 队列)
./a11y程序色相相扫描
./styles.css, (中文(简体) ), ./styles/*所有样式, 或每个关联文件
./splitpanes.d.ts旧的选入后退类型 splitpanes (v4.1.2+ 船舶本身)

软件包是 无国籍人 ——无暗相/剪贴板/托斯状态. 构成部分 不同计划的不同 colorScheme 道具;道克被控制. 使用 Vue 用户 直接为州.

两个 选入 帮助者减少锅炉板而不添加全局状态: provideColorScheme(() => isDark ? 'dark' : 'light') (从) @antfu/design/composables/colorScheme(中文(简体) ) 让了解计划的组成部分继承计划,而不是对道具进行线化,以及 useToast() (从) @antfu/design/composables/toast) 拥有敬酒队 FeedbackToasts两者都只读到你的状态.

正在移动已存在的应用程序

如果你的应用早于设计系统, 收养主要是 删除数字 :

  • 删除本地符号快捷键 . 应用软件已经在 *-base 方言 (单位:千美元)bg-base, (中文(简体) ), color-base, (中文(简体) ), border-base, (中文(简体) ), op-fade, (中文(简体) ), btn-action, (中文(简体) ), badge-color-*, (中文(简体) ), color-scale-*,...)可以放下手卷 uno.config.ts shortcuts 块 -- -- 经常为20-170行 -- -- 并从 presetAnthonyDesign设置 primary 编号 : darkBackground 切换到您的现有值 (并保持你现有的 presetWebFonts 配置为- is —— 此预设没有 关于字体的意见),用于近零可视的diff.
  • 地方公用事业 输入 @antfu/design/utils: 已复制 getHashColorFromString 编号 : getPluginColor, 字节 / 持续时间 / 时间 格式化器,模块-id / 路径解析器,以及 semver-range 解析器都存在那里.
  • 跳出遗产 presetUno 别名. presetUno 是旧名 presetWind3; 切换到当前基数 (presetWind4 建议,或 presetWind3因此语义快捷键有可以扩展为的公用功能. 还是你 带上自己的图标、字体和 @unocss/reset ——预设的捆绑没有.
  • 绕行计划,不是状态. 软件包没有暗/托斯状态:通过 :color-scheme (或打电话) provideColorScheme() 移动 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}必须的土司单子 useToast() 队列.

那就跟着 重新设计协议 技术advanced-patterns: 原始地图 彩色 符号 一次将原始元素交换给一个家庭 然后运行 每一步后,对比扫描为光+暗.

嵌入阴影根

将组件挂入阴影根内——网络组件,devtools码头, 被支持的插入上覆线,但有两样东西不会在 他们自己的:

  • 计划课开始 祖先,从不在您风格的元素上. 这个 暗变体编译为 a 后裔 选择器( e).dark .bg-base),所以一个节点 那个 实值 .dark 这不符合它自己的黑暗规则 有光主题的暗黑主机 切换 dark编号 :light (和 color-scheme在一个 包装.. display: contents 工作,所以不花费布局——放地表 对孩子的公用事业. :host(.dark) 这不是一个替代办法: 后人选取者,而相去相去相去也.
  • Global CSS无法穿透分界线——内含样式. @antfu/design/styles/* (crollbar,reka-ui动画,vue-afloat,.) 必须是工作表的一部分你 与 UnoCSS 输出一起注入根。 他们写着 * 编号 : 未瞄准的选取者 正好让他们在任一地点工作 添加 scrollbar-gutter: stable 在您自己的滚动容器上,如果您想要地沟 保留.

门户内容不需要设置 。 每个传送的组件——对话框 (单位:千美元)OverlayModal, (中文(简体) ), OverlayDrawer, (中文(简体) ), OverlayConfirm),即弹出者FormSelect, (中文(简体) ), FormCombobox, (中文(简体) ), OverlayDropdown, (中文(简体) ), OverlayHoverCard, (中文(简体) ), OverlayContextMenu, (中文(简体) ), LayoutMenubar和 FeedbackToasts ——检测被包围的阴影根并 电传传送器装入附在容器内的容器,该容器还反映 dark编号 :light 最接近的图案包装器的分类 如此黑暗的代号 总是在那里解决。 过 明确 to (一个选择器或元素)来覆盖目标. 这个 水电/电车 故事把它们都挂在了阴影根里.

无障碍

彩相扫描( 轴- 核心 + Playwright) 运行一个 URL 财务报告和审定财务报表 阴暗 模式。 在程序上使用它:

import { formatContrastReport, runContrastScan } from '@antfu/design/a11y'

const result = await runContrastScan({ url: 'http://localhost:6006/iframe.html' })
console.log(formatContrastReport(result))

...或用 tsx数字 :

tsx node_modules/@antfu/design/a11y/cli.ts http://localhost:6006/iframe.html

构成部分

行动

构成部分用它来
ActionButton行动. variant 动作/主/正文,多态 href编号 :as, (中文(简体) ), icon, (中文(简体) ), loading。 。 。 .
ActionIconButton一个圆形的只包含图标的按钮 tooltip, (中文(简体) ), active 状态, #badge。用 VueUse 编曲 useDark 为了一个黑暗的跳跃.
ActionToggle单个按下/ 未按下切换按钮( u)icon, (中文(简体) ), label) (中文(简体) ).
ActionToggleGroup一组从 options,单项或多项选择(multiple),可选的图标.

显示

构成部分用它来
DisplayAvatar一个回落到散列颜色首字母的图像外观 name 何时 src 缺席/失败.
DisplayBadge状态/类型/tag 芯片——从文本中以散列色来表示,调色板名称(color="green"),出声,或哑. colorScheme, (中文(简体) ), variant, (中文(简体) ), icon, (中文(简体) ), rounded (单位:千美元)md编号 :full* 编号, paddingX编号 :paddingY; 以自己的尺寸 font-size。 。 。 .
DisplayBytes人性化的大小, colorize百分比(百分比) total。 。 。 .
DisplayDate相对时间 + 精确日期工具提示, colorize 按年龄划分, live。 。 。 .
DisplayDonut一个进步环.
DisplayDuration人类, colorize 以严重程度表示.
DisplayFileIcon通过一个可配置的规则列表( ext/ path = 图标)rules, (中文(简体) ), folderRules),带有 invert 逃出舱门,用于光表面的黑暗图标集.
DisplayFilePath复写、 淡化目录、 解码 .pnpm,图标,链接.
DisplayIconifyRemoteIcon从图标 API 中获取,使图标名称不包含捆绑的图标集.
DisplayKbd使和弦(例如:. mod+k作为平台格言.
DisplayKeyValue贴有标签的stat——入行或堆放, mono 数值, #badge 装饰.
DisplayLabel完全圆形 DisplayBadge GitHub 风格标签( 更紧贴) (colorScheme) (中文(简体) ).
DisplayNumber格式化编号(Intl),单相+表格, prefix编号 :suffix。 。 。 .
DisplayNumberBadge(单位:千美元) DisplayNumber 在警徽外壳中——一粒计数药丸.
DisplayPackageName以散列为色( 以相干为色)colorScheme) (中文(简体) ).
DisplayProgressBar线性进展轨道——确定(value 0-1)或省略时不确定, color, (中文(简体) ), rounded。 。 。 .
DisplayProportionBar堆放比例栏.
DisplaySafeImagea 一个 <img> 交换到 #fallback 丢失/ 失败的插槽 src,带有可选 preload 以避免闪光.
DisplayTree筑个平地 items 列表(通过 getPath)或预建 nodes 输入可扩展文件/文件夹样式树,并 #leaf编号 :#default 插槽覆盖 .
DisplayVersionvX.Y.Z 前缀逻辑; 传递光谱/距离( )workspace:*, (中文(简体) ), ^1.2通过未触及.

表单

构成部分用它来
FormCheckbox以 v-model。 。 。 .
FormCombobox可搜索、可过滤的选择(reka-ui) Combobox超过一个 options 列表中选择一个选项.
FormField用一个 label, (中文(简体) ), description,以及 error (作用="戒备"),, required 标记.
FormNumberInput数字输入 min编号 :max编号 :step 夹住和可选-/+分步 controls。 。 。 .
FormRadioGroup装有 v-model。 。 。 .
FormSearchFielda 搜索输入——图标+ DisplayKbd 快捷键提示 + 清除按钮.
FormSegmentedControl单选分块控件( reka- ui) RadioGroup超过一个 options 列表,包括有效的 null 部分.
FormSelect本地感觉选择带 v-model。 。 。 .
FormSwitch打开/关闭的开关,以 v-model。 。 。 .
FormTextInput单行文本输入, icon, (中文(简体) ), invalid 状态.
FormTextarea多行文本输入, rows, (中文(简体) ), invalid 状态, resize 切换.

重叠

构成部分用它来
OverlayConfirm关于确认/撤销决定的警报日志, variant="danger" 破坏行动.
OverlayContextMenu (+ 数) OverlayContextMenuItem, (中文(简体) ), OverlayContextMenuLabel, (中文(简体) ), OverlayContextMenuSeparator(中文(简体) )右键菜单.
OverlayDrawer任意一个滑入面板 side (以左/右/上/下为单位) width。 。 。 .
OverlayDropdown (+ 数) OverlayDropdownCheckboxItem, (中文(简体) ), OverlayDropdownGroup, (中文(简体) ), OverlayDropdownLabel, (中文(简体) ), OverlayDropdownRadioGroup, (中文(简体) ), OverlayDropdownRadioItem, (中文(简体) ), OverlayDropdownSeparator, (中文(简体) ), OverlayDropdownSub(中文(简体) )一个触发障碍的倒下菜单.
OverlayDropdownItem可选择的下行 icon, (中文(简体) ), variant="danger",跟踪 shortcut (通过 DisplayKbd) (中文(简体) ).
OverlayHoverCard悬浮起伏的弹出式弹出式相机 openDelay编号 :closeDelay。 。 。 .
OverlayModal居中对话框( e)title, (中文(简体) ), description, (中文(简体) ), #trigger 插槽).
OverlayTooltipa vue- afloat 工具提示 - 文本 content 或 #content 可配置的槽 placement编号 :delay编号 :triggers,加上画布/图上覆盖的虚拟锁定模式.

版式

构成部分用它来
LayoutAccordion相撞部分从 items; 1个条目=单节, multiple 数个同时打开.
LayoutBreadcrumb链接路径从 items; 最后一个 crumb 生成为纯文本.
LayoutCarda 相邻内容表面.
LayoutDataTable可排序的通用数据表 columns + 键 rows选项 stickyHeader。 。 。 .
LayoutExpandableList单词"Show N more"短调.
LayoutMenubar桌面样式菜单栏 menus 清单 MenubarMenuEntry。 。 。 .
LayoutPagination页面编号导航.
LayoutPanelGrids(单位:千美元) dots编号 :grid 空状态或画布的背景图案表面.
LayoutScrollArea自定义滚动条滚动容器.
LayoutSeparator横向/纵向分隔器,可选用中央分隔器 label。 。 。 .
LayoutSideNav垂直导航列表 items,通过 v-model。 。 。 .
LayoutSplitPane可重排分页窗格( wrap) splitpanes) (中文(简体) ).
LayoutTabs下划线/部分标签, count 筹码.
LayoutToolbar粘接的玻璃表面动作棒 #start编号 :#search编号 :#end 插槽 .
LayoutVirtualList虚拟化清单@tanstack/vue-virtual)用于大型藏品.

反馈

构成部分用它来
FeedbackEmptyState一个空/零状态占位符——图标、标题、描述, #action 插槽 .
FeedbackLoading装入占位符包装 FeedbackSpinner。 。 。 .
FeedbackSkeleton用于装入内容的闪光占位符块.
FeedbackSpinner旋转甘油.
FeedbackTip(a) 内调——信息/成功/警告/错误.
FeedbackToasts演示式土司堆栈( e)items, (中文(简体) ), position)——应用公司通过自己的程序拥有列表和id useToast()。 。 。 .

有导入路径的完整目录 : 核心组件。 。 。 .

键

语义快捷键( M)

脚本扩展至
color-basecolor-base-light dark:color-base-dark
color-base-lightcolor-neutral-800
color-base-darkcolor-neutral-200
color-mutedcolor-neutral-600 dark:color-neutral-400
color-faintcolor-neutral-500 dark:color-neutral-500
color-activecolor-primary-600 dark:color-primary-300
bg-basebg-white dark:bg-#111
bg-secondarybg-#f6f6f6 dark:bg-#101010
bg-raisedbg-white/65 dark:bg-black/60
bg-sunkenbg-black/4 dark:bg-white/6
bg-activebg-#99999920
bg-ambientbg-#99999925
bg-hoverbg-#99999915
bg-codebg-gray-500/5
bg-tooltipbg-white/75 dark:bg-#111/75 backdrop-blur-8
bg-gradient-morebg-gradient-to-t from-white via-white/80 to-white/0 dark:from-#111 dark:via-#111/80 dark:to-#111/0
border-baseborder-#9992
border-muteborder-#9991
border-activeborder-primary-600/25 dark:border-primary-400/25
ring-basering-#9992
op-fadeop65
op-muteop40
op-activeop100
op-disabledop30
icon-catppuccininvert-100 hue-rotate-180 brightness-80 dark:invert-0 dark:hue-rotate-0 dark:brightness-100
btn-actionborder border-base rounded flex gap-2 items-center px2 py1 op75 hover:op100 hover:bg-hover transition disabled:pointer-events-none disabled:op30! outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40
btn-action-smbtn-action text-sm
btn-action-activecolor-active border-active! bg-active op100!
btn-iconw-9 h-9 rounded-full op-fade hover:op100 hover:bg-hover transition flex items-center justify-center disabled:pointer-events-none disabled:op30 outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40
btn-icon-compactw-6 h-6 rounded op-fade hover:op100 hover:bg-hover transition flex items-center justify-center disabled:pointer-events-none disabled:op30 outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40
btn-icon-squarew-9 h-9 rounded border border-base op-fade hover:op100 hover:bg-hover transition flex items-center justify-center disabled:pointer-events-none disabled:op30 outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40
btn-primarypx2 py1 rounded border border-transparent flex gap-2 items-center bg-primary-500 hover:bg-primary-600 text-white transition disabled:op50 disabled:pointer-events-none outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40
btn-textpx2 py1 rounded border border-transparent inline-flex gap-2 items-center op75 hover:op100 hover:bg-hover transition disabled:pointer-events-none disabled:op30! outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40
badgeinline-flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium leading-none
badge-activebadge bg-active color-active
badge-mutedbadge bg-#8881 color-muted
pad-safe-tpt-[env(safe-area-inset-top)]
pad-safe-rpr-[env(safe-area-inset-right)]
pad-safe-bpb-[env(safe-area-inset-bottom)]
pad-safe-lpl-[env(safe-area-inset-left)]
pad-safe-xpad-safe-l pad-safe-r
pad-safe-ypad-safe-t pad-safe-b
pad-safepad-safe-x pad-safe-y

严重性尺度

脚本扩展至
color-scale-neutraltext-gray-700 dark:text-gray-300
color-scale-lowtext-lime-700 dark:text-lime-300 dark:saturate-75
color-scale-mediumtext-amber-700 dark:text-amber-300 dark:saturate-90
color-scale-hightext-orange-700 dark:text-orange-300
color-scale-criticaltext-red-700 dark:text-red-300

类型大小

脚本扩展至
text-microtext-[10px] leading-[1.4]
text-minitext-[11px] leading-[1.45]
text-compacttext-[12px] leading-[1.5]

动态

脚本扩展至
badge-color-<name>由任何调色板颜色名称( 暗视) 组成的晶片
bg-glass 编号 : bg-glass:<n>半透明地表+ backdrop-blur
bg-dots 编号 : bg-dots-<n>光圈点网格背景, px 可变单元格大小( 默认 16)
bg-grid 编号 : bg-grid-<n>横切网格行背景, px 中的可变单元格大小( 默认 16)
scroll-fade 编号 : scroll-fade-{x,y,t,b,l,r,s,e}卷轴- 意识边缘已淡出( e)scroll-fade-<n>, (中文(简体) ), scroll-fade-none); 配对 no-scrollbar
shimmer 编号 : shimmer-{once,reverse,none}文本发光 currentColor (单位:千美元)shimmer-{color,duration,spread,angle}-*(中文(简体) )

许可证

麻省理工学院 © 傅安东尼

版本与发布记录

@antfu/design 共发布 16 个版本,首次发布于 2026/06/28;过去 12 个月发布了 16 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.6.0latest2026/10/011 个月前
0.5.32026/09/211 个月前
0.5.22026/09/161 个月前
0.5.12026/09/161 个月前
0.5.02026/09/141 个月前
0.4.02026/08/202 个月前

关于 @antfu/design 的常见问题

@antfu/design 是什么?

适用于devtools-style Vue apps的自定义可调和设计系统——UnoCSS预设,Vue原始人,设计技能,以及11y对比检查

如何安装 @antfu/design?

在项目目录运行 npm install @antfu/design,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:vue(^3.5.0)、unocss(>=66.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@antfu/design 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/antfu__design 是否存在。

@antfu/design 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@antfu/design 可以商用吗?

@antfu/design 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@antfu/design 的下载量有多少?

根据 npm 官方下载统计,@antfu/design 在 2026/10/06 – 2026/11/04 这 30 天内被下载 3,932 次,日均约 131 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@antfu/design 还在维护吗?

最新版本 0.6.0 发布于 2026/10/01(1 个月前);至今共发布 16 个版本,其中过去 12 个月发布了 16 个;首次发布于 2026/06/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。