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.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -0
  4. data/lib/generators/ruby_ui/component_generator.rb +5 -1
  5. data/lib/generators/ruby_ui/dependencies.yml +10 -0
  6. data/lib/generators/ruby_ui/install/docs_generator.rb +33 -0
  7. data/lib/generators/ruby_ui/install/install_generator.rb +1 -1
  8. data/lib/generators/ruby_ui/javascript_utils.rb +4 -0
  9. data/lib/ruby_ui/accordion/accordion_docs.rb +53 -0
  10. data/lib/ruby_ui/alert/alert_docs.rb +135 -0
  11. data/lib/ruby_ui/alert_dialog/alert_dialog_docs.rb +35 -0
  12. data/lib/ruby_ui/aspect_ratio/aspect_ratio_docs.rb +64 -0
  13. data/lib/ruby_ui/avatar/avatar_docs.rb +92 -0
  14. data/lib/ruby_ui/badge/badge_docs.rb +80 -0
  15. data/lib/ruby_ui/breadcrumb/breadcrumb_docs.rb +116 -0
  16. data/lib/ruby_ui/button/button_docs.rb +143 -0
  17. data/lib/ruby_ui/calendar/calendar_docs.rb +34 -0
  18. data/lib/ruby_ui/card/card_docs.rb +114 -0
  19. data/lib/ruby_ui/carousel/carousel_docs.rb +104 -0
  20. data/lib/ruby_ui/chart/chart_docs.rb +115 -0
  21. data/lib/ruby_ui/checkbox/checkbox.rb +2 -2
  22. data/lib/ruby_ui/checkbox/checkbox_docs.rb +41 -0
  23. data/lib/ruby_ui/clipboard/clipboard_docs.rb +30 -0
  24. data/lib/ruby_ui/codeblock/codeblock_docs.rb +55 -0
  25. data/lib/ruby_ui/collapsible/collapsible_docs.rb +96 -0
  26. data/lib/ruby_ui/combobox/combobox.rb +7 -1
  27. data/lib/ruby_ui/combobox/combobox_badge.rb +17 -0
  28. data/lib/ruby_ui/combobox/combobox_badge_trigger.rb +47 -0
  29. data/lib/ruby_ui/combobox/combobox_checkbox.rb +1 -7
  30. data/lib/ruby_ui/combobox/combobox_clear_button.rb +40 -0
  31. data/lib/ruby_ui/combobox/combobox_controller.js +252 -47
  32. data/lib/ruby_ui/combobox/combobox_docs.rb +286 -0
  33. data/lib/ruby_ui/combobox/combobox_input_trigger.rb +64 -0
  34. data/lib/ruby_ui/combobox/combobox_item.rb +5 -7
  35. data/lib/ruby_ui/combobox/combobox_item_indicator.rb +30 -0
  36. data/lib/ruby_ui/combobox/combobox_list_group.rb +1 -1
  37. data/lib/ruby_ui/combobox/combobox_popover.rb +1 -5
  38. data/lib/ruby_ui/combobox/combobox_radio.rb +1 -8
  39. data/lib/ruby_ui/combobox/combobox_toggle_all_checkbox.rb +1 -6
  40. data/lib/ruby_ui/combobox/combobox_trigger.rb +19 -19
  41. data/lib/ruby_ui/command/command_docs.rb +154 -0
  42. data/lib/ruby_ui/context_menu/context_menu.rb +1 -1
  43. data/lib/ruby_ui/context_menu/context_menu_docs.rb +85 -0
  44. data/lib/ruby_ui/data_table/data_table.rb +29 -0
  45. data/lib/ruby_ui/data_table/data_table_bulk_actions.rb +18 -0
  46. data/lib/ruby_ui/data_table/data_table_column_toggle.rb +62 -0
  47. data/lib/ruby_ui/data_table/data_table_column_visibility_controller.js +14 -0
  48. data/lib/ruby_ui/data_table/data_table_controller.js +57 -0
  49. data/lib/ruby_ui/data_table/data_table_docs.rb +180 -0
  50. data/lib/ruby_ui/data_table/data_table_expand_toggle.rb +53 -0
  51. data/lib/ruby_ui/data_table/data_table_form.rb +39 -0
  52. data/lib/ruby_ui/data_table/data_table_kaminari_adapter.rb +17 -0
  53. data/lib/ruby_ui/data_table/data_table_manual_adapter.rb +17 -0
  54. data/lib/ruby_ui/data_table/data_table_pagination.rb +100 -0
  55. data/lib/ruby_ui/data_table/data_table_pagination_bar.rb +15 -0
  56. data/lib/ruby_ui/data_table/data_table_pagy_adapter.rb +17 -0
  57. data/lib/ruby_ui/data_table/data_table_per_page_select.rb +35 -0
  58. data/lib/ruby_ui/data_table/data_table_row_checkbox.rb +30 -0
  59. data/lib/ruby_ui/data_table/data_table_search.rb +57 -0
  60. data/lib/ruby_ui/data_table/data_table_search_controller.js +62 -0
  61. data/lib/ruby_ui/data_table/data_table_select_all_checkbox.rb +21 -0
  62. data/lib/ruby_ui/data_table/data_table_selection_summary.rb +25 -0
  63. data/lib/ruby_ui/data_table/data_table_sort_head.rb +112 -0
  64. data/lib/ruby_ui/data_table/data_table_toolbar.rb +15 -0
  65. data/lib/ruby_ui/dialog/dialog_docs.rb +102 -0
  66. data/lib/ruby_ui/docs/base.rb +90 -0
  67. data/lib/ruby_ui/docs/component_setup_tabs.rb +15 -0
  68. data/lib/ruby_ui/docs/components_table.rb +13 -0
  69. data/lib/ruby_ui/docs/header.rb +17 -0
  70. data/lib/ruby_ui/docs/sidebar_examples.rb +22 -0
  71. data/lib/ruby_ui/docs/visual_code_example.rb +22 -0
  72. data/lib/ruby_ui/dropdown_menu/dropdown_menu_docs.rb +212 -0
  73. data/lib/ruby_ui/form/form_docs.rb +178 -0
  74. data/lib/ruby_ui/form/form_field.rb +1 -1
  75. data/lib/ruby_ui/form/form_field_error.rb +1 -1
  76. data/lib/ruby_ui/form/form_field_hint.rb +1 -1
  77. data/lib/ruby_ui/form/form_field_label.rb +1 -1
  78. data/lib/ruby_ui/hover_card/hover_card_docs.rb +71 -0
  79. data/lib/ruby_ui/input/input.rb +4 -3
  80. data/lib/ruby_ui/input/input_docs.rb +68 -0
  81. data/lib/ruby_ui/link/link_docs.rb +106 -0
  82. data/lib/ruby_ui/masked_input/masked_input.rb +11 -1
  83. data/lib/ruby_ui/masked_input/masked_input_controller.js +13 -0
  84. data/lib/ruby_ui/masked_input/masked_input_docs.rb +47 -0
  85. data/lib/ruby_ui/native_select/native_select.rb +39 -0
  86. data/lib/ruby_ui/native_select/native_select_docs.rb +83 -0
  87. data/lib/ruby_ui/native_select/native_select_group.rb +15 -0
  88. data/lib/ruby_ui/native_select/native_select_icon.rb +39 -0
  89. data/lib/ruby_ui/native_select/native_select_option.rb +15 -0
  90. data/lib/ruby_ui/pagination/pagination_docs.rb +127 -0
  91. data/lib/ruby_ui/popover/popover_docs.rb +971 -0
  92. data/lib/ruby_ui/progress/progress_docs.rb +27 -0
  93. data/lib/ruby_ui/radio_button/radio_button.rb +1 -1
  94. data/lib/ruby_ui/radio_button/radio_button_docs.rb +53 -0
  95. data/lib/ruby_ui/select/select_docs.rb +129 -0
  96. data/lib/ruby_ui/separator/separator_docs.rb +36 -0
  97. data/lib/ruby_ui/sheet/sheet_content.rb +1 -1
  98. data/lib/ruby_ui/sheet/sheet_docs.rb +76 -0
  99. data/lib/ruby_ui/shortcut_key/shortcut_key_docs.rb +29 -0
  100. data/lib/ruby_ui/sidebar/sidebar_docs.rb +176 -0
  101. data/lib/ruby_ui/skeleton/skeleton_docs.rb +29 -0
  102. data/lib/ruby_ui/switch/switch_docs.rb +46 -0
  103. data/lib/ruby_ui/table/table_docs.rb +102 -0
  104. data/lib/ruby_ui/tabs/tabs_docs.rb +211 -0
  105. data/lib/ruby_ui/textarea/textarea_docs.rb +54 -0
  106. data/lib/ruby_ui/theme_toggle/theme_toggle_docs.rb +71 -0
  107. data/lib/ruby_ui/tooltip/tooltip_docs.rb +52 -0
  108. data/lib/ruby_ui/typography/typography_docs.rb +107 -0
  109. data/lib/ruby_ui.rb +1 -1
  110. 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,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyUI
4
+ class NativeSelectGroup < Base
5
+ def view_template(&)
6
+ optgroup(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {}
13
+ end
14
+ end
15
+ 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,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyUI
4
+ class NativeSelectOption < Base
5
+ def view_template(&)
6
+ option(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {}
13
+ end
14
+ end
15
+ 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