1
+ import 'package:color/color.dart' ;
2
+
1
3
String colorFromHex (String hexColor) {
2
4
hexColor = hexColor.toUpperCase ().replaceFirst ('#' , '' );
3
5
if (hexColor.length == 6 ) {
@@ -7,68 +9,101 @@ String colorFromHex(String hexColor) {
7
9
}
8
10
9
11
/// [Material Design Color Generator] (https://github.com/mbitson/mcg)
10
- /// Constantin logic: https://github.com/mbitson/mcg/blob/858cffea0d79ac143d590d110fbe20a1ea54d59d/scripts/controllers/ColorGeneratorCtrl.js#L238
12
+ /// Constantin/Buckner logic: https://github.com/mbitson/mcg/blob/858cffea0d79ac143d590d110fbe20a1ea54d59d/scripts/controllers/ColorGeneratorCtrl.js#L238
11
13
Map <int , String > swatchFromPrimaryHex (String primaryHex) {
12
- final primary = _Rgb . fromHex ( int . parse ( primaryHex) );
13
- const baseLight = _Rgb . fromHex ( 0xffffff );
14
+ final primary = Color . hex ( primaryHex);
15
+ final baseLight = Color . hex ( "ffffff" );
14
16
final baseDark = primary * primary;
15
17
return {
16
- 50 : _Rgb . mix (baseLight, primary, 12 ).toHexString (),
17
- 100 : _Rgb . mix (baseLight, primary, 30 ).toHexString (),
18
- 200 : _Rgb . mix (baseLight, primary, 50 ).toHexString (),
19
- 300 : _Rgb . mix (baseLight, primary, 70 ).toHexString (),
20
- 400 : _Rgb . mix (baseLight, primary, 85 ).toHexString (),
21
- 500 : _Rgb . mix (baseLight, primary, 100 ).toHexString (),
22
- 600 : _Rgb . mix (baseDark, primary, 87 ).toHexString (),
23
- 700 : _Rgb . mix (baseDark, primary, 70 ).toHexString (),
24
- 800 : _Rgb . mix (baseDark, primary, 54 ).toHexString (),
25
- 900 : _Rgb . mix (baseDark, primary, 25 ).toHexString (),
18
+ 50 : _mix (baseLight, primary, 12 ).toHexString (),
19
+ 100 : _mix (baseLight, primary, 30 ).toHexString (),
20
+ 200 : _mix (baseLight, primary, 50 ).toHexString (),
21
+ 300 : _mix (baseLight, primary, 70 ).toHexString (),
22
+ 400 : _mix (baseLight, primary, 85 ).toHexString (),
23
+ 500 : _mix (baseLight, primary, 100 ).toHexString (),
24
+ 600 : _mix (baseDark, primary, 87 ).toHexString (),
25
+ 700 : _mix (baseDark, primary, 70 ).toHexString (),
26
+ 800 : _mix (baseDark, primary, 54 ).toHexString (),
27
+ 900 : _mix (baseDark, primary, 25 ).toHexString (),
26
28
};
27
29
}
28
30
29
- class _Rgb {
30
- const _Rgb (int r, int g, int b)
31
- : value = ((0xff << 24 ) |
32
- ((r & 0xff ) << 16 ) |
33
- ((g & 0xff ) << 8 ) |
34
- ((b & 0xff ) << 0 )) &
35
- 0xFFFFFFFF ;
36
-
37
- const _Rgb .fromHex (int value) : value = (value | 0xFF000000 ) & 0xFFFFFFFF ;
38
-
39
- final int value;
40
-
41
- int get r => (0x00ff0000 & value) >> 16 ;
42
-
43
- int get g => (0x0000ff00 & value) >> 8 ;
31
+ /// Buckner logic: https://github.com/mbitson/mcg/blob/858cffea0d79ac143d590d110fbe20a1ea54d59d/scripts/controllers/ColorGeneratorCtrl.js#L275
32
+ Map <int , String > accentSwatchFromPrimaryHex (String primaryHex) {
33
+ final primary = Color .hex (primaryHex);
34
+ final baseDark = primary * primary;
35
+ final baseTriad = primary.tetrad ();
36
+ return {
37
+ 100 :
38
+ _mix (baseDark, baseTriad[3 ], 15 ).saturate (80 ).lighten (48 ).toHexString (),
39
+ 200 :
40
+ _mix (baseDark, baseTriad[3 ], 15 ).saturate (80 ).lighten (36 ).toHexString (),
41
+ 400 : _mix (baseDark, baseTriad[3 ], 15 )
42
+ .saturate (100 )
43
+ .lighten (31 )
44
+ .toHexString (),
45
+ 700 : _mix (baseDark, baseTriad[3 ], 15 )
46
+ .saturate (100 )
47
+ .lighten (28 )
48
+ .toHexString (),
49
+ };
50
+ }
44
51
45
- int get b => (0x000000ff & value) >> 0 ;
52
+ extension _ColorExt on Color {
53
+ String toHexString () {
54
+ return '0xFF${toHexColor ().toString ().toUpperCase ()}' ;
55
+ }
46
56
47
57
// https://github.com/mbitson/mcg/blob/858cffea0d79ac143d590d110fbe20a1ea54d59d/scripts/controllers/ColorGeneratorCtrl.js#L221
48
- _Rgb operator * (_Rgb other) {
49
- return _Rgb (
50
- (r * other.r / 255 ).floor (),
51
- (g * other.g / 255 ).floor (),
52
- (b * other.b / 255 ).floor (),
58
+ Color operator * (Color other) {
59
+ return Color . rgb (
60
+ (toRgbColor (). r * other. toRgbColor () .r / 255 ).floor (),
61
+ (toRgbColor (). g * other. toRgbColor () .g / 255 ).floor (),
62
+ (toRgbColor (). b * other. toRgbColor () .b / 255 ).floor (),
53
63
);
54
64
}
55
65
56
- String toHexString () {
57
- return '0x${value .toRadixString (16 ).padLeft (8 , '0' ).toUpperCase ()}' ;
66
+ // https://github.com/bgrins/TinyColor/blob/ab58ca0a3738dc06b7e64c749cebfd5d6fb5044c/tinycolor.js#L647
67
+ List <Color > tetrad () {
68
+ final hsl = toHslColor ();
69
+ return [
70
+ this ,
71
+ Color .hsl ((hsl.h + 90 ) % 360 , hsl.s, hsl.l),
72
+ Color .hsl ((hsl.h + 180 ) % 360 , hsl.s, hsl.l),
73
+ Color .hsl ((hsl.h + 270 ) % 360 , hsl.s, hsl.l),
74
+ ];
58
75
}
59
76
60
- // https://github.com/bgrins/TinyColor/blob/96592a5cacdbf4d4d16cd7d39d4d6dd28da9bd5f/tinycolor.js#L701
61
- static _Rgb mix (
62
- _Rgb color1,
63
- _Rgb color2,
64
- int amount,
65
- ) {
77
+ // https://github.com/bgrins/TinyColor/blob/ab58ca0a3738dc06b7e64c749cebfd5d6fb5044c/tinycolor.js#L580
78
+ Color saturate (int amount) {
66
79
assert (amount >= 0 && amount <= 100 );
67
- final p = amount / 100 ;
68
- return _Rgb (
69
- ((color2.r - color1.r) * p + color1.r).round (),
70
- ((color2.g - color1.g) * p + color1.g).round (),
71
- ((color2.b - color1.b) * p + color1.b).round (),
72
- );
80
+ final hsl = toHslColor ();
81
+ final s = (hsl.s + amount).clamp (0 , 100 );
82
+ return Color .hsl (hsl.h, s, hsl.l);
73
83
}
84
+
85
+ // https://github.com/bgrins/TinyColor/blob/ab58ca0a3738dc06b7e64c749cebfd5d6fb5044c/tinycolor.js#L592
86
+ Color lighten (int amount) {
87
+ assert (amount >= 0 && amount <= 100 );
88
+ final hsl = toHslColor ();
89
+ final l = (hsl.l + amount).clamp (0 , 100 );
90
+ return Color .hsl (hsl.h, hsl.s, l);
91
+ }
92
+ }
93
+
94
+ // https://github.com/bgrins/TinyColor/blob/96592a5cacdbf4d4d16cd7d39d4d6dd28da9bd5f/tinycolor.js#L701
95
+ Color _mix (
96
+ Color color1,
97
+ Color color2,
98
+ int amount,
99
+ ) {
100
+ assert (amount >= 0 && amount <= 100 );
101
+ final p = amount / 100 ;
102
+ final _color1 = color1.toRgbColor ();
103
+ final _color2 = color2.toRgbColor ();
104
+ return Color .rgb (
105
+ ((_color2.r - _color1.r) * p + _color1.r).round (),
106
+ ((_color2.g - _color1.g) * p + _color1.g).round (),
107
+ ((_color2.b - _color1.b) * p + _color1.b).round (),
108
+ );
74
109
}
0 commit comments