ruby_ui 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +4 -0
- data/lib/generators/ruby_ui/component_generator.rb +5 -1
- data/lib/generators/ruby_ui/dependencies.yml +10 -0
- data/lib/generators/ruby_ui/install/docs_generator.rb +33 -0
- data/lib/generators/ruby_ui/install/install_generator.rb +1 -1
- data/lib/generators/ruby_ui/javascript_utils.rb +4 -0
- data/lib/ruby_ui/accordion/accordion_docs.rb +53 -0
- data/lib/ruby_ui/alert/alert_docs.rb +135 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_docs.rb +35 -0
- data/lib/ruby_ui/aspect_ratio/aspect_ratio_docs.rb +64 -0
- data/lib/ruby_ui/avatar/avatar_docs.rb +92 -0
- data/lib/ruby_ui/badge/badge_docs.rb +80 -0
- data/lib/ruby_ui/breadcrumb/breadcrumb_docs.rb +116 -0
- data/lib/ruby_ui/button/button_docs.rb +143 -0
- data/lib/ruby_ui/calendar/calendar_docs.rb +34 -0
- data/lib/ruby_ui/card/card_docs.rb +114 -0
- data/lib/ruby_ui/carousel/carousel_docs.rb +104 -0
- data/lib/ruby_ui/chart/chart_docs.rb +115 -0
- data/lib/ruby_ui/checkbox/checkbox.rb +2 -2
- data/lib/ruby_ui/checkbox/checkbox_docs.rb +41 -0
- data/lib/ruby_ui/clipboard/clipboard_docs.rb +30 -0
- data/lib/ruby_ui/codeblock/codeblock_docs.rb +55 -0
- data/lib/ruby_ui/collapsible/collapsible_docs.rb +96 -0
- data/lib/ruby_ui/combobox/combobox.rb +7 -1
- data/lib/ruby_ui/combobox/combobox_badge.rb +17 -0
- data/lib/ruby_ui/combobox/combobox_badge_trigger.rb +47 -0
- data/lib/ruby_ui/combobox/combobox_checkbox.rb +1 -7
- data/lib/ruby_ui/combobox/combobox_clear_button.rb +40 -0
- data/lib/ruby_ui/combobox/combobox_controller.js +252 -47
- data/lib/ruby_ui/combobox/combobox_docs.rb +286 -0
- data/lib/ruby_ui/combobox/combobox_input_trigger.rb +64 -0
- data/lib/ruby_ui/combobox/combobox_item.rb +5 -7
- data/lib/ruby_ui/combobox/combobox_item_indicator.rb +30 -0
- data/lib/ruby_ui/combobox/combobox_list_group.rb +1 -1
- data/lib/ruby_ui/combobox/combobox_popover.rb +1 -5
- data/lib/ruby_ui/combobox/combobox_radio.rb +1 -8
- data/lib/ruby_ui/combobox/combobox_toggle_all_checkbox.rb +1 -6
- data/lib/ruby_ui/combobox/combobox_trigger.rb +19 -19
- data/lib/ruby_ui/command/command_docs.rb +154 -0
- data/lib/ruby_ui/context_menu/context_menu.rb +1 -1
- data/lib/ruby_ui/context_menu/context_menu_docs.rb +85 -0
- data/lib/ruby_ui/data_table/data_table.rb +29 -0
- data/lib/ruby_ui/data_table/data_table_bulk_actions.rb +18 -0
- data/lib/ruby_ui/data_table/data_table_column_toggle.rb +62 -0
- data/lib/ruby_ui/data_table/data_table_column_visibility_controller.js +14 -0
- data/lib/ruby_ui/data_table/data_table_controller.js +57 -0
- data/lib/ruby_ui/data_table/data_table_docs.rb +180 -0
- data/lib/ruby_ui/data_table/data_table_expand_toggle.rb +53 -0
- data/lib/ruby_ui/data_table/data_table_form.rb +39 -0
- data/lib/ruby_ui/data_table/data_table_kaminari_adapter.rb +17 -0
- data/lib/ruby_ui/data_table/data_table_manual_adapter.rb +17 -0
- data/lib/ruby_ui/data_table/data_table_pagination.rb +100 -0
- data/lib/ruby_ui/data_table/data_table_pagination_bar.rb +15 -0
- data/lib/ruby_ui/data_table/data_table_pagy_adapter.rb +17 -0
- data/lib/ruby_ui/data_table/data_table_per_page_select.rb +35 -0
- data/lib/ruby_ui/data_table/data_table_row_checkbox.rb +30 -0
- data/lib/ruby_ui/data_table/data_table_search.rb +57 -0
- data/lib/ruby_ui/data_table/data_table_search_controller.js +62 -0
- data/lib/ruby_ui/data_table/data_table_select_all_checkbox.rb +21 -0
- data/lib/ruby_ui/data_table/data_table_selection_summary.rb +25 -0
- data/lib/ruby_ui/data_table/data_table_sort_head.rb +112 -0
- data/lib/ruby_ui/data_table/data_table_toolbar.rb +15 -0
- data/lib/ruby_ui/dialog/dialog_docs.rb +102 -0
- data/lib/ruby_ui/docs/base.rb +90 -0
- data/lib/ruby_ui/docs/component_setup_tabs.rb +15 -0
- data/lib/ruby_ui/docs/components_table.rb +13 -0
- data/lib/ruby_ui/docs/header.rb +17 -0
- data/lib/ruby_ui/docs/sidebar_examples.rb +22 -0
- data/lib/ruby_ui/docs/visual_code_example.rb +22 -0
- data/lib/ruby_ui/dropdown_menu/dropdown_menu_docs.rb +212 -0
- data/lib/ruby_ui/form/form_docs.rb +178 -0
- data/lib/ruby_ui/form/form_field.rb +1 -1
- data/lib/ruby_ui/form/form_field_error.rb +1 -1
- data/lib/ruby_ui/form/form_field_hint.rb +1 -1
- data/lib/ruby_ui/form/form_field_label.rb +1 -1
- data/lib/ruby_ui/hover_card/hover_card_docs.rb +71 -0
- data/lib/ruby_ui/input/input.rb +4 -3
- data/lib/ruby_ui/input/input_docs.rb +68 -0
- data/lib/ruby_ui/link/link_docs.rb +106 -0
- data/lib/ruby_ui/masked_input/masked_input.rb +11 -1
- data/lib/ruby_ui/masked_input/masked_input_controller.js +13 -0
- data/lib/ruby_ui/masked_input/masked_input_docs.rb +47 -0
- data/lib/ruby_ui/native_select/native_select.rb +39 -0
- data/lib/ruby_ui/native_select/native_select_docs.rb +83 -0
- data/lib/ruby_ui/native_select/native_select_group.rb +15 -0
- data/lib/ruby_ui/native_select/native_select_icon.rb +39 -0
- data/lib/ruby_ui/native_select/native_select_option.rb +15 -0
- data/lib/ruby_ui/pagination/pagination_docs.rb +127 -0
- data/lib/ruby_ui/popover/popover_docs.rb +971 -0
- data/lib/ruby_ui/progress/progress_docs.rb +27 -0
- data/lib/ruby_ui/radio_button/radio_button.rb +1 -1
- data/lib/ruby_ui/radio_button/radio_button_docs.rb +53 -0
- data/lib/ruby_ui/select/select_docs.rb +129 -0
- data/lib/ruby_ui/separator/separator_docs.rb +36 -0
- data/lib/ruby_ui/sheet/sheet_content.rb +1 -1
- data/lib/ruby_ui/sheet/sheet_docs.rb +76 -0
- data/lib/ruby_ui/shortcut_key/shortcut_key_docs.rb +29 -0
- data/lib/ruby_ui/sidebar/sidebar_docs.rb +176 -0
- data/lib/ruby_ui/skeleton/skeleton_docs.rb +29 -0
- data/lib/ruby_ui/switch/switch_docs.rb +46 -0
- data/lib/ruby_ui/table/table_docs.rb +102 -0
- data/lib/ruby_ui/tabs/tabs_docs.rb +211 -0
- data/lib/ruby_ui/textarea/textarea_docs.rb +54 -0
- data/lib/ruby_ui/theme_toggle/theme_toggle_docs.rb +71 -0
- data/lib/ruby_ui/tooltip/tooltip_docs.rb +52 -0
- data/lib/ruby_ui/typography/typography_docs.rb +107 -0
- data/lib/ruby_ui.rb +1 -1
- metadata +90 -3
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Views::Docs::NativeSelect < Views::Base
|
|
4
|
+
def view_template
|
|
5
|
+
component = "NativeSelect"
|
|
6
|
+
|
|
7
|
+
div(class: "max-w-2xl mx-auto w-full py-10 space-y-10") do
|
|
8
|
+
render Docs::Header.new(title: "Native Select", description: "A styled native HTML select element with consistent design system integration.")
|
|
9
|
+
|
|
10
|
+
Heading(level: 2) { "Usage" }
|
|
11
|
+
|
|
12
|
+
render Docs::VisualCodeExample.new(title: "Default", context: self) do
|
|
13
|
+
<<~RUBY
|
|
14
|
+
div(class: "grid w-full max-w-sm items-center gap-1.5") do
|
|
15
|
+
NativeSelect do
|
|
16
|
+
NativeSelectOption(value: "") { "Select a fruit" }
|
|
17
|
+
NativeSelectOption(value: "apple") { "Apple" }
|
|
18
|
+
NativeSelectOption(value: "banana") { "Banana" }
|
|
19
|
+
NativeSelectOption(value: "blueberry") { "Blueberry" }
|
|
20
|
+
NativeSelectOption(value: "pineapple") { "Pineapple" }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
RUBY
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
render Docs::VisualCodeExample.new(title: "Groups", description: "Use NativeSelectGroup to organize options into categories.", context: self) do
|
|
27
|
+
<<~RUBY
|
|
28
|
+
div(class: "grid w-full max-w-sm items-center gap-1.5") do
|
|
29
|
+
NativeSelect do
|
|
30
|
+
NativeSelectOption(value: "") { "Select a department" }
|
|
31
|
+
NativeSelectGroup(label: "Engineering") do
|
|
32
|
+
NativeSelectOption(value: "frontend") { "Frontend" }
|
|
33
|
+
NativeSelectOption(value: "backend") { "Backend" }
|
|
34
|
+
NativeSelectOption(value: "devops") { "DevOps" }
|
|
35
|
+
end
|
|
36
|
+
NativeSelectGroup(label: "Sales") do
|
|
37
|
+
NativeSelectOption(value: "account_executive") { "Account Executive" }
|
|
38
|
+
NativeSelectOption(value: "sales_development") { "Sales Development" }
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
RUBY
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
render Docs::VisualCodeExample.new(title: "Disabled", description: "Add the disabled attribute to the NativeSelect component to disable the select.", context: self) do
|
|
46
|
+
<<~RUBY
|
|
47
|
+
div(class: "grid w-full max-w-sm items-center gap-1.5") do
|
|
48
|
+
NativeSelect(disabled: true) do
|
|
49
|
+
NativeSelectOption(value: "") { "Select a fruit" }
|
|
50
|
+
NativeSelectOption(value: "apple") { "Apple" }
|
|
51
|
+
NativeSelectOption(value: "banana") { "Banana" }
|
|
52
|
+
NativeSelectOption(value: "blueberry") { "Blueberry" }
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
RUBY
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
render Docs::VisualCodeExample.new(title: "Invalid", description: "Use aria-invalid to show validation errors.", context: self) do
|
|
59
|
+
<<~RUBY
|
|
60
|
+
div(class: "grid w-full max-w-sm items-center gap-1.5") do
|
|
61
|
+
NativeSelect(aria: {invalid: "true"}) do
|
|
62
|
+
NativeSelectOption(value: "") { "Select a fruit" }
|
|
63
|
+
NativeSelectOption(value: "apple") { "Apple" }
|
|
64
|
+
NativeSelectOption(value: "banana") { "Banana" }
|
|
65
|
+
NativeSelectOption(value: "blueberry") { "Blueberry" }
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
RUBY
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
Heading(level: 2) { "Native Select vs Select" }
|
|
72
|
+
|
|
73
|
+
div(class: "space-y-2 text-sm text-muted-foreground") do
|
|
74
|
+
p { "NativeSelect: Choose for native browser behavior, superior performance, or mobile-optimized dropdowns." }
|
|
75
|
+
p { "Select: Choose for custom styling, animations, or complex interactions." }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
render Components::ComponentSetup::Tabs.new(component_name: component)
|
|
79
|
+
|
|
80
|
+
render Docs::ComponentsTable.new(component_files(component))
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RubyUI
|
|
4
|
+
class NativeSelectIcon < Base
|
|
5
|
+
def view_template(&block)
|
|
6
|
+
span(**attrs) do
|
|
7
|
+
if block
|
|
8
|
+
block.call
|
|
9
|
+
else
|
|
10
|
+
icon
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def icon
|
|
18
|
+
svg(
|
|
19
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
20
|
+
viewbox: "0 0 24 24",
|
|
21
|
+
fill: "none",
|
|
22
|
+
stroke: "currentColor",
|
|
23
|
+
stroke_width: "2",
|
|
24
|
+
stroke_linecap: "round",
|
|
25
|
+
stroke_linejoin: "round",
|
|
26
|
+
class: "size-4",
|
|
27
|
+
aria_hidden: "true"
|
|
28
|
+
) do |s|
|
|
29
|
+
s.path(d: "m6 9 6 6 6-6")
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def default_attrs
|
|
34
|
+
{
|
|
35
|
+
class: "text-muted-foreground pointer-events-none absolute top-1/2 right-2.5 -translate-y-1/2 select-none"
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Views::Docs::Pagination < Views::Base
|
|
4
|
+
def view_template
|
|
5
|
+
component = "Pagination"
|
|
6
|
+
|
|
7
|
+
div(class: "max-w-2xl mx-auto w-full py-10 space-y-10") do
|
|
8
|
+
render Docs::Header.new(title: "Pagination", description: "Pagination with page navigation, next and previous links.")
|
|
9
|
+
|
|
10
|
+
Heading(level: 2) { "Usage" }
|
|
11
|
+
|
|
12
|
+
render Docs::VisualCodeExample.new(title: "Example", description: "This is the default appearance of a Pagination", context: self) do
|
|
13
|
+
<<~RUBY
|
|
14
|
+
Pagination do
|
|
15
|
+
PaginationContent do
|
|
16
|
+
PaginationItem(href: "#") do
|
|
17
|
+
chevrons_left_icon
|
|
18
|
+
plain "First"
|
|
19
|
+
end
|
|
20
|
+
PaginationItem(href: "#") do
|
|
21
|
+
chevron_left_icon
|
|
22
|
+
plain "Prev"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
PaginationEllipsis
|
|
26
|
+
|
|
27
|
+
PaginationItem(href: "#") { "4" }
|
|
28
|
+
PaginationItem(href: "#", active: true) { "5" }
|
|
29
|
+
PaginationItem(href: "#") { "6" }
|
|
30
|
+
|
|
31
|
+
PaginationEllipsis
|
|
32
|
+
|
|
33
|
+
PaginationItem(href: "#") do
|
|
34
|
+
plain "Next"
|
|
35
|
+
chevron_right_icon
|
|
36
|
+
end
|
|
37
|
+
PaginationItem(href: "#") do
|
|
38
|
+
plain "Last"
|
|
39
|
+
chevrons_right_icon
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
RUBY
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
render Components::ComponentSetup::Tabs.new(component_name: component)
|
|
47
|
+
|
|
48
|
+
render Docs::ComponentsTable.new(component_files(component))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def chevrons_left_icon
|
|
55
|
+
svg(
|
|
56
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
57
|
+
width: "24",
|
|
58
|
+
height: "24",
|
|
59
|
+
viewbox: "0 0 24 24",
|
|
60
|
+
stroke_width: "1.5",
|
|
61
|
+
stroke: "currentColor",
|
|
62
|
+
fill: "none",
|
|
63
|
+
stroke_linecap: "round",
|
|
64
|
+
stroke_linejoin: "round",
|
|
65
|
+
class: "h-4 w-4"
|
|
66
|
+
) do |s|
|
|
67
|
+
s.path(stroke: "none", d: "M0 0h24v24H0z", fill: "none")
|
|
68
|
+
s.path(d: "M11 7l-5 5l5 5")
|
|
69
|
+
s.path(d: "M17 7l-5 5l5 5")
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def chevron_left_icon
|
|
74
|
+
svg(
|
|
75
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
76
|
+
width: "24",
|
|
77
|
+
height: "24",
|
|
78
|
+
viewbox: "0 0 24 24",
|
|
79
|
+
stroke_width: "1.5",
|
|
80
|
+
stroke: "currentColor",
|
|
81
|
+
fill: "none",
|
|
82
|
+
stroke_linecap: "round",
|
|
83
|
+
stroke_linejoin: "round",
|
|
84
|
+
class: "h-4 w-4"
|
|
85
|
+
) do |s|
|
|
86
|
+
s.path(stroke: "none", d: "M0 0h24v24H0z", fill: "none")
|
|
87
|
+
s.path(d: "M15 6l-6 6l6 6")
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def chevrons_right_icon
|
|
92
|
+
svg(
|
|
93
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
94
|
+
width: "24",
|
|
95
|
+
height: "24",
|
|
96
|
+
viewbox: "0 0 24 24",
|
|
97
|
+
stroke_width: "1.5",
|
|
98
|
+
stroke: "currentColor",
|
|
99
|
+
fill: "none",
|
|
100
|
+
stroke_linecap: "round",
|
|
101
|
+
stroke_linejoin: "round",
|
|
102
|
+
class: "h-4 w-4"
|
|
103
|
+
) do |s|
|
|
104
|
+
s.path(stroke: "none", d: "M0 0h24v24H0z", fill: "none")
|
|
105
|
+
s.path(d: "M7 7l5 5l-5 5")
|
|
106
|
+
s.path(d: "M13 7l5 5l-5 5")
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def chevron_right_icon
|
|
111
|
+
svg(
|
|
112
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
113
|
+
width: "24",
|
|
114
|
+
height: "24",
|
|
115
|
+
viewbox: "0 0 24 24",
|
|
116
|
+
stroke_width: "1.5",
|
|
117
|
+
stroke: "currentColor",
|
|
118
|
+
fill: "none",
|
|
119
|
+
stroke_linecap: "round",
|
|
120
|
+
stroke_linejoin: "round",
|
|
121
|
+
class: "h-4 w-4"
|
|
122
|
+
) do |s|
|
|
123
|
+
s.path(stroke: "none", d: "M0 0h24v24H0z", fill: "none")
|
|
124
|
+
s.path(d: "M9 6l6 6l-6 6")
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|