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.
- checksums.yaml +4 -4
- data/lib/better_ui/version.rb +1 -1
- data/spec/components/previews/better_ui/action_messages_component_preview/all_styles.html.erb +17 -0
- data/spec/components/previews/better_ui/action_messages_component_preview/all_variants.html.erb +19 -0
- data/spec/components/previews/better_ui/action_messages_component_preview/auto_dismiss.html.erb +51 -0
- data/spec/components/previews/better_ui/action_messages_component_preview/dismissible.html.erb +19 -0
- data/spec/components/previews/better_ui/action_messages_component_preview/with_title.html.erb +17 -0
- data/spec/components/previews/better_ui/action_messages_component_preview.rb +224 -0
- data/spec/components/previews/better_ui/avatar_component_preview/all_shapes.html.erb +26 -0
- data/spec/components/previews/better_ui/avatar_component_preview/all_sizes.html.erb +24 -0
- data/spec/components/previews/better_ui/avatar_component_preview/all_variants.html.erb +12 -0
- data/spec/components/previews/better_ui/avatar_component_preview/with_initials.html.erb +22 -0
- data/spec/components/previews/better_ui/avatar_component_preview/with_status.html.erb +26 -0
- data/spec/components/previews/better_ui/avatar_component_preview.rb +73 -0
- data/spec/components/previews/better_ui/badge_component_preview/all_sizes.html.erb +29 -0
- data/spec/components/previews/better_ui/badge_component_preview/all_styles.html.erb +26 -0
- data/spec/components/previews/better_ui/badge_component_preview/all_variants.html.erb +14 -0
- data/spec/components/previews/better_ui/badge_component_preview/counter_badges.html.erb +39 -0
- data/spec/components/previews/better_ui/badge_component_preview/dot_badges.html.erb +28 -0
- data/spec/components/previews/better_ui/badge_component_preview.rb +69 -0
- data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview/all_separators.html.erb +47 -0
- data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview/default.html.erb +23 -0
- data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview/with_icons.html.erb +43 -0
- data/spec/components/previews/better_ui/breadcrumb/breadcrumb_component_preview.rb +38 -0
- data/spec/components/previews/better_ui/button_component_preview/all_sizes.html.erb +25 -0
- data/spec/components/previews/better_ui/button_component_preview/all_variants.html.erb +14 -0
- data/spec/components/previews/better_ui/button_component_preview/as_links.html.erb +18 -0
- data/spec/components/previews/better_ui/button_component_preview/auto_loading_submit.html.erb +112 -0
- data/spec/components/previews/better_ui/button_component_preview/external_links.html.erb +61 -0
- data/spec/components/previews/better_ui/button_component_preview/form_integration.html.erb +102 -0
- data/spec/components/previews/better_ui/button_component_preview/interactive.html.erb +149 -0
- data/spec/components/previews/better_ui/button_component_preview/link_states.html.erb +36 -0
- data/spec/components/previews/better_ui/button_component_preview/loading_states.html.erb +62 -0
- data/spec/components/previews/better_ui/button_component_preview/turbo_method_links.html.erb +98 -0
- data/spec/components/previews/better_ui/button_component_preview/with_icons.html.erb +123 -0
- data/spec/components/previews/better_ui/button_component_preview.rb +155 -0
- data/spec/components/previews/better_ui/card_component_preview/all_sizes.html.erb +10 -0
- data/spec/components/previews/better_ui/card_component_preview/all_styles.html.erb +22 -0
- data/spec/components/previews/better_ui/card_component_preview/all_variants.html.erb +10 -0
- data/spec/components/previews/better_ui/card_component_preview.rb +269 -0
- data/spec/components/previews/better_ui/container_component_preview/all_sizes.html.erb +13 -0
- data/spec/components/previews/better_ui/container_component_preview.rb +59 -0
- data/spec/components/previews/better_ui/dialog/alert_component_preview/all_variants.html.erb +17 -0
- data/spec/components/previews/better_ui/dialog/alert_component_preview/custom_button_label.html.erb +14 -0
- data/spec/components/previews/better_ui/dialog/alert_component_preview/default.html.erb +13 -0
- data/spec/components/previews/better_ui/dialog/alert_component_preview/playground.html.erb +16 -0
- data/spec/components/previews/better_ui/dialog/alert_component_preview/without_icon.html.erb +14 -0
- data/spec/components/previews/better_ui/dialog/alert_component_preview.rb +57 -0
- data/spec/components/previews/better_ui/dialog/confirm_component_preview/all_variants.html.erb +17 -0
- data/spec/components/previews/better_ui/dialog/confirm_component_preview/custom_labels.html.erb +15 -0
- data/spec/components/previews/better_ui/dialog/confirm_component_preview/danger_confirm.html.erb +15 -0
- data/spec/components/previews/better_ui/dialog/confirm_component_preview/default.html.erb +13 -0
- data/spec/components/previews/better_ui/dialog/confirm_component_preview/playground.html.erb +17 -0
- data/spec/components/previews/better_ui/dialog/confirm_component_preview.rb +60 -0
- data/spec/components/previews/better_ui/dialog/dialog_component_preview/all_sizes.html.erb +32 -0
- data/spec/components/previews/better_ui/dialog/dialog_component_preview/default.html.erb +34 -0
- data/spec/components/previews/better_ui/dialog/dialog_component_preview/no_close_button.html.erb +28 -0
- data/spec/components/previews/better_ui/dialog/dialog_component_preview/playground.html.erb +39 -0
- data/spec/components/previews/better_ui/dialog/dialog_component_preview/with_all_slots.html.erb +52 -0
- data/spec/components/previews/better_ui/dialog/dialog_component_preview.rb +51 -0
- data/spec/components/previews/better_ui/divider_component_preview/all_styles.html.erb +58 -0
- data/spec/components/previews/better_ui/divider_component_preview/with_labels.html.erb +67 -0
- data/spec/components/previews/better_ui/divider_component_preview.rb +62 -0
- data/spec/components/previews/better_ui/drawer/header_component_preview.rb +169 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/complete_layout.html.erb +87 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/dark_theme.html.erb +36 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/dashboard_example.html.erb +188 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/default.html.erb +22 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/primary_theme.html.erb +36 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/right_sidebar.html.erb +44 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/with_header_only.html.erb +20 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview/with_sidebar_only.html.erb +21 -0
- data/spec/components/previews/better_ui/drawer/layout_component_preview.rb +91 -0
- data/spec/components/previews/better_ui/drawer/nav_group_component_preview/complete_navigation.html.erb +55 -0
- data/spec/components/previews/better_ui/drawer/nav_group_component_preview.rb +163 -0
- data/spec/components/previews/better_ui/drawer/nav_item_component_preview.rb +104 -0
- data/spec/components/previews/better_ui/drawer/sidebar_component_preview.rb +212 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/all_sizes.html.erb +19 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/default.html.erb +12 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/disabled_items.html.erb +14 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/placement_options.html.erb +16 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/playground.html.erb +35 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/with_dividers_and_headers.html.erb +18 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview/with_icons.html.erb +34 -0
- data/spec/components/previews/better_ui/dropdown/dropdown_component_preview.rb +59 -0
- data/spec/components/previews/better_ui/fa_icon_component_preview/all_sizes.html.erb +17 -0
- data/spec/components/previews/better_ui/fa_icon_component_preview/all_styles.html.erb +19 -0
- data/spec/components/previews/better_ui/fa_icon_component_preview/all_variants.html.erb +26 -0
- data/spec/components/previews/better_ui/fa_icon_component_preview/animations.html.erb +26 -0
- data/spec/components/previews/better_ui/fa_icon_component_preview/transformations.html.erb +88 -0
- data/spec/components/previews/better_ui/fa_icon_component_preview.rb +85 -0
- data/spec/components/previews/better_ui/forms/checkbox_component_preview/all_sizes.html.erb +12 -0
- data/spec/components/previews/better_ui/forms/checkbox_component_preview/all_variants.html.erb +12 -0
- data/spec/components/previews/better_ui/forms/checkbox_component_preview/form_integration.html.erb +32 -0
- data/spec/components/previews/better_ui/forms/checkbox_component_preview.rb +143 -0
- data/spec/components/previews/better_ui/forms/checkbox_group_component_preview/all_variants.html.erb +14 -0
- data/spec/components/previews/better_ui/forms/checkbox_group_component_preview/form_integration.html.erb +47 -0
- data/spec/components/previews/better_ui/forms/checkbox_group_component_preview/orientations.html.erb +34 -0
- data/spec/components/previews/better_ui/forms/checkbox_group_component_preview.rb +150 -0
- data/spec/components/previews/better_ui/forms/number_input_component_preview/all_sizes.html.erb +14 -0
- data/spec/components/previews/better_ui/forms/number_input_component_preview/form_integration.html.erb +45 -0
- data/spec/components/previews/better_ui/forms/number_input_component_preview.rb +211 -0
- data/spec/components/previews/better_ui/forms/password_input_component_preview/all_sizes.html.erb +12 -0
- data/spec/components/previews/better_ui/forms/password_input_component_preview/confirm_password_example.html.erb +29 -0
- data/spec/components/previews/better_ui/forms/password_input_component_preview/form_integration.html.erb +34 -0
- data/spec/components/previews/better_ui/forms/password_input_component_preview.rb +181 -0
- data/spec/components/previews/better_ui/forms/select_component_preview/all_sizes.html.erb +13 -0
- data/spec/components/previews/better_ui/forms/select_component_preview/all_states.html.erb +64 -0
- data/spec/components/previews/better_ui/forms/select_component_preview.rb +167 -0
- data/spec/components/previews/better_ui/forms/text_input_component_preview/all_sizes.html.erb +12 -0
- data/spec/components/previews/better_ui/forms/text_input_component_preview/all_types.html.erb +12 -0
- data/spec/components/previews/better_ui/forms/text_input_component_preview/form_integration.html.erb +33 -0
- data/spec/components/previews/better_ui/forms/text_input_component_preview.rb +247 -0
- data/spec/components/previews/better_ui/forms/textarea_component_preview/all_resize_variants.html.erb +13 -0
- data/spec/components/previews/better_ui/forms/textarea_component_preview/all_sizes.html.erb +12 -0
- data/spec/components/previews/better_ui/forms/textarea_component_preview/form_integration.html.erb +36 -0
- data/spec/components/previews/better_ui/forms/textarea_component_preview.rb +239 -0
- data/spec/components/previews/better_ui/heading_component_preview/all_alignments.html.erb +12 -0
- data/spec/components/previews/better_ui/heading_component_preview/all_levels.html.erb +7 -0
- data/spec/components/previews/better_ui/heading_component_preview/all_variants.html.erb +14 -0
- data/spec/components/previews/better_ui/heading_component_preview.rb +113 -0
- data/spec/components/previews/better_ui/link_component_preview/all_sizes.html.erb +25 -0
- data/spec/components/previews/better_ui/link_component_preview/all_styles.html.erb +14 -0
- data/spec/components/previews/better_ui/link_component_preview/all_variants.html.erb +14 -0
- data/spec/components/previews/better_ui/link_component_preview/with_icons.html.erb +66 -0
- data/spec/components/previews/better_ui/link_component_preview.rb +66 -0
- data/spec/components/previews/better_ui/progress_component_preview/all_sizes.html.erb +15 -0
- data/spec/components/previews/better_ui/progress_component_preview/all_variants.html.erb +11 -0
- data/spec/components/previews/better_ui/progress_component_preview.rb +64 -0
- data/spec/components/previews/better_ui/spinner_component_preview/all_sizes.html.erb +17 -0
- data/spec/components/previews/better_ui/spinner_component_preview/all_variants.html.erb +11 -0
- data/spec/components/previews/better_ui/spinner_component_preview.rb +44 -0
- data/spec/components/previews/better_ui/table/table_component_preview/all_sizes.html.erb +28 -0
- data/spec/components/previews/better_ui/table/table_component_preview/all_variants.html.erb +34 -0
- data/spec/components/previews/better_ui/table/table_component_preview/bordered.html.erb +33 -0
- data/spec/components/previews/better_ui/table/table_component_preview/collection_mode.html.erb +31 -0
- data/spec/components/previews/better_ui/table/table_component_preview/default.html.erb +33 -0
- data/spec/components/previews/better_ui/table/table_component_preview/empty_state.html.erb +36 -0
- data/spec/components/previews/better_ui/table/table_component_preview/highlighted.html.erb +64 -0
- data/spec/components/previews/better_ui/table/table_component_preview/hoverable.html.erb +27 -0
- data/spec/components/previews/better_ui/table/table_component_preview/inside_card.html.erb +173 -0
- data/spec/components/previews/better_ui/table/table_component_preview/sortable.html.erb +44 -0
- data/spec/components/previews/better_ui/table/table_component_preview/striped.html.erb +31 -0
- data/spec/components/previews/better_ui/table/table_component_preview/with_footer.html.erb +40 -0
- data/spec/components/previews/better_ui/table/table_component_preview.rb +79 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/alignments.html.erb +24 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/all_sizes.html.erb +24 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/all_variants.html.erb +24 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/bordered_style.html.erb +30 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/default.html.erb +30 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/disabled_tab.html.erb +65 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/pills_style.html.erb +34 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/turbo_mode.html.erb +40 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/vertical_left.html.erb +38 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/vertical_right.html.erb +30 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview/with_icons_and_badges.html.erb +71 -0
- data/spec/components/previews/better_ui/tabs/container_component_preview.rb +130 -0
- data/spec/components/previews/better_ui/tag_component_preview/all_styles.html.erb +14 -0
- data/spec/components/previews/better_ui/tag_component_preview/all_variants.html.erb +14 -0
- data/spec/components/previews/better_ui/tag_component_preview/as_links.html.erb +14 -0
- data/spec/components/previews/better_ui/tag_component_preview/dismissible.html.erb +34 -0
- data/spec/components/previews/better_ui/tag_component_preview.rb +56 -0
- data/spec/components/previews/better_ui/tooltip_component_preview/all_positions.html.erb +25 -0
- data/spec/components/previews/better_ui/tooltip_component_preview/variants.html.erb +37 -0
- data/spec/components/previews/better_ui/tooltip_component_preview.rb +40 -0
- 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>
|
data/spec/components/previews/better_ui/forms/text_input_component_preview/form_integration.html.erb
ADDED
|
@@ -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>
|
data/spec/components/previews/better_ui/forms/textarea_component_preview/form_integration.html.erb
ADDED
|
@@ -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>
|