tailwind_merge 0.4.1 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2172641fe28ddf9f88555cf7a54250764302bf663520fc3c8a4484170ca7cba6
4
- data.tar.gz: fa592d858008e0263da927249fc274ade28ba77b9ba981dd3c1dd48110305108
3
+ metadata.gz: a91c2b0d982a08fffeb7f7a7de91124c386db75de621884d8dbe8370cba39943
4
+ data.tar.gz: 8f8ddc04bb758faf1f051ac90f3c5fb5020b1d54c1d87aedbfaf6c3eb6eb81f5
5
5
  SHA512:
6
- metadata.gz: 50a80cf7b15e4a30921acefa91b8536d61ad3af5e695222c50e87ea922827f30c2af0514931d358c33417272d2c8e5912dad32e1b35117abda095def540e84bc
7
- data.tar.gz: e9e644a0a018627203a0fa515ab3c543b2e85ed7a202a6f2c067228ae1f1f9799fd3ddfaef23a6d63c35bd5f91727c7e021929921e9a35d1429dc5347b78ee4b
6
+ metadata.gz: aec2902cd4796a3170b2806316cbbb8fb33f5d08a3bd8d9f34bbcdaec71b336ef9cd4c7404d8b307dd65c6db3501902bc17f65d651c0069cc08f44358fd92e7e
7
+ data.tar.gz: 8d8d0953a43e780061d462962cca27a4ade00fba4d19be6d23e299704173e3676db47c0cfb369c35dcd07a0f480a3a968916209a6f747609990d19042d2ba989
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.5.1](https://github.com/gjtorikian/tailwind_merge/tree/v0.5.1) (2023-02-05)
4
+
5
+ [Full Changelog](https://github.com/gjtorikian/tailwind_merge/compare/v0.5.0...v0.5.1)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - Fix arbitrary value merging [\#7](https://github.com/gjtorikian/tailwind_merge/pull/7) ([gjtorikian](https://github.com/gjtorikian))
10
+
11
+ ## [v0.5.0](https://github.com/gjtorikian/tailwind_merge/tree/v0.5.0) (2023-01-30)
12
+
13
+ [Full Changelog](https://github.com/gjtorikian/tailwind_merge/compare/v0.4.1...v0.5.0)
14
+
15
+ **Merged pull requests:**
16
+
17
+ - Support decimals [\#6](https://github.com/gjtorikian/tailwind_merge/pull/6) ([gjtorikian](https://github.com/gjtorikian))
18
+
3
19
  ## [v0.4.1](https://github.com/gjtorikian/tailwind_merge/tree/v0.4.1) (2022-12-23)
4
20
 
5
21
  [Full Changelog](https://github.com/gjtorikian/tailwind_merge/compare/v0.4.0...v0.4.1)
data/Gemfile CHANGED
@@ -12,3 +12,8 @@ gem "minitest", "~> 5.0"
12
12
  gem "rubocop", "~> 1.21"
13
13
 
14
14
  gem "github_changelog_generator", "~> 1.16"
15
+
16
+ gem "rubocop-standard"
17
+
18
+ gem "amazing_print"
19
+ gem "debug"
@@ -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
- INTEGER_WITH_AUTO = -> { ["auto", IS_INTEGER] }
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" => [IS_INTEGER],
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" => [IS_INTEGER],
121
+ "contrast" => NUMBER.call,
120
122
  "grayscale" => ZERO_AND_EMPTY.call,
121
- "hue-rotate" => [IS_INTEGER],
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" => [IS_INTEGER],
129
+ "opacity" => NUMBER.call,
128
130
  "padding" => [SPACING],
129
- "saturate" => [IS_INTEGER],
130
- "scale" => [IS_INTEGER],
131
+ "saturate" => NUMBER.call,
132
+ "scale" => NUMBER.call,
131
133
  "sepia" => ZERO_AND_EMPTY.call,
132
- "skew" => [IS_INTEGER, IS_ARBITRARY_VALUE],
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" => INTEGER_WITH_AUTO.call }],
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" => INTEGER_WITH_AUTO.call }],
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" => INTEGER_WITH_AUTO.call }],
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" => INTEGER_WITH_AUTO.call }],
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" => [IS_INTEGER] }],
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" => [IS_INTEGER] }],
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
30
  LENGTH_UNIT_REGEX = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh)/
22
- TSHIRT_UNIT_REGEX = /^(\d+)?(xs|sm|md|lg|xl)$/
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
- IS_ANY = ->(_) { return true }
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
- IS_ARBITRARY_LENGTH = ->(class_part) {
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
- false
41
+ is_url = ->(value) {
42
+ value.start_with?("url(")
41
43
  }
42
44
 
43
- IS_ARBITRARY_SIZE = ->(class_part) {
44
- if (match = ARBITRARY_VALUE_REGEX.match(class_part))
45
- return match[1].start_with?("size:")
46
- end
45
+ is_number = ->(value) {
46
+ numeric?(value)
47
+ }
47
48
 
48
- false
49
+ is_integer_only = ->(value) {
50
+ integer?(value)
49
51
  }
50
52
 
51
- IS_ARBITRARY_POSITION = ->(class_part) {
52
- if (match = ARBITRARY_VALUE_REGEX.match(class_part))
53
- return match[1].start_with?("position:")
54
- end
53
+ is_shadow = ->(value) {
54
+ SHADOW_REGEX.match?(value)
55
+ }
55
56
 
56
- false
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
- IS_ARBITRARY_VALUE = ->(class_part) {
60
- ARBITRARY_VALUE_REGEX.match(class_part)
64
+ IS_ARBITRARY_LENGTH = ->(value) {
65
+ arbitrary_value?(value, "length", is_length_only)
61
66
  }
62
67
 
63
- IS_ARBITRARY_URL = ->(class_part) {
64
- if (match = ARBITRARY_VALUE_REGEX.match(class_part))
65
- return match[1].start_with?("url(", "url:")
66
- end
68
+ IS_ARBITRARY_SIZE = ->(value) {
69
+ arbitrary_value?(value, "size", is_never)
70
+ }
67
71
 
68
- false
72
+ IS_ARBITRARY_POSITION = ->(value) {
73
+ arbitrary_value?(value, "position", is_never)
69
74
  }
70
75
 
71
- IS_ARBITRARY_NUMBER = ->(class_part) {
72
- if (match = ARBITRARY_VALUE_REGEX.match(class_part))
73
- return match[1].start_with?("number:") || numeric?(match[1])
74
- end
76
+ IS_ARBITRARY_URL = ->(value) {
77
+ arbitrary_value?(value, "url", is_url)
78
+ }
75
79
 
76
- false
80
+ IS_ARBITRARY_NUMBER = ->(value) {
81
+ arbitrary_value?(value, "number", is_number)
77
82
  }
78
83
 
79
- IS_TSHIRT_SIZE = ->(class_part) {
80
- TSHIRT_UNIT_REGEX.match?(class_part)
84
+ IS_NUMBER = ->(value) {
85
+ is_number.call(value)
81
86
  }
82
87
 
83
- IS_INTEGER = ->(class_part) {
84
- if (match = ARBITRARY_VALUE_REGEX.match(class_part))
85
- return integer?(match[1])
86
- end
88
+ IS_INTEGER = ->(value) {
89
+ is_integer_only.call(value) || arbitrary_value?(value, "number", is_integer_only)
90
+ }
87
91
 
88
- integer?(class_part)
92
+ IS_ARBITRARY_VALUE = ->(value) {
93
+ ARBITRARY_VALUE_REGEX.match(value)
89
94
  }
90
95
 
91
- IS_ARBITRARY_SHADOW = ->(class_part) {
92
- if (match = ARBITRARY_VALUE_REGEX.match(class_part))
93
- return SHADOW_REGEX.match?(match[1])
94
- end
96
+ IS_ANY = ->(_) { return true }
97
+
98
+ IS_TSHIRT_SIZE = ->(value) {
99
+ TSHIRT_UNIT_REGEX.match?(value)
100
+ }
95
101
 
96
- return false
102
+ IS_ARBITRARY_SHADOW = ->(value) {
103
+ arbitrary_value?(value, "", is_shadow)
97
104
  }
98
105
  end
99
106
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TailwindMerge
4
- VERSION = "0.4.1"
4
+ VERSION = "0.5.1"
5
5
  end
@@ -1,3 +1,3 @@
1
1
  #!/bin/sh
2
2
 
3
- CHANGELOG_GITHUB_TOKEN="$GITHUB_TOKEN" bundle exec github_changelog_generator -u gjtorikian -p tailwind_merge
3
+ bundle exec github_changelog_generator --token $GITHUB_TOKEN -u gjtorikian -p tailwind_merge
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = "https://www.github.com/gjtorikian/tailwind_merge"
13
13
  spec.license = "MIT"
14
14
 
15
- spec.required_ruby_version = [">= 3.0", "< 4.0"]
15
+ spec.required_ruby_version = [">= 3.1", "< 4.0"]
16
16
 
17
17
  spec.metadata = {
18
18
  "funding_uri" => "https://github.com/sponsors/gjtorikian/",
@@ -34,11 +34,6 @@ Gem::Specification.new do |spec|
34
34
 
35
35
  spec.add_dependency("lru_redux", "~> 1.1")
36
36
 
37
- spec.add_development_dependency("amazing_print")
38
- spec.add_development_dependency("debug") if "#{RbConfig::CONFIG["MAJOR"]}.#{RbConfig::CONFIG["MINOR"]}".to_f >= 3.1
39
37
  spec.add_development_dependency("minitest", "~> 5.6")
40
38
  spec.add_development_dependency("minitest-focus", "~> 1.1")
41
- spec.add_development_dependency("rake")
42
- spec.add_development_dependency("redcarpet")
43
- spec.add_development_dependency("rubocop-standard")
44
39
  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.4.1
4
+ version: 0.5.1
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: 2022-12-23 00:00:00.000000000 Z
11
+ date: 2023-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lru_redux
@@ -24,34 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.1'
27
- - !ruby/object:Gem::Dependency
28
- name: amazing_print
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: debug
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: minitest
57
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,48 +52,6 @@ dependencies:
80
52
  - - "~>"
81
53
  - !ruby/object:Gem::Version
82
54
  version: '1.1'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: redcarpet
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-standard
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
55
  description:
126
56
  email:
127
57
  - gjtorikian@gmail.com
@@ -158,7 +88,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
158
88
  requirements:
159
89
  - - ">="
160
90
  - !ruby/object:Gem::Version
161
- version: '3.0'
91
+ version: '3.1'
162
92
  - - "<"
163
93
  - !ruby/object:Gem::Version
164
94
  version: '4.0'