1+ import 'package:color/color.dart' ;
2+
13String colorFromHex (String hexColor) {
24 hexColor = hexColor.toUpperCase ().replaceFirst ('#' , '' );
35 if (hexColor.length == 6 ) {
@@ -7,68 +9,101 @@ String colorFromHex(String hexColor) {
79}
810
911/// [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
1113Map <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" );
1416 final baseDark = primary * primary;
1517 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 (),
2628 };
2729}
2830
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+ }
4451
45- int get b => (0x000000ff & value) >> 0 ;
52+ extension _ColorExt on Color {
53+ String toHexString () {
54+ return '0xFF${toHexColor ().toString ().toUpperCase ()}' ;
55+ }
4656
4757 // 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 (),
5363 );
5464 }
5565
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+ ];
5875 }
5976
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) {
6679 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);
7383 }
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+ );
74109}
0 commit comments