sai 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -1
  3. data/README.md +11 -3
  4. data/docs/USAGE.md +71 -9
  5. data/lib/sai/ansi/color_parser.rb +109 -0
  6. data/lib/sai/ansi/sequence_processor.rb +15 -126
  7. data/lib/sai/ansi/style_parser.rb +66 -0
  8. data/lib/sai/ansi.rb +0 -27
  9. data/lib/sai/conversion/color_sequence.rb +4 -4
  10. data/lib/sai/conversion/rgb/color_classifier.rb +209 -0
  11. data/lib/sai/conversion/rgb/color_indexer.rb +48 -0
  12. data/lib/sai/conversion/rgb/color_space.rb +192 -0
  13. data/lib/sai/conversion/rgb/color_transformer.rb +140 -0
  14. data/lib/sai/conversion/rgb.rb +23 -269
  15. data/lib/sai/decorator/color_manipulations.rb +157 -0
  16. data/lib/sai/decorator/delegation.rb +85 -0
  17. data/lib/sai/decorator/gradients.rb +363 -0
  18. data/lib/sai/decorator/hex_colors.rb +56 -0
  19. data/lib/sai/decorator/named_colors.rb +792 -0
  20. data/lib/sai/decorator/named_styles.rb +276 -0
  21. data/lib/sai/decorator/rgb_colors.rb +64 -0
  22. data/lib/sai/decorator.rb +29 -775
  23. data/lib/sai/named_colors.rb +522 -0
  24. data/lib/sai.rb +753 -23
  25. data/sig/sai/ansi/color_parser.rbs +77 -0
  26. data/sig/sai/ansi/sequence_processor.rbs +0 -75
  27. data/sig/sai/ansi/style_parser.rbs +59 -0
  28. data/sig/sai/ansi.rbs +0 -10
  29. data/sig/sai/conversion/rgb/color_classifier.rbs +165 -0
  30. data/sig/sai/conversion/rgb/color_indexer.rbs +41 -0
  31. data/sig/sai/conversion/rgb/color_space.rbs +129 -0
  32. data/sig/sai/conversion/rgb/color_transformer.rbs +99 -0
  33. data/sig/sai/conversion/rgb.rbs +15 -198
  34. data/sig/sai/decorator/color_manipulations.rbs +125 -0
  35. data/sig/sai/decorator/delegation.rbs +47 -0
  36. data/sig/sai/decorator/gradients.rbs +267 -0
  37. data/sig/sai/decorator/hex_colors.rbs +48 -0
  38. data/sig/sai/decorator/named_colors.rbs +1504 -0
  39. data/sig/sai/decorator/named_styles.rbs +72 -0
  40. data/sig/sai/decorator/rgb_colors.rbs +52 -0
  41. data/sig/sai/decorator.rbs +21 -195
  42. data/sig/sai/named_colors.rbs +127 -0
  43. data/sig/sai.rbs +1488 -44
  44. metadata +36 -5
@@ -0,0 +1,522 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sai/conversion/rgb'
4
+
5
+ module Sai
6
+ # A collection of named colors and their RGB values
7
+ #
8
+ # @author {https://aaronmallen.me Aaron Allen}
9
+ # @since 0.3.1
10
+ #
11
+ # @api private
12
+ module NamedColors
13
+ # Standard ANSI color names and their RGB values
14
+ #
15
+ # @author {https://aaronmallen.me Aaron Allen}
16
+ # @since 0.3.1
17
+ #
18
+ # @api private
19
+ #
20
+ # @return [Hash{Symbol => Array<Integer>}] the color names and RGB values
21
+ ANSI = {
22
+ black: [0, 0, 0],
23
+ red: [205, 0, 0],
24
+ green: [0, 205, 0],
25
+ yellow: [205, 205, 0],
26
+ blue: [0, 0, 238],
27
+ magenta: [205, 0, 205],
28
+ cyan: [0, 205, 205],
29
+ white: [229, 229, 229],
30
+ bright_black: [127, 127, 127],
31
+ bright_red: [255, 0, 0],
32
+ bright_green: [0, 255, 0],
33
+ bright_yellow: [255, 255, 0],
34
+ bright_blue: [92, 92, 255],
35
+ bright_magenta: [255, 0, 255],
36
+ bright_cyan: [0, 255, 255],
37
+ bright_white: [255, 255, 255]
38
+ }.freeze # Hash[Symbol, Array[Integer]]
39
+
40
+ # CSS color names and their RGB values
41
+ #
42
+ # @author {https://aaronmallen.me Aaron Allen}
43
+ # @since 0.3.1
44
+ #
45
+ # @api private
46
+ #
47
+ # @return [Hash{Symbol => Array<Integer>}] the color names and RGB values
48
+ CSS = {
49
+ alice_blue: [240, 248, 255],
50
+ antique_white: [250, 235, 215],
51
+ aqua: [0, 255, 255],
52
+ aquamarine: [127, 255, 212],
53
+ azure: [240, 255, 255],
54
+ beige: [245, 245, 220],
55
+ bisque: [255, 228, 196],
56
+ blanched_almond: [255, 235, 205],
57
+ brown: [165, 42, 42],
58
+ burly_wood: [222, 184, 135],
59
+ chartreuse: [127, 255, 0],
60
+ chocolate: [210, 105, 30],
61
+ coral: [255, 127, 80],
62
+ cornsilk: [255, 248, 220],
63
+ crimson: [220, 20, 60],
64
+ dark_gray: [169, 169, 169],
65
+ dark_olive_green: [85, 107, 47],
66
+ dark_orchid: [153, 50, 204],
67
+ dark_salmon: [233, 150, 122],
68
+ dark_slate_blue: [72, 61, 139],
69
+ dark_slate_gray: [47, 79, 79],
70
+ deep_pink: [255, 20, 147],
71
+ deep_sky_blue: [0, 191, 255],
72
+ dim_gray: [105, 105, 105],
73
+ dodger_blue: [30, 144, 255],
74
+ firebrick: [178, 34, 34],
75
+ floral_white: [255, 250, 240],
76
+ forest_green: [34, 139, 34],
77
+ fuchsia: [255, 0, 255],
78
+ gainsboro: [220, 220, 220],
79
+ ghost_white: [248, 248, 255],
80
+ gold: [255, 215, 0],
81
+ goldenrod: [218, 165, 32],
82
+ gray: [128, 128, 128],
83
+ honeydew: [240, 255, 240],
84
+ indigo: [75, 0, 130],
85
+ ivory: [255, 255, 240],
86
+ khaki: [240, 230, 140],
87
+ lavender: [230, 230, 250],
88
+ lavender_blush: [255, 240, 245],
89
+ lawn_green: [124, 252, 0],
90
+ lemon_chiffon: [255, 250, 205],
91
+ light_blue: [173, 216, 230],
92
+ light_cyan: [224, 255, 255],
93
+ light_goldenrod_yellow: [250, 250, 210],
94
+ light_gray: [211, 211, 211],
95
+ light_pink: [255, 182, 193],
96
+ light_salmon: [255, 160, 122],
97
+ light_sea_green: [32, 178, 170],
98
+ light_sky_blue: [135, 206, 250],
99
+ light_slate_gray: [119, 136, 153],
100
+ light_yellow: [255, 255, 224],
101
+ lime: [0, 255, 0],
102
+ lime_green: [50, 205, 50],
103
+ linen: [250, 240, 230],
104
+ maroon: [128, 0, 0],
105
+ medium_aquamarine: [102, 205, 170],
106
+ medium_blue: [0, 0, 205],
107
+ medium_sea_green: [60, 179, 113],
108
+ medium_slate_blue: [123, 104, 238],
109
+ midnight_blue: [25, 25, 112],
110
+ mint_cream: [245, 255, 250],
111
+ misty_rose: [255, 228, 225],
112
+ moccasin: [255, 228, 181],
113
+ navajo_white: [255, 222, 173],
114
+ navy: [0, 0, 128],
115
+ old_lace: [253, 245, 230],
116
+ olive: [128, 128, 0],
117
+ olive_drab: [107, 142, 35],
118
+ orange: [255, 165, 0],
119
+ orange_red: [255, 69, 0],
120
+ pale_goldenrod: [238, 232, 170],
121
+ pale_green: [152, 251, 152],
122
+ pale_turquoise: [175, 238, 238],
123
+ pale_violet_red: [219, 112, 147],
124
+ papaya_whip: [255, 239, 213],
125
+ peach_puff: [255, 218, 185],
126
+ peru: [205, 133, 63],
127
+ pink: [255, 192, 203],
128
+ plum: [221, 160, 221],
129
+ powder_blue: [176, 224, 230],
130
+ royal_blue: [65, 105, 225],
131
+ saddle_brown: [139, 69, 19],
132
+ salmon: [250, 128, 114],
133
+ sea_green: [46, 139, 87],
134
+ sea_shell: [255, 245, 238],
135
+ sienna: [160, 82, 45],
136
+ silver: [192, 192, 192],
137
+ sky_blue: [135, 206, 235],
138
+ slate_blue: [106, 90, 205],
139
+ slate_gray: [112, 128, 144],
140
+ snow: [255, 250, 250],
141
+ spring_green: [0, 255, 127],
142
+ teal: [0, 128, 128],
143
+ thistle: [216, 191, 216],
144
+ tomato: [255, 99, 71],
145
+ turquoise: [64, 224, 208],
146
+ wheat: [245, 222, 179],
147
+ white_smoke: [245, 245, 245],
148
+ yellow_green: [154, 205, 50]
149
+ }.freeze #: Hash[Symbol, Array[Integer]]
150
+
151
+ # XTERM color names and their RGB values
152
+ #
153
+ # @author {https://aaronmallen.me Aaron Allen}
154
+ # @since 0.3.1
155
+ #
156
+ # @api private
157
+ #
158
+ # @return [Hash{Symbol => Array<Integer>}] the color names and RGB values
159
+ # rubocop:disable Naming/VariableNumber
160
+ XTERM = {
161
+ aqua_system: [0, 255, 255],
162
+ aquamarine1: [95, 255, 215],
163
+ aquamarine1_122: [135, 255, 215],
164
+ aquamarine3: [95, 215, 175],
165
+ black_system: [0, 0, 0],
166
+ blue1: [0, 0, 255],
167
+ blue_system: [0, 0, 255],
168
+ blue_violet: [95, 0, 255],
169
+ blue3: [0, 0, 175],
170
+ blue3_20: [0, 0, 215],
171
+ cadet_blue: [95, 175, 135],
172
+ cadet_blue_73: [95, 175, 175],
173
+ chartreuse1: [135, 255, 0],
174
+ chartreuse2: [95, 255, 0],
175
+ chartreuse2_112: [135, 215, 0],
176
+ chartreuse3: [95, 175, 0],
177
+ chartreuse3_76: [95, 215, 0],
178
+ chartreuse4: [95, 135, 0],
179
+ cornflower_blue: [95, 135, 255],
180
+ cornsilk1: [255, 255, 215],
181
+ cyan1: [0, 255, 255],
182
+ cyan2: [0, 255, 215],
183
+ cyan3: [0, 215, 175],
184
+ dark_blue: [0, 0, 135],
185
+ dark_cyan: [0, 175, 135],
186
+ dark_goldenrod: [175, 135, 0],
187
+ dark_green: [0, 95, 0],
188
+ dark_khaki: [175, 175, 95],
189
+ dark_magenta: [135, 0, 135],
190
+ dark_magenta_91: [135, 0, 175],
191
+ dark_olive_green1: [215, 255, 95],
192
+ dark_olive_green1_192: [215, 255, 135],
193
+ dark_olive_green2: [175, 255, 95],
194
+ dark_olive_green3: [135, 175, 95],
195
+ dark_olive_green3_113: [135, 215, 95],
196
+ dark_olive_green3_149: [175, 215, 95],
197
+ dark_orange: [255, 135, 0],
198
+ dark_orange3: [175, 95, 0],
199
+ dark_orange3_166: [215, 95, 0],
200
+ dark_red: [95, 0, 0],
201
+ dark_red_88: [135, 0, 0],
202
+ dark_sea_green: [135, 175, 135],
203
+ dark_sea_green1: [175, 255, 215],
204
+ dark_sea_green1_193: [215, 255, 175],
205
+ dark_sea_green2: [175, 215, 175],
206
+ dark_sea_green2_157: [175, 255, 175],
207
+ dark_sea_green3: [135, 215, 175],
208
+ dark_sea_green3_150: [175, 215, 135],
209
+ dark_sea_green4: [95, 135, 95],
210
+ dark_sea_green4_71: [95, 175, 95],
211
+ dark_slate_gray1: [135, 255, 255],
212
+ dark_slate_gray2: [95, 255, 255],
213
+ dark_slate_gray3: [135, 215, 215],
214
+ dark_turquoise: [0, 215, 215],
215
+ dark_violet: [135, 0, 215],
216
+ dark_violet_128: [175, 0, 215],
217
+ deep_pink1: [255, 0, 135],
218
+ deep_pink1_199: [255, 0, 175],
219
+ deep_pink2: [255, 0, 95],
220
+ deep_pink3: [215, 0, 95],
221
+ deep_pink3_162: [215, 0, 135],
222
+ deep_pink4: [95, 0, 95],
223
+ deep_pink4_89: [135, 0, 95],
224
+ deep_pink4_125: [175, 0, 95],
225
+ deep_sky_blue1: [0, 175, 255],
226
+ deep_sky_blue2: [0, 175, 215],
227
+ deep_sky_blue3: [0, 135, 175],
228
+ deep_sky_blue3_32: [0, 135, 215],
229
+ deep_sky_blue4: [0, 95, 95],
230
+ deep_sky_blue4_24: [0, 95, 135],
231
+ deep_sky_blue4_25: [0, 95, 175],
232
+ dodger_blue1: [0, 135, 255],
233
+ dodger_blue2: [0, 95, 255],
234
+ dodger_blue3: [0, 95, 215],
235
+ fuchsia_system: [255, 0, 255],
236
+ gold1: [255, 215, 0],
237
+ gold3: [175, 175, 0],
238
+ gold3_178: [215, 175, 0],
239
+ green1: [0, 255, 0],
240
+ green3: [0, 175, 0],
241
+ green3_40: [0, 215, 0],
242
+ green4: [0, 135, 0],
243
+ green_system: [0, 128, 0],
244
+ green_yellow: [175, 255, 0],
245
+ grey0: [0, 0, 0],
246
+ grey100: [255, 255, 255],
247
+ grey11: [28, 28, 28],
248
+ grey15: [38, 38, 38],
249
+ grey19: [48, 48, 48],
250
+ grey23: [58, 58, 58],
251
+ grey27: [68, 68, 68],
252
+ grey3: [8, 8, 8],
253
+ grey30: [78, 78, 78],
254
+ grey35: [88, 88, 88],
255
+ grey37: [95, 95, 95],
256
+ grey39: [98, 98, 98],
257
+ grey42: [108, 108, 108],
258
+ grey46: [118, 118, 118],
259
+ grey50: [128, 128, 128],
260
+ grey53: [135, 135, 135],
261
+ grey54: [138, 138, 138],
262
+ grey58: [148, 148, 148],
263
+ grey62: [158, 158, 158],
264
+ grey66: [168, 168, 168],
265
+ grey7: [18, 18, 18],
266
+ grey70: [178, 178, 178],
267
+ grey74: [188, 188, 188],
268
+ grey78: [198, 198, 198],
269
+ grey82: [208, 208, 208],
270
+ grey84: [215, 215, 215],
271
+ grey85: [218, 218, 218],
272
+ grey89: [228, 228, 228],
273
+ grey93: [238, 238, 238],
274
+ grey_system: [128, 128, 128],
275
+ honeydew2: [215, 255, 215],
276
+ hot_pink: [255, 95, 175],
277
+ hot_pink_206: [255, 95, 215],
278
+ hot_pink2: [215, 95, 175],
279
+ hot_pink3: [175, 95, 135],
280
+ hot_pink3_168: [215, 95, 135],
281
+ indian_red: [175, 95, 95],
282
+ indian_red_167: [215, 95, 95],
283
+ indian_red1: [255, 95, 95],
284
+ indian_red1_204: [255, 95, 135],
285
+ khaki1: [255, 255, 135],
286
+ khaki3: [215, 215, 95],
287
+ light_coral: [255, 135, 135],
288
+ light_cyan1: [215, 255, 255],
289
+ light_cyan3: [175, 215, 215],
290
+ light_goldenrod1: [255, 255, 95],
291
+ light_goldenrod2: [255, 215, 135],
292
+ light_goldenrod2_221: [255, 215, 95],
293
+ light_goldenrod3: [215, 175, 95],
294
+ light_green: [135, 255, 95],
295
+ light_green_120: [135, 255, 135],
296
+ light_pink1: [255, 175, 175],
297
+ light_pink3: [215, 135, 135],
298
+ light_pink4: [135, 95, 95],
299
+ light_salmon1: [255, 175, 135],
300
+ light_salmon3: [175, 135, 95],
301
+ light_salmon3_173: [215, 135, 95],
302
+ light_sky_blue1: [175, 215, 255],
303
+ light_sky_blue3: [135, 175, 175],
304
+ light_sky_blue3_110: [135, 175, 215],
305
+ light_slate_blue: [135, 135, 255],
306
+ light_slate_grey: [135, 135, 175],
307
+ light_steel_blue: [175, 175, 255],
308
+ light_steel_blue1: [215, 215, 255],
309
+ light_steel_blue3: [175, 175, 215],
310
+ lime_system: [0, 255, 0],
311
+ magenta1: [255, 0, 255],
312
+ magenta2: [215, 0, 255],
313
+ magenta2_200: [255, 0, 215],
314
+ magenta3: [175, 0, 175],
315
+ magenta3_163: [215, 0, 175],
316
+ magenta3_164: [215, 0, 215],
317
+ maroon_system: [128, 0, 0],
318
+ medium_orchid: [175, 95, 215],
319
+ medium_orchid1: [215, 95, 255],
320
+ medium_orchid1_207: [255, 95, 255],
321
+ medium_orchid3: [175, 95, 175],
322
+ medium_purple: [135, 135, 215],
323
+ medium_purple1: [175, 135, 255],
324
+ medium_purple2: [175, 95, 255],
325
+ medium_purple2_140: [175, 135, 215],
326
+ medium_purple3: [135, 95, 175],
327
+ medium_purple3_98: [135, 95, 215],
328
+ medium_purple4: [95, 95, 135],
329
+ medium_spring_green: [0, 255, 175],
330
+ medium_turquoise: [95, 215, 215],
331
+ medium_violet_red: [175, 0, 135],
332
+ misty_rose1: [255, 215, 215],
333
+ misty_rose3: [215, 175, 175],
334
+ navy_blue: [0, 0, 95],
335
+ navy_system: [0, 0, 128],
336
+ navajo_white1: [255, 215, 175],
337
+ navajo_white3: [175, 175, 135],
338
+ olive_system: [128, 128, 0],
339
+ orange1: [255, 175, 0],
340
+ orange3: [215, 135, 0],
341
+ orange4: [95, 95, 0],
342
+ orange4_94: [135, 95, 0],
343
+ orange_red1: [255, 95, 0],
344
+ orchid: [215, 95, 215],
345
+ orchid1: [255, 135, 255],
346
+ orchid2: [255, 135, 215],
347
+ pale_green1: [135, 255, 175],
348
+ pale_green1_156: [175, 255, 135],
349
+ pale_green3: [95, 215, 95],
350
+ pale_green3_114: [135, 215, 135],
351
+ pale_turquoise1: [175, 255, 255],
352
+ pale_turquoise4: [95, 135, 135],
353
+ pale_violet_red1: [255, 135, 175],
354
+ pink1: [255, 175, 215],
355
+ pink3: [215, 135, 175],
356
+ plum1: [255, 175, 255],
357
+ plum2: [215, 175, 255],
358
+ plum3: [215, 135, 215],
359
+ plum4: [135, 95, 135],
360
+ purple: [135, 0, 255],
361
+ purple_129: [175, 0, 255],
362
+ purple3: [95, 0, 215],
363
+ purple4: [95, 0, 135],
364
+ purple4_55: [95, 0, 175],
365
+ purple_system: [128, 0, 128],
366
+ red1: [255, 0, 0],
367
+ red3: [175, 0, 0],
368
+ red3_160: [215, 0, 0],
369
+ red_system: [255, 0, 0],
370
+ rosy_brown: [175, 135, 135],
371
+ royal_blue1: [95, 95, 255],
372
+ salmon1: [255, 135, 95],
373
+ sandy_brown: [255, 175, 95],
374
+ silver_system: [192, 192, 192],
375
+ sky_blue1: [135, 215, 255],
376
+ sky_blue2: [135, 175, 255],
377
+ sky_blue3: [95, 175, 215],
378
+ slate_blue1: [135, 95, 255],
379
+ slate_blue3: [95, 95, 175],
380
+ slate_blue3_62: [95, 95, 215],
381
+ spring_green1: [0, 255, 135],
382
+ spring_green2: [0, 215, 135],
383
+ spring_green2_47: [0, 255, 95],
384
+ spring_green3: [0, 175, 95],
385
+ spring_green3_41: [0, 215, 95],
386
+ spring_green4: [0, 135, 95],
387
+ steel_blue: [95, 135, 175],
388
+ steel_blue1: [95, 175, 255],
389
+ steel_blue1_81: [95, 215, 255],
390
+ steel_blue3: [95, 135, 215],
391
+ tan: [215, 175, 135],
392
+ teal_system: [0, 128, 128],
393
+ thistle1: [255, 215, 255],
394
+ thistle3: [215, 175, 215],
395
+ turquoise2: [0, 215, 255],
396
+ turquoise4: [0, 135, 135],
397
+ violet: [215, 135, 255],
398
+ wheat1: [255, 255, 175],
399
+ wheat4: [135, 135, 95],
400
+ white_system: [255, 255, 255],
401
+ yellow1: [255, 255, 0],
402
+ yellow2: [215, 255, 0],
403
+ yellow3: [175, 215, 0],
404
+ yellow3_184: [215, 215, 0],
405
+ yellow4: [135, 135, 0],
406
+ yellow4_106: [135, 175, 0],
407
+ yellow_system: [255, 255, 0]
408
+ }.freeze #: Hash[Symbol, Array[Integer]]
409
+ # rubocop:enable Naming/VariableNumber
410
+
411
+ class << self
412
+ # Look up an RGB value by color name
413
+ #
414
+ # @author {https://aaronmallen.me Aaron Allen}
415
+ # @since 0.3.1
416
+ #
417
+ # @api private
418
+ #
419
+ # @param name [String, Symbol] the color name
420
+ #
421
+ # @return [Array<Integer>] the RGB value
422
+ # @rbs (String | Symbol name) -> Array[Integer]?
423
+ def [](name)
424
+ registry[name.to_sym]
425
+ end
426
+
427
+ # Get a list of all color names
428
+ #
429
+ # @author {https://aaronmallen.me Aaron Allen}
430
+ # @since 0.3.1
431
+ #
432
+ # @api private
433
+ #
434
+ # @return [Array<Symbol>] the color names
435
+ def names
436
+ @names ||= registry.keys.uniq.sort
437
+ end
438
+
439
+ # Register a named color with an RGB or Hexadecimal value
440
+ #
441
+ # @author {https://aaronmallen.me Aaron Allen}
442
+ # @since 0.3.2
443
+ #
444
+ # @api private
445
+ #
446
+ # @param name [String, Symbol] the name of the color being registered
447
+ # @param rgb_or_hex [Array<Integer>, String] the RGB or Hexadecimal value of the color
448
+ #
449
+ # @return [Boolean] `true` if the color was registered
450
+ # @rbs (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
451
+ def register(name, rgb_or_hex)
452
+ key = name.to_s.downcase.to_sym
453
+ provision_color(key, rgb_or_hex)
454
+ install_color(key)
455
+ true
456
+ end
457
+
458
+ private
459
+
460
+ # Install the color methods onto {Sai} and {Sai::Decorator}
461
+ #
462
+ # @author {https://aaronmallen.me Aaron Allen}
463
+ # @since 0.3.2
464
+ #
465
+ # @api private
466
+ #
467
+ # @param name [Symbol] the name of the color to install
468
+ #
469
+ # @return [void]
470
+ # @rbs (Symbol name) -> void
471
+ def install_color(name)
472
+ Sai::Decorator::NamedColors.install(name)
473
+ Sai::Decorator::Delegation.install(Sai)
474
+ end
475
+
476
+ # Provision a color for the registry
477
+ #
478
+ # @author {https://aaronmallen.me Aaron Allen}
479
+ # @since 0.3.2
480
+ #
481
+ # @api private
482
+ #
483
+ # @param name [Symbol] the name of the color to register
484
+ # @param rgb_or_hex [Array<Integer>, String] the RGB or Hexadecimal value of the color
485
+ #
486
+ # @return [void]
487
+ # @rbs (Symbol name, Array[Integer] | String rgb_or_hex) -> void
488
+ def provision_color(name, rgb_or_hex)
489
+ rgb = Conversion::RGB.resolve(rgb_or_hex)
490
+ registry[name] = rgb
491
+ @names = nil
492
+ end
493
+
494
+ # The Sai named colors registry
495
+ #
496
+ # @author {https://aaronmallen.me Aaron Allen}
497
+ # @since 0.3.2
498
+ #
499
+ # @api private
500
+ #
501
+ # @return [Hash{Symbol => Array<Integer>}] the named colors registry
502
+ def registry
503
+ thread_lock.synchronize do
504
+ @registry ||= CSS.merge(XTERM).merge(ANSI)
505
+ end
506
+ end
507
+
508
+ # A Mutex for thread safety
509
+ #
510
+ # @author {https://aaronmallen.me Aaron Allen}
511
+ # @since 0.3.2
512
+ #
513
+ # @api private
514
+ #
515
+ # @return [Mutex] the thread lock
516
+ # @rbs () -> Mutex
517
+ def thread_lock
518
+ @thread_lock ||= Mutex.new
519
+ end
520
+ end
521
+ end
522
+ end