phlex-variants 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +70 -2
- data/lib/phlex/variants/version.rb +1 -1
- data/lib/phlex/variants.rb +30 -6
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e87aa83193854c3623cb503ca7931d71b0c1f1bd453c33b84d5969f3079674e3
|
4
|
+
data.tar.gz: '085c09e554ba5aa090127306236100a543f5f94df6e23a37adc6feb28b3ab599'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17d3ede3de7f5aee7f68f44d774d98873570400b24c68787b7fd2b93e9c6d0218d02029232e54e3a0f0d00e4f7991013171785485a98ee1e8e4aa52315d53196
|
7
|
+
data.tar.gz: '087150ea587c8a93254de4fe6df98218b52fb4bdc5079c787d841d87c5718532809657f44521ebded4fe598fb0a8d1881dd6d014c9ef130d418ce7c9b0ff21c5'
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.2.0] - 2024-09-29
|
4
|
+
|
5
|
+
- Allow only true/false for boolean variants
|
6
|
+
- Allow passing false for variants with only true option
|
7
|
+
- Improved error message when variant option doesn't exist
|
8
|
+
- Improved error message when method missing on StyleBuilder
|
9
|
+
- Improve performance of `build_style` method
|
10
|
+
|
3
11
|
## [0.1.0] - 2024-09-25
|
4
12
|
|
5
13
|
- Initial release
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ gem install phlex-variants
|
|
30
30
|
```
|
31
31
|
|
32
32
|
> [!TIP]
|
33
|
-
> If you prefer not to add another dependency to your project, you can simply copy the [Phlex::Variants](https://github.com/stephannv/phlex-
|
33
|
+
> If you prefer not to add another dependency to your project, you can simply copy the [Phlex::Variants](https://github.com/stephannv/phlex-variants/blob/main/lib/phlex/variants.rb) file into your project.
|
34
34
|
|
35
35
|
|
36
36
|
## Usage
|
@@ -66,7 +66,7 @@ class Button < Phlex::HTML
|
|
66
66
|
defaults color: :default, size: :md
|
67
67
|
end
|
68
68
|
|
69
|
-
attr_reader :color, :size, :outline
|
69
|
+
attr_reader :color, :size, :outline
|
70
70
|
|
71
71
|
def initialize(color: nil, size: nil, outline: nil)
|
72
72
|
@color = color
|
@@ -119,6 +119,74 @@ build_style(color: :primary, extra_classes: "disabled:hidden")
|
|
119
119
|
# => "btn btn-danger btn-xs disabled:hidden"
|
120
120
|
```
|
121
121
|
|
122
|
+
#### Generated constants
|
123
|
+
The following code:
|
124
|
+
```ruby
|
125
|
+
style do
|
126
|
+
base "btn"
|
127
|
+
|
128
|
+
variants do
|
129
|
+
color do
|
130
|
+
default "btn-default"
|
131
|
+
primary "btn-primary"
|
132
|
+
danger "btn-danger"
|
133
|
+
end
|
134
|
+
|
135
|
+
size do
|
136
|
+
xs "btn-xs"
|
137
|
+
md "btn-md"
|
138
|
+
lg "btn-lg"
|
139
|
+
end
|
140
|
+
|
141
|
+
outline do
|
142
|
+
yes "btn-outline"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
defaults color: :default, size: :md
|
147
|
+
end
|
148
|
+
```
|
149
|
+
Will generate the following constants in your view class:
|
150
|
+
```ruby
|
151
|
+
STYLE_BASE = "btn"
|
152
|
+
STYLE_VARIANTS = {
|
153
|
+
color: {
|
154
|
+
default: "btn-default",
|
155
|
+
primary: "btn-primary",
|
156
|
+
danger: "btn-danger"
|
157
|
+
},
|
158
|
+
size: {
|
159
|
+
xs: "btn-xs",
|
160
|
+
md: "btn-md",
|
161
|
+
lg: "btn-lg"
|
162
|
+
},
|
163
|
+
outline: {
|
164
|
+
true => "btn-outline"
|
165
|
+
}
|
166
|
+
}
|
167
|
+
STYLE_DEFAULTS = { color: :default, size: :md }
|
168
|
+
```
|
169
|
+
|
170
|
+
For example, if you're creating Lookbook previews, you can do something like this:
|
171
|
+
```ruby
|
172
|
+
class ButtonPreview < Lookbook::Preview
|
173
|
+
# @param color select :color_options
|
174
|
+
def playground(color: nil)
|
175
|
+
render Button.new(color:)
|
176
|
+
end
|
177
|
+
|
178
|
+
private
|
179
|
+
|
180
|
+
def color_options
|
181
|
+
{
|
182
|
+
choices: Button::STYLE_VARIANTS[:color].keys,
|
183
|
+
include_blank: "default",
|
184
|
+
value_type: "Symbol"
|
185
|
+
}
|
186
|
+
end
|
187
|
+
end
|
188
|
+
```
|
189
|
+
|
122
190
|
## Development
|
123
191
|
|
124
192
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/phlex/variants.rb
CHANGED
@@ -27,16 +27,34 @@ module Phlex
|
|
27
27
|
|
28
28
|
# @api private
|
29
29
|
def build_variants_style(variants)
|
30
|
-
|
31
|
-
|
30
|
+
variants = variants.compact
|
31
|
+
variants = self::STYLE_DEFAULTS.merge(variants) unless self::STYLE_DEFAULTS.empty?
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
variants.map do |variant, option|
|
34
|
+
options = self::STYLE_VARIANTS[variant]
|
35
|
+
|
36
|
+
if options
|
37
|
+
value = options[option]
|
38
|
+
|
39
|
+
next value if value
|
40
|
+
|
41
|
+
# doesn't raise error when passing false for variant with only true option
|
42
|
+
next if option == false && options.has_key?(true)
|
35
43
|
end
|
36
44
|
|
37
|
-
|
45
|
+
raise_variant_not_found_error(options, variant, option)
|
38
46
|
end
|
39
47
|
end
|
48
|
+
|
49
|
+
def raise_variant_not_found_error(options, variant, option)
|
50
|
+
message = if options
|
51
|
+
"Option #{option.inspect} for #{variant.inspect} variant doesn't exist. Valid options are: #{options.keys}"
|
52
|
+
else
|
53
|
+
"Variant #{variant.inspect} doesn't exist. Available variants are: #{self::STYLE_VARIANTS.keys}"
|
54
|
+
end
|
55
|
+
|
56
|
+
raise VariantNotFoundError, message
|
57
|
+
end
|
40
58
|
end
|
41
59
|
|
42
60
|
private
|
@@ -77,6 +95,11 @@ module Phlex
|
|
77
95
|
def defaults(**variants)
|
78
96
|
view_class::STYLE_DEFAULTS.merge!(variants)
|
79
97
|
end
|
98
|
+
|
99
|
+
def method_missing(method, *args, &) # standard:disable Style/MissingRespondToMissing
|
100
|
+
message = "undefined method '#{method}' for an instance of Phlex::Variants::StyleBuilder. The available methods are: 'base', 'variants' and 'defaults'"
|
101
|
+
raise NoMethodError, message
|
102
|
+
end
|
80
103
|
end
|
81
104
|
|
82
105
|
# @api private
|
@@ -115,12 +138,13 @@ module Phlex
|
|
115
138
|
|
116
139
|
def method_missing(name, *args) # standard:disable Style/MissingRespondToMissing
|
117
140
|
option = name.to_sym
|
118
|
-
view_class::STYLE_VARIANTS[variant_name][option] = args
|
119
141
|
|
120
142
|
if option == :yes
|
121
143
|
view_class::STYLE_VARIANTS[variant_name][true] = args
|
122
144
|
elsif option == :no
|
123
145
|
view_class::STYLE_VARIANTS[variant_name][false] = args
|
146
|
+
else
|
147
|
+
view_class::STYLE_VARIANTS[variant_name][option] = args
|
124
148
|
end
|
125
149
|
end
|
126
150
|
end
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phlex-variants
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- stephann
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
10
|
+
date: 2024-09-29 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: phlex
|
@@ -52,7 +51,6 @@ licenses:
|
|
52
51
|
- MIT
|
53
52
|
metadata:
|
54
53
|
homepage_uri: https://github.com/stephannv/phlex-variants
|
55
|
-
post_install_message:
|
56
54
|
rdoc_options: []
|
57
55
|
require_paths:
|
58
56
|
- lib
|
@@ -67,8 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
65
|
- !ruby/object:Gem::Version
|
68
66
|
version: '0'
|
69
67
|
requirements: []
|
70
|
-
rubygems_version: 3.
|
71
|
-
signing_key:
|
68
|
+
rubygems_version: 3.6.0.dev
|
72
69
|
specification_version: 4
|
73
70
|
summary: Compose your Phlex component with style variants.
|
74
71
|
test_files: []
|