tailwind_merge 0.7.4 → 0.8.0

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: 54b29a688c5296c4966181e18f78627825e815b7192815d7c82781f525447033
4
- data.tar.gz: 03dbc892736e660e17df42121167d8143d3d910e82e76221ad39a2234f198f9d
3
+ metadata.gz: e5402fe57c8b5f28ac07847bc17a04c6b5cd1ba9ad62ce945920759a95aece31
4
+ data.tar.gz: 0ef6aad523beb48f559b70e6e88662e0db9df8269152d2ccdcb5d08b5f96801b
5
5
  SHA512:
6
- metadata.gz: 646aa7ab4367b068052ffaa5bb3f0064986a5810cd5c21f94294c24f9dd3033c54b8a37cb8a96fc1b9f5926cd6d07fc6289d76057b3260b7fd76d99a215def91
7
- data.tar.gz: 1a29af4fc0ba6a9069cd56937e57f31abf2b8d70bce3c674bc8f59bdf1eb0862322d66ae216a5c7b4ec772681f9c74e795d99e9214d4426ea8b21c4f37f9aad2
6
+ metadata.gz: 568f47ffb9084553b5efc2b37dadcfdf1da552f698340f94bbbd6695618836213d4906b820370e55418350176d2d47c6f63dea5c5957efd34987b0a5ccb2cd4f
7
+ data.tar.gz: f4656fe96ddfed6d74308733575503b33a69cecd9ff261cded4e60978e7a9927652afbd09a2ad0b02ea8988c6540730bc63cbec1edb4f782b5e14d04d4cbebe7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,5 @@
1
+ ## [v0.7.4] - 03-07-2023
2
+ null
1
3
  ## [v0.7.3] - 26-06-2023
2
4
  null
3
5
  # Changelog
data/Gemfile CHANGED
@@ -11,8 +11,6 @@ gem "minitest", "~> 5.0"
11
11
 
12
12
  gem "rubocop", "~> 1.21"
13
13
 
14
- gem "github_changelog_generator", "~> 1.16"
15
-
16
14
  gem "rubocop-standard"
17
15
 
18
16
  gem "amazing_print", require: false
data/README.md CHANGED
@@ -34,15 +34,15 @@ If you use Tailwind with a component-based UI renderer (like [ViewComponent](htt
34
34
  <%= render(ConfirmEmailComponent.new(class: "p-5")) %>
35
35
  ```
36
36
 
37
- When the `ConfirmEmailComponent` is rendered, an input with the className `border rounded px-2 py-1` gets created. But because of the way the [CSS cascade](https://developer.mozilla.org/en-US/docs/Web/CSS/Cascade) works, the styles of the `p-5` class are ignored. The order of the classes in the `class` string doesn't matter at all and the only way to apply the `p-3` styles is to remove both `px-2` and `py-1`.
37
+ When the `ConfirmEmailComponent` is rendered, an input with the className `border rounded px-2 py-1` gets created. But because of the way the [CSS cascade](https://developer.mozilla.org/en-US/docs/Web/CSS/Cascade) works, the styles of the `p-5` class are ignored. The order of the classes in the `class` string doesn't matter at all and the only way to apply the `p-5` style is to remove both `px-2` and `py-1`.
38
38
 
39
39
  This is where `tailwind_merge` comes in:
40
40
 
41
41
  ```ruby
42
42
 
43
43
  @merger = TailwindMerge::Merger.new
44
- @merger.merge("border rounded px-2 py-1 px-5")
45
- # border rounded p-5
44
+ @merger.merge("border rounded px-2 py-1 p-5")
45
+ # → "border rounded p-5"
46
46
  ```
47
47
 
48
48
  tailwind-merge overrides conflicting classes and keeps everything else untouched. In the case of the implementation of `ConfirmEmailComponent`, the input now only renders the classes `border rounded p-5`.
@@ -96,7 +96,7 @@ The order of standard modifiers does not matter for tailwind-merge.
96
96
  >
97
97
  > When using arbitrary values in ambiguous classes like `text-[calc(var(--rebecca)-1rem)]` tailwind-merge looks at the arbitrary value for clues to determine what type of class it is. In this case, like in most ambiguous classes, it would try to figure out whether `calc(var(--rebecca)-1rem)` is a length (making it a font-size class) or a color (making it a text-color class). For lengths it takes clues into account like the presence of the `calc()` function or a digit followed by a length unit like `1rem`.
98
98
  >
99
- > But it isn't always possible to figure out the type by looking at the arbitrary value. E.g. in the class `text-[theme(myCustomScale.rebecca)]` tailwind-merge can't know the type of the arbitrary value and will default to a text-color class. To make tailwind-merge understand the correct type of the arbitrary value in those cases, you can use CSS data type labels [which are used by Tailwind CSS to disambiguate classes](https://tailwindcss.com/docs/adding-custom-styles#resolving-ambiguities): `text-[lengt
99
+ > But it isn't always possible to figure out the type by looking at the arbitrary value. E.g. in the class `text-[theme(myCustomScale.rebecca)]` tailwind-merge can't know the type of the arbitrary value and will default to a text-color class. To make tailwind-merge understand the correct type of the arbitrary value in those cases, you can use CSS data type labels [which are used by Tailwind CSS to disambiguate classes](https://tailwindcss.com/docs/adding-custom-styles#resolving-ambiguities): `text-[length:theme(myCustomScale.rebecca)]`.
100
100
 
101
101
  ### Supports arbitrary properties
102
102
 
@@ -159,9 +159,9 @@ merger = TailwindMerge::Merger.new
159
159
 
160
160
  ### Usage with custom Tailwind config
161
161
 
162
- If you're using a custom Tailwind config, you may need to configure tailwind-merge as well to merge classes properly.
162
+ If you're using a custom Tailwind config, you may need to configure `tailwind_merge` as well to merge classes properly.
163
163
 
164
- The default [`twMerge`](#twmerge) function is configured in a way that you can still use it if all the following points apply to your Tailwind config:
164
+ The default `TailwindMerge::Merger` initializer is configured in a way that you can still use it if all the following points apply to your Tailwind config:
165
165
 
166
166
  - Only using color names which don't clash with other Tailwind class names
167
167
  - Only deviating by number values from number-based Tailwind classes
@@ -177,7 +177,7 @@ The `tailwind_merge` config is different from the Tailwind config because it's e
177
177
  The `tailwind_merge` config is an object with several keys:
178
178
 
179
179
  ```ruby
180
- tailwindMergeConfig = {
180
+ tailwind_merge_config = {
181
181
  # ↓ *Optional* Define how many values should be stored in cache.
182
182
  cache_size: 500,
183
183
  # ↓ *Optional* modifier separator from Tailwind config
@@ -197,6 +197,12 @@ tailwindMergeConfig = {
197
197
  }
198
198
  ```
199
199
 
200
+ To use the custom configuration, pass it to the `TailwindMerge::Merger` initializer:
201
+
202
+ ```ruby
203
+ @merger = TailwindMerge::Merger.new(config: tailwind_merge_config)
204
+ ```
205
+
200
206
  ### Class groups
201
207
 
202
208
  The library uses a concept of _class groups_ which is an array of Tailwind classes which all modify the same CSS property. For example, here is the position class group:
@@ -307,7 +313,7 @@ Here's a brief summary for each validator:
307
313
  - `IS_TSHIRT_SIZE`checks whether class part is a T-shirt size (`sm`, `xl`), optionally with a preceding number (`2xl`).
308
314
  - `IS_ARBITRARY_SIZE` checks whether class part is an arbitrary value which starts with `size:` (`[size:200px_100px]`) which is necessary for background-size classNames.
309
315
  - `IS_ARBITRARY_POSITION` checks whether class part is an arbitrary value which starts with `position:` (`[position:200px_100px]`) which is necessary for background-position classNames.
310
- - `IS_ARBITRARY_URL` checks whether class part is an arbitrary value which starts with `url:` or `url(` (`[url('/path-to-image.png')]`, `url:var(--maybe-a-url-at-runtime)]`) which is necessary for background-image classNames.
316
+ - `IS_ARBITRARY_IMAGE` checks whether class part is an arbitrary value which is an iamge, e.g. by starting with `image:`, `url:`, `linear-gradient(` or `url(` (`[url('/path-to-image.png')]`, `image:var(--maybe-an-image-at-runtime)]`) which is necessary for background-image classNames.
311
317
  - `IS_ARBITRARY_NUMBER` checks whether class part is an arbitrary value which starts with `number:` or is a number (`[number:var(--value)]`, `[450]`) which is necessary for font-weight classNames.
312
318
  - `IS_ARBITRARY_SHADOW` checks whether class part is an arbitrary value which starts with the same pattern as a shadow value (`[0_35px_60px_-15px_rgba(0,0,0,0.3)]`), namely with two lengths separated by a underscore.
313
319
  - `IS_ANY` always returns true. Be careful with this validator as it might match unwanted classes. I use it primarily to match colors or when it's certain there are no other class groups in a namespace.
@@ -898,7 +898,7 @@ module TailwindMerge
898
898
  "bg" => [
899
899
  "none",
900
900
  { "gradient-to" => ["t", "tr", "r", "br", "b", "bl", "l", "tl"] },
901
- IS_ARBITRARY_URL,
901
+ IS_ARBITRARY_IMAGE,
902
902
  ],
903
903
  },
904
904
  ],
@@ -9,7 +9,9 @@ module TailwindMerge
9
9
  match = ARBITRARY_VALUE_REGEX.match(class_part)
10
10
  return false unless match
11
11
 
12
- return match[1] == label if match[1]
12
+ unless match[1].nil?
13
+ return label.is_a?(Set) ? label.include?(match[1]) : label == match[1]
14
+ end
13
15
 
14
16
  test_value.call(match[2])
15
17
  end
@@ -31,6 +33,10 @@ module TailwindMerge
31
33
  TSHIRT_UNIT_REGEX = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/
32
34
  # Shadow always begins with x and y offset separated by underscore
33
35
  SHADOW_REGEX = /^-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/
36
+ IMAGE_REGEX = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/
37
+
38
+ SIZE_LABELS = Set.new(["length", "size", "percentage"]).freeze
39
+ IMAGE_LABELS = Set.new(["image", "url"]).freeze
34
40
 
35
41
  is_length_only = ->(value) {
36
42
  LENGTH_UNIT_REGEX.match?(value)
@@ -38,10 +44,6 @@ module TailwindMerge
38
44
 
39
45
  is_never = ->(_) { false }
40
46
 
41
- is_url = ->(value) {
42
- value.start_with?("url(")
43
- }
44
-
45
47
  is_number = ->(value) {
46
48
  numeric?(value)
47
49
  }
@@ -54,6 +56,10 @@ module TailwindMerge
54
56
  SHADOW_REGEX.match?(value)
55
57
  }
56
58
 
59
+ is_image = ->(value) {
60
+ IMAGE_REGEX.match?(value)
61
+ }
62
+
57
63
  IS_LENGTH = ->(value) {
58
64
  numeric?(value) ||
59
65
  STRING_LENGTHS.include?(value) ||
@@ -66,15 +72,15 @@ module TailwindMerge
66
72
  }
67
73
 
68
74
  IS_ARBITRARY_SIZE = ->(value) {
69
- arbitrary_value?(value, "size", is_never)
75
+ arbitrary_value?(value, SIZE_LABELS, is_never)
70
76
  }
71
77
 
72
78
  IS_ARBITRARY_POSITION = ->(value) {
73
79
  arbitrary_value?(value, "position", is_never)
74
80
  }
75
81
 
76
- IS_ARBITRARY_URL = ->(value) {
77
- arbitrary_value?(value, "url", is_url)
82
+ IS_ARBITRARY_IMAGE = ->(value) {
83
+ arbitrary_value?(value, IMAGE_LABELS, is_image)
78
84
  }
79
85
 
80
86
  IS_ARBITRARY_NUMBER = ->(value) {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TailwindMerge
4
- VERSION = "0.7.4"
4
+ VERSION = "0.8.0"
5
5
  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.7.4
4
+ version: 0.8.0
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-07-03 00:00:00.000000000 Z
11
+ date: 2023-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lru_redux
@@ -73,7 +73,6 @@ files:
73
73
  - lib/tailwind_merge/modifier_utils.rb
74
74
  - lib/tailwind_merge/validators.rb
75
75
  - lib/tailwind_merge/version.rb
76
- - script/generate_changelog
77
76
  - tailwind_merge.gemspec
78
77
  homepage: https://www.github.com/gjtorikian/tailwind_merge
79
78
  licenses:
@@ -100,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
99
  - !ruby/object:Gem::Version
101
100
  version: '0'
102
101
  requirements: []
103
- rubygems_version: 3.4.15
102
+ rubygems_version: 3.4.19
104
103
  signing_key:
105
104
  specification_version: 4
106
105
  summary: Utility function to efficiently merge Tailwind CSS classes without style
@@ -1,3 +0,0 @@
1
- #!/bin/sh
2
-
3
- bundle exec github_changelog_generator --token $GITHUB_TOKEN -u gjtorikian -p tailwind_merge