abachrome 0.1.3 → 0.1.5

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/lib/abachrome/abc_decimal.rb +2 -0
  4. data/lib/abachrome/color.rb +11 -1
  5. data/lib/abachrome/color_mixins/blend.rb +3 -1
  6. data/lib/abachrome/color_mixins/lighten.rb +3 -1
  7. data/lib/abachrome/color_mixins/to_colorspace.rb +3 -1
  8. data/lib/abachrome/color_mixins/to_lrgb.rb +3 -1
  9. data/lib/abachrome/color_mixins/to_oklab.rb +3 -1
  10. data/lib/abachrome/color_mixins/to_oklch.rb +3 -1
  11. data/lib/abachrome/color_mixins/to_srgb.rb +3 -1
  12. data/lib/abachrome/color_models/hsv.rb +3 -1
  13. data/lib/abachrome/color_models/lms.rb +2 -0
  14. data/lib/abachrome/color_models/oklab.rb +3 -1
  15. data/lib/abachrome/color_models/oklch.rb +3 -1
  16. data/lib/abachrome/color_models/rgb.rb +3 -1
  17. data/lib/abachrome/color_models/xyz.rb +1 -0
  18. data/lib/abachrome/color_space.rb +3 -1
  19. data/lib/abachrome/converter.rb +2 -0
  20. data/lib/abachrome/converters/base.rb +3 -1
  21. data/lib/abachrome/converters/lms_to_lrgb.rb +2 -0
  22. data/lib/abachrome/converters/lms_to_srgb.rb +2 -0
  23. data/lib/abachrome/converters/lms_to_xyz.rb +2 -0
  24. data/lib/abachrome/converters/lrgb_to_lms.rb +1 -0
  25. data/lib/abachrome/converters/lrgb_to_oklab.rb +3 -1
  26. data/lib/abachrome/converters/lrgb_to_srgb.rb +3 -1
  27. data/lib/abachrome/converters/lrgb_to_xyz.rb +2 -0
  28. data/lib/abachrome/converters/oklab_to_lms.rb +1 -0
  29. data/lib/abachrome/converters/oklab_to_lrgb.rb +2 -0
  30. data/lib/abachrome/converters/oklab_to_oklch.rb +3 -1
  31. data/lib/abachrome/converters/oklab_to_srgb.rb +3 -1
  32. data/lib/abachrome/converters/oklch_to_lrgb.rb +2 -0
  33. data/lib/abachrome/converters/oklch_to_oklab.rb +2 -0
  34. data/lib/abachrome/converters/oklch_to_srgb.rb +3 -1
  35. data/lib/abachrome/converters/oklch_to_xyz.rb +2 -0
  36. data/lib/abachrome/converters/srgb_to_lrgb.rb +3 -1
  37. data/lib/abachrome/converters/srgb_to_oklab.rb +3 -1
  38. data/lib/abachrome/converters/srgb_to_oklch.rb +3 -1
  39. data/lib/abachrome/converters/xyz_to_lms.rb +2 -0
  40. data/lib/abachrome/converters/xyz_to_oklab.rb +2 -0
  41. data/lib/abachrome/gamut/base.rb +3 -1
  42. data/lib/abachrome/gamut/p3.rb +3 -1
  43. data/lib/abachrome/gamut/rec2020.rb +3 -1
  44. data/lib/abachrome/gamut/srgb.rb +3 -1
  45. data/lib/abachrome/illuminants/base.rb +3 -1
  46. data/lib/abachrome/illuminants/d50.rb +3 -1
  47. data/lib/abachrome/illuminants/d55.rb +3 -1
  48. data/lib/abachrome/illuminants/d65.rb +3 -1
  49. data/lib/abachrome/illuminants/d75.rb +3 -1
  50. data/lib/abachrome/named/css.rb +3 -1
  51. data/lib/abachrome/named/tailwind.rb +301 -0
  52. data/lib/abachrome/outputs/css.rb +3 -1
  53. data/lib/abachrome/palette.rb +3 -1
  54. data/lib/abachrome/palette_mixins/interpolate.rb +3 -1
  55. data/lib/abachrome/palette_mixins/resample.rb +3 -1
  56. data/lib/abachrome/palette_mixins/stretch_luminance.rb +3 -1
  57. data/lib/abachrome/parsers/hex.rb +3 -1
  58. data/lib/abachrome/parsers/tailwind.rb +45 -0
  59. data/lib/abachrome/to_abcd.rb +3 -1
  60. data/lib/abachrome/version.rb +3 -1
  61. data/lib/abachrome.rb +13 -2
  62. metadata +5 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb85b148dce0bd2caf5ee135348d4b3733123ba4e139aad387c20071e9a3fb0d
4
- data.tar.gz: 9f2f1fab202ceaa5f448b49c44fb5d6d8ecd91fbb9998878aa0f397f5a228745
3
+ metadata.gz: 9600763490f935450197f31388435f33c7d82c6dbcf854a8f2d01d8c5a301367
4
+ data.tar.gz: 0e5fb3f804f9dd1332e37311f1e63e17b50aa6e204b67944c5338e18879b0ee8
5
5
  SHA512:
6
- metadata.gz: 71ff411b276fc51c075d15c19d88db9b177850b194c55dab03b053f17d0c77d32de63ef1e5d4f2d3fb01a7873efcc22f7055307b2b44a72c6e4089a91c924cda
7
- data.tar.gz: 7744046e683c0bff375b03888917c74b98a6a62d9dba24c52c6c9b7c39a5f450c07e6eb1dbc510f11c3e2378a67b5fc3fe1252d5da716c25ef75463c20950e12
6
+ metadata.gz: 660d4f26b871b165eeb5bbf17c380ebe1ec8ba950746b409d6e44a26dab04c3ae95e3e8952ff9e60dccaef6d7cc5d2386bd8e24730214cabbbab2593b1bbe128
7
+ data.tar.gz: 101a8a42a9509aedd238b96e5327441b4d4f79efc33715d857b88f8614f4d72ec1fe0c6af41f629f0c53b8db888ec7cc448ec603e6a0c4d379ff7a0b609af23f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.4] - 2025-10-12
4
+
5
+ - Added `Color#to_hex` method for convenient hex string output
6
+ - Added `Abachrome.parse` method for parsing CSS color strings
7
+
3
8
  ## [0.1.3] - 2025-10-12
4
9
 
5
10
  - Enhanced color parsing with support for additional CSS formats
@@ -353,3 +353,5 @@ end
353
353
  def AD(*args)
354
354
  Abachrome::AbcDecimal.new(*args)
355
355
  end
356
+
357
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -134,7 +134,7 @@ module Abachrome
134
134
  end
135
135
 
136
136
  # Returns a string representation of the color in the format "ColorSpaceName(coord1, coord2, coord3, alpha)"
137
- #
137
+ #
138
138
  # @return [String] A human-readable string representation of the color showing its
139
139
  # color space name, coordinate values rounded to 3 decimal places, and alpha value
140
140
  # (if not 1.0)
@@ -144,6 +144,14 @@ module Abachrome
144
144
  "#{color_space.name}(#{coord_str}#{alpha_str})"
145
145
  end
146
146
 
147
+ # Returns the color as a hexadecimal string representation.
148
+ #
149
+ # @return [String] A hex color string in the format "#RRGGBB" or "#RRGGBBAA" if alpha < 1.0
150
+ def to_hex
151
+ require_relative "outputs/css"
152
+ Outputs::CSS.format_hex(self)
153
+ end
154
+
147
155
  private
148
156
 
149
157
  # Validates that the number of coordinates matches the expected number for the color space.
@@ -159,3 +167,5 @@ module Abachrome
159
167
  end
160
168
  end
161
169
  end
170
+
171
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -93,4 +93,6 @@ module Abachrome
93
93
  end
94
94
  end
95
95
  end
96
- end
96
+ end
97
+
98
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -83,4 +83,6 @@ module Abachrome
83
83
  end
84
84
  end
85
85
  end
86
- end
86
+ end
87
+
88
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -100,4 +100,6 @@ module Abachrome
100
100
  end
101
101
  end
102
102
  end
103
- end
103
+ end
104
+
105
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -114,4 +114,6 @@ module Abachrome
114
114
  end
115
115
  end
116
116
  end
117
- end
117
+ end
118
+
119
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -110,4 +110,6 @@ module Abachrome
110
110
  end
111
111
  end
112
112
  end
113
- end
113
+ end
114
+
115
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -103,4 +103,6 @@ module Abachrome
103
103
  end
104
104
  end
105
105
  end
106
- end
106
+ end
107
+
108
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -135,4 +135,6 @@ module Abachrome
135
135
  end
136
136
  end
137
137
  end
138
- end
138
+ end
139
+
140
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -42,4 +42,6 @@ module Abachrome
42
42
  end
43
43
  end
44
44
  end
45
- end
45
+ end
46
+
47
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -32,3 +32,5 @@ ColorSpace.register(
32
32
  nil,
33
33
  []
34
34
  )
35
+
36
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -30,4 +30,6 @@ ColorSpace.register(
30
30
  %w[l a b],
31
31
  nil,
32
32
  ["ok-lab"]
33
- )
33
+ )
34
+
35
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -84,4 +84,6 @@ ColorSpace.register(
84
84
  %w[lightness chroma hue],
85
85
  nil,
86
86
  ["ok-lch"]
87
- )
87
+ )
88
+
89
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -51,4 +51,6 @@ module Abachrome
51
51
  end
52
52
  end
53
53
  end
54
- end
54
+ end
55
+
56
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -26,3 +26,4 @@ module Abachrome
26
26
  end
27
27
  end
28
28
 
29
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -180,4 +180,6 @@ module Abachrome
180
180
  s.white_point = :D65
181
181
  s.color_model = :lms
182
182
  end
183
- end
183
+ end
184
+
185
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -111,3 +111,5 @@ module Abachrome
111
111
  # Auto-register all converters
112
112
  Converter.register_all_converters
113
113
  end
114
+
115
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -121,4 +121,6 @@ module Abachrome
121
121
  end
122
122
  end
123
123
  end
124
- end
124
+ end
125
+
126
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -34,3 +34,5 @@ module Abachrome
34
34
  end
35
35
  end
36
36
  end
37
+
38
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -21,3 +21,5 @@ module Abachrome
21
21
  end
22
22
  end
23
23
  end
24
+
25
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -28,3 +28,5 @@ module Abachrome
28
28
  end
29
29
  end
30
30
  end
31
+
32
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -0,0 +1 @@
1
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -50,4 +50,6 @@ module Abachrome
50
50
  end
51
51
  end
52
52
  end
53
- end
53
+ end
54
+
55
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -52,4 +52,6 @@ module Abachrome
52
52
  end
53
53
  end
54
54
  end
55
- end
55
+ end
56
+
57
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -27,3 +27,5 @@ module Abachrome
27
27
  end
28
28
  end
29
29
  end
30
+
31
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -39,3 +39,4 @@ module Abachrome
39
39
  end
40
40
  end
41
41
 
42
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -67,3 +67,5 @@ module Abachrome
67
67
  end
68
68
  end
69
69
  end
70
+
71
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -49,4 +49,6 @@ module Abachrome
49
49
  end
50
50
  end
51
51
  end
52
- end
52
+ end
53
+
54
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -39,4 +39,6 @@ module Abachrome
39
39
  end
40
40
  end
41
41
  end
42
- end
42
+ end
43
+
44
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -73,3 +73,5 @@ module Abachrome
73
73
  end
74
74
  end
75
75
  end
76
+
77
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -46,3 +46,5 @@ module Abachrome
46
46
  end
47
47
  end
48
48
  end
49
+
50
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -39,4 +39,6 @@ module Abachrome
39
39
  end
40
40
  end
41
41
  end
42
- end
42
+ end
43
+
44
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -64,3 +64,5 @@ module Abachrome
64
64
  end
65
65
  end
66
66
  end
67
+
68
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -48,4 +48,6 @@ module Abachrome
48
48
  end
49
49
  end
50
50
  end
51
- end
51
+ end
52
+
53
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -38,4 +38,6 @@ module Abachrome
38
38
  end
39
39
  end
40
40
  end
41
- end
41
+ end
42
+
43
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -40,4 +40,6 @@ module Abachrome
40
40
  end
41
41
  end
42
42
  end
43
- end
43
+ end
44
+
45
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -28,3 +28,5 @@ module Abachrome
28
28
  end
29
29
  end
30
30
  end
31
+
32
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -36,3 +36,5 @@ module Abachrome
36
36
  end
37
37
  end
38
38
  end
39
+
40
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -69,4 +69,6 @@ module Abachrome
69
69
  end
70
70
  end
71
71
  end
72
- end
72
+ end
73
+
74
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -22,4 +22,6 @@ module Abachrome
22
22
 
23
23
  register(P3.new)
24
24
  end
25
- end
25
+ end
26
+
27
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -20,4 +20,6 @@ module Abachrome
20
20
 
21
21
  register(Rec2020.new)
22
22
  end
23
- end
23
+ end
24
+
25
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -42,4 +42,6 @@ module Abachrome
42
42
 
43
43
  register(SRGB.new)
44
44
  end
45
- end
45
+ end
46
+
47
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -30,4 +30,6 @@ module Abachrome
30
30
  end
31
31
  end
32
32
  end
33
- end
33
+ end
34
+
35
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -28,4 +28,6 @@ module Abachrome
28
28
  end
29
29
  end
30
30
  end
31
- end
31
+ end
32
+
33
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -24,4 +24,6 @@ module Abachrome
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
28
+
29
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -32,4 +32,6 @@ module Abachrome
32
32
  end
33
33
  end
34
34
  end
35
- end
35
+ end
36
+
37
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -24,4 +24,6 @@ module Abachrome
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
28
+
29
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -152,4 +152,6 @@ module Abachrome
152
152
  def self.yellowgreen; [154, 205, 50] end
153
153
  end
154
154
  end
155
- end
155
+ end
156
+
157
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -0,0 +1,301 @@
1
+ #
2
+
3
+ module Abachrome
4
+ module Named
5
+ module Tailwind
6
+ # Tailwind CSS v3 color palette
7
+ # Each color has shades from 50 to 950
8
+
9
+ COLORS = {
10
+ 'slate' => {
11
+ '50' => [248, 250, 252],
12
+ '100' => [241, 245, 249],
13
+ '200' => [226, 232, 240],
14
+ '300' => [203, 213, 225],
15
+ '400' => [148, 163, 184],
16
+ '500' => [100, 116, 139],
17
+ '600' => [71, 85, 105],
18
+ '700' => [51, 65, 85],
19
+ '800' => [30, 41, 59],
20
+ '900' => [15, 23, 42],
21
+ '950' => [2, 6, 23]
22
+ },
23
+ 'gray' => {
24
+ '50' => [249, 250, 251],
25
+ '100' => [243, 244, 246],
26
+ '200' => [229, 231, 235],
27
+ '300' => [209, 213, 219],
28
+ '400' => [156, 163, 175],
29
+ '500' => [107, 114, 128],
30
+ '600' => [75, 85, 99],
31
+ '700' => [55, 65, 81],
32
+ '800' => [31, 41, 55],
33
+ '900' => [17, 24, 39],
34
+ '950' => [3, 7, 18]
35
+ },
36
+ 'zinc' => {
37
+ '50' => [250, 250, 250],
38
+ '100' => [244, 244, 245],
39
+ '200' => [228, 228, 231],
40
+ '300' => [212, 212, 216],
41
+ '400' => [161, 161, 170],
42
+ '500' => [113, 113, 122],
43
+ '600' => [82, 82, 91],
44
+ '700' => [63, 63, 70],
45
+ '800' => [39, 39, 42],
46
+ '900' => [24, 24, 27],
47
+ '950' => [9, 9, 11]
48
+ },
49
+ 'neutral' => {
50
+ '50' => [250, 250, 250],
51
+ '100' => [245, 245, 245],
52
+ '200' => [229, 229, 229],
53
+ '300' => [212, 212, 212],
54
+ '400' => [163, 163, 163],
55
+ '500' => [115, 115, 115],
56
+ '600' => [82, 82, 82],
57
+ '700' => [64, 64, 64],
58
+ '800' => [38, 38, 38],
59
+ '900' => [23, 23, 23],
60
+ '950' => [10, 10, 10]
61
+ },
62
+ 'stone' => {
63
+ '50' => [250, 250, 249],
64
+ '100' => [245, 245, 244],
65
+ '200' => [231, 229, 228],
66
+ '300' => [214, 211, 209],
67
+ '400' => [168, 162, 158],
68
+ '500' => [120, 113, 108],
69
+ '600' => [87, 83, 78],
70
+ '700' => [68, 64, 60],
71
+ '800' => [41, 37, 36],
72
+ '900' => [28, 25, 23],
73
+ '950' => [12, 10, 9]
74
+ },
75
+ 'red' => {
76
+ '50' => [254, 242, 242],
77
+ '100' => [254, 226, 226],
78
+ '200' => [254, 202, 202],
79
+ '300' => [252, 165, 165],
80
+ '400' => [248, 113, 113],
81
+ '500' => [239, 68, 68],
82
+ '600' => [220, 38, 38],
83
+ '700' => [185, 28, 28],
84
+ '800' => [153, 27, 27],
85
+ '900' => [127, 29, 29],
86
+ '950' => [69, 10, 10]
87
+ },
88
+ 'orange' => {
89
+ '50' => [255, 247, 237],
90
+ '100' => [255, 237, 213],
91
+ '200' => [254, 215, 170],
92
+ '300' => [253, 186, 116],
93
+ '400' => [251, 146, 60],
94
+ '500' => [249, 115, 22],
95
+ '600' => [234, 88, 12],
96
+ '700' => [194, 65, 12],
97
+ '800' => [154, 52, 18],
98
+ '900' => [124, 45, 18],
99
+ '950' => [67, 20, 7]
100
+ },
101
+ 'amber' => {
102
+ '50' => [255, 251, 235],
103
+ '100' => [254, 243, 199],
104
+ '200' => [253, 230, 138],
105
+ '300' => [252, 211, 77],
106
+ '400' => [251, 191, 36],
107
+ '500' => [245, 158, 11],
108
+ '600' => [217, 119, 6],
109
+ '700' => [180, 83, 9],
110
+ '800' => [146, 64, 14],
111
+ '900' => [120, 53, 15],
112
+ '950' => [69, 26, 3]
113
+ },
114
+ 'yellow' => {
115
+ '50' => [254, 252, 232],
116
+ '100' => [254, 249, 195],
117
+ '200' => [254, 240, 138],
118
+ '300' => [253, 224, 71],
119
+ '400' => [250, 204, 21],
120
+ '500' => [234, 179, 8],
121
+ '600' => [202, 138, 4],
122
+ '700' => [161, 98, 7],
123
+ '800' => [133, 77, 14],
124
+ '900' => [113, 63, 18],
125
+ '950' => [66, 32, 6]
126
+ },
127
+ 'lime' => {
128
+ '50' => [247, 254, 231],
129
+ '100' => [236, 252, 203],
130
+ '200' => [217, 249, 157],
131
+ '300' => [190, 242, 100],
132
+ '400' => [163, 230, 53],
133
+ '500' => [132, 204, 22],
134
+ '600' => [101, 163, 13],
135
+ '700' => [77, 124, 15],
136
+ '800' => [63, 98, 18],
137
+ '900' => [54, 83, 20],
138
+ '950' => [26, 46, 5]
139
+ },
140
+ 'green' => {
141
+ '50' => [240, 253, 244],
142
+ '100' => [220, 252, 231],
143
+ '200' => [187, 247, 208],
144
+ '300' => [134, 239, 172],
145
+ '400' => [74, 222, 128],
146
+ '500' => [34, 197, 94],
147
+ '600' => [22, 163, 74],
148
+ '700' => [21, 128, 61],
149
+ '800' => [22, 101, 52],
150
+ '900' => [20, 83, 45],
151
+ '950' => [5, 46, 22]
152
+ },
153
+ 'emerald' => {
154
+ '50' => [236, 253, 245],
155
+ '100' => [209, 250, 229],
156
+ '200' => [167, 243, 208],
157
+ '300' => [110, 231, 183],
158
+ '400' => [52, 211, 153],
159
+ '500' => [16, 185, 129],
160
+ '600' => [5, 150, 105],
161
+ '700' => [4, 120, 87],
162
+ '800' => [6, 95, 70],
163
+ '900' => [6, 78, 59],
164
+ '950' => [2, 44, 34]
165
+ },
166
+ 'teal' => {
167
+ '50' => [240, 253, 250],
168
+ '100' => [204, 251, 241],
169
+ '200' => [153, 246, 228],
170
+ '300' => [94, 234, 212],
171
+ '400' => [45, 212, 191],
172
+ '500' => [20, 184, 166],
173
+ '600' => [13, 148, 136],
174
+ '700' => [15, 118, 110],
175
+ '800' => [17, 94, 89],
176
+ '900' => [19, 78, 74],
177
+ '950' => [4, 47, 46]
178
+ },
179
+ 'cyan' => {
180
+ '50' => [236, 254, 255],
181
+ '100' => [207, 250, 254],
182
+ '200' => [165, 243, 252],
183
+ '300' => [103, 232, 249],
184
+ '400' => [34, 211, 238],
185
+ '500' => [6, 182, 212],
186
+ '600' => [8, 145, 178],
187
+ '700' => [14, 116, 144],
188
+ '800' => [21, 94, 117],
189
+ '900' => [22, 78, 99],
190
+ '950' => [8, 51, 68]
191
+ },
192
+ 'sky' => {
193
+ '50' => [240, 249, 255],
194
+ '100' => [224, 242, 254],
195
+ '200' => [186, 230, 253],
196
+ '300' => [125, 211, 252],
197
+ '400' => [56, 189, 248],
198
+ '500' => [14, 165, 233],
199
+ '600' => [2, 132, 199],
200
+ '700' => [3, 105, 161],
201
+ '800' => [7, 89, 133],
202
+ '900' => [12, 74, 110],
203
+ '950' => [8, 47, 73]
204
+ },
205
+ 'blue' => {
206
+ '50' => [239, 246, 255],
207
+ '100' => [219, 234, 254],
208
+ '200' => [191, 219, 254],
209
+ '300' => [147, 197, 253],
210
+ '400' => [96, 165, 250],
211
+ '500' => [59, 130, 246],
212
+ '600' => [37, 99, 235],
213
+ '700' => [29, 78, 216],
214
+ '800' => [30, 64, 175],
215
+ '900' => [30, 58, 138],
216
+ '950' => [23, 37, 84]
217
+ },
218
+ 'indigo' => {
219
+ '50' => [238, 242, 255],
220
+ '100' => [224, 231, 255],
221
+ '200' => [199, 210, 254],
222
+ '300' => [165, 180, 252],
223
+ '400' => [129, 140, 248],
224
+ '500' => [99, 102, 241],
225
+ '600' => [79, 70, 229],
226
+ '700' => [67, 56, 202],
227
+ '800' => [55, 48, 163],
228
+ '900' => [49, 46, 129],
229
+ '950' => [30, 27, 75]
230
+ },
231
+ 'violet' => {
232
+ '50' => [245, 243, 255],
233
+ '100' => [237, 233, 254],
234
+ '200' => [221, 214, 254],
235
+ '300' => [196, 181, 253],
236
+ '400' => [167, 139, 250],
237
+ '500' => [139, 92, 246],
238
+ '600' => [124, 58, 237],
239
+ '700' => [109, 40, 217],
240
+ '800' => [91, 33, 182],
241
+ '900' => [76, 29, 149],
242
+ '950' => [46, 16, 101]
243
+ },
244
+ 'purple' => {
245
+ '50' => [250, 245, 255],
246
+ '100' => [243, 232, 255],
247
+ '200' => [233, 213, 255],
248
+ '300' => [216, 180, 254],
249
+ '400' => [192, 132, 252],
250
+ '500' => [168, 85, 247],
251
+ '600' => [147, 51, 234],
252
+ '700' => [126, 34, 206],
253
+ '800' => [107, 33, 168],
254
+ '900' => [88, 28, 135],
255
+ '950' => [59, 7, 100]
256
+ },
257
+ 'fuchsia' => {
258
+ '50' => [253, 244, 255],
259
+ '100' => [250, 232, 255],
260
+ '200' => [245, 208, 254],
261
+ '300' => [240, 171, 252],
262
+ '400' => [232, 121, 249],
263
+ '500' => [217, 70, 239],
264
+ '600' => [192, 38, 211],
265
+ '700' => [162, 28, 175],
266
+ '800' => [134, 25, 143],
267
+ '900' => [112, 26, 117],
268
+ '950' => [74, 4, 78]
269
+ },
270
+ 'pink' => {
271
+ '50' => [253, 242, 248],
272
+ '100' => [252, 231, 243],
273
+ '200' => [251, 207, 232],
274
+ '300' => [249, 168, 212],
275
+ '400' => [244, 114, 182],
276
+ '500' => [236, 72, 153],
277
+ '600' => [219, 39, 119],
278
+ '700' => [190, 24, 93],
279
+ '800' => [157, 23, 77],
280
+ '900' => [131, 24, 67],
281
+ '950' => [80, 7, 36]
282
+ },
283
+ 'rose' => {
284
+ '50' => [255, 241, 242],
285
+ '100' => [255, 228, 230],
286
+ '200' => [254, 205, 211],
287
+ '300' => [253, 164, 175],
288
+ '400' => [251, 113, 133],
289
+ '500' => [244, 63, 94],
290
+ '600' => [225, 29, 72],
291
+ '700' => [190, 18, 60],
292
+ '800' => [159, 18, 57],
293
+ '900' => [136, 19, 55],
294
+ '950' => [76, 5, 25]
295
+ }
296
+ }.freeze
297
+ end
298
+ end
299
+ end
300
+
301
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -114,4 +114,6 @@ module Abachrome
114
114
  end
115
115
  end
116
116
  end
117
- end
117
+ end
118
+
119
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -238,4 +238,6 @@ module Abachrome
238
238
  include mixin_module
239
239
  end
240
240
  end
241
- end
241
+ end
242
+
243
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -46,4 +46,6 @@ module Abachrome
46
46
  end
47
47
  end
48
48
  end
49
- end
49
+ end
50
+
51
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -56,4 +56,6 @@ module Abachrome
56
56
  end
57
57
  end
58
58
  end
59
- end
59
+ end
60
+
61
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -67,4 +67,6 @@ module Abachrome
67
67
  end
68
68
  end
69
69
  end
70
- end
70
+ end
71
+
72
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -47,4 +47,6 @@ module Abachrome
47
47
  end
48
48
  end
49
49
  end
50
- end
50
+ end
51
+
52
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -0,0 +1,45 @@
1
+ #
2
+
3
+ module Abachrome
4
+ module Parsers
5
+ class Tailwind
6
+ # Matches Tailwind color patterns like:
7
+ # - gray-400
8
+ # - blue-900/20 (with opacity)
9
+ # - slate-50
10
+ TAILWIND_PATTERN = /^([a-z]+)-(\d+)(?:\/(\d+(?:\.\d+)?))?$/
11
+
12
+ def self.parse(input)
13
+ match = input.match(TAILWIND_PATTERN)
14
+ return nil unless match
15
+
16
+ color_name = match[1]
17
+ shade = match[2]
18
+ opacity = match[3]
19
+
20
+ # Look up the color in the Tailwind color palette
21
+ color_shades = Named::Tailwind::COLORS[color_name]
22
+ return nil unless color_shades
23
+
24
+ rgb_values = color_shades[shade]
25
+ return nil unless rgb_values
26
+
27
+ # Convert RGB values to 0-1 range
28
+ r, g, b = rgb_values.map { |v| v / 255.0 }
29
+
30
+ # Calculate alpha from opacity percentage if provided
31
+ alpha = if opacity
32
+ opacity_value = opacity.to_f
33
+ # Opacity in Tailwind is a percentage (0-100)
34
+ opacity_value / 100.0
35
+ else
36
+ 1.0
37
+ end
38
+
39
+ Color.from_rgb(r, g, b, alpha)
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -18,4 +18,6 @@ end
18
18
 
19
19
  [Numeric, String, Rational].each do |klass|
20
20
  klass.include(Abachrome::ToAbcd)
21
- end
21
+ end
22
+
23
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
@@ -1,5 +1,7 @@
1
1
  #
2
2
 
3
3
  module Abachrome
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.5"
5
5
  end
6
+
7
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
data/lib/abachrome.rb CHANGED
@@ -129,7 +129,7 @@ module Abachrome
129
129
  end
130
130
 
131
131
  # Creates a color object from a CSS color name.
132
- #
132
+ #
133
133
  # @param color_name [String] The CSS color name (e.g., 'red', 'blue', 'cornflowerblue').
134
134
  # Case-insensitive.
135
135
  # @return [Abachrome::Color, nil] A color object in the RGB color space if the name is valid,
@@ -141,6 +141,15 @@ module Abachrome
141
141
  from_rgb(*rgb_values.map { |v| v / 255.0 })
142
142
  end
143
143
 
144
+ # Parses a CSS color string and returns a Color object.
145
+ #
146
+ # @param css_string [String] The CSS color string to parse (e.g., "#ff0000", "rgb(255, 0, 0)", "red")
147
+ # @return [Abachrome::Color, nil] A Color object if parsing succeeds, nil otherwise
148
+ def parse(css_string)
149
+ require_relative "abachrome/parsers/css"
150
+ Parsers::CSS.parse(css_string)
151
+ end
152
+
144
153
  # Convert a color from its current color space to another color space.
145
154
  #
146
155
  # @param color [Abachrome::Color] The color object to convert
@@ -172,4 +181,6 @@ module Abachrome
172
181
  def register_converter(from_space, to_space, converter)
173
182
  Converter.register(from_space, to_space, converter)
174
183
  end
175
- end
184
+ end
185
+
186
+ # Copyright (c) 2025 Durable Programming, LLC. All rights reserved.
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abachrome
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durable Programming
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 1980-01-01 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: dry-inflector
@@ -97,6 +96,7 @@ files:
97
96
  - lib/abachrome/illuminants/d65.rb
98
97
  - lib/abachrome/illuminants/d75.rb
99
98
  - lib/abachrome/named/css.rb
99
+ - lib/abachrome/named/tailwind.rb
100
100
  - lib/abachrome/outputs/css.rb
101
101
  - lib/abachrome/palette.rb
102
102
  - lib/abachrome/palette_mixins/interpolate.rb
@@ -104,6 +104,7 @@ files:
104
104
  - lib/abachrome/palette_mixins/stretch_luminance.rb
105
105
  - lib/abachrome/parsers/css.rb
106
106
  - lib/abachrome/parsers/hex.rb
107
+ - lib/abachrome/parsers/tailwind.rb
107
108
  - lib/abachrome/to_abcd.rb
108
109
  - lib/abachrome/version.rb
109
110
  - logo.png
@@ -117,7 +118,6 @@ metadata:
117
118
  homepage_uri: https://github.com/durableprogramming/abachrome
118
119
  source_code_uri: https://github.com/durableprogramming/abachrome
119
120
  changelog_uri: https://github.com/durableprogramming/abachrome/blob/main/CHANGELOG.md
120
- post_install_message:
121
121
  rdoc_options: []
122
122
  require_paths:
123
123
  - lib
@@ -132,8 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
132
  - !ruby/object:Gem::Version
133
133
  version: '0'
134
134
  requirements: []
135
- rubygems_version: 3.5.9
136
- signing_key:
135
+ rubygems_version: 3.7.1
137
136
  specification_version: 4
138
137
  summary: A Ruby gem for parsing, manipulating, and managing colors
139
138
  test_files: []