tailwind_merge 0.12.0 → 0.13.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: 62945b1857b5eed46ed2e7c1364c5f4ef76cb47bb8b79a73f2bbaa4b637910f9
4
- data.tar.gz: 4f5a75acf2536ddfef9800750d957a81686613ba6863deef580957ef05494da9
3
+ metadata.gz: 963bec3ea5a28c6f2e282b5836fd2b1bb317aafee92a6c65872b1b52919bca3a
4
+ data.tar.gz: 8b86c7e251064a52b8a591933bb09dcdf5e72efba0edc508066d0bcbf3bf3cfa
5
5
  SHA512:
6
- metadata.gz: 3380302a5365edc1e461ceb42af2431ace5ca770f6288ed565fe5c8493db188c0af44abcd7021543e1f798045bcca9a4fabffcf0db11b672439a43a33075d247
7
- data.tar.gz: 8a9b8701b292cf0d21b65d8d4c4bb94527615b92a7ed38328e084e4f23b719065a105b76d4021739893fb31ababa10bc00dd69a1d9620f5e95db97e11bf59016
6
+ metadata.gz: f980fb0cb733e00de99e109fa12c36a125af360f62ee471ec49da0c2aaa4d57590dcd2957cb3531ab4ebb25bf197ca8e3ccd85b679c140e0dcecb5b38b96324d
7
+ data.tar.gz: 7327cef609f7617f99196d2ef8dd2f98190e7eaf90dc7af0305b5eb4062bc3c8887b5653ce13be427602b9665671745c788a57fa8fa4b1775253b4784ed7bbee
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [v0.13.0] - 29-08-2024
2
+ ## What's Changed
3
+ * Add theme support by @gjtorikian in https://github.com/gjtorikian/tailwind_merge/pull/32
4
+
5
+
6
+ **Full Changelog**: https://github.com/gjtorikian/tailwind_merge/compare/v0.12.2...v0.13.0
7
+ # [v0.12.2] - 18-08-2024
8
+ ## What's Changed
9
+ * remove spurious debug statement by @gjtorikian in https://github.com/gjtorikian/tailwind_merge/pull/28
10
+ * Port over latest updates + bugfixes by @gjtorikian in https://github.com/gjtorikian/tailwind_merge/pull/29
11
+
12
+
13
+ **Full Changelog**: https://github.com/gjtorikian/tailwind_merge/compare/v0.12.0...v0.12.2
14
+ ## [v0.12.0] - 25-04-2024
15
+ ## What's Changed
16
+ * Add support for mix-blend-plus-darker utility by @gjtorikian in https://github.com/gjtorikian/tailwind_merge/pull/27
17
+
18
+
19
+ **Full Changelog**: https://github.com/gjtorikian/tailwind_merge/compare/v0.11.0...v0.12.0
1
20
  ## [v0.11.0] - 26-03-2024
2
21
  ## What's Changed
3
22
  * Support accepting an array of strings by @gjtorikian in https://github.com/gjtorikian/tailwind_merge/pull/26
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Utility function to efficiently merge [Tailwind CSS](https://tailwindcss.com/) classes without style conflicts. Essentially, a Ruby port of [tailwind-merge](https://github.com/dcastil/tailwind-merge).
4
4
 
5
- Supports Tailwind v3.0 up to v3.2.
5
+ Supports Tailwind v3.0 up to v3.4.
6
6
 
7
7
  ## Installation
8
8
 
@@ -310,7 +310,18 @@ In the Tailwind config you can modify theme scales. `tailwind_merge` follows the
310
310
  - `space`
311
311
  - `translate`
312
312
 
313
- If you modified one of these theme scales in your Tailwind config, you can add all your keys right here and tailwind-merge will take care of the rest. If you modified other theme scales, you need to figure out the class group to modify in the [default config](#getdefaultconfig).
313
+ If you modified one of these theme scales in your Tailwind config, you can add all your keys right here and tailwind-merge will take care of the rest. For example, to add custom spaces and margin, you would provide the following `theme`:
314
+
315
+ ```ruby
316
+ merger = TailwindMerge::Merger.new(config: {
317
+ theme: {
318
+ "spacing" => ["my-space"],
319
+ "margin" => ["my-margin"],
320
+ },
321
+ })
322
+ ```
323
+
324
+ If you modified other theme scales, you need to figure out the class group to modify in the [default config](#getdefaultconfig).
314
325
 
315
326
  ### Validators
316
327
 
@@ -4,8 +4,8 @@ module TailwindMerge
4
4
  module Config
5
5
  include Validators
6
6
 
7
- FROM_THEME = ->(config, theme) {
8
- config.fetch(:theme, {}).fetch(theme, nil)
7
+ FROM_THEME = ->(config, key) {
8
+ config[:theme].fetch(key, nil)
9
9
  }
10
10
 
11
11
  COLORS = ->(config) { FROM_THEME.call(config, "colors") }
@@ -105,7 +105,6 @@ module TailwindMerge
105
105
  ALIGN = -> { ["start", "end", "center", "between", "around", "evenly", "stretch"] }
106
106
  ZERO_AND_EMPTY = -> { ["", "0", IS_ARBITRARY_VALUE] }
107
107
  BREAKS = -> { ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"] }
108
- NUMBER = -> { [IS_NUMBER, IS_ARBITRARY_NUMBER] }
109
108
  NUMBER_AND_ARBITRARY = -> { [IS_NUMBER, IS_ARBITRARY_VALUE] }
110
109
 
111
110
  DEFAULTS = {
@@ -115,12 +114,12 @@ module TailwindMerge
115
114
  "colors" => [IS_ANY],
116
115
  "spacing" => [IS_LENGTH, IS_ARBITRARY_LENGTH],
117
116
  "blur" => ["none", "", IS_TSHIRT_SIZE, IS_ARBITRARY_VALUE],
118
- "brightness" => NUMBER.call,
117
+ "brightness" => NUMBER_AND_ARBITRARY.call,
119
118
  "border-color" => [COLORS],
120
119
  "border-radius" => ["none", "", "full", IS_TSHIRT_SIZE, IS_ARBITRARY_VALUE],
121
120
  "border-spacing" => SPACING_WITH_ARBITRARY.call,
122
121
  "border-width" => LENGTH_WITH_EMPTY_AND_ARBITRARY.call,
123
- "contrast" => NUMBER.call,
122
+ "contrast" => NUMBER_AND_ARBITRARY.call,
124
123
  "grayscale" => ZERO_AND_EMPTY.call,
125
124
  "hue-rotate" => NUMBER_AND_ARBITRARY.call,
126
125
  "invert" => ZERO_AND_EMPTY.call,
@@ -129,10 +128,10 @@ module TailwindMerge
129
128
  "gradient-color-stop-positions" => [IS_PERCENT, IS_ARBITRARY_LENGTH],
130
129
  "inset" => SPACING_WITH_AUTO_AND_ARBITRARY.call,
131
130
  "margin" => SPACING_WITH_AUTO_AND_ARBITRARY.call,
132
- "opacity" => NUMBER.call,
131
+ "opacity" => NUMBER_AND_ARBITRARY.call,
133
132
  "padding" => SPACING_WITH_ARBITRARY.call,
134
- "saturate" => NUMBER.call,
135
- "scale" => NUMBER.call,
133
+ "saturate" => NUMBER_AND_ARBITRARY.call,
134
+ "scale" => NUMBER_AND_ARBITRARY.call,
136
135
  "sepia" => ZERO_AND_EMPTY.call,
137
136
  "skew" => NUMBER_AND_ARBITRARY.call,
138
137
  "space" => SPACING_WITH_ARBITRARY.call,
@@ -1841,10 +1840,13 @@ module TailwindMerge
1841
1840
  def merge_configs(extension_config)
1842
1841
  config = TailwindMerge::Config::DEFAULTS
1843
1842
  [:theme].each do |type|
1844
- extension_config.fetch(type, {}).each_pair do |key, value|
1845
- config[type][value] = ->(config) { FROM_THEME.call(config, key) }
1843
+ extension_config.fetch(type, {}).each_pair do |key, scales|
1844
+ config[type][key] << ->(klass) {
1845
+ scales.include?(klass)
1846
+ }
1846
1847
  end
1847
1848
  end
1849
+
1848
1850
  config
1849
1851
  end
1850
1852
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TailwindMerge
4
- VERSION = "0.12.0"
4
+ VERSION = "0.13.0"
5
5
  end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  if ENV.fetch("DEBUG", false)
4
- require "amazing_print"
5
4
  require "debug"
5
+ begin
6
+ require "amazing_print"
7
+ rescue LoadError # rubocop:disable Lint/SuppressedException
8
+ end
6
9
  end
7
10
 
8
11
  require "lru_redux"
@@ -44,15 +47,24 @@ module TailwindMerge
44
47
  end
45
48
  end
46
49
 
47
- private def merge_class_list(classes)
50
+ private def merge_class_list(class_list)
48
51
  # Set of class_group_ids in following format:
49
52
  # `{importantModifier}{variantModifiers}{classGroupId}`
50
53
  # @example 'float'
51
54
  # @example 'hover:focus:bg-color'
52
55
  # @example 'md:!pr'
53
- class_groups_in_conflict = Set.new
56
+ class_groups_in_conflict = []
57
+ class_names = class_list.strip.split(SPLIT_CLASSES_REGEX)
58
+
59
+ result = ""
60
+
61
+ i = class_names.length - 1
62
+
63
+ loop do
64
+ break if i < 0
65
+
66
+ original_class_name = class_names[i]
54
67
 
55
- classes.strip.split(SPLIT_CLASSES_REGEX).map do |original_class_name|
56
68
  modifiers, has_important_modifier, base_class_name, maybe_postfix_modifier_position = split_modifiers(original_class_name, separator: @config[:separator])
57
69
 
58
70
  actual_base_class_name = maybe_postfix_modifier_position ? base_class_name[0...maybe_postfix_modifier_position] : base_class_name
@@ -60,61 +72,48 @@ module TailwindMerge
60
72
 
61
73
  unless class_group_id
62
74
  unless maybe_postfix_modifier_position
63
- next {
64
- is_tailwind_class: false,
65
- original_class_name: original_class_name,
66
- }
75
+ # not a Tailwind class
76
+ result = original_class_name + (!result.empty? ? " " + result : result)
77
+ i -= 1
78
+ next
67
79
  end
68
80
 
69
81
  class_group_id = @class_utils.class_group_id(base_class_name)
70
82
 
71
83
  unless class_group_id
72
- next {
73
- isTailwindClass: false,
74
- original_class_name: original_class_name,
75
- }
76
-
84
+ # not a Tailwind class
85
+ result = original_class_name + (!result.empty? ? " " + result : result)
86
+ i -= 1
87
+ next
77
88
  end
78
89
 
79
90
  has_postfix_modifier = false
80
-
81
- next {
82
- is_tailwind_class: false,
83
- original_class_name: original_class_name,
84
- }
85
91
  end
86
92
 
87
93
  variant_modifier = sort_modifiers(modifiers).join(":")
88
94
 
89
95
  modifier_id = has_important_modifier ? "#{variant_modifier}#{IMPORTANT_MODIFIER}" : variant_modifier
90
-
91
- {
92
- is_tailwind_class: true,
93
- modifier_id: modifier_id,
94
- class_group_id: class_group_id,
95
- original_class_name: original_class_name,
96
- has_postfix_modifier: has_postfix_modifier,
97
- }
98
- end.reverse # Last class in conflict wins, so filter conflicting classes in reverse order.
99
- .select do |parsed|
100
- next(true) unless parsed[:is_tailwind_class]
101
-
102
- modifier_id = parsed[:modifier_id]
103
- class_group_id = parsed[:class_group_id]
104
- has_postfix_modifier = parsed[:has_postfix_modifier]
105
-
106
96
  class_id = "#{modifier_id}#{class_group_id}"
107
97
 
108
- next if class_groups_in_conflict.include?(class_id)
98
+ # Tailwind class omitted due to pre-existing conflict
99
+ if class_groups_in_conflict.include?(class_id)
100
+ i -= 1
101
+ next
102
+ end
109
103
 
110
- class_groups_in_conflict.add(class_id)
104
+ class_groups_in_conflict.push(class_id)
111
105
 
112
106
  @class_utils.get_conflicting_class_group_ids(class_group_id, has_postfix_modifier).each do |group|
113
- class_groups_in_conflict.add("#{modifier_id}#{group}")
107
+ class_groups_in_conflict.push("#{modifier_id}#{group}")
114
108
  end
115
109
 
116
- true
117
- end.reverse.map { |parsed| parsed[:original_class_name] }.join(" ")
110
+ # no conflict!
111
+ result = original_class_name + (!result.empty? ? " " + result : result)
112
+
113
+ i -= 1
114
+ end
115
+
116
+ result
118
117
  end
119
118
  end
120
119
  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.12.0
4
+ version: 0.13.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: 2024-04-25 00:00:00.000000000 Z
11
+ date: 2024-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lru_redux