stimulus_plumbers 0.3.2 → 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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -0
  3. data/README.md +3 -1
  4. data/app/assets/javascripts/stimulus-plumbers/controllers.manifest.json +273 -0
  5. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +269 -160
  6. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
  7. data/app/assets/stylesheets/stimulus_plumbers/tokens.css +56 -13
  8. data/config/locales/en.yml +10 -0
  9. data/lib/stimulus_plumbers/components/avatar.rb +24 -17
  10. data/lib/stimulus_plumbers/components/button/group.rb +15 -4
  11. data/lib/stimulus_plumbers/components/button/slots.rb +11 -0
  12. data/lib/stimulus_plumbers/components/button.rb +45 -11
  13. data/lib/stimulus_plumbers/components/calendar/turbo/days_of_month.rb +151 -0
  14. data/lib/stimulus_plumbers/components/calendar/turbo/days_of_week.rb +62 -0
  15. data/lib/stimulus_plumbers/components/calendar/turbo/months_of_year.rb +99 -0
  16. data/lib/stimulus_plumbers/components/calendar/turbo/years_of_decade.rb +86 -0
  17. data/lib/stimulus_plumbers/components/calendar/turbo.rb +65 -0
  18. data/lib/stimulus_plumbers/components/calendar.rb +70 -26
  19. data/lib/stimulus_plumbers/components/card/slots.rb +26 -0
  20. data/lib/stimulus_plumbers/components/card.rb +56 -10
  21. data/lib/stimulus_plumbers/components/combobox/builder.rb +45 -0
  22. data/lib/stimulus_plumbers/components/combobox/date/navigation.rb +72 -0
  23. data/lib/stimulus_plumbers/components/combobox/date/navigator.rb +25 -0
  24. data/lib/stimulus_plumbers/components/combobox/date.rb +37 -23
  25. data/lib/stimulus_plumbers/components/combobox/dropdown.rb +30 -21
  26. data/lib/stimulus_plumbers/components/combobox/options/option.rb +8 -2
  27. data/lib/stimulus_plumbers/components/combobox/options/option_group.rb +8 -2
  28. data/lib/stimulus_plumbers/components/combobox/options.rb +9 -5
  29. data/lib/stimulus_plumbers/components/combobox/time/drum.rb +8 -2
  30. data/lib/stimulus_plumbers/components/combobox/time.rb +50 -47
  31. data/lib/stimulus_plumbers/components/combobox/trigger.rb +62 -14
  32. data/lib/stimulus_plumbers/components/combobox/typeahead.rb +96 -0
  33. data/lib/stimulus_plumbers/components/combobox.rb +62 -38
  34. data/lib/stimulus_plumbers/components/divider.rb +25 -4
  35. data/lib/stimulus_plumbers/components/icon.rb +11 -17
  36. data/lib/stimulus_plumbers/components/input_group.rb +29 -0
  37. data/lib/stimulus_plumbers/components/link/slots.rb +11 -0
  38. data/lib/stimulus_plumbers/components/link.rb +63 -0
  39. data/lib/stimulus_plumbers/components/list/item/slots.rb +13 -0
  40. data/lib/stimulus_plumbers/components/list/item.rb +83 -0
  41. data/lib/stimulus_plumbers/components/list/section.rb +73 -0
  42. data/lib/stimulus_plumbers/components/list.rb +31 -0
  43. data/lib/stimulus_plumbers/components/popover/panel.rb +32 -0
  44. data/lib/stimulus_plumbers/components/popover/trigger.rb +27 -0
  45. data/lib/stimulus_plumbers/components/popover.rb +44 -14
  46. data/lib/stimulus_plumbers/engine.rb +1 -0
  47. data/lib/stimulus_plumbers/form/base.rb +103 -0
  48. data/lib/stimulus_plumbers/form/builder.rb +71 -24
  49. data/lib/stimulus_plumbers/form/field.rb +56 -88
  50. data/lib/stimulus_plumbers/form/fields/error.rb +1 -1
  51. data/lib/stimulus_plumbers/form/fields/fieldset.rb +11 -8
  52. data/lib/stimulus_plumbers/form/fields/hint.rb +1 -1
  53. data/lib/stimulus_plumbers/form/fields/inputs/checkbox.rb +115 -0
  54. data/lib/stimulus_plumbers/form/fields/inputs/combobox.rb +24 -0
  55. data/lib/stimulus_plumbers/form/fields/inputs/datetime.rb +42 -48
  56. data/lib/stimulus_plumbers/form/fields/inputs/file.rb +9 -8
  57. data/lib/stimulus_plumbers/form/fields/inputs/password.rb +32 -25
  58. data/lib/stimulus_plumbers/form/fields/inputs/radio.rb +60 -0
  59. data/lib/stimulus_plumbers/form/fields/inputs/search.rb +34 -57
  60. data/lib/stimulus_plumbers/form/fields/inputs/select/grouped.rb +22 -29
  61. data/lib/stimulus_plumbers/form/fields/inputs/select/timezone.rb +3 -44
  62. data/lib/stimulus_plumbers/form/fields/inputs/select/weekday.rb +3 -28
  63. data/lib/stimulus_plumbers/form/fields/inputs/select.rb +62 -49
  64. data/lib/stimulus_plumbers/form/fields/inputs/submit.rb +10 -7
  65. data/lib/stimulus_plumbers/form/fields/inputs/text.rb +29 -22
  66. data/lib/stimulus_plumbers/form/fields/inputs/text_area.rb +9 -8
  67. data/lib/stimulus_plumbers/form/fields/label/floating.rb +41 -0
  68. data/lib/stimulus_plumbers/form/fields/label.rb +9 -3
  69. data/lib/stimulus_plumbers/form/fields/renderer.rb +39 -0
  70. data/lib/stimulus_plumbers/helpers/avatar_helper.rb +2 -2
  71. data/lib/stimulus_plumbers/helpers/button_helper.rb +4 -8
  72. data/lib/stimulus_plumbers/helpers/calendar_helper.rb +14 -11
  73. data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +49 -11
  74. data/lib/stimulus_plumbers/helpers/card_helper.rb +2 -12
  75. data/lib/stimulus_plumbers/helpers/combobox_helper.rb +27 -47
  76. data/lib/stimulus_plumbers/helpers/divider_helper.rb +2 -2
  77. data/lib/stimulus_plumbers/helpers/icon_helper.rb +11 -0
  78. data/lib/stimulus_plumbers/helpers/link_helper.rb +11 -0
  79. data/lib/stimulus_plumbers/helpers/list_helper.rb +11 -0
  80. data/lib/stimulus_plumbers/helpers/plumber_helper.rb +3 -6
  81. data/lib/stimulus_plumbers/helpers/popover_helper.rb +2 -2
  82. data/lib/stimulus_plumbers/helpers.rb +6 -2
  83. data/lib/stimulus_plumbers/logger.rb +4 -3
  84. data/lib/stimulus_plumbers/plumber/base.rb +6 -1
  85. data/lib/stimulus_plumbers/plumber/dispatcher/klass_proxy.rb +4 -3
  86. data/lib/stimulus_plumbers/plumber/dispatcher/method_call.rb +4 -3
  87. data/lib/stimulus_plumbers/plumber/dispatcher.rb +4 -4
  88. data/lib/stimulus_plumbers/plumber/options/aria.rb +17 -0
  89. data/lib/stimulus_plumbers/plumber/options/html.rb +29 -0
  90. data/lib/stimulus_plumbers/plumber/options/stimulus.rb +29 -0
  91. data/lib/stimulus_plumbers/plumber/options/theme.rb +19 -0
  92. data/lib/stimulus_plumbers/plumber/options/token_list.rb +29 -0
  93. data/lib/stimulus_plumbers/plumber/renderer.rb +136 -41
  94. data/lib/stimulus_plumbers/plumber/slots.rb +74 -0
  95. data/lib/stimulus_plumbers/themes/base.rb +20 -23
  96. data/lib/stimulus_plumbers/themes/icons/external.rb +60 -0
  97. data/lib/stimulus_plumbers/themes/icons/registry.rb +36 -0
  98. data/lib/stimulus_plumbers/themes/schema/avatar/ranges.rb +13 -0
  99. data/lib/stimulus_plumbers/themes/schema/button/ranges.rb +16 -0
  100. data/lib/stimulus_plumbers/themes/schema/card/ranges.rb +13 -0
  101. data/lib/stimulus_plumbers/themes/schema/form/checkbox/ranges.rb +16 -0
  102. data/lib/stimulus_plumbers/themes/schema/form/radio/ranges.rb +16 -0
  103. data/lib/stimulus_plumbers/themes/schema/form/ranges.rb +1 -2
  104. data/lib/stimulus_plumbers/themes/schema/icon.rb +57 -15
  105. data/lib/stimulus_plumbers/themes/schema/link/ranges.rb +14 -0
  106. data/lib/stimulus_plumbers/themes/schema/ranges.rb +1 -5
  107. data/lib/stimulus_plumbers/themes/schema.rb +142 -67
  108. data/lib/stimulus_plumbers/version.rb +1 -1
  109. data/lib/stimulus_plumbers.rb +22 -17
  110. metadata +46 -17
  111. data/lib/stimulus_plumbers/components/action_list/item.rb +0 -27
  112. data/lib/stimulus_plumbers/components/action_list/section.rb +0 -22
  113. data/lib/stimulus_plumbers/components/action_list.rb +0 -23
  114. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +0 -145
  115. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +0 -39
  116. data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +0 -55
  117. data/lib/stimulus_plumbers/components/card/section.rb +0 -25
  118. data/lib/stimulus_plumbers/components/combobox/autocomplete.rb +0 -47
  119. data/lib/stimulus_plumbers/components/combobox/popover.rb +0 -24
  120. data/lib/stimulus_plumbers/components/date_picker/navigation.rb +0 -41
  121. data/lib/stimulus_plumbers/components/date_picker/navigator.rb +0 -31
  122. data/lib/stimulus_plumbers/components/popover/builder.rb +0 -25
  123. data/lib/stimulus_plumbers/form/fields/input_group.rb +0 -25
  124. data/lib/stimulus_plumbers/form/fields/inputs/choice.rb +0 -69
  125. data/lib/stimulus_plumbers/helpers/action_list_helper.rb +0 -25
  126. data/lib/stimulus_plumbers/plumber/html_options.rb +0 -52
@@ -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
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "schema"
4
+ require_relative "../plumber/dispatcher"
4
5
 
5
6
  module StimulusPlumbers
6
7
  module Themes
7
8
  class Base
8
9
  SCHEMA = {
9
- **Schema::ACTION_LIST,
10
+ **Schema::LIST,
10
11
  **Schema::AVATAR,
11
12
  **Schema::BUTTON,
12
13
  **Schema::CALENDAR,
@@ -14,18 +15,20 @@ module StimulusPlumbers
14
15
  **Schema::COMBOBOX,
15
16
  **Schema::FORM,
16
17
  **Schema::ICON,
17
- **Schema::LAYOUT
18
+ **Schema::INPUT_GROUP,
19
+ **Schema::LAYOUT,
20
+ **Schema::LINK
18
21
  }.freeze
19
22
 
20
23
  def name
21
24
  @name ||= self.class.name.demodulize.delete_suffix("Theme")
22
25
  end
23
26
 
24
- def avatar_colors
27
+ def avatar_variants
25
28
  {}
26
29
  end
27
30
 
28
- def avatar_color_range
31
+ def avatar_variant_range
29
32
  []
30
33
  end
31
34
 
@@ -33,17 +36,10 @@ module StimulusPlumbers
33
36
  {}
34
37
  end
35
38
 
36
- def icon_range
37
- icons.keys
38
- end
39
-
40
39
  def attribute_names(component)
41
40
  SCHEMA.fetch(component, {}).keys
42
41
  end
43
42
 
44
- # Resolves presentational classes for a component slot.
45
- # Returns a Hash with :classes (String) and optionally :style (String).
46
- # Returns {} when no mapping exists for the given component.
47
43
  def resolve(component, **args)
48
44
  method_name = :"#{component}_classes"
49
45
  unless respond_to?(method_name, true)
@@ -51,36 +47,37 @@ module StimulusPlumbers
51
47
  return {}
52
48
  end
53
49
 
54
- send(method_name, **validate_args(component.to_sym, args))
50
+ send(method_name, **validate(component.to_sym, args))
55
51
  end
56
52
 
57
53
  private
58
54
 
59
- def validate_args(component, args)
55
+ def validate(component, args)
60
56
  schema = SCHEMA.fetch(component, {})
61
57
  args.slice(*schema.keys).each_with_object({}) do |(key, value), result|
62
- result[key] = coerce_arg(component, key, value, schema[key])
58
+ result[key] = cast(component, key, value, schema[key])
63
59
  end
64
60
  end
65
61
 
66
- def coerce_arg(component, key, value, schema)
62
+ def cast(component, key, value, schema)
67
63
  return value unless schema
68
-
69
- range = range_for(schema)
70
- return value if range.empty? || range.include?(value)
64
+ return value if value.nil? || valid?(schema[:validate], value)
71
65
 
72
66
  StimulusPlumbers::Logger.warn(
73
67
  "#{component}##{key} received unknown value #{value.inspect}. " \
74
- "Range: #{schema[:range].inspect}. Falling back to: #{schema[:default].inspect}"
68
+ "Validator: #{schema[:validate].inspect}. Falling back to: #{schema[:default].inspect}"
75
69
  )
76
70
  schema[:default]
77
71
  end
78
72
 
79
- def range_for(schema)
80
- if schema[:range].is_a?(Symbol)
81
- respond_to?(schema[:range], true) ? send(schema[:range]) : []
73
+ def valid?(validator, value)
74
+ return true if validator.nil?
75
+
76
+ if validator.respond_to?(:include?)
77
+ validator.include?(value)
82
78
  else
83
- schema[:range]
79
+ result = Plumber::Dispatcher.build(validator, value).call(self)
80
+ result.respond_to?(:include?) ? result.include?(value) : result
84
81
  end
85
82
  end
86
83
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rexml/document"
4
+ require "stimulus_plumbers/themes/schema/icon"
5
+
6
+ module StimulusPlumbers
7
+ module Themes
8
+ module Icons
9
+ module External
10
+ SVG_RENAME = Schema::Icon::SVG_ATTR_NAMES.invert.freeze
11
+ ELEMENT_RENAME = Schema::Icon::ELEMENT_ATTR_NAMES.invert.freeze
12
+
13
+ def include?(key)
14
+ File.exist?(svg_path(key))
15
+ end
16
+
17
+ def fetch(key)
18
+ file = svg_path(key)
19
+ parse_svg(key, File.read(file)) if File.exist?(file)
20
+ end
21
+
22
+ private
23
+
24
+ def svg_defaults(_key)
25
+ {}
26
+ end
27
+
28
+ def parse_svg(key, content)
29
+ doc = REXML::Document.new(content)
30
+ root = doc.root
31
+
32
+ result = svg_defaults(key)
33
+ root.attributes.each_attribute do |attr|
34
+ result[SVG_RENAME.fetch(attr.name, attr.name.to_sym)] = attr.value
35
+ end
36
+
37
+ elements = parse_elements(root)
38
+ return if elements.empty?
39
+
40
+ result[:elements] = elements
41
+ result
42
+ end
43
+
44
+ def parse_elements(node)
45
+ node.elements.flat_map do |el|
46
+ el.name == "g" ? parse_elements(el) : [parse_element(el)].compact
47
+ end
48
+ end
49
+
50
+ def parse_element(node)
51
+ attrs = { tag: node.name.to_sym }
52
+ node.attributes.each_attribute do |attr|
53
+ attrs[ELEMENT_RENAME.fetch(attr.name, attr.name.tr("-", "_").to_sym)] = attr.value
54
+ end
55
+ attrs if attrs.size > 1
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "delegate"
4
+
5
+ module StimulusPlumbers
6
+ module Themes
7
+ module Icons
8
+ class Registry < SimpleDelegator
9
+ attr_reader :aliases
10
+
11
+ def initialize(sources:, aliases: {})
12
+ @sources = sources
13
+ @aliases = aliases
14
+ super(
15
+ Hash.new do |h, key|
16
+ resolved = aliases.fetch(key, key)
17
+ value = nil
18
+ sources.each { |s| break if (value = s.fetch(resolved)) }
19
+ h[key] = value if value
20
+ value
21
+ end
22
+ )
23
+ end
24
+
25
+ def key?(name)
26
+ __getobj__.key?(name) ||
27
+ aliases.key?(name) ||
28
+ @sources.any? { |s| s.include?(aliases.fetch(name, name)) }
29
+ end
30
+ alias_method :include?, :key?
31
+ alias_method :has_key?, :key?
32
+ alias_method :member?, :key?
33
+ end
34
+ end
35
+ end
36
+ end
@@ -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
@@ -4,27 +4,69 @@ module StimulusPlumbers
4
4
  module Themes
5
5
  module Schema
6
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
7
+ extend self
8
+
9
+ SVG_ATTR_DEFAULTS = {
10
+ xmlns: "http://www.w3.org/2000/svg",
11
+ fill: "none",
12
+ view_box: "0 0 24 24",
13
+ width: "24",
14
+ height: "24",
15
+ stroke: "currentColor",
16
+ stroke_width: 1.5
17
+ }.freeze
18
+
19
+ SVG_ATTR_NAMES = {
20
+ view_box: "viewBox",
21
+ stroke_width: "stroke-width"
16
22
  }.freeze
17
23
 
18
- ATTRS = ([:d] + DEFAULTS.keys).freeze
24
+ ELEMENT_ATTRS = {
25
+ path: %i[d fill fill_rule clip_rule stroke_linecap stroke_linejoin opacity].freeze,
26
+ circle: %i[cx cy r].freeze,
27
+ ellipse: %i[cx cy rx ry].freeze,
28
+ rect: %i[x y width height rx ry].freeze,
29
+ line: %i[x1 y1 x2 y2].freeze,
30
+ polyline: %i[points].freeze,
31
+ polygon: %i[points].freeze
32
+ }.freeze
33
+
34
+ ELEMENT_ATTR_NAMES = {
35
+ fill_rule: "fill-rule",
36
+ clip_rule: "clip-rule",
37
+ stroke_width: "stroke-width",
38
+ stroke_linecap: "stroke-linecap",
39
+ stroke_linejoin: "stroke-linejoin"
40
+ }.freeze
19
41
 
20
- def self.resolve(icon_data)
42
+ def resolve(icon_data)
21
43
  return unless icon_data.is_a?(Hash)
22
44
 
23
- merged = DEFAULTS.merge(icon_data.slice(*ATTRS)).transform_values(&:to_s)
24
- return merged if merged[:d].present?
45
+ elements = Array(icon_data[:elements]).filter_map do |element|
46
+ next unless element.is_a?(Hash) && ELEMENT_ATTRS.key?(element[:tag])
47
+
48
+ { tag: element[:tag] }.merge(resolve_element_attrs(element))
49
+ end
50
+ return if elements.empty?
51
+
52
+ resolve_svg_attrs(icon_data).tap do |attrs|
53
+ attrs[:elements] = elements
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def resolve_svg_attrs(svg_data)
60
+ SVG_ATTR_DEFAULTS
61
+ .merge(svg_data.slice(*SVG_ATTR_DEFAULTS.keys))
62
+ .transform_keys { |key| SVG_ATTR_NAMES.fetch(key, key.to_s) }
63
+ .transform_values(&:to_s)
64
+ end
25
65
 
26
- StimulusPlumbers::Logger.warn("Icon missing required :d attribute")
27
- nil
66
+ def resolve_element_attrs(element_data)
67
+ element_data.slice(*ELEMENT_ATTRS[element_data[:tag]])
68
+ .transform_keys { |key| ELEMENT_ATTR_NAMES.fetch(key, key.to_s) }
69
+ .transform_values(&:to_s)
28
70
  end
29
71
  end
30
72
  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[sm md lg].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].freeze
7
+ BOOL = [true, false].freeze
12
8
  end
13
9
  end
14
10
  end