stimulus_plumbers 0.2.8 → 0.2.9

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +3 -0
  4. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +339 -302
  5. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.umd.js +1 -1
  6. data/lib/stimulus_plumbers/components/action_list/item.rb +27 -0
  7. data/lib/stimulus_plumbers/components/action_list/section.rb +21 -0
  8. data/lib/stimulus_plumbers/components/action_list.rb +23 -0
  9. data/lib/stimulus_plumbers/components/avatar.rb +72 -0
  10. data/lib/stimulus_plumbers/components/button/group.rb +17 -0
  11. data/lib/stimulus_plumbers/components/button.rb +27 -0
  12. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_month.rb +2 -2
  13. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +2 -2
  14. data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +55 -0
  15. data/lib/stimulus_plumbers/components/calendar.rb +33 -0
  16. data/lib/stimulus_plumbers/components/card/section.rb +25 -0
  17. data/lib/stimulus_plumbers/components/card.rb +27 -0
  18. data/lib/stimulus_plumbers/components/combobox/autocomplete.rb +30 -34
  19. data/lib/stimulus_plumbers/components/combobox/date.rb +16 -18
  20. data/lib/stimulus_plumbers/components/combobox/dropdown.rb +13 -16
  21. data/lib/stimulus_plumbers/components/combobox/options/option.rb +34 -0
  22. data/lib/stimulus_plumbers/components/combobox/options/option_group.rb +29 -0
  23. data/lib/stimulus_plumbers/components/combobox/options.rb +59 -0
  24. data/lib/stimulus_plumbers/components/combobox/popover.rb +20 -0
  25. data/lib/stimulus_plumbers/components/combobox/time/drum.rb +37 -0
  26. data/lib/stimulus_plumbers/components/combobox/time.rb +32 -15
  27. data/lib/stimulus_plumbers/components/combobox/trigger.rb +38 -0
  28. data/lib/stimulus_plumbers/components/combobox.rb +59 -0
  29. data/lib/stimulus_plumbers/components/date_picker/navigator.rb +1 -1
  30. data/lib/stimulus_plumbers/components/icon.rb +49 -0
  31. data/lib/stimulus_plumbers/components/popover/builder.rb +25 -0
  32. data/lib/stimulus_plumbers/components/popover.rb +26 -0
  33. data/lib/stimulus_plumbers/form/builder.rb +7 -5
  34. data/lib/stimulus_plumbers/form/{field_component.rb → field.rb} +1 -1
  35. data/lib/stimulus_plumbers/form/fields/combobox.rb +1 -1
  36. data/lib/stimulus_plumbers/form/fields/error.rb +14 -0
  37. data/lib/stimulus_plumbers/form/fields/group.rb +14 -0
  38. data/lib/stimulus_plumbers/form/fields/hint.rb +14 -0
  39. data/lib/stimulus_plumbers/form/fields/label.rb +21 -0
  40. data/lib/stimulus_plumbers/form/fields/renderer.rb +16 -20
  41. data/lib/stimulus_plumbers/form/fields/search.rb +23 -9
  42. data/lib/stimulus_plumbers/form/fields/submit.rb +23 -0
  43. data/lib/stimulus_plumbers/helpers/action_list_helper.rb +2 -2
  44. data/lib/stimulus_plumbers/helpers/avatar_helper.rb +2 -2
  45. data/lib/stimulus_plumbers/helpers/button_helper.rb +2 -2
  46. data/lib/stimulus_plumbers/helpers/calendar_helper.rb +1 -1
  47. data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +1 -1
  48. data/lib/stimulus_plumbers/helpers/card_helper.rb +2 -2
  49. data/lib/stimulus_plumbers/helpers/combobox_helper.rb +5 -5
  50. data/lib/stimulus_plumbers/helpers/popover_helper.rb +2 -2
  51. data/lib/stimulus_plumbers/plumber/base.rb +20 -0
  52. data/lib/stimulus_plumbers/plumber/dispatcher.rb +111 -0
  53. data/lib/stimulus_plumbers/plumber/html_options.rb +51 -0
  54. data/lib/stimulus_plumbers/plumber/renderer.rb +89 -0
  55. data/lib/stimulus_plumbers/themes/base.rb +9 -15
  56. data/lib/stimulus_plumbers/themes/schema/ranges.rb +5 -5
  57. data/lib/stimulus_plumbers/themes/schema.rb +97 -0
  58. data/lib/stimulus_plumbers/themes/tailwind/calendar.rb +48 -2
  59. data/lib/stimulus_plumbers/themes/tailwind/combobox.rb +75 -0
  60. data/lib/stimulus_plumbers/themes/tailwind_theme.rb +2 -0
  61. data/lib/stimulus_plumbers/version.rb +1 -1
  62. data/lib/stimulus_plumbers.rb +29 -19
  63. metadata +33 -25
  64. data/lib/stimulus_plumbers/components/action_list/renderer.rb +0 -47
  65. data/lib/stimulus_plumbers/components/avatar/renderer.rb +0 -74
  66. data/lib/stimulus_plumbers/components/button/renderer.rb +0 -33
  67. data/lib/stimulus_plumbers/components/calendar/month/turbo/renderer.rb +0 -57
  68. data/lib/stimulus_plumbers/components/calendar/renderer.rb +0 -35
  69. data/lib/stimulus_plumbers/components/card/renderer.rb +0 -41
  70. data/lib/stimulus_plumbers/components/combobox/option.rb +0 -27
  71. data/lib/stimulus_plumbers/components/combobox/option_group.rb +0 -52
  72. data/lib/stimulus_plumbers/components/combobox/renderer.rb +0 -78
  73. data/lib/stimulus_plumbers/components/icon/renderer.rb +0 -51
  74. data/lib/stimulus_plumbers/components/plumber/base.rb +0 -22
  75. data/lib/stimulus_plumbers/components/plumber/dispatcher.rb +0 -113
  76. data/lib/stimulus_plumbers/components/plumber/html_options.rb +0 -53
  77. data/lib/stimulus_plumbers/components/plumber/renderer.rb +0 -91
  78. data/lib/stimulus_plumbers/components/popover/renderer.rb +0 -46
  79. data/lib/stimulus_plumbers/components/time_picker/renderer.rb +0 -38
  80. data/lib/stimulus_plumbers/themes/base/action_list.rb +0 -14
  81. data/lib/stimulus_plumbers/themes/base/avatar.rb +0 -14
  82. data/lib/stimulus_plumbers/themes/base/button.rb +0 -18
  83. data/lib/stimulus_plumbers/themes/base/calendar.rb +0 -15
  84. data/lib/stimulus_plumbers/themes/base/card.rb +0 -12
  85. data/lib/stimulus_plumbers/themes/base/form.rb +0 -34
  86. data/lib/stimulus_plumbers/themes/base/layout.rb +0 -12
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/concern"
4
-
5
- module StimulusPlumbers
6
- module Components
7
- module Plumber
8
- module Renderer
9
- extend ActiveSupport::Concern
10
-
11
- included do
12
- class_attribute :renderers, instance_writer: false, default: {}
13
- end
14
-
15
- module ClassMethods
16
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
17
- def renders(method_name, with: nil, &block)
18
- raise ArgumentError, "method_name must be Symbol" unless method_name.is_a?(Symbol)
19
- raise ArgumentError, "provide either with: or a block" if !with.nil? && block_given?
20
-
21
- with = block if block_given?
22
-
23
- with_proc_or_symbol = with.is_a?(Proc) || with.is_a?(Symbol)
24
- with_klazz = with.is_a?(Module) || with.is_a?(String)
25
- raise ArgumentError, "with: must be a Symbol/Proc/Class" unless with_proc_or_symbol || with_klazz
26
-
27
- self.renderers = renderers.merge(method_name => with)
28
- ActiveSupport.version >= "7.2" ? generate_renderer_method(method_name) : eval_renderer_method(method_name)
29
- end
30
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
31
-
32
- private
33
-
34
- def generated_renderer_methods
35
- @generated_renderer_methods ||= Module.new.tap { |mod| prepend mod }
36
- end
37
-
38
- def eval_renderer_method(method_name)
39
- generated_renderer_methods.module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
40
- # def method_name(*args, **kwargs)
41
- # renderer = renderers.fetch(:method_name, {})
42
- #
43
- # unless renderer.present?
44
- # raise ArgumentError, "#method_name not found in renderer" unless defined?(super)
45
- # super
46
- # end
47
- #
48
- # dispatcher = StimulusPlumbers::Components::Plumber::Dispatcher.build(
49
- # renderer, *args, method_name: :#{method_name}, init_args: [template], **kwargs
50
- # )
51
- # raise ArgumentError, "invalid renderer, got: \#{renderer.inspect}" unless dispatcher
52
- #
53
- # dispatcher.call(self)
54
- # end
55
- #{renderer_method_template(method_name)}
56
- RUBY
57
- end
58
-
59
- def generate_renderer_method(method_name)
60
- require "active_support/code_generator"
61
- ActiveSupport::CodeGenerator.batch(generated_renderer_methods, __FILE__, __LINE__) do |owner|
62
- owner.define_cached_method(method_name, namespace: :plumber_renderers) do |batch|
63
- batch << renderer_method_template(method_name)
64
- end
65
- end
66
- end
67
-
68
- def renderer_method_template(method_name)
69
- <<-RUBY
70
- def #{method_name}(*args, **kwargs)
71
- renderer = renderers.fetch(:#{method_name}, {})
72
-
73
- unless renderer.present?
74
- raise ArgumentError, "##{method_name} not found in renderer" unless defined?(super)
75
- super
76
- end
77
-
78
- dispatcher = StimulusPlumbers::Components::Plumber::Dispatcher.build(
79
- renderer, *args, method_name: :#{method_name}, init_args: [template], **kwargs
80
- )
81
- raise ArgumentError, "invalid renderer, got: \#{renderer.inspect}" unless dispatcher
82
-
83
- dispatcher.call(self)
84
- end
85
- RUBY
86
- end
87
- end
88
- end
89
- end
90
- end
91
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Components
5
- module Popover
6
- class Builder
7
- attr_reader :activator_html, :content_html
8
-
9
- def initialize(template)
10
- @template = template
11
- @activator_html = "".html_safe
12
- @content_html = "".html_safe
13
- end
14
-
15
- def activator(&block)
16
- @activator_html = @template.capture(&block)
17
- end
18
-
19
- def content(&block)
20
- @content_html = @template.capture(&block)
21
- end
22
- end
23
-
24
- class Renderer < Plumber::Base
25
- def popover(interactive: true, **kwargs, &block)
26
- html_options = merge_html_options(
27
- { classes: theme.resolve(:popover).fetch(:classes, "") },
28
- kwargs
29
- )
30
-
31
- builder = Builder.new(template)
32
- template.capture(builder, &block)
33
-
34
- template.content_tag(:div, **html_options) do
35
- wrapped_content = if interactive
36
- template.content_tag(:template, builder.content_html)
37
- else
38
- builder.content_html
39
- end
40
- template.safe_join([builder.activator_html, wrapped_content])
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Components
5
- module TimePicker
6
- # Renders a single scrollable drum column (hour, minute, or period) as a listbox.
7
- class Renderer < Plumber::Base
8
- CONTROLLER = "combobox-time"
9
-
10
- def render(items:, label:, target:, selected: nil)
11
- template.content_tag(
12
- :ul,
13
- role: "listbox",
14
- aria: { label: label },
15
- data: {
16
- "#{CONTROLLER}_target": target,
17
- action: "click->#{CONTROLLER}#select keydown->#{CONTROLLER}#navigate"
18
- }
19
- ) do
20
- template.safe_join(items.map { |text, value| render_item(text, value, selected) })
21
- end
22
- end
23
-
24
- private
25
-
26
- def render_item(text, value, selected)
27
- template.content_tag(
28
- :li,
29
- text,
30
- role: "option",
31
- aria: { selected: value.to_s == selected.to_s ? "true" : "false" },
32
- data: { value: value }
33
- )
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module ActionList
6
- SCHEMA = {
7
- action_list_item: {
8
- active: { default: false, range: Schema::Ranges::BOOL_RANGE }
9
- }.freeze,
10
- action_list: {}.freeze
11
- }.freeze
12
- end
13
- end
14
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Avatar
6
- SCHEMA = {
7
- avatar: {
8
- size: { default: :md, range: Schema::Ranges::SIZE_RANGE },
9
- color: { default: nil, range: :avatar_color_range }
10
- }.freeze
11
- }.freeze
12
- end
13
- end
14
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Button
6
- SCHEMA = {
7
- button: {
8
- variant: { default: :primary, range: %i[primary secondary outline destructive ghost link].freeze },
9
- size: { default: :md, range: Schema::Ranges::SIZE_RANGE }
10
- }.freeze,
11
- button_group: {
12
- alignment: { default: :left, range: Schema::Ranges::ALIGN_RANGE },
13
- direction: { default: :row, range: Schema::Ranges::DIR_RANGE }
14
- }.freeze
15
- }.freeze
16
- end
17
- end
18
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Calendar
6
- SCHEMA = {
7
- calendar_day: {
8
- today: { default: false, range: Schema::Ranges::BOOL_RANGE },
9
- selected: { default: false, range: Schema::Ranges::BOOL_RANGE },
10
- outside: { default: false, range: Schema::Ranges::BOOL_RANGE }
11
- }.freeze
12
- }.freeze
13
- end
14
- end
15
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Card
6
- SCHEMA = {
7
- card: {}.freeze,
8
- card_section: {}.freeze
9
- }.freeze
10
- end
11
- end
12
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Form
6
- SCHEMA = {
7
- form_group: {
8
- layout: { default: :stacked, range: Schema::Ranges::LAYOUT_RANGE },
9
- error: { default: false, range: Schema::Ranges::BOOL_RANGE }
10
- }.freeze,
11
- form_label: {
12
- required: { default: false, range: Schema::Ranges::BOOL_RANGE },
13
- hidden: { default: false, range: Schema::Ranges::BOOL_RANGE }
14
- }.freeze,
15
- form_required_mark: {}.freeze,
16
- form_details: {}.freeze,
17
- form_error: {}.freeze,
18
- form_input: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
19
- form_textarea: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
20
- form_file: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
21
- form_select: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
22
- form_checkbox: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
23
- form_radio: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
24
- form_input_group: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
25
- form_combobox: { error: { default: false, range: Schema::Ranges::BOOL_RANGE } }.freeze,
26
- form_input_reveal: {}.freeze,
27
- form_button_reveal: {}.freeze,
28
- form_submit: {
29
- variant: { default: :default, range: %i[default button].freeze }
30
- }.freeze
31
- }.freeze
32
- end
33
- end
34
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Layout
6
- SCHEMA = {
7
- divider: {}.freeze,
8
- popover: {}.freeze
9
- }.freeze
10
- end
11
- end
12
- end