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,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Dropdown
5
+ # @label Dropdown
6
+ class DropdownComponentPreview < ViewComponent::Preview
7
+ # @label Default
8
+ def default
9
+ render_with_template
10
+ end
11
+
12
+ # @label All Sizes
13
+ def all_sizes
14
+ render_with_template
15
+ end
16
+
17
+ # @label With Icons
18
+ def with_icons
19
+ render_with_template
20
+ end
21
+
22
+ # @label With Dividers and Headers
23
+ def with_dividers_and_headers
24
+ render_with_template
25
+ end
26
+
27
+ # @label Placement Options
28
+ def placement_options
29
+ render_with_template
30
+ end
31
+
32
+ # @label Disabled Items
33
+ def disabled_items
34
+ render_with_template
35
+ end
36
+
37
+ # @label Playground
38
+ # @param size select { choices: [sm, md, lg] }
39
+ # @param placement select { choices: [bottom_start, bottom_end, top_start, top_end] }
40
+ # @param shadow select { choices: [none, sm, md, lg, xl] }
41
+ # @param auto_close toggle
42
+ # @param close_on_item_click toggle
43
+ def playground(
44
+ size: :md,
45
+ placement: :bottom_start,
46
+ shadow: :lg,
47
+ auto_close: true,
48
+ close_on_item_click: true
49
+ )
50
+ @size = size.presence&.to_sym || :md
51
+ @placement = placement.presence&.to_sym || :bottom_start
52
+ @shadow = shadow.presence&.to_sym || :lg
53
+ @auto_close = auto_close
54
+ @close_on_item_click = close_on_item_click
55
+ render_with_template
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,17 @@
1
+ <div class="p-8">
2
+ <h3 class="text-lg font-semibold mb-6">FontAwesome Icon Sizes</h3>
3
+
4
+ <div class="space-y-6">
5
+ <% (@sizes || BetterUi::FaIconComponent::SIZES.keys).each do |size| %>
6
+ <div class="flex items-center gap-4">
7
+ <span class="w-20 text-sm font-medium text-gray-600 uppercase"><%= size %></span>
8
+
9
+ <div class="flex gap-4 items-center">
10
+ <%= render BetterUi::FaIconComponent.new(name: "user", style: :solid, size: size) %>
11
+ <%= render BetterUi::FaIconComponent.new(name: "heart", style: :solid, size: size, variant: :danger) %>
12
+ <%= render BetterUi::FaIconComponent.new(name: "star", style: :solid, size: size, variant: :warning) %>
13
+ </div>
14
+ </div>
15
+ <% end %>
16
+ </div>
17
+ </div>
@@ -0,0 +1,19 @@
1
+ <div class="p-8 space-y-6">
2
+ <h3 class="text-lg font-semibold mb-4">FontAwesome Icon Styles</h3>
3
+
4
+ <div class="space-y-4">
5
+ <% (@styles || BetterUi::FaIconComponent::STYLES.keys).each do |style| %>
6
+ <div class="flex items-center gap-4">
7
+ <span class="w-24 text-sm font-medium text-gray-600 capitalize"><%= style %></span>
8
+
9
+ <div class="flex gap-4 items-center text-2xl">
10
+ <%= render BetterUi::FaIconComponent.new(name: "user", style: style) %>
11
+ <%= render BetterUi::FaIconComponent.new(name: "heart", style: style) %>
12
+ <%= render BetterUi::FaIconComponent.new(name: "star", style: style) %>
13
+ <%= render BetterUi::FaIconComponent.new(name: "bell", style: style) %>
14
+ <%= render BetterUi::FaIconComponent.new(name: "bookmark", style: style) %>
15
+ </div>
16
+ </div>
17
+ <% end %>
18
+ </div>
19
+ </div>
@@ -0,0 +1,26 @@
1
+ <div class="p-8">
2
+ <h3 class="text-lg font-semibold mb-6">FontAwesome Icon Variants</h3>
3
+
4
+ <div class="space-y-4">
5
+ <div class="flex items-center gap-4 mb-2">
6
+ <span class="w-24 text-sm font-medium text-gray-600">inherit</span>
7
+ <div class="flex gap-4 items-center text-2xl">
8
+ <%= render BetterUi::FaIconComponent.new(name: "user", style: :solid) %>
9
+ <%= render BetterUi::FaIconComponent.new(name: "heart", style: :solid) %>
10
+ <%= render BetterUi::FaIconComponent.new(name: "star", style: :solid) %>
11
+ </div>
12
+ </div>
13
+
14
+ <% (@variants || BetterUi::ApplicationComponent::VARIANTS.keys).each do |variant| %>
15
+ <div class="flex items-center gap-4">
16
+ <span class="w-24 text-sm font-medium text-gray-600 capitalize"><%= variant %></span>
17
+
18
+ <div class="flex gap-4 items-center text-2xl">
19
+ <%= render BetterUi::FaIconComponent.new(name: "user", style: :solid, variant: variant) %>
20
+ <%= render BetterUi::FaIconComponent.new(name: "heart", style: :solid, variant: variant) %>
21
+ <%= render BetterUi::FaIconComponent.new(name: "star", style: :solid, variant: variant) %>
22
+ </div>
23
+ </div>
24
+ <% end %>
25
+ </div>
26
+ </div>
@@ -0,0 +1,26 @@
1
+ <div class="p-8 space-y-8">
2
+ <h3 class="text-lg font-semibold mb-6">FontAwesome Icon Animations</h3>
3
+
4
+ <div class="space-y-6 text-2xl">
5
+ <div class="flex items-center gap-4">
6
+ <span class="w-32 text-sm font-medium text-gray-600">No animation</span>
7
+ <%= render BetterUi::FaIconComponent.new(name: "spinner", style: :solid) %>
8
+ <%= render BetterUi::FaIconComponent.new(name: "gear", style: :solid) %>
9
+ <%= render BetterUi::FaIconComponent.new(name: "circle-notch", style: :solid) %>
10
+ </div>
11
+
12
+ <div class="flex items-center gap-4">
13
+ <span class="w-32 text-sm font-medium text-gray-600">Spin</span>
14
+ <%= render BetterUi::FaIconComponent.new(name: "spinner", style: :solid, spin: true) %>
15
+ <%= render BetterUi::FaIconComponent.new(name: "gear", style: :solid, spin: true) %>
16
+ <%= render BetterUi::FaIconComponent.new(name: "circle-notch", style: :solid, spin: true) %>
17
+ </div>
18
+
19
+ <div class="flex items-center gap-4">
20
+ <span class="w-32 text-sm font-medium text-gray-600">Pulse</span>
21
+ <%= render BetterUi::FaIconComponent.new(name: "spinner", style: :solid, pulse: true) %>
22
+ <%= render BetterUi::FaIconComponent.new(name: "gear", style: :solid, pulse: true) %>
23
+ <%= render BetterUi::FaIconComponent.new(name: "circle-notch", style: :solid, pulse: true) %>
24
+ </div>
25
+ </div>
26
+ </div>
@@ -0,0 +1,88 @@
1
+ <div class="p-8 space-y-8">
2
+ <h3 class="text-lg font-semibold mb-6">FontAwesome Icon Transformations</h3>
3
+
4
+ <div class="space-y-8 text-2xl">
5
+ <%# Flip transformations %>
6
+ <div>
7
+ <h4 class="text-base font-medium mb-4 text-gray-700">Flip</h4>
8
+ <div class="space-y-4">
9
+ <div class="flex items-center gap-4">
10
+ <span class="w-32 text-sm font-medium text-gray-600">Normal</span>
11
+ <%= render BetterUi::FaIconComponent.new(name: "flag", style: :solid) %>
12
+ <%= render BetterUi::FaIconComponent.new(name: "shield", style: :solid) %>
13
+ </div>
14
+
15
+ <div class="flex items-center gap-4">
16
+ <span class="w-32 text-sm font-medium text-gray-600">Horizontal</span>
17
+ <%= render BetterUi::FaIconComponent.new(name: "flag", style: :solid, flip: :horizontal) %>
18
+ <%= render BetterUi::FaIconComponent.new(name: "shield", style: :solid, flip: :horizontal) %>
19
+ </div>
20
+
21
+ <div class="flex items-center gap-4">
22
+ <span class="w-32 text-sm font-medium text-gray-600">Vertical</span>
23
+ <%= render BetterUi::FaIconComponent.new(name: "flag", style: :solid, flip: :vertical) %>
24
+ <%= render BetterUi::FaIconComponent.new(name: "shield", style: :solid, flip: :vertical) %>
25
+ </div>
26
+
27
+ <div class="flex items-center gap-4">
28
+ <span class="w-32 text-sm font-medium text-gray-600">Both</span>
29
+ <%= render BetterUi::FaIconComponent.new(name: "flag", style: :solid, flip: :both) %>
30
+ <%= render BetterUi::FaIconComponent.new(name: "shield", style: :solid, flip: :both) %>
31
+ </div>
32
+ </div>
33
+ </div>
34
+
35
+ <%# Rotate transformations %>
36
+ <div>
37
+ <h4 class="text-base font-medium mb-4 text-gray-700">Rotate</h4>
38
+ <div class="space-y-4">
39
+ <div class="flex items-center gap-4">
40
+ <span class="w-32 text-sm font-medium text-gray-600">Normal</span>
41
+ <%= render BetterUi::FaIconComponent.new(name: "arrow-right", style: :solid) %>
42
+ <%= render BetterUi::FaIconComponent.new(name: "phone", style: :solid) %>
43
+ </div>
44
+
45
+ <div class="flex items-center gap-4">
46
+ <span class="w-32 text-sm font-medium text-gray-600">90 degrees</span>
47
+ <%= render BetterUi::FaIconComponent.new(name: "arrow-right", style: :solid, rotate: 90) %>
48
+ <%= render BetterUi::FaIconComponent.new(name: "phone", style: :solid, rotate: 90) %>
49
+ </div>
50
+
51
+ <div class="flex items-center gap-4">
52
+ <span class="w-32 text-sm font-medium text-gray-600">180 degrees</span>
53
+ <%= render BetterUi::FaIconComponent.new(name: "arrow-right", style: :solid, rotate: 180) %>
54
+ <%= render BetterUi::FaIconComponent.new(name: "phone", style: :solid, rotate: 180) %>
55
+ </div>
56
+
57
+ <div class="flex items-center gap-4">
58
+ <span class="w-32 text-sm font-medium text-gray-600">270 degrees</span>
59
+ <%= render BetterUi::FaIconComponent.new(name: "arrow-right", style: :solid, rotate: 270) %>
60
+ <%= render BetterUi::FaIconComponent.new(name: "phone", style: :solid, rotate: 270) %>
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <%# Fixed width %>
66
+ <div>
67
+ <h4 class="text-base font-medium mb-4 text-gray-700">Fixed Width</h4>
68
+ <div class="space-y-2">
69
+ <div class="flex items-center gap-1 bg-gray-100 p-2 rounded">
70
+ <%= render BetterUi::FaIconComponent.new(name: "home", style: :solid, fixed_width: true) %>
71
+ <span class="text-sm">Home</span>
72
+ </div>
73
+ <div class="flex items-center gap-1 bg-gray-100 p-2 rounded">
74
+ <%= render BetterUi::FaIconComponent.new(name: "info", style: :solid, fixed_width: true) %>
75
+ <span class="text-sm">Info</span>
76
+ </div>
77
+ <div class="flex items-center gap-1 bg-gray-100 p-2 rounded">
78
+ <%= render BetterUi::FaIconComponent.new(name: "book", style: :solid, fixed_width: true) %>
79
+ <span class="text-sm">Book</span>
80
+ </div>
81
+ <div class="flex items-center gap-1 bg-gray-100 p-2 rounded">
82
+ <%= render BetterUi::FaIconComponent.new(name: "music", style: :solid, fixed_width: true) %>
83
+ <span class="text-sm">Music</span>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ class FaIconComponentPreview < ViewComponent::Preview
5
+ # @label Default
6
+ def default
7
+ render BetterUi::FaIconComponent.new(name: "user")
8
+ end
9
+
10
+ # @label All Styles
11
+ # @display bg_color #f5f5f5
12
+ def all_styles
13
+ @styles = BetterUi::FaIconComponent::STYLES.keys
14
+ render_with_template
15
+ end
16
+
17
+ # @label All Sizes
18
+ # @display bg_color #f5f5f5
19
+ def all_sizes
20
+ @sizes = BetterUi::FaIconComponent::SIZES.keys
21
+ render_with_template
22
+ end
23
+
24
+ # @label All Variants
25
+ # @display bg_color #f5f5f5
26
+ def all_variants
27
+ @variants = BetterUi::ApplicationComponent::VARIANTS.keys
28
+ render_with_template
29
+ end
30
+
31
+ # @label Animations
32
+ # @display bg_color #f5f5f5
33
+ def animations
34
+ render_with_template
35
+ end
36
+
37
+ # @label Transformations
38
+ # @display bg_color #f5f5f5
39
+ def transformations
40
+ render_with_template
41
+ end
42
+
43
+ # @label Playground
44
+ # @param name text
45
+ # @param style select { choices: [regular, solid, light, thin, brands] }
46
+ # @param variant select { choices: [~, primary, secondary, accent, success, danger, warning, info, light, dark] }
47
+ # @param size select { choices: [xs, sm, md, lg, xl, 2xl] }
48
+ # @param spin toggle
49
+ # @param pulse toggle
50
+ # @param flip select { choices: [~, horizontal, vertical, both] }
51
+ # @param rotate select { choices: [~, 90, 180, 270] }
52
+ # @param fixed_width toggle
53
+ def playground(
54
+ name: "user",
55
+ style: :regular,
56
+ variant: nil,
57
+ size: :md,
58
+ spin: false,
59
+ pulse: false,
60
+ flip: nil,
61
+ rotate: nil,
62
+ fixed_width: false
63
+ )
64
+ spin_bool = ActiveModel::Type::Boolean.new.cast(spin)
65
+ pulse_bool = ActiveModel::Type::Boolean.new.cast(pulse)
66
+ fixed_width_bool = ActiveModel::Type::Boolean.new.cast(fixed_width)
67
+ variant_val = variant.present? && variant != "~" ? variant.to_sym : nil
68
+ flip_val = flip.present? && flip != "~" ? flip.to_sym : nil
69
+ rotate_val = rotate.present? && rotate != "~" ? rotate.to_i : nil
70
+ size_val = size.to_s == "2xl" ? :"2xl" : size.to_sym
71
+
72
+ render BetterUi::FaIconComponent.new(
73
+ name: name,
74
+ style: style,
75
+ variant: variant_val,
76
+ size: size_val,
77
+ spin: spin_bool,
78
+ pulse: pulse_bool,
79
+ flip: flip_val,
80
+ rotate: rotate_val,
81
+ fixed_width: fixed_width_bool
82
+ )
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,12 @@
1
+ <div class="space-y-4 p-4">
2
+ <% BetterUi::Forms::CheckboxComponent::SIZES.each do |size| %>
3
+ <div>
4
+ <%= render BetterUi::Forms::CheckboxComponent.new(
5
+ name: "size_#{size}",
6
+ label: "Size: #{size.to_s.upcase}",
7
+ size: size,
8
+ checked: true
9
+ ) %>
10
+ </div>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="space-y-4 p-4">
2
+ <% BetterUi::ApplicationComponent::VARIANTS.each do |variant, _| %>
3
+ <div>
4
+ <%= render BetterUi::Forms::CheckboxComponent.new(
5
+ name: "variant_#{variant}",
6
+ label: "Variant: #{variant.to_s.titleize}",
7
+ variant: variant,
8
+ checked: true
9
+ ) %>
10
+ </div>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,32 @@
1
+ <div class="p-4 max-w-md">
2
+ <h3 class="text-lg font-semibold mb-4">Form Builder Integration Example</h3>
3
+
4
+ <%= form_with url: "#", method: :post, builder: BetterUi::UiFormBuilder, data: { turbo: false } do |f| %>
5
+ <div class="space-y-4">
6
+ <%= render BetterUi::Forms::CheckboxComponent.new(
7
+ name: "user[newsletter]",
8
+ label: "Subscribe to newsletter",
9
+ hint: "Receive weekly updates about new features"
10
+ ) %>
11
+
12
+ <%= render BetterUi::Forms::CheckboxComponent.new(
13
+ name: "user[marketing]",
14
+ label: "Receive marketing emails",
15
+ variant: :secondary
16
+ ) %>
17
+
18
+ <%= render BetterUi::Forms::CheckboxComponent.new(
19
+ name: "user[terms]",
20
+ label: "I agree to the terms and conditions",
21
+ required: true,
22
+ variant: :primary
23
+ ) %>
24
+
25
+ <div class="pt-4">
26
+ <%= render BetterUi::ButtonComponent.new(type: :submit, variant: :primary) do %>
27
+ Submit
28
+ <% end %>
29
+ </div>
30
+ </div>
31
+ <% end %>
32
+ </div>
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Forms
5
+ # @label Checkbox
6
+ class CheckboxComponentPreview < ViewComponent::Preview
7
+ # @label Default
8
+ # @display bg_color #f5f5f5
9
+ def default
10
+ render BetterUi::Forms::CheckboxComponent.new(
11
+ name: "newsletter",
12
+ label: "Subscribe to newsletter"
13
+ )
14
+ end
15
+
16
+ # @label Checked
17
+ # @display bg_color #f5f5f5
18
+ def checked
19
+ render BetterUi::Forms::CheckboxComponent.new(
20
+ name: "terms",
21
+ label: "I agree to the terms and conditions",
22
+ checked: true
23
+ )
24
+ end
25
+
26
+ # @label With Hint
27
+ # @display bg_color #f5f5f5
28
+ def with_hint
29
+ render BetterUi::Forms::CheckboxComponent.new(
30
+ name: "marketing",
31
+ label: "Receive marketing emails",
32
+ hint: "We'll send you occasional updates about new features and promotions."
33
+ )
34
+ end
35
+
36
+ # @label With Errors
37
+ # @display bg_color #f5f5f5
38
+ def with_errors
39
+ render BetterUi::Forms::CheckboxComponent.new(
40
+ name: "terms",
41
+ label: "I agree to the terms and conditions",
42
+ errors: [ "You must accept the terms and conditions to continue" ]
43
+ )
44
+ end
45
+
46
+ # @label Required Field
47
+ # @display bg_color #f5f5f5
48
+ def required
49
+ render BetterUi::Forms::CheckboxComponent.new(
50
+ name: "terms",
51
+ label: "I agree to the terms and conditions",
52
+ required: true
53
+ )
54
+ end
55
+
56
+ # @label Disabled State
57
+ # @display bg_color #f5f5f5
58
+ def disabled
59
+ render BetterUi::Forms::CheckboxComponent.new(
60
+ name: "disabled_option",
61
+ label: "This option is disabled",
62
+ disabled: true,
63
+ checked: true
64
+ )
65
+ end
66
+
67
+ # @label Readonly State
68
+ # @display bg_color #f5f5f5
69
+ def readonly
70
+ render BetterUi::Forms::CheckboxComponent.new(
71
+ name: "readonly_option",
72
+ label: "This option is readonly",
73
+ readonly: true,
74
+ checked: true
75
+ )
76
+ end
77
+
78
+ # @label Label on Left
79
+ # @display bg_color #f5f5f5
80
+ def label_left
81
+ render BetterUi::Forms::CheckboxComponent.new(
82
+ name: "active",
83
+ label: "Active",
84
+ label_position: :left
85
+ )
86
+ end
87
+
88
+ # @label All Sizes
89
+ # @display bg_color #f5f5f5
90
+ def all_sizes
91
+ render_with_template
92
+ end
93
+
94
+ # @label All Variants
95
+ # @display bg_color #f5f5f5
96
+ def all_variants
97
+ render_with_template
98
+ end
99
+
100
+ # @label Form Integration
101
+ # @display bg_color #f5f5f5
102
+ def form_integration
103
+ render_with_template
104
+ end
105
+
106
+ # @label Playground
107
+ # @param variant select { choices: [primary, secondary, accent, success, danger, warning, info, light, dark] }
108
+ # @param size select { choices: [xs, sm, md, lg, xl] }
109
+ # @param label_position select { choices: [left, right] }
110
+ # @param checked toggle
111
+ # @param disabled toggle
112
+ # @param readonly toggle
113
+ # @param required toggle
114
+ # @param with_hint toggle
115
+ # @param with_error toggle
116
+ def playground(
117
+ variant: :primary,
118
+ size: :md,
119
+ label_position: :right,
120
+ checked: false,
121
+ disabled: false,
122
+ readonly: false,
123
+ required: false,
124
+ with_hint: false,
125
+ with_error: false
126
+ )
127
+ render BetterUi::Forms::CheckboxComponent.new(
128
+ name: "playground",
129
+ label: "Playground Checkbox",
130
+ variant: variant.to_sym,
131
+ size: size.to_sym,
132
+ label_position: label_position.to_sym,
133
+ checked: checked,
134
+ disabled: disabled,
135
+ readonly: readonly,
136
+ required: required,
137
+ hint: with_hint ? "This is a helpful hint" : nil,
138
+ errors: with_error ? [ "This field has an error" ] : nil
139
+ )
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,14 @@
1
+ <div class="space-y-6 p-4">
2
+ <% BetterUi::ApplicationComponent::VARIANTS.each do |variant, _| %>
3
+ <div>
4
+ <%= render BetterUi::Forms::CheckboxGroupComponent.new(
5
+ name: "variant_#{variant}",
6
+ collection: ["Option 1", "Option 2", "Option 3"],
7
+ selected: ["Option 1", "Option 2"],
8
+ variant: variant,
9
+ legend: "Variant: #{variant.to_s.titleize}",
10
+ orientation: :horizontal
11
+ ) %>
12
+ </div>
13
+ <% end %>
14
+ </div>
@@ -0,0 +1,47 @@
1
+ <div class="p-4 max-w-lg">
2
+ <h3 class="text-lg font-semibold mb-4">Form Builder Integration Example</h3>
3
+
4
+ <%= form_with url: "#", method: :post, builder: BetterUi::UiFormBuilder, data: { turbo: false } do |f| %>
5
+ <div class="space-y-6">
6
+ <%= render BetterUi::Forms::CheckboxGroupComponent.new(
7
+ name: "user[roles]",
8
+ collection: [
9
+ ["Administrator", "admin"],
10
+ ["Editor", "editor"],
11
+ ["Viewer", "viewer"]
12
+ ],
13
+ selected: ["editor"],
14
+ legend: "User Roles",
15
+ hint: "Select the roles for this user",
16
+ required: true
17
+ ) %>
18
+
19
+ <%= render BetterUi::Forms::CheckboxGroupComponent.new(
20
+ name: "user[notifications]",
21
+ collection: [
22
+ ["Email", "email"],
23
+ ["Push", "push"],
24
+ ["SMS", "sms"]
25
+ ],
26
+ legend: "Notification Preferences",
27
+ orientation: :horizontal,
28
+ variant: :secondary
29
+ ) %>
30
+
31
+ <%= render BetterUi::Forms::CheckboxGroupComponent.new(
32
+ name: "user[skills]",
33
+ collection: ["Ruby", "JavaScript", "Python", "Go", "Rust", "TypeScript"],
34
+ legend: "Programming Skills",
35
+ orientation: :horizontal,
36
+ size: :sm,
37
+ variant: :accent
38
+ ) %>
39
+
40
+ <div class="pt-4">
41
+ <%= render BetterUi::ButtonComponent.new(type: :submit, variant: :primary) do %>
42
+ Save Preferences
43
+ <% end %>
44
+ </div>
45
+ </div>
46
+ <% end %>
47
+ </div>
@@ -0,0 +1,34 @@
1
+ <div class="space-y-8 p-4">
2
+ <div>
3
+ <h4 class="text-sm font-medium text-gray-700 mb-2">Vertical Orientation (Default)</h4>
4
+ <%= render BetterUi::Forms::CheckboxGroupComponent.new(
5
+ name: "vertical_options",
6
+ collection: ["Option 1", "Option 2", "Option 3", "Option 4"],
7
+ selected: ["Option 1"],
8
+ legend: "Vertical Layout",
9
+ orientation: :vertical
10
+ ) %>
11
+ </div>
12
+
13
+ <div>
14
+ <h4 class="text-sm font-medium text-gray-700 mb-2">Horizontal Orientation</h4>
15
+ <%= render BetterUi::Forms::CheckboxGroupComponent.new(
16
+ name: "horizontal_options",
17
+ collection: ["Option 1", "Option 2", "Option 3", "Option 4"],
18
+ selected: ["Option 2", "Option 3"],
19
+ legend: "Horizontal Layout",
20
+ orientation: :horizontal
21
+ ) %>
22
+ </div>
23
+
24
+ <div>
25
+ <h4 class="text-sm font-medium text-gray-700 mb-2">Horizontal with Many Options (Wraps)</h4>
26
+ <%= render BetterUi::Forms::CheckboxGroupComponent.new(
27
+ name: "many_options",
28
+ collection: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
29
+ selected: ["Mon", "Wed", "Fri"],
30
+ legend: "Days of Week",
31
+ orientation: :horizontal
32
+ ) %>
33
+ </div>
34
+ </div>