tailwind_merge 0.12.0 → 0.13.0

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 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