UNPKG

3.32 kBJavaScriptView Raw
1import { TinyColor } from '@ctrl/tinycolor';
2var hueStep = 2; // 色相阶梯
3
4var saturationStep = 0.16; // 饱和度阶梯,浅色部分
5
6var saturationStep2 = 0.05; // 饱和度阶梯,深色部分
7
8var brightnessStep1 = 0.05; // 亮度阶梯,浅色部分
9
10var brightnessStep2 = 0.15; // 亮度阶梯,深色部分
11
12var lightColorCount = 5; // 浅色数量,主色上
13
14var darkColorCount = 4; // 深色数量,主色下
15// 暗色主题颜色映射关系表
16
17var darkColorMap = [{
18 index: 7,
19 opacity: 0.15
20}, {
21 index: 6,
22 opacity: 0.25
23}, {
24 index: 5,
25 opacity: 0.3
26}, {
27 index: 5,
28 opacity: 0.45
29}, {
30 index: 5,
31 opacity: 0.65
32}, {
33 index: 5,
34 opacity: 0.85
35}, {
36 index: 4,
37 opacity: 0.9
38}, {
39 index: 3,
40 opacity: 0.95
41}, {
42 index: 2,
43 opacity: 0.97
44}, {
45 index: 1,
46 opacity: 0.98
47}];
48
49function getHue(hsv, i, light) {
50 var hue; // 根据色相不同,色相转向不同
51
52 if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {
53 hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i;
54 } else {
55 hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i;
56 }
57
58 if (hue < 0) {
59 hue += 360;
60 } else if (hue >= 360) {
61 hue -= 360;
62 }
63
64 return hue;
65}
66
67function getSaturation(hsv, i, light) {
68 // grey color don't change saturation
69 if (hsv.h === 0 && hsv.s === 0) {
70 return hsv.s;
71 }
72
73 var saturation;
74
75 if (light) {
76 saturation = hsv.s - saturationStep * i;
77 } else if (i === darkColorCount) {
78 saturation = hsv.s + saturationStep;
79 } else {
80 saturation = hsv.s + saturationStep2 * i;
81 } // 边界值修正
82
83
84 if (saturation > 1) {
85 saturation = 1;
86 } // 第一格的 s 限制在 0.06-0.1 之间
87
88
89 if (light && i === lightColorCount && saturation > 0.1) {
90 saturation = 0.1;
91 }
92
93 if (saturation < 0.06) {
94 saturation = 0.06;
95 }
96
97 return Number(saturation.toFixed(2));
98}
99
100function getValue(hsv, i, light) {
101 var value;
102
103 if (light) {
104 value = hsv.v + brightnessStep1 * i;
105 } else {
106 value = hsv.v - brightnessStep2 * i;
107 }
108
109 if (value > 1) {
110 value = 1;
111 }
112
113 return Number(value.toFixed(2));
114}
115
116export default function generate(color) {
117 var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
118 var patterns = [];
119 var pColor = new TinyColor(color);
120
121 for (var i = lightColorCount; i > 0; i -= 1) {
122 var hsv = pColor.toHsv();
123 var colorString = new TinyColor({
124 h: getHue(hsv, i, true),
125 s: getSaturation(hsv, i, true),
126 v: getValue(hsv, i, true)
127 }).toHexString();
128 patterns.push(colorString);
129 }
130
131 patterns.push(pColor.toHexString());
132
133 for (var _i = 1; _i <= darkColorCount; _i += 1) {
134 var _hsv = pColor.toHsv();
135
136 var _colorString = new TinyColor({
137 h: getHue(_hsv, _i),
138 s: getSaturation(_hsv, _i),
139 v: getValue(_hsv, _i)
140 }).toHexString();
141
142 patterns.push(_colorString);
143 } // dark theme patterns
144
145
146 if (opts.theme === 'dark') {
147 return darkColorMap.map(function (_ref) {
148 var index = _ref.index,
149 opacity = _ref.opacity;
150 var darkColorString = new TinyColor(opts.backgroundColor || '#141414').mix(patterns[index], opacity * 100).toHexString();
151 return darkColorString;
152 });
153 }
154
155 return patterns;
156}
157//# sourceMappingURL=generate.js.map