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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +72 -0
- data/README.md +3 -1
- data/app/assets/javascripts/stimulus-plumbers/controllers.manifest.json +273 -0
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +269 -160
- data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
- data/app/assets/stylesheets/stimulus_plumbers/tokens.css +56 -13
- data/config/locales/en.yml +10 -0
- data/lib/stimulus_plumbers/components/avatar.rb +24 -17
- data/lib/stimulus_plumbers/components/button/group.rb +15 -4
- data/lib/stimulus_plumbers/components/button/slots.rb +11 -0
- data/lib/stimulus_plumbers/components/button.rb +45 -11
- 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 -26
- data/lib/stimulus_plumbers/components/card/slots.rb +26 -0
- data/lib/stimulus_plumbers/components/card.rb +56 -10
- 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 +37 -23
- data/lib/stimulus_plumbers/components/combobox/dropdown.rb +30 -21
- data/lib/stimulus_plumbers/components/combobox/options/option.rb +8 -2
- data/lib/stimulus_plumbers/components/combobox/options/option_group.rb +8 -2
- data/lib/stimulus_plumbers/components/combobox/options.rb +9 -5
- data/lib/stimulus_plumbers/components/combobox/time/drum.rb +8 -2
- data/lib/stimulus_plumbers/components/combobox/time.rb +50 -47
- data/lib/stimulus_plumbers/components/combobox/trigger.rb +62 -14
- data/lib/stimulus_plumbers/components/combobox/typeahead.rb +96 -0
- data/lib/stimulus_plumbers/components/combobox.rb +62 -38
- data/lib/stimulus_plumbers/components/divider.rb +25 -4
- data/lib/stimulus_plumbers/components/icon.rb +11 -17
- data/lib/stimulus_plumbers/components/input_group.rb +29 -0
- 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 -14
- 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 +42 -48
- data/lib/stimulus_plumbers/form/fields/inputs/file.rb +9 -8
- data/lib/stimulus_plumbers/form/fields/inputs/password.rb +32 -25
- data/lib/stimulus_plumbers/form/fields/inputs/radio.rb +60 -0
- data/lib/stimulus_plumbers/form/fields/inputs/search.rb +34 -57
- data/lib/stimulus_plumbers/form/fields/inputs/select/grouped.rb +22 -29
- data/lib/stimulus_plumbers/form/fields/inputs/select/timezone.rb +3 -44
- data/lib/stimulus_plumbers/form/fields/inputs/select/weekday.rb +3 -28
- data/lib/stimulus_plumbers/form/fields/inputs/select.rb +62 -49
- 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/avatar_helper.rb +2 -2
- data/lib/stimulus_plumbers/helpers/button_helper.rb +4 -8
- data/lib/stimulus_plumbers/helpers/calendar_helper.rb +14 -11
- data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +49 -11
- data/lib/stimulus_plumbers/helpers/card_helper.rb +2 -12
- data/lib/stimulus_plumbers/helpers/combobox_helper.rb +27 -47
- data/lib/stimulus_plumbers/helpers/divider_helper.rb +2 -2
- 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/popover_helper.rb +2 -2
- 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 +20 -23
- data/lib/stimulus_plumbers/themes/icons/external.rb +60 -0
- data/lib/stimulus_plumbers/themes/icons/registry.rb +36 -0
- 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/icon.rb +57 -15
- 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 +142 -67
- data/lib/stimulus_plumbers/version.rb +1 -1
- data/lib/stimulus_plumbers.rb +22 -17
- metadata +46 -17
- data/lib/stimulus_plumbers/components/action_list/item.rb +0 -27
- data/lib/stimulus_plumbers/components/action_list/section.rb +0 -22
- data/lib/stimulus_plumbers/components/action_list.rb +0 -23
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +0 -145
- data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +0 -39
- data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +0 -55
- data/lib/stimulus_plumbers/components/card/section.rb +0 -25
- data/lib/stimulus_plumbers/components/combobox/autocomplete.rb +0 -47
- data/lib/stimulus_plumbers/components/combobox/popover.rb +0 -24
- data/lib/stimulus_plumbers/components/date_picker/navigation.rb +0 -41
- data/lib/stimulus_plumbers/components/date_picker/navigator.rb +0 -31
- data/lib/stimulus_plumbers/components/popover/builder.rb +0 -25
- data/lib/stimulus_plumbers/form/fields/input_group.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,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::
|
|
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::
|
|
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
|
|
27
|
+
def avatar_variants
|
|
25
28
|
{}
|
|
26
29
|
end
|
|
27
30
|
|
|
28
|
-
def
|
|
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, **
|
|
50
|
+
send(method_name, **validate(component.to_sym, args))
|
|
55
51
|
end
|
|
56
52
|
|
|
57
53
|
private
|
|
58
54
|
|
|
59
|
-
def
|
|
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] =
|
|
58
|
+
result[key] = cast(component, key, value, schema[key])
|
|
63
59
|
end
|
|
64
60
|
end
|
|
65
61
|
|
|
66
|
-
def
|
|
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
|
-
"
|
|
68
|
+
"Validator: #{schema[:validate].inspect}. Falling back to: #{schema[:default].inspect}"
|
|
75
69
|
)
|
|
76
70
|
schema[:default]
|
|
77
71
|
end
|
|
78
72
|
|
|
79
|
-
def
|
|
80
|
-
if
|
|
81
|
-
|
|
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
|
-
|
|
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,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
|
|
@@ -4,27 +4,69 @@ module StimulusPlumbers
|
|
|
4
4
|
module Themes
|
|
5
5
|
module Schema
|
|
6
6
|
module Icon
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
|
42
|
+
def resolve(icon_data)
|
|
21
43
|
return unless icon_data.is_a?(Hash)
|
|
22
44
|
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
|
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
|