phlex-variants 0.1.0 → 0.2.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 +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: []
|