@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.tsshortcuts块 -- -- 经常为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 | 堆放比例栏. |
DisplaySafeImage | a 一个 <img> 交换到 #fallback 丢失/ 失败的插槽 src,带有可选 preload 以避免闪光. |
DisplayTree | 筑个平地 items 列表(通过 getPath)或预建 nodes 输入可扩展文件/文件夹样式树,并 #leaf编号 :#default 插槽覆盖 . |
DisplayVersion | vX.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。 。 。 . |
FormSearchField | a 搜索输入——图标+ 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 插槽). |
OverlayTooltip | a vue- afloat 工具提示 - 文本 content 或 #content 可配置的槽 placement编号 :delay编号 :triggers,加上画布/图上覆盖的虚拟锁定模式. |
版式
| 构成部分 | 用它来 |
|---|---|
LayoutAccordion | 相撞部分从 items; 1个条目=单节, multiple 数个同时打开. |
LayoutBreadcrumb | 链接路径从 items; 最后一个 crumb 生成为纯文本. |
LayoutCard | a 相邻内容表面. |
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-base | color-base-light dark:color-base-dark |
color-base-light | color-neutral-800 |
color-base-dark | color-neutral-200 |
color-muted | color-neutral-600 dark:color-neutral-400 |
color-faint | color-neutral-500 dark:color-neutral-500 |
color-active | color-primary-600 dark:color-primary-300 |
bg-base | bg-white dark:bg-#111 |
bg-secondary | bg-#f6f6f6 dark:bg-#101010 |
bg-raised | bg-white/65 dark:bg-black/60 |
bg-sunken | bg-black/4 dark:bg-white/6 |
bg-active | bg-#99999920 |
bg-ambient | bg-#99999925 |
bg-hover | bg-#99999915 |
bg-code | bg-gray-500/5 |
bg-tooltip | bg-white/75 dark:bg-#111/75 backdrop-blur-8 |
bg-gradient-more | bg-gradient-to-t from-white via-white/80 to-white/0 dark:from-#111 dark:via-#111/80 dark:to-#111/0 |
border-base | border-#9992 |
border-mute | border-#9991 |
border-active | border-primary-600/25 dark:border-primary-400/25 |
ring-base | ring-#9992 |
op-fade | op65 |
op-mute | op40 |
op-active | op100 |
op-disabled | op30 |
icon-catppuccin | invert-100 hue-rotate-180 brightness-80 dark:invert-0 dark:hue-rotate-0 dark:brightness-100 |
btn-action | border 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-sm | btn-action text-sm |
btn-action-active | color-active border-active! bg-active op100! |
btn-icon | w-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-compact | w-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-square | w-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-primary | px2 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-text | px2 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 |
badge | inline-flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium leading-none |
badge-active | badge bg-active color-active |
badge-muted | badge bg-#8881 color-muted |
pad-safe-t | pt-[env(safe-area-inset-top)] |
pad-safe-r | pr-[env(safe-area-inset-right)] |
pad-safe-b | pb-[env(safe-area-inset-bottom)] |
pad-safe-l | pl-[env(safe-area-inset-left)] |
pad-safe-x | pad-safe-l pad-safe-r |
pad-safe-y | pad-safe-t pad-safe-b |
pad-safe | pad-safe-x pad-safe-y |
严重性尺度
| 脚本 | 扩展至 |
|---|---|
color-scale-neutral | text-gray-700 dark:text-gray-300 |
color-scale-low | text-lime-700 dark:text-lime-300 dark:saturate-75 |
color-scale-medium | text-amber-700 dark:text-amber-300 dark:saturate-90 |
color-scale-high | text-orange-700 dark:text-orange-300 |
color-scale-critical | text-red-700 dark:text-red-300 |
类型大小
| 脚本 | 扩展至 |
|---|---|
text-micro | text-[10px] leading-[1.4] |
text-mini | text-[11px] leading-[1.45] |
text-compact | text-[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}-*(中文(简体) ) |