utility_palettes 0.1.1 → 1.0.1

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.
@@ -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, increment_steppers)
11
- h_step = increment_steppers[:h_step]
12
- s_step = increment_steppers[:s_step]
13
- l_step = increment_steppers[:l_step]
14
-
15
- # Use BigDecimal for precise decimal arithmetic
16
- h_value = (BigDecimal(colour.hsl[:h].to_s) - BigDecimal((level_change * h_step).to_s)) % 360
17
- s_value = (BigDecimal(colour.hsl[:s].to_s) - BigDecimal((level_change * s_step).to_s)).clamp(0, 100)
18
- l_value = (BigDecimal(colour.hsl[:l].to_s) - BigDecimal((level_change * l_step).to_s)).clamp(0, 100)
19
-
20
- ColorConverters::Color.new(h: h_value.to_f, s: s_value.to_f, l: l_value.to_f)
21
- end
22
-
23
- def self.rgb(colour, level_change, increment_steppers)
24
- r_step = increment_steppers[:r_step] || increment_steppers[:rgb_step]
25
- g_step = increment_steppers[:g_step] || increment_steppers[:rgb_step]
26
- b_step = increment_steppers[:b_step] || increment_steppers[:rgb_step]
27
-
28
- # Use BigDecimal for precise decimal arithmetic
29
- r_value = (BigDecimal(colour.rgb[:r].to_s) - BigDecimal((level_change * r_step).to_s)).clamp(0, 255).to_f
30
- g_value = (BigDecimal(colour.rgb[:g].to_s) - BigDecimal((level_change * g_step).to_s)).clamp(0, 255).to_f
31
- b_value = (BigDecimal(colour.rgb[:b].to_s) - BigDecimal((level_change * b_step).to_s)).clamp(0, 255).to_f
32
-
33
- ColorConverters::Color.new(r: r_value, g: g_value, b: b_value)
34
- end
35
-
36
- def tailwind(_colour, _step, _go_lighter, _increment_steppers)
37
- # def pSBC(p, _c0, _c1, l)
38
- # r = nil
39
- # g = nil
40
- # b = nil
41
- # pP = nil
42
- # f = nil
43
- # t = nil
44
-
45
- # if l
46
- # pPr = pP * f[:r]
47
- # f[:g]
48
- # pPb = pP * f[:b]
49
-
50
- # ptr = p * t[:r]
51
- # t[:g]
52
- # ptb = p * t[:b]
53
-
54
- # r = (pPr + ptr).round
55
- # g = (pPb + ptb).round
56
- # b = (pPb + ptb).round
57
- # else
58
- # pPr = pP * (f[:r]**2)
59
- # pPg = pP * (f[:g]**2)
60
- # pPb = pP * (f[:b]**2)
61
-
62
- # ptr = p * (t[:r]**2)
63
- # ptg = p * (t[:g]**2)
64
- # ptb = p * (t[:b]**2)
65
-
66
- # r = ((pPr + ptr)**0.5).round
67
- # g = ((pPg + ptg)**0.5).round
68
- # b = ((pPb + ptb)**0.5).round
69
- # end
70
-
71
- # a = f.a
72
- # t = t.a
73
- # f = a >= 0 || t >= 0
74
-
75
- # t if f && a.negative?
76
-
77
- # a = if f
78
- # if a.negative?
79
- # t
80
- # else
81
- # t.negative? ? a : a * pP + t * p
82
- # end
83
- # else
84
- # 0
85
- # end
86
-
87
- ColorConverters::Color.new(r: r, g: g, b: b, a: m(a * 1000) / 1000)
88
- end
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, method, increment_steppers)
8
- @method = method
9
- @increment_steppers = increment_steppers
10
-
11
- # colours are index inversely to their lightness
12
- base_level = UtilityPalettes::Swatch.base_lightness_index(base_colour)
13
- generated_absolute_swatches = {}.merge({ UtilityPalettes::Swatch.label(label, base_level) => base_colour })
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 = {}.merge(generated_absolute_swatches, { 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, method, increment_steppers)
46
- @method = method
47
- @increment_steppers = increment_steppers
48
-
49
- lighter_colour = nil
50
- darker_colour = nil
51
-
52
- # colours are index inversely to their lightness
53
- base_level = UtilityPalettes::Swatch.base_lightness_index(base_colour)
54
- generated_relative_swatches = {}.merge({ label => base_colour })
55
-
56
- # Lighter Colour
57
- if base_level > 1
58
- lighter_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level + 2)
59
- elsif base_level > 0
60
- lighter_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level + 1)
61
- else
62
- lighter_colour = nil
63
- end
64
-
65
- # Darker Colour
66
- if base_level < 8
67
- darker_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level - 2)
68
- elsif base_level < 9
69
- darker_colour = UtilityPalettes::Swatch.generate(base_colour, base_level, base_level - 1)
70
- else
71
- darker_colour = nil
72
- end
73
-
74
- generated_relative_swatches = {}.merge(generated_relative_swatches, { "#{label}-light" => lighter_colour })
75
- generated_relative_swatches = {}.merge(generated_relative_swatches, { "#{label}-dark" => darker_colour })
76
-
77
- generated_relative_swatches
78
- end
79
-
80
- def self.base_lightness_index(colour)
81
- 9 - (colour.hsl[:l] / 10).floor
82
- end
83
-
84
- def self.label(label, index)
85
- levels = { '0' => 50, '1' => 100, '2' => 200, '3' => 300, '4' => 400, '5' => 500, '6' => 600, '7' => 700, '8' => 800, '9' => 900 }
86
-
87
- [label, levels.dig(index.to_s)].join('-')
88
- end
89
-
90
- # TODO: create other sequence methods
91
- # ? How to Calculate the next colour in the Palette
92
- def self.generate(colour, base_level, new_level)
93
- case @method
94
- when 'hsl'
95
- UtilityPalettes::Sequences.hsl(colour, new_level - base_level, @increment_steppers)
96
- when 'rgb'
97
- # TODO
98
- else
99
- UtilityPalettes::Sequences.hsl(colour, new_level - base_level, @increment_steppers)
100
- end
101
- end
102
-
103
- def build_step_check
104
- # const ALL_LEVELS = [50, 100, 200, 300, 400, 600, 700, 800, 900];
105
- # const levels = options.levels == null ? ALL_LEVELS : options.levels.filter(level => ALL_LEVELS.includes(level));
106
- end
107
- end
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.1.1'
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module UtilityPalettes
4
+ VERSION = '1.0.1'
5
+ end
@@ -1,16 +1,18 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'utility_palettes/version'
4
-
5
- require_relative 'utility_palettes/configuration'
6
- require_relative 'utility_palettes/defaults'
7
- require_relative 'utility_palettes/outputs'
8
- require_relative 'utility_palettes/palettes'
9
- require_relative 'utility_palettes/sequences'
10
- require_relative 'utility_palettes/swatch'
11
- require_relative 'utility_palettes/validations'
12
-
13
- module UtilityPalettes
14
- class Error < StandardError; end
15
- # Your code goes here...
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.1.1
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Louis Davis
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-08-08 00:00:00.000000000 Z
10
+ date: 2025-09-04 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.yml
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