@incremark/colors 0.3.10 → 0.4.0-alpha.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.
package/dist/index.d.ts CHANGED
@@ -26,6 +26,16 @@ interface RGB {
26
26
  * HEX 转 RGB
27
27
  */
28
28
  declare function hexToRgb(hex: string): RGB;
29
+ /**
30
+ * RGB 转空格分隔的三元组字符串
31
+ * { r: 13, g: 148, b: 136 } => '13 148 136'
32
+ */
33
+ declare function rgbToTriplet(rgb: RGB): string;
34
+ /**
35
+ * HEX 转空格分隔的 RGB 三元组字符串
36
+ * '#0D9488' => '13 148 136'
37
+ */
38
+ declare function hexToRgbTriplet(hex: string): string;
29
39
  /**
30
40
  * RGB 转 HEX
31
41
  */
@@ -65,11 +75,49 @@ declare function generateColorAt(baseColor: string, index: number): string;
65
75
  * @returns 10 级色阶数组,索引 0-9 对应色阶 1-10
66
76
  */
67
77
  declare function generatePalette(baseColor: string): string[];
78
+ /**
79
+ * 交互状态颜色
80
+ *
81
+ * 参照 Arco Design / Ant Design 标准:
82
+ * - hover = 色阶 5(比主色浅一阶)
83
+ * - primary = 色阶 6(基准色)
84
+ * - active = 色阶 7(比主色深一阶)
85
+ */
86
+ interface ColorStates {
87
+ /** 主色(色阶 6) */
88
+ primary: string;
89
+ /** hover 状态(色阶 5) */
90
+ hover: string;
91
+ /** active/pressed 状态(色阶 7) */
92
+ active: string;
93
+ /** 浅色背景(色阶 2) */
94
+ light: string;
95
+ /** 更浅的背景(色阶 1) */
96
+ lighter: string;
97
+ /** 深色背景(色阶 9) */
98
+ dark: string;
99
+ }
100
+ /**
101
+ * 完整的颜色系统(包含色阶和交互状态)
102
+ */
103
+ interface ColorSystem extends ColorStates {
104
+ /** 完整的 10 级色阶 */
105
+ 1: string;
106
+ 2: string;
107
+ 3: string;
108
+ 4: string;
109
+ 5: string;
110
+ 6: string;
111
+ 7: string;
112
+ 8: string;
113
+ 9: string;
114
+ 10: string;
115
+ }
68
116
  /**
69
117
  * 生成品牌色系统
70
118
  *
71
119
  * @param primaryColor 品牌主色
72
- * @returns 品牌色对象
120
+ * @returns 品牌色对象(兼容旧版)
73
121
  */
74
122
  declare function generateBrand(primaryColor: string): {
75
123
  primary: string;
@@ -89,6 +137,51 @@ declare function generateBrand(primaryColor: string): {
89
137
  10: string;
90
138
  };
91
139
  };
140
+ /**
141
+ * 生成完整的颜色系统(包含色阶和交互状态)
142
+ *
143
+ * @param primaryColor 主色
144
+ * @returns 完整的颜色系统
145
+ */
146
+ declare function generateColorSystem(primaryColor: string): ColorSystem;
147
+ /**
148
+ * RGB 三元组格式的颜色系统
149
+ *
150
+ * 值为空格分隔的 RGB 三元组(如 '13 148 136'),
151
+ * 适用于 CSS 变量 + UnoCSS 的 rgb() / opacity 场景
152
+ */
153
+ interface RGBColorSystem {
154
+ 1: string;
155
+ 2: string;
156
+ 3: string;
157
+ 4: string;
158
+ 5: string;
159
+ 6: string;
160
+ 7: string;
161
+ 8: string;
162
+ 9: string;
163
+ 10: string;
164
+ primary: string;
165
+ hover: string;
166
+ active: string;
167
+ light: string;
168
+ lighter: string;
169
+ dark: string;
170
+ }
171
+ /**
172
+ * 生成 RGB 三元组格式的颜色系统
173
+ *
174
+ * @param primaryColor 主色(hex)
175
+ * @returns RGB 三元组格式的颜色系统
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * const system = generateColorSystemRGB('#0D9488')
180
+ * system.primary // => '13 148 136'
181
+ * system[1] // => '230 248 246'
182
+ * ```
183
+ */
184
+ declare function generateColorSystemRGB(primaryColor: string): RGBColorSystem;
92
185
  /**
93
186
  * 预设品牌色
94
187
  */
@@ -274,5 +367,20 @@ declare const presets: {
274
367
  };
275
368
  };
276
369
  };
370
+ /**
371
+ * 预设颜色系统(包含交互状态)
372
+ */
373
+ declare const colorSystems: {
374
+ blue: ColorSystem;
375
+ purple: ColorSystem;
376
+ green: ColorSystem;
377
+ orange: ColorSystem;
378
+ red: ColorSystem;
379
+ cyan: ColorSystem;
380
+ pink: ColorSystem;
381
+ indigo: ColorSystem;
382
+ yellow: ColorSystem;
383
+ teal: ColorSystem;
384
+ };
277
385
 
278
- export { type HSV, type RGB, generateBrand, generateColorAt, generatePalette, hexToHsv, hexToRgb, hsvToHex, hsvToRgb, presets, rgbToHex, rgbToHsv };
386
+ export { type ColorStates, type ColorSystem, type HSV, type RGB, type RGBColorSystem, colorSystems, generateBrand, generateColorAt, generateColorSystem, generateColorSystemRGB, generatePalette, hexToHsv, hexToRgb, hexToRgbTriplet, hsvToHex, hsvToRgb, presets, rgbToHex, rgbToHsv, rgbToTriplet };
package/dist/index.js CHANGED
@@ -10,6 +10,12 @@ function hexToRgb(hex) {
10
10
  b: parseInt(result[3], 16)
11
11
  };
12
12
  }
13
+ function rgbToTriplet(rgb) {
14
+ return `${Math.round(rgb.r)} ${Math.round(rgb.g)} ${Math.round(rgb.b)}`;
15
+ }
16
+ function hexToRgbTriplet(hex) {
17
+ return rgbToTriplet(hexToRgb(hex));
18
+ }
13
19
  function rgbToHex(rgb) {
14
20
  const toHex = (n) => {
15
21
  const hex = Math.round(n).toString(16);
@@ -125,10 +131,10 @@ function generateBrand(primaryColor) {
125
131
  return {
126
132
  // 主色(索引 6)
127
133
  primary: palette[5],
128
- // hover 状态(索引 7)
129
- hover: palette[6],
130
- // active/pressed 状态(索引 8)
131
- active: palette[7],
134
+ // hover 状态(索引 5,比主色浅一阶)
135
+ hover: palette[4],
136
+ // active/pressed 状态(索引 7,比主色深一阶)
137
+ active: palette[6],
132
138
  // 浅色背景(索引 2)
133
139
  light: palette[1],
134
140
  // 完整色阶
@@ -146,6 +152,50 @@ function generateBrand(primaryColor) {
146
152
  }
147
153
  };
148
154
  }
155
+ function generateColorSystem(primaryColor) {
156
+ const palette = generatePalette(primaryColor);
157
+ return {
158
+ // 色阶
159
+ 1: palette[0],
160
+ 2: palette[1],
161
+ 3: palette[2],
162
+ 4: palette[3],
163
+ 5: palette[4],
164
+ 6: palette[5],
165
+ 7: palette[6],
166
+ 8: palette[7],
167
+ 9: palette[8],
168
+ 10: palette[9],
169
+ // 交互状态(参照 Arco Design:hover=5, primary=6, active=7)
170
+ primary: palette[5],
171
+ hover: palette[4],
172
+ active: palette[6],
173
+ light: palette[1],
174
+ lighter: palette[0],
175
+ dark: palette[8]
176
+ };
177
+ }
178
+ function generateColorSystemRGB(primaryColor) {
179
+ const palette = generatePalette(primaryColor).map(hexToRgbTriplet);
180
+ return {
181
+ 1: palette[0],
182
+ 2: palette[1],
183
+ 3: palette[2],
184
+ 4: palette[3],
185
+ 5: palette[4],
186
+ 6: palette[5],
187
+ 7: palette[6],
188
+ 8: palette[7],
189
+ 9: palette[8],
190
+ 10: palette[9],
191
+ primary: palette[5],
192
+ hover: palette[4],
193
+ active: palette[6],
194
+ light: palette[1],
195
+ lighter: palette[0],
196
+ dark: palette[8]
197
+ };
198
+ }
149
199
  var presets = {
150
200
  blue: generateBrand("#3b82f6"),
151
201
  purple: generateBrand("#a855f7"),
@@ -158,7 +208,19 @@ var presets = {
158
208
  yellow: generateBrand("#eab308"),
159
209
  teal: generateBrand("#14b8a6")
160
210
  };
211
+ var colorSystems = {
212
+ blue: generateColorSystem("#3b82f6"),
213
+ purple: generateColorSystem("#a855f7"),
214
+ green: generateColorSystem("#10b981"),
215
+ orange: generateColorSystem("#f97316"),
216
+ red: generateColorSystem("#ef4444"),
217
+ cyan: generateColorSystem("#06b6d4"),
218
+ pink: generateColorSystem("#ec4899"),
219
+ indigo: generateColorSystem("#6366f1"),
220
+ yellow: generateColorSystem("#eab308"),
221
+ teal: generateColorSystem("#14b8a6")
222
+ };
161
223
 
162
- export { generateBrand, generateColorAt, generatePalette, hexToHsv, hexToRgb, hsvToHex, hsvToRgb, presets, rgbToHex, rgbToHsv };
224
+ export { colorSystems, generateBrand, generateColorAt, generateColorSystem, generateColorSystemRGB, generatePalette, hexToHsv, hexToRgb, hexToRgbTriplet, hsvToHex, hsvToRgb, presets, rgbToHex, rgbToHsv, rgbToTriplet };
163
225
  //# sourceMappingURL=index.js.map
164
226
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"]}
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 转空格分隔的三元组字符串\n * { r: 13, g: 148, b: 136 } => '13 148 136'\n */\nexport function rgbToTriplet(rgb: RGB): string {\n return `${Math.round(rgb.r)} ${Math.round(rgb.g)} ${Math.round(rgb.b)}`\n}\n\n/**\n * HEX 转空格分隔的 RGB 三元组字符串\n * '#0D9488' => '13 148 136'\n */\nexport function hexToRgbTriplet(hex: string): string {\n return rgbToTriplet(hexToRgb(hex))\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 * 参照 Arco Design / Ant Design 标准:\n * - hover = 色阶 5(比主色浅一阶)\n * - primary = 色阶 6(基准色)\n * - active = 色阶 7(比主色深一阶)\n */\nexport interface ColorStates {\n /** 主色(色阶 6) */\n primary: string\n /** hover 状态(色阶 5) */\n hover: string\n /** active/pressed 状态(色阶 7) */\n active: string\n /** 浅色背景(色阶 2) */\n light: string\n /** 更浅的背景(色阶 1) */\n lighter: string\n /** 深色背景(色阶 9) */\n dark: string\n}\n\n/**\n * 完整的颜色系统(包含色阶和交互状态)\n */\nexport interface ColorSystem extends ColorStates {\n /** 完整的 10 级色阶 */\n 1: string\n 2: string\n 3: string\n 4: string\n 5: string\n 6: string\n 7: string\n 8: string\n 9: string\n 10: string\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 状态(索引 5,比主色浅一阶)\n hover: palette[4],\n // active/pressed 状态(索引 7,比主色深一阶)\n active: palette[6],\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 *\n * @param primaryColor 主色\n * @returns 完整的颜色系统\n */\nexport function generateColorSystem(primaryColor: string): ColorSystem {\n const palette = generatePalette(primaryColor)\n\n return {\n // 色阶\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 // 交互状态(参照 Arco Design:hover=5, primary=6, active=7)\n primary: palette[5],\n hover: palette[4],\n active: palette[6],\n light: palette[1],\n lighter: palette[0],\n dark: palette[8]\n }\n}\n\n/**\n * RGB 三元组格式的颜色系统\n *\n * 值为空格分隔的 RGB 三元组(如 '13 148 136'),\n * 适用于 CSS 变量 + UnoCSS 的 rgb() / opacity 场景\n */\nexport interface RGBColorSystem {\n 1: string\n 2: string\n 3: string\n 4: string\n 5: string\n 6: string\n 7: string\n 8: string\n 9: string\n 10: string\n primary: string\n hover: string\n active: string\n light: string\n lighter: string\n dark: string\n}\n\n/**\n * 生成 RGB 三元组格式的颜色系统\n *\n * @param primaryColor 主色(hex)\n * @returns RGB 三元组格式的颜色系统\n *\n * @example\n * ```ts\n * const system = generateColorSystemRGB('#0D9488')\n * system.primary // => '13 148 136'\n * system[1] // => '230 248 246'\n * ```\n */\nexport function generateColorSystemRGB(primaryColor: string): RGBColorSystem {\n const palette = generatePalette(primaryColor).map(hexToRgbTriplet)\n\n return {\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 primary: palette[5],\n hover: palette[4],\n active: palette[6],\n light: palette[1],\n lighter: palette[0],\n dark: palette[8]\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/**\n * 预设颜色系统(包含交互状态)\n */\nexport const colorSystems = {\n blue: generateColorSystem('#3b82f6'),\n purple: generateColorSystem('#a855f7'),\n green: generateColorSystem('#10b981'),\n orange: generateColorSystem('#f97316'),\n red: generateColorSystem('#ef4444'),\n cyan: generateColorSystem('#06b6d4'),\n pink: generateColorSystem('#ec4899'),\n indigo: generateColorSystem('#6366f1'),\n yellow: generateColorSystem('#eab308'),\n teal: generateColorSystem('#14b8a6')\n}\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@incremark/colors",
3
- "version": "0.3.10",
3
+ "version": "0.4.0-alpha.2",
4
4
  "description": "Incremark color utilities - Automatic color palette and theme color generation.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",