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,36 @@
1
+ <%= render BetterUi::Drawer::LayoutComponent.new do |layout| %>
2
+ <% layout.with_header(variant: :dark) do |header| %>
3
+ <% header.with_mobile_menu_button do %>
4
+ <button class="p-2 text-white hover:bg-white/10 rounded-md lg:hidden" data-action="click->better-ui--drawer--layout#toggle">
5
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg>
6
+ </button>
7
+ <% end %>
8
+ <% header.with_logo do %>
9
+ <div class="flex items-center">
10
+ <div class="w-8 h-8 bg-white/20 rounded-lg flex items-center justify-center text-white font-bold">B</div>
11
+ <span class="ml-2 font-semibold text-lg">Dark Theme</span>
12
+ </div>
13
+ <% end %>
14
+ <% header.with_actions do %>
15
+ <div class="w-8 h-8 bg-white/20 rounded-full"></div>
16
+ <% end %>
17
+ <% end %>
18
+
19
+ <% layout.with_sidebar(variant: :dark) do |sidebar| %>
20
+ <% sidebar.with_navigation do %>
21
+ <nav class="space-y-1">
22
+ <a href="#" class="flex items-center px-4 py-2 rounded-md bg-white/10 text-white">Dashboard</a>
23
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-white/5 text-grayscale-300">Projects</a>
24
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-white/5 text-grayscale-300">Team</a>
25
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-white/5 text-grayscale-300">Settings</a>
26
+ </nav>
27
+ <% end %>
28
+ <% end %>
29
+
30
+ <% layout.with_main do %>
31
+ <div class="p-6 bg-grayscale-800 min-h-full">
32
+ <h1 class="text-2xl font-bold mb-4 text-white">Dark Theme Layout</h1>
33
+ <p class="text-grayscale-300">This demonstrates a dark-themed drawer layout. Both the header and sidebar use the dark variant.</p>
34
+ </div>
35
+ <% end %>
36
+ <% end %>
@@ -0,0 +1,188 @@
1
+ <%= render BetterUi::Drawer::LayoutComponent.new do |layout| %>
2
+ <% layout.with_header do |header| %>
3
+ <% header.with_mobile_menu_button do %>
4
+ <button class="p-2 text-grayscale-600 hover:text-grayscale-900 hover:bg-grayscale-100 rounded-md lg:hidden" data-action="click->better-ui--drawer--layout#toggle">
5
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg>
6
+ </button>
7
+ <% end %>
8
+ <% header.with_logo do %>
9
+ <div class="flex items-center">
10
+ <div class="w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center text-white font-bold">A</div>
11
+ <span class="ml-2 font-semibold text-lg hidden sm:block">Acme Dashboard</span>
12
+ </div>
13
+ <% end %>
14
+ <% header.with_navigation do %>
15
+ <nav class="flex gap-6">
16
+ <a href="#" class="text-primary-600 font-medium">Overview</a>
17
+ <a href="#" class="text-grayscale-600 hover:text-grayscale-900">Analytics</a>
18
+ <a href="#" class="text-grayscale-600 hover:text-grayscale-900">Reports</a>
19
+ </nav>
20
+ <% end %>
21
+ <% header.with_actions do %>
22
+ <div class="flex items-center gap-4">
23
+ <button class="text-grayscale-600 hover:text-grayscale-900">
24
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><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"></path></svg>
25
+ </button>
26
+ <button class="text-grayscale-600 hover:text-grayscale-900 relative">
27
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"></path></svg>
28
+ <span class="absolute -top-1 -right-1 w-2 h-2 bg-danger-500 rounded-full"></span>
29
+ </button>
30
+ <div class="flex items-center">
31
+ <div class="w-8 h-8 bg-primary-500 rounded-full"></div>
32
+ </div>
33
+ </div>
34
+ <% end %>
35
+ <% end %>
36
+
37
+ <% layout.with_sidebar do |sidebar| %>
38
+ <% sidebar.with_navigation do %>
39
+ <nav class="space-y-6">
40
+ <div>
41
+ <h3 class="px-4 text-xs font-semibold text-grayscale-500 uppercase tracking-wider">Main</h3>
42
+ <div class="mt-2 space-y-1">
43
+ <a href="#" class="flex items-center px-4 py-2 rounded-md bg-primary-50 text-primary-700">
44
+ <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path></svg>
45
+ Dashboard
46
+ </a>
47
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-grayscale-100">
48
+ <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path></svg>
49
+ Analytics
50
+ </a>
51
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-grayscale-100">
52
+ <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
53
+ Revenue
54
+ </a>
55
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-grayscale-100">
56
+ <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path></svg>
57
+ Customers
58
+ </a>
59
+ </div>
60
+ </div>
61
+ <div>
62
+ <h3 class="px-4 text-xs font-semibold text-grayscale-500 uppercase tracking-wider">Reports</h3>
63
+ <div class="mt-2 space-y-1">
64
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-grayscale-100">
65
+ <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg>
66
+ Monthly
67
+ </a>
68
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-grayscale-100">
69
+ <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><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"></path></svg>
70
+ Annual
71
+ </a>
72
+ </div>
73
+ </div>
74
+ </nav>
75
+ <% end %>
76
+ <% sidebar.with_footer do %>
77
+ <div class="flex items-center">
78
+ <div class="w-10 h-10 bg-grayscale-300 rounded-full"></div>
79
+ <div class="ml-3">
80
+ <div class="text-sm font-medium">John Doe</div>
81
+ <div class="text-xs text-grayscale-500">Admin</div>
82
+ </div>
83
+ <button class="ml-auto p-2 text-grayscale-500 hover:text-grayscale-700">
84
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"></path></svg>
85
+ </button>
86
+ </div>
87
+ <% end %>
88
+ <% end %>
89
+
90
+ <% layout.with_main do %>
91
+ <div class="p-6 bg-grayscale-50 min-h-full">
92
+ <div class="mb-6">
93
+ <h1 class="text-2xl font-bold text-grayscale-900">Dashboard Overview</h1>
94
+ <p class="text-grayscale-600">Welcome back, John! Here's what's happening with your store today.</p>
95
+ </div>
96
+
97
+ <!-- Stats Grid -->
98
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
99
+ <div class="bg-white p-6 rounded-lg border border-grayscale-200">
100
+ <div class="flex items-center justify-between">
101
+ <div>
102
+ <div class="text-sm font-medium text-grayscale-500">Total Revenue</div>
103
+ <div class="text-2xl font-bold text-grayscale-900">$45,231</div>
104
+ </div>
105
+ <div class="w-12 h-12 bg-success-50 rounded-lg flex items-center justify-center">
106
+ <svg class="w-6 h-6 text-success-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
107
+ </div>
108
+ </div>
109
+ <div class="mt-2 text-sm text-success-600">+20.1% from last month</div>
110
+ </div>
111
+ <div class="bg-white p-6 rounded-lg border border-grayscale-200">
112
+ <div class="flex items-center justify-between">
113
+ <div>
114
+ <div class="text-sm font-medium text-grayscale-500">Orders</div>
115
+ <div class="text-2xl font-bold text-grayscale-900">+2,350</div>
116
+ </div>
117
+ <div class="w-12 h-12 bg-primary-50 rounded-lg flex items-center justify-center">
118
+ <svg class="w-6 h-6 text-primary-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z"></path></svg>
119
+ </div>
120
+ </div>
121
+ <div class="mt-2 text-sm text-success-600">+180 from yesterday</div>
122
+ </div>
123
+ <div class="bg-white p-6 rounded-lg border border-grayscale-200">
124
+ <div class="flex items-center justify-between">
125
+ <div>
126
+ <div class="text-sm font-medium text-grayscale-500">Customers</div>
127
+ <div class="text-2xl font-bold text-grayscale-900">+12,234</div>
128
+ </div>
129
+ <div class="w-12 h-12 bg-accent-50 rounded-lg flex items-center justify-center">
130
+ <svg class="w-6 h-6 text-accent-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path></svg>
131
+ </div>
132
+ </div>
133
+ <div class="mt-2 text-sm text-success-600">+19% from last month</div>
134
+ </div>
135
+ <div class="bg-white p-6 rounded-lg border border-grayscale-200">
136
+ <div class="flex items-center justify-between">
137
+ <div>
138
+ <div class="text-sm font-medium text-grayscale-500">Active Now</div>
139
+ <div class="text-2xl font-bold text-grayscale-900">+573</div>
140
+ </div>
141
+ <div class="w-12 h-12 bg-info-50 rounded-lg flex items-center justify-center">
142
+ <svg class="w-6 h-6 text-info-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path></svg>
143
+ </div>
144
+ </div>
145
+ <div class="mt-2 text-sm text-success-600">+201 since last hour</div>
146
+ </div>
147
+ </div>
148
+
149
+ <!-- Recent Activity -->
150
+ <div class="bg-white rounded-lg border border-grayscale-200">
151
+ <div class="p-4 border-b border-grayscale-200">
152
+ <h2 class="text-lg font-semibold">Recent Activity</h2>
153
+ </div>
154
+ <div class="p-4">
155
+ <div class="space-y-4">
156
+ <div class="flex items-center">
157
+ <div class="w-10 h-10 bg-success-100 rounded-full flex items-center justify-center">
158
+ <svg class="w-5 h-5 text-success-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
159
+ </div>
160
+ <div class="ml-4">
161
+ <div class="text-sm font-medium">Order #12345 completed</div>
162
+ <div class="text-xs text-grayscale-500">2 minutes ago</div>
163
+ </div>
164
+ </div>
165
+ <div class="flex items-center">
166
+ <div class="w-10 h-10 bg-primary-100 rounded-full flex items-center justify-center">
167
+ <svg class="w-5 h-5 text-primary-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path></svg>
168
+ </div>
169
+ <div class="ml-4">
170
+ <div class="text-sm font-medium">New customer registered</div>
171
+ <div class="text-xs text-grayscale-500">15 minutes ago</div>
172
+ </div>
173
+ </div>
174
+ <div class="flex items-center">
175
+ <div class="w-10 h-10 bg-warning-100 rounded-full flex items-center justify-center">
176
+ <svg class="w-5 h-5 text-warning-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg>
177
+ </div>
178
+ <div class="ml-4">
179
+ <div class="text-sm font-medium">Low stock alert: Product SKU-789</div>
180
+ <div class="text-xs text-grayscale-500">1 hour ago</div>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ <% end %>
188
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <%= render BetterUi::Drawer::LayoutComponent.new do |layout| %>
2
+ <% layout.with_header do |header| %>
3
+ <% header.with_logo { "BetterUI" } %>
4
+ <% end %>
5
+
6
+ <% layout.with_sidebar do |sidebar| %>
7
+ <% sidebar.with_navigation do %>
8
+ <nav class="space-y-2">
9
+ <a href="#" class="block px-4 py-2 rounded-md bg-primary-50 text-primary-700">Dashboard</a>
10
+ <a href="#" class="block px-4 py-2 rounded-md hover:bg-grayscale-100">Projects</a>
11
+ <a href="#" class="block px-4 py-2 rounded-md hover:bg-grayscale-100">Team</a>
12
+ </nav>
13
+ <% end %>
14
+ <% end %>
15
+
16
+ <% layout.with_main do %>
17
+ <div class="p-6">
18
+ <h1 class="text-2xl font-bold mb-4">Welcome to BetterUI</h1>
19
+ <p class="text-grayscale-600">This is the default drawer layout with header and sidebar.</p>
20
+ </div>
21
+ <% end %>
22
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <%= render BetterUi::Drawer::LayoutComponent.new do |layout| %>
2
+ <% layout.with_header(variant: :primary) do |header| %>
3
+ <% header.with_mobile_menu_button do %>
4
+ <button class="p-2 text-white hover:bg-white/10 rounded-md lg:hidden" data-action="click->better-ui--drawer--layout#toggle">
5
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg>
6
+ </button>
7
+ <% end %>
8
+ <% header.with_logo do %>
9
+ <div class="flex items-center">
10
+ <div class="w-8 h-8 bg-white/20 rounded-lg flex items-center justify-center text-white font-bold">B</div>
11
+ <span class="ml-2 font-semibold text-lg">Primary Theme</span>
12
+ </div>
13
+ <% end %>
14
+ <% header.with_actions do %>
15
+ <div class="w-8 h-8 bg-white/20 rounded-full"></div>
16
+ <% end %>
17
+ <% end %>
18
+
19
+ <% layout.with_sidebar(variant: :primary) do |sidebar| %>
20
+ <% sidebar.with_navigation do %>
21
+ <nav class="space-y-1">
22
+ <a href="#" class="flex items-center px-4 py-2 rounded-md bg-white/20 text-white">Dashboard</a>
23
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-white/10 text-primary-100">Projects</a>
24
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-white/10 text-primary-100">Team</a>
25
+ <a href="#" class="flex items-center px-4 py-2 rounded-md hover:bg-white/10 text-primary-100">Settings</a>
26
+ </nav>
27
+ <% end %>
28
+ <% end %>
29
+
30
+ <% layout.with_main do %>
31
+ <div class="p-6">
32
+ <h1 class="text-2xl font-bold mb-4">Primary Theme Layout</h1>
33
+ <p class="text-grayscale-600">This demonstrates a primary-colored drawer layout. The header uses the primary variant and the sidebar uses the primary variant as well.</p>
34
+ </div>
35
+ <% end %>
36
+ <% end %>
@@ -0,0 +1,44 @@
1
+ <%= render BetterUi::Drawer::LayoutComponent.new(sidebar_position: :right) do |layout| %>
2
+ <% layout.with_header do |header| %>
3
+ <% header.with_logo { "Right Sidebar Layout" } %>
4
+ <% header.with_mobile_menu_button do %>
5
+ <button class="p-2 text-grayscale-600 hover:bg-grayscale-100 rounded-md lg:hidden" data-action="click->better-ui--drawer--layout#toggle">
6
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg>
7
+ </button>
8
+ <% end %>
9
+ <% end %>
10
+
11
+ <% layout.with_sidebar(position: :right) do |sidebar| %>
12
+ <% sidebar.with_header { "Details" } %>
13
+ <% sidebar.with_navigation do %>
14
+ <div class="space-y-4">
15
+ <div>
16
+ <div class="text-sm font-medium text-grayscale-500">Status</div>
17
+ <div class="mt-1 text-success-600 font-medium">Active</div>
18
+ </div>
19
+ <div>
20
+ <div class="text-sm font-medium text-grayscale-500">Created</div>
21
+ <div class="mt-1">Dec 15, 2024</div>
22
+ </div>
23
+ <div>
24
+ <div class="text-sm font-medium text-grayscale-500">Modified</div>
25
+ <div class="mt-1">Dec 20, 2024</div>
26
+ </div>
27
+ <div>
28
+ <div class="text-sm font-medium text-grayscale-500">Owner</div>
29
+ <div class="mt-1 flex items-center">
30
+ <div class="w-6 h-6 bg-primary-500 rounded-full mr-2"></div>
31
+ John Doe
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <% end %>
36
+ <% end %>
37
+
38
+ <% layout.with_main do %>
39
+ <div class="p-6">
40
+ <h1 class="text-2xl font-bold mb-4">Right Sidebar Layout</h1>
41
+ <p class="text-grayscale-600">This layout has the sidebar positioned on the right side. Useful for detail panels, property inspectors, or contextual information.</p>
42
+ </div>
43
+ <% end %>
44
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <%= render BetterUi::Drawer::LayoutComponent.new do |layout| %>
2
+ <% layout.with_header do |header| %>
3
+ <% header.with_logo { "Header Only Layout" } %>
4
+ <% header.with_navigation do %>
5
+ <nav class="flex gap-6">
6
+ <a href="#" class="text-grayscale-600 hover:text-grayscale-900">Home</a>
7
+ <a href="#" class="text-grayscale-600 hover:text-grayscale-900">About</a>
8
+ <a href="#" class="text-grayscale-600 hover:text-grayscale-900">Contact</a>
9
+ </nav>
10
+ <% end %>
11
+ <% header.with_actions { "Login" } %>
12
+ <% end %>
13
+
14
+ <% layout.with_main do %>
15
+ <div class="p-6">
16
+ <h1 class="text-2xl font-bold mb-4">Layout with Header Only</h1>
17
+ <p class="text-grayscale-600">This layout has only a header, no sidebar. The main content takes up the full width.</p>
18
+ </div>
19
+ <% end %>
20
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <%= render BetterUi::Drawer::LayoutComponent.new do |layout| %>
2
+ <% layout.with_sidebar do |sidebar| %>
3
+ <% sidebar.with_header { "Sidebar Only" } %>
4
+ <% sidebar.with_navigation do %>
5
+ <nav class="space-y-2">
6
+ <a href="#" class="block px-4 py-2 rounded-md bg-primary-50 text-primary-700">Dashboard</a>
7
+ <a href="#" class="block px-4 py-2 rounded-md hover:bg-grayscale-100">Projects</a>
8
+ <a href="#" class="block px-4 py-2 rounded-md hover:bg-grayscale-100">Team</a>
9
+ <a href="#" class="block px-4 py-2 rounded-md hover:bg-grayscale-100">Settings</a>
10
+ </nav>
11
+ <% end %>
12
+ <% sidebar.with_footer { "v1.0.0" } %>
13
+ <% end %>
14
+
15
+ <% layout.with_main do %>
16
+ <div class="p-6">
17
+ <h1 class="text-2xl font-bold mb-4">Layout with Sidebar Only</h1>
18
+ <p class="text-grayscale-600">This layout has only a sidebar, no header. Useful for applications that don't need a top navigation.</p>
19
+ </div>
20
+ <% end %>
21
+ <% end %>
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterUi
4
+ module Drawer
5
+ # @label Layout
6
+ class LayoutComponentPreview < ViewComponent::Preview
7
+ # @label Default
8
+ # @display max_height 600px
9
+ def default
10
+ render_with_template
11
+ end
12
+
13
+ # @label With Header Only
14
+ # @display max_height 400px
15
+ def with_header_only
16
+ render_with_template
17
+ end
18
+
19
+ # @label With Sidebar Only
20
+ # @display max_height 400px
21
+ def with_sidebar_only
22
+ render_with_template
23
+ end
24
+
25
+ # @label Complete Layout
26
+ # @display max_height 600px
27
+ def complete_layout
28
+ render_with_template
29
+ end
30
+
31
+ # @label Right Sidebar
32
+ # @display max_height 600px
33
+ def right_sidebar
34
+ render_with_template
35
+ end
36
+
37
+ # @label Dark Theme
38
+ # @display max_height 600px
39
+ # @display bg_color #111827
40
+ def dark_theme
41
+ render_with_template
42
+ end
43
+
44
+ # @label Primary Theme
45
+ # @display max_height 600px
46
+ def primary_theme
47
+ render_with_template
48
+ end
49
+
50
+ # @label Dashboard Example
51
+ # @display max_height 700px
52
+ def dashboard_example
53
+ render_with_template
54
+ end
55
+
56
+ # @label Playground
57
+ # @display max_height 600px
58
+ # @param sidebar_position select { choices: [left, right] }
59
+ # @param sidebar_breakpoint select { choices: [md, lg, xl] }
60
+ # @param header_variant select { choices: [light, dark, transparent, primary] }
61
+ # @param sidebar_variant select { choices: [light, dark, primary] }
62
+ def playground(sidebar_position: :left, sidebar_breakpoint: :lg, header_variant: :light, sidebar_variant: :light)
63
+ render BetterUi::Drawer::LayoutComponent.new(
64
+ sidebar_position: sidebar_position.to_sym,
65
+ sidebar_breakpoint: sidebar_breakpoint.to_sym
66
+ ) do |layout|
67
+ layout.with_header(variant: header_variant.to_sym) do |header|
68
+ header.with_mobile_menu_button do
69
+ "<button class='p-2 rounded-md lg:hidden' data-action='click->better-ui--drawer--layout#toggle'>
70
+ <svg class='w-6 h-6' fill='none' stroke='currentColor' viewBox='0 0 24 24'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 6h16M4 12h16M4 18h16'></path></svg>
71
+ </button>".html_safe
72
+ end
73
+ header.with_logo { "Playground" }
74
+ header.with_actions { "Actions" }
75
+ end
76
+
77
+ layout.with_sidebar(variant: sidebar_variant.to_sym, position: sidebar_position.to_sym) do |sidebar|
78
+ sidebar.with_navigation { "Navigation" }
79
+ end
80
+
81
+ layout.with_main do
82
+ "<div class='p-6'>
83
+ <h1 class='text-2xl font-bold mb-4'>Main Content</h1>
84
+ <p>This is the main content area.</p>
85
+ </div>".html_safe
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,55 @@
1
+ <nav class="space-y-6 w-64 p-4 bg-white border rounded-lg">
2
+ <%= render BetterUi::Drawer::NavGroupComponent.new(title: "Main") do |group| %>
3
+ <% group.with_item(label: "Dashboard", href: "#", active: true) do |item| %>
4
+ <% item.with_icon do %>
5
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path></svg>
6
+ <% end %>
7
+ <% end %>
8
+ <% group.with_item(label: "Analytics", href: "#") do |item| %>
9
+ <% item.with_icon do %>
10
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path></svg>
11
+ <% end %>
12
+ <% end %>
13
+ <% group.with_item(label: "Revenue", href: "#") do |item| %>
14
+ <% item.with_icon do %>
15
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
16
+ <% end %>
17
+ <% end %>
18
+ <% group.with_item(label: "Customers", href: "#") do |item| %>
19
+ <% item.with_icon do %>
20
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path></svg>
21
+ <% end %>
22
+ <% end %>
23
+ <% end %>
24
+
25
+ <%= render BetterUi::Drawer::NavGroupComponent.new(title: "Reports") do |group| %>
26
+ <% group.with_item(label: "Monthly", href: "#") do |item| %>
27
+ <% item.with_icon do %>
28
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg>
29
+ <% end %>
30
+ <% end %>
31
+ <% group.with_item(label: "Annual", href: "#") do |item| %>
32
+ <% item.with_icon do %>
33
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><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"></path></svg>
34
+ <% end %>
35
+ <% end %>
36
+ <% end %>
37
+
38
+ <%= render BetterUi::Drawer::NavGroupComponent.new(title: "Settings") do |group| %>
39
+ <% group.with_item(label: "Settings", href: "#") do |item| %>
40
+ <% item.with_icon do %>
41
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>
42
+ <% end %>
43
+ <% end %>
44
+ <% group.with_item(label: "Help", href: "#") do |item| %>
45
+ <% item.with_icon do %>
46
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
47
+ <% end %>
48
+ <% end %>
49
+ <% group.with_item(label: "Logout", href: "#", method: :delete) do |item| %>
50
+ <% item.with_icon do %>
51
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"></path></svg>
52
+ <% end %>
53
+ <% end %>
54
+ <% end %>
55
+ </nav>