class_variants 0.0.8 → 1.1.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: 35b8ff14e7d3dfe7319d4fb4f09b78aec128422de09402e3504809ef5a0adacf
4
- data.tar.gz: f4b9bd0eec1427ba964d6affd2d3ec0e84126070faadd60cb7b6e51e7979a2ba
3
+ metadata.gz: ffcbc4e2fd078ac3b22bd391226eec4fc4429bcee10237613f1736bfcff08b6f
4
+ data.tar.gz: 4101b943cfd16a259d52e978c3081788451fcd1336ae44644b027aeebb1a4f34
5
5
  SHA512:
6
- metadata.gz: 75f8bb22dafa4d3e67bcc198b804ce85a76705696d0f46f7d9a22fe7c2c97e7af9174304778c808cf00e502cac9f403d8b25d3c9be825b3e963bb042e24d593c
7
- data.tar.gz: 201be369574e67efe1557b2e396fb2aa1e09faad3415d0b88efe9467d6a9137ede50c7b072d3859c09e5ed63eb1df6369748a1fb247146fca451a1a823878948
6
+ metadata.gz: 3dd5e798a846188944d4fe74342414ccfa180ba6fa319a0e1f2b0ab775f4c32c4d0a5c1129a42c52dce44765cd981db20b5a222b6605989ade32e39a7693fb5f
7
+ data.tar.gz: e3eb94faf2f8ad63b6d96fe322b274c77e8a4b2e9fcc2123e267d2b6580398fd06122b73841dbd1a1aea9709667b1afec8ab8c3bce3eecfb4db7e6d409907a76
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 Adrian Marin
3
+ Copyright (c) 2025 Adrian Marin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,8 +1,8 @@
1
1
  module ClassVariants
2
2
  module ActionView
3
3
  module Helpers
4
- def class_variants(classes, **args)
5
- ClassVariants::Instance.new classes, **args
4
+ def class_variants(...)
5
+ ClassVariants::Instance.new(...)
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,11 @@
1
+ module ClassVariants
2
+ class Configuration
3
+ def process_classes_with(&block)
4
+ if block_given?
5
+ @process_classes_with = block
6
+ else
7
+ @process_classes_with
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ module ClassVariants
2
+ module Helper
3
+ module ClassMethods
4
+ def class_variants(...)
5
+ singleton_class.instance_variable_get(:@_class_variants_instance).merge(...)
6
+ end
7
+ end
8
+
9
+ def self.included(base)
10
+ base.extend(ClassMethods)
11
+ base.singleton_class.instance_variable_set(:@_class_variants_instance, ClassVariants::Instance.new)
12
+ base.define_singleton_method(:inherited) do |subclass|
13
+ subclass.singleton_class.instance_variable_set(
14
+ :@_class_variants_instance, base.singleton_class.instance_variable_get(:@_class_variants_instance).dup
15
+ )
16
+ end
17
+ end
18
+
19
+ def class_variants(...)
20
+ self.class.singleton_class.instance_variable_get(:@_class_variants_instance).render(...)
21
+ end
22
+ end
23
+ end
@@ -1,66 +1,132 @@
1
1
  module ClassVariants
2
2
  class Instance
3
- attr_reader :base, :variants, :compound_variants, :defaults
4
-
5
- # rubocop:disable Naming/VariableName
6
- def initialize(classes = nil, base: nil, variants: {}, compoundVariants: [], compound_variants: [], defaults: {})
7
- warn <<~MSG if classes
8
- (ClassVariants) DEPRECATION WARNING: Use of positional argument for default classes is deprecated
9
- and will be removed in the next version. Use the `base` keyword argument instead.
10
- MSG
11
-
12
- warn <<~MSG unless compoundVariants.empty?
13
- (ClassVariants) DEPRECATION WARNING: Use of `compoundVariants` keyword argument is deprecated
14
- and will be removed in the next version. Use the `compound_variant` instead.
15
- MSG
16
-
17
- @base = base || classes
18
- @variants = expand_boolean_variants(variants)
19
- @compound_variants = compound_variants.empty? ? compoundVariants : compound_variants
20
- @defaults = defaults
3
+ def initialize(...)
4
+ @bases = []
5
+ @variants = []
6
+ @defaults = {}
7
+
8
+ merge(...)
9
+ end
10
+
11
+ def dup
12
+ self.class.new.tap do |copy|
13
+ copy.instance_variable_set(:@bases, @bases.dup)
14
+ copy.instance_variable_set(:@variants, @variants.dup)
15
+ copy.instance_variable_set(:@defaults, @defaults.dup)
16
+ end
17
+ end
18
+
19
+ def merge(**options, &block)
20
+ raise ArgumentError, "Use of hash config and code block is not supported" if !options.empty? && block_given?
21
+
22
+ (base = options.fetch(:base, nil)) && @bases << {class: base, slot: :default}
23
+ @variants += [
24
+ expand_variants(options.fetch(:variants, {})),
25
+ expand_compound_variants(options.fetch(:compound_variants, []))
26
+ ].inject(:+)
27
+ @defaults.merge!(options.fetch(:defaults, {}))
28
+
29
+ instance_eval(&block) if block_given?
30
+
31
+ self
21
32
  end
22
- # rubocop:enable Naming/VariableName
23
33
 
24
- def render(**overrides)
34
+ def render(slot = :default, **overrides)
35
+ classes = overrides.delete(:class)
36
+ result = []
37
+
25
38
  # Start with our default classes
26
- result = [@base]
39
+ @bases.each do |base|
40
+ result << base[:class] if base[:slot] == slot
41
+ end
27
42
 
28
43
  # Then merge the passed in overrides on top of the defaults
29
- selected = @defaults.merge(overrides)
44
+ criteria = @defaults.merge(overrides)
30
45
 
31
- selected.each do |variant_type, variant|
32
- # dig the classes out and add them to the result
33
- result << @variants.dig(variant_type, variant)
34
- end
46
+ @variants.each do |candidate|
47
+ next unless candidate[:slot] == slot
35
48
 
36
- @compound_variants.each do |compound_variant|
37
- if (compound_variant.keys - [:class]).all? { |key| selected[key] == compound_variant[key] }
38
- result << compound_variant[:class]
49
+ if (candidate.keys - [:class, :slot]).all? { |key| criteria[key] == candidate[key] }
50
+ result << candidate[:class]
39
51
  end
40
52
  end
41
53
 
54
+ # add the passed in classes to the result
55
+ result << classes
56
+
42
57
  # Compact out any nil values we may have dug up
43
58
  result.compact!
44
59
 
45
60
  # Return the final token list
46
- result.join " "
61
+ with_classess_processor(result.join(" "))
47
62
  end
48
63
 
49
64
  private
50
65
 
51
- def expand_boolean_variants(variants)
52
- expanded = variants.map do |key, value|
53
- case value
66
+ def base(klass = nil, &block)
67
+ raise ArgumentError, "Use of positional argument and code block is not supported" if klass && block_given?
68
+
69
+ if block_given?
70
+ with_slots(&block).each do |slot|
71
+ @bases << slot
72
+ end
73
+ else
74
+ @bases << {slot: :default, class: klass}
75
+ end
76
+ end
77
+
78
+ def variant(**options, &block)
79
+ raise ArgumentError, "Use of class option and code block is not supported" if options.key?(:class) && block_given?
80
+
81
+ if block_given?
82
+ with_slots(&block).each do |slot|
83
+ @variants << options.merge(slot)
84
+ end
85
+ else
86
+ @variants << options.merge(slot: :default)
87
+ end
88
+ end
89
+
90
+ def defaults(**options)
91
+ @defaults = options
92
+ end
93
+
94
+ def slot(name = :default, **options)
95
+ raise ArgumentError, "class option is required" unless options.key?(:class)
96
+
97
+ @slots << options.merge(slot: name)
98
+ end
99
+
100
+ def with_slots
101
+ @slots = []
102
+ yield
103
+ @slots
104
+ end
105
+
106
+ def expand_variants(variants)
107
+ variants.flat_map do |property, values|
108
+ case values
54
109
  when String
55
- s_key = key.to_s
56
- {s_key.delete_prefix("!").to_sym => {!s_key.start_with?("!") => value}}
110
+ {property.to_s.delete_prefix("!").to_sym => !property.to_s.start_with?("!"), :class => values, :slot => :default}
57
111
  else
58
- {key => value}
112
+ values.map do |key, value|
113
+ {property => key, :class => value, :slot => :default}
114
+ end
59
115
  end
60
116
  end
117
+ end
118
+
119
+ def expand_compound_variants(compound_variants)
120
+ compound_variants.map do |compound_variant|
121
+ compound_variant.merge(slot: :default)
122
+ end
123
+ end
61
124
 
62
- expanded.reduce do |output, next_variant|
63
- output.merge!(next_variant) { |_key, v1, v2| v1.merge!(v2) }
125
+ def with_classess_processor(classes)
126
+ if ClassVariants.configuration.process_classes_with.respond_to?(:call)
127
+ ClassVariants.configuration.process_classes_with.call(classes)
128
+ else
129
+ classes
64
130
  end
65
131
  end
66
132
  end
@@ -1,3 +1,3 @@
1
1
  module ClassVariants
2
- VERSION = "0.0.8".freeze
2
+ VERSION = "1.1.0".freeze
3
3
  end
@@ -1,10 +1,20 @@
1
1
  require "class_variants/version"
2
2
  require "class_variants/action_view/helpers"
3
+ require "class_variants/configuration"
3
4
  require "class_variants/instance"
5
+ require "class_variants/helper"
4
6
  require "class_variants/railtie" if defined?(Rails)
5
7
 
6
8
  module ClassVariants
7
9
  class << self
10
+ def configuration
11
+ @configuration ||= Configuration.new
12
+ end
13
+
14
+ def configure(&block)
15
+ yield(configuration)
16
+ end
17
+
8
18
  def build(...)
9
19
  Instance.new(...)
10
20
  end
@@ -0,0 +1,2 @@
1
+ Description:
2
+ Generates initializer file for configure ClassVariants in your application.
@@ -0,0 +1,11 @@
1
+ module ClassVariants
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path("templates", __dir__)
5
+
6
+ def copy_initializer
7
+ template "class_variants.rb", "config/initializers/class_variants.rb"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ClassVariants.configure do |config|
4
+ # # allow to post process classes with an external utility like TailwindMerger
5
+ # config.process_classes_with do |classes|
6
+ # TailwindMerge::Merger.new.merge(classes)
7
+ # end
8
+ # end
data/readme.md CHANGED
@@ -8,7 +8,6 @@ Inspired by [variant-classnames](https://github.com/mattvalleycodes/variant-clas
8
8
 
9
9
  * [DRY up your tailwind CSS using this awesome gem](https://www.youtube.com/watch?v=cFcwNH6x77g)
10
10
 
11
-
12
11
  ## Installation
13
12
 
14
13
  Add this line to your application's Gemfile:
@@ -34,36 +33,38 @@ $ gem install class_variants
34
33
  We create an object from the class or helper where we define the configuration using four arguments:
35
34
 
36
35
  1. The `base` keyword argument with default classes that should be applied to each variant.
37
- 1. The `variants` keyword argument where we declare the variants with their option and classes.
38
- 1. The `compound_variants` keyword argument where we declare the compound variants with their conditions and classes
39
- 1. The `defaults` keyword argument (optional) where we declare the default value for each variant.
40
-
41
- ## Example
36
+ 2. The `variants` keyword argument where we declare the variants with their option and classes.
37
+ 3. The `compound_variants` keyword argument where we declare the compound variants with their conditions and classes
38
+ 4. The `defaults` keyword argument (optional) where we declare the default value for each variant.
42
39
 
43
- Below we implement the [button component](https://tailwindui.com/components/application-ui/elements/buttons) from Tailwind UI.
40
+ Below we'll implement the [button component](https://tailwindui.com/components/application-ui/elements/buttons) from Tailwind UI.
44
41
 
45
42
  ```ruby
46
43
  # Define the variants and defaults
47
44
  button_classes = ClassVariants.build(
48
45
  base: "inline-flex items-center rounded border border-transparent font-medium text-white hover:text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2",
49
46
  variants: {
47
+ color: {
48
+ indigo: "bg-indigo-600 hover:bg-indigo-700 focus:ring-indigo-500",
49
+ red: "bg-red-600 hover:bg-red-700 focus:ring-red-500",
50
+ blue: "bg-blue-600 hover:bg-blue-700 focus:ring-blue-500",
51
+ },
50
52
  size: {
51
53
  sm: "px-2.5 py-1.5 text-xs",
52
54
  md: "px-3 py-2 text-sm",
53
55
  lg: "px-4 py-2 text-sm",
54
56
  xl: "px-4 py-2 text-base",
55
57
  },
56
- color: {
57
- indigo: "bg-indigo-600 hover:bg-indigo-700 focus:ring-indigo-500",
58
- red: "bg-red-600 hover:bg-red-700 focus:ring-red-500",
59
- blue: "bg-blue-600 hover:bg-blue-700 focus:ring-blue-500",
60
- },
58
+ compound_variants: [
59
+ { color: :red, border: true, class: "border-red-800" },
60
+ { color: :blue, border: true, class: "border-blue-800" }
61
+ ]
61
62
  # A variant whose value is a string will be expanded into a hash that looks
62
63
  # like { true => "classes" }
63
- block: "w-full justify-center",
64
+ icon: "w-full justify-center",
64
65
  # Unless the key starts with !, in which case it will expand into
65
66
  # { false => "classes" }
66
- "!block": "w-auto",
67
+ "!icon": "w-auto",
67
68
  },
68
69
  defaults: {
69
70
  size: :md,
@@ -78,7 +79,7 @@ button_classes.render
78
79
  button_classes.render(color: :red, size: :xl, icon: true)
79
80
  ```
80
81
 
81
- ### Compound Variants
82
+ ## Compound Variants
82
83
 
83
84
  ```ruby
84
85
  button_classes = ClassVariants.build(
@@ -100,11 +101,185 @@ button_classes.render(color: :red) # => "inline-flex items-center rounded bg-red
100
101
  button_classes.render(color: :red, border: true) # => "inline-flex items-center rounded bg-red-600 border border-red-600"
101
102
  ```
102
103
 
104
+ ## Override classes with `render`
105
+
106
+ We can also override the builder classes in the `render` method.
107
+
108
+ ```ruby
109
+ button_classes = ClassVariants.build(
110
+ base: "inline-flex items-center rounded",
111
+ variants: { ... },
112
+ )
113
+
114
+ button_classes.render(color: :red, class: "block")
115
+ ```
116
+
117
+ Now, the `block` class will be appended to the classes bus.
118
+
119
+ If you're using the [`tailwind_merge`](#tailwind_merge) plugin it will override the `inline-flex` class.
120
+
121
+ ## Block configurations
122
+
123
+ You might have scenarios where you have more advanced conditionals and you'd like to configure the classes using the block notation.
124
+
125
+ ```ruby
126
+ alert_classes = ClassVariants.build do
127
+ # base
128
+ base "..."
129
+
130
+ # variant
131
+ variant color: :red, class: "..."
132
+
133
+ # compound variant
134
+ variant type: :button, color: :red, class: "..."
135
+
136
+ # defaults
137
+ defaults color: :red, type: :button
138
+ end
139
+
140
+ # usage
141
+ alert_classes.render(color: :red, type: :button)
142
+ ```
143
+
144
+ ## Slots
145
+
146
+ You might have components which have multiple slots or places where you'd like to use conditional classes.
147
+ `class_variants` supports that through slots.
148
+
149
+ ```ruby
150
+ # Example
151
+
152
+ alert_classes = ClassVariants.build do
153
+ # base with slots
154
+ base do
155
+ slot :head, class: "..."
156
+ slot :body, class: "..."
157
+ end
158
+
159
+ # variant with slots
160
+ variant color: :red do
161
+ slot :head, class: "..."
162
+ slot :body, class: "..."
163
+ end
164
+
165
+ # compound variant with slots
166
+ variant type: :button, color: :red do
167
+ slot :head, class: "..."
168
+ slot :body, class: "..."
169
+ end
170
+
171
+ # set defaults
172
+ defaults color: :red, type: :button
173
+ end
174
+ ```
175
+
176
+ ```erb
177
+ <div>
178
+ <div class="<%= alert_classes.render(:head) %>">
179
+ Head of alert
180
+ </div>
181
+ <div class="<%= alert_classes.render(:body) %>">
182
+ Body of alert
183
+ </div>
184
+ </div>
185
+ ```
186
+
187
+ ## Merge definitions
188
+
189
+ ```ruby
190
+ alert_classes = ClassVariants.build(base: "bg-white")
191
+ alert_classes.merge(base: "text-black")
192
+ alert_classes.render # => "bg-white text-black"
193
+ ```
194
+
195
+ ## Full API
196
+
197
+ ```ruby
198
+ # Configuration
199
+ alert_classes = ClassVariants.build(
200
+ base: "...",
201
+ variants: {
202
+ color: {
203
+ red: "...",
204
+ black: "..."
205
+ },
206
+ type: {
207
+ button: "...",
208
+ link: "..."
209
+ }
210
+ },
211
+ compound_variants: [],
212
+ defaults: {
213
+ color: :red,
214
+ type: :button
215
+ }
216
+ ) do
217
+ # base without slots
218
+ base "..."
219
+
220
+ # base with slots
221
+ base do
222
+ slot :head, class: "..."
223
+ slot :body, class: "..."
224
+ end
225
+
226
+ # variant without slots
227
+ variant color: :red, class: "..."
228
+
229
+ # variant with slots
230
+ variant color: :red do
231
+ slot :head, class: "..."
232
+ slot :body, class: "..."
233
+ end
234
+
235
+ # compound variant without slots
236
+ variant type: :button, color: :red, class: "..."
237
+
238
+ # compound variant with slots
239
+ variant type: :button, color: :red do
240
+ slot :head, class: "..."
241
+ slot :body, class: "..."
242
+ end
243
+
244
+ # option 1 (my favorite)
245
+ defaults color: :red, type: :button
246
+
247
+ # option 2
248
+ defaults do
249
+ color :red
250
+ type :button
251
+ end
252
+ end
253
+
254
+ # Usage
255
+
256
+ # renders the defaults
257
+ alert_classes.render
258
+
259
+ # render default slot with custom variants
260
+ alert_classes.render(color: :red)
261
+
262
+ # render slot with defaults variants
263
+ alert_classes.render(:body)
264
+
265
+ # render slot with custom variants
266
+ alert_classes.render(:body, color: :red)
267
+
268
+ # if slot not exist, throw error? return empty classes?
269
+ alert_classes.render(:non_existent_slot, color: :red)
270
+
271
+ # render default slot with custom class (will be merged)
272
+ alert_classes.render(class: "...")
273
+
274
+ # render slot with custom class (will be merged)
275
+ alert_classes.render(:body, class: "...")
276
+ ```
277
+
103
278
  ## Use with Rails
104
279
 
105
280
  ```ruby
106
281
  # Somewhere in your helpers
107
- def button_classes(classes, **args)
282
+ def button_classes
108
283
  class_variants(
109
284
  base: "inline-flex items-center rounded border border-transparent font-medium text-white hover:text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2",
110
285
  variants: {
@@ -137,14 +312,68 @@ end
137
312
 
138
313
  ### Output
139
314
 
140
- ![](sample.jpg)
315
+ ### ![](sample.jpg)
316
+
317
+ ## Helper module
318
+
319
+ If you're developing something more complex you might want to use composition more. You might want to use the helper module for that.
320
+
321
+ ```ruby
322
+ class MyClass
323
+ include ClassVariants::Helper
324
+
325
+ class_variants(
326
+ base: "bg-white",
327
+ variants: {
328
+ color: {
329
+ red: "text-red",
330
+ blue: "text-blue"
331
+ }
332
+ }
333
+ )
334
+ end
335
+
336
+ MyClass.new.class_variants(color: :red, class: "shadow") # => "bg-white text-red shadow"
337
+ ```
338
+
339
+ This helper supports class inheritance, so that the subclass receives a copy of the class_variants config that the parent class had at the time of inheritance. From that point on, the settings are kept separate for both. Successive calls to class_variants helper method, will cause the configuration to be merged.
340
+
341
+ ```ruby
342
+ class A
343
+ include ClassVariants::Helper
344
+
345
+ class_variants(base: "bg-red")
346
+ end
347
+
348
+ class B < A
349
+ class_variants(base: "text-black")
350
+ end
351
+
352
+ A.class_variants(base: "text-white")
353
+
354
+ A.new.class_variants # => "bg-red text-white"
355
+ B.new.class_variants # => "bg-red text-black"
356
+ ```
357
+
358
+ ## `tailwind_merge`
359
+
360
+ By default, the classes are merged using `concat`, but you can use the awesome [TailwindMerge](https://github.com/gjtorikian/tailwind_merge) gem.
361
+ Install the gem using `bundle add tailwind_merge` and use this configuration to enable it. If you're using Rails, you can put this in an initializer.
362
+
363
+ ```ruby
364
+ ClassVariants.configure do |config|
365
+ config.process_classes_with do |classes|
366
+ TailwindMerge::Merger.new.merge(classes)
367
+ end
368
+ end
369
+ ```
141
370
 
142
371
  ## Other packages
143
372
 
144
- - [`active_storage-blurhash`](https://github.com/avo-hq/active_storage-blurhash) - A plug-n-play [blurhash](https://blurha.sh/) integration for images stored in ActiveStorage
145
- - [`avo`](https://github.com/avo-hq/avo) - Build Content management systems with Ruby on Rails
146
- - [`prop_initializer`](https://github.com/avo-hq/prop_initializer) - A flexible tool for defining properties on Ruby classes.
147
- - [`stimulus-confetti`](https://github.com/avo-hq/stimulus-confetti) - The easiest way to add confetti to your StimulusJS app
373
+ - [`active_storage-blurhash`](https://github.com/avo-hq/active_storage-blurhash) - A plug-n-play [blurhash](https://blurha.sh/) integration for images stored in ActiveStorage
374
+ - [`avo`](https://github.com/avo-hq/avo) - Build Content management systems with Ruby on Rails
375
+ - [`prop_initializer`](https://github.com/avo-hq/prop_initializer) - A flexible tool for defining properties on Ruby classes.
376
+ - [`stimulus-confetti`](https://github.com/avo-hq/stimulus-confetti) - The easiest way to add confetti to your StimulusJS app
148
377
 
149
378
  ## Try Avo ⭐️
150
379
 
@@ -155,12 +384,13 @@ If you enjoyed this gem try out [Avo](https://github.com/avo-hq/avo). It helps d
155
384
  ## Contributing
156
385
 
157
386
  1. Fork it `git clone https://github.com/avo-hq/class_variants`
158
- 1. Create your feature branch `git checkout -b my-new-feature`
159
- 1. Commit your changes `git commit -am 'Add some feature'`
160
- 1. Push to the branch `git push origin my-new-feature`
161
- 1. Create new Pull Request
387
+ 2. Create your feature branch `git checkout -b my-new-feature`
388
+ 3. Commit your changes `git commit -am 'Add some feature'`
389
+ 4. Push to the branch `git push origin my-new-feature`
390
+ 5. Create new Pull Request
162
391
 
163
392
  ## License
393
+
164
394
  This package is available as open source under the terms of the MIT License.
165
395
 
166
396
  ## Cutting a release
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: class_variants
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Marin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-24 00:00:00.000000000 Z
11
+ date: 2025-01-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Easily configure styles and apply them as classes.
14
14
  email: adrian@adrianthedev.com
@@ -19,9 +19,14 @@ files:
19
19
  - LICENSE
20
20
  - lib/class_variants.rb
21
21
  - lib/class_variants/action_view/helpers.rb
22
+ - lib/class_variants/configuration.rb
23
+ - lib/class_variants/helper.rb
22
24
  - lib/class_variants/instance.rb
23
25
  - lib/class_variants/railtie.rb
24
26
  - lib/class_variants/version.rb
27
+ - lib/generators/class_variants/install/USAGE
28
+ - lib/generators/class_variants/install/install_generator.rb
29
+ - lib/generators/class_variants/install/templates/class_variants.rb.tt
25
30
  - readme.md
26
31
  homepage: https://github.com/avo-hq/class_variants
27
32
  licenses: