注册表出口

本站的设计、提示词与实现,按 shadcn registry 的形状导出成条目:一条链接就能装进别的项目。

三条命令接完

  1. 注册命名空间(写进你的 components.json):
    shadcn registry add @ui-echo=https://你的域名/r/{name}.json
  2. 搜:shadcn search @ui-echo --query "验证码"
  3. 装:shadcn add @ui-echo/otp--glass-apple,或直接给条目 URL(不配命名空间也能装)

带文件工具的 agent 也可以完全不经 CLI:条目 JSON 里 files[].content 是内联源码, cssVars 是平铺变量表, meta 带术语、灵感来源、结构化 props 与必缺状态——GET 一次就够。 只想读判断与规格(不装代码)走 /llms.txt, 每个组件与每篇标准都有免站点外壳的 markdown 孪生。

装之前要知道的三件事

  • 需要 Tailwind v4:实现里的类名是工具类与 [var(--color-surface)] 混用,v3 接不住曲线、圆角与行高档。
  • 导入路径写死成 @/components/ui-echo/* 与 @/lib/ui-echo/*;根别名不同就整体替换这一段。
  • --color-* 这类变量名会进你的 globals.css。已有设计系统的项目多半撞名—— 那种情况该取的是判断与提示词(/design 有标准全文),不是我们的变量名。

底盘 · 4 条

base-interaction

UI Echo · 交互工具类|全站唯一的按压/悬停定义与焦点环,带 prefers-reduced-motion 降级与被引用的 @keyframes。

base-layer

UI Echo · 行为底座|Portal 与浮层定位 / useDismiss / 按压与入场动效 / combobox 行为 / Field 与 Icon 外壳。

base-tokens

UI Echo · token 底座|两层 token:base 存原值、semantic 只做引用;玻璃/新拟态/尺寸档位/曲线全在这里。

ui-echo

UI Echo 整套|材质分级 + 风格轴 + 两层 token + 交互底座:一次装齐本站的设计系统底盘。

整页场景 · 7 条

scene--auth

整页场景 · 两步验证|两步验证:3 个真实组件拼装的整页参考实现

scene--create

整页场景 · 新建发布|新建发布:4 个真实组件拼装的整页参考实现

scene--dashboard

整页场景 · 使用概览|使用概览:2 个真实组件拼装的整页参考实现

scene--list

整页场景 · 组件目录|组件目录:5 个真实组件拼装的整页参考实现

scene--page-home

整页场景 · 产品首页|产品首页:0 个真实组件拼装的整页参考实现

scene--page-settings

整页场景 · 账户设置|账户设置:3 个真实组件拼装的整页参考实现

scene--record

整页场景 · 发布记录|发布记录:8 个真实组件拼装的整页参考实现

材质条目 · 101 条

粒度做到"只取玻璃"这一档:命名是 类型--材质。 装叶子会顺着 registryDependencies 把底盘带上。

avatar--glass-apple

玻璃头像|Avatar with fallback|无图或 onError 回落首字母:中文取前两字,西文取首字母缩写,不重试加载

avatar--minimal

极简头像|Avatar with fallback|同一份 props(name / src / size / status)

avatar--neumorphic

拟态头像|Avatar with fallback|同一份 props(name / src / size / status)

badge--glass-apple

玻璃徽标|Status Badge|胶囊只用文字色表达语义(neutral / accent / success / warning),底色始终中性

badge--minimal

极简徽标|Status Badge|同一份 props(variant / dot)

badge--neumorphic

拟态徽标|Status Badge|同一份 props(variant / dot)

banner--glass-apple

玻璃提示条|Notification Banner|页面级状态:常驻、不自动消失,处理完或手动关闭才走

banner--minimal

极简提示条|Notification Banner|同一份 props 与 role 分配

banner--neumorphic

拟态提示条|Notification Banner|同一份 props 与 role 分配

breadcrumb--glass-apple

玻璃面包屑|Breadcrumb|nav aria-label + ol/li;分隔符 aria-hidden,当前位置 aria-current=page 且不可点

breadcrumb--minimal

极简面包屑|Breadcrumb|同一份 props(items)

breadcrumb--neumorphic

拟态面包屑|Breadcrumb|同一份 props(items)

button--glass-apple

玻璃按钮|Liquid Glass Button|半透明底 + 1px 细边框 + 背景模糊,做出玻璃厚度

button--minimal

极简按钮|Flat Minimal Button|实底 + 一条发丝边线 + 一档软阴影,没有模糊与浮起

button--neumorphic

拟态按钮|Neumorphic Button|控件与页面同色,只靠亮侧高光 + 暗侧投影浮出表面

card--glass-apple

玻璃卡片|Liquid Glass Card|玻璃面 + 边缘光学(内高光 + 顶部定向光)

card--minimal

极简卡片|Flat Minimal Card|无浮起、无模糊、无阴影

card--neumorphic

拟态卡片|Neumorphic Card|同色底 + 一组外双阴影浮起,没有边框与模糊

card--spotlight

聚光卡片|Border Glow + Inner Spotlight Card|外层渐变边框跟随鼠标位置,白底盖住中心只露 1px 光边

choice--glass-apple

玻璃勾选|Checkbox & Radio Group (APG)|原生 checkbox / radio + fieldset / legend;单选组同 name,方向键与空格交给浏览器

choice--minimal

极简勾选|Checkbox & Radio Group (APG)|原生 checkbox / radio + fieldset / legend;单选组同 name,方向键与空格交给浏览器

choice--neumorphic

拟态勾选|Checkbox & Radio Group (APG)|原生 checkbox / radio + fieldset / legend;单选组同 name,方向键与空格交给浏览器

combobox--glass-apple

玻璃可搜索下拉|List-filtering Combobox|input role=combobox + aria-expanded / aria-controls / aria-autocomplete=list / aria-activedescendant

combobox--minimal

极简可搜索下拉|List-filtering Combobox|同一份 props 与行为(@/lib/ui-echo/combobox)

combobox--neumorphic

拟态可搜索下拉|List-filtering Combobox|同一份 props 与行为(@/lib/ui-echo/combobox)

cursor--contextual

上下文光标|Contextual Cursor Ring (local demo)|只在自身范围内跟随指针,原生光标始终保留,不写 cursor: none

cursor--magnetic

磁吸指针|Magnetic Hover|指针靠近时元素向指针偏移,光标保持原生

descriptions--glass-apple

玻璃描述列表|Description List|原生 dl / dt / dd,读屏按标签—值成对播报

descriptions--minimal

极简描述列表|Description List|同一份 props(items / columns)

descriptions--neumorphic

拟态描述列表|Description List|同一份 props(items / columns)

dock--glass-apple

放大坞站|macOS-style Dock with Magnification|余弦平方衰减的放大:峰值在鼠标处,半径外平滑归零

dock--minimal

极简坞站|macOS-style Dock, Flat Tray|余弦平方衰减的放大:峰值在鼠标处,半径外平滑归零

dock--neumorphic

拟态坞站|macOS-style Dock, Neumorphic Tray|余弦平方衰减的放大:峰值在鼠标处,半径外平滑归零

drag--sortable-list

拖拽排序|Sortable List (Pointer + Keyboard)|Pointer Events + setPointerCapture,只在把手按下时开始拖拽

drag--swipe-to-dismiss

滑动删除|Swipe Actions|四段链:1:1 跟手 → 越界阻尼 30% → 阈值 96px / 速度 0.5px/ms 双判 → 吸附或飞出

drawer--glass-apple

玻璃抽屉|Side Sheet / Drawer|role=dialog + aria-modal + 标题命名;打开移入首个可聚焦,Tab 首尾循环

drawer--minimal

极简抽屉|Side Sheet / Drawer|同一份 props(open / onClose / title / side / children / footer)

drawer--neumorphic

拟态抽屉|Side Sheet / Drawer|同一份 props(open / onClose / title / side / children / footer)

dropdown--glass-apple

玻璃下拉|Select-Only Combobox (APG)|触发器 role=combobox,弹层 role=listbox,aria-activedescendant 指向高亮项

dropdown--minimal

极简下拉|Select-Only Combobox (APG)|触发器 role=combobox,弹层 role=listbox,aria-activedescendant 指向高亮项

dropdown--neumorphic

拟态下拉|Select-Only Combobox (APG)|触发器 role=combobox,弹层 role=listbox,aria-activedescendant 指向高亮项

empty-state--glass-apple

玻璃空态|Empty State|三件套:正面措辞的标题 + 一句说明 + 单个主操作;零数据不是错误,不用 warning 色

empty-state--minimal

极简空态|Empty State|同一份 props(title / description / icon / action)

empty-state--neumorphic

拟态空态|Empty State|同一份 props(title / description / icon / action)

input--glass-apple

玻璃输入框|Floating Label Input|标签在框上方,不做浮动标签动画

input--minimal

极简输入框|Flat Minimal Input|标签在框上方,白底 + 发丝边 + 一档软阴影

input--neumorphic

拟态输入框|Neumorphic Input|输入区是同色凹槽:左上暗、右下亮两条 inset 阴影

menu--glass-apple

玻璃菜单|Menu Button (APG)|触发器 aria-haspopup=menu + aria-expanded + aria-controls;菜单 role=menu,项 role=menuitem

menu--minimal

极简菜单|Menu Button (APG)|同一份 props(label / items / placement)

menu--neumorphic

拟态菜单|Menu Button (APG)|同一份 props(label / items / placement)

modal--glass-apple

玻璃模态|Sheet / Modal Dialog (APG)|role=dialog + aria-modal + aria-labelledby

modal--minimal

极简模态|Flat Minimal Dialog (APG)|role=dialog + aria-modal + aria-labelledby

modal--neumorphic

拟态模态|Neumorphic Dialog (APG)|role=dialog + aria-modal + aria-labelledby

motion--island-ios

灵动岛形变|Dynamic Island Morph|紧凑⇄展开两态之间做弹簧插值(阻尼比 ≈0.78)

motion--spring-ios

弹簧曲线|Spring Timing Explorer|基准参数:response 0.5s、dampingFraction 0.825

motion--text-decode

文字解码|Text Decode / Scramble|字符逐个替换成随机字符再落回

nav--glass-apple

玻璃导航|Top Navigation Bar|固定顶栏 + 背景模糊,滚动不跟随

nav--minimal

极简导航|Flat Top Navigation|白底 + 发丝边外壳,圆角收到 --radius-md

nav--neumorphic

拟态导航|Neumorphic Top Navigation|外壳同色浮起(一组外双阴影),无边框无模糊

otp--glass-apple

玻璃验证码输入|One-Time Code Input|一个真输入框 + 画的格子:逐格 input 会打断 autocomplete=one-time-code 自动填充

otp--minimal

极简验证码输入|One-Time Code Input|同一份行为与语义(单输入框 + 画的格子)

otp--neumorphic

拟态验证码输入|One-Time Code Input|同一份行为与语义(单输入框 + 画的格子)

pagination--glass-apple

玻璃分页|Pagination|nav aria-label + ul/li;当前页 aria-current=page;每个页码 aria-label=第 n 页

pagination--minimal

极简分页|Pagination|同一份 props(page / pageCount / onChange)

pagination--neumorphic

拟态分页|Pagination|同一份 props(page / pageCount / onChange)

popover--glass-apple

玻璃浮层|Non-modal Popover|触发器 aria-haspopup=dialog + aria-expanded + aria-controls;浮层 role=dialog 以标题命名

popover--minimal

极简浮层|Non-modal Popover|同一份 props(trigger / title / children / placement)

popover--neumorphic

拟态浮层|Non-modal Popover|同一份 props(trigger / title / children / placement)

segmented--glass-apple

分段控件|Segmented Control (iOS)|APG radiogroup:方向键遍历 + roving tabindex

segmented--minimal

极简分段控件|Flat Segmented Control|APG radiogroup:方向键遍历 + roving tabindex

segmented--neumorphic

拟态分段控件|Neumorphic Segmented Control|APG radiogroup:方向键遍历 + roving tabindex

skeleton--glass-apple

玻璃骨架|Skeleton Screen|role=status + aria-busy,占位块全部 aria-hidden,读屏只播一句加载状态

skeleton--minimal

极简骨架|Skeleton Screen|role=status + aria-busy,占位块全部 aria-hidden,读屏只播一句加载状态

skeleton--neumorphic

拟态骨架|Skeleton Screen|role=status + aria-busy,占位块全部 aria-hidden,读屏只播一句加载状态

slider--glass-apple

玻璃滑块|UISlider|role=slider + aria-valuenow/min/max,← → 单步、PageUp/Down 十步、Home/End 到端

slider--minimal

极简滑块|Minimal Range|4px 发丝线轨道,无边框无内阴影

slider--neumorphic

拟态滑块|Neumorphic Range|轨道压入(inset 双阴影)、旋钮浮起(外双阴影),方向相反

switch--glass-apple

玻璃开关|iOS UISwitch|role=switch + aria-checked,Space / Enter 切换

switch--minimal

极简开关|Flat Minimal Switch|role=switch + aria-checked,Space / Enter 切换

switch--neumorphic

拟态开关|Neumorphic Switch|role=switch + aria-checked,Space / Enter 切换

table--glass-apple

玻璃数据表|Data Table|table + caption(视觉隐藏);表头 scope=col,首列当行头 scope=row

table--minimal

极简数据表|Data Table|同一份 props(caption / columns / rows / className)

table--neumorphic

拟态数据表|Data Table|同一份 props(caption / columns / rows / className)

tabs--glass-apple

玻璃标签页|Tabs (APG, automatic activation)|tablist / tab / tabpanel 三件套,aria-selected + aria-controls 绑定面板

tabs--minimal

极简标签页|Tabs (APG, automatic activation)|tablist / tab / tabpanel 三件套,aria-selected + aria-controls 绑定面板

tabs--neumorphic

拟态标签页|Tabs (APG, automatic activation)|tablist / tab / tabpanel 三件套,aria-selected + aria-controls 绑定面板

tags--glass-apple

玻璃标签输入|Tag Input (chips)|回车 / 逗号 / 失焦提交;粘贴逗号分隔的多个值会拆开并去重

tags--minimal

极简标签输入|Tag Input (chips)|同一份 props(value / defaultValue / onChange / max / disabled)

tags--neumorphic

拟态标签输入|Tag Input (chips)|同一份 props(value / defaultValue / onChange / max / disabled)

textarea--glass-apple

玻璃多行输入|Autosizing Textarea|label 在框上方;校验契约与单行输入一致(aria-describedby + aria-invalid + role=alert)

textarea--minimal

极简多行输入|Autosizing Textarea|白面 + 发丝边 + shadow-sm,没有模糊与 inset

textarea--neumorphic

拟态多行输入|Autosizing Textarea|同色凹槽:左上暗、右下亮两条 inset 阴影,没有边框

toast--glass-apple

玻璃通知|Toast Stack (sonner-style)|新通知在前,后排逐层缩小上移

toast--minimal

极简通知|Flat Toast Stack (sonner-style)|宽 356px,牌堆每层缩 5%、抬 14px

toast--neumorphic

拟态通知|Neumorphic Toast Stack (sonner-style)|宽 356px,牌堆每层缩 5%、抬 14px

tooltip--glass-apple

玻璃提示|Tooltip (WCAG 1.4.13)|悬停等 --dwell-tooltip(350ms)才出,键盘聚焦立即出;移出 / 失焦 / Esc 立即关

tooltip--minimal

极简提示|Tooltip (WCAG 1.4.13)|同一份 props(content / children / placement)

tooltip--neumorphic

拟态提示|Tooltip (WCAG 1.4.13)|同一份 props(content / children / placement)

upload--glass-apple

玻璃上传|Dropzone|三个入口:拖放、点选择文件、键盘聚焦按钮后 Enter 打开选择器

upload--minimal

极简上传|Dropzone|同一份 props(accept / multiple / maxSizeMb / files / onChange)

upload--neumorphic

拟态上传|Dropzone|同一份 props(accept / multiple / maxSizeMb / files / onChange)

全部条目由 scripts/gen-export.mjs 从 registry / terminology / reuse / global.css 派生; npm run check:export 是第十一道闸——手改 public/r/ 会红, 条目引用了 token 区里没有的变量也会红。