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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/app/assets/javascripts/stimulus-plumbers/controllers.manifest.json +273 -0
  4. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +228 -145
  5. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
  6. data/app/assets/stylesheets/stimulus_plumbers/tokens.css +43 -7
  7. data/config/locales/en.yml +10 -0
  8. data/lib/stimulus_plumbers/components/avatar.rb +14 -13
  9. data/lib/stimulus_plumbers/components/button/group.rb +9 -4
  10. data/lib/stimulus_plumbers/components/button/slots.rb +11 -0
  11. data/lib/stimulus_plumbers/components/button.rb +30 -34
  12. data/lib/stimulus_plumbers/components/calendar/turbo/days_of_month.rb +151 -0
  13. data/lib/stimulus_plumbers/components/calendar/turbo/days_of_week.rb +62 -0
  14. data/lib/stimulus_plumbers/components/calendar/turbo/months_of_year.rb +99 -0
  15. data/lib/stimulus_plumbers/components/calendar/turbo/years_of_decade.rb +86 -0
  16. data/lib/stimulus_plumbers/components/calendar/turbo.rb +65 -0
  17. data/lib/stimulus_plumbers/components/calendar.rb +70 -29
  18. data/lib/stimulus_plumbers/components/card/slots.rb +26 -0
  19. data/lib/stimulus_plumbers/components/card.rb +54 -14
  20. data/lib/stimulus_plumbers/components/combobox/builder.rb +45 -0
  21. data/lib/stimulus_plumbers/components/combobox/date/navigation.rb +72 -0
  22. data/lib/stimulus_plumbers/components/combobox/date/navigator.rb +25 -0
  23. data/lib/stimulus_plumbers/components/combobox/date.rb +34 -24
  24. data/lib/stimulus_plumbers/components/combobox/dropdown.rb +27 -24
  25. data/lib/stimulus_plumbers/components/combobox/options/option.rb +1 -1
  26. data/lib/stimulus_plumbers/components/combobox/options/option_group.rb +1 -1
  27. data/lib/stimulus_plumbers/components/combobox/time/drum.rb +1 -1
  28. data/lib/stimulus_plumbers/components/combobox/time.rb +48 -49
  29. data/lib/stimulus_plumbers/components/combobox/trigger.rb +17 -12
  30. data/lib/stimulus_plumbers/components/combobox/typeahead.rb +63 -16
  31. data/lib/stimulus_plumbers/components/combobox.rb +58 -38
  32. data/lib/stimulus_plumbers/components/divider.rb +9 -8
  33. data/lib/stimulus_plumbers/components/icon.rb +5 -1
  34. data/lib/stimulus_plumbers/components/link/slots.rb +11 -0
  35. data/lib/stimulus_plumbers/components/link.rb +63 -0
  36. data/lib/stimulus_plumbers/components/list/item/slots.rb +13 -0
  37. data/lib/stimulus_plumbers/components/list/item.rb +83 -0
  38. data/lib/stimulus_plumbers/components/list/section.rb +73 -0
  39. data/lib/stimulus_plumbers/components/list.rb +31 -0
  40. data/lib/stimulus_plumbers/components/popover/panel.rb +32 -0
  41. data/lib/stimulus_plumbers/components/popover/trigger.rb +27 -0
  42. data/lib/stimulus_plumbers/components/popover.rb +44 -18
  43. data/lib/stimulus_plumbers/engine.rb +1 -0
  44. data/lib/stimulus_plumbers/form/base.rb +103 -0
  45. data/lib/stimulus_plumbers/form/builder.rb +71 -24
  46. data/lib/stimulus_plumbers/form/field.rb +56 -88
  47. data/lib/stimulus_plumbers/form/fields/error.rb +1 -1
  48. data/lib/stimulus_plumbers/form/fields/fieldset.rb +11 -8
  49. data/lib/stimulus_plumbers/form/fields/hint.rb +1 -1
  50. data/lib/stimulus_plumbers/form/fields/inputs/checkbox.rb +115 -0
  51. data/lib/stimulus_plumbers/form/fields/inputs/combobox.rb +24 -0
  52. data/lib/stimulus_plumbers/form/fields/inputs/datetime.rb +40 -58
  53. data/lib/stimulus_plumbers/form/fields/inputs/file.rb +9 -8
  54. data/lib/stimulus_plumbers/form/fields/inputs/password.rb +30 -23
  55. data/lib/stimulus_plumbers/form/fields/inputs/radio.rb +60 -0
  56. data/lib/stimulus_plumbers/form/fields/inputs/search.rb +31 -54
  57. data/lib/stimulus_plumbers/form/fields/inputs/select/grouped.rb +22 -33
  58. data/lib/stimulus_plumbers/form/fields/inputs/select/timezone.rb +3 -46
  59. data/lib/stimulus_plumbers/form/fields/inputs/select/weekday.rb +3 -26
  60. data/lib/stimulus_plumbers/form/fields/inputs/select.rb +62 -61
  61. data/lib/stimulus_plumbers/form/fields/inputs/submit.rb +10 -7
  62. data/lib/stimulus_plumbers/form/fields/inputs/text.rb +29 -22
  63. data/lib/stimulus_plumbers/form/fields/inputs/text_area.rb +9 -8
  64. data/lib/stimulus_plumbers/form/fields/label/floating.rb +41 -0
  65. data/lib/stimulus_plumbers/form/fields/label.rb +9 -3
  66. data/lib/stimulus_plumbers/form/fields/renderer.rb +39 -0
  67. data/lib/stimulus_plumbers/helpers/button_helper.rb +1 -1
  68. data/lib/stimulus_plumbers/helpers/calendar_helper.rb +2 -2
  69. data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +56 -4
  70. data/lib/stimulus_plumbers/helpers/card_helper.rb +1 -11
  71. data/lib/stimulus_plumbers/helpers/combobox_helper.rb +27 -60
  72. data/lib/stimulus_plumbers/helpers/icon_helper.rb +11 -0
  73. data/lib/stimulus_plumbers/helpers/link_helper.rb +11 -0
  74. data/lib/stimulus_plumbers/helpers/list_helper.rb +11 -0
  75. data/lib/stimulus_plumbers/helpers/plumber_helper.rb +3 -6
  76. data/lib/stimulus_plumbers/helpers.rb +6 -2
  77. data/lib/stimulus_plumbers/logger.rb +4 -3
  78. data/lib/stimulus_plumbers/plumber/base.rb +6 -1
  79. data/lib/stimulus_plumbers/plumber/dispatcher/klass_proxy.rb +4 -3
  80. data/lib/stimulus_plumbers/plumber/dispatcher/method_call.rb +4 -3
  81. data/lib/stimulus_plumbers/plumber/dispatcher.rb +4 -4
  82. data/lib/stimulus_plumbers/plumber/options/aria.rb +17 -0
  83. data/lib/stimulus_plumbers/plumber/options/html.rb +29 -0
  84. data/lib/stimulus_plumbers/plumber/options/stimulus.rb +29 -0
  85. data/lib/stimulus_plumbers/plumber/options/theme.rb +19 -0
  86. data/lib/stimulus_plumbers/plumber/options/token_list.rb +29 -0
  87. data/lib/stimulus_plumbers/plumber/renderer.rb +136 -41
  88. data/lib/stimulus_plumbers/plumber/slots.rb +74 -0
  89. data/lib/stimulus_plumbers/themes/base.rb +5 -7
  90. data/lib/stimulus_plumbers/themes/schema/avatar/ranges.rb +13 -0
  91. data/lib/stimulus_plumbers/themes/schema/button/ranges.rb +16 -0
  92. data/lib/stimulus_plumbers/themes/schema/card/ranges.rb +13 -0
  93. data/lib/stimulus_plumbers/themes/schema/form/checkbox/ranges.rb +16 -0
  94. data/lib/stimulus_plumbers/themes/schema/form/radio/ranges.rb +16 -0
  95. data/lib/stimulus_plumbers/themes/schema/form/ranges.rb +1 -2
  96. data/lib/stimulus_plumbers/themes/schema/link/ranges.rb +14 -0
  97. data/lib/stimulus_plumbers/themes/schema/ranges.rb +1 -5
  98. data/lib/stimulus_plumbers/themes/schema.rb +119 -48
  99. data/lib/stimulus_plumbers/version.rb +1 -1
  100. data/lib/stimulus_plumbers.rb +20 -15
  101. metadata +42 -15
  102. data/lib/stimulus_plumbers/components/action_list/item.rb +0 -30
  103. data/lib/stimulus_plumbers/components/action_list/section.rb +0 -28
  104. data/lib/stimulus_plumbers/components/action_list.rb +0 -29
  105. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +0 -149
  106. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +0 -43
  107. data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +0 -59
  108. data/lib/stimulus_plumbers/components/card/section.rb +0 -31
  109. data/lib/stimulus_plumbers/components/combobox/popover.rb +0 -47
  110. data/lib/stimulus_plumbers/components/date_picker/navigation.rb +0 -41
  111. data/lib/stimulus_plumbers/components/date_picker/navigator.rb +0 -23
  112. data/lib/stimulus_plumbers/components/popover/builder.rb +0 -25
  113. data/lib/stimulus_plumbers/form/fields/inputs/choice.rb +0 -69
  114. data/lib/stimulus_plumbers/helpers/action_list_helper.rb +0 -25
  115. 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
- module ClassMethods
15
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
16
- def renders(method_name, with: nil, &block)
17
- raise ArgumentError, "method_name must be Symbol" unless method_name.is_a?(Symbol)
18
- raise ArgumentError, "provide either with: or a block" if !with.nil? && block_given?
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
- with_proc_or_symbol = with.is_a?(Proc) || with.is_a?(Symbol)
23
- with_klazz = with.is_a?(Module) || with.is_a?(String)
24
- raise ArgumentError, "with: must be a Symbol/Proc/Class" unless with_proc_or_symbol || with_klazz
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
- self.renderers = renderers.merge(method_name => with)
27
- ActiveSupport.version >= "7.2" ? generate_renderer_method(method_name) : eval_renderer_method(method_name)
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
- def generated_renderer_methods
34
- @generated_renderer_methods ||= Module.new.tap { |mod| prepend mod }
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 eval_renderer_method(method_name)
38
- generated_renderer_methods.module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
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
- renderer = renderers.fetch(:#{method_name}, {})
96
+ def render_#{method_name}(*args, **kwargs)
97
+ return nil unless slot_renderable?(:#{method_name})
71
98
 
72
- unless renderer.present?
73
- raise ArgumentError, "##{method_name} not found in renderer" unless defined?(super)
74
- super
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
- renderer, *args, method_name: :#{method_name}, init_args: [template], **kwargs
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, got: \#{renderer.inspect}" unless dispatcher
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::ACTION_LIST,
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 avatar_colors
27
+ def avatar_variants
27
28
  {}
28
29
  end
29
30
 
30
- def avatar_color_range
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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Themes
5
+ module Schema
6
+ module Avatar
7
+ module Ranges
8
+ SIZE = %i[xs sm md lg xl].freeze
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Themes
5
+ module Schema
6
+ module Card
7
+ module Ranges
8
+ VARIANT = %i[primary secondary tertiary success destructive warning info].freeze
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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
@@ -5,8 +5,7 @@ module StimulusPlumbers
5
5
  module Schema
6
6
  module Form
7
7
  module Ranges
8
- LAYOUT = %i[stacked inline].freeze
9
- SUBMIT_VARIANT = %i[default button].freeze
8
+ LAYOUT = %i[stacked inline].freeze
10
9
  end
11
10
  end
12
11
  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 = [true, false].freeze
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