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

Potentially problematic release.


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

Files changed (206) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +227 -209
  4. data/app/assets/javascripts/better_ui/controllers/navbar_controller.js +138 -0
  5. data/app/assets/javascripts/better_ui/controllers/sidebar_controller.js +211 -0
  6. data/app/assets/javascripts/better_ui/controllers/toast_controller.js +161 -0
  7. data/app/assets/javascripts/better_ui/index.js +159 -0
  8. data/app/assets/javascripts/better_ui/toast_manager.js +77 -0
  9. data/app/assets/stylesheets/better_ui/application.css +30 -0
  10. data/app/components/better_ui/application/alert_component.html.erb +27 -0
  11. data/app/components/better_ui/application/alert_component.rb +202 -0
  12. data/app/components/better_ui/application/card_component.html.erb +24 -0
  13. data/app/components/better_ui/application/card_component.rb +53 -0
  14. data/app/components/better_ui/application/card_container_component.html.erb +8 -0
  15. data/app/components/better_ui/application/card_container_component.rb +14 -0
  16. data/app/components/better_ui/application/header_component.html.erb +88 -0
  17. data/app/components/better_ui/application/header_component.rb +188 -0
  18. data/app/components/better_ui/application/navbar_component.html.erb +294 -0
  19. data/app/components/better_ui/application/navbar_component.rb +249 -0
  20. data/app/components/better_ui/application/sidebar_component.html.erb +207 -0
  21. data/app/components/better_ui/application/sidebar_component.rb +318 -0
  22. data/app/components/better_ui/application/toast_component.html.erb +35 -0
  23. data/app/components/better_ui/application/toast_component.rb +223 -0
  24. data/app/components/better_ui/general/avatar_component.html.erb +19 -0
  25. data/app/components/better_ui/general/avatar_component.rb +171 -0
  26. data/app/components/better_ui/general/badge_component.html.erb +19 -0
  27. data/app/components/better_ui/general/badge_component.rb +123 -0
  28. data/app/components/better_ui/general/{breadcrumb/component.html.erb → breadcrumb_component.html.erb} +4 -4
  29. data/app/components/better_ui/general/breadcrumb_component.rb +130 -0
  30. data/app/components/better_ui/general/{button/component.html.erb → button_component.html.erb} +7 -7
  31. data/app/components/better_ui/general/button_component.rb +162 -0
  32. data/app/components/better_ui/general/heading_component.html.erb +25 -0
  33. data/app/components/better_ui/general/heading_component.rb +148 -0
  34. data/app/components/better_ui/general/icon_component.html.erb +2 -0
  35. data/app/components/better_ui/general/icon_component.rb +100 -0
  36. data/app/components/better_ui/general/link_component.html.erb +17 -0
  37. data/app/components/better_ui/general/link_component.rb +132 -0
  38. data/app/components/better_ui/general/panel_component.html.erb +27 -0
  39. data/app/components/better_ui/general/panel_component.rb +103 -0
  40. data/app/components/better_ui/general/spinner_component.html.erb +15 -0
  41. data/app/components/better_ui/general/spinner_component.rb +79 -0
  42. data/app/components/better_ui/general/table_component.html.erb +73 -0
  43. data/app/components/better_ui/general/table_component.rb +167 -0
  44. data/app/components/better_ui/theme_helper.rb +171 -0
  45. data/app/controllers/better_ui/application_controller.rb +1 -0
  46. data/app/controllers/better_ui/docs_controller.rb +34 -0
  47. data/app/views/components/better_ui/general/table/_custom_body_row.html.erb +17 -0
  48. data/app/views/components/better_ui/general/table/_custom_footer_rows.html.erb +17 -0
  49. data/app/views/components/better_ui/general/table/_custom_header_rows.html.erb +12 -0
  50. data/app/views/layouts/component_preview.html.erb +32 -0
  51. data/config/initializers/lookbook.rb +12 -12
  52. data/config/routes.rb +13 -0
  53. data/lib/better_ui/engine.rb +36 -5
  54. data/lib/better_ui/version.rb +1 -1
  55. data/lib/better_ui.rb +24 -4
  56. data/lib/generators/better_ui/stylesheet_generator.rb +96 -0
  57. data/lib/generators/better_ui/templates/README +56 -0
  58. data/lib/generators/better_ui/templates/components/_avatar.scss +151 -0
  59. data/lib/generators/better_ui/templates/components/_badge.scss +142 -0
  60. data/lib/generators/better_ui/templates/components/_breadcrumb.scss +107 -0
  61. data/lib/generators/better_ui/templates/components/_button.scss +106 -0
  62. data/lib/generators/better_ui/templates/components/_card.scss +69 -0
  63. data/lib/generators/better_ui/templates/components/_heading.scss +180 -0
  64. data/lib/generators/better_ui/templates/components/_icon.scss +90 -0
  65. data/lib/generators/better_ui/templates/components/_link.scss +130 -0
  66. data/lib/generators/better_ui/templates/components/_panel.scss +144 -0
  67. data/lib/generators/better_ui/templates/components/_spinner.scss +132 -0
  68. data/lib/generators/better_ui/templates/components/_table.scss +105 -0
  69. data/lib/generators/better_ui/templates/components/_variables.scss +33 -0
  70. data/lib/generators/better_ui/templates/components_stylesheet.scss +66 -0
  71. metadata +145 -156
  72. data/app/components/better_ui/application/card/component.html.erb +0 -20
  73. data/app/components/better_ui/application/card/component.rb +0 -214
  74. data/app/components/better_ui/application/main/component.html.erb +0 -9
  75. data/app/components/better_ui/application/main/component.rb +0 -123
  76. data/app/components/better_ui/application/navbar/component.html.erb +0 -92
  77. data/app/components/better_ui/application/navbar/component.rb +0 -136
  78. data/app/components/better_ui/application/sidebar/component.html.erb +0 -227
  79. data/app/components/better_ui/application/sidebar/component.rb +0 -130
  80. data/app/components/better_ui/general/accordion/component.html.erb +0 -5
  81. data/app/components/better_ui/general/accordion/component.rb +0 -92
  82. data/app/components/better_ui/general/accordion/item_component.html.erb +0 -12
  83. data/app/components/better_ui/general/accordion/item_component.rb +0 -176
  84. data/app/components/better_ui/general/alert/component.html.erb +0 -32
  85. data/app/components/better_ui/general/alert/component.rb +0 -242
  86. data/app/components/better_ui/general/avatar/component.html.erb +0 -20
  87. data/app/components/better_ui/general/avatar/component.rb +0 -301
  88. data/app/components/better_ui/general/badge/component.html.erb +0 -23
  89. data/app/components/better_ui/general/badge/component.rb +0 -248
  90. data/app/components/better_ui/general/breadcrumb/component.rb +0 -187
  91. data/app/components/better_ui/general/button/component.rb +0 -214
  92. data/app/components/better_ui/general/divider/component.html.erb +0 -10
  93. data/app/components/better_ui/general/divider/component.rb +0 -226
  94. data/app/components/better_ui/general/dropdown/component.html.erb +0 -25
  95. data/app/components/better_ui/general/dropdown/component.rb +0 -170
  96. data/app/components/better_ui/general/dropdown/divider_component.html.erb +0 -1
  97. data/app/components/better_ui/general/dropdown/divider_component.rb +0 -41
  98. data/app/components/better_ui/general/dropdown/item_component.html.erb +0 -6
  99. data/app/components/better_ui/general/dropdown/item_component.rb +0 -119
  100. data/app/components/better_ui/general/field/component.html.erb +0 -27
  101. data/app/components/better_ui/general/field/component.rb +0 -37
  102. data/app/components/better_ui/general/heading/component.html.erb +0 -22
  103. data/app/components/better_ui/general/heading/component.rb +0 -257
  104. data/app/components/better_ui/general/icon/component.html.erb +0 -7
  105. data/app/components/better_ui/general/icon/component.rb +0 -239
  106. data/app/components/better_ui/general/input/checkbox/component.html.erb +0 -5
  107. data/app/components/better_ui/general/input/checkbox/component.rb +0 -238
  108. data/app/components/better_ui/general/input/datetime/component.html.erb +0 -5
  109. data/app/components/better_ui/general/input/datetime/component.rb +0 -223
  110. data/app/components/better_ui/general/input/radio/component.html.erb +0 -5
  111. data/app/components/better_ui/general/input/radio/component.rb +0 -230
  112. data/app/components/better_ui/general/input/select/component.html.erb +0 -16
  113. data/app/components/better_ui/general/input/select/component.rb +0 -184
  114. data/app/components/better_ui/general/input/select/select_component.html.erb +0 -5
  115. data/app/components/better_ui/general/input/select/select_component.rb +0 -37
  116. data/app/components/better_ui/general/input/text/component.html.erb +0 -5
  117. data/app/components/better_ui/general/input/text/component.rb +0 -171
  118. data/app/components/better_ui/general/input/textarea/component.html.erb +0 -5
  119. data/app/components/better_ui/general/input/textarea/component.rb +0 -166
  120. data/app/components/better_ui/general/link/component.html.erb +0 -18
  121. data/app/components/better_ui/general/link/component.rb +0 -258
  122. data/app/components/better_ui/general/modal/component.html.erb +0 -5
  123. data/app/components/better_ui/general/modal/component.rb +0 -47
  124. data/app/components/better_ui/general/modal/modal_component.html.erb +0 -52
  125. data/app/components/better_ui/general/modal/modal_component.rb +0 -160
  126. data/app/components/better_ui/general/pagination/component.html.erb +0 -85
  127. data/app/components/better_ui/general/pagination/component.rb +0 -216
  128. data/app/components/better_ui/general/panel/component.html.erb +0 -28
  129. data/app/components/better_ui/general/panel/component.rb +0 -249
  130. data/app/components/better_ui/general/progress/component.html.erb +0 -11
  131. data/app/components/better_ui/general/progress/component.rb +0 -160
  132. data/app/components/better_ui/general/spinner/component.html.erb +0 -35
  133. data/app/components/better_ui/general/spinner/component.rb +0 -93
  134. data/app/components/better_ui/general/table/component.html.erb +0 -5
  135. data/app/components/better_ui/general/table/component.rb +0 -217
  136. data/app/components/better_ui/general/table/tbody_component.html.erb +0 -3
  137. data/app/components/better_ui/general/table/tbody_component.rb +0 -30
  138. data/app/components/better_ui/general/table/td_component.html.erb +0 -3
  139. data/app/components/better_ui/general/table/td_component.rb +0 -44
  140. data/app/components/better_ui/general/table/tfoot_component.html.erb +0 -3
  141. data/app/components/better_ui/general/table/tfoot_component.rb +0 -28
  142. data/app/components/better_ui/general/table/th_component.html.erb +0 -6
  143. data/app/components/better_ui/general/table/th_component.rb +0 -51
  144. data/app/components/better_ui/general/table/thead_component.html.erb +0 -3
  145. data/app/components/better_ui/general/table/thead_component.rb +0 -28
  146. data/app/components/better_ui/general/table/tr_component.html.erb +0 -3
  147. data/app/components/better_ui/general/table/tr_component.rb +0 -30
  148. data/app/components/better_ui/general/tabs/component.html.erb +0 -11
  149. data/app/components/better_ui/general/tabs/component.rb +0 -120
  150. data/app/components/better_ui/general/tabs/panel_component.html.erb +0 -3
  151. data/app/components/better_ui/general/tabs/panel_component.rb +0 -37
  152. data/app/components/better_ui/general/tabs/tab_component.html.erb +0 -13
  153. data/app/components/better_ui/general/tabs/tab_component.rb +0 -111
  154. data/app/components/better_ui/general/tag/component.html.erb +0 -3
  155. data/app/components/better_ui/general/tag/component.rb +0 -104
  156. data/app/components/better_ui/general/tooltip/component.html.erb +0 -7
  157. data/app/components/better_ui/general/tooltip/component.rb +0 -239
  158. data/app/helpers/better_ui/application/components/card/card_helper.rb +0 -96
  159. data/app/helpers/better_ui/application/components/card.rb +0 -11
  160. data/app/helpers/better_ui/application/components/main/main_helper.rb +0 -64
  161. data/app/helpers/better_ui/application/components/navbar/navbar_helper.rb +0 -77
  162. data/app/helpers/better_ui/application/components/sidebar/sidebar_helper.rb +0 -51
  163. data/app/helpers/better_ui/application_helper.rb +0 -55
  164. data/app/helpers/better_ui/general/components/accordion/accordion_helper.rb +0 -73
  165. data/app/helpers/better_ui/general/components/accordion.rb +0 -11
  166. data/app/helpers/better_ui/general/components/alert/alert_helper.rb +0 -57
  167. data/app/helpers/better_ui/general/components/avatar/avatar_helper.rb +0 -29
  168. data/app/helpers/better_ui/general/components/badge/badge_helper.rb +0 -53
  169. data/app/helpers/better_ui/general/components/breadcrumb/breadcrumb_helper.rb +0 -37
  170. data/app/helpers/better_ui/general/components/button/button_helper.rb +0 -65
  171. data/app/helpers/better_ui/general/components/container/container_helper.rb +0 -60
  172. data/app/helpers/better_ui/general/components/divider/divider_helper.rb +0 -63
  173. data/app/helpers/better_ui/general/components/dropdown/divider_helper.rb +0 -32
  174. data/app/helpers/better_ui/general/components/dropdown/dropdown_helper.rb +0 -79
  175. data/app/helpers/better_ui/general/components/dropdown/item_helper.rb +0 -62
  176. data/app/helpers/better_ui/general/components/field/field_helper.rb +0 -26
  177. data/app/helpers/better_ui/general/components/heading/heading_helper.rb +0 -72
  178. data/app/helpers/better_ui/general/components/icon/icon_helper.rb +0 -16
  179. data/app/helpers/better_ui/general/components/input/checkbox/checkbox_helper.rb +0 -81
  180. data/app/helpers/better_ui/general/components/input/datetime/datetime_helper.rb +0 -91
  181. data/app/helpers/better_ui/general/components/input/radio/radio_helper.rb +0 -79
  182. data/app/helpers/better_ui/general/components/input/radio_group/radio_group_helper.rb +0 -124
  183. data/app/helpers/better_ui/general/components/input/select/select_helper.rb +0 -70
  184. data/app/helpers/better_ui/general/components/input/text/text_helper.rb +0 -138
  185. data/app/helpers/better_ui/general/components/input/textarea/textarea_helper.rb +0 -73
  186. data/app/helpers/better_ui/general/components/link/link_helper.rb +0 -89
  187. data/app/helpers/better_ui/general/components/modal/modal_helper.rb +0 -85
  188. data/app/helpers/better_ui/general/components/modal.rb +0 -11
  189. data/app/helpers/better_ui/general/components/pagination/pagination_helper.rb +0 -82
  190. data/app/helpers/better_ui/general/components/panel/panel_helper.rb +0 -83
  191. data/app/helpers/better_ui/general/components/progress/progress_helper.rb +0 -53
  192. data/app/helpers/better_ui/general/components/spinner/spinner_helper.rb +0 -19
  193. data/app/helpers/better_ui/general/components/table/table_helper.rb +0 -53
  194. data/app/helpers/better_ui/general/components/table/tbody_helper.rb +0 -13
  195. data/app/helpers/better_ui/general/components/table/td_helper.rb +0 -19
  196. data/app/helpers/better_ui/general/components/table/tfoot_helper.rb +0 -13
  197. data/app/helpers/better_ui/general/components/table/th_helper.rb +0 -19
  198. data/app/helpers/better_ui/general/components/table/thead_helper.rb +0 -13
  199. data/app/helpers/better_ui/general/components/table/tr_helper.rb +0 -13
  200. data/app/helpers/better_ui/general/components/tabs/panel_helper.rb +0 -62
  201. data/app/helpers/better_ui/general/components/tabs/tab_helper.rb +0 -55
  202. data/app/helpers/better_ui/general/components/tabs/tabs_helper.rb +0 -95
  203. data/app/helpers/better_ui/general/components/tag/tag_helper.rb +0 -26
  204. data/app/helpers/better_ui/general/components/tooltip/tooltip_helper.rb +0 -60
  205. data/app/views/layouts/better_ui/application.html.erb +0 -17
  206. data/lib/better_ui/railtie.rb +0 -20
@@ -0,0 +1,167 @@
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: { base: "bui-table-default", border: "bui-table-border-default", bg: "bui-table-bg-default", text: "bui-table-text-default" },
10
+ white: { base: "bui-table-white", border: "bui-table-border-white", bg: "bui-table-bg-white", text: "bui-table-text-white" },
11
+ red: { base: "bui-table-red", border: "bui-table-border-red", bg: "bui-table-bg-red", text: "bui-table-text-red" },
12
+ rose: { base: "bui-table-rose", border: "bui-table-border-rose", bg: "bui-table-bg-rose", text: "bui-table-text-rose" },
13
+ orange: { base: "bui-table-orange", border: "bui-table-border-orange", bg: "bui-table-bg-orange", text: "bui-table-text-orange" },
14
+ green: { base: "bui-table-green", border: "bui-table-border-green", bg: "bui-table-bg-green", text: "bui-table-text-green" },
15
+ blue: { base: "bui-table-blue", border: "bui-table-border-blue", bg: "bui-table-bg-blue", text: "bui-table-text-blue" },
16
+ yellow: { base: "bui-table-yellow", border: "bui-table-border-yellow", bg: "bui-table-bg-yellow", text: "bui-table-text-yellow" },
17
+ violet: { base: "bui-table-violet", border: "bui-table-border-violet", bg: "bui-table-bg-violet", text: "bui-table-text-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-base",
49
+ @bordered ? "bui-table-bordered" : nil,
50
+ @classes
51
+ ].compact.join(" ")
52
+ end
53
+
54
+ def table_container_classes
55
+ [
56
+ "bui-table-container",
57
+ get_border_radius_class
58
+ ].compact.join(" ")
59
+ end
60
+
61
+ def get_border_radius_class
62
+ TABLE_RADIUS[@rounded] || TABLE_RADIUS[:small]
63
+ end
64
+
65
+ def caption_classes
66
+ [
67
+ "bui-table-caption",
68
+ get_theme_bg_color,
69
+ get_theme_text_class,
70
+ @bordered ? "bui-table-caption-bordered #{get_theme_border_color}" : nil
71
+ ].compact.join(" ")
72
+ end
73
+
74
+ def thead_classes
75
+ "bui-table-header"
76
+ end
77
+
78
+ def tbody_classes
79
+ @striped ? "bui-table-row-striped" : nil
80
+ end
81
+
82
+ def tfoot_classes
83
+ "bui-table-footer"
84
+ end
85
+
86
+ def tr_classes(index)
87
+ [
88
+ @hoverable ? "bui-table-row-hover" : nil,
89
+ @striped ? nil : (index.odd? ? "bui-table-row-alternate" : nil)
90
+ ].compact.join(" ")
91
+ end
92
+
93
+ def th_classes
94
+ [
95
+ @compact ? "bui-table-cell-compact" : "bui-table-cell",
96
+ get_theme_bg_color,
97
+ get_theme_text_class,
98
+ @bordered ? "bui-table-cell-bordered #{get_theme_border_color}" : nil
99
+ ].compact.join(" ")
100
+ end
101
+
102
+ def td_classes
103
+ [
104
+ @compact ? "bui-table-cell-compact" : "bui-table-cell",
105
+ @bordered ? "bui-table-cell-bordered #{get_theme_border_color}" : nil
106
+ ].compact.join(" ")
107
+ end
108
+
109
+ def tf_classes
110
+ [
111
+ @compact ? "bui-table-cell-compact" : "bui-table-cell",
112
+ "bui-table-footer-cell",
113
+ get_theme_bg_color,
114
+ get_theme_text_class,
115
+ @bordered ? "bui-table-cell-bordered #{get_theme_border_color}" : nil
116
+ ].compact.join(" ")
117
+ end
118
+
119
+ def get_theme_base_class
120
+ TABLE_THEMES[@variant][:base] || TABLE_THEMES[:default][:base]
121
+ end
122
+
123
+ def get_theme_border_color
124
+ TABLE_THEMES[@variant][:border] || TABLE_THEMES[:default][:border]
125
+ end
126
+
127
+ def get_theme_bg_color
128
+ TABLE_THEMES[@variant][:bg] || TABLE_THEMES[:default][:bg]
129
+ end
130
+
131
+ def get_theme_text_class
132
+ TABLE_THEMES[@variant][:text] || TABLE_THEMES[:default][:text]
133
+ end
134
+
135
+ def headers_for_display
136
+ return @headers if @headers.present?
137
+ return [] if @data.empty?
138
+
139
+ case first_item = @data.first
140
+ when Hash
141
+ first_item.keys
142
+ when -> (item) { item.respond_to?(:attributes) }
143
+ first_item.attributes.keys - %w[id created_at updated_at]
144
+ else
145
+ []
146
+ end
147
+ end
148
+
149
+ # Ottiene il valore di una cella in modo consistente
150
+ def get_cell_value(row, header)
151
+ if row.is_a?(Hash)
152
+ row[header.to_s] || row[header.to_sym] || "—"
153
+ elsif row.respond_to?(header.to_sym)
154
+ row.send(header.to_sym)
155
+ elsif row.is_a?(Array) && headers_for_display.index(header)
156
+ row[headers_for_display.index(header)] || "—"
157
+ else
158
+ "—"
159
+ end
160
+ end
161
+
162
+ def render?
163
+ @data.present?
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module ThemeHelper
5
+ # Colori principali del tema
6
+ THEME_COLORS = {
7
+ # Varianti cromatiche
8
+ default: {
9
+ bg: 'bg-black',
10
+ text: 'text-white',
11
+ hover: 'hover:bg-gray-900'
12
+ },
13
+ white: {
14
+ bg: 'bg-white',
15
+ text: 'text-black',
16
+ hover: 'hover:bg-gray-100'
17
+ },
18
+ red: {
19
+ bg: 'bg-red-500',
20
+ text: 'text-white',
21
+ hover: 'hover:bg-red-600'
22
+ },
23
+ rose: {
24
+ bg: 'bg-rose-500',
25
+ text: 'text-white',
26
+ hover: 'hover:bg-rose-600'
27
+ },
28
+ orange: {
29
+ bg: 'bg-orange-500',
30
+ text: 'text-white',
31
+ hover: 'hover:bg-orange-600'
32
+ },
33
+ green: {
34
+ bg: 'bg-green-500',
35
+ text: 'text-white',
36
+ hover: 'hover:bg-green-600'
37
+ },
38
+ blue: {
39
+ bg: 'bg-blue-500',
40
+ text: 'text-white',
41
+ hover: 'hover:bg-blue-600'
42
+ },
43
+ yellow: {
44
+ bg: 'bg-yellow-500',
45
+ text: 'text-black',
46
+ hover: 'hover:bg-yellow-600'
47
+ },
48
+ violet: {
49
+ bg: 'bg-violet-500',
50
+ text: 'text-white',
51
+ hover: 'hover:bg-violet-600'
52
+ }
53
+ }
54
+
55
+ # Bordi del tema
56
+ THEME_BORDERS = {
57
+ default: 'border-gray-900',
58
+ white: 'border-gray-200',
59
+ red: 'border-red-600',
60
+ rose: 'border-rose-600',
61
+ orange: 'border-orange-600',
62
+ green: 'border-green-600',
63
+ blue: 'border-blue-600',
64
+ yellow: 'border-yellow-600',
65
+ violet: 'border-violet-600'
66
+ }
67
+
68
+ # NOTA: I valori di border-radius sono ora definiti nelle costanti specifiche di ogni componente
69
+ # per garantire una nomenclatura standardizzata:
70
+ # - none: nessun arrotondamento (rounded-none)
71
+ # - small: arrotondamento piccolo (rounded-md)
72
+ # - medium: arrotondamento medio (rounded-lg)
73
+ # - large: arrotondamento grande (rounded-xl)
74
+ # - full: arrotondamento completo (rounded-full)
75
+
76
+ # Effetti hover
77
+ THEME_HOVER = THEME_COLORS.transform_values { |v| v[:hover] }
78
+
79
+ # Stili base comuni
80
+ COMMON_STYLES = {
81
+ shadow: 'shadow-sm',
82
+ transitions: 'transition-all duration-200'
83
+ }
84
+
85
+ # Stili per elementi di layout
86
+ LAYOUT_STYLES = {
87
+ panel: {
88
+ base: 'border shadow-sm',
89
+ header: 'px-4 py-3 border-b',
90
+ body: 'p-4',
91
+ footer: 'px-4 py-3 border-t'
92
+ },
93
+ table: {
94
+ container: 'overflow-hidden border shadow-sm',
95
+ header: 'bg-gray-50 text-left text-xs uppercase tracking-wider text-gray-500 font-medium',
96
+ row: {
97
+ base: '',
98
+ hover: 'hover:bg-gray-50',
99
+ striped: 'even:bg-white odd:bg-gray-50'
100
+ },
101
+ cell: 'px-4 py-3 text-sm text-gray-700'
102
+ }
103
+ }
104
+
105
+ # Genera classi per un componente basato su variante
106
+ def self.generate_component_classes(component_type, variant, options = {})
107
+ base_classes = []
108
+
109
+ case component_type
110
+ when :button
111
+ base_classes << 'inline-flex items-center justify-center'
112
+ base_classes << 'font-medium'
113
+ base_classes << COMMON_STYLES[:transitions]
114
+
115
+ variant_colors = THEME_COLORS[variant.to_sym] || THEME_COLORS[:default]
116
+
117
+ # Versione piena
118
+ base_classes << variant_colors[:bg]
119
+ base_classes << variant_colors[:text]
120
+ base_classes << THEME_HOVER[variant.to_sym] || THEME_HOVER[:default]
121
+
122
+ # Dimensione
123
+ case options[:size]
124
+ when :sm
125
+ base_classes << 'px-2.5 py-1.5 text-xs'
126
+ when :lg
127
+ base_classes << 'px-6 py-3 text-base'
128
+ else # :md (default)
129
+ base_classes << 'px-4 py-2 text-sm'
130
+ end
131
+
132
+ # Disabilitato
133
+ if options[:disabled]
134
+ base_classes << 'opacity-50 cursor-not-allowed'
135
+ end
136
+
137
+ # Larghezza piena
138
+ if options[:full_width]
139
+ base_classes << 'w-full'
140
+ end
141
+
142
+ when :panel
143
+ base_classes << LAYOUT_STYLES[:panel][:base]
144
+
145
+ variant_colors = THEME_COLORS[variant.to_sym] || THEME_COLORS[:default]
146
+
147
+ base_classes << variant_colors[:bg]
148
+ base_classes << variant_colors[:text]
149
+ base_classes << THEME_BORDERS[variant.to_sym] || THEME_BORDERS[:default]
150
+
151
+ when :table
152
+ base_classes << 'min-w-full'
153
+
154
+ variant_colors = THEME_COLORS[variant.to_sym] || THEME_COLORS[:default]
155
+ base_classes << variant_colors[:bg]
156
+ base_classes << variant_colors[:text]
157
+
158
+ # Bordi
159
+ if options[:bordered]
160
+ base_classes << 'border-collapse'
161
+ base_classes << (THEME_BORDERS[variant.to_sym] || THEME_BORDERS[:default])
162
+ end
163
+
164
+ # Classi personalizzate
165
+ base_classes << options[:classes] if options[:classes].present?
166
+ end
167
+
168
+ base_classes.compact.join(' ')
169
+ end
170
+ end
171
+ 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,34 @@
1
+ module BetterUi
2
+ class DocsController < ApplicationController
3
+ def index
4
+ # Pagina principale della documentazione
5
+ end
6
+
7
+ def show
8
+ # Verifica se esiste una vista con il nome richiesto
9
+ page = params[:page]
10
+ valid_pages = %w[introduction installation customization components/buttons components/icons components/panel components/table]
11
+
12
+ if valid_pages.include?(page)
13
+ if page.start_with?('components/')
14
+ # Per i componenti, rendiamo esplicitamente il template nella directory corretta
15
+ component_name = page.split('/').last
16
+ render template: "better_ui/docs/components/#{component_name}"
17
+ else
18
+ render page
19
+ end
20
+ else
21
+ # Pagina non trovata
22
+ render plain: "Pagina non trovata", status: :not_found
23
+ end
24
+ end
25
+
26
+ def component
27
+ # Gestisce le rotte tipo /better_ui/docs/components/button
28
+ component_name = params[:component]
29
+ render template: "better_ui/docs/components/#{component_name}"
30
+ rescue ActionView::MissingTemplate
31
+ render plain: "Componente non trovato", status: :not_found
32
+ end
33
+ end
34
+ 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,15 @@
1
1
  BetterUi::Engine.routes.draw do
2
+ # Route principale per la documentazione
3
+ root to: 'docs#index'
4
+
5
+ # Route per le pagine di documentazione generiche
6
+ get 'docs/:page', to: 'docs#show', as: :docs_page
7
+
8
+ # Route specifica per i componenti
9
+ get 'docs/components/:component', to: 'docs#component', as: :docs_component
10
+
11
+ # Montaggio di Lookbook per lo sviluppo e il test
12
+ if Rails.env.development? || Rails.env.test?
13
+ mount Lookbook::Engine, at: "/lookbook"
14
+ end
2
15
  end
@@ -1,14 +1,45 @@
1
+ require 'view_component'
2
+ require 'redcarpet'
3
+ require 'tailwindcss-rails'
4
+ require 'coderay'
5
+ require 'font-awesome-sass'
6
+ require 'lookbook'
7
+ require 'listen'
8
+ require 'action_cable'
9
+
1
10
  module BetterUi
2
11
  class Engine < ::Rails::Engine
3
12
  isolate_namespace BetterUi
4
-
5
- initializer "better_ui.view_helpers" do
13
+
14
+ # Configurazione per rendere disponibili gli assets all'applicazione host
15
+ initializer 'better_ui.assets' do |app|
16
+ app.config.assets.paths << root.join('app', 'assets', 'stylesheets')
17
+ app.config.assets.paths << root.join('app', 'assets', 'images')
18
+ end
19
+
20
+ # Assicuriamo che gli helper siano correttamente caricati
21
+ config.autoload_paths << root.join('app', 'helpers')
22
+
23
+ # Configurazione per rendere disponibili i componenti all'applicazione host
24
+ initializer 'better_ui.view_helpers' do
25
+ require_relative '../../app/helpers/better_ui_application_helper'
26
+
6
27
  ActiveSupport.on_load :action_controller do
7
- helper BetterUi::ApplicationHelper if defined?(BetterUi::ApplicationHelper)
28
+ helper BetterUi::ApplicationHelper
8
29
  end
9
-
30
+
10
31
  ActiveSupport.on_load :action_view do
11
- include BetterUi::ApplicationHelper if defined?(BetterUi::ApplicationHelper)
32
+ include BetterUi::ApplicationHelper
33
+ end
34
+ end
35
+
36
+ # Configurazione per ViewComponent
37
+ config.view_component.preview_paths << root.join('test', 'components', 'previews')
38
+
39
+ # Configurazione per Lookbook in sviluppo e test
40
+ initializer 'better_ui.lookbook' do
41
+ if Rails.env.development? || Rails.env.test?
42
+ config.lookbook = Lookbook
12
43
  end
13
44
  end
14
45
  end
@@ -1,3 +1,3 @@
1
1
  module BetterUi
2
- VERSION = "0.3.0"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/better_ui.rb CHANGED
@@ -1,9 +1,29 @@
1
1
  require "better_ui/version"
2
2
  require "better_ui/engine"
3
- require "better_ui/railtie"
4
-
5
- require "font-awesome-sass"
6
3
 
7
4
  module BetterUi
8
- # Your code goes here...
5
+ class Configuration
6
+ attr_accessor :button_defaults, :alert_defaults, :card_defaults, :tabs_defaults
7
+
8
+ def initialize
9
+ @button_defaults = {}
10
+ @alert_defaults = {}
11
+ @card_defaults = {}
12
+ @tabs_defaults = {}
13
+ end
14
+ end
15
+
16
+ class << self
17
+ def configuration
18
+ @configuration ||= Configuration.new
19
+ end
20
+
21
+ def configure
22
+ yield(configuration) if block_given?
23
+ end
24
+ end
9
25
  end
26
+
27
+ # Caricamento del generator
28
+ require 'rails/generators'
29
+ require 'generators/better_ui/stylesheet_generator' if defined?(Rails::Generators)