better_ui 0.3.0 → 0.5.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.

Potentially problematic release.


This version of better_ui might be problematic. Click here for more details.

Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +140 -230
  4. data/app/assets/stylesheets/better_ui/_base.scss +9 -0
  5. data/app/assets/stylesheets/better_ui/_components.scss +2 -0
  6. data/app/assets/stylesheets/better_ui/_utilities.scss +14 -0
  7. data/app/assets/stylesheets/better_ui/application.css +32 -0
  8. data/app/assets/stylesheets/better_ui/components/_avatar.scss +200 -0
  9. data/app/assets/stylesheets/better_ui/components/_badge.scss +154 -0
  10. data/app/assets/stylesheets/better_ui/components/_breadcrumb.scss +106 -0
  11. data/app/assets/stylesheets/better_ui/components/_button.scss +105 -0
  12. data/app/assets/stylesheets/better_ui/components/_card.scss +60 -0
  13. data/app/assets/stylesheets/better_ui/components/_heading.scss +81 -0
  14. data/app/assets/stylesheets/better_ui/components/_icon.scss +134 -0
  15. data/app/assets/stylesheets/better_ui/components/_index.scss +17 -0
  16. data/app/assets/stylesheets/better_ui/components/_link.scss +100 -0
  17. data/app/assets/stylesheets/better_ui/components/_panel.scss +104 -0
  18. data/app/assets/stylesheets/better_ui/components/_spinner.scss +129 -0
  19. data/app/assets/stylesheets/better_ui/components/_table.scss +156 -0
  20. data/app/assets/stylesheets/better_ui/components/_variables.scss +1 -0
  21. data/app/assets/stylesheets/better_ui.scss +4 -0
  22. data/app/components/better_ui/application/alert_component.html.erb +27 -0
  23. data/app/components/better_ui/application/alert_component.rb +202 -0
  24. data/app/components/better_ui/application/card_component.html.erb +24 -0
  25. data/app/components/better_ui/application/card_component.rb +53 -0
  26. data/app/components/better_ui/application/card_container_component.html.erb +8 -0
  27. data/app/components/better_ui/application/card_container_component.rb +14 -0
  28. data/app/components/better_ui/application/header_component.html.erb +88 -0
  29. data/app/components/better_ui/application/header_component.rb +188 -0
  30. data/app/components/better_ui/application/navbar_component.html.erb +294 -0
  31. data/app/components/better_ui/application/navbar_component.rb +249 -0
  32. data/app/components/better_ui/application/sidebar_component.html.erb +207 -0
  33. data/app/components/better_ui/application/sidebar_component.rb +318 -0
  34. data/app/components/better_ui/application/toast_component.html.erb +35 -0
  35. data/app/components/better_ui/application/toast_component.rb +223 -0
  36. data/app/components/better_ui/general/avatar_component.html.erb +19 -0
  37. data/app/components/better_ui/general/avatar_component.rb +171 -0
  38. data/app/components/better_ui/general/{badge/component.html.erb → badge_component.html.erb} +2 -6
  39. data/app/components/better_ui/general/badge_component.rb +135 -0
  40. data/app/components/better_ui/general/{breadcrumb/component.html.erb → breadcrumb_component.html.erb} +4 -4
  41. data/app/components/better_ui/general/breadcrumb_component.rb +130 -0
  42. data/app/components/better_ui/general/{button/component.html.erb → button_component.html.erb} +7 -7
  43. data/app/components/better_ui/general/button_component.rb +160 -0
  44. data/app/components/better_ui/general/heading_component.html.erb +1 -0
  45. data/app/components/better_ui/general/heading_component.rb +49 -0
  46. data/app/components/better_ui/general/icon_component.html.erb +2 -0
  47. data/app/components/better_ui/general/icon_component.rb +77 -0
  48. data/app/components/better_ui/general/link_component.html.erb +17 -0
  49. data/app/components/better_ui/general/link_component.rb +132 -0
  50. data/app/components/better_ui/general/panel_component.html.erb +27 -0
  51. data/app/components/better_ui/general/panel_component.rb +92 -0
  52. data/app/components/better_ui/general/spinner_component.html.erb +15 -0
  53. data/app/components/better_ui/general/spinner_component.rb +79 -0
  54. data/app/components/better_ui/general/table_component.html.erb +73 -0
  55. data/app/components/better_ui/general/table_component.rb +143 -0
  56. data/app/controllers/better_ui/application_controller.rb +1 -0
  57. data/app/helpers/better_ui/general/components/avatar_helper.rb +17 -0
  58. data/app/helpers/better_ui/general/components/badge_helper.rb +17 -0
  59. data/app/helpers/better_ui/general/components/breadcrumb_helper.rb +17 -0
  60. data/app/helpers/better_ui/general/components/button_helper.rb +17 -0
  61. data/app/helpers/better_ui/general/components/heading_helper.rb +17 -0
  62. data/app/helpers/better_ui/general/components/icon_helper.rb +17 -0
  63. data/app/helpers/better_ui/general/components/link_helper.rb +17 -0
  64. data/app/helpers/better_ui/general/components/panel_helper.rb +16 -0
  65. data/app/helpers/better_ui/general/components/spinner_helper.rb +17 -0
  66. data/app/helpers/better_ui/general/components/table_helper.rb +17 -0
  67. data/app/helpers/better_ui/general_helper.rb +15 -0
  68. data/app/helpers/better_ui_helper.rb +12 -0
  69. data/app/views/components/better_ui/general/table/_custom_body_row.html.erb +17 -0
  70. data/app/views/components/better_ui/general/table/_custom_footer_rows.html.erb +17 -0
  71. data/app/views/components/better_ui/general/table/_custom_header_rows.html.erb +12 -0
  72. data/app/views/layouts/component_preview.html.erb +32 -0
  73. data/config/initializers/lookbook.rb +12 -12
  74. data/config/routes.rb +2 -0
  75. data/lib/better_ui/engine.rb +92 -5
  76. data/lib/better_ui/version.rb +1 -1
  77. data/lib/better_ui.rb +32 -4
  78. data/lib/generators/better_ui/install_generator.rb +103 -0
  79. data/lib/generators/better_ui/stylesheet_generator.rb +159 -0
  80. data/lib/generators/better_ui/templates/README +125 -0
  81. data/lib/generators/better_ui/templates/components/_avatar.scss +200 -0
  82. data/lib/generators/better_ui/templates/components/_badge.scss +154 -0
  83. data/lib/generators/better_ui/templates/components/_breadcrumb.scss +106 -0
  84. data/lib/generators/better_ui/templates/components/_button.scss +109 -0
  85. data/lib/generators/better_ui/templates/components/_card.scss +60 -0
  86. data/lib/generators/better_ui/templates/components/_heading.scss +81 -0
  87. data/lib/generators/better_ui/templates/components/_icon.scss +134 -0
  88. data/lib/generators/better_ui/templates/components/_index.scss +17 -0
  89. data/lib/generators/better_ui/templates/components/_link.scss +100 -0
  90. data/lib/generators/better_ui/templates/components/_panel.scss +104 -0
  91. data/lib/generators/better_ui/templates/components/_spinner.scss +129 -0
  92. data/lib/generators/better_ui/templates/components/_table.scss +156 -0
  93. data/lib/generators/better_ui/templates/components/_variables.scss +0 -0
  94. data/lib/generators/better_ui/templates/components_stylesheet.scss +35 -0
  95. data/lib/generators/better_ui/templates/index.scss +18 -0
  96. data/lib/generators/better_ui/templates/initializer.rb +41 -0
  97. metadata +178 -147
  98. data/app/components/better_ui/application/card/component.html.erb +0 -20
  99. data/app/components/better_ui/application/card/component.rb +0 -214
  100. data/app/components/better_ui/application/main/component.html.erb +0 -9
  101. data/app/components/better_ui/application/main/component.rb +0 -123
  102. data/app/components/better_ui/application/navbar/component.html.erb +0 -92
  103. data/app/components/better_ui/application/navbar/component.rb +0 -136
  104. data/app/components/better_ui/application/sidebar/component.html.erb +0 -227
  105. data/app/components/better_ui/application/sidebar/component.rb +0 -130
  106. data/app/components/better_ui/general/accordion/component.html.erb +0 -5
  107. data/app/components/better_ui/general/accordion/component.rb +0 -92
  108. data/app/components/better_ui/general/accordion/item_component.html.erb +0 -12
  109. data/app/components/better_ui/general/accordion/item_component.rb +0 -176
  110. data/app/components/better_ui/general/alert/component.html.erb +0 -32
  111. data/app/components/better_ui/general/alert/component.rb +0 -242
  112. data/app/components/better_ui/general/avatar/component.html.erb +0 -20
  113. data/app/components/better_ui/general/avatar/component.rb +0 -301
  114. data/app/components/better_ui/general/badge/component.rb +0 -248
  115. data/app/components/better_ui/general/breadcrumb/component.rb +0 -187
  116. data/app/components/better_ui/general/button/component.rb +0 -214
  117. data/app/components/better_ui/general/divider/component.html.erb +0 -10
  118. data/app/components/better_ui/general/divider/component.rb +0 -226
  119. data/app/components/better_ui/general/dropdown/component.html.erb +0 -25
  120. data/app/components/better_ui/general/dropdown/component.rb +0 -170
  121. data/app/components/better_ui/general/dropdown/divider_component.html.erb +0 -1
  122. data/app/components/better_ui/general/dropdown/divider_component.rb +0 -41
  123. data/app/components/better_ui/general/dropdown/item_component.html.erb +0 -6
  124. data/app/components/better_ui/general/dropdown/item_component.rb +0 -119
  125. data/app/components/better_ui/general/field/component.html.erb +0 -27
  126. data/app/components/better_ui/general/field/component.rb +0 -37
  127. data/app/components/better_ui/general/heading/component.html.erb +0 -22
  128. data/app/components/better_ui/general/heading/component.rb +0 -257
  129. data/app/components/better_ui/general/icon/component.html.erb +0 -7
  130. data/app/components/better_ui/general/icon/component.rb +0 -239
  131. data/app/components/better_ui/general/input/checkbox/component.html.erb +0 -5
  132. data/app/components/better_ui/general/input/checkbox/component.rb +0 -238
  133. data/app/components/better_ui/general/input/datetime/component.html.erb +0 -5
  134. data/app/components/better_ui/general/input/datetime/component.rb +0 -223
  135. data/app/components/better_ui/general/input/radio/component.html.erb +0 -5
  136. data/app/components/better_ui/general/input/radio/component.rb +0 -230
  137. data/app/components/better_ui/general/input/select/component.html.erb +0 -16
  138. data/app/components/better_ui/general/input/select/component.rb +0 -184
  139. data/app/components/better_ui/general/input/select/select_component.html.erb +0 -5
  140. data/app/components/better_ui/general/input/select/select_component.rb +0 -37
  141. data/app/components/better_ui/general/input/text/component.html.erb +0 -5
  142. data/app/components/better_ui/general/input/text/component.rb +0 -171
  143. data/app/components/better_ui/general/input/textarea/component.html.erb +0 -5
  144. data/app/components/better_ui/general/input/textarea/component.rb +0 -166
  145. data/app/components/better_ui/general/link/component.html.erb +0 -18
  146. data/app/components/better_ui/general/link/component.rb +0 -258
  147. data/app/components/better_ui/general/modal/component.html.erb +0 -5
  148. data/app/components/better_ui/general/modal/component.rb +0 -47
  149. data/app/components/better_ui/general/modal/modal_component.html.erb +0 -52
  150. data/app/components/better_ui/general/modal/modal_component.rb +0 -160
  151. data/app/components/better_ui/general/pagination/component.html.erb +0 -85
  152. data/app/components/better_ui/general/pagination/component.rb +0 -216
  153. data/app/components/better_ui/general/panel/component.html.erb +0 -28
  154. data/app/components/better_ui/general/panel/component.rb +0 -249
  155. data/app/components/better_ui/general/progress/component.html.erb +0 -11
  156. data/app/components/better_ui/general/progress/component.rb +0 -160
  157. data/app/components/better_ui/general/spinner/component.html.erb +0 -35
  158. data/app/components/better_ui/general/spinner/component.rb +0 -93
  159. data/app/components/better_ui/general/table/component.html.erb +0 -5
  160. data/app/components/better_ui/general/table/component.rb +0 -217
  161. data/app/components/better_ui/general/table/tbody_component.html.erb +0 -3
  162. data/app/components/better_ui/general/table/tbody_component.rb +0 -30
  163. data/app/components/better_ui/general/table/td_component.html.erb +0 -3
  164. data/app/components/better_ui/general/table/td_component.rb +0 -44
  165. data/app/components/better_ui/general/table/tfoot_component.html.erb +0 -3
  166. data/app/components/better_ui/general/table/tfoot_component.rb +0 -28
  167. data/app/components/better_ui/general/table/th_component.html.erb +0 -6
  168. data/app/components/better_ui/general/table/th_component.rb +0 -51
  169. data/app/components/better_ui/general/table/thead_component.html.erb +0 -3
  170. data/app/components/better_ui/general/table/thead_component.rb +0 -28
  171. data/app/components/better_ui/general/table/tr_component.html.erb +0 -3
  172. data/app/components/better_ui/general/table/tr_component.rb +0 -30
  173. data/app/components/better_ui/general/tabs/component.html.erb +0 -11
  174. data/app/components/better_ui/general/tabs/component.rb +0 -120
  175. data/app/components/better_ui/general/tabs/panel_component.html.erb +0 -3
  176. data/app/components/better_ui/general/tabs/panel_component.rb +0 -37
  177. data/app/components/better_ui/general/tabs/tab_component.html.erb +0 -13
  178. data/app/components/better_ui/general/tabs/tab_component.rb +0 -111
  179. data/app/components/better_ui/general/tag/component.html.erb +0 -3
  180. data/app/components/better_ui/general/tag/component.rb +0 -104
  181. data/app/components/better_ui/general/tooltip/component.html.erb +0 -7
  182. data/app/components/better_ui/general/tooltip/component.rb +0 -239
  183. data/app/helpers/better_ui/application/components/card/card_helper.rb +0 -96
  184. data/app/helpers/better_ui/application/components/card.rb +0 -11
  185. data/app/helpers/better_ui/application/components/main/main_helper.rb +0 -64
  186. data/app/helpers/better_ui/application/components/navbar/navbar_helper.rb +0 -77
  187. data/app/helpers/better_ui/application/components/sidebar/sidebar_helper.rb +0 -51
  188. data/app/helpers/better_ui/application_helper.rb +0 -55
  189. data/app/helpers/better_ui/general/components/accordion/accordion_helper.rb +0 -73
  190. data/app/helpers/better_ui/general/components/accordion.rb +0 -11
  191. data/app/helpers/better_ui/general/components/alert/alert_helper.rb +0 -57
  192. data/app/helpers/better_ui/general/components/avatar/avatar_helper.rb +0 -29
  193. data/app/helpers/better_ui/general/components/badge/badge_helper.rb +0 -53
  194. data/app/helpers/better_ui/general/components/breadcrumb/breadcrumb_helper.rb +0 -37
  195. data/app/helpers/better_ui/general/components/button/button_helper.rb +0 -65
  196. data/app/helpers/better_ui/general/components/container/container_helper.rb +0 -60
  197. data/app/helpers/better_ui/general/components/divider/divider_helper.rb +0 -63
  198. data/app/helpers/better_ui/general/components/dropdown/divider_helper.rb +0 -32
  199. data/app/helpers/better_ui/general/components/dropdown/dropdown_helper.rb +0 -79
  200. data/app/helpers/better_ui/general/components/dropdown/item_helper.rb +0 -62
  201. data/app/helpers/better_ui/general/components/field/field_helper.rb +0 -26
  202. data/app/helpers/better_ui/general/components/heading/heading_helper.rb +0 -72
  203. data/app/helpers/better_ui/general/components/icon/icon_helper.rb +0 -16
  204. data/app/helpers/better_ui/general/components/input/checkbox/checkbox_helper.rb +0 -81
  205. data/app/helpers/better_ui/general/components/input/datetime/datetime_helper.rb +0 -91
  206. data/app/helpers/better_ui/general/components/input/radio/radio_helper.rb +0 -79
  207. data/app/helpers/better_ui/general/components/input/radio_group/radio_group_helper.rb +0 -124
  208. data/app/helpers/better_ui/general/components/input/select/select_helper.rb +0 -70
  209. data/app/helpers/better_ui/general/components/input/text/text_helper.rb +0 -138
  210. data/app/helpers/better_ui/general/components/input/textarea/textarea_helper.rb +0 -73
  211. data/app/helpers/better_ui/general/components/link/link_helper.rb +0 -89
  212. data/app/helpers/better_ui/general/components/modal/modal_helper.rb +0 -85
  213. data/app/helpers/better_ui/general/components/modal.rb +0 -11
  214. data/app/helpers/better_ui/general/components/pagination/pagination_helper.rb +0 -82
  215. data/app/helpers/better_ui/general/components/panel/panel_helper.rb +0 -83
  216. data/app/helpers/better_ui/general/components/progress/progress_helper.rb +0 -53
  217. data/app/helpers/better_ui/general/components/spinner/spinner_helper.rb +0 -19
  218. data/app/helpers/better_ui/general/components/table/table_helper.rb +0 -53
  219. data/app/helpers/better_ui/general/components/table/tbody_helper.rb +0 -13
  220. data/app/helpers/better_ui/general/components/table/td_helper.rb +0 -19
  221. data/app/helpers/better_ui/general/components/table/tfoot_helper.rb +0 -13
  222. data/app/helpers/better_ui/general/components/table/th_helper.rb +0 -19
  223. data/app/helpers/better_ui/general/components/table/thead_helper.rb +0 -13
  224. data/app/helpers/better_ui/general/components/table/tr_helper.rb +0 -13
  225. data/app/helpers/better_ui/general/components/tabs/panel_helper.rb +0 -62
  226. data/app/helpers/better_ui/general/components/tabs/tab_helper.rb +0 -55
  227. data/app/helpers/better_ui/general/components/tabs/tabs_helper.rb +0 -95
  228. data/app/helpers/better_ui/general/components/tag/tag_helper.rb +0 -26
  229. data/app/helpers/better_ui/general/components/tooltip/tooltip_helper.rb +0 -60
  230. data/app/views/layouts/better_ui/application.html.erb +0 -17
  231. data/lib/better_ui/railtie.rb +0 -20
@@ -0,0 +1,79 @@
1
+ module BetterUi
2
+ module General
3
+ class SpinnerComponent < ViewComponent::Base
4
+ attr_reader :size, :theme, :fullscreen, :label, :classes, :id
5
+
6
+ # Temi di colore disponibili
7
+ SPINNER_THEME = {
8
+ default: "bui-spinner--default",
9
+ white: "bui-spinner--white",
10
+ red: "bui-spinner--red",
11
+ rose: "bui-spinner--rose",
12
+ orange: "bui-spinner--orange",
13
+ green: "bui-spinner--green",
14
+ blue: "bui-spinner--blue",
15
+ yellow: "bui-spinner--yellow",
16
+ violet: "bui-spinner--violet"
17
+ }
18
+
19
+ # Dimensioni disponibili
20
+ SPINNER_SIZES = {
21
+ small: "bui-spinner--small",
22
+ medium: "bui-spinner--medium",
23
+ large: "bui-spinner--large"
24
+ }
25
+
26
+ # Stati e comportamenti dello spinner
27
+ SPINNER_STATES = {
28
+ fullscreen: "bui-spinner--fullscreen"
29
+ }
30
+
31
+ # Inizializzazione del componente
32
+ def initialize(
33
+ size: :medium,
34
+ theme: :default,
35
+ fullscreen: false,
36
+ label: nil,
37
+ classes: nil,
38
+ id: nil
39
+ )
40
+ @size = size.to_sym
41
+ @theme = theme.to_sym
42
+ @fullscreen = fullscreen
43
+ @label = label
44
+ @classes = classes
45
+ @id = id
46
+ end
47
+
48
+ # Combina tutte le classi
49
+ def combined_classes
50
+ [
51
+ "bui-spinner", # Classe base per tutti gli spinner
52
+ get_spinner_theme_class,
53
+ get_spinner_size_class,
54
+ @fullscreen ? SPINNER_STATES[:fullscreen] : "",
55
+ @classes
56
+ ].compact.join(" ")
57
+ end
58
+
59
+ def get_spinner_theme_class
60
+ SPINNER_THEME[@theme] || SPINNER_THEME[:default]
61
+ end
62
+
63
+ def get_spinner_size_class
64
+ SPINNER_SIZES[@size] || SPINNER_SIZES[:medium]
65
+ end
66
+
67
+ # Restituisce gli attributi per lo spinner
68
+ def spinner_attributes
69
+ attrs = {
70
+ class: combined_classes,
71
+ id: @id,
72
+ role: "status"
73
+ }
74
+
75
+ attrs
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,73 @@
1
+ <div class="<%= table_container_classes %>">
2
+ <table class="<%= table_classes %>">
3
+ <% if caption.present? %>
4
+ <caption class="<%= caption_classes %>">
5
+ <%= caption %>
6
+ </caption>
7
+ <% end %>
8
+
9
+ <thead class="<%= thead_classes %>">
10
+ <% if header_rows_partial.present? %>
11
+ <%= render partial: header_rows_partial, locals: {
12
+ component: self,
13
+ headers: headers_for_display
14
+ } %>
15
+ <% else %>
16
+ <tr>
17
+ <% headers_for_display.each do |header| %>
18
+ <th scope="col" class="<%= th_classes %>">
19
+ <%= header.to_s.humanize %>
20
+ </th>
21
+ <% end %>
22
+ </tr>
23
+ <% end %>
24
+ </thead>
25
+
26
+ <tbody class="<%= tbody_classes %>">
27
+ <% data.each_with_index do |row, index| %>
28
+ <% if body_row_partial.present? %>
29
+ <%= render partial: body_row_partial, locals: {
30
+ component: self,
31
+ row: row,
32
+ index: index,
33
+ headers: headers_for_display
34
+ } %>
35
+ <% else %>
36
+ <tr class="<%= tr_classes(index) %>">
37
+ <% headers_for_display.each do |header| %>
38
+ <td class="<%= td_classes %>">
39
+ <% if row.is_a?(Hash) %>
40
+ <%= row[header.to_s] || row[header.to_sym] %>
41
+ <% elsif row.respond_to?(header.to_sym) %>
42
+ <%= row.send(header.to_sym) %>
43
+ <% else %>
44
+
45
+ <% end %>
46
+ </td>
47
+ <% end %>
48
+ </tr>
49
+ <% end %>
50
+ <% end %>
51
+ </tbody>
52
+
53
+ <% if footer.present? %>
54
+ <tfoot class="<%= tfoot_classes %>">
55
+ <% if footer_rows_partial.present? %>
56
+ <%= render partial: footer_rows_partial, locals: {
57
+ component: self,
58
+ footer: footer,
59
+ headers: headers_for_display
60
+ } %>
61
+ <% else %>
62
+ <tr>
63
+ <% footer.each_with_index do |value, index| %>
64
+ <td class="<%= tf_classes %>">
65
+ <%= value || "—" %>
66
+ </td>
67
+ <% end %>
68
+ </tr>
69
+ <% end %>
70
+ </tfoot>
71
+ <% end %>
72
+ </table>
73
+ </div>
@@ -0,0 +1,143 @@
1
+ module BetterUi
2
+ module General
3
+ class TableComponent < ViewComponent::Base
4
+ attr_reader :data, :headers, :caption, :striped, :hoverable, :bordered, :compact, :classes, :variant, :rounded, :footer,
5
+ :header_rows_partial, :body_row_partial, :footer_rows_partial
6
+
7
+ # Costanti per configurazione stili
8
+ TABLE_THEMES = {
9
+ default: "bui-table--default",
10
+ white: "bui-table--white",
11
+ red: "bui-table--red",
12
+ rose: "bui-table--rose",
13
+ orange: "bui-table--orange",
14
+ green: "bui-table--green",
15
+ blue: "bui-table--blue",
16
+ yellow: "bui-table--yellow",
17
+ violet: "bui-table--violet"
18
+ }.freeze
19
+
20
+ # Opzioni di bordi arrotondati standardizzati
21
+ TABLE_RADIUS = {
22
+ none: "bui-table--radius-none",
23
+ small: "bui-table--radius-small",
24
+ medium: "bui-table--radius-medium",
25
+ large: "bui-table--radius-large",
26
+ full: "bui-table--radius-full"
27
+ }.freeze
28
+
29
+ def initialize(data:, headers: nil, caption: nil, striped: false, hoverable: false, bordered: true, compact: false, classes: nil, variant: :default, rounded: :small, footer: nil, header_rows_partial: nil, body_row_partial: nil, footer_rows_partial: nil)
30
+ @data = data || []
31
+ @headers = headers
32
+ @caption = caption
33
+ @striped = !!striped
34
+ @hoverable = !!hoverable
35
+ @bordered = !!bordered
36
+ @compact = !!compact
37
+ @classes = classes
38
+ @variant = (TABLE_THEMES.key?(variant.to_sym) ? variant.to_sym : :default)
39
+ @rounded = (TABLE_RADIUS.key?(rounded.to_sym) ? rounded.to_sym : :small)
40
+ @footer = footer.is_a?(Array) ? footer : nil # Valida che sia un array
41
+ @header_rows_partial = header_rows_partial
42
+ @body_row_partial = body_row_partial
43
+ @footer_rows_partial = footer_rows_partial
44
+ end
45
+
46
+ def table_classes
47
+ [
48
+ "bui-table",
49
+ get_theme_class,
50
+ @bordered ? "bui-table--bordered" : nil,
51
+ @striped ? "bui-table--striped" : nil,
52
+ @hoverable ? "bui-table--hoverable" : nil,
53
+ @compact ? "bui-table--compact" : nil,
54
+ @classes
55
+ ].compact.join(" ")
56
+ end
57
+
58
+ def table_container_classes
59
+ [
60
+ "bui-table__container",
61
+ get_border_radius_class
62
+ ].compact.join(" ")
63
+ end
64
+
65
+ def get_border_radius_class
66
+ TABLE_RADIUS[@rounded] || TABLE_RADIUS[:small]
67
+ end
68
+
69
+ def get_theme_class
70
+ TABLE_THEMES[@variant] || TABLE_THEMES[:default]
71
+ end
72
+
73
+ def caption_classes
74
+ "bui-table__caption"
75
+ end
76
+
77
+ def thead_classes
78
+ "bui-table__header"
79
+ end
80
+
81
+ def tbody_classes
82
+ "bui-table__body"
83
+ end
84
+
85
+ def tfoot_classes
86
+ "bui-table__footer"
87
+ end
88
+
89
+ def tr_classes(index)
90
+ "bui-table__row"
91
+ end
92
+
93
+ def th_classes
94
+ [
95
+ "bui-table__cell",
96
+ "bui-table__cell--header"
97
+ ].compact.join(" ")
98
+ end
99
+
100
+ def td_classes
101
+ "bui-table__cell"
102
+ end
103
+
104
+ def tf_classes
105
+ [
106
+ "bui-table__cell",
107
+ "bui-table__cell--footer"
108
+ ].compact.join(" ")
109
+ end
110
+
111
+ def headers_for_display
112
+ return @headers if @headers.present?
113
+ return [] if @data.empty?
114
+
115
+ case first_item = @data.first
116
+ when Hash
117
+ first_item.keys
118
+ when -> (item) { item.respond_to?(:attributes) }
119
+ first_item.attributes.keys - %w[id created_at updated_at]
120
+ else
121
+ []
122
+ end
123
+ end
124
+
125
+ # Ottiene il valore di una cella in modo consistente
126
+ def get_cell_value(row, header)
127
+ if row.is_a?(Hash)
128
+ row[header.to_s] || row[header.to_sym] || "—"
129
+ elsif row.respond_to?(header.to_sym)
130
+ row.send(header.to_sym)
131
+ elsif row.is_a?(Array) && headers_for_display.index(header)
132
+ row[headers_for_display.index(header)] || "—"
133
+ else
134
+ "—"
135
+ end
136
+ end
137
+
138
+ def render?
139
+ @data.present?
140
+ end
141
+ end
142
+ end
143
+ end
@@ -1,4 +1,5 @@
1
1
  module BetterUi
2
2
  class ApplicationController < ActionController::Base
3
+ layout 'better_ui/application'
3
4
  end
4
5
  end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module AvatarHelper
5
+ def bui_avatar(image = nil, **options)
6
+ render BetterUi::General::AvatarComponent.new(
7
+ image: image,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_avatar, :bui_avatar
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module BadgeHelper
5
+ def bui_badge(label = nil, **options)
6
+ render BetterUi::General::BadgeComponent.new(
7
+ label: label,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_badge, :bui_badge
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module BreadcrumbHelper
5
+ def bui_breadcrumb(items = nil, **options)
6
+ render BetterUi::General::BreadcrumbComponent.new(
7
+ items: items,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_breadcrumb, :bui_breadcrumb
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module ButtonHelper
5
+ def bui_button(label = nil, **options)
6
+ render BetterUi::General::ButtonComponent.new(
7
+ label: label,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_button, :bui_button
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module HeadingHelper
5
+ def bui_heading(title = nil, **options)
6
+ render BetterUi::General::HeadingComponent.new(
7
+ title: title,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_heading, :bui_heading
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module IconHelper
5
+ def bui_icon(name = nil, **options)
6
+ render BetterUi::General::IconComponent.new(
7
+ name: name,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_icon, :bui_icon
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module LinkHelper
5
+ def bui_link(label = nil, **options)
6
+ render BetterUi::General::LinkComponent.new(
7
+ label: label,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_link, :bui_link
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module PanelHelper
5
+ def bui_panel(**options, &block)
6
+ render BetterUi::General::PanelComponent.new(
7
+ **options
8
+ ), &block
9
+ end
10
+
11
+ # Supporto per la sintassi originale per compatibilità
12
+ alias_method :better_ui_general_panel, :bui_panel
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module SpinnerHelper
5
+ def bui_spinner(label = nil, **options)
6
+ render BetterUi::General::SpinnerComponent.new(
7
+ label: label,
8
+ **options
9
+ )
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_spinner, :bui_spinner
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module BetterUi
2
+ module General
3
+ module Components
4
+ module TableHelper
5
+ def bui_table(data = nil, **options, &block)
6
+ render BetterUi::General::TableComponent.new(
7
+ data: data,
8
+ **options
9
+ ), &block
10
+ end
11
+
12
+ # Supporto per la sintassi originale per compatibilità
13
+ alias_method :better_ui_general_table, :bui_table
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module BetterUi
2
+ module GeneralHelper
3
+ # Inclusione di tutti i componenti general
4
+ include BetterUi::General::Components::ButtonHelper
5
+ include BetterUi::General::Components::IconHelper
6
+ include BetterUi::General::Components::LinkHelper
7
+ include BetterUi::General::Components::BadgeHelper
8
+ include BetterUi::General::Components::AvatarHelper
9
+ include BetterUi::General::Components::TableHelper
10
+ include BetterUi::General::Components::SpinnerHelper
11
+ include BetterUi::General::Components::HeadingHelper
12
+ include BetterUi::General::Components::PanelHelper
13
+ include BetterUi::General::Components::BreadcrumbHelper
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module BetterUi
2
+ # Includi esplicitamente il GeneralHelper
3
+ require_relative 'better_ui/general_helper'
4
+
5
+ module Helper
6
+ # Estendi il modulo con ActiveSupport::Concern per funzionalità helper
7
+ extend ActiveSupport::Concern
8
+
9
+ # Includi gli helper disponibili
10
+ include BetterUi::GeneralHelper
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ <tr class="<%= component.tr_classes(index) %>">
2
+ <% headers.each_with_index do |header, cell_index| %>
3
+ <td class="<%= component.td_classes %>">
4
+ <% cell_value = component.get_cell_value(row, header) %>
5
+ <% if cell_index == 0 %>
6
+ <div class="flex items-center">
7
+ <div class="w-8 h-8 rounded-full bg-blue-100 mr-2 flex items-center justify-center text-blue-700">
8
+ <%= cell_value.to_s.first&.upcase || 'N/A' %>
9
+ </div>
10
+ <%= cell_value %>
11
+ </div>
12
+ <% else %>
13
+ <%= cell_value %>
14
+ <% end %>
15
+ </td>
16
+ <% end %>
17
+ </tr>
@@ -0,0 +1,17 @@
1
+ <tr>
2
+ <% footer.each_with_index do |value, index| %>
3
+ <td class="<%= component.tf_classes %>">
4
+ <% if index == 0 %>
5
+ <div class="flex items-center">
6
+ <svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
7
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2
8
+ 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path>
9
+ </svg>
10
+ <strong><%= value %></strong>
11
+ </div>
12
+ <% else %>
13
+ <%= value %>
14
+ <% end %>
15
+ </td>
16
+ <% end %>
17
+ </tr>
@@ -0,0 +1,12 @@
1
+ <tr>
2
+ <% headers.each do |header| %>
3
+ <th class="<%= component.th_classes %>">
4
+ <div class="flex items-center justify-between">
5
+ <%= header.to_s.humanize %>
6
+ <svg class="w-4 h-4 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
7
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
8
+ </svg>
9
+ </div>
10
+ </th>
11
+ <% end %>
12
+ </tr>
@@ -0,0 +1,32 @@
1
+ <!DOCTYPE html>
2
+ <html style="background-color: <%= params.dig(:lookbook, :display, :bg_color) || "white" %>">
3
+ <head>
4
+ <title><%= content_for(:title) || "BetterUI" %></title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <meta name="apple-mobile-web-app-capable" content="yes">
7
+ <meta name="mobile-web-app-capable" content="yes">
8
+ <%= csrf_meta_tags %>
9
+ <%= csp_meta_tag %>
10
+
11
+ <%= yield :head %>
12
+
13
+ <link rel="icon" href="/icon.png" type="image/png">
14
+ <link rel="icon" href="/icon.svg" type="image/svg+xml">
15
+ <link rel="apple-touch-icon" href="/icon.png">
16
+
17
+ <%# Includes all stylesheet files in app/assets/stylesheets %>
18
+ <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %>
19
+ <%= stylesheet_link_tag "better_ui/application" %>
20
+ </head>
21
+
22
+ <body class="bg-white text-gray-800">
23
+ <main class="min-h-screen p-8 bg-yellow-500">
24
+ <div style="
25
+ margin-left: auto;
26
+ margin-right: auto;
27
+ max-width: <%= params.dig(:lookbook, :display, :max_width) || "100%" %>
28
+ ">
29
+ <%= yield %> <!-- rendered preview will be injected here -->
30
+ </main>
31
+ </body>
32
+ </html>
@@ -1,23 +1,23 @@
1
1
  if defined?(Lookbook)
2
2
  Lookbook.configure do |config|
3
3
  # Configura la directory delle preview dei componenti
4
- config.preview_paths << BetterUi::Engine.root.join("test/components/previews")
5
-
4
+ config.preview_paths << BetterUi::Engine.root.join('test/components/previews')
5
+
6
6
  # Configura il titolo della pagina Lookbook
7
- config.page_title = "BetterUI - Catalogo Componenti"
8
-
7
+ config.page_title = 'BetterUI - Catalogo Componenti'
8
+
9
9
  # Configura i tag principali
10
10
  config.preview_display_names = {
11
- "BetterUi::General" => "Componenti Generali",
12
- "BetterUi::Application" => "Componenti Applicazione",
13
- "BetterUi::Website" => "Componenti Sito Web"
11
+ 'BetterUi::General' => 'Componenti Generali',
12
+ 'BetterUi::Application' => 'Componenti Applicazione',
13
+ 'BetterUi::Website' => 'Componenti Sito Web'
14
14
  }
15
-
15
+
16
16
  # Per supportare i componenti ViewComponent
17
17
  config.listen_for_changes = {
18
- component: "app/components/**/*.rb",
19
- preview: "test/components/previews/**/*_preview.rb",
20
- template: "app/components/**/*.erb"
18
+ component: 'app/components/**/*.rb',
19
+ preview: 'test/components/previews/**/*_preview.rb',
20
+ template: 'app/components/**/*.erb'
21
21
  }
22
22
  end
23
- end
23
+ end
data/config/routes.rb CHANGED
@@ -1,2 +1,4 @@
1
1
  BetterUi::Engine.routes.draw do
2
+ # Montaggio di Lookbook come root
3
+ mount Lookbook::Engine, at: "/"
2
4
  end