utility_palettes 0.1.1 → 1.0.0
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.
- checksums.yaml +4 -4
- data/README.md +135 -123
- data/Rakefile +8 -8
- data/lib/generators/templates/config/utility_palettes.rb +54 -0
- data/lib/generators/utility_palettes/config_generator.rb +13 -13
- data/lib/generators/utility_palettes/generate_generator.rb +29 -35
- data/lib/utility_palettes/configuration.rb +82 -25
- data/lib/utility_palettes/defaults.rb +48 -46
- data/lib/utility_palettes/outputs.rb +122 -122
- data/lib/utility_palettes/palettes.rb +128 -133
- data/lib/utility_palettes/sequences.rb +88 -90
- data/lib/utility_palettes/swatch.rb +107 -108
- data/lib/utility_palettes/version.rb +5 -5
- data/lib/utility_palettes.rb +18 -16
- metadata +3 -4
- data/lib/generators/templates/config/utility_palettes.yml +0 -36
- data/lib/utility_palettes/validations.rb +0 -24
@@ -1,90 +1,88 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'color_converters'
|
4
|
-
require 'bigdecimal'
|
5
|
-
|
6
|
-
# an increase in the 'level' makes the percieved colour darker
|
7
|
-
|
8
|
-
module UtilityPalettes
|
9
|
-
class Sequences
|
10
|
-
def self.hsl(colour, level_change
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
90
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'color_converters'
|
4
|
+
require 'bigdecimal'
|
5
|
+
|
6
|
+
# an increase in the 'level' makes the percieved colour darker
|
7
|
+
|
8
|
+
module UtilityPalettes
|
9
|
+
class Sequences
|
10
|
+
def self.hsl(colour, level_change)
|
11
|
+
colour_hsl = colour.hsl
|
12
|
+
configuration = UtilityPalettes.configuration
|
13
|
+
|
14
|
+
# Use BigDecimal for precise decimal arithmetic
|
15
|
+
h_value = (BigDecimal(colour_hsl[:h].to_s) - BigDecimal((level_change * configuration.steps_h).to_s)) % 360
|
16
|
+
s_value = (BigDecimal(colour_hsl[:s].to_s) - BigDecimal((level_change * configuration.steps_s).to_s)).clamp(0, 100)
|
17
|
+
l_value = (BigDecimal(colour_hsl[:l].to_s) - BigDecimal((level_change * configuration.steps_l).to_s)).clamp(0, 100)
|
18
|
+
|
19
|
+
ColorConverters::Color.new(h: h_value.to_f, s: s_value.to_f, l: l_value.to_f)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.rgb(colour, level_change)
|
23
|
+
colour_rgb = colour.rgb
|
24
|
+
configuration = UtilityPalettes.configuration
|
25
|
+
|
26
|
+
# Use BigDecimal for precise decimal arithmetic
|
27
|
+
r_value = (BigDecimal(colour_rgb[:r].to_s) - BigDecimal((level_change * configuration.steps_r).to_s)).clamp(0, 255)
|
28
|
+
g_value = (BigDecimal(colour_rgb[:g].to_s) - BigDecimal((level_change * configuration.steps_g).to_s)).clamp(0, 255)
|
29
|
+
b_value = (BigDecimal(colour_rgb[:b].to_s) - BigDecimal((level_change * configuration.steps_b).to_s)).clamp(0, 255)
|
30
|
+
|
31
|
+
ColorConverters::Color.new(r: r_value.to_f, g: g_value.to_f, b: b_value.to_f)
|
32
|
+
end
|
33
|
+
|
34
|
+
# def tailwind(_colour, _step, _go_lighter, _increment_steppers)
|
35
|
+
# # def pSBC(p, _c0, _c1, l)
|
36
|
+
# # r = nil
|
37
|
+
# # g = nil
|
38
|
+
# # b = nil
|
39
|
+
# # pP = nil
|
40
|
+
# # f = nil
|
41
|
+
# # t = nil
|
42
|
+
|
43
|
+
# # if l
|
44
|
+
# # pPr = pP * f[:r]
|
45
|
+
# # f[:g]
|
46
|
+
# # pPb = pP * f[:b]
|
47
|
+
|
48
|
+
# # ptr = p * t[:r]
|
49
|
+
# # t[:g]
|
50
|
+
# # ptb = p * t[:b]
|
51
|
+
|
52
|
+
# # r = (pPr + ptr).round
|
53
|
+
# # g = (pPb + ptb).round
|
54
|
+
# # b = (pPb + ptb).round
|
55
|
+
# # else
|
56
|
+
# # pPr = pP * (f[:r]**2)
|
57
|
+
# # pPg = pP * (f[:g]**2)
|
58
|
+
# # pPb = pP * (f[:b]**2)
|
59
|
+
|
60
|
+
# # ptr = p * (t[:r]**2)
|
61
|
+
# # ptg = p * (t[:g]**2)
|
62
|
+
# # ptb = p * (t[:b]**2)
|
63
|
+
|
64
|
+
# # r = ((pPr + ptr)**0.5).round
|
65
|
+
# # g = ((pPg + ptg)**0.5).round
|
66
|
+
# # b = ((pPb + ptb)**0.5).round
|
67
|
+
# # end
|
68
|
+
|
69
|
+
# # a = f.a
|
70
|
+
# # t = t.a
|
71
|
+
# # f = a >= 0 || t >= 0
|
72
|
+
|
73
|
+
# # t if f && a.negative?
|
74
|
+
|
75
|
+
# # a = if f
|
76
|
+
# # if a.negative?
|
77
|
+
# # t
|
78
|
+
# # else
|
79
|
+
# # t.negative? ? a : a * pP + t * p
|
80
|
+
# # end
|
81
|
+
# # else
|
82
|
+
# # 0
|
83
|
+
# # end
|
84
|
+
|
85
|
+
# ColorConverters::Color.new(r: r, g: g, b: b, a: m(a * 1000) / 1000)
|
86
|
+
# end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,108 +1,107 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module UtilityPalettes
|
4
|
-
class Swatch
|
5
|
-
# ? Single Colour's Palette
|
6
|
-
# a function to create an absolute palette that incorporates a single colour input
|
7
|
-
def self.absolute_generator(label, base_colour
|
8
|
-
@method = method
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
# # Lighter colours
|
16
|
-
# # calc the space available to create lightened colours based off the base colour
|
17
|
-
# if base_level.positive?
|
18
|
-
# (0..base_level).each do |new_level|
|
19
|
-
# new_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, new_level)
|
20
|
-
# generated_absolute_swatches = {}.merge(generated_absolute_swatches, { UtilityPalettes::Swatch.label(label, new_level) => new_colour })
|
21
|
-
# end
|
22
|
-
# end
|
23
|
-
|
24
|
-
# # Darker colours
|
25
|
-
# # calc the space available to create darkened colours based off the base colour
|
26
|
-
# if base_level < 9
|
27
|
-
# (base_level..9).each do |new_level|
|
28
|
-
# new_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, new_level)
|
29
|
-
# generated_absolute_swatches = {}.merge(generated_absolute_swatches, { UtilityPalettes::Swatch.label(label, new_level) => new_colour })
|
30
|
-
# end
|
31
|
-
# end
|
32
|
-
|
33
|
-
if base_level.positive?
|
34
|
-
(0..9).each do |new_level|
|
35
|
-
new_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, new_level)
|
36
|
-
generated_absolute_swatches
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
generated_absolute_swatches
|
41
|
-
end
|
42
|
-
|
43
|
-
# ? Single Colour's Relative Palette
|
44
|
-
# a function to create a relative palette centred on a single colour input
|
45
|
-
def self.relative_generator(label, base_colour
|
46
|
-
@method = method
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
generated_relative_swatches
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
#
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
# const
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module UtilityPalettes
|
4
|
+
class Swatch
|
5
|
+
# ? Single Colour's Palette
|
6
|
+
# a function to create an absolute palette that incorporates a single colour input
|
7
|
+
def self.absolute_generator(label, base_colour)
|
8
|
+
@method = UtilityPalettes.configuration.method
|
9
|
+
|
10
|
+
# colours are index inversely to their lightness
|
11
|
+
base_level = UtilityPalettes::Swatch.base_lightness_index(base_colour)
|
12
|
+
generated_absolute_swatches = { UtilityPalettes::Swatch.label(label, base_level) => base_colour }
|
13
|
+
|
14
|
+
# TODO: remove once confident the lower loop is equivalent to these
|
15
|
+
# # Lighter colours
|
16
|
+
# # calc the space available to create lightened colours based off the base colour
|
17
|
+
# if base_level.positive?
|
18
|
+
# (0..base_level).each do |new_level|
|
19
|
+
# new_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, new_level)
|
20
|
+
# generated_absolute_swatches = {}.merge(generated_absolute_swatches, { UtilityPalettes::Swatch.label(label, new_level) => new_colour })
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
|
24
|
+
# # Darker colours
|
25
|
+
# # calc the space available to create darkened colours based off the base colour
|
26
|
+
# if base_level < 9
|
27
|
+
# (base_level..9).each do |new_level|
|
28
|
+
# new_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, new_level)
|
29
|
+
# generated_absolute_swatches = {}.merge(generated_absolute_swatches, { UtilityPalettes::Swatch.label(label, new_level) => new_colour })
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
|
33
|
+
if base_level.positive?
|
34
|
+
(0..9).each do |new_level|
|
35
|
+
new_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, new_level)
|
36
|
+
generated_absolute_swatches.merge!({ UtilityPalettes::Swatch.label(label, new_level) => new_colour })
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
generated_absolute_swatches
|
41
|
+
end
|
42
|
+
|
43
|
+
# ? Single Colour's Relative Palette
|
44
|
+
# a function to create a relative palette centred on a single colour input
|
45
|
+
def self.relative_generator(label, base_colour)
|
46
|
+
@method = UtilityPalettes.configuration.method
|
47
|
+
|
48
|
+
lighter_colour = nil
|
49
|
+
darker_colour = nil
|
50
|
+
|
51
|
+
# colours are index inversely to their lightness
|
52
|
+
base_level = UtilityPalettes::Swatch.base_lightness_index(base_colour)
|
53
|
+
generated_relative_swatches = { label => base_colour }
|
54
|
+
|
55
|
+
# Lighter Colour
|
56
|
+
if base_level > 1
|
57
|
+
lighter_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level + 2)
|
58
|
+
elsif base_level.positive?
|
59
|
+
lighter_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level + 1)
|
60
|
+
else
|
61
|
+
lighter_colour = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
# Darker Colour
|
65
|
+
if base_level < 8
|
66
|
+
darker_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level - 2)
|
67
|
+
elsif base_level < 9
|
68
|
+
darker_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level - 1)
|
69
|
+
else
|
70
|
+
darker_colour = nil
|
71
|
+
end
|
72
|
+
|
73
|
+
generated_relative_swatches.merge!({ "#{label}-light" => lighter_colour })
|
74
|
+
generated_relative_swatches.merge!({ "#{label}-dark" => darker_colour })
|
75
|
+
|
76
|
+
generated_relative_swatches
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.base_lightness_index(colour)
|
80
|
+
9 - (colour.hsl[:l] / 10).floor
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.label(label, index)
|
84
|
+
levels = { '0' => 50, '1' => 100, '2' => 200, '3' => 300, '4' => 400, '5' => 500, '6' => 600, '7' => 700, '8' => 800, '9' => 900 }
|
85
|
+
|
86
|
+
[label, levels.dig(index.to_s)].join('-')
|
87
|
+
end
|
88
|
+
|
89
|
+
# TODO: create other sequence methods
|
90
|
+
# ? How to Calculate the next colour in the Palette
|
91
|
+
def self.generate(colour, base_level, new_level)
|
92
|
+
case @method
|
93
|
+
when 'hsl'
|
94
|
+
UtilityPalettes::Sequences.hsl(colour, new_level - base_level)
|
95
|
+
when 'rgb'
|
96
|
+
# TODO
|
97
|
+
else
|
98
|
+
UtilityPalettes::Sequences.hsl(colour, new_level - base_level)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def build_step_check
|
103
|
+
# const ALL_LEVELS = [50, 100, 200, 300, 400, 600, 700, 800, 900];
|
104
|
+
# const levels = options.levels == null ? ALL_LEVELS : options.levels.filter(level => ALL_LEVELS.includes(level));
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module UtilityPalettes
|
4
|
-
VERSION = '0.
|
5
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module UtilityPalettes
|
4
|
+
VERSION = '1.0.0'
|
5
|
+
end
|
data/lib/utility_palettes.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require_relative 'utility_palettes/
|
7
|
-
|
8
|
-
require_relative 'utility_palettes/
|
9
|
-
require_relative 'utility_palettes/
|
10
|
-
require_relative 'utility_palettes/
|
11
|
-
require_relative 'utility_palettes/
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
require_relative 'utility_palettes/version'
|
7
|
+
|
8
|
+
require_relative 'utility_palettes/configuration'
|
9
|
+
require_relative 'utility_palettes/defaults'
|
10
|
+
require_relative 'utility_palettes/outputs'
|
11
|
+
require_relative 'utility_palettes/palettes'
|
12
|
+
require_relative 'utility_palettes/sequences'
|
13
|
+
require_relative 'utility_palettes/swatch'
|
14
|
+
|
15
|
+
module UtilityPalettes
|
16
|
+
class Error < StandardError; end
|
17
|
+
# Your code goes here...
|
18
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: utility_palettes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Louis Davis
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-09-02 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: color_converters
|
@@ -34,7 +34,7 @@ extra_rdoc_files: []
|
|
34
34
|
files:
|
35
35
|
- README.md
|
36
36
|
- Rakefile
|
37
|
-
- lib/generators/templates/config/utility_palettes.
|
37
|
+
- lib/generators/templates/config/utility_palettes.rb
|
38
38
|
- lib/generators/utility_palettes/config_generator.rb
|
39
39
|
- lib/generators/utility_palettes/generate_generator.rb
|
40
40
|
- lib/utility_palettes.rb
|
@@ -44,7 +44,6 @@ files:
|
|
44
44
|
- lib/utility_palettes/palettes.rb
|
45
45
|
- lib/utility_palettes/sequences.rb
|
46
46
|
- lib/utility_palettes/swatch.rb
|
47
|
-
- lib/utility_palettes/validations.rb
|
48
47
|
- lib/utility_palettes/version.rb
|
49
48
|
homepage: https://github.com/louiswdavis/utility_palettes
|
50
49
|
licenses:
|
@@ -1,36 +0,0 @@
|
|
1
|
-
development:
|
2
|
-
utility_palettes:
|
3
|
-
defaults:
|
4
|
-
absolutes: true
|
5
|
-
relatives: true
|
6
|
-
singles: true
|
7
|
-
output:
|
8
|
-
dated: false
|
9
|
-
files: 'json, scss, css'
|
10
|
-
format: 'hex'
|
11
|
-
prefix: ''
|
12
|
-
suffix: ''
|
13
|
-
method: 'hsl'
|
14
|
-
steps:
|
15
|
-
h: 0
|
16
|
-
s: 3
|
17
|
-
l: 8
|
18
|
-
absolutes:
|
19
|
-
teal: '#2cb1bc'
|
20
|
-
orange: '#e35f00'
|
21
|
-
green: '#28b840'
|
22
|
-
purple: '#4f3bbf'
|
23
|
-
relatives:
|
24
|
-
success: '#28b840'
|
25
|
-
information: '#2cb1bc'
|
26
|
-
singles:
|
27
|
-
grey-50: '#fafafa'
|
28
|
-
grey-100: '#f5f5f5'
|
29
|
-
grey-200: '#e5e5e5'
|
30
|
-
grey-300: '#d4d4d4'
|
31
|
-
grey-400: '#a3a3a3'
|
32
|
-
grey-500: '#737373'
|
33
|
-
grey-600: '#525252'
|
34
|
-
grey-700: '#404040'
|
35
|
-
grey-800: '#262626'
|
36
|
-
grey-900: '#171717'
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module UtilityPalettes
|
4
|
-
class Validations
|
5
|
-
def self.validate_config(config)
|
6
|
-
sequence_options = ['hsl']
|
7
|
-
warn "ERROR: The colour sequence method you have submitted to Utility Palettes < #{config[:steps]} > is not available (#{sequence_options.to_sentence})" if !config[:method].nil? && !config[:method].to_s.in?(sequence_options)
|
8
|
-
|
9
|
-
warn "ERROR: The colour sequence steps you have submitted to Utility Palettes < #{config[:steps]} > have not been formatted as a hash" if !config[:steps].nil? && !config[:steps].is_a?(Hash)
|
10
|
-
|
11
|
-
warn "ERROR: The absolute swatches you have submitted to Utility Palettes < #{config[:absolutes]} > have not been formatted as a hash" if !config[:absolutes].nil? && !config[:absolutes].is_a?(Hash)
|
12
|
-
|
13
|
-
warn "ERROR: The relative swatches you have submitted to Utility Palettes < #{config[:relatives]} > have not been formatted as a hash" if !config[:relatives].nil? && !config[:relatives].is_a?(Hash)
|
14
|
-
|
15
|
-
warn "ERROR: The single swatches you have submitted to Utility Palettes < #{config[:singles]} > have not been formatted as a hash" if !config[:singles].nil? && !config[:singles].is_a?(Hash)
|
16
|
-
|
17
|
-
config_keys = config.keys - [:defaults, :output, :method, :steps, :absolutes, :relatives, :singles, :disabled]
|
18
|
-
|
19
|
-
warn "WARNING: Utility Palettes does not recognize the following keys; #{config_keys.join(', ')}. Please check they match the spelling of documented palette keys in order for them to be used." if config_keys.present?
|
20
|
-
|
21
|
-
true
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|