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,64 @@
1
+ <div class="space-y-6 max-w-md">
2
+ <% countries = [["Italy", "it"], ["France", "fr"], ["Germany", "de"], ["Spain", "es"]] %>
3
+
4
+ <%= render BetterUi::Forms::SelectComponent.new(
5
+ name: "normal",
6
+ collection: countries,
7
+ label: "Normal",
8
+ placeholder: "Select a country..."
9
+ ) %>
10
+
11
+ <%= render BetterUi::Forms::SelectComponent.new(
12
+ name: "with_value",
13
+ collection: countries,
14
+ label: "With Value",
15
+ value: "fr"
16
+ ) %>
17
+
18
+ <%= render BetterUi::Forms::SelectComponent.new(
19
+ name: "required",
20
+ collection: countries,
21
+ label: "Required",
22
+ required: true,
23
+ placeholder: "Select a country..."
24
+ ) %>
25
+
26
+ <%= render BetterUi::Forms::SelectComponent.new(
27
+ name: "disabled",
28
+ collection: countries,
29
+ label: "Disabled",
30
+ value: "it",
31
+ disabled: true
32
+ ) %>
33
+
34
+ <%= render BetterUi::Forms::SelectComponent.new(
35
+ name: "readonly",
36
+ collection: countries,
37
+ label: "Readonly",
38
+ value: "de",
39
+ readonly: true
40
+ ) %>
41
+
42
+ <%= render BetterUi::Forms::SelectComponent.new(
43
+ name: "with_errors",
44
+ collection: countries,
45
+ label: "With Errors",
46
+ errors: ["Country can't be blank", "Country is not included in the list"]
47
+ ) %>
48
+
49
+ <%= render BetterUi::Forms::SelectComponent.new(
50
+ name: "clearable",
51
+ collection: countries,
52
+ label: "Clearable",
53
+ value: "es",
54
+ clearable: true
55
+ ) %>
56
+
57
+ <%= render BetterUi::Forms::SelectComponent.new(
58
+ name: "with_hint",
59
+ collection: countries,
60
+ label: "With Hint",
61
+ hint: "Select the country you currently reside in.",
62
+ placeholder: "Select a country..."
63
+ ) %>
64
+ </div>
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Forms
5
+ # @label Select
6
+ class SelectComponentPreview < ViewComponent::Preview
7
+ COUNTRIES = [
8
+ [ "Italy", "it" ],
9
+ [ "France", "fr" ],
10
+ [ "Germany", "de" ],
11
+ [ "Spain", "es" ],
12
+ [ "United Kingdom", "uk" ],
13
+ [ "United States", "us" ]
14
+ ].freeze
15
+
16
+ # @label Default
17
+ # @display bg_color #f5f5f5
18
+ def default
19
+ render BetterUi::Forms::SelectComponent.new(
20
+ name: "country",
21
+ collection: COUNTRIES,
22
+ label: "Country",
23
+ placeholder: "Select a country"
24
+ )
25
+ end
26
+
27
+ # @label With Value
28
+ # @display bg_color #f5f5f5
29
+ def with_value
30
+ render BetterUi::Forms::SelectComponent.new(
31
+ name: "country",
32
+ collection: COUNTRIES,
33
+ label: "Country",
34
+ value: "fr"
35
+ )
36
+ end
37
+
38
+ # @label With Hint
39
+ # @display bg_color #f5f5f5
40
+ def with_hint
41
+ render BetterUi::Forms::SelectComponent.new(
42
+ name: "country",
43
+ collection: COUNTRIES,
44
+ label: "Country",
45
+ hint: "Select the country you currently reside in.",
46
+ placeholder: "Select a country"
47
+ )
48
+ end
49
+
50
+ # @label With Errors
51
+ # @display bg_color #f5f5f5
52
+ def with_errors
53
+ render BetterUi::Forms::SelectComponent.new(
54
+ name: "country",
55
+ collection: COUNTRIES,
56
+ label: "Country",
57
+ errors: [
58
+ "Country can't be blank",
59
+ "Country is not included in the list"
60
+ ]
61
+ )
62
+ end
63
+
64
+ # @label Required
65
+ # @display bg_color #f5f5f5
66
+ def required
67
+ render BetterUi::Forms::SelectComponent.new(
68
+ name: "country",
69
+ collection: COUNTRIES,
70
+ label: "Country",
71
+ required: true,
72
+ placeholder: "Select a country"
73
+ )
74
+ end
75
+
76
+ # @label Disabled
77
+ # @display bg_color #f5f5f5
78
+ def disabled
79
+ render BetterUi::Forms::SelectComponent.new(
80
+ name: "country",
81
+ collection: COUNTRIES,
82
+ label: "Country",
83
+ value: "it",
84
+ disabled: true
85
+ )
86
+ end
87
+
88
+ # @label Readonly
89
+ # @display bg_color #f5f5f5
90
+ def readonly
91
+ render BetterUi::Forms::SelectComponent.new(
92
+ name: "country",
93
+ collection: COUNTRIES,
94
+ label: "Country",
95
+ value: "de",
96
+ readonly: true
97
+ )
98
+ end
99
+
100
+ # @label Clearable
101
+ # @display bg_color #f5f5f5
102
+ def clearable
103
+ render BetterUi::Forms::SelectComponent.new(
104
+ name: "country",
105
+ collection: COUNTRIES,
106
+ label: "Country",
107
+ value: "es",
108
+ clearable: true
109
+ )
110
+ end
111
+
112
+ # @label With Prefix Icon
113
+ # @display bg_color #f5f5f5
114
+ def with_prefix_icon
115
+ render BetterUi::Forms::SelectComponent.new(
116
+ name: "country",
117
+ collection: COUNTRIES,
118
+ label: "Country",
119
+ placeholder: "Select a country"
120
+ ) do |component|
121
+ component.with_prefix_icon do
122
+ '<svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
123
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
124
+ </svg>'.html_safe
125
+ end
126
+ end
127
+ end
128
+
129
+ # @label All Sizes
130
+ # @display bg_color #f5f5f5
131
+ def all_sizes
132
+ render_with_template
133
+ end
134
+
135
+ # @label All States
136
+ # @display bg_color #f5f5f5
137
+ def all_states
138
+ render_with_template
139
+ end
140
+
141
+ # @label Playground
142
+ # @param size select { choices: [xs, sm, md, lg, xl] }
143
+ # @param disabled toggle
144
+ # @param readonly toggle
145
+ # @param required toggle
146
+ # @param clearable toggle
147
+ # @param with_hint toggle
148
+ # @param with_error toggle
149
+ def playground(size: :md, disabled: false, readonly: false, required: false, clearable: false, with_hint: false, with_error: false)
150
+ render BetterUi::Forms::SelectComponent.new(
151
+ name: "playground",
152
+ collection: COUNTRIES,
153
+ label: "Playground Select",
154
+ placeholder: "Select an option...",
155
+ value: "it",
156
+ size: size.to_sym,
157
+ disabled: disabled,
158
+ readonly: readonly,
159
+ required: required,
160
+ clearable: clearable,
161
+ hint: with_hint ? "This is a helpful hint" : nil,
162
+ errors: with_error ? [ "This field has an error" ] : nil
163
+ )
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,12 @@
1
+ <div class="space-y-4 p-4">
2
+ <% BetterUi::Forms::BaseComponent::SIZES.each do |size| %>
3
+ <div>
4
+ <%= render BetterUi::Forms::TextInputComponent.new(
5
+ name: "example_#{size}",
6
+ label: "Size: #{size}",
7
+ placeholder: "#{size.to_s.upcase} input",
8
+ size: size
9
+ ) %>
10
+ </div>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="space-y-4 p-4">
2
+ <% BetterUi::Forms::TextInputComponent::TYPES.each do |type| %>
3
+ <div>
4
+ <%= render BetterUi::Forms::TextInputComponent.new(
5
+ name: "example_#{type}",
6
+ type: type,
7
+ label: "Type: #{type}",
8
+ placeholder: "#{type} input"
9
+ ) %>
10
+ </div>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,33 @@
1
+ <div class="p-4 max-w-2xl">
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
+ <%= f.ui_text_input :email,
7
+ label: "Email Address",
8
+ hint: "We'll never share your email",
9
+ placeholder: "you@example.com",
10
+ required: true,
11
+ size: :md
12
+ %>
13
+
14
+ <%= f.ui_text_input :username,
15
+ label: "Username",
16
+ placeholder: "Choose a username",
17
+ required: true
18
+ %>
19
+
20
+ <%= f.ui_text_input :website,
21
+ label: "Website",
22
+ placeholder: "example.com",
23
+ size: :lg
24
+ %>
25
+
26
+ <div class="pt-2">
27
+ <%= render BetterUi::ButtonComponent.new(variant: :primary, type: :submit) do %>
28
+ Submit
29
+ <% end %>
30
+ </div>
31
+ </div>
32
+ <% end %>
33
+ </div>
@@ -0,0 +1,247 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Forms
5
+ # @label Text Input
6
+ class TextInputComponentPreview < ViewComponent::Preview
7
+ # @label Default
8
+ # @display bg_color #f5f5f5
9
+ def default
10
+ render BetterUi::Forms::TextInputComponent.new(
11
+ name: "example",
12
+ label: "Example Field",
13
+ placeholder: "Enter text here"
14
+ )
15
+ end
16
+
17
+ # @label With Value
18
+ # @display bg_color #f5f5f5
19
+ def with_value
20
+ render BetterUi::Forms::TextInputComponent.new(
21
+ name: "example",
22
+ label: "Name",
23
+ value: "John Doe"
24
+ )
25
+ end
26
+
27
+ # @label With Hint
28
+ # @display bg_color #f5f5f5
29
+ def with_hint
30
+ render BetterUi::Forms::TextInputComponent.new(
31
+ name: "email",
32
+ label: "Email Address",
33
+ hint: "We'll never share your email with anyone else.",
34
+ placeholder: "you@example.com"
35
+ )
36
+ end
37
+
38
+ # @label With Errors
39
+ # @display bg_color #f5f5f5
40
+ def with_errors
41
+ render BetterUi::Forms::TextInputComponent.new(
42
+ name: "email",
43
+ label: "Email Address",
44
+ value: "invalid-email",
45
+ errors: [
46
+ "Email can't be blank",
47
+ "Email is invalid"
48
+ ]
49
+ )
50
+ end
51
+
52
+ # @label Required Field
53
+ # @display bg_color #f5f5f5
54
+ def required
55
+ render BetterUi::Forms::TextInputComponent.new(
56
+ name: "username",
57
+ label: "Username",
58
+ required: true,
59
+ placeholder: "Enter your username"
60
+ )
61
+ end
62
+
63
+ # @label Disabled State
64
+ # @display bg_color #f5f5f5
65
+ def disabled
66
+ render BetterUi::Forms::TextInputComponent.new(
67
+ name: "disabled_field",
68
+ label: "Disabled Field",
69
+ value: "Cannot edit this",
70
+ disabled: true
71
+ )
72
+ end
73
+
74
+ # @label Readonly State
75
+ # @display bg_color #f5f5f5
76
+ def readonly
77
+ render BetterUi::Forms::TextInputComponent.new(
78
+ name: "readonly_field",
79
+ label: "Readonly Field",
80
+ value: "View only",
81
+ readonly: true
82
+ )
83
+ end
84
+
85
+ # @label With Prefix Icon
86
+ # @display bg_color #f5f5f5
87
+ def with_prefix_icon
88
+ render BetterUi::Forms::TextInputComponent.new(
89
+ name: "search",
90
+ label: "Search",
91
+ placeholder: "Search..."
92
+ ) do |component|
93
+ component.with_prefix_icon do
94
+ '<svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
95
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
96
+ </svg>'.html_safe
97
+ end
98
+ end
99
+ end
100
+
101
+ # @label With Suffix Icon
102
+ # @display bg_color #f5f5f5
103
+ def with_suffix_icon
104
+ render BetterUi::Forms::TextInputComponent.new(
105
+ name: "verified_email",
106
+ label: "Verified Email",
107
+ value: "user@example.com"
108
+ ) do |component|
109
+ component.with_suffix_icon do
110
+ '<svg class="h-5 w-5 text-success-600" fill="currentColor" viewBox="0 0 20 20">
111
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
112
+ </svg>'.html_safe
113
+ end
114
+ end
115
+ end
116
+
117
+ # @label With Both Icons
118
+ # @display bg_color #f5f5f5
119
+ def with_both_icons
120
+ render BetterUi::Forms::TextInputComponent.new(
121
+ name: "website",
122
+ label: "Website URL",
123
+ placeholder: "example.com"
124
+ ) do |component|
125
+ component.with_prefix_icon do
126
+ '<span class="text-gray-500 text-sm">https://</span>'.html_safe
127
+ end
128
+ component.with_suffix_icon do
129
+ '<svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
130
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
131
+ </svg>'.html_safe
132
+ end
133
+ end
134
+ end
135
+
136
+ # @label All Input Types
137
+ # @display bg_color #f5f5f5
138
+ def all_types
139
+ render_with_template
140
+ end
141
+
142
+ # @label Email Type
143
+ # @display bg_color #f5f5f5
144
+ def email_type
145
+ render BetterUi::Forms::TextInputComponent.new(
146
+ name: "email",
147
+ type: :email,
148
+ label: "Email Address",
149
+ placeholder: "you@example.com",
150
+ hint: "We'll never share your email with anyone else."
151
+ ) do |component|
152
+ component.with_prefix_icon do
153
+ '<svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
154
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
155
+ </svg>'.html_safe
156
+ end
157
+ end
158
+ end
159
+
160
+ # @label Telephone Type
161
+ # @display bg_color #f5f5f5
162
+ def tel_type
163
+ render BetterUi::Forms::TextInputComponent.new(
164
+ name: "phone",
165
+ type: :tel,
166
+ label: "Phone Number",
167
+ placeholder: "+1 (555) 000-0000"
168
+ ) do |component|
169
+ component.with_prefix_icon do
170
+ '<svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
171
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/>
172
+ </svg>'.html_safe
173
+ end
174
+ end
175
+ end
176
+
177
+ # @label Date Type
178
+ # @display bg_color #f5f5f5
179
+ def date_type
180
+ render BetterUi::Forms::TextInputComponent.new(
181
+ name: "birthday",
182
+ type: :date,
183
+ label: "Date of Birth",
184
+ hint: "Select your date of birth"
185
+ ) do |component|
186
+ component.with_prefix_icon do
187
+ '<svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
188
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
189
+ </svg>'.html_safe
190
+ end
191
+ end
192
+ end
193
+
194
+ # @label Time Type
195
+ # @display bg_color #f5f5f5
196
+ def time_type
197
+ render BetterUi::Forms::TextInputComponent.new(
198
+ name: "start_time",
199
+ type: :time,
200
+ label: "Start Time",
201
+ hint: "Select a time"
202
+ ) do |component|
203
+ component.with_prefix_icon do
204
+ '<svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
205
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
206
+ </svg>'.html_safe
207
+ end
208
+ end
209
+ end
210
+
211
+ # @label All Sizes
212
+ # @display bg_color #f5f5f5
213
+ def all_sizes
214
+ render_with_template
215
+ end
216
+
217
+ # @label Form Integration
218
+ # @display bg_color #f5f5f5
219
+ def form_integration
220
+ render_with_template
221
+ end
222
+
223
+ # @label Playground
224
+ # @param type select { choices: [text, email, tel, date, time] }
225
+ # @param size select { choices: [xs, sm, md, lg, xl] }
226
+ # @param disabled toggle
227
+ # @param readonly toggle
228
+ # @param required toggle
229
+ # @param with_hint toggle
230
+ # @param with_error toggle
231
+ def playground(type: :text, size: :md, disabled: false, readonly: false, required: false, with_hint: false, with_error: false)
232
+ render BetterUi::Forms::TextInputComponent.new(
233
+ name: "playground",
234
+ type: type.to_sym,
235
+ label: "Playground Input",
236
+ placeholder: "Type something...",
237
+ size: size.to_sym,
238
+ disabled: disabled,
239
+ readonly: readonly,
240
+ required: required,
241
+ hint: with_hint ? "This is a helpful hint" : nil,
242
+ errors: with_error ? [ "This field has an error" ] : nil
243
+ )
244
+ end
245
+ end
246
+ end
247
+ end
@@ -0,0 +1,13 @@
1
+ <div class="space-y-4 p-4">
2
+ <% [ :none, :vertical, :horizontal, :both ].each do |resize_type| %>
3
+ <div>
4
+ <%= render BetterUi::Forms::TextareaComponent.new(
5
+ name: "resize_#{resize_type}",
6
+ label: "Resize: #{resize_type}",
7
+ placeholder: "This textarea has resize: #{resize_type}",
8
+ resize: resize_type,
9
+ hint: resize_type == :none ? "Cannot be resized" : "Try resizing this textarea"
10
+ ) %>
11
+ </div>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="space-y-4 p-4">
2
+ <% BetterUi::Forms::BaseComponent::SIZES.each do |size| %>
3
+ <div>
4
+ <%= render BetterUi::Forms::TextareaComponent.new(
5
+ name: "example_#{size}",
6
+ label: "Size: #{size}",
7
+ placeholder: "#{size.to_s.upcase} textarea",
8
+ size: size
9
+ ) %>
10
+ </div>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,36 @@
1
+ <div class="p-4 max-w-2xl">
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
+ <%= f.ui_textarea :description,
7
+ label: "Description",
8
+ hint: "Describe your project in detail",
9
+ placeholder: "Enter a detailed description...",
10
+ required: true,
11
+ size: :md
12
+ %>
13
+
14
+ <%= f.ui_textarea :bio,
15
+ label: "Biography",
16
+ placeholder: "Tell us about yourself...",
17
+ rows: 6,
18
+ maxlength: 500,
19
+ hint: "Maximum 500 characters"
20
+ %>
21
+
22
+ <%= f.ui_textarea :notes,
23
+ label: "Additional Notes",
24
+ placeholder: "Any additional information...",
25
+ size: :sm,
26
+ resize: :none
27
+ %>
28
+
29
+ <div class="pt-2">
30
+ <%= render BetterUi::ButtonComponent.new(variant: :primary, type: :submit) do %>
31
+ Submit
32
+ <% end %>
33
+ </div>
34
+ </div>
35
+ <% end %>
36
+ </div>