tailwind_merge 0.5.0 → 0.5.2
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/CHANGELOG.md +16 -0
- data/lib/tailwind_merge/config.rb +18 -16
- data/lib/tailwind_merge/validators.rb +55 -48
- data/lib/tailwind_merge/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 841da2a133c0b534ffaf670b2d392f22ea11ed1f073f196af0cb7a2faef236b0
|
4
|
+
data.tar.gz: 0f3acf7e784203b48b89bf6edc0607971c5dadd3da378e3f098ecd4ae0f289a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b094c38211947c3110c538c982e0e38ac85aebc39d10619caf2d5fe9dadae8d81413f4ab052a789398cd728d1070c206401d7f8691cd17af87ef8bb784e09609
|
7
|
+
data.tar.gz: a2aaf8d635559f1055f4324f3dd622daf8bb75e3ff36cf24dd118261165dcc90f2272143bbca31dc1350101682cde21bb38d5c1a18ba8271138a4a6f7a470eec
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v0.5.2](https://github.com/gjtorikian/tailwind_merge/tree/v0.5.2) (2023-02-21)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/gjtorikian/tailwind_merge/compare/v0.5.1...v0.5.2)
|
6
|
+
|
7
|
+
**Merged pull requests:**
|
8
|
+
|
9
|
+
- support for container query length units [\#8](https://github.com/gjtorikian/tailwind_merge/pull/8) ([gjtorikian](https://github.com/gjtorikian))
|
10
|
+
|
11
|
+
## [v0.5.1](https://github.com/gjtorikian/tailwind_merge/tree/v0.5.1) (2023-02-05)
|
12
|
+
|
13
|
+
[Full Changelog](https://github.com/gjtorikian/tailwind_merge/compare/v0.5.0...v0.5.1)
|
14
|
+
|
15
|
+
**Merged pull requests:**
|
16
|
+
|
17
|
+
- Fix arbitrary value merging [\#7](https://github.com/gjtorikian/tailwind_merge/pull/7) ([gjtorikian](https://github.com/gjtorikian))
|
18
|
+
|
3
19
|
## [v0.5.0](https://github.com/gjtorikian/tailwind_merge/tree/v0.5.0) (2023-01-30)
|
4
20
|
|
5
21
|
[Full Changelog](https://github.com/gjtorikian/tailwind_merge/compare/v0.4.1...v0.5.0)
|
@@ -64,7 +64,7 @@ module TailwindMerge
|
|
64
64
|
OVERFLOW = -> { ["auto", "hidden", "clip", "visible", "scroll"] }
|
65
65
|
SPACING_WITH_AUTO = -> { ["auto", SPACING] }
|
66
66
|
LENGTH_WITH_EMPTY = -> { ["", IS_LENGTH] }
|
67
|
-
|
67
|
+
NUMBER_WITH_AUTO_AND_ARBITRARY = -> { ["auto", IS_NUMBER, IS_ARBITRARY_VALUE] }
|
68
68
|
POSITIONS = -> {
|
69
69
|
[
|
70
70
|
"bottom",
|
@@ -103,6 +103,8 @@ module TailwindMerge
|
|
103
103
|
ALIGN = -> { ["start", "end", "center", "between", "around", "evenly"] }
|
104
104
|
ZERO_AND_EMPTY = -> { ["", "0", IS_ARBITRARY_VALUE] }
|
105
105
|
BREAKS = -> { ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"] }
|
106
|
+
NUMBER = -> { [IS_NUMBER, IS_ARBITRARY_NUMBER] }
|
107
|
+
NUMBER_AND_ARBITRARY = -> { [IS_NUMBER, IS_ARBITRARY_VALUE] }
|
106
108
|
|
107
109
|
DEFAULTS = {
|
108
110
|
cache_size: 500,
|
@@ -111,25 +113,25 @@ module TailwindMerge
|
|
111
113
|
"colors" => [IS_ANY],
|
112
114
|
"spacing" => [IS_LENGTH],
|
113
115
|
"blur" => ["none", "", IS_TSHIRT_SIZE, IS_ARBITRARY_LENGTH],
|
114
|
-
"brightness" =>
|
116
|
+
"brightness" => NUMBER.call,
|
115
117
|
"border-color" => [COLORS],
|
116
118
|
"border-radius" => ["none", "", "full", IS_TSHIRT_SIZE, IS_ARBITRARY_LENGTH],
|
117
119
|
"border-spacing" => [SPACING],
|
118
120
|
"border-width" => LENGTH_WITH_EMPTY.call,
|
119
|
-
"contrast" =>
|
121
|
+
"contrast" => NUMBER.call,
|
120
122
|
"grayscale" => ZERO_AND_EMPTY.call,
|
121
|
-
"hue-rotate" =>
|
123
|
+
"hue-rotate" => NUMBER_AND_ARBITRARY.call,
|
122
124
|
"invert" => ZERO_AND_EMPTY.call,
|
123
125
|
"gap" => [SPACING],
|
124
126
|
"gradient-color-stops" => [COLORS],
|
125
127
|
"inset" => SPACING_WITH_AUTO.call,
|
126
128
|
"margin" => SPACING_WITH_AUTO.call,
|
127
|
-
"opacity" =>
|
129
|
+
"opacity" => NUMBER.call,
|
128
130
|
"padding" => [SPACING],
|
129
|
-
"saturate" =>
|
130
|
-
"scale" =>
|
131
|
+
"saturate" => NUMBER.call,
|
132
|
+
"scale" => NUMBER.call,
|
131
133
|
"sepia" => ZERO_AND_EMPTY.call,
|
132
|
-
"skew" =>
|
134
|
+
"skew" => NUMBER_AND_ARBITRARY.call,
|
133
135
|
"space" => [SPACING],
|
134
136
|
"translate" => [SPACING],
|
135
137
|
},
|
@@ -306,7 +308,7 @@ module TailwindMerge
|
|
306
308
|
# Z-Index
|
307
309
|
# @see https://tailwindcss.com/docs/z-index
|
308
310
|
##
|
309
|
-
"z" => [{ "z" => [IS_INTEGER] }],
|
311
|
+
"z" => [{ "z" => ["auto", IS_INTEGER] }],
|
310
312
|
# Flexbox and Grid
|
311
313
|
##
|
312
314
|
# Flex Basis
|
@@ -352,17 +354,17 @@ module TailwindMerge
|
|
352
354
|
# Grid Column Start / End
|
353
355
|
# @see https://tailwindcss.com/docs/grid-column
|
354
356
|
##
|
355
|
-
"col-start-end" => [{ "col" => ["auto", { "span" => [IS_INTEGER] }] }],
|
357
|
+
"col-start-end" => [{ "col" => ["auto", { "span" => [IS_INTEGER, IS_ARBITRARY_VALUE] }] }],
|
356
358
|
##
|
357
359
|
# Grid Column Start
|
358
360
|
# @see https://tailwindcss.com/docs/grid-column
|
359
361
|
##
|
360
|
-
"col-start" => [{ "col-start" =>
|
362
|
+
"col-start" => [{ "col-start" => NUMBER_WITH_AUTO_AND_ARBITRARY.call }],
|
361
363
|
##
|
362
364
|
# Grid Column End
|
363
365
|
# @see https://tailwindcss.com/docs/grid-column
|
364
366
|
##
|
365
|
-
"col-end" => [{ "col-end" =>
|
367
|
+
"col-end" => [{ "col-end" => NUMBER_WITH_AUTO_AND_ARBITRARY.call }],
|
366
368
|
##
|
367
369
|
# Grid Template Rows
|
368
370
|
# @see https://tailwindcss.com/docs/grid-template-rows
|
@@ -377,12 +379,12 @@ module TailwindMerge
|
|
377
379
|
# Grid Row Start
|
378
380
|
# @see https://tailwindcss.com/docs/grid-row
|
379
381
|
##
|
380
|
-
"row-start" => [{ "row-start" =>
|
382
|
+
"row-start" => [{ "row-start" => NUMBER_WITH_AUTO_AND_ARBITRARY.call }],
|
381
383
|
##
|
382
384
|
# Grid Row End
|
383
385
|
# @see https://tailwindcss.com/docs/grid-row
|
384
386
|
##
|
385
|
-
"row-end" => [{ "row-end" =>
|
387
|
+
"row-end" => [{ "row-end" => NUMBER_WITH_AUTO_AND_ARBITRARY.call }],
|
386
388
|
##
|
387
389
|
# Grid Auto Flow
|
388
390
|
# @see https://tailwindcss.com/docs/grid-auto-flow
|
@@ -1259,7 +1261,7 @@ module TailwindMerge
|
|
1259
1261
|
# Transition Duration
|
1260
1262
|
# @see https://tailwindcss.com/docs/transition-duration
|
1261
1263
|
##
|
1262
|
-
"duration" => [{ "duration" => [
|
1264
|
+
"duration" => [{ "duration" => [NUMBER_AND_ARBITRARY] }],
|
1263
1265
|
##
|
1264
1266
|
# Transition Timing Function
|
1265
1267
|
# @see https://tailwindcss.com/docs/transition-timing-function
|
@@ -1269,7 +1271,7 @@ module TailwindMerge
|
|
1269
1271
|
# Transition Delay
|
1270
1272
|
# @see https://tailwindcss.com/docs/transition-delay
|
1271
1273
|
##
|
1272
|
-
"delay" => [{ "delay" => [
|
1274
|
+
"delay" => [{ "delay" => [NUMBER_AND_ARBITRARY] }],
|
1273
1275
|
##
|
1274
1276
|
# Animation
|
1275
1277
|
# @see https://tailwindcss.com/docs/animation
|
@@ -5,6 +5,15 @@ require "set"
|
|
5
5
|
module TailwindMerge
|
6
6
|
module Validators
|
7
7
|
class << self
|
8
|
+
def arbitrary_value?(class_part, label, test_value)
|
9
|
+
match = ARBITRARY_VALUE_REGEX.match(class_part)
|
10
|
+
return false unless match
|
11
|
+
|
12
|
+
return match[1] == label if match[1]
|
13
|
+
|
14
|
+
test_value.call(match[2])
|
15
|
+
end
|
16
|
+
|
8
17
|
def numeric?(x)
|
9
18
|
Float(x, exception: false).is_a?(Numeric)
|
10
19
|
end
|
@@ -16,84 +25,82 @@ module TailwindMerge
|
|
16
25
|
|
17
26
|
STRING_LENGTHS = Set.new(["px", "full", "screen"]).freeze
|
18
27
|
|
19
|
-
ARBITRARY_VALUE_REGEX = /^\[(.+)\]$/
|
28
|
+
ARBITRARY_VALUE_REGEX = /^\[(?:([a-z-]+):)?(.+)\]$/i
|
20
29
|
FRACTION_REGEX = %r{^\d+/\d+$}
|
21
|
-
LENGTH_UNIT_REGEX = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh)/
|
30
|
+
LENGTH_UNIT_REGEX = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))/
|
22
31
|
TSHIRT_UNIT_REGEX = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/
|
23
32
|
# Shadow always begins with x and y offset separated by underscore
|
24
33
|
SHADOW_REGEX = /^-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/
|
25
34
|
|
26
|
-
|
27
|
-
|
28
|
-
IS_LENGTH = ->(class_part) {
|
29
|
-
numeric?(class_part) || \
|
30
|
-
STRING_LENGTHS.include?(class_part) || \
|
31
|
-
FRACTION_REGEX.match?(class_part) || \
|
32
|
-
IS_ARBITRARY_LENGTH.call(class_part)
|
35
|
+
is_length_only = ->(value) {
|
36
|
+
LENGTH_UNIT_REGEX.match?(value)
|
33
37
|
}
|
34
38
|
|
35
|
-
|
36
|
-
if (match = ARBITRARY_VALUE_REGEX.match(class_part))
|
37
|
-
return match[1].start_with?("length:") || LENGTH_UNIT_REGEX.match?(class_part)
|
38
|
-
end
|
39
|
+
is_never = ->(_) { false }
|
39
40
|
|
40
|
-
|
41
|
+
is_url = ->(value) {
|
42
|
+
value.start_with?("url(")
|
41
43
|
}
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
45
|
+
is_number = ->(value) {
|
46
|
+
numeric?(value)
|
47
|
+
}
|
47
48
|
|
48
|
-
|
49
|
+
is_integer_only = ->(value) {
|
50
|
+
integer?(value)
|
49
51
|
}
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
53
|
+
is_shadow = ->(value) {
|
54
|
+
SHADOW_REGEX.match?(value)
|
55
|
+
}
|
55
56
|
|
56
|
-
|
57
|
+
IS_LENGTH = ->(value) {
|
58
|
+
numeric?(value) || \
|
59
|
+
STRING_LENGTHS.include?(value) || \
|
60
|
+
FRACTION_REGEX.match?(value) || \
|
61
|
+
IS_ARBITRARY_LENGTH.call(value)
|
57
62
|
}
|
58
63
|
|
59
|
-
|
60
|
-
|
64
|
+
IS_ARBITRARY_LENGTH = ->(value) {
|
65
|
+
arbitrary_value?(value, "length", is_length_only)
|
61
66
|
}
|
62
67
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
68
|
+
IS_ARBITRARY_SIZE = ->(value) {
|
69
|
+
arbitrary_value?(value, "size", is_never)
|
70
|
+
}
|
67
71
|
|
68
|
-
|
72
|
+
IS_ARBITRARY_POSITION = ->(value) {
|
73
|
+
arbitrary_value?(value, "position", is_never)
|
69
74
|
}
|
70
75
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
76
|
+
IS_ARBITRARY_URL = ->(value) {
|
77
|
+
arbitrary_value?(value, "url", is_url)
|
78
|
+
}
|
75
79
|
|
76
|
-
|
80
|
+
IS_ARBITRARY_NUMBER = ->(value) {
|
81
|
+
arbitrary_value?(value, "number", is_number)
|
77
82
|
}
|
78
83
|
|
79
|
-
|
80
|
-
|
84
|
+
IS_NUMBER = ->(value) {
|
85
|
+
is_number.call(value)
|
81
86
|
}
|
82
87
|
|
83
|
-
IS_INTEGER = ->(
|
84
|
-
|
85
|
-
|
86
|
-
end
|
88
|
+
IS_INTEGER = ->(value) {
|
89
|
+
is_integer_only.call(value) || arbitrary_value?(value, "number", is_integer_only)
|
90
|
+
}
|
87
91
|
|
88
|
-
|
92
|
+
IS_ARBITRARY_VALUE = ->(value) {
|
93
|
+
ARBITRARY_VALUE_REGEX.match(value)
|
89
94
|
}
|
90
95
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
96
|
+
IS_ANY = ->(_) { return true }
|
97
|
+
|
98
|
+
IS_TSHIRT_SIZE = ->(value) {
|
99
|
+
TSHIRT_UNIT_REGEX.match?(value)
|
100
|
+
}
|
95
101
|
|
96
|
-
|
102
|
+
IS_ARBITRARY_SHADOW = ->(value) {
|
103
|
+
arbitrary_value?(value, "", is_shadow)
|
97
104
|
}
|
98
105
|
end
|
99
106
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tailwind_merge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Garen J. Torikian
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lru_redux
|