stimulus_plumbers 0.3.3 → 0.4.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 +45 -0
- data/app/assets/javascripts/stimulus-plumbers/controllers.manifest.json +273 -0
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +228 -145
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
- data/app/assets/stylesheets/stimulus_plumbers/tokens.css +43 -7
- data/config/locales/en.yml +10 -0
- data/lib/stimulus_plumbers/components/avatar.rb +14 -13
- data/lib/stimulus_plumbers/components/button/group.rb +9 -4
- data/lib/stimulus_plumbers/components/button/slots.rb +11 -0
- data/lib/stimulus_plumbers/components/button.rb +30 -34
- data/lib/stimulus_plumbers/components/calendar/turbo/days_of_month.rb +151 -0
- data/lib/stimulus_plumbers/components/calendar/turbo/days_of_week.rb +62 -0
- data/lib/stimulus_plumbers/components/calendar/turbo/months_of_year.rb +99 -0
- data/lib/stimulus_plumbers/components/calendar/turbo/years_of_decade.rb +86 -0
- data/lib/stimulus_plumbers/components/calendar/turbo.rb +65 -0
- data/lib/stimulus_plumbers/components/calendar.rb +70 -29
- data/lib/stimulus_plumbers/components/card/slots.rb +26 -0
- data/lib/stimulus_plumbers/components/card.rb +54 -14
- data/lib/stimulus_plumbers/components/combobox/builder.rb +45 -0
- data/lib/stimulus_plumbers/components/combobox/date/navigation.rb +72 -0
- data/lib/stimulus_plumbers/components/combobox/date/navigator.rb +25 -0
- data/lib/stimulus_plumbers/components/combobox/date.rb +34 -24
- data/lib/stimulus_plumbers/components/combobox/dropdown.rb +27 -24
- data/lib/stimulus_plumbers/components/combobox/options/option.rb +1 -1
- data/lib/stimulus_plumbers/components/combobox/options/option_group.rb +1 -1
- data/lib/stimulus_plumbers/components/combobox/time/drum.rb +1 -1
- data/lib/stimulus_plumbers/components/combobox/time.rb +48 -49
- data/lib/stimulus_plumbers/components/combobox/trigger.rb +17 -12
- data/lib/stimulus_plumbers/components/combobox/typeahead.rb +63 -16
- data/lib/stimulus_plumbers/components/combobox.rb +58 -38
- data/lib/stimulus_plumbers/components/divider.rb +9 -8
- data/lib/stimulus_plumbers/components/icon.rb +5 -1
- data/lib/stimulus_plumbers/components/link/slots.rb +11 -0
- data/lib/stimulus_plumbers/components/link.rb +63 -0
- data/lib/stimulus_plumbers/components/list/item/slots.rb +13 -0
- data/lib/stimulus_plumbers/components/list/item.rb +83 -0
- data/lib/stimulus_plumbers/components/list/section.rb +73 -0
- data/lib/stimulus_plumbers/components/list.rb +31 -0
- data/lib/stimulus_plumbers/components/popover/panel.rb +32 -0
- data/lib/stimulus_plumbers/components/popover/trigger.rb +27 -0
- data/lib/stimulus_plumbers/components/popover.rb +44 -18
- data/lib/stimulus_plumbers/engine.rb +1 -0
- data/lib/stimulus_plumbers/form/base.rb +103 -0
- data/lib/stimulus_plumbers/form/builder.rb +71 -24
- data/lib/stimulus_plumbers/form/field.rb +56 -88
- data/lib/stimulus_plumbers/form/fields/error.rb +1 -1
- data/lib/stimulus_plumbers/form/fields/fieldset.rb +11 -8
- data/lib/stimulus_plumbers/form/fields/hint.rb +1 -1
- data/lib/stimulus_plumbers/form/fields/inputs/checkbox.rb +115 -0
- data/lib/stimulus_plumbers/form/fields/inputs/combobox.rb +24 -0
- data/lib/stimulus_plumbers/form/fields/inputs/datetime.rb +40 -58
- data/lib/stimulus_plumbers/form/fields/inputs/file.rb +9 -8
- data/lib/stimulus_plumbers/form/fields/inputs/password.rb +30 -23
- data/lib/stimulus_plumbers/form/fields/inputs/radio.rb +60 -0
- data/lib/stimulus_plumbers/form/fields/inputs/search.rb +31 -54
- data/lib/stimulus_plumbers/form/fields/inputs/select/grouped.rb +22 -33
- data/lib/stimulus_plumbers/form/fields/inputs/select/timezone.rb +3 -46
- data/lib/stimulus_plumbers/form/fields/inputs/select/weekday.rb +3 -26
- data/lib/stimulus_plumbers/form/fields/inputs/select.rb +62 -61
- data/lib/stimulus_plumbers/form/fields/inputs/submit.rb +10 -7
- data/lib/stimulus_plumbers/form/fields/inputs/text.rb +29 -22
- data/lib/stimulus_plumbers/form/fields/inputs/text_area.rb +9 -8
- data/lib/stimulus_plumbers/form/fields/label/floating.rb +41 -0
- data/lib/stimulus_plumbers/form/fields/label.rb +9 -3
- data/lib/stimulus_plumbers/form/fields/renderer.rb +39 -0
- data/lib/stimulus_plumbers/helpers/button_helper.rb +1 -1
- data/lib/stimulus_plumbers/helpers/calendar_helper.rb +2 -2
- data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +56 -4
- data/lib/stimulus_plumbers/helpers/card_helper.rb +1 -11
- data/lib/stimulus_plumbers/helpers/combobox_helper.rb +27 -60
- data/lib/stimulus_plumbers/helpers/icon_helper.rb +11 -0
- data/lib/stimulus_plumbers/helpers/link_helper.rb +11 -0
- data/lib/stimulus_plumbers/helpers/list_helper.rb +11 -0
- data/lib/stimulus_plumbers/helpers/plumber_helper.rb +3 -6
- data/lib/stimulus_plumbers/helpers.rb +6 -2
- data/lib/stimulus_plumbers/logger.rb +4 -3
- data/lib/stimulus_plumbers/plumber/base.rb +6 -1
- data/lib/stimulus_plumbers/plumber/dispatcher/klass_proxy.rb +4 -3
- data/lib/stimulus_plumbers/plumber/dispatcher/method_call.rb +4 -3
- data/lib/stimulus_plumbers/plumber/dispatcher.rb +4 -4
- data/lib/stimulus_plumbers/plumber/options/aria.rb +17 -0
- data/lib/stimulus_plumbers/plumber/options/html.rb +29 -0
- data/lib/stimulus_plumbers/plumber/options/stimulus.rb +29 -0
- data/lib/stimulus_plumbers/plumber/options/theme.rb +19 -0
- data/lib/stimulus_plumbers/plumber/options/token_list.rb +29 -0
- data/lib/stimulus_plumbers/plumber/renderer.rb +136 -41
- data/lib/stimulus_plumbers/plumber/slots.rb +74 -0
- data/lib/stimulus_plumbers/themes/base.rb +5 -7
- data/lib/stimulus_plumbers/themes/schema/avatar/ranges.rb +13 -0
- data/lib/stimulus_plumbers/themes/schema/button/ranges.rb +16 -0
- data/lib/stimulus_plumbers/themes/schema/card/ranges.rb +13 -0
- data/lib/stimulus_plumbers/themes/schema/form/checkbox/ranges.rb +16 -0
- data/lib/stimulus_plumbers/themes/schema/form/radio/ranges.rb +16 -0
- data/lib/stimulus_plumbers/themes/schema/form/ranges.rb +1 -2
- data/lib/stimulus_plumbers/themes/schema/link/ranges.rb +14 -0
- data/lib/stimulus_plumbers/themes/schema/ranges.rb +1 -5
- data/lib/stimulus_plumbers/themes/schema.rb +119 -48
- data/lib/stimulus_plumbers/version.rb +1 -1
- data/lib/stimulus_plumbers.rb +20 -15
- metadata +42 -15
- data/lib/stimulus_plumbers/components/action_list/item.rb +0 -30
- data/lib/stimulus_plumbers/components/action_list/section.rb +0 -28
- data/lib/stimulus_plumbers/components/action_list.rb +0 -29
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +0 -149
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +0 -43
- data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +0 -59
- data/lib/stimulus_plumbers/components/card/section.rb +0 -31
- data/lib/stimulus_plumbers/components/combobox/popover.rb +0 -47
- data/lib/stimulus_plumbers/components/date_picker/navigation.rb +0 -41
- data/lib/stimulus_plumbers/components/date_picker/navigator.rb +0 -23
- data/lib/stimulus_plumbers/components/popover/builder.rb +0 -25
- data/lib/stimulus_plumbers/form/fields/inputs/choice.rb +0 -69
- data/lib/stimulus_plumbers/helpers/action_list_helper.rb +0 -25
- data/lib/stimulus_plumbers/plumber/html_options.rb +0 -52
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/concern"
|
|
4
|
+
require_relative "token_list"
|
|
5
|
+
|
|
6
|
+
module StimulusPlumbers
|
|
7
|
+
module Plumber
|
|
8
|
+
module Options
|
|
9
|
+
module Stimulus
|
|
10
|
+
extend ActiveSupport::Concern
|
|
11
|
+
include TokenList
|
|
12
|
+
|
|
13
|
+
STIMULUS_SPACEJOIN_KEYS = %i[controller action].freeze
|
|
14
|
+
|
|
15
|
+
def merge_stimulus_data(*hashes, spacejoin: STIMULUS_SPACEJOIN_KEYS)
|
|
16
|
+
hashes.reduce({}) do |acc, d|
|
|
17
|
+
acc.merge(d) do |key, old_val, new_val|
|
|
18
|
+
if spacejoin.include?(key.to_sym)
|
|
19
|
+
merge_token_list(old_val, new_val).presence || new_val
|
|
20
|
+
else
|
|
21
|
+
new_val
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/concern"
|
|
4
|
+
require_relative "token_list"
|
|
5
|
+
|
|
6
|
+
module StimulusPlumbers
|
|
7
|
+
module Plumber
|
|
8
|
+
module Options
|
|
9
|
+
module Theme
|
|
10
|
+
extend ActiveSupport::Concern
|
|
11
|
+
include TokenList
|
|
12
|
+
|
|
13
|
+
def merge_theme_options(*hashes)
|
|
14
|
+
merge_token_list(*hashes.flat_map { |h| [h[:class], h[:classes]] }).presence
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/concern"
|
|
4
|
+
|
|
5
|
+
module StimulusPlumbers
|
|
6
|
+
module Plumber
|
|
7
|
+
module Options
|
|
8
|
+
module TokenList
|
|
9
|
+
extend ActiveSupport::Concern
|
|
10
|
+
|
|
11
|
+
def merge_token_list(*parts, delimiter: " ")
|
|
12
|
+
tokens = parts.flat_map { |part| normalize_part(part, delimiter) }
|
|
13
|
+
tokens.compact.uniq.join(delimiter)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def normalize_part(value, delimiter)
|
|
19
|
+
case value
|
|
20
|
+
when String then value.present? ? value.split(delimiter) : []
|
|
21
|
+
when Hash then value.filter_map { |key, val| key if val }
|
|
22
|
+
when Array then [merge_token_list(*value).presence]
|
|
23
|
+
else []
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "active_support/concern"
|
|
4
|
+
require_relative "dispatcher"
|
|
4
5
|
|
|
5
6
|
module StimulusPlumbers
|
|
6
7
|
module Plumber
|
|
@@ -11,78 +12,172 @@ module StimulusPlumbers
|
|
|
11
12
|
class_attribute :renderers, instance_writer: false, default: {}
|
|
12
13
|
end
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
def set_slots
|
|
16
|
+
@set_slots ||= {}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def slot_renderable?(name)
|
|
20
|
+
slots = set_slots[name]
|
|
21
|
+
return false if slots.nil?
|
|
22
|
+
return false if slots.is_a?(StimulusPlumbers::Plumber::Slots) && slots.none?
|
|
23
|
+
return false if slots.is_a?(Array) && slots.empty?
|
|
24
|
+
|
|
25
|
+
true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def slot_kwargs_for(name)
|
|
29
|
+
case set_slots[name]
|
|
30
|
+
when StimulusPlumbers::Plumber::Slots then { slot: set_slots[name] }
|
|
31
|
+
when Array
|
|
32
|
+
values = set_slots[name]
|
|
33
|
+
{ value: values.one? ? values.first : values }
|
|
34
|
+
else {}
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def slot_block_for(name)
|
|
39
|
+
slots = set_slots[name]
|
|
40
|
+
slots if slots.is_a?(Proc)
|
|
41
|
+
end
|
|
19
42
|
|
|
43
|
+
module ClassMethods
|
|
44
|
+
def renders(method_name, with: nil, slots: nil, by: nil, &block)
|
|
45
|
+
validate!(method_name, with, slots, by, block_given?)
|
|
20
46
|
with = block if block_given?
|
|
21
47
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
48
|
+
if slots.present?
|
|
49
|
+
by = Class.new(StimulusPlumbers::Plumber::Slots)
|
|
50
|
+
by.slot(*slots)
|
|
51
|
+
end
|
|
52
|
+
self.renderers = renderers.merge(method_name => { with: with, by: by })
|
|
25
53
|
|
|
26
|
-
|
|
27
|
-
|
|
54
|
+
generate_renderer_method(method_name)
|
|
55
|
+
generate_slot_method(method_name)
|
|
28
56
|
end
|
|
29
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
30
57
|
|
|
31
58
|
private
|
|
32
59
|
|
|
33
|
-
|
|
34
|
-
|
|
60
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
61
|
+
def validate!(method_name, with, slots, by, has_block)
|
|
62
|
+
raise ArgumentError, "method_name must be a Symbol" unless method_name.is_a?(Symbol)
|
|
63
|
+
raise ArgumentError, "provide either with: or a block, not both" if with && has_block
|
|
64
|
+
raise ArgumentError, "slots: requires with:" if slots && with.nil? && !has_block
|
|
65
|
+
raise ArgumentError, "by: requires with:" if by && with.nil?
|
|
66
|
+
raise ArgumentError, "slots: and by: are mutually exclusive" if slots && by
|
|
67
|
+
raise ArgumentError, "by: must be a Class" if by && !by.is_a?(Class)
|
|
68
|
+
|
|
69
|
+
with_proc_or_symbol = with.is_a?(Proc) || with.is_a?(Symbol)
|
|
70
|
+
with_klazz = with.is_a?(Module) || with.is_a?(String)
|
|
71
|
+
raise ArgumentError, "with: must be a Symbol/Proc/Class" unless with_proc_or_symbol || with_klazz || has_block
|
|
35
72
|
end
|
|
73
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
36
74
|
|
|
37
|
-
def
|
|
38
|
-
generated_renderer_methods.
|
|
39
|
-
# def method_name(*args, **kwargs)
|
|
40
|
-
# renderer = renderers.fetch(:method_name, {})
|
|
41
|
-
#
|
|
42
|
-
# unless renderer.present?
|
|
43
|
-
# raise ArgumentError, "#method_name not found in renderer" unless defined?(super)
|
|
44
|
-
# super
|
|
45
|
-
# end
|
|
46
|
-
#
|
|
47
|
-
# dispatcher = StimulusPlumbers::Plumber::Dispatcher.build(
|
|
48
|
-
# renderer, *args, method_name: :#{method_name}, init_args: [template], **kwargs
|
|
49
|
-
# )
|
|
50
|
-
# raise ArgumentError, "invalid renderer, got: \#{renderer.inspect}" unless dispatcher
|
|
51
|
-
#
|
|
52
|
-
# dispatcher.call(self)
|
|
53
|
-
# end
|
|
54
|
-
#{renderer_method_template(method_name)}
|
|
55
|
-
RUBY
|
|
75
|
+
def generated_renderer_methods
|
|
76
|
+
@generated_renderer_methods ||= Module.new.tap { |mod| prepend mod }
|
|
56
77
|
end
|
|
57
78
|
|
|
58
79
|
def generate_renderer_method(method_name)
|
|
80
|
+
return eval_renderer_method(method_name) if ActiveSupport.version < "7.2"
|
|
81
|
+
|
|
59
82
|
require "active_support/code_generator"
|
|
60
83
|
ActiveSupport::CodeGenerator.batch(generated_renderer_methods, __FILE__, __LINE__) do |owner|
|
|
61
|
-
owner.define_cached_method(method_name, namespace: :plumber_renderers) do |batch|
|
|
84
|
+
owner.define_cached_method(:"render_#{method_name}", namespace: :plumber_renderers) do |batch|
|
|
62
85
|
batch << renderer_method_template(method_name)
|
|
63
86
|
end
|
|
64
87
|
end
|
|
65
88
|
end
|
|
66
89
|
|
|
90
|
+
def eval_renderer_method(method_name)
|
|
91
|
+
generated_renderer_methods.module_eval(renderer_method_template(method_name), __FILE__, __LINE__)
|
|
92
|
+
end
|
|
93
|
+
|
|
67
94
|
def renderer_method_template(method_name)
|
|
68
95
|
<<-RUBY
|
|
69
|
-
def #{method_name}(*args, **kwargs)
|
|
70
|
-
|
|
96
|
+
def render_#{method_name}(*args, **kwargs)
|
|
97
|
+
return nil unless slot_renderable?(:#{method_name})
|
|
71
98
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
99
|
+
renderer = renderers.fetch(:#{method_name}, {})
|
|
100
|
+
target = renderer[:with]
|
|
101
|
+
unless target
|
|
102
|
+
raise ArgumentError, "#render_#{method_name} not found" unless defined?(super)
|
|
103
|
+
return super
|
|
75
104
|
end
|
|
76
105
|
|
|
77
106
|
dispatcher = StimulusPlumbers::Plumber::Dispatcher.build(
|
|
78
|
-
|
|
107
|
+
target, *args,
|
|
108
|
+
init_args: [template],
|
|
109
|
+
init_kwargs: {},
|
|
110
|
+
method_name: :render,
|
|
111
|
+
**kwargs,
|
|
112
|
+
**slot_kwargs_for(:#{method_name}),
|
|
113
|
+
&slot_block_for(:#{method_name})
|
|
79
114
|
)
|
|
80
|
-
raise ArgumentError, "invalid renderer
|
|
81
|
-
|
|
115
|
+
raise ArgumentError, "invalid renderer for :#{method_name}" unless dispatcher
|
|
82
116
|
dispatcher.call(self)
|
|
83
117
|
end
|
|
84
118
|
RUBY
|
|
85
119
|
end
|
|
120
|
+
|
|
121
|
+
def generated_slot_methods
|
|
122
|
+
@generated_slot_methods ||= Module.new.tap { |mod| prepend mod }
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def generate_slot_method(method_name)
|
|
126
|
+
return eval_slot_method(method_name) if ActiveSupport.version < "7.2"
|
|
127
|
+
|
|
128
|
+
require "active_support/code_generator"
|
|
129
|
+
ActiveSupport::CodeGenerator.batch(generated_slot_methods, __FILE__, __LINE__) do |owner|
|
|
130
|
+
owner.define_cached_method(:"with_#{method_name}", namespace: :plumber_renderers) do |batch|
|
|
131
|
+
batch << slot_setter_template(method_name)
|
|
132
|
+
end
|
|
133
|
+
owner.define_cached_method(:"#{method_name}", namespace: :plumber_renderers) do |batch|
|
|
134
|
+
batch << slot_getter_template(method_name)
|
|
135
|
+
end
|
|
136
|
+
owner.define_cached_method(:"#{method_name}?", namespace: :plumber_renderers) do |batch|
|
|
137
|
+
batch << slot_predicate_template(method_name)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def eval_slot_method(method_name)
|
|
143
|
+
generated_slot_methods.module_eval(slot_setter_template(method_name), __FILE__, __LINE__)
|
|
144
|
+
generated_slot_methods.module_eval(slot_getter_template(method_name), __FILE__, __LINE__)
|
|
145
|
+
generated_slot_methods.module_eval(slot_predicate_template(method_name), __FILE__, __LINE__)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def slot_setter_template(method_name)
|
|
149
|
+
<<-RUBY
|
|
150
|
+
def with_#{method_name}(*values, &block)
|
|
151
|
+
klass = renderers.dig(:#{method_name}, :by)
|
|
152
|
+
if klass && block_given? && !block.arity.zero?
|
|
153
|
+
builder = klass.new
|
|
154
|
+
block.call(builder)
|
|
155
|
+
set_slots[:#{method_name}] = builder
|
|
156
|
+
elsif block_given?
|
|
157
|
+
set_slots[:#{method_name}] = block
|
|
158
|
+
else
|
|
159
|
+
set_slots[:#{method_name}] = values
|
|
160
|
+
end
|
|
161
|
+
nil
|
|
162
|
+
end
|
|
163
|
+
RUBY
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def slot_getter_template(method_name)
|
|
167
|
+
<<-RUBY
|
|
168
|
+
def #{method_name}
|
|
169
|
+
set_slots[:#{method_name}]
|
|
170
|
+
end
|
|
171
|
+
RUBY
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def slot_predicate_template(method_name)
|
|
175
|
+
<<-RUBY
|
|
176
|
+
def #{method_name}?
|
|
177
|
+
slot_renderable?(:#{method_name})
|
|
178
|
+
end
|
|
179
|
+
RUBY
|
|
180
|
+
end
|
|
86
181
|
end
|
|
87
182
|
end
|
|
88
183
|
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Plumber
|
|
5
|
+
class Slots
|
|
6
|
+
def self.slot(*names, by: nil)
|
|
7
|
+
names.each do |name|
|
|
8
|
+
by ? define_by_slot(name, by) : define_flat_slot(name)
|
|
9
|
+
define_reader(name)
|
|
10
|
+
define_predicate(name)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize
|
|
15
|
+
@slots = {}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def resolve(name)
|
|
19
|
+
entry = @slots[name]
|
|
20
|
+
return unless entry
|
|
21
|
+
|
|
22
|
+
value = entry[:value]
|
|
23
|
+
value = value.call if value.is_a?(Proc)
|
|
24
|
+
block_given? ? yield(value) : value
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def options_for(name)
|
|
28
|
+
(@slots[name] || {})[:options] || {}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def any?
|
|
32
|
+
@slots.any?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def none?
|
|
36
|
+
@slots.empty?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def set_slot(name, value, options = {})
|
|
42
|
+
@slots[name] = { value: value, options: options }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class << self
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def define_flat_slot(name)
|
|
49
|
+
define_method(:"with_#{name}") do |value = nil, **opts, &block|
|
|
50
|
+
set_slot(name, block || value, opts)
|
|
51
|
+
nil
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def define_by_slot(name, by)
|
|
56
|
+
define_method(:"with_#{name}") do |&block|
|
|
57
|
+
sub = by.new
|
|
58
|
+
block&.call(sub)
|
|
59
|
+
set_slot(name, sub)
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def define_reader(name)
|
|
65
|
+
define_method(name) { resolve(name) }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def define_predicate(name)
|
|
69
|
+
define_method(:"#{name}?") { @slots.key?(name) }
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -7,7 +7,7 @@ module StimulusPlumbers
|
|
|
7
7
|
module Themes
|
|
8
8
|
class Base
|
|
9
9
|
SCHEMA = {
|
|
10
|
-
**Schema::
|
|
10
|
+
**Schema::LIST,
|
|
11
11
|
**Schema::AVATAR,
|
|
12
12
|
**Schema::BUTTON,
|
|
13
13
|
**Schema::CALENDAR,
|
|
@@ -16,18 +16,19 @@ module StimulusPlumbers
|
|
|
16
16
|
**Schema::FORM,
|
|
17
17
|
**Schema::ICON,
|
|
18
18
|
**Schema::INPUT_GROUP,
|
|
19
|
-
**Schema::LAYOUT
|
|
19
|
+
**Schema::LAYOUT,
|
|
20
|
+
**Schema::LINK
|
|
20
21
|
}.freeze
|
|
21
22
|
|
|
22
23
|
def name
|
|
23
24
|
@name ||= self.class.name.demodulize.delete_suffix("Theme")
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
def
|
|
27
|
+
def avatar_variants
|
|
27
28
|
{}
|
|
28
29
|
end
|
|
29
30
|
|
|
30
|
-
def
|
|
31
|
+
def avatar_variant_range
|
|
31
32
|
[]
|
|
32
33
|
end
|
|
33
34
|
|
|
@@ -39,9 +40,6 @@ module StimulusPlumbers
|
|
|
39
40
|
SCHEMA.fetch(component, {}).keys
|
|
40
41
|
end
|
|
41
42
|
|
|
42
|
-
# Resolves presentational classes for a component slot.
|
|
43
|
-
# Returns a Hash with :classes (String) and optionally :style (String).
|
|
44
|
-
# Returns {} when no mapping exists for the given component.
|
|
45
43
|
def resolve(component, **args)
|
|
46
44
|
method_name = :"#{component}_classes"
|
|
47
45
|
unless respond_to?(method_name, true)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Themes
|
|
5
|
+
module Schema
|
|
6
|
+
module Button
|
|
7
|
+
module Ranges
|
|
8
|
+
TYPE = %i[default outline ghost fab fab_outline dashed card].freeze
|
|
9
|
+
SIZE = %i[xs sm md lg xl].freeze
|
|
10
|
+
LAYOUT = %i[stacked inline].freeze
|
|
11
|
+
VARIANT = %i[primary secondary tertiary success destructive warning info].freeze
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Themes
|
|
5
|
+
module Schema
|
|
6
|
+
module Form
|
|
7
|
+
module Checkbox
|
|
8
|
+
module Ranges
|
|
9
|
+
TYPE = %i[default button card].freeze
|
|
10
|
+
VARIANT = %i[primary secondary tertiary success destructive warning info].freeze
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Themes
|
|
5
|
+
module Schema
|
|
6
|
+
module Form
|
|
7
|
+
module Radio
|
|
8
|
+
module Ranges
|
|
9
|
+
TYPE = %i[default button card].freeze
|
|
10
|
+
VARIANT = %i[primary secondary tertiary success destructive warning info].freeze
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Themes
|
|
5
|
+
module Schema
|
|
6
|
+
module Link
|
|
7
|
+
module Ranges
|
|
8
|
+
TYPE = %i[default button card].freeze
|
|
9
|
+
VARIANT = %i[default success destructive warning info].freeze
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -4,11 +4,7 @@ module StimulusPlumbers
|
|
|
4
4
|
module Themes
|
|
5
5
|
module Schema
|
|
6
6
|
module Ranges
|
|
7
|
-
BOOL
|
|
8
|
-
SIZE = %i[xs sm md lg xl].freeze
|
|
9
|
-
FLEX_ALIGN = %i[left center right top bottom].freeze
|
|
10
|
-
FLEX_DIRECTION = %i[row col].freeze
|
|
11
|
-
BUTTON_VARIANT = %i[primary secondary outline destructive ghost link fab dashed].freeze
|
|
7
|
+
BOOL = [true, false].freeze
|
|
12
8
|
end
|
|
13
9
|
end
|
|
14
10
|
end
|