@ouraihub/tokens 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OurAI Hub
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,374 @@
1
+ # @ouraihub/tokens
2
+
3
+ > 设计令牌和 Tailwind CSS 预设
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@ouraihub/tokens.svg)](https://www.npmjs.com/package/@ouraihub/tokens)
6
+ [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7
+
8
+ ## 简介
9
+
10
+ `@ouraihub/tokens` 提供统一的设计令牌(颜色、间距、字体、阴影等)和 Tailwind CSS 预设,确保所有项目使用一致的设计系统。
11
+
12
+ ### 特性
13
+
14
+ - 🎨 **统一设计** - 所有项目共享相同的设计令牌
15
+ - 🌗 **暗色主题** - 内置 light/dark 主题支持
16
+ - 🔧 **Tailwind 集成** - 开箱即用的 Tailwind 预设
17
+ - 📦 **零依赖** - 纯 CSS 变量,无运行时依赖
18
+ - ⚡ **轻量级** - < 5KB (gzipped)
19
+ - 🎯 **类型安全** - TypeScript 类型定义
20
+
21
+ ## 安装
22
+
23
+ ```bash
24
+ # npm
25
+ npm install @ouraihub/tokens
26
+
27
+ # pnpm
28
+ pnpm add @ouraihub/tokens
29
+
30
+ # yarn
31
+ yarn add @ouraihub/tokens
32
+ ```
33
+
34
+ ## 快速开始
35
+
36
+ ### 使用 CSS 变量
37
+
38
+ ```css
39
+ /* 导入设计令牌 */
40
+ @import '@ouraihub/tokens/css';
41
+
42
+ /* 使用 CSS 变量 */
43
+ .button {
44
+ background: var(--ui-primary);
45
+ color: var(--ui-text);
46
+ padding: var(--ui-spacing-md);
47
+ border-radius: var(--ui-radius-md);
48
+ box-shadow: var(--ui-shadow-sm);
49
+ }
50
+ ```
51
+
52
+ ### 使用 Tailwind 预设
53
+
54
+ ```javascript
55
+ // tailwind.config.js
56
+ import preset from '@ouraihub/tokens/preset';
57
+
58
+ export default {
59
+ presets: [preset],
60
+ content: [
61
+ './src/**/*.{html,js,ts,jsx,tsx,astro}',
62
+ ],
63
+ };
64
+ ```
65
+
66
+ 使用 Tailwind 工具类:
67
+
68
+ ```html
69
+ <button class="bg-ui-primary text-ui-text px-ui-md py-ui-sm rounded-ui-md shadow-ui-sm">
70
+ 点击我
71
+ </button>
72
+ ```
73
+
74
+ ## 设计令牌
75
+
76
+ ### 颜色系统
77
+
78
+ ```css
79
+ :root {
80
+ /* 文本颜色 */
81
+ --ui-text: #1a1a1a;
82
+ --ui-text-secondary: #666666;
83
+ --ui-text-muted: #999999;
84
+
85
+ /* 背景颜色 */
86
+ --ui-background: #ffffff;
87
+ --ui-background-secondary: #f5f5f5;
88
+ --ui-background-tertiary: #e5e5e5;
89
+
90
+ /* 边框颜色 */
91
+ --ui-border: #e0e0e0;
92
+ --ui-border-hover: #cccccc;
93
+
94
+ /* 品牌颜色 */
95
+ --ui-primary: #2937f0;
96
+ --ui-primary-hover: #1e28c0;
97
+
98
+ /* 语义颜色 */
99
+ --ui-success: #10b981;
100
+ --ui-warning: #f59e0b;
101
+ --ui-error: #ef4444;
102
+ --ui-info: #3b82f6;
103
+ }
104
+
105
+ [data-theme="dark"] {
106
+ --ui-text: #e5e5e5;
107
+ --ui-text-secondary: #a3a3a3;
108
+ --ui-text-muted: #737373;
109
+
110
+ --ui-background: #1a1a1a;
111
+ --ui-background-secondary: #262626;
112
+ --ui-background-tertiary: #404040;
113
+
114
+ --ui-border: #404040;
115
+ --ui-border-hover: #525252;
116
+
117
+ --ui-primary: #4f5ff5;
118
+ --ui-primary-hover: #6b7aff;
119
+ }
120
+ ```
121
+
122
+ ### 间距系统
123
+
124
+ ```css
125
+ :root {
126
+ --ui-spacing-xs: 4px;
127
+ --ui-spacing-sm: 8px;
128
+ --ui-spacing-md: 16px;
129
+ --ui-spacing-lg: 24px;
130
+ --ui-spacing-xl: 32px;
131
+ --ui-spacing-2xl: 48px;
132
+ --ui-spacing-3xl: 64px;
133
+ }
134
+ ```
135
+
136
+ ### 字体系统
137
+
138
+ ```css
139
+ :root {
140
+ /* 字体族 */
141
+ --ui-font-sans: system-ui, -apple-system, sans-serif;
142
+ --ui-font-mono: 'Fira Code', 'Consolas', monospace;
143
+
144
+ /* 字体大小 */
145
+ --ui-text-xs: 0.75rem; /* 12px */
146
+ --ui-text-sm: 0.875rem; /* 14px */
147
+ --ui-text-base: 1rem; /* 16px */
148
+ --ui-text-lg: 1.125rem; /* 18px */
149
+ --ui-text-xl: 1.25rem; /* 20px */
150
+ --ui-text-2xl: 1.5rem; /* 24px */
151
+ --ui-text-3xl: 1.875rem; /* 30px */
152
+ --ui-text-4xl: 2.25rem; /* 36px */
153
+
154
+ /* 字重 */
155
+ --ui-font-normal: 400;
156
+ --ui-font-medium: 500;
157
+ --ui-font-semibold: 600;
158
+ --ui-font-bold: 700;
159
+
160
+ /* 行高 */
161
+ --ui-leading-tight: 1.25;
162
+ --ui-leading-normal: 1.5;
163
+ --ui-leading-relaxed: 1.75;
164
+ }
165
+ ```
166
+
167
+ ### 圆角系统
168
+
169
+ ```css
170
+ :root {
171
+ --ui-radius-sm: 4px;
172
+ --ui-radius-md: 6px;
173
+ --ui-radius-lg: 8px;
174
+ --ui-radius-xl: 12px;
175
+ --ui-radius-2xl: 16px;
176
+ --ui-radius-full: 9999px;
177
+ }
178
+ ```
179
+
180
+ ### 阴影系统
181
+
182
+ ```css
183
+ :root {
184
+ --ui-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
185
+ --ui-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
186
+ --ui-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
187
+ --ui-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15);
188
+ }
189
+
190
+ [data-theme="dark"] {
191
+ --ui-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
192
+ --ui-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
193
+ --ui-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.5);
194
+ --ui-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.6);
195
+ }
196
+ ```
197
+
198
+ ## Tailwind 预设
199
+
200
+ 预设包含所有设计令牌的 Tailwind 工具类:
201
+
202
+ ### 颜色工具类
203
+
204
+ ```html
205
+ <!-- 文本颜色 -->
206
+ <p class="text-ui-text">主要文本</p>
207
+ <p class="text-ui-text-secondary">次要文本</p>
208
+ <p class="text-ui-text-muted">弱化文本</p>
209
+
210
+ <!-- 背景颜色 -->
211
+ <div class="bg-ui-background">主背景</div>
212
+ <div class="bg-ui-background-secondary">次背景</div>
213
+
214
+ <!-- 品牌颜色 -->
215
+ <button class="bg-ui-primary hover:bg-ui-primary-hover">按钮</button>
216
+
217
+ <!-- 语义颜色 -->
218
+ <div class="text-ui-success">成功</div>
219
+ <div class="text-ui-error">错误</div>
220
+ ```
221
+
222
+ ### 间距工具类
223
+
224
+ ```html
225
+ <!-- Padding -->
226
+ <div class="p-ui-md">16px padding</div>
227
+ <div class="px-ui-lg py-ui-sm">24px 水平, 8px 垂直</div>
228
+
229
+ <!-- Margin -->
230
+ <div class="m-ui-xl">32px margin</div>
231
+ <div class="mt-ui-2xl mb-ui-lg">48px 上, 24px 下</div>
232
+
233
+ <!-- Gap -->
234
+ <div class="flex gap-ui-md">16px gap</div>
235
+ ```
236
+
237
+ ### 圆角工具类
238
+
239
+ ```html
240
+ <div class="rounded-ui-sm">4px 圆角</div>
241
+ <div class="rounded-ui-md">6px 圆角</div>
242
+ <div class="rounded-ui-lg">8px 圆角</div>
243
+ <button class="rounded-ui-full">完全圆角</button>
244
+ ```
245
+
246
+ ### 阴影工具类
247
+
248
+ ```html
249
+ <div class="shadow-ui-sm">小阴影</div>
250
+ <div class="shadow-ui-md">中阴影</div>
251
+ <div class="shadow-ui-lg">大阴影</div>
252
+ ```
253
+
254
+ ## TypeScript 支持
255
+
256
+ ```typescript
257
+ import { tokens } from '@ouraihub/tokens';
258
+
259
+ // 访问设计令牌
260
+ console.log(tokens.colors.primary);
261
+ console.log(tokens.spacing.md);
262
+ console.log(tokens.radius.md);
263
+ ```
264
+
265
+ 类型定义:
266
+
267
+ ```typescript
268
+ interface DesignTokens {
269
+ colors: {
270
+ text: string;
271
+ textSecondary: string;
272
+ background: string;
273
+ primary: string;
274
+ // ...
275
+ };
276
+ spacing: {
277
+ xs: string;
278
+ sm: string;
279
+ md: string;
280
+ // ...
281
+ };
282
+ radius: {
283
+ sm: string;
284
+ md: string;
285
+ lg: string;
286
+ // ...
287
+ };
288
+ // ...
289
+ }
290
+ ```
291
+
292
+ ## 自定义主题
293
+
294
+ ### 覆盖 CSS 变量
295
+
296
+ ```css
297
+ /* 自定义品牌颜色 */
298
+ :root {
299
+ --ui-primary: #ff6b6b;
300
+ --ui-primary-hover: #ff5252;
301
+ }
302
+
303
+ /* 自定义暗色主题 */
304
+ [data-theme="dark"] {
305
+ --ui-background: #0a0a0a;
306
+ --ui-text: #f0f0f0;
307
+ }
308
+ ```
309
+
310
+ ### 扩展 Tailwind 预设
311
+
312
+ ```javascript
313
+ // tailwind.config.js
314
+ import preset from '@ouraihub/tokens/preset';
315
+
316
+ export default {
317
+ presets: [preset],
318
+ theme: {
319
+ extend: {
320
+ colors: {
321
+ brand: '#ff6b6b',
322
+ },
323
+ },
324
+ },
325
+ };
326
+ ```
327
+
328
+ ## 使用场景
329
+
330
+ ### Hugo 主题
331
+
332
+ ```html
333
+ <!-- layouts/_default/baseof.html -->
334
+ <head>
335
+ <link rel="stylesheet" href="/css/tokens.css">
336
+ </head>
337
+
338
+ <body data-theme="light">
339
+ <div class="bg-ui-background text-ui-text">
340
+ <!-- 内容 -->
341
+ </div>
342
+ </body>
343
+ ```
344
+
345
+ ### Astro 项目
346
+
347
+ ```astro
348
+ ---
349
+ // src/layouts/Layout.astro
350
+ import '@ouraihub/tokens/css';
351
+ ---
352
+
353
+ <html data-theme="light">
354
+ <body class="bg-ui-background text-ui-text">
355
+ <slot />
356
+ </body>
357
+ </html>
358
+ ```
359
+
360
+ ## 相关包
361
+
362
+ - [@ouraihub/core](../core) - 核心逻辑层
363
+ - [@ouraihub/hugo](../hugo) - Hugo 组件包装
364
+ - [@ouraihub/utils](../utils) - 工具函数库
365
+
366
+ ## 文档
367
+
368
+ - [完整文档](../../docs/README.md)
369
+ - [设计系统](../../docs/DESIGN.md)
370
+ - [架构决策](../../docs/decisions/003-css-variables-over-css-in-js.md)
371
+
372
+ ## 许可证
373
+
374
+ MIT
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@ouraihub/tokens",
3
+ "version": "0.1.0",
4
+ "description": "Design tokens and Tailwind CSS preset for @ouraihub/ui-library",
5
+ "type": "module",
6
+ "main": "./src/index.js",
7
+ "exports": {
8
+ ".": "./src/index.js",
9
+ "./preset": "./src/preset.js",
10
+ "./css": "./src/tokens.css"
11
+ },
12
+ "files": [
13
+ "src"
14
+ ],
15
+ "peerDependencies": {
16
+ "tailwindcss": "^4.0.0"
17
+ },
18
+ "keywords": [
19
+ "design-tokens",
20
+ "tailwind",
21
+ "css-variables",
22
+ "theme"
23
+ ],
24
+ "author": "OurAI Hub",
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/ouraihub/ui-library.git",
29
+ "directory": "packages/tokens"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ }
34
+ }
@@ -0,0 +1,131 @@
1
+ /* ============================================================================
2
+ 动画令牌 - 动画和过渡效果定义
3
+ ============================================================================ */
4
+
5
+ /* 动画时长变量 */
6
+ :root {
7
+ --ui-duration-fast: 150ms;
8
+ --ui-duration-normal: 300ms;
9
+ --ui-duration-slow: 500ms;
10
+ }
11
+
12
+ /* 缓动函数变量 */
13
+ :root {
14
+ --ui-easing-default: cubic-bezier(0.4, 0, 0.2, 1);
15
+ --ui-easing-in: cubic-bezier(0.4, 0, 1, 1);
16
+ --ui-easing-out: cubic-bezier(0, 0, 0.2, 1);
17
+ --ui-easing-in-out: cubic-bezier(0.4, 0, 0.2, 1);
18
+ }
19
+
20
+ /* ============================================================================
21
+ @keyframes 动画定义
22
+ ============================================================================ */
23
+
24
+ /* 淡入动画 */
25
+ @keyframes fadeIn {
26
+ from {
27
+ opacity: 0;
28
+ }
29
+ to {
30
+ opacity: 1;
31
+ }
32
+ }
33
+
34
+ /* 淡出动画 */
35
+ @keyframes fadeOut {
36
+ from {
37
+ opacity: 1;
38
+ }
39
+ to {
40
+ opacity: 0;
41
+ }
42
+ }
43
+
44
+ /* 从下滑入 */
45
+ @keyframes slideInUp {
46
+ from {
47
+ opacity: 0;
48
+ transform: translateY(16px);
49
+ }
50
+ to {
51
+ opacity: 1;
52
+ transform: translateY(0);
53
+ }
54
+ }
55
+
56
+ /* 从上滑入 */
57
+ @keyframes slideInDown {
58
+ from {
59
+ opacity: 0;
60
+ transform: translateY(-16px);
61
+ }
62
+ to {
63
+ opacity: 1;
64
+ transform: translateY(0);
65
+ }
66
+ }
67
+
68
+ /* 从左滑入 */
69
+ @keyframes slideInLeft {
70
+ from {
71
+ opacity: 0;
72
+ transform: translateX(-16px);
73
+ }
74
+ to {
75
+ opacity: 1;
76
+ transform: translateX(0);
77
+ }
78
+ }
79
+
80
+ /* 从右滑入 */
81
+ @keyframes slideInRight {
82
+ from {
83
+ opacity: 0;
84
+ transform: translateX(16px);
85
+ }
86
+ to {
87
+ opacity: 1;
88
+ transform: translateX(0);
89
+ }
90
+ }
91
+
92
+ /* 缩放进入 */
93
+ @keyframes scaleIn {
94
+ from {
95
+ opacity: 0;
96
+ transform: scale(0.95);
97
+ }
98
+ to {
99
+ opacity: 1;
100
+ transform: scale(1);
101
+ }
102
+ }
103
+
104
+ /* 旋转动画(用于 loading) */
105
+ @keyframes spin {
106
+ from {
107
+ transform: rotate(0deg);
108
+ }
109
+ to {
110
+ transform: rotate(360deg);
111
+ }
112
+ }
113
+
114
+ /* ============================================================================
115
+ 动画工具类
116
+ ============================================================================ */
117
+
118
+ /* 淡入动画类 */
119
+ .animate-fade-in {
120
+ animation: fadeIn var(--ui-duration-normal) var(--ui-easing-default) forwards;
121
+ }
122
+
123
+ /* 从下滑入动画类 */
124
+ .animate-slide-in-up {
125
+ animation: slideInUp var(--ui-duration-normal) var(--ui-easing-default) forwards;
126
+ }
127
+
128
+ /* 旋转加载动画类 */
129
+ .animate-spin {
130
+ animation: spin var(--ui-duration-slow) linear infinite;
131
+ }
package/src/index.css ADDED
@@ -0,0 +1,7 @@
1
+ /* ============================================================================
2
+ 统一导入 - 所有设计令牌和工具类
3
+ ============================================================================ */
4
+
5
+ @import './tokens.css';
6
+ @import './animations.css';
7
+ @import './utilities.css';
package/src/index.js ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @ouraihub/tokens - 统一导出
3
+ *
4
+ * 导出 Tailwind CSS 预设和 CSS 文件路径
5
+ */
6
+
7
+ import preset from './preset.js';
8
+
9
+ export { preset };
10
+ export default preset;
package/src/preset.js ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Tailwind CSS Preset
3
+ *
4
+ * 集成所有设计令牌到 Tailwind CSS 配置中
5
+ * 使用 CSS 变量实现主题切换(light/dark)
6
+ *
7
+ * 使用方式:
8
+ * export default {
9
+ * presets: [require('@ouraihub/tokens/preset')],
10
+ * content: ['./src/**\/*.{html,js,ts,jsx,tsx}'],
11
+ * }
12
+ */
13
+
14
+ export default {
15
+ theme: {
16
+ extend: {
17
+ /* ====================================================================
18
+ Colors - 使用 CSS 变量实现主题切换
19
+ ==================================================================== */
20
+ colors: {
21
+ // Primary
22
+ primary: 'var(--ui-primary)',
23
+ 'primary-light': 'var(--ui-primary-light)',
24
+ 'primary-dark': 'var(--ui-primary-dark)',
25
+
26
+ // Secondary
27
+ secondary: 'var(--ui-secondary)',
28
+ 'secondary-light': 'var(--ui-secondary-light)',
29
+ 'secondary-dark': 'var(--ui-secondary-dark)',
30
+
31
+ // Accent
32
+ accent: 'var(--ui-accent)',
33
+ 'accent-light': 'var(--ui-accent-light)',
34
+ 'accent-dark': 'var(--ui-accent-dark)',
35
+
36
+ // Neutral
37
+ background: 'var(--ui-background)',
38
+ surface: 'var(--ui-surface)',
39
+ border: 'var(--ui-border)',
40
+
41
+ // Text
42
+ text: 'var(--ui-text)',
43
+ 'text-secondary': 'var(--ui-text-secondary)',
44
+ 'text-muted': 'var(--ui-text-muted)',
45
+
46
+ // Semantic
47
+ success: 'var(--ui-success)',
48
+ 'success-light': 'var(--ui-success-light)',
49
+ warning: 'var(--ui-warning)',
50
+ 'warning-light': 'var(--ui-warning-light)',
51
+ error: 'var(--ui-error)',
52
+ 'error-light': 'var(--ui-error-light)',
53
+ info: 'var(--ui-info)',
54
+ 'info-light': 'var(--ui-info-light)',
55
+ },
56
+
57
+ /* ====================================================================
58
+ Spacing - 4px Grid System
59
+ ==================================================================== */
60
+ spacing: {
61
+ 0: 'var(--ui-space-0)',
62
+ 1: 'var(--ui-space-1)',
63
+ 2: 'var(--ui-space-2)',
64
+ 3: 'var(--ui-space-3)',
65
+ 4: 'var(--ui-space-4)',
66
+ 5: 'var(--ui-space-5)',
67
+ 6: 'var(--ui-space-6)',
68
+ 8: 'var(--ui-space-8)',
69
+ 10: 'var(--ui-space-10)',
70
+ 12: 'var(--ui-space-12)',
71
+ 16: 'var(--ui-space-16)',
72
+ 20: 'var(--ui-space-20)',
73
+ 24: 'var(--ui-space-24)',
74
+ 32: 'var(--ui-space-32)',
75
+ 40: 'var(--ui-space-40)',
76
+ 48: 'var(--ui-space-48)',
77
+ 64: 'var(--ui-space-64)',
78
+ },
79
+
80
+ /* ====================================================================
81
+ Font Sizes
82
+ ==================================================================== */
83
+ fontSize: {
84
+ xs: 'var(--ui-text-xs)',
85
+ sm: 'var(--ui-text-sm)',
86
+ base: 'var(--ui-text-base)',
87
+ lg: 'var(--ui-text-lg)',
88
+ xl: 'var(--ui-text-xl)',
89
+ '2xl': 'var(--ui-text-2xl)',
90
+ '3xl': 'var(--ui-text-3xl)',
91
+ '4xl': 'var(--ui-text-4xl)',
92
+ '5xl': 'var(--ui-text-5xl)',
93
+ },
94
+
95
+ /* ====================================================================
96
+ Font Weights
97
+ ==================================================================== */
98
+ fontWeight: {
99
+ normal: 'var(--ui-font-weight-normal)',
100
+ medium: 'var(--ui-font-weight-medium)',
101
+ semibold: 'var(--ui-font-weight-semibold)',
102
+ bold: 'var(--ui-font-weight-bold)',
103
+ },
104
+
105
+ /* ====================================================================
106
+ Border Radius
107
+ ==================================================================== */
108
+ borderRadius: {
109
+ sm: 'var(--ui-radius-sm)',
110
+ md: 'var(--ui-radius-md)',
111
+ lg: 'var(--ui-radius-lg)',
112
+ xl: 'var(--ui-radius-xl)',
113
+ full: 'var(--ui-radius-full)',
114
+ },
115
+
116
+ /* ====================================================================
117
+ Box Shadows
118
+ ==================================================================== */
119
+ boxShadow: {
120
+ sm: 'var(--ui-shadow-sm)',
121
+ md: 'var(--ui-shadow-md)',
122
+ lg: 'var(--ui-shadow-lg)',
123
+ xl: 'var(--ui-shadow-xl)',
124
+ },
125
+
126
+ /* ====================================================================
127
+ Font Families
128
+ ==================================================================== */
129
+ fontFamily: {
130
+ sans: 'var(--ui-font-sans)',
131
+ mono: 'var(--ui-font-mono)',
132
+ },
133
+
134
+ /* ====================================================================
135
+ Transition Duration
136
+ ==================================================================== */
137
+ transitionDuration: {
138
+ fast: 'var(--ui-transition-fast)',
139
+ base: 'var(--ui-transition-base)',
140
+ slow: 'var(--ui-transition-slow)',
141
+ },
142
+
143
+ /* ====================================================================
144
+ Line Height
145
+ ==================================================================== */
146
+ lineHeight: {
147
+ tight: 'var(--ui-line-height-tight)',
148
+ normal: 'var(--ui-line-height-normal)',
149
+ relaxed: 'var(--ui-line-height-relaxed)',
150
+ },
151
+ },
152
+ },
153
+
154
+ /* ======================================================================
155
+ Plugins - 预留位置,可在此添加自定义插件
156
+ ====================================================================== */
157
+ plugins: [],
158
+ };
package/src/tokens.css ADDED
@@ -0,0 +1,183 @@
1
+ /* ============================================================================
2
+ Design Tokens - CSS Custom Properties
3
+ ============================================================================ */
4
+
5
+ /* Light Theme (Default) */
6
+ :root {
7
+ /* ========================================================================
8
+ Color System - Light Theme
9
+ ======================================================================== */
10
+
11
+ /* Primary Colors */
12
+ --ui-primary: hsl(221, 83%, 53%);
13
+ --ui-primary-light: hsl(221, 83%, 97%);
14
+ --ui-primary-dark: hsl(221, 83%, 20%);
15
+
16
+ /* Secondary Colors */
17
+ --ui-secondary: hsl(160, 84%, 39%);
18
+ --ui-secondary-light: hsl(160, 84%, 97%);
19
+ --ui-secondary-dark: hsl(160, 84%, 20%);
20
+
21
+ /* Accent Colors */
22
+ --ui-accent: hsl(262, 80%, 50%);
23
+ --ui-accent-light: hsl(262, 80%, 97%);
24
+ --ui-accent-dark: hsl(262, 80%, 20%);
25
+
26
+ /* Neutral Colors */
27
+ --ui-background: hsl(0, 0%, 100%);
28
+ --ui-surface: hsl(0, 0%, 98%);
29
+ --ui-border: hsl(0, 0%, 90%);
30
+
31
+ /* Text Colors */
32
+ --ui-text: hsl(0, 0%, 13%);
33
+ --ui-text-secondary: hsl(0, 0%, 45%);
34
+ --ui-text-muted: hsl(0, 0%, 65%);
35
+
36
+ /* Semantic Colors */
37
+ --ui-success: hsl(142, 76%, 36%);
38
+ --ui-success-light: hsl(142, 76%, 97%);
39
+ --ui-warning: hsl(38, 92%, 50%);
40
+ --ui-warning-light: hsl(38, 92%, 97%);
41
+ --ui-error: hsl(0, 84%, 60%);
42
+ --ui-error-light: hsl(0, 84%, 97%);
43
+ --ui-info: hsl(199, 89%, 48%);
44
+ --ui-info-light: hsl(199, 89%, 97%);
45
+
46
+ /* ========================================================================
47
+ Spacing System - 4px Grid
48
+ ======================================================================== */
49
+
50
+ --ui-space-0: 0;
51
+ --ui-space-1: 0.25rem; /* 4px */
52
+ --ui-space-2: 0.5rem; /* 8px */
53
+ --ui-space-3: 0.75rem; /* 12px */
54
+ --ui-space-4: 1rem; /* 16px */
55
+ --ui-space-5: 1.25rem; /* 20px */
56
+ --ui-space-6: 1.5rem; /* 24px */
57
+ --ui-space-8: 2rem; /* 32px */
58
+ --ui-space-10: 2.5rem; /* 40px */
59
+ --ui-space-12: 3rem; /* 48px */
60
+ --ui-space-16: 4rem; /* 64px */
61
+ --ui-space-20: 5rem; /* 80px */
62
+ --ui-space-24: 6rem; /* 96px */
63
+ --ui-space-32: 8rem; /* 128px */
64
+ --ui-space-40: 10rem; /* 160px */
65
+ --ui-space-48: 12rem; /* 192px */
66
+ --ui-space-64: 16rem; /* 256px */
67
+
68
+ /* ========================================================================
69
+ Typography System
70
+ ======================================================================== */
71
+
72
+ /* Font Families */
73
+ --ui-font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
74
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
75
+ sans-serif;
76
+ --ui-font-mono: 'Menlo', 'Monaco', 'Courier New', monospace;
77
+
78
+ /* Font Sizes */
79
+ --ui-text-xs: 0.75rem; /* 12px */
80
+ --ui-text-sm: 0.875rem; /* 14px */
81
+ --ui-text-base: 1rem; /* 16px */
82
+ --ui-text-lg: 1.125rem; /* 18px */
83
+ --ui-text-xl: 1.25rem; /* 20px */
84
+ --ui-text-2xl: 1.5rem; /* 24px */
85
+ --ui-text-3xl: 1.875rem; /* 30px */
86
+ --ui-text-4xl: 2.25rem; /* 36px */
87
+ --ui-text-5xl: 3rem; /* 48px */
88
+
89
+ /* Font Weights */
90
+ --ui-font-weight-normal: 400;
91
+ --ui-font-weight-medium: 500;
92
+ --ui-font-weight-semibold: 600;
93
+ --ui-font-weight-bold: 700;
94
+
95
+ /* Line Heights */
96
+ --ui-line-height-tight: 1.25;
97
+ --ui-line-height-normal: 1.5;
98
+ --ui-line-height-relaxed: 1.75;
99
+
100
+ /* ========================================================================
101
+ Border Radius
102
+ ======================================================================== */
103
+
104
+ --ui-radius-sm: 0.25rem; /* 4px */
105
+ --ui-radius-md: 0.5rem; /* 8px */
106
+ --ui-radius-lg: 0.75rem; /* 12px */
107
+ --ui-radius-xl: 1rem; /* 16px */
108
+ --ui-radius-full: 9999px;
109
+
110
+ /* ========================================================================
111
+ Shadows
112
+ ======================================================================== */
113
+
114
+ --ui-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
115
+ --ui-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
116
+ 0 2px 4px -1px rgba(0, 0, 0, 0.06);
117
+ --ui-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1),
118
+ 0 4px 6px -2px rgba(0, 0, 0, 0.05);
119
+ --ui-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1),
120
+ 0 10px 10px -5px rgba(0, 0, 0, 0.04);
121
+
122
+ /* ========================================================================
123
+ Transitions
124
+ ======================================================================== */
125
+
126
+ --ui-transition-fast: 150ms ease-in-out;
127
+ --ui-transition-base: 200ms ease-in-out;
128
+ --ui-transition-slow: 300ms ease-in-out;
129
+ }
130
+
131
+ /* ============================================================================
132
+ Dark Theme
133
+ ============================================================================ */
134
+
135
+ [data-theme="dark"] {
136
+ /* ========================================================================
137
+ Color System - Dark Theme
138
+ ======================================================================== */
139
+
140
+ /* Primary Colors */
141
+ --ui-primary: hsl(221, 83%, 65%);
142
+ --ui-primary-light: hsl(221, 83%, 30%);
143
+ --ui-primary-dark: hsl(221, 83%, 90%);
144
+
145
+ /* Secondary Colors */
146
+ --ui-secondary: hsl(160, 84%, 55%);
147
+ --ui-secondary-light: hsl(160, 84%, 25%);
148
+ --ui-secondary-dark: hsl(160, 84%, 90%);
149
+
150
+ /* Accent Colors */
151
+ --ui-accent: hsl(262, 80%, 65%);
152
+ --ui-accent-light: hsl(262, 80%, 30%);
153
+ --ui-accent-dark: hsl(262, 80%, 90%);
154
+
155
+ /* Neutral Colors */
156
+ --ui-background: hsl(0, 0%, 13%);
157
+ --ui-surface: hsl(0, 0%, 18%);
158
+ --ui-border: hsl(0, 0%, 25%);
159
+
160
+ /* Text Colors */
161
+ --ui-text: hsl(0, 0%, 98%);
162
+ --ui-text-secondary: hsl(0, 0%, 75%);
163
+ --ui-text-muted: hsl(0, 0%, 55%);
164
+
165
+ /* Semantic Colors */
166
+ --ui-success: hsl(142, 76%, 55%);
167
+ --ui-success-light: hsl(142, 76%, 25%);
168
+ --ui-warning: hsl(38, 92%, 60%);
169
+ --ui-warning-light: hsl(38, 92%, 25%);
170
+ --ui-error: hsl(0, 84%, 70%);
171
+ --ui-error-light: hsl(0, 84%, 25%);
172
+ --ui-info: hsl(199, 89%, 60%);
173
+ --ui-info-light: hsl(199, 89%, 25%);
174
+
175
+ /* Shadows - Adjusted for dark theme */
176
+ --ui-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
177
+ --ui-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4),
178
+ 0 2px 4px -1px rgba(0, 0, 0, 0.3);
179
+ --ui-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4),
180
+ 0 4px 6px -2px rgba(0, 0, 0, 0.3);
181
+ --ui-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.4),
182
+ 0 10px 10px -5px rgba(0, 0, 0, 0.3);
183
+ }
@@ -0,0 +1,388 @@
1
+ /* ============================================================================
2
+ 工具类 - 常用布局、间距、文本工具类
3
+ ============================================================================ */
4
+
5
+ /* ============================================================================
6
+ 布局工具类
7
+ ============================================================================ */
8
+
9
+ /* 容器 - 最大宽度 + 水平 padding */
10
+ .container {
11
+ max-width: 1200px;
12
+ margin-left: auto;
13
+ margin-right: auto;
14
+ padding-left: var(--ui-space-4);
15
+ padding-right: var(--ui-space-4);
16
+ }
17
+
18
+ /* Flexbox 基础 */
19
+ .flex {
20
+ display: flex;
21
+ }
22
+
23
+ .flex-col {
24
+ display: flex;
25
+ flex-direction: column;
26
+ }
27
+
28
+ .flex-row {
29
+ display: flex;
30
+ flex-direction: row;
31
+ }
32
+
33
+ /* align-items 工具类 */
34
+ .items-center {
35
+ align-items: center;
36
+ }
37
+
38
+ .items-start {
39
+ align-items: flex-start;
40
+ }
41
+
42
+ .items-end {
43
+ align-items: flex-end;
44
+ }
45
+
46
+ /* justify-content 工具类 */
47
+ .justify-center {
48
+ justify-content: center;
49
+ }
50
+
51
+ .justify-between {
52
+ justify-content: space-between;
53
+ }
54
+
55
+ .justify-end {
56
+ justify-content: flex-end;
57
+ }
58
+
59
+ /* gap 工具类 */
60
+ .gap-1 {
61
+ gap: var(--ui-space-1);
62
+ }
63
+
64
+ .gap-2 {
65
+ gap: var(--ui-space-2);
66
+ }
67
+
68
+ .gap-3 {
69
+ gap: var(--ui-space-3);
70
+ }
71
+
72
+ .gap-4 {
73
+ gap: var(--ui-space-4);
74
+ }
75
+
76
+ .gap-5 {
77
+ gap: var(--ui-space-5);
78
+ }
79
+
80
+ .gap-6 {
81
+ gap: var(--ui-space-6);
82
+ }
83
+
84
+ .gap-8 {
85
+ gap: var(--ui-space-8);
86
+ }
87
+
88
+ /* ============================================================================
89
+ 间距工具类 - Padding
90
+ ============================================================================ */
91
+
92
+ /* 全向 padding */
93
+ .p-1 {
94
+ padding: var(--ui-space-1);
95
+ }
96
+
97
+ .p-2 {
98
+ padding: var(--ui-space-2);
99
+ }
100
+
101
+ .p-3 {
102
+ padding: var(--ui-space-3);
103
+ }
104
+
105
+ .p-4 {
106
+ padding: var(--ui-space-4);
107
+ }
108
+
109
+ .p-5 {
110
+ padding: var(--ui-space-5);
111
+ }
112
+
113
+ .p-6 {
114
+ padding: var(--ui-space-6);
115
+ }
116
+
117
+ .p-8 {
118
+ padding: var(--ui-space-8);
119
+ }
120
+
121
+ /* 水平 padding */
122
+ .px-1 {
123
+ padding-left: var(--ui-space-1);
124
+ padding-right: var(--ui-space-1);
125
+ }
126
+
127
+ .px-2 {
128
+ padding-left: var(--ui-space-2);
129
+ padding-right: var(--ui-space-2);
130
+ }
131
+
132
+ .px-3 {
133
+ padding-left: var(--ui-space-3);
134
+ padding-right: var(--ui-space-3);
135
+ }
136
+
137
+ .px-4 {
138
+ padding-left: var(--ui-space-4);
139
+ padding-right: var(--ui-space-4);
140
+ }
141
+
142
+ .px-6 {
143
+ padding-left: var(--ui-space-6);
144
+ padding-right: var(--ui-space-6);
145
+ }
146
+
147
+ /* 竖直 padding */
148
+ .py-1 {
149
+ padding-top: var(--ui-space-1);
150
+ padding-bottom: var(--ui-space-1);
151
+ }
152
+
153
+ .py-2 {
154
+ padding-top: var(--ui-space-2);
155
+ padding-bottom: var(--ui-space-2);
156
+ }
157
+
158
+ .py-3 {
159
+ padding-top: var(--ui-space-3);
160
+ padding-bottom: var(--ui-space-3);
161
+ }
162
+
163
+ .py-4 {
164
+ padding-top: var(--ui-space-4);
165
+ padding-bottom: var(--ui-space-4);
166
+ }
167
+
168
+ .py-6 {
169
+ padding-top: var(--ui-space-6);
170
+ padding-bottom: var(--ui-space-6);
171
+ }
172
+
173
+ /* ============================================================================
174
+ 间距工具类 - Margin
175
+ ============================================================================ */
176
+
177
+ /* 全向 margin */
178
+ .m-1 {
179
+ margin: var(--ui-space-1);
180
+ }
181
+
182
+ .m-2 {
183
+ margin: var(--ui-space-2);
184
+ }
185
+
186
+ .m-3 {
187
+ margin: var(--ui-space-3);
188
+ }
189
+
190
+ .m-4 {
191
+ margin: var(--ui-space-4);
192
+ }
193
+
194
+ .m-6 {
195
+ margin: var(--ui-space-6);
196
+ }
197
+
198
+ /* 水平 margin */
199
+ .mx-1 {
200
+ margin-left: var(--ui-space-1);
201
+ margin-right: var(--ui-space-1);
202
+ }
203
+
204
+ .mx-2 {
205
+ margin-left: var(--ui-space-2);
206
+ margin-right: var(--ui-space-2);
207
+ }
208
+
209
+ .mx-3 {
210
+ margin-left: var(--ui-space-3);
211
+ margin-right: var(--ui-space-3);
212
+ }
213
+
214
+ .mx-4 {
215
+ margin-left: var(--ui-space-4);
216
+ margin-right: var(--ui-space-4);
217
+ }
218
+
219
+ .mx-auto {
220
+ margin-left: auto;
221
+ margin-right: auto;
222
+ }
223
+
224
+ /* 竖直 margin */
225
+ .my-1 {
226
+ margin-top: var(--ui-space-1);
227
+ margin-bottom: var(--ui-space-1);
228
+ }
229
+
230
+ .my-2 {
231
+ margin-top: var(--ui-space-2);
232
+ margin-bottom: var(--ui-space-2);
233
+ }
234
+
235
+ .my-3 {
236
+ margin-top: var(--ui-space-3);
237
+ margin-bottom: var(--ui-space-3);
238
+ }
239
+
240
+ .my-4 {
241
+ margin-top: var(--ui-space-4);
242
+ margin-bottom: var(--ui-space-4);
243
+ }
244
+
245
+ .my-6 {
246
+ margin-top: var(--ui-space-6);
247
+ margin-bottom: var(--ui-space-6);
248
+ }
249
+
250
+ /* ============================================================================
251
+ 文本工具类
252
+ ============================================================================ */
253
+
254
+ /* 字体大小 */
255
+ .text-xs {
256
+ font-size: var(--ui-text-xs);
257
+ }
258
+
259
+ .text-sm {
260
+ font-size: var(--ui-text-sm);
261
+ }
262
+
263
+ .text-base {
264
+ font-size: var(--ui-text-base);
265
+ }
266
+
267
+ .text-lg {
268
+ font-size: var(--ui-text-lg);
269
+ }
270
+
271
+ .text-xl {
272
+ font-size: var(--ui-text-xl);
273
+ }
274
+
275
+ .text-2xl {
276
+ font-size: var(--ui-text-2xl);
277
+ }
278
+
279
+ .text-3xl {
280
+ font-size: var(--ui-text-3xl);
281
+ }
282
+
283
+ .text-4xl {
284
+ font-size: var(--ui-text-4xl);
285
+ }
286
+
287
+ /* 字重 */
288
+ .font-normal {
289
+ font-weight: var(--ui-font-weight-normal);
290
+ }
291
+
292
+ .font-medium {
293
+ font-weight: var(--ui-font-weight-medium);
294
+ }
295
+
296
+ .font-semibold {
297
+ font-weight: var(--ui-font-weight-semibold);
298
+ }
299
+
300
+ .font-bold {
301
+ font-weight: var(--ui-font-weight-bold);
302
+ }
303
+
304
+ /* 文本对齐 */
305
+ .text-center {
306
+ text-align: center;
307
+ }
308
+
309
+ .text-left {
310
+ text-align: left;
311
+ }
312
+
313
+ .text-right {
314
+ text-align: right;
315
+ }
316
+
317
+ /* ============================================================================
318
+ 显示工具类
319
+ ============================================================================ */
320
+
321
+ .hidden {
322
+ display: none;
323
+ }
324
+
325
+ .block {
326
+ display: block;
327
+ }
328
+
329
+ .inline-block {
330
+ display: inline-block;
331
+ }
332
+
333
+ /* 屏幕阅读器可见 - 仅对屏幕阅读器可见 */
334
+ .sr-only {
335
+ position: absolute;
336
+ width: 1px;
337
+ height: 1px;
338
+ padding: 0;
339
+ margin: -1px;
340
+ overflow: hidden;
341
+ clip: rect(0, 0, 0, 0);
342
+ white-space: nowrap;
343
+ border-width: 0;
344
+ }
345
+
346
+ /* ============================================================================
347
+ 圆角工具类
348
+ ============================================================================ */
349
+
350
+ .rounded-sm {
351
+ border-radius: var(--ui-radius-sm);
352
+ }
353
+
354
+ .rounded-md {
355
+ border-radius: var(--ui-radius-md);
356
+ }
357
+
358
+ .rounded-lg {
359
+ border-radius: var(--ui-radius-lg);
360
+ }
361
+
362
+ .rounded-xl {
363
+ border-radius: var(--ui-radius-xl);
364
+ }
365
+
366
+ .rounded-full {
367
+ border-radius: var(--ui-radius-full);
368
+ }
369
+
370
+ /* ============================================================================
371
+ 阴影工具类
372
+ ============================================================================ */
373
+
374
+ .shadow-sm {
375
+ box-shadow: var(--ui-shadow-sm);
376
+ }
377
+
378
+ .shadow-md {
379
+ box-shadow: var(--ui-shadow-md);
380
+ }
381
+
382
+ .shadow-lg {
383
+ box-shadow: var(--ui-shadow-lg);
384
+ }
385
+
386
+ .shadow-xl {
387
+ box-shadow: var(--ui-shadow-xl);
388
+ }