better_ui 0.9.0 → 0.9.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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/lib/better_ui/version.rb +1 -1
  3. data/spec/components/previews/better_ui/action_messages_component_preview/all_styles.html.erb +17 -0
  4. data/spec/components/previews/better_ui/action_messages_component_preview/all_variants.html.erb +19 -0
  5. data/spec/components/previews/better_ui/action_messages_component_preview/auto_dismiss.html.erb +51 -0
  6. data/spec/components/previews/better_ui/action_messages_component_preview/dismissible.html.erb +19 -0
  7. data/spec/components/previews/better_ui/action_messages_component_preview/with_title.html.erb +17 -0
  8. data/spec/components/previews/better_ui/action_messages_component_preview.rb +224 -0
  9. data/spec/components/previews/better_ui/avatar_component_preview/all_shapes.html.erb +26 -0
  10. data/spec/components/previews/better_ui/avatar_component_preview/all_sizes.html.erb +24 -0
  11. data/spec/components/previews/better_ui/avatar_component_preview/all_variants.html.erb +12 -0
  12. data/spec/components/previews/better_ui/avatar_component_preview/with_initials.html.erb +22 -0
  13. data/spec/components/previews/better_ui/avatar_component_preview/with_status.html.erb +26 -0
  14. data/spec/components/previews/better_ui/avatar_component_preview.rb +73 -0
  15. data/spec/components/previews/better_ui/badge_component_preview/all_sizes.html.erb +29 -0
  16. data/spec/components/previews/better_ui/badge_component_preview/all_styles.html.erb +26 -0
  17. data/spec/components/previews/better_ui/badge_component_preview/all_variants.html.erb +14 -0
  18. data/spec/components/previews/better_ui/badge_component_preview/counter_badges.html.erb +39 -0
  19. data/spec/components/previews/better_ui/badge_component_preview/dot_badges.html.erb +28 -0
  20. data/spec/components/previews/better_ui/badge_component_preview.rb +69 -0
  21. data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview/all_separators.html.erb +47 -0
  22. data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview/default.html.erb +23 -0
  23. data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview/with_icons.html.erb +43 -0
  24. data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview.rb +38 -0
  25. data/spec/components/previews/better_ui/button_component_preview/all_sizes.html.erb +25 -0
  26. data/spec/components/previews/better_ui/button_component_preview/all_variants.html.erb +14 -0
  27. data/spec/components/previews/better_ui/button_component_preview/as_links.html.erb +18 -0
  28. data/spec/components/previews/better_ui/button_component_preview/auto_loading_submit.html.erb +112 -0
  29. data/spec/components/previews/better_ui/button_component_preview/external_links.html.erb +61 -0
  30. data/spec/components/previews/better_ui/button_component_preview/form_integration.html.erb +102 -0
  31. data/spec/components/previews/better_ui/button_component_preview/interactive.html.erb +149 -0
  32. data/spec/components/previews/better_ui/button_component_preview/link_states.html.erb +36 -0
  33. data/spec/components/previews/better_ui/button_component_preview/loading_states.html.erb +62 -0
  34. data/spec/components/previews/better_ui/button_component_preview/turbo_method_links.html.erb +98 -0
  35. data/spec/components/previews/better_ui/button_component_preview/with_icons.html.erb +123 -0
  36. data/spec/components/previews/better_ui/button_component_preview.rb +155 -0
  37. data/spec/components/previews/better_ui/card_component_preview/all_sizes.html.erb +10 -0
  38. data/spec/components/previews/better_ui/card_component_preview/all_styles.html.erb +22 -0
  39. data/spec/components/previews/better_ui/card_component_preview/all_variants.html.erb +10 -0
  40. data/spec/components/previews/better_ui/card_component_preview.rb +269 -0
  41. data/spec/components/previews/better_ui/container_component_preview/all_sizes.html.erb +13 -0
  42. data/spec/components/previews/better_ui/container_component_preview.rb +59 -0
  43. data/spec/components/previews/better_ui/dialog/alert_component_preview/all_variants.html.erb +17 -0
  44. data/spec/components/previews/better_ui/dialog/alert_component_preview/custom_button_label.html.erb +14 -0
  45. data/spec/components/previews/better_ui/dialog/alert_component_preview/default.html.erb +13 -0
  46. data/spec/components/previews/better_ui/dialog/alert_component_preview/playground.html.erb +16 -0
  47. data/spec/components/previews/better_ui/dialog/alert_component_preview/without_icon.html.erb +14 -0
  48. data/spec/components/previews/better_ui/dialog/alert_component_preview.rb +57 -0
  49. data/spec/components/previews/better_ui/dialog/confirm_component_preview/all_variants.html.erb +17 -0
  50. data/spec/components/previews/better_ui/dialog/confirm_component_preview/custom_labels.html.erb +15 -0
  51. data/spec/components/previews/better_ui/dialog/confirm_component_preview/danger_confirm.html.erb +15 -0
  52. data/spec/components/previews/better_ui/dialog/confirm_component_preview/default.html.erb +13 -0
  53. data/spec/components/previews/better_ui/dialog/confirm_component_preview/playground.html.erb +17 -0
  54. data/spec/components/previews/better_ui/dialog/confirm_component_preview.rb +60 -0
  55. data/spec/components/previews/better_ui/dialog/dialog_component_preview/all_sizes.html.erb +32 -0
  56. data/spec/components/previews/better_ui/dialog/dialog_component_preview/default.html.erb +34 -0
  57. data/spec/components/previews/better_ui/dialog/dialog_component_preview/no_close_button.html.erb +28 -0
  58. data/spec/components/previews/better_ui/dialog/dialog_component_preview/playground.html.erb +39 -0
  59. data/spec/components/previews/better_ui/dialog/dialog_component_preview/with_all_slots.html.erb +52 -0
  60. data/spec/components/previews/better_ui/dialog/dialog_component_preview.rb +51 -0
  61. data/spec/components/previews/better_ui/divider_component_preview/all_styles.html.erb +58 -0
  62. data/spec/components/previews/better_ui/divider_component_preview/with_labels.html.erb +67 -0
  63. data/spec/components/previews/better_ui/divider_component_preview.rb +62 -0
  64. data/spec/components/previews/better_ui/drawer/header_component_preview.rb +169 -0
  65. data/spec/components/previews/better_ui/drawer/layout_component_preview/complete_layout.html.erb +87 -0
  66. data/spec/components/previews/better_ui/drawer/layout_component_preview/dark_theme.html.erb +36 -0
  67. data/spec/components/previews/better_ui/drawer/layout_component_preview/dashboard_example.html.erb +188 -0
  68. data/spec/components/previews/better_ui/drawer/layout_component_preview/default.html.erb +22 -0
  69. data/spec/components/previews/better_ui/drawer/layout_component_preview/primary_theme.html.erb +36 -0
  70. data/spec/components/previews/better_ui/drawer/layout_component_preview/right_sidebar.html.erb +44 -0
  71. data/spec/components/previews/better_ui/drawer/layout_component_preview/with_header_only.html.erb +20 -0
  72. data/spec/components/previews/better_ui/drawer/layout_component_preview/with_sidebar_only.html.erb +21 -0
  73. data/spec/components/previews/better_ui/drawer/layout_component_preview.rb +91 -0
  74. data/spec/components/previews/better_ui/drawer/nav_group_component_preview/complete_navigation.html.erb +55 -0
  75. data/spec/components/previews/better_ui/drawer/nav_group_component_preview.rb +163 -0
  76. data/spec/components/previews/better_ui/drawer/nav_item_component_preview.rb +104 -0
  77. data/spec/components/previews/better_ui/drawer/sidebar_component_preview.rb +212 -0
  78. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/all_sizes.html.erb +19 -0
  79. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/default.html.erb +12 -0
  80. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/disabled_items.html.erb +14 -0
  81. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/placement_options.html.erb +16 -0
  82. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/playground.html.erb +35 -0
  83. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/with_dividers_and_headers.html.erb +18 -0
  84. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/with_icons.html.erb +34 -0
  85. data/spec/components/previews/better_ui/dropdown/dropdown_component_preview.rb +59 -0
  86. data/spec/components/previews/better_ui/fa_icon_component_preview/all_sizes.html.erb +17 -0
  87. data/spec/components/previews/better_ui/fa_icon_component_preview/all_styles.html.erb +19 -0
  88. data/spec/components/previews/better_ui/fa_icon_component_preview/all_variants.html.erb +26 -0
  89. data/spec/components/previews/better_ui/fa_icon_component_preview/animations.html.erb +26 -0
  90. data/spec/components/previews/better_ui/fa_icon_component_preview/transformations.html.erb +88 -0
  91. data/spec/components/previews/better_ui/fa_icon_component_preview.rb +85 -0
  92. data/spec/components/previews/better_ui/forms/checkbox_component_preview/all_sizes.html.erb +12 -0
  93. data/spec/components/previews/better_ui/forms/checkbox_component_preview/all_variants.html.erb +12 -0
  94. data/spec/components/previews/better_ui/forms/checkbox_component_preview/form_integration.html.erb +32 -0
  95. data/spec/components/previews/better_ui/forms/checkbox_component_preview.rb +143 -0
  96. data/spec/components/previews/better_ui/forms/checkbox_group_component_preview/all_variants.html.erb +14 -0
  97. data/spec/components/previews/better_ui/forms/checkbox_group_component_preview/form_integration.html.erb +47 -0
  98. data/spec/components/previews/better_ui/forms/checkbox_group_component_preview/orientations.html.erb +34 -0
  99. data/spec/components/previews/better_ui/forms/checkbox_group_component_preview.rb +150 -0
  100. data/spec/components/previews/better_ui/forms/number_input_component_preview/all_sizes.html.erb +14 -0
  101. data/spec/components/previews/better_ui/forms/number_input_component_preview/form_integration.html.erb +45 -0
  102. data/spec/components/previews/better_ui/forms/number_input_component_preview.rb +211 -0
  103. data/spec/components/previews/better_ui/forms/password_input_component_preview/all_sizes.html.erb +12 -0
  104. data/spec/components/previews/better_ui/forms/password_input_component_preview/confirm_password_example.html.erb +29 -0
  105. data/spec/components/previews/better_ui/forms/password_input_component_preview/form_integration.html.erb +34 -0
  106. data/spec/components/previews/better_ui/forms/password_input_component_preview.rb +181 -0
  107. data/spec/components/previews/better_ui/forms/select_component_preview/all_sizes.html.erb +13 -0
  108. data/spec/components/previews/better_ui/forms/select_component_preview/all_states.html.erb +64 -0
  109. data/spec/components/previews/better_ui/forms/select_component_preview.rb +167 -0
  110. data/spec/components/previews/better_ui/forms/text_input_component_preview/all_sizes.html.erb +12 -0
  111. data/spec/components/previews/better_ui/forms/text_input_component_preview/all_types.html.erb +12 -0
  112. data/spec/components/previews/better_ui/forms/text_input_component_preview/form_integration.html.erb +33 -0
  113. data/spec/components/previews/better_ui/forms/text_input_component_preview.rb +247 -0
  114. data/spec/components/previews/better_ui/forms/textarea_component_preview/all_resize_variants.html.erb +13 -0
  115. data/spec/components/previews/better_ui/forms/textarea_component_preview/all_sizes.html.erb +12 -0
  116. data/spec/components/previews/better_ui/forms/textarea_component_preview/form_integration.html.erb +36 -0
  117. data/spec/components/previews/better_ui/forms/textarea_component_preview.rb +239 -0
  118. data/spec/components/previews/better_ui/heading_component_preview/all_alignments.html.erb +12 -0
  119. data/spec/components/previews/better_ui/heading_component_preview/all_levels.html.erb +7 -0
  120. data/spec/components/previews/better_ui/heading_component_preview/all_variants.html.erb +14 -0
  121. data/spec/components/previews/better_ui/heading_component_preview.rb +113 -0
  122. data/spec/components/previews/better_ui/link_component_preview/all_sizes.html.erb +25 -0
  123. data/spec/components/previews/better_ui/link_component_preview/all_styles.html.erb +14 -0
  124. data/spec/components/previews/better_ui/link_component_preview/all_variants.html.erb +14 -0
  125. data/spec/components/previews/better_ui/link_component_preview/with_icons.html.erb +66 -0
  126. data/spec/components/previews/better_ui/link_component_preview.rb +66 -0
  127. data/spec/components/previews/better_ui/progress_component_preview/all_sizes.html.erb +15 -0
  128. data/spec/components/previews/better_ui/progress_component_preview/all_variants.html.erb +11 -0
  129. data/spec/components/previews/better_ui/progress_component_preview.rb +64 -0
  130. data/spec/components/previews/better_ui/spinner_component_preview/all_sizes.html.erb +17 -0
  131. data/spec/components/previews/better_ui/spinner_component_preview/all_variants.html.erb +11 -0
  132. data/spec/components/previews/better_ui/spinner_component_preview.rb +44 -0
  133. data/spec/components/previews/better_ui/table/table_component_preview/all_sizes.html.erb +28 -0
  134. data/spec/components/previews/better_ui/table/table_component_preview/all_variants.html.erb +34 -0
  135. data/spec/components/previews/better_ui/table/table_component_preview/bordered.html.erb +33 -0
  136. data/spec/components/previews/better_ui/table/table_component_preview/collection_mode.html.erb +31 -0
  137. data/spec/components/previews/better_ui/table/table_component_preview/default.html.erb +33 -0
  138. data/spec/components/previews/better_ui/table/table_component_preview/empty_state.html.erb +36 -0
  139. data/spec/components/previews/better_ui/table/table_component_preview/highlighted.html.erb +64 -0
  140. data/spec/components/previews/better_ui/table/table_component_preview/hoverable.html.erb +27 -0
  141. data/spec/components/previews/better_ui/table/table_component_preview/inside_card.html.erb +173 -0
  142. data/spec/components/previews/better_ui/table/table_component_preview/sortable.html.erb +44 -0
  143. data/spec/components/previews/better_ui/table/table_component_preview/striped.html.erb +31 -0
  144. data/spec/components/previews/better_ui/table/table_component_preview/with_footer.html.erb +40 -0
  145. data/spec/components/previews/better_ui/table/table_component_preview.rb +79 -0
  146. data/spec/components/previews/better_ui/tabs/container_component_preview/alignments.html.erb +24 -0
  147. data/spec/components/previews/better_ui/tabs/container_component_preview/all_sizes.html.erb +24 -0
  148. data/spec/components/previews/better_ui/tabs/container_component_preview/all_variants.html.erb +24 -0
  149. data/spec/components/previews/better_ui/tabs/container_component_preview/bordered_style.html.erb +30 -0
  150. data/spec/components/previews/better_ui/tabs/container_component_preview/default.html.erb +30 -0
  151. data/spec/components/previews/better_ui/tabs/container_component_preview/disabled_tab.html.erb +65 -0
  152. data/spec/components/previews/better_ui/tabs/container_component_preview/pills_style.html.erb +34 -0
  153. data/spec/components/previews/better_ui/tabs/container_component_preview/turbo_mode.html.erb +40 -0
  154. data/spec/components/previews/better_ui/tabs/container_component_preview/vertical_left.html.erb +38 -0
  155. data/spec/components/previews/better_ui/tabs/container_component_preview/vertical_right.html.erb +30 -0
  156. data/spec/components/previews/better_ui/tabs/container_component_preview/with_icons_and_badges.html.erb +71 -0
  157. data/spec/components/previews/better_ui/tabs/container_component_preview.rb +130 -0
  158. data/spec/components/previews/better_ui/tag_component_preview/all_styles.html.erb +14 -0
  159. data/spec/components/previews/better_ui/tag_component_preview/all_variants.html.erb +14 -0
  160. data/spec/components/previews/better_ui/tag_component_preview/as_links.html.erb +14 -0
  161. data/spec/components/previews/better_ui/tag_component_preview/dismissible.html.erb +34 -0
  162. data/spec/components/previews/better_ui/tag_component_preview.rb +56 -0
  163. data/spec/components/previews/better_ui/tooltip_component_preview/all_positions.html.erb +25 -0
  164. data/spec/components/previews/better_ui/tooltip_component_preview/variants.html.erb +37 -0
  165. data/spec/components/previews/better_ui/tooltip_component_preview.rb +40 -0
  166. metadata +164 -1
@@ -0,0 +1,269 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ # @label Card
5
+ class CardComponentPreview < ViewComponent::Preview
6
+ # @label Default
7
+ # @display bg_color #f5f5f5
8
+ def default
9
+ render BetterUi::CardComponent.new do
10
+ "This is a default card with solid primary style and medium size."
11
+ end
12
+ end
13
+
14
+ # @label With Header
15
+ # @display bg_color #f5f5f5
16
+ def with_header
17
+ render BetterUi::CardComponent.new do |card|
18
+ card.with_header { "Card Header" }
19
+ card.with_body { "This card has a header section separated by a divider." }
20
+ end
21
+ end
22
+
23
+ # @label With Footer
24
+ # @display bg_color #f5f5f5
25
+ def with_footer
26
+ render BetterUi::CardComponent.new do |card|
27
+ card.with_body { "This card has a footer section for actions or additional information." }
28
+ card.with_footer { "Card Footer" }
29
+ end
30
+ end
31
+
32
+ # @label With All Sections
33
+ # @display bg_color #f5f5f5
34
+ def with_all_sections
35
+ render BetterUi::CardComponent.new do |card|
36
+ card.with_header { "Complete Card" }
37
+ card.with_body { "This card demonstrates all three sections: header, body, and footer." }
38
+ card.with_footer { "Footer with actions" }
39
+ end
40
+ end
41
+
42
+ # @label Solid Style
43
+ # @display bg_color #f5f5f5
44
+ def solid_style
45
+ render BetterUi::CardComponent.new(variant: :primary, style: :solid) do |card|
46
+ card.with_header { "Solid Card" }
47
+ card.with_body { "Filled background with subtle border and dark text. Best for emphasis." }
48
+ end
49
+ end
50
+
51
+ # @label Outline Style
52
+ # @display bg_color #f5f5f5
53
+ def outline_style
54
+ render BetterUi::CardComponent.new(variant: :primary, style: :outline) do |card|
55
+ card.with_header { "Outline Card" }
56
+ card.with_body { "White background with colored border. Clean and minimal." }
57
+ end
58
+ end
59
+
60
+ # @label Ghost Style (Transparent)
61
+ # @display bg_color #f5f5f5
62
+ def ghost_style
63
+ render BetterUi::CardComponent.new(variant: :primary, style: :ghost) do |card|
64
+ card.with_header { "Ghost Card" }
65
+ card.with_body { "Transparent background with colored text. Most subtle option." }
66
+ end
67
+ end
68
+
69
+ # @label Soft Style
70
+ # @display bg_color #f5f5f5
71
+ def soft_style
72
+ render BetterUi::CardComponent.new(variant: :primary, style: :soft) do |card|
73
+ card.with_header { "Soft Card" }
74
+ card.with_body { "Light colored background with subtle border. Gentle appearance." }
75
+ end
76
+ end
77
+
78
+ # @label Bordered Style
79
+ # @display bg_color #f5f5f5
80
+ def bordered_style
81
+ render BetterUi::CardComponent.new(style: :bordered) do |card|
82
+ card.with_header { "Bordered Card" }
83
+ card.with_body { "White background with variant-colored border. Defaults to light variant. Positioned between soft and outline in visual weight." }
84
+ end
85
+ end
86
+
87
+ # @label Success Card
88
+ # @display bg_color #f5f5f5
89
+ def success_card
90
+ render BetterUi::CardComponent.new(variant: :success) do |card|
91
+ card.with_header { "✓ Success" }
92
+ card.with_body { "Operation completed successfully!" }
93
+ end
94
+ end
95
+
96
+ # @label Danger Card
97
+ # @display bg_color #f5f5f5
98
+ def danger_card
99
+ render BetterUi::CardComponent.new(variant: :danger) do |card|
100
+ card.with_header { "⚠ Error" }
101
+ card.with_body { "An error occurred while processing your request." }
102
+ end
103
+ end
104
+
105
+ # @label Info Card
106
+ # @display bg_color #f5f5f5
107
+ def info_card
108
+ render BetterUi::CardComponent.new(variant: :info) do |card|
109
+ card.with_header { "ℹ Information" }
110
+ card.with_body { "Here's some helpful information for you." }
111
+ end
112
+ end
113
+
114
+ # @label Without Shadow
115
+ # @display bg_color #f5f5f5
116
+ def without_shadow
117
+ render BetterUi::CardComponent.new(shadow: false) do |card|
118
+ card.with_header { "Flat Card" }
119
+ card.with_body { "This card has no shadow elevation." }
120
+ end
121
+ end
122
+
123
+ # @label Extra Small Size
124
+ # @display bg_color #f5f5f5
125
+ def extra_small_size
126
+ render BetterUi::CardComponent.new(size: :xs) do |card|
127
+ card.with_header { "XS Card" }
128
+ card.with_body { "Extra small card with compact padding." }
129
+ end
130
+ end
131
+
132
+ # @label Small Size
133
+ # @display bg_color #f5f5f5
134
+ def small_size
135
+ render BetterUi::CardComponent.new(size: :sm) do |card|
136
+ card.with_header { "Small Card" }
137
+ card.with_body { "Small card with reduced padding." }
138
+ end
139
+ end
140
+
141
+ # @label Large Size
142
+ # @display bg_color #f5f5f5
143
+ def large_size
144
+ render BetterUi::CardComponent.new(size: :lg) do |card|
145
+ card.with_header { "Large Card" }
146
+ card.with_body { "Large card with generous padding." }
147
+ end
148
+ end
149
+
150
+ # @label Extra Large Size
151
+ # @display bg_color #f5f5f5
152
+ def extra_large_size
153
+ render BetterUi::CardComponent.new(size: :xl) do |card|
154
+ card.with_header { "XL Card" }
155
+ card.with_body { "Extra large card with maximum padding." }
156
+ end
157
+ end
158
+
159
+ # @label All Variants
160
+ # @display bg_color #f5f5f5
161
+ def all_variants
162
+ render_with_template
163
+ end
164
+
165
+ # @label All Styles
166
+ # @display bg_color #f5f5f5
167
+ def all_styles
168
+ render_with_template
169
+ end
170
+
171
+ # @label All Sizes
172
+ # @display bg_color #f5f5f5
173
+ def all_sizes
174
+ render_with_template
175
+ end
176
+
177
+ # @label Full-Width Image
178
+ # @display bg_color #f5f5f5
179
+ def full_width_image
180
+ render BetterUi::CardComponent.new(body_padding: false) do |card|
181
+ card.with_header { "Photo Gallery" }
182
+ card.with_body do
183
+ "<div class='bg-gradient-to-r from-blue-500 to-purple-600 h-48 flex items-center justify-center text-white font-bold'>Full-Width Image Placeholder</div>".html_safe
184
+ end
185
+ card.with_footer { "Image caption or actions" }
186
+ end
187
+ end
188
+
189
+ # @label Table Container
190
+ # @display bg_color #f5f5f5
191
+ def table_container
192
+ render BetterUi::CardComponent.new(body_padding: false, style: :bordered) do |card|
193
+ card.with_header { "Data Table" }
194
+ card.with_body do
195
+ "<table class='w-full'><thead class='bg-gray-50'><tr><th class='px-6 py-3 text-left'>Name</th><th class='px-6 py-3 text-left'>Status</th></tr></thead><tbody><tr class='border-t'><td class='px-6 py-4'>Item 1</td><td class='px-6 py-4'>Active</td></tr><tr class='border-t'><td class='px-6 py-4'>Item 2</td><td class='px-6 py-4'>Pending</td></tr></tbody></table>".html_safe
196
+ end
197
+ end
198
+ end
199
+
200
+ # @label No Padding
201
+ # @display bg_color #f5f5f5
202
+ def no_padding
203
+ render BetterUi::CardComponent.new(
204
+ header_padding: false,
205
+ body_padding: false,
206
+ footer_padding: false
207
+ ) do |card|
208
+ card.with_header do
209
+ "<div class='bg-blue-100 p-4 font-bold'>Custom Padded Header</div>".html_safe
210
+ end
211
+ card.with_body do
212
+ "<div class='bg-white p-8'>Content with custom padding</div>".html_safe
213
+ end
214
+ card.with_footer do
215
+ "<div class='bg-gray-100 p-4'>Custom Padded Footer</div>".html_safe
216
+ end
217
+ end
218
+ end
219
+
220
+ # @label Selective Padding
221
+ # @display bg_color #f5f5f5
222
+ def selective_padding
223
+ render BetterUi::CardComponent.new(
224
+ variant: :info,
225
+ header_padding: true,
226
+ body_padding: false,
227
+ footer_padding: true
228
+ ) do |card|
229
+ card.with_header { "Normal Header (with padding)" }
230
+ card.with_body do
231
+ "<div class='bg-gradient-to-b from-blue-50 to-white p-8'>Body with custom padding - the card body_padding is false, allowing custom spacing</div>".html_safe
232
+ end
233
+ card.with_footer { "Normal Footer (with padding)" }
234
+ end
235
+ end
236
+
237
+ # @label Playground
238
+ # @param variant select { choices: [primary, secondary, accent, success, danger, warning, info, light, dark] }
239
+ # @param style select { choices: [solid, outline, ghost, soft, bordered] }
240
+ # @param size select { choices: [xs, sm, md, lg, xl] }
241
+ # @param shadow toggle
242
+ # @param header_padding toggle
243
+ # @param body_padding toggle
244
+ # @param footer_padding toggle
245
+ # @param with_header toggle
246
+ # @param with_footer toggle
247
+ def playground(variant: :primary, style: :solid, size: :md, shadow: true, header_padding: true, body_padding: true, footer_padding: true, with_header: true, with_footer: false)
248
+ render BetterUi::CardComponent.new(
249
+ variant: variant.to_sym,
250
+ style: style.to_sym,
251
+ size: size.to_sym,
252
+ shadow: shadow,
253
+ header_padding: header_padding,
254
+ body_padding: body_padding,
255
+ footer_padding: footer_padding
256
+ ) do |card|
257
+ if with_header
258
+ card.with_header { "Playground Card Header" }
259
+ end
260
+
261
+ card.with_body { "This is an interactive card playground. Adjust the parameters to see how the card changes." }
262
+
263
+ if with_footer
264
+ card.with_footer { "Card Footer" }
265
+ end
266
+ end
267
+ end
268
+ end
269
+ end
@@ -0,0 +1,13 @@
1
+ <div class="space-y-6 p-4">
2
+ <% [:sm, :md, :lg, :xl, :full].each do |size| %>
3
+ <div>
4
+ <p class="text-sm font-medium text-gray-500 mb-2">Size: <code><%= size %></code></p>
5
+ <%= render BetterUi::ContainerComponent.new(size: size, container_classes: "bg-blue-50 border border-blue-200 rounded-lg") do %>
6
+ <div class="bg-white p-4 rounded shadow-sm text-center">
7
+ Container with <strong><%= size %></strong> max-width
8
+ (<%= size == :full ? "max-w-full" : "max-w-screen-#{size}" %>)
9
+ </div>
10
+ <% end %>
11
+ </div>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ # @label Container
5
+ class ContainerComponentPreview < ViewComponent::Preview
6
+ # @label Default
7
+ # @display bg_color #f5f5f5
8
+ def default
9
+ render BetterUi::ContainerComponent.new do
10
+ "<div class='bg-white p-6 rounded-lg shadow-sm'>This is a default container with lg max-width, horizontal padding, and centered alignment.</div>".html_safe
11
+ end
12
+ end
13
+
14
+ # @label All Sizes
15
+ # @display bg_color #f5f5f5
16
+ def all_sizes
17
+ render_with_template
18
+ end
19
+
20
+ # @label Without Padding
21
+ # @display bg_color #f5f5f5
22
+ def without_padding
23
+ render BetterUi::ContainerComponent.new(padding: false) do
24
+ "<div class='bg-white p-6 shadow-sm'>This container has no horizontal padding. Content goes edge-to-edge within the max-width constraint.</div>".html_safe
25
+ end
26
+ end
27
+
28
+ # @label Without Centering
29
+ # @display bg_color #f5f5f5
30
+ def without_centering
31
+ render BetterUi::ContainerComponent.new(centered: false) do
32
+ "<div class='bg-white p-6 rounded-lg shadow-sm'>This container is not centered. It aligns to the left by default.</div>".html_safe
33
+ end
34
+ end
35
+
36
+ # @label Full Width
37
+ # @display bg_color #f5f5f5
38
+ def full_width
39
+ render BetterUi::ContainerComponent.new(size: :full) do
40
+ "<div class='bg-white p-6 rounded-lg shadow-sm'>This container uses full width with no max-width constraint (other than max-w-full).</div>".html_safe
41
+ end
42
+ end
43
+
44
+ # @label Playground
45
+ # @param size select { choices: [sm, md, lg, xl, full] }
46
+ # @param padding toggle
47
+ # @param centered toggle
48
+ def playground(size: :lg, padding: true, centered: true)
49
+ render BetterUi::ContainerComponent.new(
50
+ size: size.to_sym,
51
+ padding: padding,
52
+ centered: centered,
53
+ container_classes: "bg-blue-50 border border-blue-200 rounded-lg"
54
+ ) do
55
+ "<div class='bg-white p-6 rounded shadow-sm'>Interactive container playground. Adjust the parameters to see how the container changes. Current size: <strong>#{size}</strong>, padding: <strong>#{padding}</strong>, centered: <strong>#{centered}</strong>.</div>".html_safe
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,17 @@
1
+ <div class="p-4 space-y-4">
2
+ <h3 class="text-lg font-semibold mb-4">All Variants</h3>
3
+
4
+ <div class="flex flex-wrap gap-3">
5
+ <% BetterUi::ApplicationComponent::VARIANTS.each do |variant, _| %>
6
+ <%= render BetterUi::Dialog::AlertComponent.new(
7
+ variant: variant,
8
+ title: variant.to_s.capitalize,
9
+ text: "This is a #{variant} alert dialog."
10
+ ) do |a| %>
11
+ <% a.with_trigger do %>
12
+ <%= render(BetterUi::ButtonComponent.new(variant: variant, style: :outline)) do %><%= variant.to_s.capitalize %><% end %>
13
+ <% end %>
14
+ <% end %>
15
+ <% end %>
16
+ </div>
17
+ </div>
@@ -0,0 +1,14 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Custom Button Label</h3>
3
+
4
+ <%= render BetterUi::Dialog::AlertComponent.new(
5
+ variant: :success,
6
+ title: "Saved Successfully!",
7
+ text: "Your changes have been saved.",
8
+ button_label: "Got it!"
9
+ ) do |a| %>
10
+ <% a.with_trigger do %>
11
+ <%= render(BetterUi::ButtonComponent.new(variant: :success)) do %>Show Success Alert<% end %>
12
+ <% end %>
13
+ <% end %>
14
+ </div>
@@ -0,0 +1,13 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Default Alert (Info)</h3>
3
+
4
+ <%= render BetterUi::Dialog::AlertComponent.new(
5
+ variant: :info,
6
+ title: "Information",
7
+ text: "This is an informational alert. Click OK to dismiss."
8
+ ) do |a| %>
9
+ <% a.with_trigger do %>
10
+ <%= render(BetterUi::ButtonComponent.new(variant: :info)) do %>Show Info Alert<% end %>
11
+ <% end %>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,16 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Playground</h3>
3
+
4
+ <%= render BetterUi::Dialog::AlertComponent.new(
5
+ variant: @variant,
6
+ title: @title,
7
+ text: @text,
8
+ icon: @icon,
9
+ button_label: @button_label,
10
+ size: @size
11
+ ) do |a| %>
12
+ <% a.with_trigger do %>
13
+ <%= render(BetterUi::ButtonComponent.new(variant: @variant.presence || :info)) do %>Show Alert<% end %>
14
+ <% end %>
15
+ <% end %>
16
+ </div>
@@ -0,0 +1,14 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Without Icon</h3>
3
+
4
+ <%= render BetterUi::Dialog::AlertComponent.new(
5
+ variant: :warning,
6
+ title: "Warning",
7
+ text: "This alert has no icon displayed.",
8
+ icon: false
9
+ ) do |a| %>
10
+ <% a.with_trigger do %>
11
+ <%= render(BetterUi::ButtonComponent.new(variant: :warning)) do %>Show Alert (No Icon)<% end %>
12
+ <% end %>
13
+ <% end %>
14
+ </div>
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Dialog
5
+ # @label Dialog Alert
6
+ class AlertComponentPreview < ViewComponent::Preview
7
+ # @label Default (Info)
8
+ # @display max_height 600px
9
+ def default
10
+ render_with_template
11
+ end
12
+
13
+ # @label All Variants
14
+ # @display max_height 800px
15
+ def all_variants
16
+ render_with_template
17
+ end
18
+
19
+ # @label Without Icon
20
+ # @display max_height 600px
21
+ def without_icon
22
+ render_with_template
23
+ end
24
+
25
+ # @label Custom Button Label
26
+ # @display max_height 600px
27
+ def custom_button_label
28
+ render_with_template
29
+ end
30
+
31
+ # @label Playground
32
+ # @display max_height 600px
33
+ # @param variant select { choices: [primary, secondary, accent, success, danger, warning, info, light, dark] }
34
+ # @param title text
35
+ # @param text text
36
+ # @param icon toggle
37
+ # @param button_label text
38
+ # @param size select { choices: [sm, md, lg] }
39
+ def playground(
40
+ variant: :info,
41
+ title: "Alert Title",
42
+ text: "This is the alert message.",
43
+ icon: true,
44
+ button_label: "OK",
45
+ size: :sm
46
+ )
47
+ @variant = variant.presence&.to_sym || :info
48
+ @title = title
49
+ @text = text
50
+ @icon = icon
51
+ @button_label = button_label
52
+ @size = size.presence&.to_sym || :sm
53
+ render_with_template
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,17 @@
1
+ <div class="p-4 space-y-4">
2
+ <h3 class="text-lg font-semibold mb-4">All Variants</h3>
3
+
4
+ <div class="flex flex-wrap gap-3">
5
+ <% BetterUi::ApplicationComponent::VARIANTS.each do |variant, _| %>
6
+ <%= render BetterUi::Dialog::ConfirmComponent.new(
7
+ variant: variant,
8
+ title: "#{variant.to_s.capitalize} Confirm",
9
+ text: "This is a #{variant} confirmation dialog."
10
+ ) do |c| %>
11
+ <% c.with_trigger do %>
12
+ <%= render(BetterUi::ButtonComponent.new(variant: variant, style: :outline)) do %><%= variant.to_s.capitalize %><% end %>
13
+ <% end %>
14
+ <% end %>
15
+ <% end %>
16
+ </div>
17
+ </div>
@@ -0,0 +1,15 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Custom Labels</h3>
3
+
4
+ <%= render BetterUi::Dialog::ConfirmComponent.new(
5
+ variant: :primary,
6
+ title: "Publish Article?",
7
+ text: "This will make the article visible to all users.",
8
+ confirm_label: "Publish Now",
9
+ cancel_label: "Save as Draft"
10
+ ) do |c| %>
11
+ <% c.with_trigger do %>
12
+ <%= render(BetterUi::ButtonComponent.new(variant: :primary)) do %>Publish<% end %>
13
+ <% end %>
14
+ <% end %>
15
+ </div>
@@ -0,0 +1,15 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Danger Confirm (Delete)</h3>
3
+
4
+ <%= render BetterUi::Dialog::ConfirmComponent.new(
5
+ variant: :danger,
6
+ title: "Delete Item?",
7
+ text: "This action cannot be undone. This will permanently delete the item and all associated data.",
8
+ confirm_label: "Yes, delete it",
9
+ cancel_label: "No, keep it"
10
+ ) do |c| %>
11
+ <% c.with_trigger do %>
12
+ <%= render(BetterUi::ButtonComponent.new(variant: :danger)) do %>Delete Item<% end %>
13
+ <% end %>
14
+ <% end %>
15
+ </div>
@@ -0,0 +1,13 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Default Confirm (Warning)</h3>
3
+
4
+ <%= render BetterUi::Dialog::ConfirmComponent.new(
5
+ variant: :warning,
6
+ title: "Confirm Action",
7
+ text: "Are you sure you want to proceed with this action?"
8
+ ) do |c| %>
9
+ <% c.with_trigger do %>
10
+ <%= render(BetterUi::ButtonComponent.new(variant: :warning)) do %>Show Confirm<% end %>
11
+ <% end %>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,17 @@
1
+ <div class="p-4">
2
+ <h3 class="text-lg font-semibold mb-4">Playground</h3>
3
+
4
+ <%= render BetterUi::Dialog::ConfirmComponent.new(
5
+ variant: @variant,
6
+ title: @title,
7
+ text: @text,
8
+ icon: @icon,
9
+ confirm_label: @confirm_label,
10
+ cancel_label: @cancel_label,
11
+ size: @size
12
+ ) do |c| %>
13
+ <% c.with_trigger do %>
14
+ <%= render(BetterUi::ButtonComponent.new(variant: @variant.presence || :warning)) do %>Open Confirm<% end %>
15
+ <% end %>
16
+ <% end %>
17
+ </div>
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Dialog
5
+ # @label Dialog Confirm
6
+ class ConfirmComponentPreview < ViewComponent::Preview
7
+ # @label Default (Warning)
8
+ # @display max_height 600px
9
+ def default
10
+ render_with_template
11
+ end
12
+
13
+ # @label All Variants
14
+ # @display max_height 800px
15
+ def all_variants
16
+ render_with_template
17
+ end
18
+
19
+ # @label Danger Confirm
20
+ # @display max_height 600px
21
+ def danger_confirm
22
+ render_with_template
23
+ end
24
+
25
+ # @label Custom Labels
26
+ # @display max_height 600px
27
+ def custom_labels
28
+ render_with_template
29
+ end
30
+
31
+ # @label Playground
32
+ # @display max_height 600px
33
+ # @param variant select { choices: [primary, secondary, accent, success, danger, warning, info, light, dark] }
34
+ # @param title text
35
+ # @param text text
36
+ # @param icon toggle
37
+ # @param confirm_label text
38
+ # @param cancel_label text
39
+ # @param size select { choices: [sm, md, lg] }
40
+ def playground(
41
+ variant: :warning,
42
+ title: "Confirm Action",
43
+ text: "Are you sure you want to proceed?",
44
+ icon: true,
45
+ confirm_label: "Confirm",
46
+ cancel_label: "Cancel",
47
+ size: :sm
48
+ )
49
+ @variant = variant.presence&.to_sym || :warning
50
+ @title = title
51
+ @text = text
52
+ @icon = icon
53
+ @confirm_label = confirm_label
54
+ @cancel_label = cancel_label
55
+ @size = size.presence&.to_sym || :sm
56
+ render_with_template
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,32 @@
1
+ <div class="p-4 space-y-4">
2
+ <h3 class="text-lg font-semibold mb-4">All Sizes</h3>
3
+
4
+ <div class="flex flex-wrap gap-3">
5
+ <% %i[sm md lg xl xxl full].each do |size| %>
6
+ <%= render BetterUi::Dialog::DialogComponent.new(size: size) do |d| %>
7
+ <% d.with_trigger do %>
8
+ <%= render(BetterUi::ButtonComponent.new(variant: :primary, style: :outline)) do %><%= size.to_s.upcase %><% end %>
9
+ <% end %>
10
+
11
+ <%= render BetterUi::CardComponent.new(style: :bordered, shadow: true, size: :md) do |card| %>
12
+ <% card.with_header do %>
13
+ <h3 class="text-lg font-semibold text-grayscale-900">Size: <%= size.to_s.upcase %></h3>
14
+ <% end %>
15
+
16
+ <% card.with_body do %>
17
+ <p class="text-grayscale-600">This dialog uses the <code class="bg-grayscale-100 px-1 rounded"><%= size %></code> size option.</p>
18
+ <% end %>
19
+
20
+ <% card.with_footer do %>
21
+ <div class="flex justify-end">
22
+ <%= render(BetterUi::ButtonComponent.new(
23
+ variant: :primary,
24
+ data: { action: "click->better-ui--dialog--dialog#close" }
25
+ )) do %>Close<% end %>
26
+ </div>
27
+ <% end %>
28
+ <% end %>
29
+ <% end %>
30
+ <% end %>
31
+ </div>
32
+ </div>