better_ui 0.6.0 → 0.7.1

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 (198) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +257 -212
  3. data/Rakefile +11 -2
  4. data/app/components/better_ui/action_messages_component/action_messages_component.html.erb +48 -0
  5. data/app/components/better_ui/action_messages_component.rb +544 -0
  6. data/app/components/better_ui/application_component.rb +66 -0
  7. data/app/components/better_ui/button_component/button_component.html.erb +31 -0
  8. data/app/components/better_ui/button_component.rb +307 -0
  9. data/app/components/better_ui/card_component/card_component.html.erb +17 -0
  10. data/app/components/better_ui/card_component.rb +460 -0
  11. data/app/components/better_ui/drawer/header_component/header_component.html.erb +24 -0
  12. data/app/components/better_ui/drawer/header_component.rb +238 -0
  13. data/app/components/better_ui/drawer/layout_component/layout_component.html.erb +44 -0
  14. data/app/components/better_ui/drawer/layout_component.rb +270 -0
  15. data/app/components/better_ui/drawer/nav_group_component/nav_group_component.html.erb +10 -0
  16. data/app/components/better_ui/drawer/nav_group_component.rb +155 -0
  17. data/app/components/better_ui/drawer/nav_item_component/nav_item_component.html.erb +13 -0
  18. data/app/components/better_ui/drawer/nav_item_component.rb +225 -0
  19. data/app/components/better_ui/drawer/sidebar_component/sidebar_component.html.erb +17 -0
  20. data/app/components/better_ui/drawer/sidebar_component.rb +263 -0
  21. data/app/components/better_ui/forms/base_component.rb +450 -0
  22. data/app/components/better_ui/forms/checkbox_component/checkbox_component.html.erb +28 -0
  23. data/app/components/better_ui/forms/checkbox_component.rb +419 -0
  24. data/app/components/better_ui/forms/checkbox_group_component/checkbox_group_component.html.erb +40 -0
  25. data/app/components/better_ui/forms/checkbox_group_component.rb +363 -0
  26. data/app/components/better_ui/forms/number_input_component/number_input_component.html.erb +40 -0
  27. data/app/components/better_ui/forms/number_input_component.rb +320 -0
  28. data/app/components/better_ui/forms/password_input_component/password_input_component.html.erb +71 -0
  29. data/app/components/better_ui/forms/password_input_component.rb +206 -0
  30. data/app/components/better_ui/forms/text_input_component/text_input_component.html.erb +40 -0
  31. data/app/components/better_ui/forms/text_input_component.rb +258 -0
  32. data/app/components/better_ui/forms/textarea_component/textarea_component.html.erb +40 -0
  33. data/app/components/better_ui/forms/textarea_component.rb +329 -0
  34. data/app/form_builders/better_ui/ui_form_builder.rb +467 -0
  35. data/app/helpers/better_ui/application_helper.rb +325 -58
  36. data/app/views/layouts/better_ui/application.html.erb +1 -1
  37. data/config/routes.rb +1 -0
  38. data/lib/better_ui/engine.rb +34 -5
  39. data/lib/better_ui/version.rb +1 -1
  40. data/lib/better_ui.rb +32 -5
  41. data/lib/generators/better_ui/install/USAGE +44 -0
  42. data/lib/generators/better_ui/install/install_generator.rb +87 -0
  43. data/lib/generators/better_ui/install/templates/better_ui_theme.css.tt +280 -0
  44. data/lib/tasks/better_ui_tasks.rake +39 -4
  45. metadata +55 -203
  46. data/app/components/better_ui/application/card/component.html.erb +0 -20
  47. data/app/components/better_ui/application/card/component.rb +0 -214
  48. data/app/components/better_ui/application/main/component.html.erb +0 -9
  49. data/app/components/better_ui/application/main/component.rb +0 -123
  50. data/app/components/better_ui/application/navbar/component.html.erb +0 -92
  51. data/app/components/better_ui/application/navbar/component.rb +0 -136
  52. data/app/components/better_ui/application/sidebar/component.html.erb +0 -249
  53. data/app/components/better_ui/application/sidebar/component.rb +0 -187
  54. data/app/components/better_ui/general/accordion/component.html.erb +0 -5
  55. data/app/components/better_ui/general/accordion/component.rb +0 -92
  56. data/app/components/better_ui/general/accordion/item_component.html.erb +0 -12
  57. data/app/components/better_ui/general/accordion/item_component.rb +0 -176
  58. data/app/components/better_ui/general/alert/component.html.erb +0 -32
  59. data/app/components/better_ui/general/alert/component.rb +0 -242
  60. data/app/components/better_ui/general/avatar/component.html.erb +0 -20
  61. data/app/components/better_ui/general/avatar/component.rb +0 -301
  62. data/app/components/better_ui/general/badge/component.html.erb +0 -23
  63. data/app/components/better_ui/general/badge/component.rb +0 -248
  64. data/app/components/better_ui/general/breadcrumb/component.html.erb +0 -15
  65. data/app/components/better_ui/general/breadcrumb/component.rb +0 -187
  66. data/app/components/better_ui/general/button/component.html.erb +0 -34
  67. data/app/components/better_ui/general/button/component.rb +0 -214
  68. data/app/components/better_ui/general/divider/component.html.erb +0 -10
  69. data/app/components/better_ui/general/divider/component.rb +0 -226
  70. data/app/components/better_ui/general/dropdown/component.html.erb +0 -28
  71. data/app/components/better_ui/general/dropdown/component.rb +0 -192
  72. data/app/components/better_ui/general/dropdown/divider_component.html.erb +0 -1
  73. data/app/components/better_ui/general/dropdown/divider_component.rb +0 -41
  74. data/app/components/better_ui/general/dropdown/item_component.html.erb +0 -6
  75. data/app/components/better_ui/general/dropdown/item_component.rb +0 -119
  76. data/app/components/better_ui/general/field/component.html.erb +0 -27
  77. data/app/components/better_ui/general/field/component.rb +0 -37
  78. data/app/components/better_ui/general/grid/cell_component.html.erb +0 -3
  79. data/app/components/better_ui/general/grid/cell_component.rb +0 -390
  80. data/app/components/better_ui/general/grid/component.html.erb +0 -3
  81. data/app/components/better_ui/general/grid/component.rb +0 -301
  82. data/app/components/better_ui/general/heading/component.html.erb +0 -22
  83. data/app/components/better_ui/general/heading/component.rb +0 -257
  84. data/app/components/better_ui/general/icon/component.html.erb +0 -7
  85. data/app/components/better_ui/general/icon/component.rb +0 -240
  86. data/app/components/better_ui/general/input/checkbox/component.html.erb +0 -5
  87. data/app/components/better_ui/general/input/checkbox/component.rb +0 -238
  88. data/app/components/better_ui/general/input/datetime/component.html.erb +0 -5
  89. data/app/components/better_ui/general/input/datetime/component.rb +0 -223
  90. data/app/components/better_ui/general/input/pin/component.html.erb +0 -1
  91. data/app/components/better_ui/general/input/pin/component.rb +0 -201
  92. data/app/components/better_ui/general/input/radio/component.html.erb +0 -5
  93. data/app/components/better_ui/general/input/radio/component.rb +0 -230
  94. data/app/components/better_ui/general/input/rating/component.html.erb +0 -4
  95. data/app/components/better_ui/general/input/rating/component.rb +0 -272
  96. data/app/components/better_ui/general/input/select/component.html.erb +0 -78
  97. data/app/components/better_ui/general/input/select/component.rb +0 -249
  98. data/app/components/better_ui/general/input/select/select_component.html.erb +0 -5
  99. data/app/components/better_ui/general/input/select/select_component.rb +0 -37
  100. data/app/components/better_ui/general/input/text/component.html.erb +0 -5
  101. data/app/components/better_ui/general/input/text/component.rb +0 -171
  102. data/app/components/better_ui/general/input/textarea/component.html.erb +0 -5
  103. data/app/components/better_ui/general/input/textarea/component.rb +0 -166
  104. data/app/components/better_ui/general/input/toggle/component.html.erb +0 -5
  105. data/app/components/better_ui/general/input/toggle/component.rb +0 -242
  106. data/app/components/better_ui/general/link/component.html.erb +0 -18
  107. data/app/components/better_ui/general/link/component.rb +0 -258
  108. data/app/components/better_ui/general/modal/component.html.erb +0 -5
  109. data/app/components/better_ui/general/modal/component.rb +0 -47
  110. data/app/components/better_ui/general/modal/modal_component.html.erb +0 -52
  111. data/app/components/better_ui/general/modal/modal_component.rb +0 -160
  112. data/app/components/better_ui/general/pagination/component.html.erb +0 -85
  113. data/app/components/better_ui/general/pagination/component.rb +0 -216
  114. data/app/components/better_ui/general/panel/component.html.erb +0 -28
  115. data/app/components/better_ui/general/panel/component.rb +0 -249
  116. data/app/components/better_ui/general/progress/component.html.erb +0 -11
  117. data/app/components/better_ui/general/progress/component.rb +0 -160
  118. data/app/components/better_ui/general/spinner/component.html.erb +0 -35
  119. data/app/components/better_ui/general/spinner/component.rb +0 -93
  120. data/app/components/better_ui/general/table/component.html.erb +0 -5
  121. data/app/components/better_ui/general/table/component.rb +0 -217
  122. data/app/components/better_ui/general/table/tbody_component.html.erb +0 -3
  123. data/app/components/better_ui/general/table/tbody_component.rb +0 -30
  124. data/app/components/better_ui/general/table/td_component.html.erb +0 -3
  125. data/app/components/better_ui/general/table/td_component.rb +0 -44
  126. data/app/components/better_ui/general/table/tfoot_component.html.erb +0 -3
  127. data/app/components/better_ui/general/table/tfoot_component.rb +0 -28
  128. data/app/components/better_ui/general/table/th_component.html.erb +0 -6
  129. data/app/components/better_ui/general/table/th_component.rb +0 -51
  130. data/app/components/better_ui/general/table/thead_component.html.erb +0 -3
  131. data/app/components/better_ui/general/table/thead_component.rb +0 -28
  132. data/app/components/better_ui/general/table/tr_component.html.erb +0 -3
  133. data/app/components/better_ui/general/table/tr_component.rb +0 -30
  134. data/app/components/better_ui/general/tabs/component.html.erb +0 -11
  135. data/app/components/better_ui/general/tabs/component.rb +0 -120
  136. data/app/components/better_ui/general/tabs/panel_component.html.erb +0 -3
  137. data/app/components/better_ui/general/tabs/panel_component.rb +0 -37
  138. data/app/components/better_ui/general/tabs/tab_component.html.erb +0 -13
  139. data/app/components/better_ui/general/tabs/tab_component.rb +0 -111
  140. data/app/components/better_ui/general/tag/component.html.erb +0 -3
  141. data/app/components/better_ui/general/tag/component.rb +0 -104
  142. data/app/components/better_ui/general/text/component.html.erb +0 -1
  143. data/app/components/better_ui/general/text/component.rb +0 -194
  144. data/app/components/better_ui/general/tooltip/component.html.erb +0 -7
  145. data/app/components/better_ui/general/tooltip/component.rb +0 -239
  146. data/app/helpers/better_ui/application/components/card/card_helper.rb +0 -96
  147. data/app/helpers/better_ui/application/components/card.rb +0 -11
  148. data/app/helpers/better_ui/application/components/main/main_helper.rb +0 -64
  149. data/app/helpers/better_ui/application/components/navbar/navbar_helper.rb +0 -77
  150. data/app/helpers/better_ui/application/components/sidebar/sidebar_helper.rb +0 -51
  151. data/app/helpers/better_ui/general/components/accordion/accordion_helper.rb +0 -73
  152. data/app/helpers/better_ui/general/components/alert/alert_helper.rb +0 -57
  153. data/app/helpers/better_ui/general/components/avatar/avatar_helper.rb +0 -29
  154. data/app/helpers/better_ui/general/components/badge/badge_helper.rb +0 -53
  155. data/app/helpers/better_ui/general/components/breadcrumb/breadcrumb_helper.rb +0 -37
  156. data/app/helpers/better_ui/general/components/button/button_helper.rb +0 -65
  157. data/app/helpers/better_ui/general/components/container/container_helper.rb +0 -60
  158. data/app/helpers/better_ui/general/components/divider/divider_helper.rb +0 -63
  159. data/app/helpers/better_ui/general/components/dropdown/divider_helper.rb +0 -32
  160. data/app/helpers/better_ui/general/components/dropdown/dropdown_helper.rb +0 -88
  161. data/app/helpers/better_ui/general/components/dropdown/item_helper.rb +0 -68
  162. data/app/helpers/better_ui/general/components/field/field_helper.rb +0 -26
  163. data/app/helpers/better_ui/general/components/grid/grid_helper.rb +0 -145
  164. data/app/helpers/better_ui/general/components/heading/heading_helper.rb +0 -72
  165. data/app/helpers/better_ui/general/components/icon/icon_helper.rb +0 -16
  166. data/app/helpers/better_ui/general/components/input/checkbox/checkbox_helper.rb +0 -81
  167. data/app/helpers/better_ui/general/components/input/datetime/datetime_helper.rb +0 -91
  168. data/app/helpers/better_ui/general/components/input/pin/pin_helper.rb +0 -76
  169. data/app/helpers/better_ui/general/components/input/radio/radio_helper.rb +0 -79
  170. data/app/helpers/better_ui/general/components/input/radio_group/radio_group_helper.rb +0 -124
  171. data/app/helpers/better_ui/general/components/input/rating/rating_helper.rb +0 -70
  172. data/app/helpers/better_ui/general/components/input/select/select_helper.rb +0 -86
  173. data/app/helpers/better_ui/general/components/input/text/text_helper.rb +0 -138
  174. data/app/helpers/better_ui/general/components/input/textarea/textarea_helper.rb +0 -73
  175. data/app/helpers/better_ui/general/components/input/toggle/toggle_helper.rb +0 -77
  176. data/app/helpers/better_ui/general/components/link/link_helper.rb +0 -89
  177. data/app/helpers/better_ui/general/components/modal/modal_helper.rb +0 -85
  178. data/app/helpers/better_ui/general/components/pagination/pagination_helper.rb +0 -82
  179. data/app/helpers/better_ui/general/components/panel/panel_helper.rb +0 -83
  180. data/app/helpers/better_ui/general/components/progress/progress_helper.rb +0 -53
  181. data/app/helpers/better_ui/general/components/spinner/spinner_helper.rb +0 -19
  182. data/app/helpers/better_ui/general/components/table/table_helper.rb +0 -53
  183. data/app/helpers/better_ui/general/components/table/tbody_helper.rb +0 -13
  184. data/app/helpers/better_ui/general/components/table/td_helper.rb +0 -19
  185. data/app/helpers/better_ui/general/components/table/tfoot_helper.rb +0 -13
  186. data/app/helpers/better_ui/general/components/table/th_helper.rb +0 -19
  187. data/app/helpers/better_ui/general/components/table/thead_helper.rb +0 -13
  188. data/app/helpers/better_ui/general/components/table/tr_helper.rb +0 -13
  189. data/app/helpers/better_ui/general/components/tabs/panel_helper.rb +0 -62
  190. data/app/helpers/better_ui/general/components/tabs/tab_helper.rb +0 -55
  191. data/app/helpers/better_ui/general/components/tabs/tabs_helper.rb +0 -95
  192. data/app/helpers/better_ui/general/components/tag/tag_helper.rb +0 -26
  193. data/app/helpers/better_ui/general/components/text/text_helper.rb +0 -83
  194. data/app/helpers/better_ui/general/components/tooltip/tooltip_helper.rb +0 -60
  195. data/app/jobs/better_ui/application_job.rb +0 -4
  196. data/app/mailers/better_ui/application_mailer.rb +0 -6
  197. data/config/initializers/lookbook.rb +0 -23
  198. data/lib/better_ui/railtie.rb +0 -20
@@ -1,192 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BetterUi
4
- module General
5
- module Dropdown
6
- class Component < ViewComponent::Base
7
- include BetterUi::General::Components::Icon::IconHelper
8
-
9
- attr_reader :trigger, :position, :theme, :size, :rounded, :animation, :fullwidth, :show_chevron, :selectable, :classes, :html_options
10
-
11
- # Classi base spostate nel template HTML per migliore leggibilità
12
-
13
- # Temi per il trigger del dropdown con classi Tailwind dirette
14
- DROPDOWN_TRIGGER_THEME = {
15
- default: "bg-white border-gray-300 text-gray-700 hover:bg-gray-50 focus:ring-blue-500",
16
- white: "bg-white border-gray-300 text-gray-900 hover:bg-gray-50 focus:ring-gray-500",
17
- red: "bg-red-600 border-red-600 text-white hover:bg-red-700 focus:ring-red-500",
18
- rose: "bg-rose-600 border-rose-600 text-white hover:bg-rose-700 focus:ring-rose-500",
19
- orange: "bg-orange-600 border-orange-600 text-white hover:bg-orange-700 focus:ring-orange-500",
20
- green: "bg-green-600 border-green-600 text-white hover:bg-green-700 focus:ring-green-500",
21
- blue: "bg-blue-600 border-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500",
22
- yellow: "bg-yellow-500 border-yellow-500 text-white hover:bg-yellow-600 focus:ring-yellow-500",
23
- violet: "bg-violet-600 border-violet-600 text-white hover:bg-violet-700 focus:ring-violet-500"
24
- }.freeze
25
-
26
- # Dimensioni del trigger con classi Tailwind dirette
27
- DROPDOWN_TRIGGER_SIZE = {
28
- small: "px-3 py-1.5 text-sm",
29
- medium: "px-4 py-2 text-sm",
30
- large: "px-6 py-3 text-base"
31
- }.freeze
32
-
33
- # Border radius con classi Tailwind dirette
34
- DROPDOWN_ROUNDED = {
35
- none: "rounded-none",
36
- small: "rounded-md",
37
- medium: "rounded-lg",
38
- large: "rounded-xl",
39
- full: "rounded-full"
40
- }.freeze
41
-
42
- # Posizioni del menu dropdown
43
- DROPDOWN_POSITION = {
44
- bottom: "top-full left-0",
45
- top: "bottom-full left-0",
46
- left: "top-0 right-full mr-2",
47
- right: "top-0 left-full ml-2"
48
- }.freeze
49
-
50
- # Animazioni del dropdown
51
- DROPDOWN_ANIMATION = {
52
- fade: "transition-opacity duration-150",
53
- slide: "transition-all duration-150 transform",
54
- none: ""
55
- }.freeze
56
-
57
- # Stili per full-width del trigger
58
- DROPDOWN_FULLWIDTH = {
59
- true => "w-full text-left justify-start",
60
- false => "inline-flex justify-center"
61
- }.freeze
62
-
63
- def initialize(
64
- trigger:,
65
- position: :bottom,
66
- theme: :default,
67
- size: :medium,
68
- rounded: :medium,
69
- animation: :fade,
70
- fullwidth: false,
71
- show_chevron: true,
72
- selectable: false,
73
- classes: nil,
74
- **html_options
75
- )
76
- @trigger = trigger
77
- @position = position.to_sym
78
- @theme = theme.to_sym
79
- @size = size.to_sym
80
- @rounded = rounded.to_sym
81
- @animation = animation.to_sym
82
- @fullwidth = fullwidth
83
- @show_chevron = show_chevron
84
- @selectable = selectable
85
- @classes = classes
86
- @html_options = html_options
87
-
88
- validate_params
89
- end
90
-
91
- def fullwidth_classes
92
- [
93
- get_fullwidth_classes
94
- ].compact.join(" ")
95
- end
96
-
97
- # Restituisce solo le classi dinamiche per il trigger
98
- def dynamic_trigger_classes
99
- [
100
- get_trigger_theme_classes,
101
- get_trigger_size_classes,
102
- get_trigger_rounded_classes
103
- ].compact.join(" ")
104
- end
105
-
106
- # Restituisce solo le classi dinamiche per il menu
107
- def dynamic_menu_classes
108
- [
109
- get_position_classes,
110
- get_animation_classes,
111
- get_menu_rounded_classes
112
- ].compact.join(" ")
113
- end
114
-
115
- # Metodi per attributi rimossi - ora gestiti direttamente nel template HTML
116
-
117
- # Verifica se rendere il componente
118
- def render?
119
- @trigger.present?
120
- end
121
-
122
- private
123
-
124
- def get_trigger_theme_classes
125
- DROPDOWN_TRIGGER_THEME[@theme] || DROPDOWN_TRIGGER_THEME[:default]
126
- end
127
-
128
- def get_trigger_size_classes
129
- DROPDOWN_TRIGGER_SIZE[@size] || DROPDOWN_TRIGGER_SIZE[:medium]
130
- end
131
-
132
- def get_trigger_rounded_classes
133
- DROPDOWN_ROUNDED[@rounded] || DROPDOWN_ROUNDED[:medium]
134
- end
135
-
136
- def get_menu_rounded_classes
137
- DROPDOWN_ROUNDED[@rounded] || DROPDOWN_ROUNDED[:medium]
138
- end
139
-
140
- def get_position_classes
141
- DROPDOWN_POSITION[@position] || DROPDOWN_POSITION[:bottom]
142
- end
143
-
144
- def get_animation_classes
145
- DROPDOWN_ANIMATION[@animation] || DROPDOWN_ANIMATION[:fade]
146
- end
147
-
148
- def get_fullwidth_classes
149
- DROPDOWN_FULLWIDTH[@fullwidth] || DROPDOWN_FULLWIDTH[false]
150
- end
151
-
152
- def validate_params
153
- validate_theme
154
- validate_size
155
- validate_rounded
156
- validate_position
157
- validate_animation
158
- end
159
-
160
- def validate_theme
161
- unless DROPDOWN_TRIGGER_THEME.keys.include?(@theme)
162
- raise ArgumentError, "Il tema deve essere uno tra: #{DROPDOWN_TRIGGER_THEME.keys.join(', ')}"
163
- end
164
- end
165
-
166
- def validate_size
167
- unless DROPDOWN_TRIGGER_SIZE.keys.include?(@size)
168
- raise ArgumentError, "La dimensione deve essere una tra: #{DROPDOWN_TRIGGER_SIZE.keys.join(', ')}"
169
- end
170
- end
171
-
172
- def validate_rounded
173
- unless DROPDOWN_ROUNDED.keys.include?(@rounded)
174
- raise ArgumentError, "Il border radius deve essere uno tra: #{DROPDOWN_ROUNDED.keys.join(', ')}"
175
- end
176
- end
177
-
178
- def validate_position
179
- unless DROPDOWN_POSITION.keys.include?(@position)
180
- raise ArgumentError, "La posizione deve essere una tra: #{DROPDOWN_POSITION.keys.join(', ')}"
181
- end
182
- end
183
-
184
- def validate_animation
185
- unless DROPDOWN_ANIMATION.keys.include?(@animation)
186
- raise ArgumentError, "L'animazione deve essere una tra: #{DROPDOWN_ANIMATION.keys.join(', ')}"
187
- end
188
- end
189
- end
190
- end
191
- end
192
- end
@@ -1 +0,0 @@
1
- <div <%= tag.attributes(divider_attributes) %>></div>
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BetterUi
4
- module General
5
- module Dropdown
6
- class DividerComponent < ViewComponent::Base
7
- attr_reader :classes, :html_options
8
-
9
- # Classi base per il divisore del dropdown
10
- DROPDOWN_DIVIDER_CLASSES = "border-t border-gray-100 my-1"
11
-
12
- def initialize(classes: nil, **html_options)
13
- @classes = classes
14
- @html_options = html_options
15
- end
16
-
17
- # Combina tutte le classi per il divisore
18
- def divider_classes
19
- [
20
- DROPDOWN_DIVIDER_CLASSES,
21
- @classes
22
- ].compact.join(" ")
23
- end
24
-
25
- # Restituisce gli attributi per il divisore
26
- def divider_attributes
27
- attrs = {
28
- class: divider_classes,
29
- role: "separator"
30
- }
31
-
32
- @html_options.except(:class).each do |key, value|
33
- attrs[key] = value
34
- end
35
-
36
- attrs
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,6 +0,0 @@
1
- <<%= tag_name %> <%= tag.attributes(item_attributes) %>>
2
- <% if @icon.present? %>
3
- <span class="mr-3 flex-shrink-0"><%= bui_icon(@icon, classes: "h-5 w-5") %></span>
4
- <% end %>
5
- <%= @text %>
6
- </<%= tag_name %>>
@@ -1,119 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BetterUi
4
- module General
5
- module Dropdown
6
- class ItemComponent < ViewComponent::Base
7
- include BetterUi::General::Components::Icon::IconHelper
8
-
9
- attr_reader :text, :icon, :href, :theme, :disabled, :active, :classes, :html_options
10
-
11
- # Classi base per l'elemento del dropdown
12
- DROPDOWN_ITEM_BASE_CLASSES = "flex items-center w-full px-4 py-2 text-sm transition-colors"
13
-
14
- # Temi per gli elementi del dropdown con classi Tailwind dirette
15
- DROPDOWN_ITEM_THEME = {
16
- default: "text-gray-700 hover:bg-gray-100 hover:text-gray-900",
17
- white: "text-gray-900 hover:bg-gray-50",
18
- red: "text-red-700 hover:bg-red-50 hover:text-red-900",
19
- rose: "text-rose-700 hover:bg-rose-50 hover:text-rose-900",
20
- orange: "text-orange-700 hover:bg-orange-50 hover:text-orange-900",
21
- green: "text-green-700 hover:bg-green-50 hover:text-green-900",
22
- blue: "text-blue-700 hover:bg-blue-50 hover:text-blue-900",
23
- yellow: "text-yellow-700 hover:bg-yellow-50 hover:text-yellow-900",
24
- violet: "text-violet-700 hover:bg-violet-50 hover:text-violet-900"
25
- }.freeze
26
-
27
- # Stati per gli elementi del dropdown
28
- DROPDOWN_ITEM_STATE_DISABLED = "opacity-50 cursor-not-allowed pointer-events-none"
29
- DROPDOWN_ITEM_STATE_ACTIVE = "bg-gray-100 text-gray-900"
30
-
31
- def initialize(
32
- text:,
33
- icon: nil,
34
- href: nil,
35
- theme: :default,
36
- disabled: false,
37
- active: false,
38
- classes: nil,
39
- **html_options
40
- )
41
- @text = text
42
- @icon = icon
43
- @href = href
44
- @theme = theme.to_sym
45
- @disabled = disabled
46
- @active = active
47
- @classes = classes
48
- @html_options = html_options
49
-
50
- validate_params
51
- end
52
-
53
- # Combina tutte le classi per l'elemento
54
- def item_classes
55
- classes = [
56
- DROPDOWN_ITEM_BASE_CLASSES,
57
- get_theme_classes,
58
- @classes
59
- ]
60
-
61
- classes << DROPDOWN_ITEM_STATE_DISABLED if @disabled
62
- classes << DROPDOWN_ITEM_STATE_ACTIVE if @active
63
-
64
- classes.compact.join(" ")
65
- end
66
-
67
- # Restituisce gli attributi per l'elemento
68
- def item_attributes
69
- attrs = {
70
- class: item_classes,
71
- role: "menuitem",
72
- "data-bui-dropdown-target": "item"
73
- }
74
-
75
- if @href.present? && !@disabled
76
- attrs[:href] = @href
77
- end
78
-
79
- if @disabled
80
- attrs["aria-disabled"] = "true"
81
- attrs[:tabindex] = "-1"
82
- end
83
-
84
- @html_options.except(:class).each do |key, value|
85
- attrs[key] = value
86
- end
87
-
88
- attrs
89
- end
90
-
91
- # Determina se usare un link o un button
92
- def tag_name
93
- @href.present? && !@disabled ? :a : :button
94
- end
95
-
96
- # Verifica se rendere il componente
97
- def render?
98
- @text.present?
99
- end
100
-
101
- private
102
-
103
- def get_theme_classes
104
- DROPDOWN_ITEM_THEME[@theme] || DROPDOWN_ITEM_THEME[:default]
105
- end
106
-
107
- def validate_params
108
- validate_theme
109
- end
110
-
111
- def validate_theme
112
- unless DROPDOWN_ITEM_THEME.keys.include?(@theme)
113
- raise ArgumentError, "Il tema deve essere uno tra: #{DROPDOWN_ITEM_THEME.keys.join(', ')}"
114
- end
115
- end
116
- end
117
- end
118
- end
119
- end
@@ -1,27 +0,0 @@
1
- <%# Form field component template %>
2
- <div class="<%= BASE_CLASSES %>">
3
- <% if text.present? %>
4
- <label for="<%= id %>" class="<%= LABEL_CLASSES %>">
5
- <%= text %>
6
- <% if required %>
7
- <span class="<%= REQUIRED_CLASSES %>">*</span>
8
- <% end %>
9
- </label>
10
- <% end %>
11
-
12
- <div class="mt-1">
13
- <%= content %>
14
- </div>
15
-
16
- <% if error.present? %>
17
- <div class="<%= ERROR_CLASSES %>">
18
- <%= error %>
19
- </div>
20
- <% end %>
21
-
22
- <% if help_text.present? %>
23
- <div class="<%= HELP_TEXT_CLASSES %>">
24
- <%= help_text %>
25
- </div>
26
- <% end %>
27
- </div>
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BetterUi
4
- module General
5
- module Field
6
- class Component < ViewComponent::Base
7
- attr_reader :text, :name, :required, :error, :help_text, :id
8
-
9
- renders_one :input
10
-
11
- BASE_CLASSES = "flex flex-col space-y-2"
12
- LABEL_CLASSES = "text-sm font-medium text-gray-700"
13
- REQUIRED_CLASSES = "text-red-500 ml-1"
14
- ERROR_CLASSES = "text-sm text-red-600 mt-1"
15
- HELP_TEXT_CLASSES = "text-sm text-gray-500 mt-1"
16
-
17
- def initialize(text:, name:, required: false, error: nil, help_text: nil, id: nil)
18
- @text = text
19
- @name = name
20
- @required = required
21
- @error = error
22
- @help_text = help_text
23
- @id = id
24
- super()
25
- end
26
-
27
- private
28
-
29
- def field_classes
30
- classes = [BASE_CLASSES]
31
- classes << ERROR_CLASSES if @error.present?
32
- classes.join(" ")
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,3 +0,0 @@
1
- <div class="<%= combined_classes %>"<% if @id %> id="<%= @id %>"<% end %><% @html_options.except(:class).each do |attr, value| %> <%= attr %>="<%= value %>"<% end %>>
2
- <%= content %>
3
- </div>