sai 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/CHANGELOG.md +38 -1
- data/README.md +39 -241
- data/docs/USAGE.md +351 -0
- data/lib/sai/ansi/color_parser.rb +109 -0
- data/lib/sai/ansi/sequence_processor.rb +269 -0
- data/lib/sai/ansi/sequenced_string.rb +475 -0
- data/lib/sai/ansi/style_parser.rb +66 -0
- data/lib/sai/ansi.rb +0 -27
- data/lib/sai/conversion/color_sequence.rb +4 -4
- data/lib/sai/conversion/rgb/color_classifier.rb +209 -0
- data/lib/sai/conversion/rgb/color_indexer.rb +48 -0
- data/lib/sai/conversion/rgb/color_space.rb +192 -0
- data/lib/sai/conversion/rgb/color_transformer.rb +140 -0
- data/lib/sai/conversion/rgb.rb +23 -269
- data/lib/sai/decorator/color_manipulations.rb +157 -0
- data/lib/sai/decorator/delegation.rb +84 -0
- data/lib/sai/decorator/gradients.rb +363 -0
- data/lib/sai/decorator/hex_colors.rb +56 -0
- data/lib/sai/decorator/named_colors.rb +780 -0
- data/lib/sai/decorator/named_styles.rb +276 -0
- data/lib/sai/decorator/rgb_colors.rb +64 -0
- data/lib/sai/decorator.rb +35 -795
- data/lib/sai/mode_selector.rb +19 -19
- data/lib/sai/named_colors.rb +437 -0
- data/lib/sai.rb +753 -23
- data/sig/manifest.yaml +3 -0
- data/sig/sai/ansi/color_parser.rbs +77 -0
- data/sig/sai/ansi/sequence_processor.rbs +178 -0
- data/sig/sai/ansi/sequenced_string.rbs +380 -0
- data/sig/sai/ansi/style_parser.rbs +59 -0
- data/sig/sai/ansi.rbs +0 -10
- data/sig/sai/conversion/rgb/color_classifier.rbs +165 -0
- data/sig/sai/conversion/rgb/color_indexer.rbs +41 -0
- data/sig/sai/conversion/rgb/color_space.rbs +129 -0
- data/sig/sai/conversion/rgb/color_transformer.rbs +99 -0
- data/sig/sai/conversion/rgb.rbs +15 -198
- data/sig/sai/decorator/color_manipulations.rbs +125 -0
- data/sig/sai/decorator/delegation.rbs +47 -0
- data/sig/sai/decorator/gradients.rbs +267 -0
- data/sig/sai/decorator/hex_colors.rbs +48 -0
- data/sig/sai/decorator/named_colors.rbs +1491 -0
- data/sig/sai/decorator/named_styles.rbs +72 -0
- data/sig/sai/decorator/rgb_colors.rbs +52 -0
- data/sig/sai/decorator.rbs +25 -202
- data/sig/sai/mode_selector.rbs +19 -19
- data/sig/sai/named_colors.rbs +65 -0
- data/sig/sai.rbs +1485 -44
- metadata +38 -4
data/sig/sai/ansi.rbs
CHANGED
@@ -18,16 +18,6 @@ module Sai
|
|
18
18
|
# @return [Hash{Symbol => Integer}] the color codes
|
19
19
|
COLOR_CODES: untyped
|
20
20
|
|
21
|
-
# Standard ANSI color names and their RGB values
|
22
|
-
#
|
23
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
24
|
-
# @since 0.1.0
|
25
|
-
#
|
26
|
-
# @api private
|
27
|
-
#
|
28
|
-
# @return [Hash{Symbol => Array<Integer>}] the color names and RGB values
|
29
|
-
COLOR_NAMES: untyped
|
30
|
-
|
31
21
|
# ANSI escape sequence for resetting text formatting
|
32
22
|
#
|
33
23
|
# @author {https://aaronmallen.me Aaron Allen}
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# Generated from lib/sai/conversion/rgb/color_classifier.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Sai
|
4
|
+
module Conversion
|
5
|
+
module RGB
|
6
|
+
# Classify color characteristics
|
7
|
+
#
|
8
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
9
|
+
# @since 0.3.1
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
module ColorClassifier
|
13
|
+
# Get closest ANSI color for RGB values
|
14
|
+
#
|
15
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
16
|
+
# @since 0.1.0
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
#
|
20
|
+
# @param red [Float] the red component (0-1)
|
21
|
+
# @param green [Float] the green component (0-1)
|
22
|
+
# @param blue [Float] the blue component (0-1)
|
23
|
+
#
|
24
|
+
# @return [Symbol] the closest ANSI color name
|
25
|
+
# @rbs (Float red, Float green, Float blue) -> Symbol
|
26
|
+
def self.closest_ansi_color: (Float red, Float green, Float blue) -> Symbol
|
27
|
+
|
28
|
+
# Determine if a color is dark
|
29
|
+
#
|
30
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
31
|
+
# @since 0.1.0
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
#
|
35
|
+
# @param red [Float] the red component (0-1)
|
36
|
+
# @param green [Float] the green component (0-1)
|
37
|
+
# @param blue [Float] the blue component (0-1)
|
38
|
+
#
|
39
|
+
# @return [Boolean] true if color is dark
|
40
|
+
# @rbs (Float red, Float green, Float blue) -> bool
|
41
|
+
def self.dark?: (Float red, Float green, Float blue) -> bool
|
42
|
+
|
43
|
+
# Determine if a color is grayscale
|
44
|
+
#
|
45
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
46
|
+
# @since 0.1.0
|
47
|
+
#
|
48
|
+
# @api private
|
49
|
+
#
|
50
|
+
# @param red [Float] the red component (0-1)
|
51
|
+
# @param green [Float] the green component (0-1)
|
52
|
+
# @param blue [Float] the blue component (0-1)
|
53
|
+
#
|
54
|
+
# @return [Boolean] true if color is grayscale
|
55
|
+
# @rbs (Float red, Float green, Float blue) -> bool
|
56
|
+
def self.grayscale?: (Float red, Float green, Float blue) -> bool
|
57
|
+
|
58
|
+
# Determine if RGB values represent a primary color
|
59
|
+
#
|
60
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
61
|
+
# @since 0.1.0
|
62
|
+
#
|
63
|
+
# @api private
|
64
|
+
#
|
65
|
+
# @param red [Float] the red component (0-1)
|
66
|
+
# @param green [Float] the green component (0-1)
|
67
|
+
# @param blue [Float] the blue component (0-1)
|
68
|
+
#
|
69
|
+
# @return [Boolean] true if color is primary
|
70
|
+
# @rbs (Float red, Float green, Float blue) -> bool
|
71
|
+
def self.primary?: (Float red, Float green, Float blue) -> bool
|
72
|
+
|
73
|
+
# Get the closest primary color
|
74
|
+
#
|
75
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
76
|
+
# @since 0.1.0
|
77
|
+
#
|
78
|
+
# @api private
|
79
|
+
#
|
80
|
+
# @param red [Float] the red component (0-1)
|
81
|
+
# @param green [Float] the green component (0-1)
|
82
|
+
# @param blue [Float] the blue component (0-1)
|
83
|
+
#
|
84
|
+
# @return [Symbol] the primary color name
|
85
|
+
# @rbs (Float red, Float green, Float blue) -> Symbol
|
86
|
+
def self.primary_color: (Float red, Float green, Float blue) -> Symbol
|
87
|
+
|
88
|
+
# Determine if RGB values represent a secondary color
|
89
|
+
#
|
90
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
91
|
+
# @since 0.1.0
|
92
|
+
#
|
93
|
+
# @api private
|
94
|
+
#
|
95
|
+
# @param red [Float] the red component (0-1)
|
96
|
+
# @param green [Float] the green component (0-1)
|
97
|
+
# @param blue [Float] the blue component (0-1)
|
98
|
+
#
|
99
|
+
# @return [Boolean] true if color is secondary
|
100
|
+
# @rbs (Float red, Float green, Float blue) -> bool
|
101
|
+
def self.secondary?: (Float red, Float green, Float blue) -> bool
|
102
|
+
|
103
|
+
# Get the closest secondary color
|
104
|
+
#
|
105
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
106
|
+
# @since 0.1.0
|
107
|
+
#
|
108
|
+
# @api private
|
109
|
+
#
|
110
|
+
# @param red [Float] the red component (0-1)
|
111
|
+
# @param green [Float] the green component (0-1)
|
112
|
+
# @param blue [Float] the blue component (0-1)
|
113
|
+
#
|
114
|
+
# @return [Symbol] the secondary color name
|
115
|
+
# @rbs (Float red, Float green, Float blue) -> Symbol
|
116
|
+
def self.secondary_color: (Float red, Float green, Float blue) -> Symbol
|
117
|
+
|
118
|
+
# Check if RGB values represent cyan
|
119
|
+
#
|
120
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
121
|
+
# @since 0.1.0
|
122
|
+
#
|
123
|
+
# @api private
|
124
|
+
#
|
125
|
+
# @param red [Float] the red component (0-1)
|
126
|
+
# @param green [Float] the green component (0-1)
|
127
|
+
# @param blue [Float] the blue component (0-1)
|
128
|
+
#
|
129
|
+
# @return [Boolean] true if color is cyan
|
130
|
+
# @rbs (Float red, Float green, Float blue) -> bool
|
131
|
+
private def self.cyan?: (Float red, Float green, Float blue) -> bool
|
132
|
+
|
133
|
+
# Check if RGB values represent magenta
|
134
|
+
#
|
135
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
136
|
+
# @since 0.1.0
|
137
|
+
#
|
138
|
+
# @api private
|
139
|
+
#
|
140
|
+
# @param red [Float] the red component (0-1)
|
141
|
+
# @param green [Float] the green component (0-1)
|
142
|
+
# @param blue [Float] the blue component (0-1)
|
143
|
+
#
|
144
|
+
# @return [Boolean] true if color is magenta
|
145
|
+
# @rbs (Float red, Float green, Float blue) -> bool
|
146
|
+
private def self.magenta?: (Float red, Float green, Float blue) -> bool
|
147
|
+
|
148
|
+
# Check if RGB values represent yellow
|
149
|
+
#
|
150
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
151
|
+
# @since 0.1.0
|
152
|
+
#
|
153
|
+
# @api private
|
154
|
+
#
|
155
|
+
# @param red [Float] the red component (0-1)
|
156
|
+
# @param green [Float] the green component (0-1)
|
157
|
+
# @param blue [Float] the blue component (0-1)
|
158
|
+
#
|
159
|
+
# @return [Boolean] true if color is yellow
|
160
|
+
# @rbs (Float red, Float green, Float blue) -> bool
|
161
|
+
private def self.yellow?: (Float red, Float green, Float blue) -> bool
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Generated from lib/sai/conversion/rgb/color_indexer.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Sai
|
4
|
+
module Conversion
|
5
|
+
module RGB
|
6
|
+
# Color indexing utilities
|
7
|
+
#
|
8
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
9
|
+
# @since 0.3.1
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
module ColorIndexer
|
13
|
+
# Convert RGB values to 256-color cube index
|
14
|
+
#
|
15
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
16
|
+
# @since 0.1.0
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
#
|
20
|
+
# @param rgb [Array<Integer>] RGB values (0-255)
|
21
|
+
#
|
22
|
+
# @return [Integer] the color cube index
|
23
|
+
# @rbs (Array[Integer] rgb) -> Integer
|
24
|
+
def self.color_cube: (Array[Integer] rgb) -> Integer
|
25
|
+
|
26
|
+
# Convert RGB values to grayscale index
|
27
|
+
#
|
28
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
29
|
+
# @since 0.1.0
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
#
|
33
|
+
# @param rgb [Array<Integer>] RGB values
|
34
|
+
#
|
35
|
+
# @return [Integer] the grayscale index
|
36
|
+
# @rbs (Array[Integer] rgb) -> Integer
|
37
|
+
def self.grayscale: (Array[Integer] rgb) -> Integer
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# Generated from lib/sai/conversion/rgb/color_space.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Sai
|
4
|
+
module Conversion
|
5
|
+
module RGB
|
6
|
+
# Convert colors between different color space formats
|
7
|
+
#
|
8
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
9
|
+
# @since 0.3.1
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
module ColorSpace
|
13
|
+
# Convert HSV values to RGB
|
14
|
+
#
|
15
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
16
|
+
# @since 0.3.1
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
#
|
20
|
+
# @param hue [Float] the hue component (0-360)
|
21
|
+
# @param saturation [Float] the saturation component (0-1)
|
22
|
+
# @param value [Float] the value component (0-1)
|
23
|
+
#
|
24
|
+
# @return [Array<Integer>] the RGB values
|
25
|
+
# @rbs (Float hue, Float saturation, Float value) -> Array[Integer]
|
26
|
+
def self.hsv_to_rgb: (Float hue, Float saturation, Float value) -> Array[Integer]
|
27
|
+
|
28
|
+
# Convert a color value to RGB components
|
29
|
+
#
|
30
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
31
|
+
# @since 0.1.0
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
#
|
35
|
+
# @param color [String, Array<Integer>] the color to convert
|
36
|
+
#
|
37
|
+
# @raise [ArgumentError] if the color format is invalid
|
38
|
+
# @return [Array<Integer>] the RGB components
|
39
|
+
# @rbs (Array[Integer] | String | Symbol color) -> Array[Integer]
|
40
|
+
def self.resolve: (Array[Integer] | String | Symbol color) -> Array[Integer]
|
41
|
+
|
42
|
+
# Calculate the intermediate HSV components
|
43
|
+
#
|
44
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
45
|
+
# @since 0.3.1
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
#
|
49
|
+
# @param value [Float] the value component
|
50
|
+
# @param saturation [Float] the saturation component
|
51
|
+
# @param hue_remainder [Float] the remainder of hue / 60
|
52
|
+
#
|
53
|
+
# @return [Array<Float>] the primary, secondary, and tertiary components
|
54
|
+
# @rbs (Float value, Float saturation, Float hue_remainder) -> [Float, Float, Float]
|
55
|
+
private def self.calculate_hsv_components: (Float value, Float saturation, Float hue_remainder) -> [ Float, Float, Float ]
|
56
|
+
|
57
|
+
# Convert a hex string to RGB values
|
58
|
+
#
|
59
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
60
|
+
# @since 0.1.0
|
61
|
+
#
|
62
|
+
# @api private
|
63
|
+
#
|
64
|
+
# @param hex [String] the hex color code
|
65
|
+
#
|
66
|
+
# @return [Array<Integer>] the RGB components
|
67
|
+
# @rbs (String hex) -> Array[Integer]
|
68
|
+
private def self.hex_to_rgb: (String hex) -> Array[Integer]
|
69
|
+
|
70
|
+
# Convert a named color to RGB values
|
71
|
+
#
|
72
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
73
|
+
# @since 0.1.0
|
74
|
+
#
|
75
|
+
# @api private
|
76
|
+
#
|
77
|
+
# @param color_name [String] the color name
|
78
|
+
#
|
79
|
+
# @raise [ArgumentError] if the color name is unknown
|
80
|
+
# @return [Array<Integer>] the RGB components
|
81
|
+
# @rbs (String color_name) -> Array[Integer]
|
82
|
+
private def self.named_to_rgb: (String color_name) -> Array[Integer]
|
83
|
+
|
84
|
+
# Convert RGB values from 0-1 range to 0-255 range
|
85
|
+
#
|
86
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
87
|
+
# @since 0.3.1
|
88
|
+
#
|
89
|
+
# @api private
|
90
|
+
#
|
91
|
+
# @param rgb [Array<Float>] RGB values in 0-1 range
|
92
|
+
#
|
93
|
+
# @return [Array<Integer>] RGB values in 0-255 range
|
94
|
+
# @rbs (Array[Float] rgb) -> Array[Integer]
|
95
|
+
private def self.normalize_rgb: (Array[Float] rgb) -> Array[Integer]
|
96
|
+
|
97
|
+
# Select RGB values based on the hue sector
|
98
|
+
#
|
99
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
100
|
+
# @since 0.3.1
|
101
|
+
#
|
102
|
+
# @api private
|
103
|
+
#
|
104
|
+
# @param sector [Integer] the hue sector (0-5)
|
105
|
+
# @param value [Float] the value component
|
106
|
+
# @param primary [Float] primary component from HSV calculation
|
107
|
+
# @param secondary [Float] secondary component from HSV calculation
|
108
|
+
# @param tertiary [Float] tertiary component from HSV calculation
|
109
|
+
#
|
110
|
+
# @return [Array<Float>] the RGB values before normalization
|
111
|
+
# @rbs (Integer sector, Float value, Float primary, Float secondary, Float tertiary) -> Array[Float]
|
112
|
+
private def self.select_rgb_values: (Integer sector, Float value, Float primary, Float secondary, Float tertiary) -> Array[Float]
|
113
|
+
|
114
|
+
# Validate RGB values
|
115
|
+
#
|
116
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
117
|
+
# @since 0.1.0
|
118
|
+
#
|
119
|
+
# @api private
|
120
|
+
#
|
121
|
+
# @param color [Array<Integer>] the RGB components to validate
|
122
|
+
# @return [Array<Integer>] the validated RGB components
|
123
|
+
# @raise [ArgumentError] if the RGB values are invalid
|
124
|
+
# @rbs (Array[Integer] color) -> Array[Integer]
|
125
|
+
private def self.validate_rgb: (Array[Integer] color) -> Array[Integer]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# Generated from lib/sai/conversion/rgb/color_transformer.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Sai
|
4
|
+
module Conversion
|
5
|
+
module RGB
|
6
|
+
# Perform color transformations
|
7
|
+
#
|
8
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
9
|
+
# @since 0.3.1
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
module ColorTransformer
|
13
|
+
# Darken an RGB color by a percentage
|
14
|
+
#
|
15
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
16
|
+
# @since 0.3.1
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
#
|
20
|
+
# @param color [Array<Integer>, String, Symbol] the color to darken
|
21
|
+
# @param amount [Float] amount to darken by (0.0-1.0)
|
22
|
+
#
|
23
|
+
# @raise [ArgumentError] if amount is not between 0.0 and 1.0
|
24
|
+
# @return [Array<Integer>] the darkened RGB values
|
25
|
+
# @rbs ((Array[Integer] | String | Symbol) color, Float amount) -> Array[Integer]
|
26
|
+
def self.darken: (Array[Integer] | String | Symbol color, Float amount) -> Array[Integer]
|
27
|
+
|
28
|
+
# Generate a gradient between two colors with a specified number of steps
|
29
|
+
#
|
30
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
31
|
+
# @since 0.3.1
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
#
|
35
|
+
# @param start_color [Array<Integer>, String, Symbol] the starting color
|
36
|
+
# @param end_color [Array<Integer>, String, Symbol] the ending color
|
37
|
+
# @param steps [Integer] the number of colors to generate (minimum 2)
|
38
|
+
#
|
39
|
+
# @raise [ArgumentError] if steps is less than 2
|
40
|
+
# @return [Array<Array<Integer>>] the gradient colors as RGB values
|
41
|
+
# @rbs (
|
42
|
+
# (Array[Integer] | String | Symbol) start_color,
|
43
|
+
# (Array[Integer] | String | Symbol) end_color,
|
44
|
+
# Integer steps
|
45
|
+
# ) -> Array[Array[Integer]]
|
46
|
+
def self.gradient: (Array[Integer] | String | Symbol start_color, Array[Integer] | String | Symbol end_color, Integer steps) -> Array[Array[Integer]]
|
47
|
+
|
48
|
+
# Interpolate between two colors to create a gradient step
|
49
|
+
#
|
50
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
51
|
+
# @since 0.3.1
|
52
|
+
#
|
53
|
+
# @api private
|
54
|
+
#
|
55
|
+
# @param start_color [Array<Integer>, String, Symbol] the starting color
|
56
|
+
# @param end_color [Array<Integer>, String, Symbol] the ending color
|
57
|
+
# @param step [Float] the interpolation step (0.0-1.0)
|
58
|
+
#
|
59
|
+
# @raise [ArgumentError] if step is not between 0.0 and 1.0
|
60
|
+
# @return [Array<Integer>] the interpolated RGB values
|
61
|
+
# @rbs (
|
62
|
+
# (Array[Integer] | String | Symbol) start_color,
|
63
|
+
# (Array[Integer] | String | Symbol) end_color,
|
64
|
+
# Float step
|
65
|
+
# ) -> Array[Integer]
|
66
|
+
def self.interpolate_color: (Array[Integer] | String | Symbol start_color, Array[Integer] | String | Symbol end_color, Float step) -> Array[Integer]
|
67
|
+
|
68
|
+
# Lighten an RGB color by a percentage
|
69
|
+
#
|
70
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
71
|
+
# @since 0.3.1
|
72
|
+
#
|
73
|
+
# @api private
|
74
|
+
#
|
75
|
+
# @param color [Array<Integer>, String, Symbol] the color to lighten
|
76
|
+
# @param amount [Float] amount to lighten by (0.0-1.0)
|
77
|
+
#
|
78
|
+
# @raise [ArgumentError] if amount is not between 0.0 and 1.0
|
79
|
+
# @return [Array<Integer>] the lightened RGB values
|
80
|
+
# @rbs ((Array[Integer] | String | Symbol) color, Float amount) -> Array[Integer]
|
81
|
+
def self.lighten: (Array[Integer] | String | Symbol color, Float amount) -> Array[Integer]
|
82
|
+
|
83
|
+
# Generate a rainbow gradient with a specified number of steps
|
84
|
+
#
|
85
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
86
|
+
# @since 0.3.1
|
87
|
+
#
|
88
|
+
# @api private
|
89
|
+
#
|
90
|
+
# @param steps [Integer] the number of colors to generate (minimum 2)
|
91
|
+
#
|
92
|
+
# @raise [ArgumentError] if steps is less than 2
|
93
|
+
# @return [Array<Array<Integer>>] the rainbow gradient colors as RGB values
|
94
|
+
# @rbs (Integer steps) -> Array[Array[Integer]]
|
95
|
+
def self.rainbow_gradient: (Integer steps) -> Array[Array[Integer]]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/sig/sai/conversion/rgb.rbs
CHANGED
@@ -9,50 +9,27 @@ module Sai
|
|
9
9
|
#
|
10
10
|
# @api private
|
11
11
|
module RGB
|
12
|
-
#
|
12
|
+
# Color classification utilities
|
13
13
|
#
|
14
14
|
# @author {https://aaronmallen.me Aaron Allen}
|
15
|
-
# @since 0.1
|
15
|
+
# @since 0.3.1
|
16
16
|
#
|
17
17
|
# @api private
|
18
18
|
#
|
19
|
-
# @
|
20
|
-
# @
|
21
|
-
|
22
|
-
#
|
23
|
-
# @return [Symbol] the closest ANSI color name
|
24
|
-
# @rbs (Float red, Float green, Float blue) -> Symbol
|
25
|
-
def self.closest_ansi_color: (Float red, Float green, Float blue) -> Symbol
|
19
|
+
# @return [Module<ColorClassifier>] the ColorClassifier module
|
20
|
+
# @rbs () -> singleton(ColorClassifier)
|
21
|
+
def self.classify: () -> singleton(ColorClassifier)
|
26
22
|
|
27
|
-
#
|
23
|
+
# Color indexing utilities
|
28
24
|
#
|
29
25
|
# @author {https://aaronmallen.me Aaron Allen}
|
30
|
-
# @since 0.1
|
26
|
+
# @since 0.3.1
|
31
27
|
#
|
32
28
|
# @api private
|
33
29
|
#
|
34
|
-
# @
|
35
|
-
# @
|
36
|
-
|
37
|
-
#
|
38
|
-
# @return [Boolean] true if color is dark
|
39
|
-
# @rbs (Float red, Float green, Float blue) -> bool
|
40
|
-
def self.dark?: (Float red, Float green, Float blue) -> bool
|
41
|
-
|
42
|
-
# Determine if a color is grayscale
|
43
|
-
#
|
44
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
45
|
-
# @since 0.1.0
|
46
|
-
#
|
47
|
-
# @api private
|
48
|
-
#
|
49
|
-
# @param red [Float] the red component (0-1)
|
50
|
-
# @param green [Float] the green component (0-1)
|
51
|
-
# @param blue [Float] the blue component (0-1)
|
52
|
-
#
|
53
|
-
# @return [Boolean] true if color is grayscale
|
54
|
-
# @rbs (Float red, Float green, Float blue) -> bool
|
55
|
-
def self.grayscale?: (Float red, Float green, Float blue) -> bool
|
30
|
+
# @return [Module<ColorIndexer>] the ColorIndexer module
|
31
|
+
# @rbs () -> singleton(ColorIndexer)
|
32
|
+
def self.index: () -> singleton(ColorIndexer)
|
56
33
|
|
57
34
|
# Convert a color value to RGB components
|
58
35
|
#
|
@@ -68,176 +45,16 @@ module Sai
|
|
68
45
|
# @rbs (Array[Integer] | String | Symbol color) -> Array[Integer]
|
69
46
|
def self.resolve: (Array[Integer] | String | Symbol color) -> Array[Integer]
|
70
47
|
|
71
|
-
#
|
72
|
-
#
|
73
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
74
|
-
# @since 0.1.0
|
75
|
-
#
|
76
|
-
# @api private
|
77
|
-
#
|
78
|
-
# @param rgb [Array<Integer>] RGB values (0-255)
|
79
|
-
#
|
80
|
-
# @return [Integer] the color cube index
|
81
|
-
# @rbs (Array[Integer] rgb) -> Integer
|
82
|
-
def self.to_color_cube_index: (Array[Integer] rgb) -> Integer
|
83
|
-
|
84
|
-
# Convert RGB values to grayscale index
|
85
|
-
#
|
86
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
87
|
-
# @since 0.1.0
|
88
|
-
#
|
89
|
-
# @api private
|
90
|
-
#
|
91
|
-
# @param rgb [Array<Integer>] RGB values
|
92
|
-
#
|
93
|
-
# @return [Integer] the grayscale index
|
94
|
-
# @rbs (Array[Integer] rgb) -> Integer
|
95
|
-
def self.to_grayscale_index: (Array[Integer] rgb) -> Integer
|
96
|
-
|
97
|
-
# Check if RGB values represent cyan
|
98
|
-
#
|
99
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
100
|
-
# @since 0.1.0
|
101
|
-
#
|
102
|
-
# @api private
|
103
|
-
#
|
104
|
-
# @param red [Float] the red component (0-1)
|
105
|
-
# @param green [Float] the green component (0-1)
|
106
|
-
# @param blue [Float] the blue component (0-1)
|
107
|
-
#
|
108
|
-
# @return [Boolean] true if color is cyan
|
109
|
-
# @rbs (Float red, Float green, Float blue) -> bool
|
110
|
-
private def self.cyan?: (Float red, Float green, Float blue) -> bool
|
111
|
-
|
112
|
-
# Convert a hex string to RGB values
|
113
|
-
#
|
114
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
115
|
-
# @since 0.1.0
|
116
|
-
#
|
117
|
-
# @api private
|
118
|
-
#
|
119
|
-
# @param hex [String] the hex color code
|
120
|
-
#
|
121
|
-
# @return [Array<Integer>] the RGB components
|
122
|
-
# @rbs (String hex) -> Array[Integer]
|
123
|
-
private def self.hex_to_rgb: (String hex) -> Array[Integer]
|
124
|
-
|
125
|
-
# Check if RGB values represent magenta
|
48
|
+
# Transform RGB values
|
126
49
|
#
|
127
50
|
# @author {https://aaronmallen.me Aaron Allen}
|
128
|
-
# @since 0.1
|
51
|
+
# @since 0.3.1
|
129
52
|
#
|
130
53
|
# @api private
|
131
54
|
#
|
132
|
-
# @
|
133
|
-
# @
|
134
|
-
|
135
|
-
#
|
136
|
-
# @return [Boolean] true if color is magenta
|
137
|
-
# @rbs (Float red, Float green, Float blue) -> bool
|
138
|
-
private def self.magenta?: (Float red, Float green, Float blue) -> bool
|
139
|
-
|
140
|
-
# Convert a named color to RGB values
|
141
|
-
#
|
142
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
143
|
-
# @since 0.1.0
|
144
|
-
#
|
145
|
-
# @api private
|
146
|
-
#
|
147
|
-
# @param color_name [String] the color name
|
148
|
-
#
|
149
|
-
# @raise [ArgumentError] if the color name is unknown
|
150
|
-
# @return [Array<Integer>] the RGB components
|
151
|
-
# @rbs (String color_name) -> Array[Integer]
|
152
|
-
private def self.named_to_rgb: (String color_name) -> Array[Integer]
|
153
|
-
|
154
|
-
# Determine if RGB values represent a primary color
|
155
|
-
#
|
156
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
157
|
-
# @since 0.1.0
|
158
|
-
#
|
159
|
-
# @api private
|
160
|
-
#
|
161
|
-
# @param red [Float] the red component (0-1)
|
162
|
-
# @param green [Float] the green component (0-1)
|
163
|
-
# @param blue [Float] the blue component (0-1)
|
164
|
-
#
|
165
|
-
# @return [Boolean] true if color is primary
|
166
|
-
# @rbs (Float red, Float green, Float blue) -> bool
|
167
|
-
private def self.primary?: (Float red, Float green, Float blue) -> bool
|
168
|
-
|
169
|
-
# Get the closest primary color
|
170
|
-
#
|
171
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
172
|
-
# @since 0.1.0
|
173
|
-
#
|
174
|
-
# @api private
|
175
|
-
#
|
176
|
-
# @param red [Float] the red component (0-1)
|
177
|
-
# @param green [Float] the green component (0-1)
|
178
|
-
# @param blue [Float] the blue component (0-1)
|
179
|
-
#
|
180
|
-
# @return [Symbol] the primary color name
|
181
|
-
# @rbs (Float red, Float green, Float blue) -> Symbol
|
182
|
-
private def self.primary_color: (Float red, Float green, Float blue) -> Symbol
|
183
|
-
|
184
|
-
# Determine if RGB values represent a secondary color
|
185
|
-
#
|
186
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
187
|
-
# @since 0.1.0
|
188
|
-
#
|
189
|
-
# @api private
|
190
|
-
#
|
191
|
-
# @param red [Float] the red component (0-1)
|
192
|
-
# @param green [Float] the green component (0-1)
|
193
|
-
# @param blue [Float] the blue component (0-1)
|
194
|
-
#
|
195
|
-
# @return [Boolean] true if color is secondary
|
196
|
-
# @rbs (Float red, Float green, Float blue) -> bool
|
197
|
-
private def self.secondary?: (Float red, Float green, Float blue) -> bool
|
198
|
-
|
199
|
-
# Get the closest secondary color
|
200
|
-
#
|
201
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
202
|
-
# @since 0.1.0
|
203
|
-
#
|
204
|
-
# @api private
|
205
|
-
#
|
206
|
-
# @param red [Float] the red component (0-1)
|
207
|
-
# @param green [Float] the green component (0-1)
|
208
|
-
# @param blue [Float] the blue component (0-1)
|
209
|
-
#
|
210
|
-
# @return [Symbol] the secondary color name
|
211
|
-
# @rbs (Float red, Float green, Float blue) -> Symbol
|
212
|
-
private def self.secondary_color: (Float red, Float green, Float blue) -> Symbol
|
213
|
-
|
214
|
-
# Validate RGB values
|
215
|
-
#
|
216
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
217
|
-
# @since 0.1.0
|
218
|
-
#
|
219
|
-
# @api private
|
220
|
-
#
|
221
|
-
# @param color [Array<Integer>] the RGB components to validate
|
222
|
-
# @return [Array<Integer>] the validated RGB components
|
223
|
-
# @raise [ArgumentError] if the RGB values are invalid
|
224
|
-
# @rbs (Array[Integer] color) -> Array[Integer]
|
225
|
-
private def self.validate_rgb: (Array[Integer] color) -> Array[Integer]
|
226
|
-
|
227
|
-
# Check if RGB values represent yellow
|
228
|
-
#
|
229
|
-
# @author {https://aaronmallen.me Aaron Allen}
|
230
|
-
# @since 0.1.0
|
231
|
-
#
|
232
|
-
# @api private
|
233
|
-
#
|
234
|
-
# @param red [Float] the red component (0-1)
|
235
|
-
# @param green [Float] the green component (0-1)
|
236
|
-
# @param blue [Float] the blue component (0-1)
|
237
|
-
#
|
238
|
-
# @return [Boolean] true if color is yellow
|
239
|
-
# @rbs (Float red, Float green, Float blue) -> bool
|
240
|
-
private def self.yellow?: (Float red, Float green, Float blue) -> bool
|
55
|
+
# @return [Module<ColorTransformer>] the color transformer
|
56
|
+
# @rbs () -> singleton(ColorTransformer)
|
57
|
+
def self.transform: () -> singleton(ColorTransformer)
|
241
58
|
end
|
242
59
|
end
|
243
60
|
end
|