@xwink/ui

开始使用

安装

本 monorepo 通过 workspace 直连@xwink/ui: workspace:*),改组件后 HMR 即时生效。仓外项目从私有 CNB 制品库安装同一个包名,并固定到经过远端矩阵验收的精确 beta 版本。

json
// apps/* 的 package.json
{ "dependencies": { "@xwink/ui": "workspace:*" } }

三件套接入

@xwink/ui 在 workspace 与 tgz 中都是源码依赖.vue / .ts 由宿主编译。宿主要做的是一个模块(组件编译 + X* 全局注册)+ 两段 CSS(token 生效 + 原子类生成):

1. @xwink/ui/nuxt 模块

modules 里加 '@xwink/ui/nuxt',模块自动完成两件事:

  • X 组件全局注册*:模板直接写 <XButton> / <XTable>,无需逐文件 import——漏 import 会让 Vue 把组件当原生自定义元素渲染成小写空壳(如 <xinput>),全局注册后这类静默故障从机制上消失;
  • build.transpile 自动补上:源码 SFC 不能进 esbuild 的依赖预构建(不认 .vue 直接炸),模块替你交给主构建管道。
ts
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@xwink/ui/nuxt'],
})

模块不接管 tokens.csstailwind.css 的导入顺序(见下两节)——宿主要按「import 之后覆写品牌色」的顺序控制,模块注入会失去这层可控性。

2. tokens.css import

组件只消费 --ui-* 语义 token,默认值集中在包的 tokens.css。默认已经使用 xwink.fun 的琥珀铜品牌;宿主只有在确有独立品牌时才在 app 级入口覆写(写在 import 之后,靠顺序取胜,不用 !important):

css
/* app/assets/css/main.css */
@import 'tailwindcss';
@import '@xwink/ui/tokens.css';
@import '@xwink/ui/tailwind.css';

/* 独立品牌宿主才覆写主题色与次级色;强调渐变由两者自动生成 */
:root {
  --ui-primary: #059669;
  --ui-primary-fg: #ffffff;
  --ui-secondary: #047857;
  --ui-secondary-fg: #ffffff;
}

3. tailwind.css 扫描包源码

组件样式是 Tailwind 原子类。@xwink/ui/tailwind.css 内部以 @source "./" 扫描包源码;路径相对包自身解析,因此 workspace 和 tgz 无需两套宿主路径:

css
@import '@xwink/ui/tailwind.css';

深色模式

组件库通过 token 适配明暗,组件代码零分支:html 上的 data-theme="dark" 启用深色档(tokens.css 的 [data-theme="dark"] 块)。

Nuxt 宿主启用 @xwink/ui/nuxt 后不用自己写这个属性:模块按全站共享的主题 Cookie 定档(默认跟随系统),首帧、SSR 与切换都已接好,详见 useTheme。不要在 htmlAttrs 里写死档位,那会和用户偏好打架。

本站在右上角「调试面板」可实时切换四维适配(明暗 / 尺寸 / 对比度 / 主题色),所见即宿主可配置的全部维度。