@incremark/colors 0.2.3
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 +22 -0
- package/README.md +177 -0
- package/dist/index.d.ts +278 -0
- package/dist/index.js +164 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 wangyishuai
|
|
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.
|
|
22
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# @incremark/colors
|
|
2
|
+
|
|
3
|
+
Incremark 颜色生成工具 - 自动生成色阶和主题色
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 🎨 **自动生成色阶** - 基于单个颜色生成 10 级色阶
|
|
8
|
+
- 🌈 **品牌色系统** - 自动生成 primary、hover、active、light 等状态色
|
|
9
|
+
- 🎯 **零依赖** - 纯 TypeScript 实现,无外部依赖
|
|
10
|
+
- 📦 **轻量级** - 体积小,性能好
|
|
11
|
+
- 🔧 **灵活易用** - 简单的 API,易于集成
|
|
12
|
+
|
|
13
|
+
## 算法说明
|
|
14
|
+
|
|
15
|
+
本包参考了 [Arco Design](https://arco.design/palette/list) 的颜色生成原理,基于 HSV 色彩空间实现:
|
|
16
|
+
|
|
17
|
+
- **色阶 1-5**:提高明度,降低饱和度(更浅的颜色)
|
|
18
|
+
- **色阶 6**:主色(基础颜色)
|
|
19
|
+
- **色阶 7-10**:降低明度,提高饱和度(更深的颜色)
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnpm add @incremark/colors
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 基础用法
|
|
28
|
+
|
|
29
|
+
### 生成 10 级色阶
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { generatePalette } from '@incremark/colors'
|
|
33
|
+
|
|
34
|
+
// 基于蓝色生成 10 级色阶
|
|
35
|
+
const palette = generatePalette('#3b82f6')
|
|
36
|
+
console.log(palette)
|
|
37
|
+
// [
|
|
38
|
+
// '#E8F3FF', // 色阶 1 - 最浅
|
|
39
|
+
// '#C5E2FF', // 色阶 2
|
|
40
|
+
// '#A3D1FF', // 色阶 3
|
|
41
|
+
// '#81C0FF', // 色阶 4
|
|
42
|
+
// '#5FAFFF', // 色阶 5
|
|
43
|
+
// '#3B82F6', // 色阶 6 - 主色
|
|
44
|
+
// '#2D6BDE', // 色阶 7
|
|
45
|
+
// '#1F54C6', // 色阶 8
|
|
46
|
+
// '#113DAE', // 色阶 9
|
|
47
|
+
// '#032696' // 色阶 10 - 最深
|
|
48
|
+
// ]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 生成品牌色系统
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { generateBrand } from '@incremark/colors'
|
|
55
|
+
|
|
56
|
+
const brand = generateBrand('#3b82f6')
|
|
57
|
+
console.log(brand)
|
|
58
|
+
// {
|
|
59
|
+
// primary: '#3B82F6', // 主色
|
|
60
|
+
// hover: '#2D6BDE', // hover 状态
|
|
61
|
+
// active: '#1F54C6', // active/pressed 状态
|
|
62
|
+
// light: '#C5E2FF', // 浅色背景
|
|
63
|
+
// palette: { // 完整 10 级色阶
|
|
64
|
+
// 1: '#E8F3FF',
|
|
65
|
+
// 2: '#C5E2FF',
|
|
66
|
+
// // ...
|
|
67
|
+
// 10: '#032696'
|
|
68
|
+
// }
|
|
69
|
+
// }
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 使用预设颜色
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { presets } from '@incremark/colors'
|
|
76
|
+
|
|
77
|
+
console.log(presets.blue.primary) // '#3B82F6'
|
|
78
|
+
console.log(presets.purple.primary) // '#A855F7'
|
|
79
|
+
console.log(presets.green.primary) // '#10B981'
|
|
80
|
+
|
|
81
|
+
// 可用的预设:
|
|
82
|
+
// blue, purple, green, orange, red, cyan, pink, indigo, yellow, teal
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 高级用法
|
|
86
|
+
|
|
87
|
+
### 生成指定色阶
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
import { generateColorAt } from '@incremark/colors'
|
|
91
|
+
|
|
92
|
+
// 生成第 3 级色阶(较浅)
|
|
93
|
+
const light = generateColorAt('#3b82f6', 3)
|
|
94
|
+
|
|
95
|
+
// 生成第 8 级色阶(较深)
|
|
96
|
+
const dark = generateColorAt('#3b82f6', 8)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 颜色空间转换
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { hexToRgb, rgbToHex, hexToHsv, hsvToHex } from '@incremark/colors'
|
|
103
|
+
|
|
104
|
+
// HEX 转 RGB
|
|
105
|
+
const rgb = hexToRgb('#3b82f6')
|
|
106
|
+
// { r: 59, g: 130, b: 246 }
|
|
107
|
+
|
|
108
|
+
// RGB 转 HEX
|
|
109
|
+
const hex = rgbToHex({ r: 59, g: 130, b: 246 })
|
|
110
|
+
// '#3B82F6'
|
|
111
|
+
|
|
112
|
+
// HEX 转 HSV
|
|
113
|
+
const hsv = hexToHsv('#3b82f6')
|
|
114
|
+
// { h: 217, s: 76, v: 96 }
|
|
115
|
+
|
|
116
|
+
// HSV 转 HEX
|
|
117
|
+
const hex2 = hsvToHex({ h: 217, s: 76, v: 96 })
|
|
118
|
+
// '#3B82F6'
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 在主题系统中使用
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
import { generateBrand } from '@incremark/colors'
|
|
125
|
+
|
|
126
|
+
const brandColors = generateBrand('#3b82f6')
|
|
127
|
+
|
|
128
|
+
export const theme = {
|
|
129
|
+
colors: {
|
|
130
|
+
brand: {
|
|
131
|
+
primary: brandColors.primary,
|
|
132
|
+
hover: brandColors.hover,
|
|
133
|
+
active: brandColors.active,
|
|
134
|
+
light: brandColors.light
|
|
135
|
+
},
|
|
136
|
+
// 或者使用完整色阶
|
|
137
|
+
blue: brandColors.palette
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## API 参考
|
|
143
|
+
|
|
144
|
+
### `generatePalette(baseColor: string): string[]`
|
|
145
|
+
|
|
146
|
+
生成完整的 10 级色阶
|
|
147
|
+
|
|
148
|
+
- **参数**:`baseColor` - 基础颜色(HEX 格式)
|
|
149
|
+
- **返回**:10 级色阶数组(索引 0-9 对应色阶 1-10)
|
|
150
|
+
|
|
151
|
+
### `generateBrand(primaryColor: string): BrandColors`
|
|
152
|
+
|
|
153
|
+
生成品牌色系统
|
|
154
|
+
|
|
155
|
+
- **参数**:`primaryColor` - 品牌主色(HEX 格式)
|
|
156
|
+
- **返回**:包含 primary、hover、active、light 和完整色阶的对象
|
|
157
|
+
|
|
158
|
+
### `generateColorAt(baseColor: string, index: number): string`
|
|
159
|
+
|
|
160
|
+
生成指定色阶
|
|
161
|
+
|
|
162
|
+
- **参数**:
|
|
163
|
+
- `baseColor` - 基础颜色(HEX 格式)
|
|
164
|
+
- `index` - 色阶索引(1-10,6 为主色)
|
|
165
|
+
- **返回**:指定色阶的颜色(HEX 格式)
|
|
166
|
+
|
|
167
|
+
## 最佳实践
|
|
168
|
+
|
|
169
|
+
1. **选择合适的基础色**:建议选择饱和度适中的颜色作为基础色(色阶 6)
|
|
170
|
+
2. **保持一致性**:在整个项目中使用相同的品牌色生成逻辑
|
|
171
|
+
3. **考虑可访问性**:确保生成的颜色对比度符合 WCAG 标准
|
|
172
|
+
4. **暗色模式适配**:对于暗色模式,可以选择稍微调亮的基础色
|
|
173
|
+
|
|
174
|
+
## License
|
|
175
|
+
|
|
176
|
+
MIT © [Incremark](https://www.incremark.com/)
|
|
177
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 颜色生成工具
|
|
3
|
+
*
|
|
4
|
+
* 参考 Arco Design 的颜色生成算法,重新实现
|
|
5
|
+
* 基于 HSV 色彩空间生成 10 级色阶
|
|
6
|
+
*
|
|
7
|
+
* @see https://arco.design/palette/list
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* HSV 颜色模型
|
|
11
|
+
*/
|
|
12
|
+
interface HSV {
|
|
13
|
+
h: number;
|
|
14
|
+
s: number;
|
|
15
|
+
v: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* RGB 颜色模型
|
|
19
|
+
*/
|
|
20
|
+
interface RGB {
|
|
21
|
+
r: number;
|
|
22
|
+
g: number;
|
|
23
|
+
b: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* HEX 转 RGB
|
|
27
|
+
*/
|
|
28
|
+
declare function hexToRgb(hex: string): RGB;
|
|
29
|
+
/**
|
|
30
|
+
* RGB 转 HEX
|
|
31
|
+
*/
|
|
32
|
+
declare function rgbToHex(rgb: RGB): string;
|
|
33
|
+
/**
|
|
34
|
+
* RGB 转 HSV
|
|
35
|
+
*/
|
|
36
|
+
declare function rgbToHsv(rgb: RGB): HSV;
|
|
37
|
+
/**
|
|
38
|
+
* HSV 转 RGB
|
|
39
|
+
*/
|
|
40
|
+
declare function hsvToRgb(hsv: HSV): RGB;
|
|
41
|
+
/**
|
|
42
|
+
* HEX 转 HSV
|
|
43
|
+
*/
|
|
44
|
+
declare function hexToHsv(hex: string): HSV;
|
|
45
|
+
/**
|
|
46
|
+
* HSV 转 HEX
|
|
47
|
+
*/
|
|
48
|
+
declare function hsvToHex(hsv: HSV): string;
|
|
49
|
+
/**
|
|
50
|
+
* 生成单个色阶
|
|
51
|
+
*
|
|
52
|
+
* 基于 Arco Design 的算法原理:
|
|
53
|
+
* - 色阶 1-5: 提高明度,降低饱和度(更浅)
|
|
54
|
+
* - 色阶 6: 主色
|
|
55
|
+
* - 色阶 7-10: 降低明度,提高饱和度(更深)
|
|
56
|
+
*
|
|
57
|
+
* @param baseColor 基础颜色(hex)
|
|
58
|
+
* @param index 色阶索引(1-10,6 为主色)
|
|
59
|
+
*/
|
|
60
|
+
declare function generateColorAt(baseColor: string, index: number): string;
|
|
61
|
+
/**
|
|
62
|
+
* 生成完整的 10 级色阶
|
|
63
|
+
*
|
|
64
|
+
* @param baseColor 基础颜色(hex)
|
|
65
|
+
* @returns 10 级色阶数组,索引 0-9 对应色阶 1-10
|
|
66
|
+
*/
|
|
67
|
+
declare function generatePalette(baseColor: string): string[];
|
|
68
|
+
/**
|
|
69
|
+
* 生成品牌色系统
|
|
70
|
+
*
|
|
71
|
+
* @param primaryColor 品牌主色
|
|
72
|
+
* @returns 品牌色对象
|
|
73
|
+
*/
|
|
74
|
+
declare function generateBrand(primaryColor: string): {
|
|
75
|
+
primary: string;
|
|
76
|
+
hover: string;
|
|
77
|
+
active: string;
|
|
78
|
+
light: string;
|
|
79
|
+
palette: {
|
|
80
|
+
1: string;
|
|
81
|
+
2: string;
|
|
82
|
+
3: string;
|
|
83
|
+
4: string;
|
|
84
|
+
5: string;
|
|
85
|
+
6: string;
|
|
86
|
+
7: string;
|
|
87
|
+
8: string;
|
|
88
|
+
9: string;
|
|
89
|
+
10: string;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* 预设品牌色
|
|
94
|
+
*/
|
|
95
|
+
declare const presets: {
|
|
96
|
+
blue: {
|
|
97
|
+
primary: string;
|
|
98
|
+
hover: string;
|
|
99
|
+
active: string;
|
|
100
|
+
light: string;
|
|
101
|
+
palette: {
|
|
102
|
+
1: string;
|
|
103
|
+
2: string;
|
|
104
|
+
3: string;
|
|
105
|
+
4: string;
|
|
106
|
+
5: string;
|
|
107
|
+
6: string;
|
|
108
|
+
7: string;
|
|
109
|
+
8: string;
|
|
110
|
+
9: string;
|
|
111
|
+
10: string;
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
purple: {
|
|
115
|
+
primary: string;
|
|
116
|
+
hover: string;
|
|
117
|
+
active: string;
|
|
118
|
+
light: string;
|
|
119
|
+
palette: {
|
|
120
|
+
1: string;
|
|
121
|
+
2: string;
|
|
122
|
+
3: string;
|
|
123
|
+
4: string;
|
|
124
|
+
5: string;
|
|
125
|
+
6: string;
|
|
126
|
+
7: string;
|
|
127
|
+
8: string;
|
|
128
|
+
9: string;
|
|
129
|
+
10: string;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
green: {
|
|
133
|
+
primary: string;
|
|
134
|
+
hover: string;
|
|
135
|
+
active: string;
|
|
136
|
+
light: string;
|
|
137
|
+
palette: {
|
|
138
|
+
1: string;
|
|
139
|
+
2: string;
|
|
140
|
+
3: string;
|
|
141
|
+
4: string;
|
|
142
|
+
5: string;
|
|
143
|
+
6: string;
|
|
144
|
+
7: string;
|
|
145
|
+
8: string;
|
|
146
|
+
9: string;
|
|
147
|
+
10: string;
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
orange: {
|
|
151
|
+
primary: string;
|
|
152
|
+
hover: string;
|
|
153
|
+
active: string;
|
|
154
|
+
light: string;
|
|
155
|
+
palette: {
|
|
156
|
+
1: string;
|
|
157
|
+
2: string;
|
|
158
|
+
3: string;
|
|
159
|
+
4: string;
|
|
160
|
+
5: string;
|
|
161
|
+
6: string;
|
|
162
|
+
7: string;
|
|
163
|
+
8: string;
|
|
164
|
+
9: string;
|
|
165
|
+
10: string;
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
red: {
|
|
169
|
+
primary: string;
|
|
170
|
+
hover: string;
|
|
171
|
+
active: string;
|
|
172
|
+
light: string;
|
|
173
|
+
palette: {
|
|
174
|
+
1: string;
|
|
175
|
+
2: string;
|
|
176
|
+
3: string;
|
|
177
|
+
4: string;
|
|
178
|
+
5: string;
|
|
179
|
+
6: string;
|
|
180
|
+
7: string;
|
|
181
|
+
8: string;
|
|
182
|
+
9: string;
|
|
183
|
+
10: string;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
cyan: {
|
|
187
|
+
primary: string;
|
|
188
|
+
hover: string;
|
|
189
|
+
active: string;
|
|
190
|
+
light: string;
|
|
191
|
+
palette: {
|
|
192
|
+
1: string;
|
|
193
|
+
2: string;
|
|
194
|
+
3: string;
|
|
195
|
+
4: string;
|
|
196
|
+
5: string;
|
|
197
|
+
6: string;
|
|
198
|
+
7: string;
|
|
199
|
+
8: string;
|
|
200
|
+
9: string;
|
|
201
|
+
10: string;
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
pink: {
|
|
205
|
+
primary: string;
|
|
206
|
+
hover: string;
|
|
207
|
+
active: string;
|
|
208
|
+
light: string;
|
|
209
|
+
palette: {
|
|
210
|
+
1: string;
|
|
211
|
+
2: string;
|
|
212
|
+
3: string;
|
|
213
|
+
4: string;
|
|
214
|
+
5: string;
|
|
215
|
+
6: string;
|
|
216
|
+
7: string;
|
|
217
|
+
8: string;
|
|
218
|
+
9: string;
|
|
219
|
+
10: string;
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
indigo: {
|
|
223
|
+
primary: string;
|
|
224
|
+
hover: string;
|
|
225
|
+
active: string;
|
|
226
|
+
light: string;
|
|
227
|
+
palette: {
|
|
228
|
+
1: string;
|
|
229
|
+
2: string;
|
|
230
|
+
3: string;
|
|
231
|
+
4: string;
|
|
232
|
+
5: string;
|
|
233
|
+
6: string;
|
|
234
|
+
7: string;
|
|
235
|
+
8: string;
|
|
236
|
+
9: string;
|
|
237
|
+
10: string;
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
yellow: {
|
|
241
|
+
primary: string;
|
|
242
|
+
hover: string;
|
|
243
|
+
active: string;
|
|
244
|
+
light: string;
|
|
245
|
+
palette: {
|
|
246
|
+
1: string;
|
|
247
|
+
2: string;
|
|
248
|
+
3: string;
|
|
249
|
+
4: string;
|
|
250
|
+
5: string;
|
|
251
|
+
6: string;
|
|
252
|
+
7: string;
|
|
253
|
+
8: string;
|
|
254
|
+
9: string;
|
|
255
|
+
10: string;
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
teal: {
|
|
259
|
+
primary: string;
|
|
260
|
+
hover: string;
|
|
261
|
+
active: string;
|
|
262
|
+
light: string;
|
|
263
|
+
palette: {
|
|
264
|
+
1: string;
|
|
265
|
+
2: string;
|
|
266
|
+
3: string;
|
|
267
|
+
4: string;
|
|
268
|
+
5: string;
|
|
269
|
+
6: string;
|
|
270
|
+
7: string;
|
|
271
|
+
8: string;
|
|
272
|
+
9: string;
|
|
273
|
+
10: string;
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
export { type HSV, type RGB, generateBrand, generateColorAt, generatePalette, hexToHsv, hexToRgb, hsvToHex, hsvToRgb, presets, rgbToHex, rgbToHsv };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
function hexToRgb(hex) {
|
|
3
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
4
|
+
if (!result) {
|
|
5
|
+
throw new Error(`Invalid hex color: ${hex}`);
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
r: parseInt(result[1], 16),
|
|
9
|
+
g: parseInt(result[2], 16),
|
|
10
|
+
b: parseInt(result[3], 16)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function rgbToHex(rgb) {
|
|
14
|
+
const toHex = (n) => {
|
|
15
|
+
const hex = Math.round(n).toString(16);
|
|
16
|
+
return hex.length === 1 ? "0" + hex : hex;
|
|
17
|
+
};
|
|
18
|
+
return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`.toUpperCase();
|
|
19
|
+
}
|
|
20
|
+
function rgbToHsv(rgb) {
|
|
21
|
+
const r = rgb.r / 255;
|
|
22
|
+
const g = rgb.g / 255;
|
|
23
|
+
const b = rgb.b / 255;
|
|
24
|
+
const max = Math.max(r, g, b);
|
|
25
|
+
const min = Math.min(r, g, b);
|
|
26
|
+
const diff = max - min;
|
|
27
|
+
let h = 0;
|
|
28
|
+
if (diff !== 0) {
|
|
29
|
+
if (max === r) {
|
|
30
|
+
h = 60 * ((g - b) / diff % 6);
|
|
31
|
+
} else if (max === g) {
|
|
32
|
+
h = 60 * ((b - r) / diff + 2);
|
|
33
|
+
} else {
|
|
34
|
+
h = 60 * ((r - g) / diff + 4);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (h < 0) {
|
|
38
|
+
h += 360;
|
|
39
|
+
}
|
|
40
|
+
const s = max === 0 ? 0 : diff / max * 100;
|
|
41
|
+
const v = max * 100;
|
|
42
|
+
return { h, s, v };
|
|
43
|
+
}
|
|
44
|
+
function hsvToRgb(hsv) {
|
|
45
|
+
const h = hsv.h;
|
|
46
|
+
const s = hsv.s / 100;
|
|
47
|
+
const v = hsv.v / 100;
|
|
48
|
+
const c = v * s;
|
|
49
|
+
const x = c * (1 - Math.abs(h / 60 % 2 - 1));
|
|
50
|
+
const m = v - c;
|
|
51
|
+
let r = 0, g = 0, b = 0;
|
|
52
|
+
if (h >= 0 && h < 60) {
|
|
53
|
+
r = c;
|
|
54
|
+
g = x;
|
|
55
|
+
b = 0;
|
|
56
|
+
} else if (h >= 60 && h < 120) {
|
|
57
|
+
r = x;
|
|
58
|
+
g = c;
|
|
59
|
+
b = 0;
|
|
60
|
+
} else if (h >= 120 && h < 180) {
|
|
61
|
+
r = 0;
|
|
62
|
+
g = c;
|
|
63
|
+
b = x;
|
|
64
|
+
} else if (h >= 180 && h < 240) {
|
|
65
|
+
r = 0;
|
|
66
|
+
g = x;
|
|
67
|
+
b = c;
|
|
68
|
+
} else if (h >= 240 && h < 300) {
|
|
69
|
+
r = x;
|
|
70
|
+
g = 0;
|
|
71
|
+
b = c;
|
|
72
|
+
} else {
|
|
73
|
+
r = c;
|
|
74
|
+
g = 0;
|
|
75
|
+
b = x;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
r: (r + m) * 255,
|
|
79
|
+
g: (g + m) * 255,
|
|
80
|
+
b: (b + m) * 255
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function hexToHsv(hex) {
|
|
84
|
+
return rgbToHsv(hexToRgb(hex));
|
|
85
|
+
}
|
|
86
|
+
function hsvToHex(hsv) {
|
|
87
|
+
return rgbToHex(hsvToRgb(hsv));
|
|
88
|
+
}
|
|
89
|
+
function generateColorAt(baseColor, index) {
|
|
90
|
+
if (index < 1 || index > 10) {
|
|
91
|
+
throw new Error("Index must be between 1 and 10");
|
|
92
|
+
}
|
|
93
|
+
if (index === 6) {
|
|
94
|
+
return baseColor.toUpperCase();
|
|
95
|
+
}
|
|
96
|
+
const hsv = hexToHsv(baseColor);
|
|
97
|
+
const offset = index - 6;
|
|
98
|
+
const isLight = offset < 0;
|
|
99
|
+
const step = Math.abs(offset);
|
|
100
|
+
let newHsv;
|
|
101
|
+
if (isLight) {
|
|
102
|
+
newHsv = {
|
|
103
|
+
h: hsv.h,
|
|
104
|
+
s: Math.max(0, hsv.s - step * 15),
|
|
105
|
+
// 逐步降低饱和度
|
|
106
|
+
v: Math.min(100, hsv.v + step * 8)
|
|
107
|
+
// 逐步提高明度
|
|
108
|
+
};
|
|
109
|
+
} else {
|
|
110
|
+
newHsv = {
|
|
111
|
+
h: hsv.h,
|
|
112
|
+
s: Math.min(100, hsv.s + step * 5),
|
|
113
|
+
// 逐步提高饱和度
|
|
114
|
+
v: Math.max(0, hsv.v - step * 12)
|
|
115
|
+
// 逐步降低明度
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return hsvToHex(newHsv);
|
|
119
|
+
}
|
|
120
|
+
function generatePalette(baseColor) {
|
|
121
|
+
return Array.from({ length: 10 }, (_, i) => generateColorAt(baseColor, i + 1));
|
|
122
|
+
}
|
|
123
|
+
function generateBrand(primaryColor) {
|
|
124
|
+
const palette = generatePalette(primaryColor);
|
|
125
|
+
return {
|
|
126
|
+
// 主色(索引 6)
|
|
127
|
+
primary: palette[5],
|
|
128
|
+
// hover 状态(索引 7)
|
|
129
|
+
hover: palette[6],
|
|
130
|
+
// active/pressed 状态(索引 8)
|
|
131
|
+
active: palette[7],
|
|
132
|
+
// 浅色背景(索引 2)
|
|
133
|
+
light: palette[1],
|
|
134
|
+
// 完整色阶
|
|
135
|
+
palette: {
|
|
136
|
+
1: palette[0],
|
|
137
|
+
2: palette[1],
|
|
138
|
+
3: palette[2],
|
|
139
|
+
4: palette[3],
|
|
140
|
+
5: palette[4],
|
|
141
|
+
6: palette[5],
|
|
142
|
+
7: palette[6],
|
|
143
|
+
8: palette[7],
|
|
144
|
+
9: palette[8],
|
|
145
|
+
10: palette[9]
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
var presets = {
|
|
150
|
+
blue: generateBrand("#3b82f6"),
|
|
151
|
+
purple: generateBrand("#a855f7"),
|
|
152
|
+
green: generateBrand("#10b981"),
|
|
153
|
+
orange: generateBrand("#f97316"),
|
|
154
|
+
red: generateBrand("#ef4444"),
|
|
155
|
+
cyan: generateBrand("#06b6d4"),
|
|
156
|
+
pink: generateBrand("#ec4899"),
|
|
157
|
+
indigo: generateBrand("#6366f1"),
|
|
158
|
+
yellow: generateBrand("#eab308"),
|
|
159
|
+
teal: generateBrand("#14b8a6")
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export { generateBrand, generateColorAt, generatePalette, hexToHsv, hexToRgb, hsvToHex, hsvToRgb, presets, rgbToHex, rgbToHsv };
|
|
163
|
+
//# sourceMappingURL=index.js.map
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 颜色生成工具\n * \n * 参考 Arco Design 的颜色生成算法,重新实现\n * 基于 HSV 色彩空间生成 10 级色阶\n * \n * @see https://arco.design/palette/list\n */\n\n/**\n * HSV 颜色模型\n */\nexport interface HSV {\n h: number // 色调 0-360\n s: number // 饱和度 0-100\n v: number // 明度 0-100\n}\n\n/**\n * RGB 颜色模型\n */\nexport interface RGB {\n r: number // 红色 0-255\n g: number // 绿色 0-255\n b: number // 蓝色 0-255\n}\n\n/**\n * HEX 转 RGB\n */\nexport function hexToRgb(hex: string): RGB {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n if (!result) {\n throw new Error(`Invalid hex color: ${hex}`)\n }\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n }\n}\n\n/**\n * RGB 转 HEX\n */\nexport function rgbToHex(rgb: RGB): string {\n const toHex = (n: number) => {\n const hex = Math.round(n).toString(16)\n return hex.length === 1 ? '0' + hex : hex\n }\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`.toUpperCase()\n}\n\n/**\n * RGB 转 HSV\n */\nexport function rgbToHsv(rgb: RGB): HSV {\n const r = rgb.r / 255\n const g = rgb.g / 255\n const b = rgb.b / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const diff = max - min\n\n let h = 0\n if (diff !== 0) {\n if (max === r) {\n h = 60 * (((g - b) / diff) % 6)\n } else if (max === g) {\n h = 60 * ((b - r) / diff + 2)\n } else {\n h = 60 * ((r - g) / diff + 4)\n }\n }\n if (h < 0) {\n h += 360\n }\n\n const s = max === 0 ? 0 : (diff / max) * 100\n const v = max * 100\n\n return { h, s, v }\n}\n\n/**\n * HSV 转 RGB\n */\nexport function hsvToRgb(hsv: HSV): RGB {\n const h = hsv.h\n const s = hsv.s / 100\n const v = hsv.v / 100\n\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n\n let r = 0, g = 0, b = 0\n if (h >= 0 && h < 60) {\n r = c; g = x; b = 0\n } else if (h >= 60 && h < 120) {\n r = x; g = c; b = 0\n } else if (h >= 120 && h < 180) {\n r = 0; g = c; b = x\n } else if (h >= 180 && h < 240) {\n r = 0; g = x; b = c\n } else if (h >= 240 && h < 300) {\n r = x; g = 0; b = c\n } else {\n r = c; g = 0; b = x\n }\n\n return {\n r: (r + m) * 255,\n g: (g + m) * 255,\n b: (b + m) * 255\n }\n}\n\n/**\n * HEX 转 HSV\n */\nexport function hexToHsv(hex: string): HSV {\n return rgbToHsv(hexToRgb(hex))\n}\n\n/**\n * HSV 转 HEX\n */\nexport function hsvToHex(hsv: HSV): string {\n return rgbToHex(hsvToRgb(hsv))\n}\n\n/**\n * 生成单个色阶\n * \n * 基于 Arco Design 的算法原理:\n * - 色阶 1-5: 提高明度,降低饱和度(更浅)\n * - 色阶 6: 主色\n * - 色阶 7-10: 降低明度,提高饱和度(更深)\n * \n * @param baseColor 基础颜色(hex)\n * @param index 色阶索引(1-10,6 为主色)\n */\nexport function generateColorAt(baseColor: string, index: number): string {\n if (index < 1 || index > 10) {\n throw new Error('Index must be between 1 and 10')\n }\n\n // 索引 6 返回原色\n if (index === 6) {\n return baseColor.toUpperCase()\n }\n\n const hsv = hexToHsv(baseColor)\n \n // 计算偏移量(1-5: 负偏移,7-10: 正偏移)\n const offset = index - 6\n const isLight = offset < 0\n const step = Math.abs(offset)\n\n let newHsv: HSV\n\n if (isLight) {\n // 浅色:提高明度,降低饱和度\n newHsv = {\n h: hsv.h,\n s: Math.max(0, hsv.s - step * 15), // 逐步降低饱和度\n v: Math.min(100, hsv.v + step * 8) // 逐步提高明度\n }\n } else {\n // 深色:降低明度,提高饱和度\n newHsv = {\n h: hsv.h,\n s: Math.min(100, hsv.s + step * 5), // 逐步提高饱和度\n v: Math.max(0, hsv.v - step * 12) // 逐步降低明度\n }\n }\n\n return hsvToHex(newHsv)\n}\n\n/**\n * 生成完整的 10 级色阶\n * \n * @param baseColor 基础颜色(hex)\n * @returns 10 级色阶数组,索引 0-9 对应色阶 1-10\n */\nexport function generatePalette(baseColor: string): string[] {\n return Array.from({ length: 10 }, (_, i) => generateColorAt(baseColor, i + 1))\n}\n\n/**\n * 生成品牌色系统\n * \n * @param primaryColor 品牌主色\n * @returns 品牌色对象\n */\nexport function generateBrand(primaryColor: string) {\n const palette = generatePalette(primaryColor)\n \n return {\n // 主色(索引 6)\n primary: palette[5],\n // hover 状态(索引 7)\n hover: palette[6],\n // active/pressed 状态(索引 8)\n active: palette[7],\n // 浅色背景(索引 2)\n light: palette[1],\n // 完整色阶\n palette: {\n 1: palette[0],\n 2: palette[1],\n 3: palette[2],\n 4: palette[3],\n 5: palette[4],\n 6: palette[5],\n 7: palette[6],\n 8: palette[7],\n 9: palette[8],\n 10: palette[9]\n }\n }\n}\n\n/**\n * 预设品牌色\n */\nexport const presets = {\n blue: generateBrand('#3b82f6'),\n purple: generateBrand('#a855f7'),\n green: generateBrand('#10b981'),\n orange: generateBrand('#f97316'),\n red: generateBrand('#ef4444'),\n cyan: generateBrand('#06b6d4'),\n pink: generateBrand('#ec4899'),\n indigo: generateBrand('#6366f1'),\n yellow: generateBrand('#eab308'),\n teal: generateBrand('#14b8a6')\n}\n\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@incremark/colors",
|
|
3
|
+
"version": "0.2.3",
|
|
4
|
+
"description": "Incremark 颜色生成工具 - 自动生成色阶和主题色",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [
|
|
20
|
+
"colors",
|
|
21
|
+
"palette",
|
|
22
|
+
"theme",
|
|
23
|
+
"color-generation"
|
|
24
|
+
],
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/kingshuaishuai/incremark.git",
|
|
29
|
+
"directory": "packages/colors"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://www.incremark.com/",
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"tsup": "^8.0.0",
|
|
34
|
+
"typescript": "^5.3.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsup",
|
|
38
|
+
"dev": "tsup --watch"
|
|
39
|
+
}
|
|
40
|
+
}
|