sparkdesign 0.4.0 → 0.4.2

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.
Files changed (46) hide show
  1. package/cli/registry/{basic → __tests__/basic}/button.test.tsx +1 -1
  2. package/cli/registry/{chat → __tests__/chat}/markdown.test.tsx +1 -1
  3. package/cli/registry/{chat → __tests__/chat}/thinking-indicator.test.tsx +1 -1
  4. package/cli/registry/{chat → __tests__/chat}/tool-invocation-card.test.tsx +1 -1
  5. package/cli/registry/basic/shimmering-text.tsx +115 -0
  6. package/cli/registry/{chat → basic}/sidebar-menu.tsx +2 -2
  7. package/cli/registry/meta.json +1 -1
  8. package/dist/registry/basic/shimmering-text.d.ts +27 -0
  9. package/dist/scale/computed.css +103 -0
  10. package/dist/scale/config.css +110 -0
  11. package/dist/scale/index.css +30 -0
  12. package/dist/scale/presets/compact.css +30 -0
  13. package/dist/scale/presets/dense.css +64 -0
  14. package/dist/scale/presets/sharp.css +40 -0
  15. package/dist/scale/presets/soft.css +16 -0
  16. package/dist/spark-design.cjs.js +17 -17
  17. package/dist/spark-design.es.js +2198 -2146
  18. package/dist/src/components/{chat → basic}/CollapsibleCard/index.d.ts +1 -1
  19. package/dist/src/components/basic/ShimmeringText/index.d.ts +7 -0
  20. package/dist/src/components/{chat → basic}/SidebarMenu/index.d.ts +1 -1
  21. package/dist/src/components/index.d.ts +8 -6
  22. package/dist/src/lib/utils.d.ts +5 -5
  23. package/dist/theme-base.css +270 -0
  24. package/dist/themes/dark-parchment.css +133 -0
  25. package/dist/themes/dark-qoder.css +133 -0
  26. package/dist/themes/light-parchment.css +124 -0
  27. package/dist/themes/light-qoder.css +132 -0
  28. package/dist/tokens/CLAUDE.md +305 -0
  29. package/dist/tokens/index.css +35 -0
  30. package/dist/tokens/scale/computed.css +103 -0
  31. package/dist/tokens/scale/config.css +110 -0
  32. package/dist/tokens/scale/index.css +30 -0
  33. package/dist/tokens/scale/presets/compact.css +30 -0
  34. package/dist/tokens/scale/presets/dense.css +64 -0
  35. package/dist/tokens/scale/presets/sharp.css +40 -0
  36. package/dist/tokens/scale/presets/soft.css +16 -0
  37. package/dist/tokens/scale.css +13 -0
  38. package/dist/tokens/scrollbar-utility.css +35 -0
  39. package/dist/tokens/theme-base.css +270 -0
  40. package/dist/tokens/theme.css +17 -0
  41. package/dist/tokens/themes/dark-parchment.css +133 -0
  42. package/dist/tokens/themes/dark-qoder.css +133 -0
  43. package/dist/tokens/themes/light-parchment.css +124 -0
  44. package/dist/tokens/themes/light-qoder.css +132 -0
  45. package/package.json +6 -2
  46. /package/dist/registry/{chat → basic}/sidebar-menu.d.ts +0 -0
@@ -0,0 +1,124 @@
1
+ /* ============================================
2
+ * Theme: Light Parchment (羊皮纸亮色 - Figma 导入)
3
+ * 用户可复制此文件作为自定义主题模板
4
+ * ============================================ */
5
+
6
+ [data-theme="light-parchment"] {
7
+ /* --- Primary --- */
8
+ --token-color-primary: #202116;
9
+ --token-color-primary-hover: #3D3930;
10
+ --token-color-primary-active: #3D3930;
11
+ --token-color-primary-bg: #F0EDE7;
12
+ --token-color-primary-bg-hover: #E8E4DC;
13
+ --token-color-primary-border: #D4CFC6;
14
+ --token-color-primary-border-hover: #C4BEB4;
15
+ --token-color-primary-text: #202116;
16
+ --token-color-primary-text-hover: #3D3930;
17
+ --token-color-primary-text-active: #3D3930;
18
+ --token-color-text-on-primary: #FAF9F6;
19
+
20
+ /* --- Text --- */
21
+ --token-color-text: #202116;
22
+ --token-color-text-secondary: #4A463C;
23
+ --token-color-text-tertiary: #6B665C;
24
+ --token-color-text-quaternary: #8A857A;
25
+ --token-color-text-base: #202116;
26
+
27
+ /* --- Border --- */
28
+ --token-color-border: #D4CFC6;
29
+ --token-color-border-secondary: #E5E1D9;
30
+ --token-color-border-tertiary: #EDE9E2;
31
+
32
+ /* --- Fill --- */
33
+ --token-color-fill: #F5F0E7;
34
+ --token-color-fill-secondary: #EDE8E0;
35
+ --token-color-fill-tertiary: #F7F4EF;
36
+ --token-color-fill-quaternary: #FAF9F6;
37
+ --token-color-fill-disable: #E0DCD4;
38
+
39
+ /* --- Background --- */
40
+ --token-color-bg-container: #FAF9F6;
41
+ --token-color-bg-elevated: #F7F4EF;
42
+ --token-color-bg-layout: #FDFCFA;
43
+ --token-color-bg-spotlight: #FAF9F6;
44
+ --token-color-bg-mask: rgba(0, 0, 0, 0.5);
45
+ /* PlanPart 点阵高亮遮罩渐变(随主题) */
46
+ --token-color-mask-shimmer-weak: rgba(0, 0, 0, 0.3);
47
+ --token-color-mask-shimmer-strong: rgba(0, 0, 0, 0.8);
48
+ --token-color-mask-shimmer-full: rgba(0, 0, 0, 1);
49
+ --token-color-bg-base: #FFFFFF;
50
+ --token-color-bg-highlight: #202116;
51
+ --token-color-bg-highlight-hover: #2D2A22;
52
+
53
+ /* --- Semantic Colors --- */
54
+ --token-color-link: #5B4A3A;
55
+ --token-color-error: #FF4D4F;
56
+ --token-color-error-hover: #FF7875;
57
+ --token-color-error-bg: #FFF2F0;
58
+ --token-color-error-bg-hover: #FFF1F0;
59
+ --token-color-error-border: #FFCCC7;
60
+ --token-color-info: #0B83F1;
61
+ --token-color-info-hover: #5EBCFF;
62
+ --token-color-info-bg: #E6F7FF;
63
+ --token-color-info-bg-hover: #D0EFFF;
64
+ --token-color-info-border: #B0E3FF;
65
+ --token-color-success: #5A7A5E;
66
+ --token-color-success-hover: #6B8F71;
67
+ --token-color-success-bg: #EEF2ED;
68
+ --token-color-success-bg-hover: #E4EBE2;
69
+ --token-color-success-border: #C5D4C4;
70
+ --token-color-warning: #FAAD14;
71
+ --token-color-warning-hover: #FFD666;
72
+ --token-color-warning-bg: #FFFBE6;
73
+ --token-color-warning-bg-hover: #FFF3CF;
74
+ --token-color-warning-border: #FFE5BF;
75
+
76
+ /* --- Accent Colors --- */
77
+ --token-color-pink: #EC4899;
78
+ --token-color-pink-bg: #F9E3F3;
79
+ --token-color-pink-bg-hover: #F5D4EB;
80
+ --token-color-purple: #615CED;
81
+ --token-color-purple-bg: #EBE9FF;
82
+ --token-color-purple-bg-hover: #DDDAFF;
83
+ --token-color-yellow: #FAC414;
84
+ --token-color-yellow-bg: #FFF3CF;
85
+ --token-color-yellow-bg-hover: #FFE9A8;
86
+ --token-color-orange: #FA8125;
87
+ --token-color-orange-bg: #FFEFDE;
88
+ --token-color-orange-bg-hover: #FFE3C7;
89
+ --token-color-teal: #14B8A6;
90
+ --token-color-teal-bg: #DEF7F1;
91
+ --token-color-teal-bg-hover: #CAF0E8;
92
+ --token-color-blue: #0090FF;
93
+ --token-color-blue-bg: #DEEDFF;
94
+ --token-color-blue-bg-hover: #C8E3FF;
95
+ --token-color-mauve: #8E8C99;
96
+ --token-color-mauve-bg: #F1F2F3;
97
+ --token-color-mauve-bg-hover: #E4E5E7;
98
+ --token-color-slate: #1E293B;
99
+ --token-color-slate-bg: #E2E8F0;
100
+ --token-color-slate-bg-hover: #EFEFEF;
101
+ --token-color-lavender: #B99DFF;
102
+ --token-color-lavender-bg: #ECE4FF;
103
+ --token-color-lavender-bg-hover: #E0D4FF;
104
+ --token-color-sage: #6BB394;
105
+ --token-color-sage-bg: #EFF3F2;
106
+ --token-color-sage-bg-hover: #E2EAE8;
107
+
108
+ /* --- Select 等组件 (input/ring/popover 等) --- */
109
+ --token-color-input: var(--token-color-border-tertiary);
110
+ --token-color-ring: var(--token-color-primary-border);
111
+ --token-color-popover: var(--token-color-bg-container);
112
+ --token-color-popover-foreground: var(--token-color-text);
113
+ --token-color-accent: var(--token-color-fill-secondary);
114
+ --token-color-accent-foreground: var(--token-color-text);
115
+ --token-color-muted: var(--token-color-fill-tertiary);
116
+ --token-color-muted-foreground: var(--token-color-text-secondary);
117
+ --token-color-background: var(--token-color-bg-base);
118
+
119
+ /* --- Diff --- */
120
+ --token-color-diff-insert: #A6DCBA;
121
+ --token-color-diff-insert-bg: #D9EBE0;
122
+ --token-color-diff-remove: #FC6B83;
123
+ --token-color-diff-remove-bg: #E3D1D5;
124
+ }
@@ -0,0 +1,132 @@
1
+ /* ============================================
2
+ * Theme: Light (亮色模式)
3
+ * 用户可复制此文件作为自定义主题模板
4
+ * ============================================ */
5
+
6
+ :root,
7
+ [data-theme="light"] {
8
+ color-scheme: light;
9
+ /* --- Primary --- */
10
+ --token-color-primary: #8EE5A1;
11
+ --token-color-primary-hover: #73CD94;
12
+ --token-color-primary-active: #5CB870;
13
+ --token-color-primary-bg: #F1FAF3;
14
+ --token-color-primary-bg-hover: #E6F7EC;
15
+ --token-color-primary-border: #CDEFD9;
16
+ --token-color-primary-border-hover: #B3E6C7;
17
+ --token-color-primary-text: #141414;
18
+ --token-color-primary-text-hover: #73CD94;
19
+ --token-color-primary-text-active: #5CB870;
20
+ --token-color-text-on-primary: #FDFDFD;
21
+
22
+ /* --- Text --- */
23
+ --token-color-text: #141414;
24
+ --token-color-text-secondary: #636261;
25
+ --token-color-text-tertiary: #838280;
26
+ --token-color-text-quaternary: #8E8C8B;
27
+ --token-color-text-base: #0F0D0C;
28
+
29
+ /* --- Border --- */
30
+ --token-color-border: #BCBBBA;
31
+ --token-color-border-secondary: #DDDDDD;
32
+ --token-color-border-tertiary: #E6E6E6;
33
+
34
+ /* --- Fill --- */
35
+ --token-color-fill: #DFDFDF;
36
+ --token-color-fill-secondary: #EFEFEF;
37
+ --token-color-fill-tertiary: #F9F9F9;
38
+ --token-color-fill-quaternary: #FCFCFC;
39
+ --token-color-fill-disable: #DAD9D8;
40
+
41
+ /* --- Background --- */
42
+ --token-color-bg-container: #FFFFFF;
43
+ --token-color-bg-elevated: #F9F9F9;
44
+ --token-color-bg-layout: #FDFDFD;
45
+ --token-color-bg-spotlight: #FAFAFA;
46
+ --token-color-bg-mask: rgba(0, 0, 0, 0.5);
47
+ /* PlanPart 点阵高亮遮罩渐变(随主题) */
48
+ --token-color-mask-shimmer-weak: rgba(0, 0, 0, 0.3);
49
+ --token-color-mask-shimmer-strong: rgba(0, 0, 0, 0.8);
50
+ --token-color-mask-shimmer-full: rgba(0, 0, 0, 1);
51
+ --token-color-bg-base: #FFFFFF;
52
+ --token-color-bg-highlight: #080807;
53
+ --token-color-bg-highlight-hover: #1a1a1a;
54
+
55
+ /* --- Shadow (输入框等浮层,1~4 级与 primary/secondary/tertiary/quaternary 一致,与 data-theme 无关) --- */
56
+ --token-color-shadow-primary: rgba(0, 0, 0, 0.02);
57
+ --token-color-shadow-secondary: rgba(0, 0, 0, 0.035);
58
+ --token-color-shadow-tertiary: rgba(0, 0, 0, 0.055);
59
+ --token-color-shadow-quaternary: rgba(0, 0, 0, 0.075);
60
+
61
+ /* --- Semantic Colors --- */
62
+ --token-color-link: #5CB870;
63
+ --token-color-error: #FF4D4F;
64
+ --token-color-error-hover: #FF7875;
65
+ --token-color-error-bg: #FFF2F0;
66
+ --token-color-error-bg-hover: #FFE4E0;
67
+ --token-color-error-border: #FFCCC7;
68
+ --token-color-info: #0B83F1;
69
+ --token-color-info-hover: #5EBCFF;
70
+ --token-color-info-bg: #E6F7FF;
71
+ --token-color-info-bg-hover: #D0EFFF;
72
+ --token-color-info-border: #B0E3FF;
73
+ --token-color-success: #73CD94;
74
+ --token-color-success-hover: #8EE5A1;
75
+ --token-color-success-bg: #F1FAF3;
76
+ --token-color-success-bg-hover: #E6F7EC;
77
+ --token-color-success-border: #CDEFD9;
78
+ --token-color-warning: #FAAD14;
79
+ --token-color-warning-hover: #FFD666;
80
+ --token-color-warning-bg: #FFFBE6;
81
+ --token-color-warning-bg-hover: #FFF3CF;
82
+ --token-color-warning-border: #FFE5BF;
83
+
84
+ /* --- Accent Colors --- */
85
+ --token-color-pink: #EC4899;
86
+ --token-color-pink-bg: #F9E3F3;
87
+ --token-color-pink-bg-hover: #F5D4EB;
88
+ --token-color-purple: #615CED;
89
+ --token-color-purple-bg: #EBE9FF;
90
+ --token-color-purple-bg-hover: #DDDAFF;
91
+ --token-color-yellow: #FAC414;
92
+ --token-color-yellow-bg: #FFF3CF;
93
+ --token-color-yellow-bg-hover: #FFE9A8;
94
+ --token-color-orange: #FA8125;
95
+ --token-color-orange-bg: #FFEFDE;
96
+ --token-color-orange-bg-hover: #FFE3C7;
97
+ --token-color-teal: #14B8A6;
98
+ --token-color-teal-bg: #DEF7F1;
99
+ --token-color-teal-bg-hover: #CAF0E8;
100
+ --token-color-blue: #0090FF;
101
+ --token-color-blue-bg: #DEEDFF;
102
+ --token-color-blue-bg-hover: #C8E3FF;
103
+ --token-color-mauve: #8E8C99;
104
+ --token-color-mauve-bg: #F1F2F3;
105
+ --token-color-mauve-bg-hover: #E4E5E7;
106
+ --token-color-slate: #404040;
107
+ --token-color-slate-bg: #FAFAFA;
108
+ --token-color-slate-bg-hover: #EFEFEF;
109
+ --token-color-lavender: #B99DFF;
110
+ --token-color-lavender-bg: #ECE4FF;
111
+ --token-color-lavender-bg-hover: #E0D4FF;
112
+ --token-color-sage: #6BB394;
113
+ --token-color-sage-bg: #EFF3F2;
114
+ --token-color-sage-bg-hover: #E2EAE8;
115
+
116
+ /* --- Select 等组件 (input/ring/popover 等) --- */
117
+ --token-color-input: var(--token-color-border-tertiary);
118
+ --token-color-ring: var(--token-color-primary-border);
119
+ --token-color-popover: var(--token-color-bg-container);
120
+ --token-color-popover-foreground: var(--token-color-text);
121
+ --token-color-accent: var(--token-color-fill-secondary);
122
+ --token-color-accent-foreground: var(--token-color-text);
123
+ --token-color-muted: var(--token-color-fill-tertiary);
124
+ --token-color-muted-foreground: var(--token-color-text-secondary);
125
+ --token-color-background: var(--token-color-bg-base);
126
+
127
+ /* --- Diff --- */
128
+ --token-color-diff-insert: #A6DCBA;
129
+ --token-color-diff-insert-bg: #D9EBE0;
130
+ --token-color-diff-remove: #FC6B83;
131
+ --token-color-diff-remove-bg: #E3D1D5;
132
+ }
@@ -0,0 +1,305 @@
1
+ # CLAUDE.md - Tokens 设计令牌模块
2
+
3
+ > 代码是机器相,文档是语义相,两相必须同构。
4
+ > 修改代码 → 检查 L3 → 检查 L2 → 检查 L1
5
+
6
+ ---
7
+
8
+ ## 模块概述
9
+
10
+ **tokens** 是设计系统的核心,定义双维度主题:布局风格 + 颜色主题。
11
+
12
+ ---
13
+
14
+ ## 目录结构
15
+
16
+ ```
17
+ tokens/
18
+ ├── index.css # 统一入口 (推荐)
19
+ ├── scale.css # [DEPRECATED] 向后兼容入口
20
+ ├── scale/ # 布局风格 token (data-style)
21
+ │ ├── config.css # 可配置基础变量 (用户可覆盖)
22
+ │ ├── computed.css # 映射到实际变量
23
+ │ ├── index.css # scale 统一入口
24
+ │ └── presets/ # 预设风格
25
+ │ ├── compact.css # 紧凑风格
26
+ │ ├── soft.css # 柔和风格
27
+ │ ├── sharp.css # 锐利风格
28
+ │ └── dense.css # 密集风格
29
+ ├── theme-base.css # @theme 映射 + 动画 + 公共样式
30
+ ├── theme.css # [DEPRECATED] 向后兼容入口
31
+ ├── scrollbar-utility.css # 滚动条工具样式
32
+ └── themes/ # 颜色主题文件 (可按需引入)
33
+ ├── light-qoder.css # Qoder 亮色 (默认)
34
+ ├── dark-qoder.css # Qoder 暗色
35
+ ├── light-parchment.css # 羊皮纸亮色
36
+ └── dark-parchment.css # 羊皮纸暗色
37
+ ```
38
+
39
+ ---
40
+
41
+ ## 双维度主题系统
42
+
43
+ ### 维度 1: 布局风格 (data-style)
44
+
45
+ | 风格 | 描述 | Spacing | Radius | Font Size |
46
+ |------|------|---------|--------|-----------|
47
+ | `neutral` | 平衡的标准 | 100% | 100% | 100% |
48
+ | `compact` | 优化效率 | 75% | 67% | -1px |
49
+ | `soft` | 舒适至上 | 150% | 150% | +10% |
50
+ | `sharp` | 几何精度 | 100% | 0 | 100% |
51
+ | `dense` | 信息密集 | 50% | 50% | -2px |
52
+
53
+ ### 维度 2: 颜色主题 (data-theme)
54
+
55
+ **主题**与**亮暗色**区分:`data-theme` 为颜色主题的机制(取值为主题名);**亮色**与**暗色**为内置两套主题(`light` / `dark`),与布局风格 (data-style) 独立,可扩展自定义主题。
56
+
57
+ | 主题 | 描述 |
58
+ |------|------|
59
+ | `light` | 亮色(内置) |
60
+ | `dark` | 暗色(内置) |
61
+ | *自定义* | 可扩展 |
62
+
63
+ ---
64
+
65
+ ## scale/ - 布局风格令牌
66
+
67
+ ### 配置化架构
68
+
69
+ scale 模块采用双层设计,支持用户自定义配置:
70
+
71
+ 1. **config.css** - 定义可覆盖的基础变量 (`--config-*`)
72
+ 2. **computed.css** - 将配置映射到实际变量 (`--spacing-*`, `--radius-*`)
73
+ 3. **presets/** - 预设风格,覆盖部分配置
74
+
75
+ ### 用户自定义配置
76
+
77
+ ```css
78
+ /* 只引入配置层 + 计算层,不引入预设 */
79
+ @import "./tokens/scale/config.css";
80
+ @import "./tokens/scale/computed.css";
81
+
82
+ /* 覆盖配置 */
83
+ :root {
84
+ --config-radius-default: 10px; /* 自定义默认圆角 */
85
+ --config-spacing-4: 18px; /* 自定义间距 */
86
+ --config-font-size-base: 16px; /* 自定义基础字号 */
87
+ }
88
+ ```
89
+
90
+ ### 可配置变量列表
91
+
92
+ | 类别 | 变量前缀 | 示例 |
93
+ |------|---------|------|
94
+ | 间距 | `--config-spacing-*` | `--config-spacing-4: 16px` |
95
+ | 圆角 | `--config-radius-*` | `--config-radius-default: 6px` |
96
+ | 字号 | `--config-font-size-*` | `--config-font-size-base: 14px` |
97
+ | 动画 | `--config-motion-*` | `--config-motion-duration-base: 200ms` |
98
+ | 字体 | `--config-font-*` | `--config-font-mono: ...` |
99
+
100
+ ### 结构原则(只覆盖差异)
101
+
102
+ - **:root / neutral**:完整基准 scale
103
+ - **soft**:仅覆盖 `--radius`,继承 spacing 与 font
104
+ - **compact 与 sharp**:共用同一 spacing + font 块,再分别补 radius(compact 有圆角,sharp 直角 + 等宽字体)
105
+ - **dense**:独立完整 scale(与基准差异大,单独列出)
106
+
107
+ ### Token 类别
108
+
109
+ 1. **Spacing Scale**:`--spacing-0` 到 `--spacing-96`
110
+ 2. **Radius Scale**:`--radius-none` 到 `--radius-full`
111
+ 3. **Font Size Scale**:`--font-size-xs` 到 `--font-size-9xl`
112
+
113
+ ### 按钮与 spacing 的搭配关系
114
+
115
+ 按钮使用 `h-7/9/11` + `px-2/3/4`,各主题通过 scale 同时控制高度与左右 padding,使 **padding-x / height** 比例约在 0.28~0.36,视觉一致:
116
+
117
+ - **neutral**:28/36/44 + 8/12/16 → 比例 ~0.29 / 0.33 / 0.36
118
+ - **compact / sharp**:28/32/40 + 8/10/14 → 比例 ~0.29 / 0.31 / 0.35
119
+ - **dense**:24/28/32 + 6/8/12 → 比例 ~0.25 / 0.29 / 0.375
120
+
121
+ ### Tailwind 兼容
122
+
123
+ 所有 token 直接映射到 Tailwind 类名:
124
+
125
+ ```html
126
+ <!-- 直接使用 Tailwind 类名 -->
127
+ <div className="p-4 rounded-md text-base">
128
+ ```
129
+
130
+ ### 使用方式
131
+
132
+ ```html
133
+ <body data-style="soft">
134
+ <!-- spacing-4 = 24px (150% of 16px) -->
135
+ <!-- radius-md = 12px (150% of 6px) -->
136
+ </body>
137
+ ```
138
+
139
+ ---
140
+
141
+ ## theme-base.css - Tailwind 映射与公共样式
142
+
143
+ 此文件定义 Token → Tailwind 的映射契约,不包含具体颜色值。
144
+
145
+ ### 内容
146
+
147
+ 1. **@custom-variant dark**:定义 dark 变体选择器
148
+ 2. **@theme inline**:text/radius/spacing 映射(随 data-style 变化)
149
+ 3. **@theme**:颜色变量映射 `--color-*: var(--token-color-*)`
150
+ 4. **动画**:accordion-down/up/right/left
151
+ 5. **字体**:Seti 图标字体
152
+
153
+ ---
154
+
155
+ ## themes/*.css - 颜色主题文件
156
+
157
+ ### 命名与 @theme 无自引用
158
+
159
+ 颜色「源」变量在 `:root` / `[data-theme="..."]` 中统一使用 **`--token-color-*`** 命名;`@theme` 块内仅做**单向映射** `--color-*: var(--token-color-*)`,避免 `--color-xxx: var(--color-xxx)` 自循环导致按需引入(CLI init/add)时取不到值。
160
+
161
+ - **组件与样式**:继续使用公开 API `var(--color-primary)` 等,由 @theme 解析到 `--token-color-*`。
162
+ - **扩展新主题**:在主题块内定义 `--token-color-*`,不要在该主题块内再定义 `--color-*`。
163
+
164
+ ### Token 类别
165
+
166
+ 1. **Primary**:主色调
167
+ 2. **Text**:文本色(primary/secondary/tertiary/quaternary/base)
168
+ 3. **Border**:边框色(primary/secondary/tertiary)
169
+ 4. **Fill**:填充色(primary/secondary/tertiary/quaternary/disable)
170
+ 5. **Background**:背景色(container/elevated/layout/spotlight/mask/base/highlight)
171
+ 6. **Semantic**:语义色(link/error/info/success/warning)
172
+ 7. **Accent**:强调色(pink/purple/yellow/orange/teal/blue/mauve/slate/lavender/sage)
173
+ 8. **Diff**:diff 颜色(insert/remove)
174
+
175
+ ### 扩展新主题
176
+
177
+ **方式 1:创建独立文件**
178
+
179
+ ```css
180
+ /* my-custom-theme.css */
181
+ [data-theme="my-theme"] {
182
+ --token-color-primary: #3B82F6;
183
+ --token-color-primary-hover: #2563EB;
184
+ /* ... 覆盖需要的颜色变量 */
185
+ }
186
+ ```
187
+
188
+ 用户引入:
189
+ ```css
190
+ @import "./tokens/scale.css";
191
+ @import "./tokens/theme-base.css";
192
+ @import "./my-custom-theme.css";
193
+ ```
194
+
195
+ **方式 2:添加到 themes/ 目录**
196
+
197
+ 如果要作为内置主题,在 `themes/` 目录下创建新文件,并在 `index.css` 中添加引入。
198
+
199
+ ---
200
+
201
+ ## 引入方式
202
+
203
+ ### 1. 全量引入(推荐)
204
+
205
+ ```css
206
+ @import "./tokens/index.css";
207
+ ```
208
+
209
+ ### 2. 按需引入
210
+
211
+ ```css
212
+ /* 只需要 light/dark 主题 */
213
+ @import "./tokens/scale/index.css";
214
+ @import "./tokens/theme-base.css";
215
+ @import "./tokens/themes/light-qoder.css";
216
+ @import "./tokens/themes/dark-qoder.css";
217
+ ```
218
+
219
+ ### 3. 自定义布局配置
220
+
221
+ ```css
222
+ /* 使用自定义布局配置 */
223
+ @import "./tokens/scale/config.css";
224
+ @import "./tokens/scale/computed.css";
225
+ @import "./tokens/theme-base.css";
226
+ @import "./tokens/themes/light-qoder.css";
227
+
228
+ :root {
229
+ --config-radius-default: 10px; /* 覆盖配置 */
230
+ }
231
+ ```
232
+
233
+ ### 4. 自定义颜色主题
234
+
235
+ ```css
236
+ /* 使用自定义颜色主题 */
237
+ @import "./tokens/scale/index.css";
238
+ @import "./tokens/theme-base.css";
239
+ @import "./my-brand-theme.css";
240
+ ```
241
+
242
+ ---
243
+
244
+ ## 使用规范
245
+
246
+ ### 组件中使用 Token
247
+
248
+ ```tsx
249
+ // ✅ 正确 - 使用 CSS 变量
250
+ <div className="bg-[var(--color-primary)] text-[var(--color-text)]" />
251
+
252
+ // ❌ 错误 - 硬编码颜色
253
+ <div className="bg-[#1890FF] text-[#333]" />
254
+ ```
255
+
256
+ ### Tailwind v4 @theme 映射
257
+
258
+ `theme.css` 末尾的 `@theme` 块将 CSS 变量映射到 Tailwind 4 的原生 token 系统,支持:
259
+
260
+ ```tsx
261
+ // Tailwind 4 原生支持
262
+ <div className="bg-primary text-text" />
263
+ ```
264
+
265
+ ### 构建与消费模式
266
+
267
+ Token 文件同时服务两种消费模式:
268
+
269
+ | 模式 | token 文件作用 | 消费者 Tailwind 要求 |
270
+ |------|---------------|---------------------|
271
+ | **NPM 预编译**(当前) | `@tailwindcss/cli` 读取 → 编译进 `dist/qoder-design.css` | 不需要 |
272
+ | **按需引入**(CLI 复制源码) | 消费者 `@import` token 文件进自己的 CSS | 需要 Tailwind 4 |
273
+
274
+ `@theme` 块是两种模式的共用桥梁:NPM 模式下编译进预编译 CSS,按需引入模式下由消费者的 Tailwind 处理。
275
+
276
+ ---
277
+
278
+ ## L3 协议
279
+
280
+ ### scale/
281
+ - **config.css**:定义可覆盖的 `--config-*` 变量
282
+ - **computed.css**:映射 `--config-*` 到实际变量
283
+ - **presets/**:预设风格,只覆盖差异部分
284
+ - 新增风格需遵循 spacing/radius/font-size 三类完整性
285
+
286
+ ### theme-base.css
287
+ - 定义 @theme 映射,不包含具体颜色值
288
+ - 新增 Tailwind 映射时确保双向一致
289
+
290
+ ### themes/*.css
291
+ - 每个主题独立文件,便于按需引入
292
+ - 扩展主题时必须覆盖完整颜色类别
293
+ - 修改颜色值需确保对比度符合无障碍标准
294
+
295
+ ---
296
+
297
+ ## 开发检查清单
298
+
299
+ - [ ] 新增风格时更新 scale/presets/
300
+ - [ ] 新增配置项时更新 scale/config.css 和 scale/computed.css
301
+ - [ ] 新增颜色主题时创建 themes/*.css 并更新 index.css
302
+ - [ ] Token 命名遵循 `--token-color-{name}` 格式(颜色)
303
+ - [ ] Token 命名遵循 `--config-{category}-{name}` 格式(布局配置)
304
+ - [ ] 测试多主题切换
305
+ - [ ] L2 文档已更新(此文件)
@@ -0,0 +1,35 @@
1
+ /* ============================================
2
+ * [POS]: src/tokens/index.css - Token 系统统一入口
3
+ *
4
+ * 引入方式:
5
+ * 1. 全量引入(默认): @import "./tokens/index.css";
6
+ * 2. 按需引入:
7
+ * @import "./tokens/scale/config.css"; // 可配置基础变量
8
+ * @import "./tokens/scale/computed.css"; // 映射到实际变量
9
+ * @import "./tokens/theme-base.css";
10
+ * @import "./tokens/themes/light-qoder.css";
11
+ *
12
+ * 自定义布局配置:
13
+ * @import "./tokens/scale/config.css";
14
+ * @import "./tokens/scale/computed.css";
15
+ * :root { --config-radius-default: 10px; } // 覆盖配置
16
+ *
17
+ * 自定义颜色主题:
18
+ * @import "./tokens/theme-base.css";
19
+ * @import "./my-custom-theme.css"; // 定义 [data-theme="xxx"] { --token-color-*: ... }
20
+ * ============================================ */
21
+
22
+ /* 布局风格 Token (data-style: neutral | compact | soft | sharp | dense) */
23
+ @import "./scale.css";
24
+
25
+ /* Tailwind @theme 映射 + 动画 + 公共样式 */
26
+ @import "./theme-base.css";
27
+
28
+ /* 内置主题 (data-theme) */
29
+ @import "./themes/light-qoder.css";
30
+ @import "./themes/dark-qoder.css";
31
+ @import "./themes/light-parchment.css";
32
+ @import "./themes/dark-parchment.css";
33
+
34
+ /* 滚动条工具样式 */
35
+ @import "./scrollbar-utility.css";
@@ -0,0 +1,103 @@
1
+ /* ============================================
2
+ * Scale Computed - 应用配置,产出实际变量
3
+ *
4
+ * 此文件将 --config-* 映射到 --spacing-* / --radius-* / --font-size-*
5
+ * 组件和样式使用这些实际变量,不直接使用 --config-*
6
+ * ============================================ */
7
+
8
+ :root,
9
+ [data-style="neutral"] {
10
+ /* ============================================
11
+ Spacing (从配置映射)
12
+ ============================================ */
13
+ --spacing: var(--config-spacing-1);
14
+ --spacing-0: var(--config-spacing-0);
15
+ --spacing-px: var(--config-spacing-px);
16
+ --spacing-0\.5: var(--config-spacing-0\.5);
17
+ --spacing-1: var(--config-spacing-1);
18
+ --spacing-1\.5: var(--config-spacing-1\.5);
19
+ --spacing-2: var(--config-spacing-2);
20
+ --spacing-2\.5: var(--config-spacing-2\.5);
21
+ --spacing-3: var(--config-spacing-3);
22
+ --spacing-3\.5: var(--config-spacing-3\.5);
23
+ --spacing-4: var(--config-spacing-4);
24
+ --spacing-5: var(--config-spacing-5);
25
+ --spacing-6: var(--config-spacing-6);
26
+ --spacing-7: var(--config-spacing-7);
27
+ --spacing-8: var(--config-spacing-8);
28
+ --spacing-9: var(--config-spacing-9);
29
+ --spacing-10: var(--config-spacing-10);
30
+ --spacing-11: var(--config-spacing-11);
31
+ --spacing-12: var(--config-spacing-12);
32
+ --spacing-14: var(--config-spacing-14);
33
+ --spacing-16: var(--config-spacing-16);
34
+ --spacing-20: var(--config-spacing-20);
35
+ --spacing-24: var(--config-spacing-24);
36
+ --spacing-28: var(--config-spacing-28);
37
+ --spacing-32: var(--config-spacing-32);
38
+ --spacing-36: var(--config-spacing-36);
39
+ --spacing-40: var(--config-spacing-40);
40
+ --spacing-44: var(--config-spacing-44);
41
+ --spacing-48: var(--config-spacing-48);
42
+ --spacing-52: var(--config-spacing-52);
43
+ --spacing-56: var(--config-spacing-56);
44
+ --spacing-60: var(--config-spacing-60);
45
+ --spacing-64: var(--config-spacing-64);
46
+ --spacing-72: var(--config-spacing-72);
47
+ --spacing-80: var(--config-spacing-80);
48
+ --spacing-96: var(--config-spacing-96);
49
+
50
+ /* ============================================
51
+ Radius (从配置映射)
52
+ ============================================ */
53
+ --radius-none: var(--config-radius-none);
54
+ --radius-sm: var(--config-radius-sm);
55
+ --radius-DEFAULT: var(--config-radius-default);
56
+ --radius-md: var(--config-radius-md);
57
+ --radius-lg: var(--config-radius-lg);
58
+ --radius-xl: var(--config-radius-xl);
59
+ --radius-2xl: var(--config-radius-2xl);
60
+ --radius-3xl: var(--config-radius-3xl);
61
+ --radius-full: var(--config-radius-full);
62
+ --radius: var(--radius-DEFAULT);
63
+
64
+ /* ============================================
65
+ Font Size (从配置映射)
66
+ ============================================ */
67
+ --font-size-xs: var(--config-font-size-xs);
68
+ --font-size-xs--line-height: var(--config-font-size-xs-lh);
69
+ --font-size-sm: var(--config-font-size-sm);
70
+ --font-size-sm--line-height: var(--config-font-size-sm-lh);
71
+ --font-size-base: var(--config-font-size-base);
72
+ --font-size-base--line-height: var(--config-font-size-base-lh);
73
+ --font-size-lg: var(--config-font-size-lg);
74
+ --font-size-lg--line-height: var(--config-font-size-lg-lh);
75
+ --font-size-xl: var(--config-font-size-xl);
76
+ --font-size-xl--line-height: var(--config-font-size-xl-lh);
77
+ --font-size-2xl: var(--config-font-size-2xl);
78
+ --font-size-2xl--line-height: var(--config-font-size-2xl-lh);
79
+ --font-size-3xl: var(--config-font-size-3xl);
80
+ --font-size-3xl--line-height: var(--config-font-size-3xl-lh);
81
+ --font-size-4xl: var(--config-font-size-4xl);
82
+ --font-size-4xl--line-height: var(--config-font-size-4xl-lh);
83
+ --font-size-5xl: var(--config-font-size-5xl);
84
+ --font-size-5xl--line-height: var(--config-font-size-5xl-lh);
85
+ --font-size-6xl: var(--config-font-size-6xl);
86
+ --font-size-6xl--line-height: var(--config-font-size-6xl-lh);
87
+ --font-size-7xl: var(--config-font-size-7xl);
88
+ --font-size-7xl--line-height: var(--config-font-size-7xl-lh);
89
+ --font-size-8xl: var(--config-font-size-8xl);
90
+ --font-size-8xl--line-height: var(--config-font-size-8xl-lh);
91
+ --font-size-9xl: var(--config-font-size-9xl);
92
+ --font-size-9xl--line-height: var(--config-font-size-9xl-lh);
93
+
94
+ /* ============================================
95
+ Motion (从配置映射)
96
+ ============================================ */
97
+ --motion-duration-fast: var(--config-motion-duration-fast);
98
+ --motion-duration-base: var(--config-motion-duration-base);
99
+ --motion-duration-slow: var(--config-motion-duration-slow);
100
+ --motion-ease-standard: var(--config-motion-ease-standard);
101
+ --motion-ease-emphasized: var(--config-motion-ease-emphasized);
102
+ --motion-ease-out: var(--config-motion-ease-out);
103
+ }