kaze 1.3.1 → 2.0.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 (263) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -1
  3. data/README.md +1 -1
  4. data/lib/kaze/commands/app/hotwire_stack.rb +2 -0
  5. data/lib/kaze/commands/app/inertia_react_stack.rb +5 -1
  6. data/lib/kaze/commands/app/inertia_vue_stack.rb +5 -1
  7. data/lib/kaze/commands/app.rb +9 -2
  8. data/lib/kaze/version.rb +1 -1
  9. data/stubs/default/config/routes.rb +11 -4
  10. data/stubs/default/test/integration/appearance_test.rb +11 -0
  11. data/stubs/default/test/integration/password_update_test.rb +9 -1
  12. data/stubs/hotwire/app/assets/tailwind/application.css +123 -0
  13. data/stubs/hotwire/app/components/breadcrumbs_component.rb +32 -0
  14. data/stubs/hotwire/app/components/danger_button_component.rb +1 -1
  15. data/stubs/hotwire/app/components/dropdown_component.html.erb +2 -2
  16. data/stubs/hotwire/app/components/dropdown_component.rb +5 -1
  17. data/stubs/hotwire/app/components/dropdown_link_component.rb +1 -1
  18. data/stubs/hotwire/app/components/heading_component.rb +19 -0
  19. data/stubs/hotwire/app/components/icon_component.rb +30 -0
  20. data/stubs/hotwire/app/components/input_error_component.rb +1 -1
  21. data/stubs/hotwire/app/components/input_label_component.rb +3 -3
  22. data/stubs/hotwire/app/components/modal_component.html.erb +2 -2
  23. data/stubs/hotwire/app/components/primary_button_component.rb +1 -1
  24. data/stubs/hotwire/app/components/secondary_button_component.rb +1 -1
  25. data/stubs/hotwire/app/components/sidebar_menu_button_component.rb +25 -0
  26. data/stubs/hotwire/app/components/text_input_component.rb +1 -1
  27. data/stubs/hotwire/app/components/user_avatar_component.rb +27 -0
  28. data/stubs/hotwire/app/controllers/application_controller.rb +1 -0
  29. data/stubs/hotwire/app/controllers/concerns/sidebar_state.rb +14 -0
  30. data/stubs/hotwire/app/controllers/settings/appearance_controller.rb +7 -0
  31. data/stubs/hotwire/app/controllers/settings/password_controller.rb +19 -0
  32. data/stubs/hotwire/app/controllers/{profile_controller.rb → settings/profile_controller.rb} +3 -4
  33. data/stubs/hotwire/app/views/auth/login.html.erb +1 -1
  34. data/stubs/hotwire/app/views/dashboard/index.html.erb +6 -11
  35. data/stubs/hotwire/app/views/layouts/_appearance.html.erb +18 -0
  36. data/stubs/hotwire/app/views/layouts/_settings.html.erb +26 -0
  37. data/stubs/hotwire/app/views/layouts/_sidebar.html.erb +56 -0
  38. data/stubs/hotwire/app/views/layouts/_sidebar_header.html.erb +11 -0
  39. data/stubs/hotwire/app/views/layouts/_sidebar_user.html.erb +34 -0
  40. data/stubs/hotwire/app/views/layouts/application.html.erb +25 -15
  41. data/stubs/hotwire/app/views/layouts/guest.html.erb +1 -0
  42. data/stubs/hotwire/app/views/settings/appearance/_update_appearance_form.html.erb +28 -0
  43. data/stubs/hotwire/app/views/settings/appearance/edit.html.erb +10 -0
  44. data/stubs/hotwire/app/views/{profile/partials → settings/password}/_update_password_form.html.erb +2 -10
  45. data/stubs/hotwire/app/views/settings/password/edit.html.erb +10 -0
  46. data/stubs/hotwire/app/views/{profile/partials → settings/profile}/_confirm_user_deletion_modal.html.erb +2 -2
  47. data/stubs/hotwire/app/views/settings/profile/_delete_user_form.html.erb +6 -0
  48. data/stubs/hotwire/app/views/{profile/partials → settings/profile}/_update_profile_information_form.html.erb +4 -12
  49. data/stubs/hotwire/app/views/{profile → settings/profile}/destroy.turbo_stream.erb +1 -1
  50. data/stubs/hotwire/app/views/settings/profile/edit.html.erb +14 -0
  51. data/stubs/hotwire/app/views/welcome/index.html.erb +1 -0
  52. data/stubs/inertia-common/app/controllers/concerns/handle_inertia_requests.rb +4 -1
  53. data/stubs/inertia-common/app/controllers/settings/appearance_controller.rb +7 -0
  54. data/stubs/inertia-common/app/controllers/settings/password_controller.rb +17 -0
  55. data/stubs/inertia-common/app/controllers/{profile_controller.rb → settings/profile_controller.rb} +2 -2
  56. data/stubs/inertia-common/test/integration/appearance_test.rb +11 -0
  57. data/stubs/inertia-common/test/integration/password_update_test.rb +10 -2
  58. data/stubs/inertia-react-ts/app/assets/tailwind/application.css +124 -0
  59. data/stubs/inertia-react-ts/app/javascript/Components/AppLogo.tsx +17 -0
  60. data/stubs/inertia-react-ts/app/javascript/Components/AppShell.tsx +9 -0
  61. data/stubs/inertia-react-ts/app/javascript/Components/AppSidebar.tsx +65 -0
  62. data/stubs/inertia-react-ts/app/javascript/Components/AppSidebarHeader.tsx +14 -0
  63. data/stubs/inertia-react-ts/app/javascript/Components/Breadcrumbs.tsx +43 -0
  64. data/stubs/inertia-react-ts/app/javascript/Components/Heading.tsx +19 -0
  65. data/stubs/inertia-react-ts/app/javascript/Components/InputError.tsx +1 -1
  66. data/stubs/inertia-react-ts/app/javascript/Components/NavFooter.tsx +32 -0
  67. data/stubs/inertia-react-ts/app/javascript/Components/NavMain.tsx +32 -0
  68. data/stubs/inertia-react-ts/app/javascript/Components/NavUser.tsx +39 -0
  69. data/stubs/inertia-react-ts/app/javascript/Components/UserInfo.tsx +23 -0
  70. data/stubs/inertia-react-ts/app/javascript/Components/UserMenuContent.tsx +57 -0
  71. data/stubs/inertia-react-ts/app/javascript/Components/ui/avatar.tsx +51 -0
  72. data/stubs/inertia-react-ts/app/javascript/Components/ui/breadcrumb.tsx +109 -0
  73. data/stubs/inertia-react-ts/app/javascript/Components/ui/button.tsx +49 -0
  74. data/stubs/inertia-react-ts/app/javascript/Components/ui/checkbox.tsx +27 -0
  75. data/stubs/inertia-react-ts/app/javascript/Components/ui/dialog.tsx +109 -0
  76. data/stubs/inertia-react-ts/app/javascript/Components/ui/dropdown-menu.tsx +217 -0
  77. data/stubs/inertia-react-ts/app/javascript/Components/ui/input.tsx +21 -0
  78. data/stubs/inertia-react-ts/app/javascript/Components/ui/label.tsx +19 -0
  79. data/stubs/inertia-react-ts/app/javascript/Components/ui/separator.tsx +26 -0
  80. data/stubs/inertia-react-ts/app/javascript/Components/ui/sheet.tsx +137 -0
  81. data/stubs/inertia-react-ts/app/javascript/Components/ui/sidebar.tsx +719 -0
  82. data/stubs/inertia-react-ts/app/javascript/Components/ui/skeleton.tsx +13 -0
  83. data/stubs/inertia-react-ts/app/javascript/Components/ui/tooltip.tsx +55 -0
  84. data/stubs/inertia-react-ts/app/javascript/Layouts/AuthenticatedLayout.tsx +19 -127
  85. data/stubs/inertia-react-ts/app/javascript/Layouts/GuestLayout.tsx +2 -2
  86. data/stubs/inertia-react-ts/app/javascript/Layouts/SettingsLayout.tsx +57 -0
  87. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ForgotPassword.tsx +6 -6
  88. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Login.tsx +17 -12
  89. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Register.tsx +14 -14
  90. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ResetPassword.tsx +10 -10
  91. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/VerifyEmail.tsx +2 -2
  92. data/stubs/inertia-react-ts/app/javascript/Pages/Dashboard.tsx +13 -8
  93. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Appearance.tsx +33 -0
  94. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Partials/DeleteUserForm.tsx +107 -0
  95. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Partials/UpdateAppearanceForm.tsx +41 -0
  96. data/stubs/inertia-react-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdatePasswordForm.tsx +12 -20
  97. data/stubs/inertia-react-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdateProfileInformationForm.tsx +13 -21
  98. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Password.tsx +33 -0
  99. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Profile.tsx +35 -0
  100. data/stubs/inertia-react-ts/app/javascript/entrypoints/application.tsx +6 -1
  101. data/stubs/inertia-react-ts/app/javascript/hooks/use-initials.tsx +23 -0
  102. data/stubs/inertia-react-ts/app/javascript/hooks/use-mobile-navigation.tsx +11 -0
  103. data/stubs/inertia-react-ts/app/javascript/hooks/use-mobile.tsx +36 -0
  104. data/stubs/inertia-react-ts/app/javascript/lib/appearance.ts +22 -0
  105. data/stubs/inertia-react-ts/app/javascript/lib/utils.ts +6 -0
  106. data/stubs/inertia-react-ts/app/javascript/types/global.d.ts +2 -2
  107. data/stubs/inertia-react-ts/app/javascript/types/index.d.ts +14 -0
  108. data/stubs/inertia-react-ts/app/views/layouts/application.html.erb +19 -1
  109. data/stubs/inertia-react-ts/components.json +21 -0
  110. data/stubs/inertia-react-ts/package.json +13 -0
  111. data/stubs/inertia-vue-ts/app/assets/tailwind/application.css +124 -0
  112. data/stubs/inertia-vue-ts/app/javascript/Components/AppLogo.vue +17 -0
  113. data/stubs/inertia-vue-ts/app/javascript/Components/AppShell.vue +12 -0
  114. data/stubs/inertia-vue-ts/app/javascript/Components/AppSidebar.vue +65 -0
  115. data/stubs/inertia-vue-ts/app/javascript/Components/AppSidebarHeader.vue +20 -0
  116. data/stubs/inertia-vue-ts/app/javascript/Components/Breadcrumbs.vue +32 -0
  117. data/stubs/inertia-vue-ts/app/javascript/Components/Heading.vue +15 -0
  118. data/stubs/inertia-vue-ts/app/javascript/Components/InputError.vue +1 -1
  119. data/stubs/inertia-vue-ts/app/javascript/Components/NavFooter.vue +33 -0
  120. data/stubs/inertia-vue-ts/app/javascript/Components/NavMain.vue +32 -0
  121. data/stubs/inertia-vue-ts/app/javascript/Components/NavUser.vue +40 -0
  122. data/stubs/inertia-vue-ts/app/javascript/Components/UserInfo.vue +25 -0
  123. data/stubs/inertia-vue-ts/app/javascript/Components/UserMenuContent.vue +47 -0
  124. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/Avatar.vue +18 -0
  125. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/AvatarFallback.vue +21 -0
  126. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/AvatarImage.vue +16 -0
  127. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/index.ts +3 -0
  128. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/Breadcrumb.vue +17 -0
  129. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbEllipsis.vue +23 -0
  130. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbItem.vue +17 -0
  131. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbLink.vue +21 -0
  132. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbList.vue +17 -0
  133. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbPage.vue +20 -0
  134. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbSeparator.vue +22 -0
  135. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/index.ts +7 -0
  136. data/stubs/inertia-vue-ts/app/javascript/Components/ui/button/Button.vue +31 -0
  137. data/stubs/inertia-vue-ts/app/javascript/Components/ui/button/index.ts +34 -0
  138. data/stubs/inertia-vue-ts/app/javascript/Components/ui/checkbox/Checkbox.vue +35 -0
  139. data/stubs/inertia-vue-ts/app/javascript/Components/ui/checkbox/index.ts +1 -0
  140. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/Dialog.vue +15 -0
  141. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogClose.vue +12 -0
  142. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogContent.vue +52 -0
  143. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogDescription.vue +23 -0
  144. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogFooter.vue +25 -0
  145. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogHeader.vue +14 -0
  146. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogOverlay.vue +26 -0
  147. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogTitle.vue +23 -0
  148. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogTrigger.vue +12 -0
  149. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/index.ts +9 -0
  150. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenu.vue +15 -0
  151. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuContent.vue +37 -0
  152. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
  153. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuItem.vue +41 -0
  154. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  155. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  156. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuTrigger.vue +14 -0
  157. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/index.ts +7 -0
  158. data/stubs/inertia-vue-ts/app/javascript/Components/ui/input/Input.vue +50 -0
  159. data/stubs/inertia-vue-ts/app/javascript/Components/ui/input/index.ts +1 -0
  160. data/stubs/inertia-vue-ts/app/javascript/Components/ui/label/Label.vue +26 -0
  161. data/stubs/inertia-vue-ts/app/javascript/Components/ui/label/index.ts +1 -0
  162. data/stubs/inertia-vue-ts/app/javascript/Components/ui/separator/Separator.vue +29 -0
  163. data/stubs/inertia-vue-ts/app/javascript/Components/ui/separator/index.ts +1 -0
  164. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/Sheet.vue +19 -0
  165. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetClose.vue +15 -0
  166. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetContent.vue +62 -0
  167. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetDescription.vue +21 -0
  168. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetFooter.vue +16 -0
  169. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetHeader.vue +15 -0
  170. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetOverlay.vue +21 -0
  171. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetTitle.vue +21 -0
  172. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetTrigger.vue +15 -0
  173. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/index.ts +8 -0
  174. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/Sidebar.vue +96 -0
  175. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarContent.vue +18 -0
  176. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarFooter.vue +18 -0
  177. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroup.vue +18 -0
  178. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupAction.vue +27 -0
  179. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupContent.vue +18 -0
  180. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupLabel.vue +25 -0
  181. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarHeader.vue +18 -0
  182. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarInput.vue +22 -0
  183. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarInset.vue +21 -0
  184. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenu.vue +18 -0
  185. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuAction.vue +35 -0
  186. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuBadge.vue +26 -0
  187. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuButton.vue +48 -0
  188. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuButtonChild.vue +36 -0
  189. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuItem.vue +18 -0
  190. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSkeleton.vue +35 -0
  191. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSub.vue +22 -0
  192. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSubButton.vue +36 -0
  193. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
  194. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarProvider.vue +82 -0
  195. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarRail.vue +33 -0
  196. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarSeparator.vue +19 -0
  197. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarTrigger.vue +28 -0
  198. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/index.ts +60 -0
  199. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/utils.ts +19 -0
  200. data/stubs/inertia-vue-ts/app/javascript/Components/ui/skeleton/Skeleton.vue +17 -0
  201. data/stubs/inertia-vue-ts/app/javascript/Components/ui/skeleton/index.ts +1 -0
  202. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/Tooltip.vue +19 -0
  203. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipContent.vue +34 -0
  204. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipProvider.vue +14 -0
  205. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipTrigger.vue +15 -0
  206. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/index.ts +4 -0
  207. data/stubs/inertia-vue-ts/app/javascript/Layouts/AuthenticatedLayout.vue +17 -147
  208. data/stubs/inertia-vue-ts/app/javascript/Layouts/SettingsLayout.vue +57 -0
  209. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ForgotPassword.vue +7 -7
  210. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Login.vue +10 -12
  211. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Register.vue +12 -14
  212. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ResetPassword.vue +8 -10
  213. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/VerifyEmail.vue +3 -3
  214. data/stubs/inertia-vue-ts/app/javascript/Pages/Dashboard.vue +15 -10
  215. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Appearance.vue +33 -0
  216. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Partials/DeleteUserForm.vue +96 -0
  217. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Partials/UpdateAppearanceForm.vue +42 -0
  218. data/stubs/inertia-vue-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdatePasswordForm.vue +12 -20
  219. data/stubs/inertia-vue-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdateProfileInformationForm.vue +12 -20
  220. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Password.vue +33 -0
  221. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Profile.vue +40 -0
  222. data/stubs/inertia-vue-ts/app/javascript/composables/useInitials.ts +29 -0
  223. data/stubs/inertia-vue-ts/app/javascript/lib/appearance.ts +22 -0
  224. data/stubs/inertia-vue-ts/app/javascript/lib/utils.ts +6 -0
  225. data/stubs/inertia-vue-ts/app/javascript/types/index.d.ts +14 -0
  226. data/stubs/inertia-vue-ts/app/javascript/types/vue-shims.d.ts +10 -0
  227. data/stubs/inertia-vue-ts/app/views/layouts/application.html.erb +19 -1
  228. data/stubs/inertia-vue-ts/components.json +20 -0
  229. data/stubs/inertia-vue-ts/package.json +8 -1
  230. data/stubs/inertia-vue-ts/vite.config.ts +25 -1
  231. metadata +174 -43
  232. data/stubs/hotwire/app/components/nav_link_component.rb +0 -15
  233. data/stubs/hotwire/app/components/responsive_nav_link_component.rb +0 -15
  234. data/stubs/hotwire/app/controllers/password_controller.rb +0 -13
  235. data/stubs/hotwire/app/views/layouts/_navigation.html.erb +0 -82
  236. data/stubs/hotwire/app/views/profile/edit.html.erb +0 -24
  237. data/stubs/hotwire/app/views/profile/partials/_delete_user_form.html.erb +0 -14
  238. data/stubs/inertia-common/app/controllers/password_controller.rb +0 -13
  239. data/stubs/inertia-react-ts/app/javascript/Components/Checkbox.tsx +0 -11
  240. data/stubs/inertia-react-ts/app/javascript/Components/DangerButton.tsx +0 -20
  241. data/stubs/inertia-react-ts/app/javascript/Components/Dropdown.tsx +0 -100
  242. data/stubs/inertia-react-ts/app/javascript/Components/InputLabel.tsx +0 -14
  243. data/stubs/inertia-react-ts/app/javascript/Components/Modal.tsx +0 -66
  244. data/stubs/inertia-react-ts/app/javascript/Components/NavLink.tsx +0 -21
  245. data/stubs/inertia-react-ts/app/javascript/Components/PrimaryButton.tsx +0 -20
  246. data/stubs/inertia-react-ts/app/javascript/Components/ResponsiveNavLink.tsx +0 -21
  247. data/stubs/inertia-react-ts/app/javascript/Components/SecondaryButton.tsx +0 -22
  248. data/stubs/inertia-react-ts/app/javascript/Components/TextInput.tsx +0 -32
  249. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Edit.tsx +0 -32
  250. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.tsx +0 -102
  251. data/stubs/inertia-vue-ts/app/javascript/Components/Checkbox.vue +0 -29
  252. data/stubs/inertia-vue-ts/app/javascript/Components/DangerButton.vue +0 -7
  253. data/stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue +0 -75
  254. data/stubs/inertia-vue-ts/app/javascript/Components/DropdownLink.vue +0 -16
  255. data/stubs/inertia-vue-ts/app/javascript/Components/InputLabel.vue +0 -12
  256. data/stubs/inertia-vue-ts/app/javascript/Components/Modal.vue +0 -109
  257. data/stubs/inertia-vue-ts/app/javascript/Components/NavLink.vue +0 -21
  258. data/stubs/inertia-vue-ts/app/javascript/Components/PrimaryButton.vue +0 -7
  259. data/stubs/inertia-vue-ts/app/javascript/Components/ResponsiveNavLink.vue +0 -21
  260. data/stubs/inertia-vue-ts/app/javascript/Components/SecondaryButton.vue +0 -19
  261. data/stubs/inertia-vue-ts/app/javascript/Components/TextInput.vue +0 -23
  262. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Edit.vue +0 -38
  263. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.vue +0 -99
@@ -0,0 +1,13 @@
1
+ import { cn } from "@/lib/utils"
2
+
3
+ function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
4
+ return (
5
+ <div
6
+ data-slot="skeleton"
7
+ className={cn("bg-primary/10 animate-pulse rounded-md", className)}
8
+ {...props}
9
+ />
10
+ )
11
+ }
12
+
13
+ export { Skeleton }
@@ -0,0 +1,55 @@
1
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip"
2
+ import * as React from "react"
3
+
4
+ import { cn } from "@/lib/utils"
5
+
6
+ function TooltipProvider({
7
+ delayDuration = 0,
8
+ ...props
9
+ }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
10
+ return (
11
+ <TooltipPrimitive.Provider
12
+ data-slot="tooltip-provider"
13
+ delayDuration={delayDuration}
14
+ {...props}
15
+ />
16
+ )
17
+ }
18
+
19
+ function Tooltip({
20
+ ...props
21
+ }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
22
+ return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
23
+ }
24
+
25
+ function TooltipTrigger({
26
+ ...props
27
+ }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
28
+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
29
+ }
30
+
31
+ function TooltipContent({
32
+ className,
33
+ sideOffset = 4,
34
+ children,
35
+ ...props
36
+ }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
37
+ return (
38
+ <TooltipPrimitive.Portal>
39
+ <TooltipPrimitive.Content
40
+ data-slot="tooltip-content"
41
+ sideOffset={sideOffset}
42
+ className={cn(
43
+ "bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-w-sm rounded-md px-3 py-1.5 text-xs",
44
+ className
45
+ )}
46
+ {...props}
47
+ >
48
+ {children}
49
+ <TooltipPrimitive.Arrow className="bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
50
+ </TooltipPrimitive.Content>
51
+ </TooltipPrimitive.Portal>
52
+ )
53
+ }
54
+
55
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
@@ -1,130 +1,22 @@
1
- import { useState, PropsWithChildren, ReactNode } from 'react'
2
- import ApplicationLogo from '@/Components/ApplicationLogo'
3
- import Dropdown from '@/Components/Dropdown'
4
- import NavLink from '@/Components/NavLink'
5
- import ResponsiveNavLink from '@/Components/ResponsiveNavLink'
6
- import { Link, usePage } from '@inertiajs/react'
7
- import { dashboard_path, logout_path, profile_edit_path } from '@/routes'
8
-
9
- export default function AuthenticatedLayout({ header, children }: PropsWithChildren<{ header?: ReactNode }>) {
10
- const user = usePage().props.auth.user
11
-
12
- const [showingNavigationDropdown, setShowingNavigationDropdown] = useState(false)
13
-
14
- const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
15
-
1
+ import { PropsWithChildren } from 'react'
2
+ import AppShell from '@/Components/AppShell'
3
+ import AppSidebar from '@/Components/AppSidebar'
4
+ import AppSidebarHeader from '@/Components/AppSidebarHeader'
5
+ import { SidebarInset } from '@/Components/ui/sidebar'
6
+ import { BreadcrumbItem } from '@/types'
7
+
8
+ export default function AuthenticatedLayout({
9
+ breadcrumbs = [],
10
+ children,
11
+ }: PropsWithChildren<{ breadcrumbs?: BreadcrumbItem[] }>) {
16
12
  return (
17
- <div className="min-h-screen bg-gray-100">
18
- <nav className="bg-white border-b border-gray-100">
19
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
20
- <div className="flex justify-between h-16">
21
- <div className="flex">
22
- <div className="shrink-0 flex items-center">
23
- <Link href="/">
24
- <ApplicationLogo className="block h-9 w-auto fill-current text-red-800" />
25
- </Link>
26
- </div>
27
-
28
- <div className="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
29
- <NavLink href={dashboard_path()} active={pathname.match(/dashboard/) != null}>
30
- Dashboard
31
- </NavLink>
32
- </div>
33
- </div>
34
-
35
- <div className="hidden sm:flex sm:items-center sm:ms-6">
36
- <div className="ms-3 relative">
37
- <Dropdown>
38
- <Dropdown.Trigger>
39
- <span className="inline-flex rounded-md">
40
- <button
41
- type="button"
42
- className="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-hidden transition ease-in-out duration-150"
43
- >
44
- {user.name}
45
-
46
- <svg
47
- className="ms-2 -me-0.5 h-4 w-4"
48
- xmlns="http://www.w3.org/2000/svg"
49
- viewBox="0 0 20 20"
50
- fill="currentColor"
51
- >
52
- <path
53
- fillRule="evenodd"
54
- d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
55
- clipRule="evenodd"
56
- />
57
- </svg>
58
- </button>
59
- </span>
60
- </Dropdown.Trigger>
61
-
62
- <Dropdown.Content>
63
- <Dropdown.Link href={profile_edit_path()}>Profile</Dropdown.Link>
64
- <Dropdown.Link href={logout_path()} method="post" as="button">
65
- Log Out
66
- </Dropdown.Link>
67
- </Dropdown.Content>
68
- </Dropdown>
69
- </div>
70
- </div>
71
-
72
- <div className="-me-2 flex items-center sm:hidden">
73
- <button
74
- onClick={() => setShowingNavigationDropdown((previousState) => !previousState)}
75
- className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-hidden focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out"
76
- >
77
- <svg className="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
78
- <path
79
- className={!showingNavigationDropdown ? 'inline-flex' : 'hidden'}
80
- strokeLinecap="round"
81
- strokeLinejoin="round"
82
- strokeWidth="2"
83
- d="M4 6h16M4 12h16M4 18h16"
84
- />
85
- <path
86
- className={showingNavigationDropdown ? 'inline-flex' : 'hidden'}
87
- strokeLinecap="round"
88
- strokeLinejoin="round"
89
- strokeWidth="2"
90
- d="M6 18L18 6M6 6l12 12"
91
- />
92
- </svg>
93
- </button>
94
- </div>
95
- </div>
96
- </div>
97
-
98
- <div className={(showingNavigationDropdown ? 'block' : 'hidden') + ' sm:hidden'}>
99
- <div className="pt-2 pb-3 space-y-1">
100
- <ResponsiveNavLink href={dashboard_path()} active={pathname.match(/dashboard/) != null}>
101
- Dashboard
102
- </ResponsiveNavLink>
103
- </div>
104
-
105
- <div className="pt-4 pb-1 border-t border-gray-200">
106
- <div className="px-4">
107
- <div className="font-medium text-base text-gray-800">{user.name}</div>
108
- <div className="font-medium text-sm text-gray-500">{user.email}</div>
109
- </div>
110
-
111
- <div className="mt-3 space-y-1">
112
- <ResponsiveNavLink href={profile_edit_path()}>Profile</ResponsiveNavLink>
113
- <ResponsiveNavLink method="post" href={logout_path()} as="button">
114
- Log Out
115
- </ResponsiveNavLink>
116
- </div>
117
- </div>
118
- </div>
119
- </nav>
120
-
121
- {header && (
122
- <header className="bg-white shadow-sm">
123
- <div className="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">{header}</div>
124
- </header>
125
- )}
126
-
127
- <main>{children}</main>
128
- </div>
13
+ <AppShell>
14
+ <AppSidebar />
15
+
16
+ <SidebarInset className="min-w-0 overflow-x-clip">
17
+ <AppSidebarHeader breadcrumbs={breadcrumbs} />
18
+ {children}
19
+ </SidebarInset>
20
+ </AppShell>
129
21
  )
130
22
  }
@@ -4,14 +4,14 @@ import { PropsWithChildren } from 'react'
4
4
 
5
5
  export default function GuestLayout({ children }: PropsWithChildren) {
6
6
  return (
7
- <div className="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100">
7
+ <div className="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100 dark:bg-gray-900">
8
8
  <div>
9
9
  <Link href="/">
10
10
  <ApplicationLogo className="w-20 h-20 fill-current text-red-500" />
11
11
  </Link>
12
12
  </div>
13
13
 
14
- <div className="w-full sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md overflow-hidden sm:rounded-lg">
14
+ <div className="w-full sm:max-w-md mt-6 px-6 py-4 bg-white dark:bg-gray-800 shadow-md overflow-hidden sm:rounded-lg">
15
15
  {children}
16
16
  </div>
17
17
  </div>
@@ -0,0 +1,57 @@
1
+ import { PropsWithChildren } from 'react'
2
+ import { Link, usePage } from '@inertiajs/react'
3
+ import Heading from '@/Components/Heading'
4
+ import { Button } from '@/Components/ui/button'
5
+ import { Separator } from '@/Components/ui/separator'
6
+ import { cn } from '@/lib/utils'
7
+ import { appearance_edit_path, password_edit_path, profile_edit_path } from '@/routes'
8
+ import { NavItem } from '@/types'
9
+
10
+ const sidebarNavItems: NavItem[] = [
11
+ {
12
+ title: 'Profile',
13
+ href: profile_edit_path(),
14
+ },
15
+ {
16
+ title: 'Password',
17
+ href: password_edit_path(),
18
+ },
19
+ {
20
+ title: 'Appearance',
21
+ href: appearance_edit_path(),
22
+ },
23
+ ]
24
+
25
+ export default function SettingsLayout({ children }: PropsWithChildren) {
26
+ const { url } = usePage()
27
+
28
+ return (
29
+ <div className="px-4 py-6">
30
+ <Heading title="Settings" description="Manage your profile and account settings" />
31
+
32
+ <div className="flex flex-col lg:flex-row lg:space-x-12">
33
+ <aside className="w-full max-w-xl lg:w-48">
34
+ <nav className="flex flex-col space-y-1 space-x-0" aria-label="Settings">
35
+ {sidebarNavItems.map((item) => (
36
+ <Button
37
+ key={item.href}
38
+ size="sm"
39
+ variant="ghost"
40
+ asChild
41
+ className={cn('w-full justify-start', { 'bg-muted': url.startsWith(item.href) })}
42
+ >
43
+ <Link href={item.href}>{item.title}</Link>
44
+ </Button>
45
+ ))}
46
+ </nav>
47
+ </aside>
48
+
49
+ <Separator className="my-6 lg:hidden" />
50
+
51
+ <div className="flex-1 md:max-w-2xl">
52
+ <section className="max-w-xl space-y-12">{children}</section>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ )
57
+ }
@@ -1,7 +1,7 @@
1
1
  import GuestLayout from '@/Layouts/GuestLayout'
2
+ import { Button } from '@/Components/ui/button'
3
+ import { Input } from '@/Components/ui/input'
2
4
  import InputError from '@/Components/InputError'
3
- import PrimaryButton from '@/Components/PrimaryButton'
4
- import TextInput from '@/Components/TextInput'
5
5
  import { Head, useForm } from '@inertiajs/react'
6
6
  import { FormEventHandler } from 'react'
7
7
  import { password_email_path } from '@/routes'
@@ -29,22 +29,22 @@ export default function ForgotPassword({ status }: { status?: string }) {
29
29
  {status && <div className="mb-4 font-medium text-sm text-green-600 dark:text-green-400">{status}</div>}
30
30
 
31
31
  <form onSubmit={submit}>
32
- <TextInput
32
+ <Input
33
33
  id="email"
34
34
  type="email"
35
35
  name="email"
36
36
  value={data.email}
37
37
  className="mt-1 block w-full"
38
- isFocused={true}
38
+ autoFocus
39
39
  onChange={(e) => setData('email', e.target.value)}
40
40
  />
41
41
 
42
42
  <InputError message={errors.email} className="mt-2" />
43
43
 
44
44
  <div className="flex items-center justify-end mt-4">
45
- <PrimaryButton className="ms-4" disabled={processing}>
45
+ <Button className="ms-4" disabled={processing}>
46
46
  Email Password Reset Link
47
- </PrimaryButton>
47
+ </Button>
48
48
  </div>
49
49
  </form>
50
50
  </GuestLayout>
@@ -1,10 +1,10 @@
1
1
  import { FormEventHandler } from 'react'
2
- import Checkbox from '@/Components/Checkbox'
2
+ import { Button } from '@/Components/ui/button'
3
+ import { Input } from '@/Components/ui/input'
4
+ import { Label } from '@/Components/ui/label'
5
+ import { Checkbox } from '@/Components/ui/checkbox'
3
6
  import GuestLayout from '@/Layouts/GuestLayout'
4
7
  import InputError from '@/Components/InputError'
5
- import InputLabel from '@/Components/InputLabel'
6
- import PrimaryButton from '@/Components/PrimaryButton'
7
- import TextInput from '@/Components/TextInput'
8
8
  import { Head, Link, useForm } from '@inertiajs/react'
9
9
  import { login_path, password_request_path } from '@/routes'
10
10
 
@@ -31,16 +31,16 @@ export default function Login({ status }: { status?: string }) {
31
31
 
32
32
  <form onSubmit={submit}>
33
33
  <div>
34
- <InputLabel htmlFor="email" value="Email" />
34
+ <Label htmlFor="email">Email</Label>
35
35
 
36
- <TextInput
36
+ <Input
37
37
  id="email"
38
38
  type="email"
39
39
  name="email"
40
40
  value={data.email}
41
41
  className="mt-1 block w-full"
42
42
  autoComplete="username"
43
- isFocused={true}
43
+ autoFocus
44
44
  onChange={(e) => setData('email', e.target.value)}
45
45
  />
46
46
 
@@ -48,9 +48,9 @@ export default function Login({ status }: { status?: string }) {
48
48
  </div>
49
49
 
50
50
  <div className="mt-4">
51
- <InputLabel htmlFor="password" value="Password" />
51
+ <Label htmlFor="password">Password</Label>
52
52
 
53
- <TextInput
53
+ <Input
54
54
  id="password"
55
55
  type="password"
56
56
  name="password"
@@ -65,7 +65,12 @@ export default function Login({ status }: { status?: string }) {
65
65
 
66
66
  <div className="block mt-4">
67
67
  <label className="flex items-center">
68
- <Checkbox name="remember" checked={data.remember} onChange={(e) => setData('remember', (e.target.checked || false) as false)} />
68
+ <Checkbox
69
+ id="remember"
70
+ name="remember"
71
+ checked={data.remember}
72
+ onCheckedChange={(checked) => setData('remember', (checked === true) as false)}
73
+ />
69
74
  <span className="ms-2 text-sm text-gray-600 dark:text-gray-400">Remember me</span>
70
75
  </label>
71
76
  </div>
@@ -78,9 +83,9 @@ export default function Login({ status }: { status?: string }) {
78
83
  Forgot your password?
79
84
  </Link>
80
85
 
81
- <PrimaryButton className="ms-4" disabled={processing}>
86
+ <Button className="ms-4" disabled={processing}>
82
87
  Log in
83
- </PrimaryButton>
88
+ </Button>
84
89
  </div>
85
90
  </form>
86
91
  </GuestLayout>
@@ -1,9 +1,9 @@
1
1
  import { FormEventHandler } from 'react'
2
+ import { Button } from '@/Components/ui/button'
3
+ import { Input } from '@/Components/ui/input'
4
+ import { Label } from '@/Components/ui/label'
2
5
  import GuestLayout from '@/Layouts/GuestLayout'
3
6
  import InputError from '@/Components/InputError'
4
- import InputLabel from '@/Components/InputLabel'
5
- import PrimaryButton from '@/Components/PrimaryButton'
6
- import TextInput from '@/Components/TextInput'
7
7
  import { Head, Link, useForm } from '@inertiajs/react'
8
8
  import { login_path, register_path } from '@/routes'
9
9
 
@@ -29,15 +29,15 @@ export default function Register() {
29
29
 
30
30
  <form onSubmit={submit}>
31
31
  <div>
32
- <InputLabel htmlFor="name" value="Name" />
32
+ <Label htmlFor="name">Name</Label>
33
33
 
34
- <TextInput
34
+ <Input
35
35
  id="name"
36
36
  name="name"
37
37
  value={data.name}
38
38
  className="mt-1 block w-full"
39
39
  autoComplete="name"
40
- isFocused={true}
40
+ autoFocus
41
41
  onChange={(e) => setData('name', e.target.value)}
42
42
  required
43
43
  />
@@ -46,9 +46,9 @@ export default function Register() {
46
46
  </div>
47
47
 
48
48
  <div className="mt-4">
49
- <InputLabel htmlFor="email" value="Email" />
49
+ <Label htmlFor="email">Email</Label>
50
50
 
51
- <TextInput
51
+ <Input
52
52
  id="email"
53
53
  type="email"
54
54
  name="email"
@@ -63,9 +63,9 @@ export default function Register() {
63
63
  </div>
64
64
 
65
65
  <div className="mt-4">
66
- <InputLabel htmlFor="password" value="Password" />
66
+ <Label htmlFor="password">Password</Label>
67
67
 
68
- <TextInput
68
+ <Input
69
69
  id="password"
70
70
  type="password"
71
71
  name="password"
@@ -80,9 +80,9 @@ export default function Register() {
80
80
  </div>
81
81
 
82
82
  <div className="mt-4">
83
- <InputLabel htmlFor="password_confirmation" value="Confirm Password" />
83
+ <Label htmlFor="password_confirmation">Confirm Password</Label>
84
84
 
85
- <TextInput
85
+ <Input
86
86
  id="password_confirmation"
87
87
  type="password"
88
88
  name="password_confirmation"
@@ -104,9 +104,9 @@ export default function Register() {
104
104
  Already registered?
105
105
  </Link>
106
106
 
107
- <PrimaryButton className="ms-4" disabled={processing}>
107
+ <Button className="ms-4" disabled={processing}>
108
108
  Register
109
- </PrimaryButton>
109
+ </Button>
110
110
  </div>
111
111
  </form>
112
112
  </GuestLayout>
@@ -1,9 +1,9 @@
1
1
  import { FormEventHandler } from 'react'
2
+ import { Button } from '@/Components/ui/button'
3
+ import { Input } from '@/Components/ui/input'
4
+ import { Label } from '@/Components/ui/label'
2
5
  import GuestLayout from '@/Layouts/GuestLayout'
3
6
  import InputError from '@/Components/InputError'
4
- import InputLabel from '@/Components/InputLabel'
5
- import PrimaryButton from '@/Components/PrimaryButton'
6
- import TextInput from '@/Components/TextInput'
7
7
  import { Head, useForm } from '@inertiajs/react'
8
8
  import { password_store_path } from '@/routes'
9
9
 
@@ -28,16 +28,16 @@ export default function ResetPassword({ token }: { token: string }) {
28
28
 
29
29
  <form onSubmit={submit}>
30
30
  <div>
31
- <InputLabel htmlFor="password" value="Password" />
31
+ <Label htmlFor="password">Password</Label>
32
32
 
33
- <TextInput
33
+ <Input
34
34
  id="password"
35
35
  type="password"
36
36
  name="password"
37
37
  value={data.password}
38
38
  className="mt-1 block w-full"
39
39
  autoComplete="new-password"
40
- isFocused={true}
40
+ autoFocus
41
41
  onChange={(e) => setData('password', e.target.value)}
42
42
  />
43
43
 
@@ -45,9 +45,9 @@ export default function ResetPassword({ token }: { token: string }) {
45
45
  </div>
46
46
 
47
47
  <div className="mt-4">
48
- <InputLabel htmlFor="password_confirmation" value="Confirm Password" />
48
+ <Label htmlFor="password_confirmation">Confirm Password</Label>
49
49
 
50
- <TextInput
50
+ <Input
51
51
  type="password"
52
52
  name="password_confirmation"
53
53
  value={data.password_confirmation}
@@ -60,9 +60,9 @@ export default function ResetPassword({ token }: { token: string }) {
60
60
  </div>
61
61
 
62
62
  <div className="flex items-center justify-end mt-4">
63
- <PrimaryButton className="ms-4" disabled={processing}>
63
+ <Button className="ms-4" disabled={processing}>
64
64
  Reset Password
65
- </PrimaryButton>
65
+ </Button>
66
66
  </div>
67
67
  </form>
68
68
  </GuestLayout>
@@ -1,5 +1,5 @@
1
1
  import GuestLayout from '@/Layouts/GuestLayout'
2
- import PrimaryButton from '@/Components/PrimaryButton'
2
+ import { Button } from '@/Components/ui/button'
3
3
  import { Head, Link, useForm } from '@inertiajs/react'
4
4
  import { FormEventHandler } from 'react'
5
5
  import { logout_path, verification_send_path } from '@/routes'
@@ -30,7 +30,7 @@ export default function VerifyEmail({ status }: { status?: string }) {
30
30
 
31
31
  <form onSubmit={submit}>
32
32
  <div className="mt-4 flex items-center justify-between">
33
- <PrimaryButton disabled={processing}>Resend Verification Email</PrimaryButton>
33
+ <Button disabled={processing}>Resend Verification Email</Button>
34
34
 
35
35
  <Link
36
36
  href={logout_path()}
@@ -1,18 +1,23 @@
1
1
  import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
2
2
  import { Head } from '@inertiajs/react'
3
+ import { dashboard_path } from '@/routes'
4
+ import { BreadcrumbItem } from '@/types'
5
+
6
+ const breadcrumbs: BreadcrumbItem[] = [
7
+ {
8
+ title: 'Dashboard',
9
+ href: dashboard_path(),
10
+ },
11
+ ]
3
12
 
4
13
  export default function Dashboard() {
5
14
  return (
6
- <AuthenticatedLayout
7
- header={<h2 className="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">Dashboard</h2>}
8
- >
15
+ <AuthenticatedLayout breadcrumbs={breadcrumbs}>
9
16
  <Head title="Dashboard" />
10
17
 
11
- <div className="py-12">
12
- <div className="max-w-7xl mx-auto sm:px-6 lg:px-8">
13
- <div className="bg-white dark:bg-gray-800 overflow-hidden shadow-xs sm:rounded-lg">
14
- <div className="p-6 text-gray-900 dark:text-gray-100">You're logged in!</div>
15
- </div>
18
+ <div className="flex h-full flex-1 flex-col gap-4 rounded-xl p-4">
19
+ <div className="relative min-h-[60vh] flex-1 overflow-hidden rounded-xl border border-sidebar-border/70 p-6 dark:border-sidebar-border">
20
+ You're logged in!
16
21
  </div>
17
22
  </div>
18
23
  </AuthenticatedLayout>
@@ -0,0 +1,33 @@
1
+ import { Head } from '@inertiajs/react'
2
+ import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
3
+ import SettingsLayout from '@/Layouts/SettingsLayout'
4
+ import Heading from '@/Components/Heading'
5
+ import UpdateAppearanceForm from './Partials/UpdateAppearanceForm'
6
+ import { appearance_edit_path } from '@/routes'
7
+ import { BreadcrumbItem } from '@/types'
8
+
9
+ const breadcrumbs: BreadcrumbItem[] = [
10
+ {
11
+ title: 'Appearance settings',
12
+ href: appearance_edit_path(),
13
+ },
14
+ ]
15
+
16
+ export default function Appearance() {
17
+ return (
18
+ <AuthenticatedLayout breadcrumbs={breadcrumbs}>
19
+ <Head title="Appearance settings" />
20
+
21
+ <SettingsLayout>
22
+ <div className="space-y-6">
23
+ <Heading
24
+ variant="small"
25
+ title="Appearance settings"
26
+ description="Update the appearance settings for your account"
27
+ />
28
+ <UpdateAppearanceForm />
29
+ </div>
30
+ </SettingsLayout>
31
+ </AuthenticatedLayout>
32
+ )
33
+ }