stimulus_plumbers 0.2.9 → 0.3.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 +31 -0
- data/README.md +5 -4
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +246 -269
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
- data/lib/stimulus_plumbers/components/avatar.rb +4 -3
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +58 -39
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +13 -10
- data/lib/stimulus_plumbers/components/calendar.rb +36 -13
- data/lib/stimulus_plumbers/components/combobox/trigger.rb +6 -6
- data/lib/stimulus_plumbers/components/date_picker/navigation.rb +14 -22
- data/lib/stimulus_plumbers/components/icon.rb +14 -20
- data/lib/stimulus_plumbers/components/popover.rb +11 -6
- data/lib/stimulus_plumbers/configuration.rb +3 -18
- data/lib/stimulus_plumbers/engine.rb +2 -2
- data/lib/stimulus_plumbers/form/builder.rb +1 -1
- data/lib/stimulus_plumbers/form/fields/combobox.rb +7 -4
- data/lib/stimulus_plumbers/form/fields/renderer.rb +5 -2
- data/lib/stimulus_plumbers/plumber/base.rb +1 -1
- data/lib/stimulus_plumbers/plumber/dispatcher/callable_inspector.rb +19 -0
- data/lib/stimulus_plumbers/plumber/dispatcher/instance_exec.rb +35 -0
- data/lib/stimulus_plumbers/plumber/dispatcher/klass_proxy.rb +34 -0
- data/lib/stimulus_plumbers/plumber/dispatcher/method_call.rb +36 -0
- data/lib/stimulus_plumbers/plumber/dispatcher.rb +4 -87
- data/lib/stimulus_plumbers/plumber/html_options.rb +6 -5
- data/lib/stimulus_plumbers/plumber/renderer.rb +2 -2
- data/lib/stimulus_plumbers/themes/base.rb +25 -5
- data/lib/stimulus_plumbers/themes/configuration.rb +38 -0
- data/lib/stimulus_plumbers/themes/schema/form/ranges.rb +14 -0
- data/lib/stimulus_plumbers/themes/schema/icon.rb +32 -0
- data/lib/stimulus_plumbers/themes/schema/ranges.rb +1 -1
- data/lib/stimulus_plumbers/themes/schema.rb +10 -4
- data/lib/stimulus_plumbers/version.rb +1 -1
- metadata +9 -11
- data/lib/stimulus_plumbers/themes/tailwind/action_list.rb +0 -33
- data/lib/stimulus_plumbers/themes/tailwind/avatar.rb +0 -52
- data/lib/stimulus_plumbers/themes/tailwind/button.rb +0 -89
- data/lib/stimulus_plumbers/themes/tailwind/calendar.rb +0 -80
- data/lib/stimulus_plumbers/themes/tailwind/card.rb +0 -24
- data/lib/stimulus_plumbers/themes/tailwind/combobox.rb +0 -75
- data/lib/stimulus_plumbers/themes/tailwind/form.rb +0 -108
- data/lib/stimulus_plumbers/themes/tailwind/layout.rb +0 -25
- data/lib/stimulus_plumbers/themes/tailwind_theme.rb +0 -31
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "themes/base"
|
|
4
|
-
require_relative "themes/
|
|
4
|
+
require_relative "themes/configuration"
|
|
5
5
|
|
|
6
6
|
module StimulusPlumbers
|
|
7
7
|
class Configuration
|
|
8
|
-
DEFAULT_LOG_FORMATTER
|
|
9
|
-
THEME_KLASS_FORMATTER = ->(type) { "StimulusPlumbers::Themes::#{type.to_s.classify}Theme" }
|
|
8
|
+
DEFAULT_LOG_FORMATTER = ->(message) { "[StimulusPlumbers] #{message}" }
|
|
10
9
|
|
|
11
10
|
def theme
|
|
12
|
-
@theme ||=
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def theme=(value)
|
|
16
|
-
@theme = build_theme(value)
|
|
11
|
+
@theme ||= Themes::Configuration.new
|
|
17
12
|
end
|
|
18
13
|
|
|
19
14
|
def log_formatter
|
|
@@ -25,15 +20,5 @@ module StimulusPlumbers
|
|
|
25
20
|
|
|
26
21
|
@log_formatter = callable
|
|
27
22
|
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def build_theme(type)
|
|
32
|
-
return type if type.is_a?(Themes::Base)
|
|
33
|
-
|
|
34
|
-
klass_name = THEME_KLASS_FORMATTER.call(type)
|
|
35
|
-
klass_name.safe_constantize&.new or
|
|
36
|
-
raise ArgumentError, "Unknown theme #{type.inspect}: #{klass_name} is not defined."
|
|
37
|
-
end
|
|
38
23
|
end
|
|
39
24
|
end
|
|
@@ -8,8 +8,8 @@ module StimulusPlumbers
|
|
|
8
8
|
|
|
9
9
|
config.autoload_paths << File.expand_path("../stimulus-plumbers", __dir__)
|
|
10
10
|
|
|
11
|
-
initializer "stimulus_plumbers.assets" do |app|
|
|
12
|
-
app.config.assets.
|
|
11
|
+
initializer "stimulus_plumbers.assets", after: :set_default_precompile do |app|
|
|
12
|
+
app.config.assets.precompile += %w[stimulus_plumbers/tokens.css] if app.config.respond_to?(:assets)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
initializer "stimulus_plumbers.helpers" do
|
|
@@ -19,21 +19,24 @@ module StimulusPlumbers
|
|
|
19
19
|
|
|
20
20
|
rails_opts, field_opts = extract_options(html_options)
|
|
21
21
|
field = build_field(attribute, field_opts)
|
|
22
|
-
base_id = field_id(attribute)
|
|
23
22
|
current_value = object&.public_send(attribute)
|
|
24
23
|
|
|
24
|
+
wrapper = build_combobox_wrapper(klass, attribute, field, current_value, options, rails_opts)
|
|
25
|
+
render_field(field, wrapper)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def build_combobox_wrapper(klass, attribute, field, current_value, options, rails_opts)
|
|
25
29
|
popover = klass.new(@template).render(options: options, value: current_value, **rails_opts)
|
|
26
30
|
opts = klass.default_opts.deep_merge(
|
|
27
31
|
input: { name: field_name(attribute), value: current_value },
|
|
28
32
|
popover: { content: popover }
|
|
29
33
|
)
|
|
30
|
-
|
|
31
|
-
base_id:
|
|
34
|
+
Components::Combobox.new(@template).render(
|
|
35
|
+
base_id: field_id(attribute),
|
|
32
36
|
options: opts,
|
|
33
37
|
**field_theme(:form_combobox, error: field.error?),
|
|
34
38
|
**field.html_opts
|
|
35
39
|
)
|
|
36
|
-
render_field(field, wrapper)
|
|
37
40
|
end
|
|
38
41
|
end
|
|
39
42
|
end
|
|
@@ -42,10 +42,13 @@ module StimulusPlumbers
|
|
|
42
42
|
return "".html_safe if field.errors.none?
|
|
43
43
|
|
|
44
44
|
field.errors.map.with_index(1) do |message, i|
|
|
45
|
-
|
|
46
|
-
Error.new(template).render(message: message, id: id)
|
|
45
|
+
Error.new(template).render(message: message, id: error_id_for(i))
|
|
47
46
|
end.join.html_safe
|
|
48
47
|
end
|
|
48
|
+
|
|
49
|
+
def error_id_for(index)
|
|
50
|
+
field.errors.one? ? field.error_id : "#{field.error_id}_#{index}"
|
|
51
|
+
end
|
|
49
52
|
end
|
|
50
53
|
end
|
|
51
54
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Plumber
|
|
5
|
+
module Dispatcher
|
|
6
|
+
module CallableInspector
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
def args_for(callable)
|
|
10
|
+
callable.arity.negative? ? args : args.take(callable.arity)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def accepts_kwargs?(callable)
|
|
14
|
+
callable.parameters.any? { |type, _| %i[key keyreq keyrest].include?(type) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Plumber
|
|
5
|
+
module Dispatcher
|
|
6
|
+
class InstanceExec
|
|
7
|
+
include CallableInspector
|
|
8
|
+
|
|
9
|
+
attr_reader :block, :args, :kwargs
|
|
10
|
+
|
|
11
|
+
def initialize(block, *args, **kwargs)
|
|
12
|
+
@block = block
|
|
13
|
+
@args = args
|
|
14
|
+
@kwargs = kwargs
|
|
15
|
+
validate!
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def call(target)
|
|
19
|
+
dispatched = args_for(block)
|
|
20
|
+
if accepts_kwargs?(block)
|
|
21
|
+
target.instance_exec(*dispatched, **kwargs, &block)
|
|
22
|
+
else
|
|
23
|
+
target.instance_exec(*dispatched, &block)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def validate!
|
|
30
|
+
raise ArgumentError, "invalid block: #{block.inspect}" unless block.is_a?(Proc)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Plumber
|
|
5
|
+
module Dispatcher
|
|
6
|
+
class KlassProxy
|
|
7
|
+
attr_reader :klass, :method_name, :args, :kwargs, :init_args, :init_kwargs
|
|
8
|
+
|
|
9
|
+
def initialize(klass, method_name, *args, init_args: [], init_kwargs: {}, **kwargs)
|
|
10
|
+
@klass = klass
|
|
11
|
+
@method_name = method_name
|
|
12
|
+
@args = args
|
|
13
|
+
@kwargs = kwargs
|
|
14
|
+
@init_args = init_args
|
|
15
|
+
@init_kwargs = init_kwargs
|
|
16
|
+
validate!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def call(_target)
|
|
20
|
+
klass.new(*init_args, **init_kwargs).public_send(method_name, *args, **kwargs)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def validate!
|
|
26
|
+
raise ArgumentError, "invalid class: #{klass.inspect}" unless klass.is_a?(Module)
|
|
27
|
+
return if method_name.is_a?(String) || method_name.is_a?(Symbol)
|
|
28
|
+
|
|
29
|
+
raise ArgumentError, "invalid method name: #{method_name.inspect}"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Plumber
|
|
5
|
+
module Dispatcher
|
|
6
|
+
class MethodCall
|
|
7
|
+
include CallableInspector
|
|
8
|
+
|
|
9
|
+
attr_reader :method_name, :args, :kwargs
|
|
10
|
+
|
|
11
|
+
def initialize(method_name, *args, **kwargs)
|
|
12
|
+
@method_name = method_name
|
|
13
|
+
@args = args
|
|
14
|
+
@kwargs = kwargs
|
|
15
|
+
validate!
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def call(target)
|
|
19
|
+
raise NotImplementedError, "#{method_name.inspect} not implemented" unless target.respond_to?(method_name, true)
|
|
20
|
+
|
|
21
|
+
method_call = target.method(method_name)
|
|
22
|
+
dispatched = args_for(method_call)
|
|
23
|
+
accepts_kwargs?(method_call) ? method_call.call(*dispatched, **kwargs) : method_call.call(*dispatched)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def validate!
|
|
29
|
+
return if method_name.is_a?(String) || method_name.is_a?(Symbol)
|
|
30
|
+
|
|
31
|
+
raise ArgumentError, "invalid method name: #{method_name.inspect}"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -1,96 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative "dispatcher/callable_inspector"
|
|
4
|
+
require_relative "dispatcher/method_call"
|
|
5
|
+
require_relative "dispatcher/instance_exec"
|
|
6
|
+
require_relative "dispatcher/klass_proxy"
|
|
4
7
|
|
|
5
8
|
module StimulusPlumbers
|
|
6
9
|
module Plumber
|
|
7
10
|
module Dispatcher
|
|
8
|
-
class MethodCall
|
|
9
|
-
attr_reader :method_name, :args, :kwargs
|
|
10
|
-
|
|
11
|
-
def initialize(method_name, *args, **kwargs)
|
|
12
|
-
@method_name = method_name
|
|
13
|
-
@args = args
|
|
14
|
-
@kwargs = kwargs
|
|
15
|
-
validate!
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def call(target)
|
|
19
|
-
raise NotImplementedError, "#{method_name.inspect} not implemented" unless target.respond_to?(method_name, true)
|
|
20
|
-
|
|
21
|
-
method_call = target.method(method_name)
|
|
22
|
-
accepts_args = method_call.arity.negative? ? args : args.take(method_call.arity)
|
|
23
|
-
accepts_kwargs = method_call.parameters.any? { |type, _| %i[key keyreq keyrest].include?(type) }
|
|
24
|
-
accepts_kwargs ? method_call.call(*accepts_args, **kwargs) : method_call.call(*accepts_args)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
def validate!
|
|
30
|
-
return if method_name.is_a?(String) || method_name.is_a?(Symbol)
|
|
31
|
-
|
|
32
|
-
raise ArgumentError, "invalid method name: #{method_name.inspect}"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
class InstanceExec
|
|
37
|
-
attr_reader :block, :args, :kwargs
|
|
38
|
-
|
|
39
|
-
def initialize(block, *args, **kwargs)
|
|
40
|
-
@block = block
|
|
41
|
-
@args = args
|
|
42
|
-
@kwargs = kwargs
|
|
43
|
-
validate!
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def call(target)
|
|
47
|
-
accepts_args = block.arity.negative? ? args : args.take(block.arity)
|
|
48
|
-
accepts_kwargs = block.parameters.any? { |type, _| %i[key keyreq keyrest].include?(type) }
|
|
49
|
-
if accepts_kwargs
|
|
50
|
-
target.instance_exec(
|
|
51
|
-
*accepts_args,
|
|
52
|
-
**kwargs,
|
|
53
|
-
&block
|
|
54
|
-
)
|
|
55
|
-
else
|
|
56
|
-
target.instance_exec(*accepts_args, &block)
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
private
|
|
61
|
-
|
|
62
|
-
def validate!
|
|
63
|
-
raise ArgumentError, "invalid block: #{block.inspect}" unless block.is_a?(Proc)
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
class KlassProxy
|
|
68
|
-
attr_reader :klass, :method_name, :args, :kwargs, :init_args, :init_kwargs
|
|
69
|
-
|
|
70
|
-
def initialize(klass, method_name, *args, init_args: [], init_kwargs: {}, **kwargs)
|
|
71
|
-
@klass = klass
|
|
72
|
-
@method_name = method_name
|
|
73
|
-
@args = args
|
|
74
|
-
@kwargs = kwargs
|
|
75
|
-
@init_args = init_args
|
|
76
|
-
@init_kwargs = init_kwargs
|
|
77
|
-
validate!
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def call(_target)
|
|
81
|
-
klass.new(*init_args, **init_kwargs).public_send(method_name, *args, **kwargs)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
private
|
|
85
|
-
|
|
86
|
-
def validate!
|
|
87
|
-
raise ArgumentError, "invalid class: #{klass.inspect}" unless klass.is_a?(Module)
|
|
88
|
-
return if method_name.is_a?(String) || method_name.is_a?(Symbol)
|
|
89
|
-
|
|
90
|
-
raise ArgumentError, "invalid method name: #{method_name.inspect}"
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
11
|
def self.build(callable, *args, method_name: nil, init_args: [], init_kwargs: {}, **kwargs)
|
|
95
12
|
case callable
|
|
96
13
|
when Symbol
|
|
@@ -8,17 +8,18 @@ module StimulusPlumbers
|
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
10
|
def merge_html_options(*hashes)
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
class_value = merge_string_option(*extract_classes(*hashes)).presence
|
|
12
|
+
merged_data = merge_data_options(*hashes.map { |h| h[:data] || {} })
|
|
13
13
|
rest = hashes.map { |h| h.except(:class, :classes, :data) }.reduce({}, :deep_merge)
|
|
14
14
|
|
|
15
|
-
class_value = merge_string_option(*classes).presence
|
|
16
|
-
merged_data = merge_data_options(*data_hashes)
|
|
17
|
-
|
|
18
15
|
result = class_value ? rest.merge(class: class_value) : rest
|
|
19
16
|
merged_data.present? ? result.merge(data: merged_data) : result
|
|
20
17
|
end
|
|
21
18
|
|
|
19
|
+
def extract_classes(*hashes)
|
|
20
|
+
hashes.flat_map { |h| [h[:class], h[:classes]] }
|
|
21
|
+
end
|
|
22
|
+
|
|
22
23
|
STIMULUS_SPACEJOIN_KEYS = %i[controller action].freeze
|
|
23
24
|
|
|
24
25
|
def merge_data_options(*hashes, spacejoin: STIMULUS_SPACEJOIN_KEYS)
|
|
@@ -12,7 +12,7 @@ module StimulusPlumbers
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
module ClassMethods
|
|
15
|
-
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
15
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
16
16
|
def renders(method_name, with: nil, &block)
|
|
17
17
|
raise ArgumentError, "method_name must be Symbol" unless method_name.is_a?(Symbol)
|
|
18
18
|
raise ArgumentError, "provide either with: or a block" if !with.nil? && block_given?
|
|
@@ -26,7 +26,7 @@ module StimulusPlumbers
|
|
|
26
26
|
self.renderers = renderers.merge(method_name => with)
|
|
27
27
|
ActiveSupport.version >= "7.2" ? generate_renderer_method(method_name) : eval_renderer_method(method_name)
|
|
28
28
|
end
|
|
29
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
29
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
30
30
|
|
|
31
31
|
private
|
|
32
32
|
|
|
@@ -20,6 +20,22 @@ module StimulusPlumbers
|
|
|
20
20
|
@name ||= self.class.name.demodulize.delete_suffix("Theme")
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
+
def avatar_colors
|
|
24
|
+
{}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def avatar_color_range
|
|
28
|
+
[]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def icons
|
|
32
|
+
{}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def icon_range
|
|
36
|
+
icons.keys
|
|
37
|
+
end
|
|
38
|
+
|
|
23
39
|
def attribute_names(component)
|
|
24
40
|
SCHEMA.fetch(component, {}).keys
|
|
25
41
|
end
|
|
@@ -49,11 +65,7 @@ module StimulusPlumbers
|
|
|
49
65
|
def coerce_arg(component, key, value, schema)
|
|
50
66
|
return value unless schema
|
|
51
67
|
|
|
52
|
-
range =
|
|
53
|
-
respond_to?(schema[:range], true) ? send(schema[:range]) : []
|
|
54
|
-
else
|
|
55
|
-
schema[:range]
|
|
56
|
-
end
|
|
68
|
+
range = range_for(schema)
|
|
57
69
|
return value if range.empty? || range.include?(value)
|
|
58
70
|
|
|
59
71
|
StimulusPlumbers::Logger.warn(
|
|
@@ -62,6 +74,14 @@ module StimulusPlumbers
|
|
|
62
74
|
)
|
|
63
75
|
schema[:default]
|
|
64
76
|
end
|
|
77
|
+
|
|
78
|
+
def range_for(schema)
|
|
79
|
+
if schema[:range].is_a?(Symbol)
|
|
80
|
+
respond_to?(schema[:range], true) ? send(schema[:range]) : []
|
|
81
|
+
else
|
|
82
|
+
schema[:range]
|
|
83
|
+
end
|
|
84
|
+
end
|
|
65
85
|
end
|
|
66
86
|
end
|
|
67
87
|
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Themes
|
|
5
|
+
class Configuration
|
|
6
|
+
def register(name, klass)
|
|
7
|
+
raise ArgumentError, "#{klass} must be a subclass of Themes::Base" unless klass <= Base
|
|
8
|
+
|
|
9
|
+
registry[name.to_sym] = klass
|
|
10
|
+
self
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def use(name_or_instance)
|
|
14
|
+
@current = resolve(name_or_instance)
|
|
15
|
+
self
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def current
|
|
19
|
+
@current ||= Base.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def registry
|
|
23
|
+
@registry ||= {}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def resolve(value)
|
|
29
|
+
return value if value.is_a?(Base)
|
|
30
|
+
|
|
31
|
+
klass = registry[value.to_sym]
|
|
32
|
+
raise ArgumentError, "Unknown theme #{value.inspect}. Registered: #{registry.keys.inspect}" unless klass
|
|
33
|
+
|
|
34
|
+
klass.new
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module StimulusPlumbers
|
|
4
|
+
module Themes
|
|
5
|
+
module Schema
|
|
6
|
+
module Icon
|
|
7
|
+
DEFAULTS = {
|
|
8
|
+
fill: "none",
|
|
9
|
+
view_box: "0 0 24 24",
|
|
10
|
+
width: "24",
|
|
11
|
+
height: "24",
|
|
12
|
+
stroke: "currentColor",
|
|
13
|
+
stroke_width: 1.5,
|
|
14
|
+
stroke_linecap: :round,
|
|
15
|
+
stroke_linejoin: :round
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
ATTRS = ([:d] + DEFAULTS.keys).freeze
|
|
19
|
+
|
|
20
|
+
def self.resolve(icon_data)
|
|
21
|
+
return unless icon_data.is_a?(Hash)
|
|
22
|
+
|
|
23
|
+
merged = DEFAULTS.merge(icon_data.slice(*ATTRS)).transform_values(&:to_s)
|
|
24
|
+
return merged if merged[:d].present?
|
|
25
|
+
|
|
26
|
+
StimulusPlumbers::Logger.warn("Icon missing required :d attribute")
|
|
27
|
+
nil
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -8,7 +8,7 @@ module StimulusPlumbers
|
|
|
8
8
|
SIZE = %i[sm md lg].freeze
|
|
9
9
|
FLEX_ALIGN = %i[left center right top bottom].freeze
|
|
10
10
|
FLEX_DIRECTION = %i[row col].freeze
|
|
11
|
-
|
|
11
|
+
BUTTON_VARIANT = %i[primary secondary outline destructive ghost link].freeze
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "schema/ranges"
|
|
4
|
+
require_relative "schema/form/ranges"
|
|
5
|
+
require_relative "schema/icon"
|
|
4
6
|
|
|
5
7
|
module StimulusPlumbers
|
|
6
8
|
module Themes
|
|
@@ -21,7 +23,7 @@ module StimulusPlumbers
|
|
|
21
23
|
|
|
22
24
|
BUTTON = {
|
|
23
25
|
button: {
|
|
24
|
-
variant: { default: :primary, range:
|
|
26
|
+
variant: { default: :primary, range: Ranges::BUTTON_VARIANT },
|
|
25
27
|
size: { default: :md, range: Ranges::SIZE }
|
|
26
28
|
}.freeze,
|
|
27
29
|
button_group: {
|
|
@@ -33,6 +35,7 @@ module StimulusPlumbers
|
|
|
33
35
|
CALENDAR = {
|
|
34
36
|
calendar: {}.freeze,
|
|
35
37
|
calendar_days_of_week: {}.freeze,
|
|
38
|
+
calendar_week: {}.freeze,
|
|
36
39
|
calendar_days_of_month: {}.freeze,
|
|
37
40
|
calendar_day: {
|
|
38
41
|
today: { default: false, range: Ranges::BOOL },
|
|
@@ -41,7 +44,9 @@ module StimulusPlumbers
|
|
|
41
44
|
}.freeze,
|
|
42
45
|
calendar_navigation: {}.freeze,
|
|
43
46
|
calendar_navigation_navigator: {}.freeze,
|
|
44
|
-
calendar_navigation_navigator_icon: {
|
|
47
|
+
calendar_navigation_navigator_icon: {
|
|
48
|
+
name: { default: "arrow-left", range: :icon_range }
|
|
49
|
+
}.freeze
|
|
45
50
|
}.freeze
|
|
46
51
|
|
|
47
52
|
CARD = {
|
|
@@ -50,6 +55,7 @@ module StimulusPlumbers
|
|
|
50
55
|
}.freeze
|
|
51
56
|
|
|
52
57
|
COMBOBOX = {
|
|
58
|
+
combobox_trigger: {}.freeze,
|
|
53
59
|
combobox_option: {
|
|
54
60
|
selected: { default: false, range: Ranges::BOOL },
|
|
55
61
|
disabled: { default: false, range: Ranges::BOOL }
|
|
@@ -63,7 +69,7 @@ module StimulusPlumbers
|
|
|
63
69
|
|
|
64
70
|
FORM = {
|
|
65
71
|
form_group: {
|
|
66
|
-
layout: { default: :stacked, range: Ranges::
|
|
72
|
+
layout: { default: :stacked, range: Form::Ranges::LAYOUT },
|
|
67
73
|
error: { default: false, range: Ranges::BOOL }
|
|
68
74
|
}.freeze,
|
|
69
75
|
form_label: {
|
|
@@ -84,7 +90,7 @@ module StimulusPlumbers
|
|
|
84
90
|
form_input_reveal: {}.freeze,
|
|
85
91
|
form_button_reveal: {}.freeze,
|
|
86
92
|
form_submit: {
|
|
87
|
-
variant: { default: :default, range:
|
|
93
|
+
variant: { default: :default, range: Form::Ranges::SUBMIT_VARIANT }
|
|
88
94
|
}.freeze
|
|
89
95
|
}.freeze
|
|
90
96
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: stimulus_plumbers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ryan Chang
|
|
@@ -10,7 +10,7 @@ cert_chain: []
|
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
|
-
name:
|
|
13
|
+
name: actionview
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
16
|
- - ">="
|
|
@@ -103,20 +103,18 @@ files:
|
|
|
103
103
|
- lib/stimulus_plumbers/logger.rb
|
|
104
104
|
- lib/stimulus_plumbers/plumber/base.rb
|
|
105
105
|
- lib/stimulus_plumbers/plumber/dispatcher.rb
|
|
106
|
+
- lib/stimulus_plumbers/plumber/dispatcher/callable_inspector.rb
|
|
107
|
+
- lib/stimulus_plumbers/plumber/dispatcher/instance_exec.rb
|
|
108
|
+
- lib/stimulus_plumbers/plumber/dispatcher/klass_proxy.rb
|
|
109
|
+
- lib/stimulus_plumbers/plumber/dispatcher/method_call.rb
|
|
106
110
|
- lib/stimulus_plumbers/plumber/html_options.rb
|
|
107
111
|
- lib/stimulus_plumbers/plumber/renderer.rb
|
|
108
112
|
- lib/stimulus_plumbers/themes/base.rb
|
|
113
|
+
- lib/stimulus_plumbers/themes/configuration.rb
|
|
109
114
|
- lib/stimulus_plumbers/themes/schema.rb
|
|
115
|
+
- lib/stimulus_plumbers/themes/schema/form/ranges.rb
|
|
116
|
+
- lib/stimulus_plumbers/themes/schema/icon.rb
|
|
110
117
|
- lib/stimulus_plumbers/themes/schema/ranges.rb
|
|
111
|
-
- lib/stimulus_plumbers/themes/tailwind/action_list.rb
|
|
112
|
-
- lib/stimulus_plumbers/themes/tailwind/avatar.rb
|
|
113
|
-
- lib/stimulus_plumbers/themes/tailwind/button.rb
|
|
114
|
-
- lib/stimulus_plumbers/themes/tailwind/calendar.rb
|
|
115
|
-
- lib/stimulus_plumbers/themes/tailwind/card.rb
|
|
116
|
-
- lib/stimulus_plumbers/themes/tailwind/combobox.rb
|
|
117
|
-
- lib/stimulus_plumbers/themes/tailwind/form.rb
|
|
118
|
-
- lib/stimulus_plumbers/themes/tailwind/layout.rb
|
|
119
|
-
- lib/stimulus_plumbers/themes/tailwind_theme.rb
|
|
120
118
|
- lib/stimulus_plumbers/version.rb
|
|
121
119
|
homepage: https://github.com/ryancyq/stimulus-plumbers
|
|
122
120
|
licenses:
|