stimulus_plumbers 0.4.0 → 0.4.2

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/README.md +11 -4
  4. data/app/assets/javascripts/stimulus-plumbers/controllers.manifest.json +125 -12
  5. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +681 -312
  6. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
  7. data/app/assets/stylesheets/stimulus_plumbers/tokens.css +26 -22
  8. data/config/locales/en.yml +21 -0
  9. data/lib/stimulus_plumbers/components/avatar.rb +13 -5
  10. data/lib/stimulus_plumbers/components/calendar/turbo/days_of_month.rb +47 -7
  11. data/lib/stimulus_plumbers/components/calendar/turbo/months_of_year.rb +56 -18
  12. data/lib/stimulus_plumbers/components/calendar/turbo/years_of_decade.rb +44 -16
  13. data/lib/stimulus_plumbers/components/calendar/turbo.rb +59 -12
  14. data/lib/stimulus_plumbers/components/calendar.rb +48 -64
  15. data/lib/stimulus_plumbers/components/card.rb +7 -7
  16. data/lib/stimulus_plumbers/components/combobox/date/navigation.rb +16 -8
  17. data/lib/stimulus_plumbers/components/combobox/date/navigator.rb +3 -1
  18. data/lib/stimulus_plumbers/components/combobox/date.rb +35 -18
  19. data/lib/stimulus_plumbers/components/combobox/time.rb +56 -50
  20. data/lib/stimulus_plumbers/components/input_group.rb +2 -2
  21. data/lib/stimulus_plumbers/components/list/item.rb +2 -2
  22. data/lib/stimulus_plumbers/components/list/section.rb +1 -1
  23. data/lib/stimulus_plumbers/components/popover.rb +1 -1
  24. data/lib/stimulus_plumbers/components/timeline/event/slots.rb +18 -0
  25. data/lib/stimulus_plumbers/components/timeline/event.rb +189 -0
  26. data/lib/stimulus_plumbers/components/timeline/group.rb +42 -0
  27. data/lib/stimulus_plumbers/components/timeline.rb +40 -0
  28. data/lib/stimulus_plumbers/form/builder.rb +11 -3
  29. data/lib/stimulus_plumbers/form/field.rb +4 -5
  30. data/lib/stimulus_plumbers/form/fields/inputs/checkbox.rb +1 -1
  31. data/lib/stimulus_plumbers/form/fields/inputs/combobox.rb +2 -2
  32. data/lib/stimulus_plumbers/form/fields/inputs/datetime.rb +13 -1
  33. data/lib/stimulus_plumbers/form/fields/inputs/file.rb +9 -4
  34. data/lib/stimulus_plumbers/form/fields/inputs/password.rb +35 -24
  35. data/lib/stimulus_plumbers/form/fields/inputs/radio.rb +15 -3
  36. data/lib/stimulus_plumbers/form/fields/inputs/search.rb +62 -31
  37. data/lib/stimulus_plumbers/form/fields/inputs/select.rb +3 -1
  38. data/lib/stimulus_plumbers/form/fields/inputs/submit.rb +4 -4
  39. data/lib/stimulus_plumbers/form/fields/inputs/text.rb +9 -4
  40. data/lib/stimulus_plumbers/form/fields/inputs/text_area.rb +9 -4
  41. data/lib/stimulus_plumbers/form/fields/label/floating.rb +3 -3
  42. data/lib/stimulus_plumbers/helpers/calendar_helper.rb +1 -1
  43. data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +22 -2
  44. data/lib/stimulus_plumbers/helpers/timeline_helper.rb +15 -0
  45. data/lib/stimulus_plumbers/helpers.rb +2 -0
  46. data/lib/stimulus_plumbers/plumber/renderer.rb +2 -2
  47. data/lib/stimulus_plumbers/themes/base.rb +2 -1
  48. data/lib/stimulus_plumbers/themes/schema/form/floating/ranges.rb +15 -0
  49. data/lib/stimulus_plumbers/themes/schema.rb +63 -16
  50. data/lib/stimulus_plumbers/version.rb +1 -1
  51. data/lib/stimulus_plumbers.rb +4 -1
  52. metadata +7 -2
  53. data/lib/stimulus_plumbers/components/combobox/time/drum.rb +0 -43
@@ -5,9 +5,8 @@ module StimulusPlumbers
5
5
  module Fields
6
6
  module Inputs
7
7
  module Password
8
- def password_field(attribute, options = {})
9
- revealable = options.delete(:revealable) { false }
10
- html_options = merge_html_options(theme.resolve(:form_field_input), options)
8
+ def password_field(attribute, floating: nil, revealable: false, **options)
9
+ html_options = merge_html_options(theme.resolve(:form_field_input, floating: floating), options)
11
10
  if revealable
12
11
  render_revealable_password(false) do
13
12
  super(attribute, merge_html_options(html_options, { data: { input_formatter_target: "input" } }))
@@ -19,27 +18,27 @@ module StimulusPlumbers
19
18
 
20
19
  private
21
20
 
22
- def render_password_input(attribute, html_opts, opts, error, revealable: false, **kwargs)
21
+ def render_password_input(attribute, html_opts, opts, error, floating: nil, revealable: false, **kwargs)
22
+ html_options = merge_html_options(
23
+ theme.resolve(:form_field_input, floating: floating, error: error),
24
+ opts,
25
+ html_opts,
26
+ kwargs
27
+ )
23
28
  if revealable
24
- html_options = merge_html_options(
25
- theme.resolve(:form_field_input, error: error),
26
- opts,
27
- html_opts,
28
- kwargs,
29
- { data: { input_formatter_target: "input" } }
30
- )
31
- render_revealable_password(error) do
32
- @template.password_field(@object_name, attribute, objectify_options(html_options))
29
+ render_revealable_password(error, floating: floating) do
30
+ revealable_html_options = merge_html_options(html_options, { data: { input_formatter_target: "input" } })
31
+ @template.password_field(@object_name, attribute, objectify_options(revealable_html_options))
33
32
  end
34
33
  else
35
- html_options = merge_html_options(theme.resolve(:form_field_input, error: error), opts, html_opts, kwargs)
36
34
  @template.password_field(@object_name, attribute, objectify_options(html_options))
37
35
  end
38
36
  end
39
37
 
40
- def render_revealable_password(error, &block)
38
+ def render_revealable_password(error, floating: nil, &block)
41
39
  render_input_group(
42
40
  error: error,
41
+ floating: floating,
43
42
  trailing: method(:reveal_button),
44
43
  **merge_html_options(
45
44
  theme.resolve(:form_field_input_reveal, error: error),
@@ -49,15 +48,27 @@ module StimulusPlumbers
49
48
  end
50
49
 
51
50
  def reveal_button
52
- html_options = merge_html_options(
53
- theme.resolve(:form_field_input_button_reveal),
54
- {
55
- type: "button",
56
- aria: { label: I18n.t("stimulus_plumbers.form.password.show", default: "Show password"), pressed: "false" },
57
- data: { input_formatter_target: "toggle", action: "click->input-formatter#toggle" }
58
- }
59
- )
60
- @template.content_tag(:button, "", **html_options)
51
+ build_reveal_button do
52
+ Components::Icon.new(@template).render(
53
+ name: "reveal",
54
+ aria: { hidden: "true" },
55
+ **theme.resolve(:button_icon)
56
+ )
57
+ end
58
+ end
59
+
60
+ def build_reveal_button(&block)
61
+ @template.content_tag(
62
+ :button,
63
+ **merge_html_options(
64
+ theme.resolve(:form_field_input_button_reveal),
65
+ {
66
+ type: "button",
67
+ aria: { label: I18n.t("stimulus_plumbers.form.password.show", default: "Show password"), pressed: "false" },
68
+ data: { input_formatter_target: "toggle", action: "click->input-formatter#toggle" }
69
+ }
70
+ )
71
+ ) { @template.capture(&block) }
61
72
  end
62
73
  end
63
74
  end
@@ -44,14 +44,26 @@ module StimulusPlumbers
44
44
  @template.collection_radio_buttons(
45
45
  @object_name, attribute, collection, value_method, text_method, {}, item_opts
46
46
  ) do |builder|
47
- render_radio_button_label(builder, theme.resolve(:form_field_radio_label, type: type, variant: variant))
47
+ render_radio_button_label(builder, theme.resolve(:form_field_radio_label, type: type, variant: variant), type)
48
48
  end
49
49
  end
50
50
  end
51
51
 
52
- def render_radio_button_label(builder, label_opts)
52
+ def render_radio_button_label(builder, label_opts, type = :default)
53
53
  html_options = merge_html_options(label_opts)
54
- builder.label(**html_options) { @template.safe_join([builder.radio_button, builder.text]) }
54
+ if %i[button card].include?(type)
55
+ group_options = merge_html_options(theme.resolve(:form_field_radio_item_group))
56
+ @template.content_tag(:div, **group_options) do
57
+ @template.safe_join(
58
+ [
59
+ builder.radio_button,
60
+ builder.label(**html_options) { builder.text }
61
+ ]
62
+ )
63
+ end
64
+ else
65
+ builder.label(**html_options) { @template.safe_join([builder.radio_button, builder.text]) }
66
+ end
55
67
  end
56
68
  end
57
69
  end
@@ -13,64 +13,95 @@ module StimulusPlumbers
13
13
  clearable = options.delete(:clearable) { false }
14
14
  data = clearable ? { data: { input_clearable_target: "input" } } : {}
15
15
  html_options = merge_html_options(theme.resolve(:form_field_input), options, data)
16
- input_html = super(attribute, html_options)
17
- return input_html unless clearable
18
-
19
16
  render_input_group(
20
- trailing: method(:clear_button),
17
+ trailing: clearable ? method(:clear_button) : nil,
21
18
  error: false,
22
- **merge_html_options(theme.resolve(:form_field_input_clearable), { data: { controller: "input-clearable" } })
23
- ) { input_html }
19
+ **merge_html_options(
20
+ theme.resolve(:form_field_input_clearable),
21
+ clearable ? { data: { controller: "input-clearable" } } : {}
22
+ )
23
+ ) { super(attribute, html_options) }
24
24
  end
25
25
 
26
26
  private
27
27
 
28
- def render_combobox_typeahead(attribute, html_opts, opts, error, url: nil, clearable: false, choices: [], **kwargs)
28
+ def render_combobox_typeahead(
29
+ attribute,
30
+ html_opts,
31
+ opts,
32
+ error,
33
+ floating: nil,
34
+ url: nil,
35
+ clearable: false,
36
+ choices: [],
37
+ **kwargs
38
+ )
29
39
  current_value = object.respond_to?(attribute) ? object.public_send(attribute) : nil
30
- combobox_html = render_typeahead_combobox(
31
- attribute, html_opts, opts, error, current_value, clearable: clearable, choices: choices, url: url, **kwargs
32
- )
33
-
34
- return combobox_html unless clearable
35
-
36
- render_input_group(
37
- trailing: method(:clear_button),
38
- error: error,
39
- **merge_html_options(theme.resolve(:form_field_input_clearable), { data: { controller: "input-clearable" } })
40
- ) { combobox_html }
41
- end
42
-
43
- def render_typeahead_combobox(attribute, html_opts, opts, error, current_value, clearable:, choices:, url:, **kwargs)
44
40
  input_id = html_opts[:id]
45
41
  labelledby = Field.label_id(input_id)
46
42
  combobox_opts = {
47
43
  input: { value: current_value },
48
- trigger: { data: clearable ? { input_clearable_target: "input" } : {}, aria: html_opts[:aria] },
44
+ trigger: {
45
+ data: clearable ? { input_clearable_target: "input" } : {},
46
+ aria: html_opts[:aria]
47
+ },
49
48
  **opts
50
49
  }
50
+
51
+ render_input_group(
52
+ trailing: clearable ? method(:clear_button) : nil,
53
+ error: error,
54
+ floating: floating,
55
+ **merge_html_options(theme.resolve(:form_field_input_clearable), { data: { controller: "input-clearable" } })
56
+ ) do
57
+ build_combobox_typeahead(
58
+ attribute,
59
+ combobox_opts,
60
+ input_id: input_id,
61
+ floating: floating,
62
+ error: error,
63
+ **kwargs
64
+ ) do |c|
65
+ c.typeahead(options: choices, value: current_value, labelledby: labelledby, url: url)
66
+ end
67
+ end
68
+ end
69
+
70
+ def build_combobox_typeahead(attribute, opts, input_id:, floating:, error:, **kwargs, &block)
51
71
  render_combobox(
52
72
  attribute,
53
73
  input_id: input_id,
54
- opts: combobox_opts,
74
+ opts: opts,
55
75
  error: error,
56
- **kwargs
57
- ) do |c|
58
- c.typeahead(options: choices, value: current_value, labelledby: labelledby, url: url)
59
- end
76
+ floating: floating,
77
+ **kwargs,
78
+ &block
79
+ )
60
80
  end
61
81
 
62
82
  def clear_button
63
- Components::Button.new(@template).render(
64
- icon_leading: "close",
83
+ build_clear_button do
84
+ Components::Icon.new(@template).render(
85
+ name: "close",
86
+ aria: { hidden: "true" },
87
+ **theme.resolve(:button_icon)
88
+ )
89
+ end
90
+ end
91
+
92
+ def build_clear_button(&block)
93
+ @template.content_tag(
94
+ :button,
65
95
  **merge_html_options(
66
96
  theme.resolve(:form_field_input_button_clear),
67
97
  {
68
- aria: { label: I18n.t("stimulus_plumbers.form.search.clear", default: "Clear search") },
98
+ type: "button",
69
99
  hidden: true,
100
+ aria: { label: I18n.t("stimulus_plumbers.form.search.clear", default: "Clear search") },
70
101
  data: { input_clearable_target: "clear", action: "click->input-clearable#clear" }
71
102
  }
72
103
  )
73
- )
104
+ ) { @template.capture(&block) }
74
105
  end
75
106
  end
76
107
  end
@@ -26,6 +26,7 @@ module StimulusPlumbers
26
26
  html_opts,
27
27
  opts,
28
28
  error,
29
+ floating: nil,
29
30
  icon_leading: nil,
30
31
  icon_trailing: nil,
31
32
  choices: [],
@@ -44,7 +45,8 @@ module StimulusPlumbers
44
45
  attribute,
45
46
  input_id: html_opts[:id],
46
47
  opts: combobox_opts,
47
- error: error
48
+ error: error,
49
+ floating: floating
48
50
  ) do |c|
49
51
  c.dropdown(options: all_choices, value: current_value, labelledby: labelledby, **kwargs)
50
52
  end
@@ -11,14 +11,14 @@ module StimulusPlumbers
11
11
  value = nil
12
12
  end
13
13
  value ||= submit_default_value
14
- type = options.delete(:type) { :default }
15
- variant = options.delete(:variant) { :primary }
14
+ type = options.delete(:type) { :default }
15
+ variant = options.delete(:variant) { :primary }
16
16
 
17
17
  Components::Button.new(@template).build(type: type, variant: variant) do |attrs|
18
18
  @template.tag.button(
19
19
  type: "submit",
20
- **merge_html_options(attrs, options)
21
- ) { value }
20
+ **merge_html_options(attrs, theme.resolve(:form_submit, type: type, variant: variant), options)
21
+ ) { @template.content_tag(:span, value) }
22
22
  end
23
23
  end
24
24
  end
@@ -19,8 +19,8 @@ module StimulusPlumbers
19
19
  }.freeze
20
20
 
21
21
  TEXT_FIELD_METHODS.each_value do |template_method|
22
- define_method(template_method) do |attribute, options = {}|
23
- html_options = merge_html_options(theme.resolve(:form_field_input), options)
22
+ define_method(template_method) do |attribute, floating: nil, **options|
23
+ html_options = merge_html_options(theme.resolve(:form_field_input, floating: floating), options)
24
24
  super(attribute, html_options)
25
25
  end
26
26
  end
@@ -33,8 +33,13 @@ module StimulusPlumbers
33
33
  end
34
34
  end
35
35
 
36
- def render_text(attribute, html_opts, opts, error, template_method, **kwargs)
37
- html_options = merge_html_options(theme.resolve(:form_field_input, error: error), opts, html_opts, kwargs)
36
+ def render_text(attribute, html_opts, opts, error, template_method, floating: nil, **kwargs)
37
+ html_options = merge_html_options(
38
+ theme.resolve(:form_field_input, floating: floating, error: error),
39
+ opts,
40
+ html_opts,
41
+ kwargs
42
+ )
38
43
  @template.public_send(template_method, @object_name, attribute, objectify_options(html_options))
39
44
  end
40
45
  end
@@ -5,15 +5,20 @@ module StimulusPlumbers
5
5
  module Fields
6
6
  module Inputs
7
7
  module TextArea
8
- def text_area(attribute, options = {})
9
- html_options = merge_html_options(theme.resolve(:form_field_input_textarea), options)
8
+ def text_area(attribute, floating: nil, **options)
9
+ html_options = merge_html_options(theme.resolve(:form_field_input_textarea, floating: floating), options)
10
10
  super(attribute, html_options)
11
11
  end
12
12
 
13
13
  private
14
14
 
15
- def render_text_area_input(attribute, html_opts, opts, error, **kwargs)
16
- html_options = merge_html_options(theme.resolve(:form_field_input_textarea, error: error), opts, html_opts, kwargs)
15
+ def render_text_area_input(attribute, html_opts, opts, error, floating: nil, **kwargs)
16
+ html_options = merge_html_options(
17
+ theme.resolve(:form_field_input_textarea, floating: floating, error: error),
18
+ opts,
19
+ html_opts,
20
+ kwargs
21
+ )
17
22
  @template.text_area(@object_name, attribute, objectify_options(html_options))
18
23
  end
19
24
  end
@@ -5,9 +5,9 @@ module StimulusPlumbers
5
5
  module Fields
6
6
  class Label
7
7
  class Floating < Plumber::Base
8
- def render(text:, for_id:, id:, type:, required:, error:, &block)
9
- html_options = merge_html_options(theme.resolve(:form_field_floating_group, type: type))
10
- label_options = merge_html_options(theme.resolve(:form_field_floating_label, type: type, error: error))
8
+ def render(text:, for_id:, id:, floating:, required:, error:, &block)
9
+ html_options = merge_html_options(theme.resolve(:form_field_input_group, floating: floating))
10
+ label_options = merge_html_options(theme.resolve(:form_field_label, floating: floating, error: error))
11
11
  mark_options = required && merge_html_options(
12
12
  { aria: { hidden: true } },
13
13
  theme.resolve(:form_field_required_mark)
@@ -16,7 +16,7 @@ module StimulusPlumbers
16
16
  else
17
17
  kwargs
18
18
  end
19
- calendar_renderer.render(**html_options)
19
+ calendar_renderer.month(**html_options)
20
20
  end
21
21
 
22
22
  private
@@ -21,6 +21,10 @@ module StimulusPlumbers
21
21
  selectable: false,
22
22
  selected_date: nil,
23
23
  show_other_months: false,
24
+ since: nil,
25
+ till: nil,
26
+ disabled_months: [],
27
+ disabled_years: [],
24
28
  **kwargs
25
29
  )
26
30
  safe_join(
@@ -36,6 +40,8 @@ module StimulusPlumbers
36
40
  selectable: selectable,
37
41
  selected_date: selected_date,
38
42
  show_other_months: show_other_months,
43
+ since: since,
44
+ till: till,
39
45
  **kwargs
40
46
  )
41
47
  end,
@@ -45,7 +51,14 @@ module StimulusPlumbers
45
51
  hidden: true,
46
52
  data: { "combobox-date-target": "yearView" }
47
53
  ) do
48
- calendar_turbo_renderer.year(date: date, today: today, selected_date: selected_date)
54
+ calendar_turbo_renderer.year(
55
+ date: date,
56
+ today: today,
57
+ selected_date: selected_date,
58
+ since: since,
59
+ till: till,
60
+ disabled_months: disabled_months
61
+ )
49
62
  end,
50
63
  content_tag(
51
64
  :turbo_frame,
@@ -53,7 +66,14 @@ module StimulusPlumbers
53
66
  hidden: true,
54
67
  data: { "combobox-date-target": "decadeView" }
55
68
  ) do
56
- calendar_turbo_renderer.decade(date: date, today: today, selected_date: selected_date)
69
+ calendar_turbo_renderer.decade(
70
+ date: date,
71
+ today: today,
72
+ selected_date: selected_date,
73
+ since: since,
74
+ till: till,
75
+ disabled_years: disabled_years
76
+ )
57
77
  end
58
78
  ]
59
79
  )
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Helpers
5
+ module TimelineHelper
6
+ def sp_timeline(...)
7
+ Components::Timeline.new(self).render(...)
8
+ end
9
+
10
+ def sp_timeline_group(...)
11
+ Components::Timeline::Group.new(self).render(...)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -12,6 +12,7 @@ require_relative "helpers/combobox_helper"
12
12
  require_relative "helpers/divider_helper"
13
13
  require_relative "helpers/link_helper"
14
14
  require_relative "helpers/popover_helper"
15
+ require_relative "helpers/timeline_helper"
15
16
 
16
17
  module StimulusPlumbers
17
18
  module Helpers
@@ -27,5 +28,6 @@ module StimulusPlumbers
27
28
  include DividerHelper
28
29
  include LinkHelper
29
30
  include PopoverHelper
31
+ include TimelineHelper
30
32
  end
31
33
  end
@@ -77,7 +77,7 @@ module StimulusPlumbers
77
77
  end
78
78
 
79
79
  def generate_renderer_method(method_name)
80
- return eval_renderer_method(method_name) if ActiveSupport.version < "7.2"
80
+ return eval_renderer_method(method_name) if ActiveSupport.version < Gem::Version.new("7.2")
81
81
 
82
82
  require "active_support/code_generator"
83
83
  ActiveSupport::CodeGenerator.batch(generated_renderer_methods, __FILE__, __LINE__) do |owner|
@@ -123,7 +123,7 @@ module StimulusPlumbers
123
123
  end
124
124
 
125
125
  def generate_slot_method(method_name)
126
- return eval_slot_method(method_name) if ActiveSupport.version < "7.2"
126
+ return eval_slot_method(method_name) if ActiveSupport.version < Gem::Version.new("7.2")
127
127
 
128
128
  require "active_support/code_generator"
129
129
  ActiveSupport::CodeGenerator.batch(generated_slot_methods, __FILE__, __LINE__) do |owner|
@@ -17,7 +17,8 @@ module StimulusPlumbers
17
17
  **Schema::ICON,
18
18
  **Schema::INPUT_GROUP,
19
19
  **Schema::LAYOUT,
20
- **Schema::LINK
20
+ **Schema::LINK,
21
+ **Schema::TIMELINE
21
22
  }.freeze
22
23
 
23
24
  def name
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusPlumbers
4
+ module Themes
5
+ module Schema
6
+ module Form
7
+ module Floating
8
+ module Ranges
9
+ TYPE = %i[standard filled outlined].freeze
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -8,6 +8,7 @@ require_relative "schema/card/ranges"
8
8
  require_relative "schema/link/ranges"
9
9
  require_relative "schema/form/ranges"
10
10
  require_relative "schema/form/checkbox/ranges"
11
+ require_relative "schema/form/floating/ranges"
11
12
  require_relative "schema/form/radio/ranges"
12
13
  require_relative "schema/icon"
13
14
 
@@ -92,8 +93,10 @@ module StimulusPlumbers
92
93
  combobox_typeahead_loading_icon: {}.freeze,
93
94
  combobox_typeahead_empty: {}.freeze,
94
95
  combobox_time: {}.freeze,
96
+ combobox_time_drum: { type: { default: :unit, validate: %i[unit period] } }.freeze,
95
97
  combobox_date_navigation: {}.freeze,
96
- combobox_date_navigation_navigator: {}.freeze
98
+ combobox_date_navigation_navigator: {}.freeze,
99
+ combobox_date_navigation_title: {}.freeze
97
100
  }.freeze
98
101
 
99
102
  FORM = {
@@ -103,7 +106,9 @@ module StimulusPlumbers
103
106
  }.freeze,
104
107
  form_field_label: {
105
108
  required: { default: false, validate: Ranges::BOOL },
106
- hidden: { default: false, validate: Ranges::BOOL }
109
+ hidden: { default: false, validate: Ranges::BOOL },
110
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] },
111
+ error: { default: false, validate: Ranges::BOOL }
107
112
  }.freeze,
108
113
  form_field_required_mark: {}.freeze,
109
114
  form_field_hint: {}.freeze,
@@ -119,21 +124,26 @@ module StimulusPlumbers
119
124
  type: { default: :default, validate: Form::Radio::Ranges::TYPE },
120
125
  variant: { default: :tertiary, validate: Form::Radio::Ranges::VARIANT }
121
126
  }.freeze,
122
- form_field_input: { error: { default: false, validate: Ranges::BOOL } }.freeze,
123
- form_field_floating: {
124
- error: { default: false, validate: Ranges::BOOL },
125
- type: { default: nil, validate: StimulusPlumbers::Form::Field::FLOATING_TYPES }
127
+ form_field_radio_item_group: {}.freeze,
128
+ form_field_input: {
129
+ error: { default: false, validate: Ranges::BOOL },
130
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] }
126
131
  }.freeze,
127
- form_field_floating_group: {
128
- type: { default: nil, validate: StimulusPlumbers::Form::Field::FLOATING_TYPES }
132
+ form_field_input_group: {
133
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] }
129
134
  }.freeze,
130
- form_field_floating_label: {
131
- type: { default: nil, validate: StimulusPlumbers::Form::Field::FLOATING_TYPES },
132
- error: { default: false, validate: Ranges::BOOL }
135
+ form_field_input_textarea: {
136
+ error: { default: false, validate: Ranges::BOOL },
137
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] }
138
+ }.freeze,
139
+ form_field_input_file: {
140
+ error: { default: false, validate: Ranges::BOOL },
141
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] }
142
+ }.freeze,
143
+ form_field_input_select: {
144
+ error: { default: false, validate: Ranges::BOOL },
145
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] }
133
146
  }.freeze,
134
- form_field_input_textarea: { error: { default: false, validate: Ranges::BOOL } }.freeze,
135
- form_field_input_file: { error: { default: false, validate: Ranges::BOOL } }.freeze,
136
- form_field_input_select: { error: { default: false, validate: Ranges::BOOL } }.freeze,
137
147
  form_field_input_checkbox: {
138
148
  error: { default: false, validate: Ranges::BOOL },
139
149
  type: { default: :default, validate: Form::Checkbox::Ranges::TYPE },
@@ -144,7 +154,10 @@ module StimulusPlumbers
144
154
  type: { default: :default, validate: Form::Radio::Ranges::TYPE },
145
155
  variant: { default: :tertiary, validate: Form::Radio::Ranges::VARIANT }
146
156
  }.freeze,
147
- form_field_input_combobox: { error: { default: false, validate: Ranges::BOOL } }.freeze,
157
+ form_field_input_combobox: {
158
+ error: { default: false, validate: Ranges::BOOL },
159
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] }
160
+ }.freeze,
148
161
  form_field_input_reveal: { error: { default: false, validate: Ranges::BOOL } }.freeze,
149
162
  form_field_input_clearable: {}.freeze,
150
163
  form_field_input_button_reveal: {}.freeze,
@@ -160,7 +173,10 @@ module StimulusPlumbers
160
173
  }.freeze
161
174
 
162
175
  INPUT_GROUP = {
163
- input_group: { error: { default: false, validate: Ranges::BOOL } }.freeze
176
+ input_group: {
177
+ error: { default: false, validate: Ranges::BOOL },
178
+ floating: { default: nil, validate: [nil, *Form::Floating::Ranges::TYPE] }
179
+ }.freeze
164
180
  }.freeze
165
181
 
166
182
  LINK = {
@@ -179,6 +195,37 @@ module StimulusPlumbers
179
195
  popover_trigger: {}.freeze,
180
196
  popover: {}.freeze
181
197
  }.freeze
198
+
199
+ TIMELINE = {
200
+ timeline: {
201
+ orientation: { default: :vertical, validate: %i[vertical horizontal] }
202
+ }.freeze,
203
+ timeline_item: {
204
+ orientation: { default: :vertical, validate: %i[vertical horizontal] }
205
+ }.freeze,
206
+ timeline_item_indicator: {
207
+ type: { default: :dot, validate: %i[dot icon] },
208
+ orientation: { default: :vertical, validate: %i[vertical horizontal] }
209
+ }.freeze,
210
+ timeline_item_time: {
211
+ type: { default: :default, validate: %i[default badge] }
212
+ }.freeze,
213
+ timeline_item_title: {}.freeze,
214
+ timeline_item_heading: {}.freeze,
215
+ timeline_item_trigger: {}.freeze,
216
+ timeline_item_description: {}.freeze,
217
+ timeline_item_detail: {}.freeze,
218
+ timeline_item_actions: {}.freeze,
219
+ timeline_item_indicator_dot: {}.freeze,
220
+ timeline_item_connector: {}.freeze,
221
+ timeline_item_content: {}.freeze,
222
+ timeline_track_line: {}.freeze,
223
+ timeline_item_indicator_icon_slot: {}.freeze,
224
+ timeline_group: {}.freeze,
225
+ timeline_group_section: {}.freeze,
226
+ timeline_group_section_date: {}.freeze,
227
+ timeline_group_section_list: {}.freeze
228
+ }.freeze
182
229
  end
183
230
  end
184
231
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StimulusPlumbers
4
- VERSION = "0.4.0"
4
+ VERSION = "0.4.2"
5
5
  end
@@ -29,6 +29,10 @@ require_relative "stimulus_plumbers/components/list"
29
29
  require_relative "stimulus_plumbers/components/list/section"
30
30
  require_relative "stimulus_plumbers/components/list/item"
31
31
  require_relative "stimulus_plumbers/components/list/item/slots"
32
+ require_relative "stimulus_plumbers/components/timeline"
33
+ require_relative "stimulus_plumbers/components/timeline/event"
34
+ require_relative "stimulus_plumbers/components/timeline/event/slots"
35
+ require_relative "stimulus_plumbers/components/timeline/group"
32
36
  require_relative "stimulus_plumbers/components/divider"
33
37
  require_relative "stimulus_plumbers/components/input_group"
34
38
  require_relative "stimulus_plumbers/components/popover"
@@ -55,7 +59,6 @@ require_relative "stimulus_plumbers/components/combobox/date/navigation"
55
59
  require_relative "stimulus_plumbers/components/combobox/dropdown"
56
60
  require_relative "stimulus_plumbers/components/combobox/typeahead"
57
61
  require_relative "stimulus_plumbers/components/combobox/time"
58
- require_relative "stimulus_plumbers/components/combobox/time/drum"
59
62
  require_relative "stimulus_plumbers/components/combobox/builder"
60
63
 
61
64
  # -- Form --