stimulus_plumbers 0.2.8 → 0.3.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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +52 -0
  3. data/README.md +8 -4
  4. data/app/assets/javascripts/stimulus-plumbers/stimulus-plumbers-controllers.es.js +450 -436
  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 +73 -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 +60 -41
  13. data/lib/stimulus_plumbers/components/calendar/month/turbo/days_of_week.rb +15 -12
  14. data/lib/stimulus_plumbers/components/calendar/month/turbo.rb +55 -0
  15. data/lib/stimulus_plumbers/components/calendar.rb +56 -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/navigation.rb +14 -22
  30. data/lib/stimulus_plumbers/components/date_picker/navigator.rb +1 -1
  31. data/lib/stimulus_plumbers/components/icon.rb +43 -0
  32. data/lib/stimulus_plumbers/components/popover/builder.rb +25 -0
  33. data/lib/stimulus_plumbers/components/popover.rb +31 -0
  34. data/lib/stimulus_plumbers/configuration.rb +3 -18
  35. data/lib/stimulus_plumbers/engine.rb +2 -2
  36. data/lib/stimulus_plumbers/form/builder.rb +8 -6
  37. data/lib/stimulus_plumbers/form/{field_component.rb → field.rb} +1 -1
  38. data/lib/stimulus_plumbers/form/fields/combobox.rb +7 -4
  39. data/lib/stimulus_plumbers/form/fields/error.rb +14 -0
  40. data/lib/stimulus_plumbers/form/fields/group.rb +14 -0
  41. data/lib/stimulus_plumbers/form/fields/hint.rb +14 -0
  42. data/lib/stimulus_plumbers/form/fields/label.rb +21 -0
  43. data/lib/stimulus_plumbers/form/fields/renderer.rb +20 -21
  44. data/lib/stimulus_plumbers/form/fields/search.rb +23 -9
  45. data/lib/stimulus_plumbers/form/fields/submit.rb +23 -0
  46. data/lib/stimulus_plumbers/helpers/action_list_helper.rb +2 -2
  47. data/lib/stimulus_plumbers/helpers/avatar_helper.rb +2 -2
  48. data/lib/stimulus_plumbers/helpers/button_helper.rb +2 -2
  49. data/lib/stimulus_plumbers/helpers/calendar_helper.rb +1 -1
  50. data/lib/stimulus_plumbers/helpers/calendar_turbo_helper.rb +1 -1
  51. data/lib/stimulus_plumbers/helpers/card_helper.rb +2 -2
  52. data/lib/stimulus_plumbers/helpers/combobox_helper.rb +5 -5
  53. data/lib/stimulus_plumbers/helpers/popover_helper.rb +2 -2
  54. data/lib/stimulus_plumbers/plumber/base.rb +20 -0
  55. data/lib/stimulus_plumbers/plumber/dispatcher/callable_inspector.rb +19 -0
  56. data/lib/stimulus_plumbers/plumber/dispatcher/instance_exec.rb +35 -0
  57. data/lib/stimulus_plumbers/plumber/dispatcher/klass_proxy.rb +34 -0
  58. data/lib/stimulus_plumbers/plumber/dispatcher/method_call.rb +36 -0
  59. data/lib/stimulus_plumbers/plumber/dispatcher.rb +28 -0
  60. data/lib/stimulus_plumbers/plumber/html_options.rb +52 -0
  61. data/lib/stimulus_plumbers/plumber/renderer.rb +89 -0
  62. data/lib/stimulus_plumbers/themes/base.rb +34 -20
  63. data/lib/stimulus_plumbers/themes/configuration.rb +38 -0
  64. data/lib/stimulus_plumbers/themes/schema/form/ranges.rb +14 -0
  65. data/lib/stimulus_plumbers/themes/schema/icon.rb +32 -0
  66. data/lib/stimulus_plumbers/themes/schema/ranges.rb +5 -5
  67. data/lib/stimulus_plumbers/themes/schema.rb +103 -0
  68. data/lib/stimulus_plumbers/version.rb +1 -1
  69. data/lib/stimulus_plumbers.rb +29 -19
  70. metadata +40 -34
  71. data/lib/stimulus_plumbers/components/action_list/renderer.rb +0 -47
  72. data/lib/stimulus_plumbers/components/avatar/renderer.rb +0 -74
  73. data/lib/stimulus_plumbers/components/button/renderer.rb +0 -33
  74. data/lib/stimulus_plumbers/components/calendar/month/turbo/renderer.rb +0 -57
  75. data/lib/stimulus_plumbers/components/calendar/renderer.rb +0 -35
  76. data/lib/stimulus_plumbers/components/card/renderer.rb +0 -41
  77. data/lib/stimulus_plumbers/components/combobox/option.rb +0 -27
  78. data/lib/stimulus_plumbers/components/combobox/option_group.rb +0 -52
  79. data/lib/stimulus_plumbers/components/combobox/renderer.rb +0 -78
  80. data/lib/stimulus_plumbers/components/icon/renderer.rb +0 -51
  81. data/lib/stimulus_plumbers/components/plumber/base.rb +0 -22
  82. data/lib/stimulus_plumbers/components/plumber/dispatcher.rb +0 -113
  83. data/lib/stimulus_plumbers/components/plumber/html_options.rb +0 -53
  84. data/lib/stimulus_plumbers/components/plumber/renderer.rb +0 -91
  85. data/lib/stimulus_plumbers/components/popover/renderer.rb +0 -46
  86. data/lib/stimulus_plumbers/components/time_picker/renderer.rb +0 -38
  87. data/lib/stimulus_plumbers/themes/base/action_list.rb +0 -14
  88. data/lib/stimulus_plumbers/themes/base/avatar.rb +0 -14
  89. data/lib/stimulus_plumbers/themes/base/button.rb +0 -18
  90. data/lib/stimulus_plumbers/themes/base/calendar.rb +0 -15
  91. data/lib/stimulus_plumbers/themes/base/card.rb +0 -12
  92. data/lib/stimulus_plumbers/themes/base/form.rb +0 -34
  93. data/lib/stimulus_plumbers/themes/base/layout.rb +0 -12
  94. data/lib/stimulus_plumbers/themes/tailwind/action_list.rb +0 -33
  95. data/lib/stimulus_plumbers/themes/tailwind/avatar.rb +0 -52
  96. data/lib/stimulus_plumbers/themes/tailwind/button.rb +0 -89
  97. data/lib/stimulus_plumbers/themes/tailwind/calendar.rb +0 -34
  98. data/lib/stimulus_plumbers/themes/tailwind/card.rb +0 -24
  99. data/lib/stimulus_plumbers/themes/tailwind/form.rb +0 -108
  100. data/lib/stimulus_plumbers/themes/tailwind/layout.rb +0 -25
  101. data/lib/stimulus_plumbers/themes/tailwind_theme.rb +0 -29
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Tailwind
6
- module Button
7
- VARIANTS = {
8
- primary: %w[
9
- bg-[--sp-color-primary]
10
- text-[--sp-color-primary-fg]
11
- hover:bg-[--sp-color-primary]/90
12
- focus-visible:ring-[--sp-focus-ring-color]
13
- ].freeze,
14
- secondary: %w[
15
- bg-[--sp-color-muted]
16
- text-[--sp-color-fg]
17
- hover:bg-[--sp-color-border]
18
- ].freeze,
19
- outline: %w[
20
- border border-[--sp-color-border]
21
- bg-transparent
22
- text-[--sp-color-fg]
23
- hover:bg-[--sp-color-muted]
24
- ].freeze,
25
- destructive: %w[
26
- bg-[--sp-color-destructive]
27
- text-[--sp-color-destructive-fg]
28
- hover:bg-[--sp-color-destructive]/90
29
- ].freeze,
30
- ghost: %w[hover:bg-[--sp-color-muted] text-[--sp-color-fg]].freeze,
31
- link: %w[text-[--sp-color-primary] underline-offset-4 hover:underline].freeze
32
- }.freeze
33
-
34
- SIZES = {
35
- sm: %w[h-8 px-[--sp-space-3] text-[--sp-text-sm]].freeze,
36
- md: %w[h-9 px-[--sp-space-4] text-[--sp-text-base]].freeze,
37
- lg: %w[h-11 px-[--sp-space-6] text-[--sp-text-lg]].freeze
38
- }.freeze
39
-
40
- FLEX_ALIGN = {
41
- row: {
42
- left: "justify-start",
43
- center: %w[justify-center items-center].freeze,
44
- right: "justify-end",
45
- top: "items-start",
46
- bottom: "items-end"
47
- }.freeze,
48
- col: {
49
- top: "justify-start",
50
- center: %w[justify-center items-center].freeze,
51
- bottom: "justify-end",
52
- left: "items-start",
53
- right: "items-end"
54
- }.freeze
55
- }.freeze
56
-
57
- BASE = %w[
58
- inline-flex items-center justify-center gap-2 font-medium
59
- rounded-[--sp-radius-md] transition-colors
60
- focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2
61
- disabled:pointer-events-none disabled:opacity-50
62
- ].freeze
63
-
64
- GROUP_BASE = %w[flex gap-[--sp-space-2]].freeze
65
-
66
- private
67
-
68
- def button_classes(variant: :primary, size: :md)
69
- {
70
- classes: klasses(
71
- *BASE,
72
- *VARIANTS.fetch(variant, []),
73
- *SIZES.fetch(size, [])
74
- )
75
- }
76
- end
77
-
78
- def button_group_classes(alignment: :left, direction: :row)
79
- {
80
- classes: klasses(
81
- *GROUP_BASE,
82
- *Array(FLEX_ALIGN.dig(direction, alignment))
83
- )
84
- }
85
- end
86
- end
87
- end
88
- end
89
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Tailwind
6
- module Calendar
7
- BASE = %w[
8
- size-[--sp-calendar-day-size] rounded-[--sp-radius-md]
9
- flex items-center justify-center text-[--sp-text-sm]
10
- hover:bg-[--sp-color-muted] cursor-pointer
11
- ].freeze
12
-
13
- DAY_SELECTED = %w[
14
- bg-[--sp-color-primary]
15
- text-[--sp-color-primary-fg]
16
- hover:bg-[--sp-color-primary]/90
17
- ].freeze
18
-
19
- private
20
-
21
- def calendar_day_classes(today: false, selected: false, outside: false)
22
- {
23
- classes: klasses(
24
- *BASE,
25
- *(today ? ["font-bold"] : []),
26
- *(selected ? DAY_SELECTED : []),
27
- *(outside ? %w[text-[--sp-color-muted-fg] opacity-50] : [])
28
- )
29
- }
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Tailwind
6
- module Card
7
- BASE = %w[
8
- rounded-[--sp-radius-lg] border border-[--sp-color-border]
9
- bg-[--sp-color-bg] shadow-[--sp-shadow-sm]
10
- ].freeze
11
-
12
- private
13
-
14
- def card_classes
15
- { classes: klasses(*BASE) }
16
- end
17
-
18
- def card_section_classes
19
- { classes: klasses("p-[--sp-space-6]") }
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,108 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Tailwind
6
- module Form
7
- INPUT_BASE = %w[
8
- w-full rounded-md border px-3 py-2 text-sm text-gray-900
9
- bg-white focus:outline-none focus:ring-2 focus:ring-offset-0
10
- ].freeze
11
- INPUT_ERROR = %w[border-red-700 focus:ring-red-700].freeze
12
- INPUT_DEFAULT = %w[border-gray-500 focus:ring-blue-700].freeze
13
-
14
- GROUP_BASE = %w[flex gap-1 mb-3].freeze
15
- GROUP_INLINE = %w[flex-row items-center].freeze
16
-
17
- LABEL = %w[text-sm font-medium text-gray-900].freeze
18
- REQUIRED_MARK = %w[text-red-700 ml-0.5].freeze
19
- DETAILS = %w[text-xs text-gray-600].freeze
20
- ERROR_TEXT = %w[text-xs text-red-700].freeze
21
- CHECKBOX = %w[size-4 rounded border-gray-500 text-blue-700].freeze
22
- RADIO = %w[size-4 border-gray-500 text-blue-700].freeze
23
-
24
- INPUT_GROUP_BASE = %w[flex items-center overflow-hidden rounded-md border].freeze
25
- INPUT_GROUP_BORDER = { error: "border-red-700", default: "border-gray-500" }.freeze
26
-
27
- INPUT_REVEAL = %w[
28
- flex-1 border-0 bg-transparent px-3 py-2 text-sm text-gray-900 focus:outline-none
29
- ].freeze
30
- BUTTON_REVEAL = %w[
31
- self-stretch border-0 bg-transparent px-3 cursor-pointer text-gray-600 hover:text-gray-900 text-sm
32
- ].freeze
33
- SUBMIT_LINK = %w[cursor-pointer text-sm font-medium text-gray-900 hover:underline].freeze
34
-
35
- private
36
-
37
- def form_group_classes(layout: :stacked, **_rest)
38
- { classes: klasses(*GROUP_BASE, layout == :inline ? GROUP_INLINE : "flex-col") }
39
- end
40
-
41
- def form_label_classes(hidden: false, **)
42
- { classes: klasses(*LABEL, hidden ? "sr-only" : nil) }
43
- end
44
-
45
- def form_required_mark_classes
46
- { classes: klasses(*REQUIRED_MARK) }
47
- end
48
-
49
- def form_details_classes
50
- { classes: klasses(*DETAILS) }
51
- end
52
-
53
- def form_error_classes
54
- { classes: klasses(*ERROR_TEXT) }
55
- end
56
-
57
- def form_input_classes(error: false)
58
- { classes: klasses(*INPUT_BASE, *(error ? INPUT_ERROR : INPUT_DEFAULT)) }
59
- end
60
-
61
- def form_textarea_classes(error: false)
62
- form_input_classes(error: error)
63
- end
64
-
65
- def form_file_classes(error: false)
66
- form_input_classes(error: error)
67
- end
68
-
69
- def form_select_classes(error: false)
70
- form_input_classes(error: error)
71
- end
72
-
73
- def form_checkbox_classes(**)
74
- { classes: klasses(*CHECKBOX) }
75
- end
76
-
77
- def form_radio_classes(**)
78
- { classes: klasses(*RADIO) }
79
- end
80
-
81
- def form_input_group_classes(error: false)
82
- { classes: klasses(*INPUT_GROUP_BASE, INPUT_GROUP_BORDER[error ? :error : :default]) }
83
- end
84
-
85
- def form_combobox_classes(error: false)
86
- form_input_classes(error: error)
87
- end
88
-
89
- def form_input_reveal_classes
90
- { classes: klasses(*INPUT_REVEAL) }
91
- end
92
-
93
- def form_button_reveal_classes
94
- { classes: klasses(*BUTTON_REVEAL) }
95
- end
96
-
97
- def form_submit_classes(variant: :default)
98
- case variant
99
- when :button
100
- { classes: klasses(*Button::BASE, *Button::VARIANTS[:primary], *Button::SIZES[:md]) }
101
- else
102
- { classes: klasses(*SUBMIT_LINK) }
103
- end
104
- end
105
- end
106
- end
107
- end
108
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StimulusPlumbers
4
- module Themes
5
- module Tailwind
6
- module Layout
7
- DIVIDER = %w[border-t border-[--sp-color-border] my-[--sp-space-1]].freeze
8
- POPOVER = %w[
9
- rounded-[--sp-radius-lg] border border-[--sp-color-border]
10
- bg-[--sp-color-bg] shadow-[--sp-shadow-md] z-[--sp-z-popover]
11
- ].freeze
12
-
13
- private
14
-
15
- def divider_classes
16
- { classes: klasses(*DIVIDER) }
17
- end
18
-
19
- def popover_classes
20
- { classes: klasses(*POPOVER) }
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "tailwind/action_list"
4
- require_relative "tailwind/avatar"
5
- require_relative "tailwind/button"
6
- require_relative "tailwind/calendar"
7
- require_relative "tailwind/card"
8
- require_relative "tailwind/form"
9
- require_relative "tailwind/layout"
10
-
11
- module StimulusPlumbers
12
- module Themes
13
- class TailwindTheme < Base
14
- include Tailwind::ActionList
15
- include Tailwind::Avatar
16
- include Tailwind::Button
17
- include Tailwind::Calendar
18
- include Tailwind::Card
19
- include Tailwind::Form
20
- include Tailwind::Layout
21
-
22
- private
23
-
24
- def klasses(*classes)
25
- classes.flatten.reject(&:blank?).join(" ")
26
- end
27
- end
28
- end
29
- end