kaze 1.4.0 → 2.0.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 (262) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/README.md +1 -1
  4. data/lib/kaze/commands/app/base_stack.rb +12 -2
  5. data/lib/kaze/commands/app/hotwire_stack.rb +3 -1
  6. data/lib/kaze/commands/app/inertia_react_stack.rb +6 -2
  7. data/lib/kaze/commands/app/inertia_vue_stack.rb +6 -2
  8. data/lib/kaze/commands/app.rb +9 -2
  9. data/lib/kaze/version.rb +1 -1
  10. data/stubs/default/config/routes.rb +11 -4
  11. data/stubs/default/test/integration/appearance_test.rb +11 -0
  12. data/stubs/default/test/integration/password_update_test.rb +9 -1
  13. data/stubs/hotwire/app/assets/tailwind/application.css +119 -1
  14. data/stubs/hotwire/app/components/breadcrumbs_component.rb +32 -0
  15. data/stubs/hotwire/app/components/danger_button_component.rb +1 -1
  16. data/stubs/hotwire/app/components/dropdown_component.html.erb +2 -2
  17. data/stubs/hotwire/app/components/dropdown_component.rb +5 -1
  18. data/stubs/hotwire/app/components/dropdown_link_component.rb +1 -1
  19. data/stubs/hotwire/app/components/heading_component.rb +19 -0
  20. data/stubs/hotwire/app/components/icon_component.rb +30 -0
  21. data/stubs/hotwire/app/components/input_error_component.rb +1 -1
  22. data/stubs/hotwire/app/components/input_label_component.rb +3 -3
  23. data/stubs/hotwire/app/components/modal_component.html.erb +2 -2
  24. data/stubs/hotwire/app/components/primary_button_component.rb +1 -1
  25. data/stubs/hotwire/app/components/secondary_button_component.rb +1 -1
  26. data/stubs/hotwire/app/components/sidebar_menu_button_component.rb +25 -0
  27. data/stubs/hotwire/app/components/text_input_component.rb +1 -1
  28. data/stubs/hotwire/app/components/user_avatar_component.rb +27 -0
  29. data/stubs/hotwire/app/controllers/application_controller.rb +1 -0
  30. data/stubs/hotwire/app/controllers/concerns/sidebar_state.rb +14 -0
  31. data/stubs/hotwire/app/controllers/settings/appearance_controller.rb +7 -0
  32. data/stubs/hotwire/app/controllers/settings/password_controller.rb +19 -0
  33. data/stubs/hotwire/app/controllers/{profile_controller.rb → settings/profile_controller.rb} +3 -4
  34. data/stubs/hotwire/app/views/auth/login.html.erb +1 -1
  35. data/stubs/hotwire/app/views/dashboard/index.html.erb +6 -11
  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 +24 -15
  41. data/stubs/hotwire/app/views/settings/appearance/_update_appearance_form.html.erb +28 -0
  42. data/stubs/hotwire/app/views/settings/appearance/edit.html.erb +10 -0
  43. data/stubs/hotwire/app/views/{profile/partials → settings/password}/_update_password_form.html.erb +2 -10
  44. data/stubs/hotwire/app/views/settings/password/edit.html.erb +10 -0
  45. data/stubs/hotwire/app/views/{profile/partials → settings/profile}/_confirm_user_deletion_modal.html.erb +2 -2
  46. data/stubs/hotwire/app/views/settings/profile/_delete_user_form.html.erb +6 -0
  47. data/stubs/hotwire/app/views/{profile/partials → settings/profile}/_update_profile_information_form.html.erb +4 -12
  48. data/stubs/hotwire/app/views/{profile → settings/profile}/destroy.turbo_stream.erb +1 -1
  49. data/stubs/hotwire/app/views/settings/profile/edit.html.erb +14 -0
  50. data/stubs/inertia-common/app/controllers/concerns/handle_inertia_requests.rb +4 -1
  51. data/stubs/inertia-common/app/controllers/settings/appearance_controller.rb +7 -0
  52. data/stubs/inertia-common/app/controllers/settings/password_controller.rb +17 -0
  53. data/stubs/inertia-common/app/controllers/{profile_controller.rb → settings/profile_controller.rb} +2 -2
  54. data/stubs/inertia-common/test/integration/appearance_test.rb +11 -0
  55. data/stubs/inertia-common/test/integration/password_update_test.rb +10 -2
  56. data/stubs/inertia-react-ts/app/assets/tailwind/application.css +120 -1
  57. data/stubs/inertia-react-ts/app/javascript/Components/AppLogo.tsx +17 -0
  58. data/stubs/inertia-react-ts/app/javascript/Components/AppShell.tsx +9 -0
  59. data/stubs/inertia-react-ts/app/javascript/Components/AppSidebar.tsx +65 -0
  60. data/stubs/inertia-react-ts/app/javascript/Components/AppSidebarHeader.tsx +14 -0
  61. data/stubs/inertia-react-ts/app/javascript/Components/Breadcrumbs.tsx +43 -0
  62. data/stubs/inertia-react-ts/app/javascript/Components/Heading.tsx +19 -0
  63. data/stubs/inertia-react-ts/app/javascript/Components/InputError.tsx +1 -1
  64. data/stubs/inertia-react-ts/app/javascript/Components/NavFooter.tsx +32 -0
  65. data/stubs/inertia-react-ts/app/javascript/Components/NavMain.tsx +32 -0
  66. data/stubs/inertia-react-ts/app/javascript/Components/NavUser.tsx +39 -0
  67. data/stubs/inertia-react-ts/app/javascript/Components/UserInfo.tsx +23 -0
  68. data/stubs/inertia-react-ts/app/javascript/Components/UserMenuContent.tsx +57 -0
  69. data/stubs/inertia-react-ts/app/javascript/Components/ui/avatar.tsx +51 -0
  70. data/stubs/inertia-react-ts/app/javascript/Components/ui/breadcrumb.tsx +109 -0
  71. data/stubs/inertia-react-ts/app/javascript/Components/ui/button.tsx +49 -0
  72. data/stubs/inertia-react-ts/app/javascript/Components/ui/checkbox.tsx +27 -0
  73. data/stubs/inertia-react-ts/app/javascript/Components/ui/dialog.tsx +109 -0
  74. data/stubs/inertia-react-ts/app/javascript/Components/ui/dropdown-menu.tsx +217 -0
  75. data/stubs/inertia-react-ts/app/javascript/Components/ui/input.tsx +21 -0
  76. data/stubs/inertia-react-ts/app/javascript/Components/ui/label.tsx +19 -0
  77. data/stubs/inertia-react-ts/app/javascript/Components/ui/separator.tsx +26 -0
  78. data/stubs/inertia-react-ts/app/javascript/Components/ui/sheet.tsx +137 -0
  79. data/stubs/inertia-react-ts/app/javascript/Components/ui/sidebar.tsx +719 -0
  80. data/stubs/inertia-react-ts/app/javascript/Components/ui/skeleton.tsx +13 -0
  81. data/stubs/inertia-react-ts/app/javascript/Components/ui/tooltip.tsx +55 -0
  82. data/stubs/inertia-react-ts/app/javascript/Layouts/AuthenticatedLayout.tsx +19 -127
  83. data/stubs/inertia-react-ts/app/javascript/Layouts/GuestLayout.tsx +1 -1
  84. data/stubs/inertia-react-ts/app/javascript/Layouts/SettingsLayout.tsx +57 -0
  85. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ForgotPassword.tsx +6 -6
  86. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Login.tsx +17 -12
  87. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Register.tsx +14 -14
  88. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ResetPassword.tsx +10 -10
  89. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/VerifyEmail.tsx +2 -2
  90. data/stubs/inertia-react-ts/app/javascript/Pages/Dashboard.tsx +13 -8
  91. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Appearance.tsx +33 -0
  92. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Partials/DeleteUserForm.tsx +107 -0
  93. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Partials/UpdateAppearanceForm.tsx +41 -0
  94. data/stubs/inertia-react-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdatePasswordForm.tsx +12 -20
  95. data/stubs/inertia-react-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdateProfileInformationForm.tsx +13 -21
  96. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Password.tsx +33 -0
  97. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Profile.tsx +35 -0
  98. data/stubs/inertia-react-ts/app/javascript/entrypoints/application.tsx +6 -1
  99. data/stubs/inertia-react-ts/app/javascript/hooks/use-initials.tsx +23 -0
  100. data/stubs/inertia-react-ts/app/javascript/hooks/use-mobile-navigation.tsx +11 -0
  101. data/stubs/inertia-react-ts/app/javascript/hooks/use-mobile.tsx +36 -0
  102. data/stubs/inertia-react-ts/app/javascript/lib/appearance.ts +1 -2
  103. data/stubs/inertia-react-ts/app/javascript/lib/utils.ts +6 -0
  104. data/stubs/inertia-react-ts/app/javascript/types/global.d.ts +2 -2
  105. data/stubs/inertia-react-ts/app/javascript/types/index.d.ts +14 -0
  106. data/stubs/inertia-react-ts/components.json +21 -0
  107. data/stubs/inertia-react-ts/package.json +13 -0
  108. data/stubs/inertia-vue-ts/app/assets/tailwind/application.css +120 -1
  109. data/stubs/inertia-vue-ts/app/javascript/Components/AppLogo.vue +17 -0
  110. data/stubs/inertia-vue-ts/app/javascript/Components/AppShell.vue +12 -0
  111. data/stubs/inertia-vue-ts/app/javascript/Components/AppSidebar.vue +65 -0
  112. data/stubs/inertia-vue-ts/app/javascript/Components/AppSidebarHeader.vue +20 -0
  113. data/stubs/inertia-vue-ts/app/javascript/Components/Breadcrumbs.vue +32 -0
  114. data/stubs/inertia-vue-ts/app/javascript/Components/Heading.vue +15 -0
  115. data/stubs/inertia-vue-ts/app/javascript/Components/InputError.vue +1 -1
  116. data/stubs/inertia-vue-ts/app/javascript/Components/NavFooter.vue +33 -0
  117. data/stubs/inertia-vue-ts/app/javascript/Components/NavMain.vue +32 -0
  118. data/stubs/inertia-vue-ts/app/javascript/Components/NavUser.vue +40 -0
  119. data/stubs/inertia-vue-ts/app/javascript/Components/UserInfo.vue +25 -0
  120. data/stubs/inertia-vue-ts/app/javascript/Components/UserMenuContent.vue +47 -0
  121. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/Avatar.vue +18 -0
  122. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/AvatarFallback.vue +21 -0
  123. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/AvatarImage.vue +16 -0
  124. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/index.ts +3 -0
  125. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/Breadcrumb.vue +17 -0
  126. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbEllipsis.vue +23 -0
  127. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbItem.vue +17 -0
  128. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbLink.vue +21 -0
  129. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbList.vue +17 -0
  130. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbPage.vue +20 -0
  131. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbSeparator.vue +22 -0
  132. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/index.ts +7 -0
  133. data/stubs/inertia-vue-ts/app/javascript/Components/ui/button/Button.vue +31 -0
  134. data/stubs/inertia-vue-ts/app/javascript/Components/ui/button/index.ts +34 -0
  135. data/stubs/inertia-vue-ts/app/javascript/Components/ui/checkbox/Checkbox.vue +35 -0
  136. data/stubs/inertia-vue-ts/app/javascript/Components/ui/checkbox/index.ts +1 -0
  137. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/Dialog.vue +15 -0
  138. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogClose.vue +12 -0
  139. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogContent.vue +52 -0
  140. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogDescription.vue +23 -0
  141. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogFooter.vue +25 -0
  142. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogHeader.vue +14 -0
  143. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogOverlay.vue +26 -0
  144. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogTitle.vue +23 -0
  145. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogTrigger.vue +12 -0
  146. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/index.ts +9 -0
  147. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenu.vue +15 -0
  148. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuContent.vue +37 -0
  149. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
  150. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuItem.vue +41 -0
  151. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  152. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  153. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuTrigger.vue +14 -0
  154. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/index.ts +7 -0
  155. data/stubs/inertia-vue-ts/app/javascript/Components/ui/input/Input.vue +50 -0
  156. data/stubs/inertia-vue-ts/app/javascript/Components/ui/input/index.ts +1 -0
  157. data/stubs/inertia-vue-ts/app/javascript/Components/ui/label/Label.vue +26 -0
  158. data/stubs/inertia-vue-ts/app/javascript/Components/ui/label/index.ts +1 -0
  159. data/stubs/inertia-vue-ts/app/javascript/Components/ui/separator/Separator.vue +29 -0
  160. data/stubs/inertia-vue-ts/app/javascript/Components/ui/separator/index.ts +1 -0
  161. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/Sheet.vue +19 -0
  162. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetClose.vue +15 -0
  163. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetContent.vue +62 -0
  164. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetDescription.vue +21 -0
  165. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetFooter.vue +16 -0
  166. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetHeader.vue +15 -0
  167. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetOverlay.vue +21 -0
  168. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetTitle.vue +21 -0
  169. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetTrigger.vue +15 -0
  170. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/index.ts +8 -0
  171. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/Sidebar.vue +96 -0
  172. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarContent.vue +18 -0
  173. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarFooter.vue +18 -0
  174. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroup.vue +18 -0
  175. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupAction.vue +27 -0
  176. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupContent.vue +18 -0
  177. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupLabel.vue +25 -0
  178. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarHeader.vue +18 -0
  179. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarInput.vue +22 -0
  180. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarInset.vue +21 -0
  181. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenu.vue +18 -0
  182. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuAction.vue +35 -0
  183. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuBadge.vue +26 -0
  184. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuButton.vue +48 -0
  185. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuButtonChild.vue +36 -0
  186. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuItem.vue +18 -0
  187. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSkeleton.vue +35 -0
  188. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSub.vue +22 -0
  189. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSubButton.vue +36 -0
  190. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
  191. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarProvider.vue +82 -0
  192. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarRail.vue +33 -0
  193. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarSeparator.vue +19 -0
  194. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarTrigger.vue +28 -0
  195. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/index.ts +60 -0
  196. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/utils.ts +19 -0
  197. data/stubs/inertia-vue-ts/app/javascript/Components/ui/skeleton/Skeleton.vue +17 -0
  198. data/stubs/inertia-vue-ts/app/javascript/Components/ui/skeleton/index.ts +1 -0
  199. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/Tooltip.vue +19 -0
  200. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipContent.vue +34 -0
  201. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipProvider.vue +14 -0
  202. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipTrigger.vue +15 -0
  203. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/index.ts +4 -0
  204. data/stubs/inertia-vue-ts/app/javascript/Layouts/AuthenticatedLayout.vue +17 -147
  205. data/stubs/inertia-vue-ts/app/javascript/Layouts/SettingsLayout.vue +57 -0
  206. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ForgotPassword.vue +7 -7
  207. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Login.vue +10 -12
  208. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Register.vue +12 -14
  209. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ResetPassword.vue +8 -10
  210. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/VerifyEmail.vue +3 -3
  211. data/stubs/inertia-vue-ts/app/javascript/Pages/Dashboard.vue +15 -10
  212. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Appearance.vue +33 -0
  213. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Partials/DeleteUserForm.vue +96 -0
  214. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Partials/UpdateAppearanceForm.vue +42 -0
  215. data/stubs/inertia-vue-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdatePasswordForm.vue +12 -20
  216. data/stubs/inertia-vue-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdateProfileInformationForm.vue +12 -20
  217. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Password.vue +33 -0
  218. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Profile.vue +40 -0
  219. data/stubs/inertia-vue-ts/app/javascript/composables/useInitials.ts +29 -0
  220. data/stubs/inertia-vue-ts/app/javascript/lib/appearance.ts +1 -2
  221. data/stubs/inertia-vue-ts/app/javascript/lib/utils.ts +6 -0
  222. data/stubs/inertia-vue-ts/app/javascript/types/index.d.ts +14 -0
  223. data/stubs/inertia-vue-ts/app/javascript/types/vue-shims.d.ts +10 -0
  224. data/stubs/inertia-vue-ts/components.json +20 -0
  225. data/stubs/inertia-vue-ts/package.json +8 -1
  226. data/stubs/inertia-vue-ts/vite.config.ts +25 -1
  227. metadata +171 -46
  228. data/stubs/hotwire/app/components/nav_link_component.rb +0 -15
  229. data/stubs/hotwire/app/components/responsive_nav_link_component.rb +0 -15
  230. data/stubs/hotwire/app/controllers/password_controller.rb +0 -13
  231. data/stubs/hotwire/app/views/layouts/_navigation.html.erb +0 -82
  232. data/stubs/hotwire/app/views/profile/edit.html.erb +0 -29
  233. data/stubs/hotwire/app/views/profile/partials/_delete_user_form.html.erb +0 -14
  234. data/stubs/hotwire/app/views/profile/partials/_update_appearance_form.html.erb +0 -39
  235. data/stubs/inertia-common/app/controllers/password_controller.rb +0 -13
  236. data/stubs/inertia-react-ts/app/javascript/Components/Checkbox.tsx +0 -11
  237. data/stubs/inertia-react-ts/app/javascript/Components/DangerButton.tsx +0 -20
  238. data/stubs/inertia-react-ts/app/javascript/Components/Dropdown.tsx +0 -100
  239. data/stubs/inertia-react-ts/app/javascript/Components/InputLabel.tsx +0 -14
  240. data/stubs/inertia-react-ts/app/javascript/Components/Modal.tsx +0 -66
  241. data/stubs/inertia-react-ts/app/javascript/Components/NavLink.tsx +0 -21
  242. data/stubs/inertia-react-ts/app/javascript/Components/PrimaryButton.tsx +0 -20
  243. data/stubs/inertia-react-ts/app/javascript/Components/ResponsiveNavLink.tsx +0 -21
  244. data/stubs/inertia-react-ts/app/javascript/Components/SecondaryButton.tsx +0 -22
  245. data/stubs/inertia-react-ts/app/javascript/Components/TextInput.tsx +0 -32
  246. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Edit.tsx +0 -37
  247. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.tsx +0 -102
  248. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/UpdateAppearanceForm.tsx +0 -47
  249. data/stubs/inertia-vue-ts/app/javascript/Components/Checkbox.vue +0 -29
  250. data/stubs/inertia-vue-ts/app/javascript/Components/DangerButton.vue +0 -7
  251. data/stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue +0 -75
  252. data/stubs/inertia-vue-ts/app/javascript/Components/DropdownLink.vue +0 -16
  253. data/stubs/inertia-vue-ts/app/javascript/Components/InputLabel.vue +0 -12
  254. data/stubs/inertia-vue-ts/app/javascript/Components/Modal.vue +0 -109
  255. data/stubs/inertia-vue-ts/app/javascript/Components/NavLink.vue +0 -21
  256. data/stubs/inertia-vue-ts/app/javascript/Components/PrimaryButton.vue +0 -7
  257. data/stubs/inertia-vue-ts/app/javascript/Components/ResponsiveNavLink.vue +0 -21
  258. data/stubs/inertia-vue-ts/app/javascript/Components/SecondaryButton.vue +0 -19
  259. data/stubs/inertia-vue-ts/app/javascript/Components/TextInput.vue +0 -23
  260. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Edit.vue +0 -43
  261. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.vue +0 -99
  262. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/UpdateAppearanceForm.vue +0 -47
@@ -1,109 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
3
-
4
- const props = withDefaults(
5
- defineProps<{
6
- show?: boolean
7
- maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl'
8
- closeable?: boolean
9
- }>(),
10
- {
11
- show: false,
12
- maxWidth: '2xl',
13
- closeable: true,
14
- },
15
- )
16
-
17
- const emit = defineEmits(['close'])
18
- const dialog = ref()
19
- const showSlot = ref(props.show)
20
-
21
- watch(
22
- () => props.show,
23
- () => {
24
- if (props.show) {
25
- document.body.style.overflow = 'hidden'
26
- showSlot.value = true
27
-
28
- dialog.value?.showModal()
29
- } else {
30
- document.body.style.overflow = ''
31
-
32
- setTimeout(() => {
33
- dialog.value?.close()
34
- showSlot.value = false
35
- }, 200)
36
- }
37
- },
38
- )
39
-
40
- const close = () => {
41
- if (props.closeable) {
42
- emit('close')
43
- }
44
- }
45
-
46
- const closeOnEscape = (e: KeyboardEvent) => {
47
- if (e.key === 'Escape') {
48
- e.preventDefault()
49
-
50
- if (props.show) {
51
- close()
52
- }
53
- }
54
- }
55
-
56
- onMounted(() => document.addEventListener('keydown', closeOnEscape))
57
-
58
- onUnmounted(() => {
59
- document.removeEventListener('keydown', closeOnEscape)
60
-
61
- document.body.style.overflow = ''
62
- })
63
-
64
- const maxWidthClass = computed(() => {
65
- return {
66
- sm: 'sm:max-w-sm',
67
- md: 'sm:max-w-md',
68
- lg: 'sm:max-w-lg',
69
- xl: 'sm:max-w-xl',
70
- '2xl': 'sm:max-w-2xl',
71
- }[props.maxWidth]
72
- })
73
- </script>
74
-
75
- <template>
76
- <dialog class="z-50 m-0 min-h-full min-w-full overflow-y-auto bg-transparent backdrop:bg-transparent" ref="dialog">
77
- <div class="fixed inset-0 z-50 overflow-y-auto px-4 py-6 sm:px-0" scroll-region>
78
- <Transition
79
- enter-active-class="ease-out duration-300"
80
- enter-from-class="opacity-0"
81
- enter-to-class="opacity-100"
82
- leave-active-class="ease-in duration-200"
83
- leave-from-class="opacity-100"
84
- leave-to-class="opacity-0"
85
- >
86
- <div v-show="show" class="fixed inset-0 transform transition-all" @click="close">
87
- <div class="absolute inset-0 bg-gray-500 opacity-75 dark:bg-gray-900" />
88
- </div>
89
- </Transition>
90
-
91
- <Transition
92
- enter-active-class="ease-out duration-300"
93
- enter-from-class="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
94
- enter-to-class="opacity-100 translate-y-0 sm:scale-100"
95
- leave-active-class="ease-in duration-200"
96
- leave-from-class="opacity-100 translate-y-0 sm:scale-100"
97
- leave-to-class="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
98
- >
99
- <div
100
- v-show="show"
101
- class="mb-6 transform overflow-hidden rounded-lg bg-white shadow-xl transition-all sm:mx-auto sm:w-full dark:bg-gray-800"
102
- :class="maxWidthClass"
103
- >
104
- <slot v-if="showSlot" />
105
- </div>
106
- </Transition>
107
- </div>
108
- </dialog>
109
- </template>
@@ -1,21 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { Link } from '@inertiajs/vue3'
4
-
5
- const props = defineProps<{
6
- href: string
7
- active?: boolean
8
- }>()
9
-
10
- const classes = computed(() =>
11
- props.active
12
- ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-hidden focus:border-indigo-700 transition duration-150 ease-in-out'
13
- : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-hidden focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out',
14
- )
15
- </script>
16
-
17
- <template>
18
- <Link :href="href" :class="classes">
19
- <slot />
20
- </Link>
21
- </template>
@@ -1,7 +0,0 @@
1
- <template>
2
- <button
3
- class="inline-flex items-center px-4 py-2 bg-gray-800 dark:bg-gray-200 border border-transparent rounded-md font-semibold text-xs text-white dark:text-gray-800 uppercase tracking-widest hover:bg-gray-700 dark:hover:bg-white focus:bg-gray-700 dark:focus:bg-white active:bg-gray-900 dark:active:bg-gray-300 focus:outline-hidden focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150"
4
- >
5
- <slot />
6
- </button>
7
- </template>
@@ -1,21 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { Link } from '@inertiajs/vue3'
4
-
5
- const props = defineProps<{
6
- href: string
7
- active?: boolean
8
- }>()
9
-
10
- const classes = computed(() =>
11
- props.active
12
- ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-hidden focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out'
13
- : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-hidden focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out',
14
- )
15
- </script>
16
-
17
- <template>
18
- <Link :href="href" :class="classes">
19
- <slot />
20
- </Link>
21
- </template>
@@ -1,19 +0,0 @@
1
- <script setup lang="ts">
2
- withDefaults(
3
- defineProps<{
4
- type?: 'button' | 'submit' | 'reset'
5
- }>(),
6
- {
7
- type: 'button',
8
- },
9
- )
10
- </script>
11
-
12
- <template>
13
- <button
14
- :type="type"
15
- class="inline-flex items-center px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-500 rounded-md font-semibold text-xs text-gray-700 dark:text-gray-300 uppercase tracking-widest shadow-xs hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 disabled:opacity-25 transition ease-in-out duration-150"
16
- >
17
- <slot />
18
- </button>
19
- </template>
@@ -1,23 +0,0 @@
1
- <script setup lang="ts">
2
- import { onMounted, ref } from 'vue'
3
-
4
- const model = defineModel<string>({ required: true })
5
-
6
- const input = ref<HTMLInputElement | null>(null)
7
-
8
- onMounted(() => {
9
- if (input.value?.hasAttribute('autofocus')) {
10
- input.value?.focus()
11
- }
12
- })
13
-
14
- defineExpose({ focus: () => input.value?.focus() })
15
- </script>
16
-
17
- <template>
18
- <input
19
- class="border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-xs"
20
- v-model="model"
21
- ref="input"
22
- />
23
- </template>
@@ -1,43 +0,0 @@
1
- <script setup lang="ts">
2
- import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout.vue'
3
- import DeleteUserForm from './Partials/DeleteUserForm.vue'
4
- import UpdateAppearanceForm from './Partials/UpdateAppearanceForm.vue'
5
- import UpdatePasswordForm from './Partials/UpdatePasswordForm.vue'
6
- import UpdateProfileInformationForm from './Partials/UpdateProfileInformationForm.vue'
7
- import { Head } from '@inertiajs/vue3'
8
-
9
- defineProps<{
10
- mustVerifyEmail?: boolean
11
- status?: string
12
- }>()
13
- </script>
14
-
15
- <template>
16
- <Head title="Profile" />
17
-
18
- <AuthenticatedLayout>
19
- <template #header>
20
- <h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">Profile</h2>
21
- </template>
22
-
23
- <div class="py-12">
24
- <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
25
- <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
26
- <UpdateAppearanceForm class="max-w-xl" />
27
- </div>
28
-
29
- <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
30
- <UpdateProfileInformationForm :must-verify-email="mustVerifyEmail" :status="status" class="max-w-xl" />
31
- </div>
32
-
33
- <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
34
- <UpdatePasswordForm class="max-w-xl" />
35
- </div>
36
-
37
- <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
38
- <DeleteUserForm class="max-w-xl" />
39
- </div>
40
- </div>
41
- </div>
42
- </AuthenticatedLayout>
43
- </template>
@@ -1,99 +0,0 @@
1
- <script setup lang="ts">
2
- import DangerButton from '@/Components/DangerButton.vue'
3
- import InputError from '@/Components/InputError.vue'
4
- import InputLabel from '@/Components/InputLabel.vue'
5
- import Modal from '@/Components/Modal.vue'
6
- import SecondaryButton from '@/Components/SecondaryButton.vue'
7
- import TextInput from '@/Components/TextInput.vue'
8
- import { useForm } from '@inertiajs/vue3'
9
- import { nextTick, ref } from 'vue'
10
- import { profile_destroy_path } from '@/routes'
11
-
12
- const confirmingUserDeletion = ref(false)
13
- const passwordInput = ref<HTMLInputElement | null>(null)
14
-
15
- const form = useForm({
16
- password: '',
17
- })
18
-
19
- const confirmUserDeletion = () => {
20
- confirmingUserDeletion.value = true
21
-
22
- nextTick(() => passwordInput.value?.focus())
23
- }
24
-
25
- const deleteUser = () => {
26
- form.delete(profile_destroy_path(), {
27
- preserveScroll: true,
28
- onSuccess: () => closeModal(),
29
- onError: () => passwordInput.value?.focus(),
30
- onFinish: () => {
31
- form.reset()
32
- },
33
- })
34
- }
35
-
36
- const closeModal = () => {
37
- confirmingUserDeletion.value = false
38
-
39
- form.clearErrors()
40
- form.reset()
41
- }
42
- </script>
43
-
44
- <template>
45
- <section class="space-y-6">
46
- <header>
47
- <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">Delete Account</h2>
48
-
49
- <p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
50
- Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your
51
- account, please download any data or information that you wish to retain.
52
- </p>
53
- </header>
54
-
55
- <DangerButton @click="confirmUserDeletion">Delete Account</DangerButton>
56
-
57
- <Modal :show="confirmingUserDeletion" @close="closeModal">
58
- <div class="p-6">
59
- <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
60
- Are you sure you want to delete your account?
61
- </h2>
62
-
63
- <p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
64
- Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your
65
- password to confirm you would like to permanently delete your account.
66
- </p>
67
-
68
- <div class="mt-6">
69
- <InputLabel for="password" value="Password" class="sr-only" />
70
-
71
- <TextInput
72
- id="password"
73
- ref="passwordInput"
74
- v-model="form.password"
75
- type="password"
76
- class="mt-1 block w-3/4"
77
- placeholder="Password"
78
- @keyup.enter="deleteUser"
79
- />
80
-
81
- <InputError :message="form.errors.password" class="mt-2" />
82
- </div>
83
-
84
- <div class="mt-6 flex justify-end">
85
- <SecondaryButton @click="closeModal"> Cancel </SecondaryButton>
86
-
87
- <DangerButton
88
- class="ms-3"
89
- :class="{ 'opacity-25': form.processing }"
90
- :disabled="form.processing"
91
- @click="deleteUser"
92
- >
93
- Delete Account
94
- </DangerButton>
95
- </div>
96
- </div>
97
- </Modal>
98
- </section>
99
- </template>
@@ -1,47 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref } from 'vue'
3
- import { getAppearance, setAppearance, type Appearance } from '@/lib/appearance'
4
-
5
- const options: { value: Appearance; label: string }[] = [
6
- { value: 'light', label: 'Light' },
7
- { value: 'dark', label: 'Dark' },
8
- { value: 'system', label: 'System' },
9
- ]
10
-
11
- const appearance = ref<Appearance>(getAppearance())
12
-
13
- const select = (value: Appearance) => {
14
- appearance.value = value
15
- setAppearance(value)
16
- }
17
- </script>
18
-
19
- <template>
20
- <section>
21
- <header>
22
- <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">Appearance</h2>
23
-
24
- <p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
25
- Choose how the application looks to you. System follows your device setting.
26
- </p>
27
- </header>
28
-
29
- <div class="mt-6 inline-flex rounded-lg bg-gray-100 p-1 dark:bg-gray-900">
30
- <button
31
- v-for="option in options"
32
- :key="option.value"
33
- type="button"
34
- :aria-pressed="appearance === option.value"
35
- class="rounded-md px-4 py-1.5 text-sm font-medium transition focus:outline-hidden focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800"
36
- :class="
37
- appearance === option.value
38
- ? 'bg-white text-gray-900 shadow-xs dark:bg-gray-700 dark:text-gray-100'
39
- : 'text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100'
40
- "
41
- @click="select(option.value)"
42
- >
43
- {{ option.label }}
44
- </button>
45
- </div>
46
- </section>
47
- </template>