kaze 1.4.0 → 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 (261) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +53 -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 +119 -1
  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/_settings.html.erb +26 -0
  36. data/stubs/hotwire/app/views/layouts/_sidebar.html.erb +56 -0
  37. data/stubs/hotwire/app/views/layouts/_sidebar_header.html.erb +11 -0
  38. data/stubs/hotwire/app/views/layouts/_sidebar_user.html.erb +34 -0
  39. data/stubs/hotwire/app/views/layouts/application.html.erb +24 -15
  40. data/stubs/hotwire/app/views/settings/appearance/_update_appearance_form.html.erb +28 -0
  41. data/stubs/hotwire/app/views/settings/appearance/edit.html.erb +10 -0
  42. data/stubs/hotwire/app/views/{profile/partials → settings/password}/_update_password_form.html.erb +2 -10
  43. data/stubs/hotwire/app/views/settings/password/edit.html.erb +10 -0
  44. data/stubs/hotwire/app/views/{profile/partials → settings/profile}/_confirm_user_deletion_modal.html.erb +2 -2
  45. data/stubs/hotwire/app/views/settings/profile/_delete_user_form.html.erb +6 -0
  46. data/stubs/hotwire/app/views/{profile/partials → settings/profile}/_update_profile_information_form.html.erb +4 -12
  47. data/stubs/hotwire/app/views/{profile → settings/profile}/destroy.turbo_stream.erb +1 -1
  48. data/stubs/hotwire/app/views/settings/profile/edit.html.erb +14 -0
  49. data/stubs/inertia-common/app/controllers/concerns/handle_inertia_requests.rb +4 -1
  50. data/stubs/inertia-common/app/controllers/settings/appearance_controller.rb +7 -0
  51. data/stubs/inertia-common/app/controllers/settings/password_controller.rb +17 -0
  52. data/stubs/inertia-common/app/controllers/{profile_controller.rb → settings/profile_controller.rb} +2 -2
  53. data/stubs/inertia-common/test/integration/appearance_test.rb +11 -0
  54. data/stubs/inertia-common/test/integration/password_update_test.rb +10 -2
  55. data/stubs/inertia-react-ts/app/assets/tailwind/application.css +120 -1
  56. data/stubs/inertia-react-ts/app/javascript/Components/AppLogo.tsx +17 -0
  57. data/stubs/inertia-react-ts/app/javascript/Components/AppShell.tsx +9 -0
  58. data/stubs/inertia-react-ts/app/javascript/Components/AppSidebar.tsx +65 -0
  59. data/stubs/inertia-react-ts/app/javascript/Components/AppSidebarHeader.tsx +14 -0
  60. data/stubs/inertia-react-ts/app/javascript/Components/Breadcrumbs.tsx +43 -0
  61. data/stubs/inertia-react-ts/app/javascript/Components/Heading.tsx +19 -0
  62. data/stubs/inertia-react-ts/app/javascript/Components/InputError.tsx +1 -1
  63. data/stubs/inertia-react-ts/app/javascript/Components/NavFooter.tsx +32 -0
  64. data/stubs/inertia-react-ts/app/javascript/Components/NavMain.tsx +32 -0
  65. data/stubs/inertia-react-ts/app/javascript/Components/NavUser.tsx +39 -0
  66. data/stubs/inertia-react-ts/app/javascript/Components/UserInfo.tsx +23 -0
  67. data/stubs/inertia-react-ts/app/javascript/Components/UserMenuContent.tsx +57 -0
  68. data/stubs/inertia-react-ts/app/javascript/Components/ui/avatar.tsx +51 -0
  69. data/stubs/inertia-react-ts/app/javascript/Components/ui/breadcrumb.tsx +109 -0
  70. data/stubs/inertia-react-ts/app/javascript/Components/ui/button.tsx +49 -0
  71. data/stubs/inertia-react-ts/app/javascript/Components/ui/checkbox.tsx +27 -0
  72. data/stubs/inertia-react-ts/app/javascript/Components/ui/dialog.tsx +109 -0
  73. data/stubs/inertia-react-ts/app/javascript/Components/ui/dropdown-menu.tsx +217 -0
  74. data/stubs/inertia-react-ts/app/javascript/Components/ui/input.tsx +21 -0
  75. data/stubs/inertia-react-ts/app/javascript/Components/ui/label.tsx +19 -0
  76. data/stubs/inertia-react-ts/app/javascript/Components/ui/separator.tsx +26 -0
  77. data/stubs/inertia-react-ts/app/javascript/Components/ui/sheet.tsx +137 -0
  78. data/stubs/inertia-react-ts/app/javascript/Components/ui/sidebar.tsx +719 -0
  79. data/stubs/inertia-react-ts/app/javascript/Components/ui/skeleton.tsx +13 -0
  80. data/stubs/inertia-react-ts/app/javascript/Components/ui/tooltip.tsx +55 -0
  81. data/stubs/inertia-react-ts/app/javascript/Layouts/AuthenticatedLayout.tsx +19 -127
  82. data/stubs/inertia-react-ts/app/javascript/Layouts/GuestLayout.tsx +1 -1
  83. data/stubs/inertia-react-ts/app/javascript/Layouts/SettingsLayout.tsx +57 -0
  84. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ForgotPassword.tsx +6 -6
  85. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Login.tsx +17 -12
  86. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Register.tsx +14 -14
  87. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ResetPassword.tsx +10 -10
  88. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/VerifyEmail.tsx +2 -2
  89. data/stubs/inertia-react-ts/app/javascript/Pages/Dashboard.tsx +13 -8
  90. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Appearance.tsx +33 -0
  91. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Partials/DeleteUserForm.tsx +107 -0
  92. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Partials/UpdateAppearanceForm.tsx +41 -0
  93. data/stubs/inertia-react-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdatePasswordForm.tsx +12 -20
  94. data/stubs/inertia-react-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdateProfileInformationForm.tsx +13 -21
  95. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Password.tsx +33 -0
  96. data/stubs/inertia-react-ts/app/javascript/Pages/Settings/Profile.tsx +35 -0
  97. data/stubs/inertia-react-ts/app/javascript/entrypoints/application.tsx +6 -1
  98. data/stubs/inertia-react-ts/app/javascript/hooks/use-initials.tsx +23 -0
  99. data/stubs/inertia-react-ts/app/javascript/hooks/use-mobile-navigation.tsx +11 -0
  100. data/stubs/inertia-react-ts/app/javascript/hooks/use-mobile.tsx +36 -0
  101. data/stubs/inertia-react-ts/app/javascript/lib/appearance.ts +1 -2
  102. data/stubs/inertia-react-ts/app/javascript/lib/utils.ts +6 -0
  103. data/stubs/inertia-react-ts/app/javascript/types/global.d.ts +2 -2
  104. data/stubs/inertia-react-ts/app/javascript/types/index.d.ts +14 -0
  105. data/stubs/inertia-react-ts/components.json +21 -0
  106. data/stubs/inertia-react-ts/package.json +13 -0
  107. data/stubs/inertia-vue-ts/app/assets/tailwind/application.css +120 -1
  108. data/stubs/inertia-vue-ts/app/javascript/Components/AppLogo.vue +17 -0
  109. data/stubs/inertia-vue-ts/app/javascript/Components/AppShell.vue +12 -0
  110. data/stubs/inertia-vue-ts/app/javascript/Components/AppSidebar.vue +65 -0
  111. data/stubs/inertia-vue-ts/app/javascript/Components/AppSidebarHeader.vue +20 -0
  112. data/stubs/inertia-vue-ts/app/javascript/Components/Breadcrumbs.vue +32 -0
  113. data/stubs/inertia-vue-ts/app/javascript/Components/Heading.vue +15 -0
  114. data/stubs/inertia-vue-ts/app/javascript/Components/InputError.vue +1 -1
  115. data/stubs/inertia-vue-ts/app/javascript/Components/NavFooter.vue +33 -0
  116. data/stubs/inertia-vue-ts/app/javascript/Components/NavMain.vue +32 -0
  117. data/stubs/inertia-vue-ts/app/javascript/Components/NavUser.vue +40 -0
  118. data/stubs/inertia-vue-ts/app/javascript/Components/UserInfo.vue +25 -0
  119. data/stubs/inertia-vue-ts/app/javascript/Components/UserMenuContent.vue +47 -0
  120. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/Avatar.vue +18 -0
  121. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/AvatarFallback.vue +21 -0
  122. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/AvatarImage.vue +16 -0
  123. data/stubs/inertia-vue-ts/app/javascript/Components/ui/avatar/index.ts +3 -0
  124. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/Breadcrumb.vue +17 -0
  125. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbEllipsis.vue +23 -0
  126. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbItem.vue +17 -0
  127. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbLink.vue +21 -0
  128. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbList.vue +17 -0
  129. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbPage.vue +20 -0
  130. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/BreadcrumbSeparator.vue +22 -0
  131. data/stubs/inertia-vue-ts/app/javascript/Components/ui/breadcrumb/index.ts +7 -0
  132. data/stubs/inertia-vue-ts/app/javascript/Components/ui/button/Button.vue +31 -0
  133. data/stubs/inertia-vue-ts/app/javascript/Components/ui/button/index.ts +34 -0
  134. data/stubs/inertia-vue-ts/app/javascript/Components/ui/checkbox/Checkbox.vue +35 -0
  135. data/stubs/inertia-vue-ts/app/javascript/Components/ui/checkbox/index.ts +1 -0
  136. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/Dialog.vue +15 -0
  137. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogClose.vue +12 -0
  138. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogContent.vue +52 -0
  139. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogDescription.vue +23 -0
  140. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogFooter.vue +25 -0
  141. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogHeader.vue +14 -0
  142. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogOverlay.vue +26 -0
  143. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogTitle.vue +23 -0
  144. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/DialogTrigger.vue +12 -0
  145. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dialog/index.ts +9 -0
  146. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenu.vue +15 -0
  147. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuContent.vue +37 -0
  148. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
  149. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuItem.vue +41 -0
  150. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  151. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  152. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/DropdownMenuTrigger.vue +14 -0
  153. data/stubs/inertia-vue-ts/app/javascript/Components/ui/dropdown-menu/index.ts +7 -0
  154. data/stubs/inertia-vue-ts/app/javascript/Components/ui/input/Input.vue +50 -0
  155. data/stubs/inertia-vue-ts/app/javascript/Components/ui/input/index.ts +1 -0
  156. data/stubs/inertia-vue-ts/app/javascript/Components/ui/label/Label.vue +26 -0
  157. data/stubs/inertia-vue-ts/app/javascript/Components/ui/label/index.ts +1 -0
  158. data/stubs/inertia-vue-ts/app/javascript/Components/ui/separator/Separator.vue +29 -0
  159. data/stubs/inertia-vue-ts/app/javascript/Components/ui/separator/index.ts +1 -0
  160. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/Sheet.vue +19 -0
  161. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetClose.vue +15 -0
  162. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetContent.vue +62 -0
  163. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetDescription.vue +21 -0
  164. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetFooter.vue +16 -0
  165. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetHeader.vue +15 -0
  166. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetOverlay.vue +21 -0
  167. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetTitle.vue +21 -0
  168. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/SheetTrigger.vue +15 -0
  169. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sheet/index.ts +8 -0
  170. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/Sidebar.vue +96 -0
  171. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarContent.vue +18 -0
  172. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarFooter.vue +18 -0
  173. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroup.vue +18 -0
  174. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupAction.vue +27 -0
  175. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupContent.vue +18 -0
  176. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarGroupLabel.vue +25 -0
  177. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarHeader.vue +18 -0
  178. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarInput.vue +22 -0
  179. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarInset.vue +21 -0
  180. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenu.vue +18 -0
  181. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuAction.vue +35 -0
  182. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuBadge.vue +26 -0
  183. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuButton.vue +48 -0
  184. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuButtonChild.vue +36 -0
  185. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuItem.vue +18 -0
  186. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSkeleton.vue +35 -0
  187. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSub.vue +22 -0
  188. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSubButton.vue +36 -0
  189. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
  190. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarProvider.vue +82 -0
  191. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarRail.vue +33 -0
  192. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarSeparator.vue +19 -0
  193. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/SidebarTrigger.vue +28 -0
  194. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/index.ts +60 -0
  195. data/stubs/inertia-vue-ts/app/javascript/Components/ui/sidebar/utils.ts +19 -0
  196. data/stubs/inertia-vue-ts/app/javascript/Components/ui/skeleton/Skeleton.vue +17 -0
  197. data/stubs/inertia-vue-ts/app/javascript/Components/ui/skeleton/index.ts +1 -0
  198. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/Tooltip.vue +19 -0
  199. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipContent.vue +34 -0
  200. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipProvider.vue +14 -0
  201. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/TooltipTrigger.vue +15 -0
  202. data/stubs/inertia-vue-ts/app/javascript/Components/ui/tooltip/index.ts +4 -0
  203. data/stubs/inertia-vue-ts/app/javascript/Layouts/AuthenticatedLayout.vue +17 -147
  204. data/stubs/inertia-vue-ts/app/javascript/Layouts/SettingsLayout.vue +57 -0
  205. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ForgotPassword.vue +7 -7
  206. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Login.vue +10 -12
  207. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Register.vue +12 -14
  208. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ResetPassword.vue +8 -10
  209. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/VerifyEmail.vue +3 -3
  210. data/stubs/inertia-vue-ts/app/javascript/Pages/Dashboard.vue +15 -10
  211. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Appearance.vue +33 -0
  212. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Partials/DeleteUserForm.vue +96 -0
  213. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Partials/UpdateAppearanceForm.vue +42 -0
  214. data/stubs/inertia-vue-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdatePasswordForm.vue +12 -20
  215. data/stubs/inertia-vue-ts/app/javascript/Pages/{Profile → Settings}/Partials/UpdateProfileInformationForm.vue +12 -20
  216. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Password.vue +33 -0
  217. data/stubs/inertia-vue-ts/app/javascript/Pages/Settings/Profile.vue +40 -0
  218. data/stubs/inertia-vue-ts/app/javascript/composables/useInitials.ts +29 -0
  219. data/stubs/inertia-vue-ts/app/javascript/lib/appearance.ts +1 -2
  220. data/stubs/inertia-vue-ts/app/javascript/lib/utils.ts +6 -0
  221. data/stubs/inertia-vue-ts/app/javascript/types/index.d.ts +14 -0
  222. data/stubs/inertia-vue-ts/app/javascript/types/vue-shims.d.ts +10 -0
  223. data/stubs/inertia-vue-ts/components.json +20 -0
  224. data/stubs/inertia-vue-ts/package.json +8 -1
  225. data/stubs/inertia-vue-ts/vite.config.ts +25 -1
  226. metadata +171 -46
  227. data/stubs/hotwire/app/components/nav_link_component.rb +0 -15
  228. data/stubs/hotwire/app/components/responsive_nav_link_component.rb +0 -15
  229. data/stubs/hotwire/app/controllers/password_controller.rb +0 -13
  230. data/stubs/hotwire/app/views/layouts/_navigation.html.erb +0 -82
  231. data/stubs/hotwire/app/views/profile/edit.html.erb +0 -29
  232. data/stubs/hotwire/app/views/profile/partials/_delete_user_form.html.erb +0 -14
  233. data/stubs/hotwire/app/views/profile/partials/_update_appearance_form.html.erb +0 -39
  234. data/stubs/inertia-common/app/controllers/password_controller.rb +0 -13
  235. data/stubs/inertia-react-ts/app/javascript/Components/Checkbox.tsx +0 -11
  236. data/stubs/inertia-react-ts/app/javascript/Components/DangerButton.tsx +0 -20
  237. data/stubs/inertia-react-ts/app/javascript/Components/Dropdown.tsx +0 -100
  238. data/stubs/inertia-react-ts/app/javascript/Components/InputLabel.tsx +0 -14
  239. data/stubs/inertia-react-ts/app/javascript/Components/Modal.tsx +0 -66
  240. data/stubs/inertia-react-ts/app/javascript/Components/NavLink.tsx +0 -21
  241. data/stubs/inertia-react-ts/app/javascript/Components/PrimaryButton.tsx +0 -20
  242. data/stubs/inertia-react-ts/app/javascript/Components/ResponsiveNavLink.tsx +0 -21
  243. data/stubs/inertia-react-ts/app/javascript/Components/SecondaryButton.tsx +0 -22
  244. data/stubs/inertia-react-ts/app/javascript/Components/TextInput.tsx +0 -32
  245. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Edit.tsx +0 -37
  246. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.tsx +0 -102
  247. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/UpdateAppearanceForm.tsx +0 -47
  248. data/stubs/inertia-vue-ts/app/javascript/Components/Checkbox.vue +0 -29
  249. data/stubs/inertia-vue-ts/app/javascript/Components/DangerButton.vue +0 -7
  250. data/stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue +0 -75
  251. data/stubs/inertia-vue-ts/app/javascript/Components/DropdownLink.vue +0 -16
  252. data/stubs/inertia-vue-ts/app/javascript/Components/InputLabel.vue +0 -12
  253. data/stubs/inertia-vue-ts/app/javascript/Components/Modal.vue +0 -109
  254. data/stubs/inertia-vue-ts/app/javascript/Components/NavLink.vue +0 -21
  255. data/stubs/inertia-vue-ts/app/javascript/Components/PrimaryButton.vue +0 -7
  256. data/stubs/inertia-vue-ts/app/javascript/Components/ResponsiveNavLink.vue +0 -21
  257. data/stubs/inertia-vue-ts/app/javascript/Components/SecondaryButton.vue +0 -19
  258. data/stubs/inertia-vue-ts/app/javascript/Components/TextInput.vue +0 -23
  259. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Edit.vue +0 -43
  260. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.vue +0 -99
  261. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/UpdateAppearanceForm.vue +0 -47
@@ -0,0 +1,22 @@
1
+ <script lang="ts" setup>
2
+ import type { HTMLAttributes } from "vue"
3
+ import { ChevronRight } from "@lucide/vue"
4
+ import { cn } from "@/lib/utils"
5
+
6
+ const props = defineProps<{
7
+ class?: HTMLAttributes["class"]
8
+ }>()
9
+ </script>
10
+
11
+ <template>
12
+ <li
13
+ data-slot="breadcrumb-separator"
14
+ role="presentation"
15
+ aria-hidden="true"
16
+ :class="cn('[&>svg]:size-3.5', props.class)"
17
+ >
18
+ <slot>
19
+ <ChevronRight />
20
+ </slot>
21
+ </li>
22
+ </template>
@@ -0,0 +1,7 @@
1
+ export { default as Breadcrumb } from "./Breadcrumb.vue"
2
+ export { default as BreadcrumbEllipsis } from "./BreadcrumbEllipsis.vue"
3
+ export { default as BreadcrumbItem } from "./BreadcrumbItem.vue"
4
+ export { default as BreadcrumbLink } from "./BreadcrumbLink.vue"
5
+ export { default as BreadcrumbList } from "./BreadcrumbList.vue"
6
+ export { default as BreadcrumbPage } from "./BreadcrumbPage.vue"
7
+ export { default as BreadcrumbSeparator } from "./BreadcrumbSeparator.vue"
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import type { PrimitiveProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import type { ButtonVariants } from '.'
5
+ import { Primitive } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+ import { buttonVariants } from '.'
8
+
9
+ interface Props extends PrimitiveProps {
10
+ variant?: ButtonVariants['variant']
11
+ size?: ButtonVariants['size']
12
+ class?: HTMLAttributes['class']
13
+ }
14
+
15
+ const props = withDefaults(defineProps<Props>(), {
16
+ as: 'button',
17
+ })
18
+ </script>
19
+
20
+ <template>
21
+ <Primitive
22
+ data-slot="button"
23
+ :data-variant="variant"
24
+ :data-size="size"
25
+ :as="as"
26
+ :as-child="asChild"
27
+ :class="cn(buttonVariants({ variant, size }), props.class)"
28
+ >
29
+ <slot />
30
+ </Primitive>
31
+ </template>
@@ -0,0 +1,34 @@
1
+ import type { VariantProps } from 'class-variance-authority'
2
+ import { cva } from 'class-variance-authority'
3
+
4
+ export { default as Button } from './Button.vue'
5
+
6
+ export const buttonVariants = cva(
7
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
12
+ destructive:
13
+ 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',
14
+ outline:
15
+ 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',
16
+ secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
17
+ ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',
18
+ link: 'text-primary underline-offset-4 hover:underline',
19
+ },
20
+ size: {
21
+ default: 'h-9 px-4 py-2 has-[>svg]:px-3',
22
+ sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',
23
+ lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',
24
+ icon: 'size-9',
25
+ },
26
+ },
27
+ defaultVariants: {
28
+ variant: 'default',
29
+ size: 'default',
30
+ },
31
+ },
32
+ )
33
+
34
+ export type ButtonVariants = VariantProps<typeof buttonVariants>
@@ -0,0 +1,35 @@
1
+ <script setup lang="ts">
2
+ import type { CheckboxRootEmits, CheckboxRootProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { Check } from '@lucide/vue'
5
+ import { reactiveOmit } from '@vueuse/core'
6
+ import { CheckboxIndicator, CheckboxRoot, useForwardPropsEmits } from 'reka-ui'
7
+ import { cn } from '@/lib/utils'
8
+
9
+ const props = defineProps<CheckboxRootProps & { class?: HTMLAttributes['class'] }>()
10
+ const emits = defineEmits<CheckboxRootEmits>()
11
+
12
+ const delegatedProps = reactiveOmit(props, 'class')
13
+
14
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
15
+ </script>
16
+
17
+ <template>
18
+ <CheckboxRoot
19
+ v-slot="slotProps"
20
+ data-slot="checkbox"
21
+ v-bind="forwarded"
22
+ :class="
23
+ cn(
24
+ 'peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
25
+ props.class,
26
+ )
27
+ "
28
+ >
29
+ <CheckboxIndicator data-slot="checkbox-indicator" class="grid place-content-center text-current transition-none">
30
+ <slot v-bind="slotProps">
31
+ <Check class="size-3.5" />
32
+ </slot>
33
+ </CheckboxIndicator>
34
+ </CheckboxRoot>
35
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Checkbox } from './Checkbox.vue'
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { DialogRootEmits, DialogRootProps } from 'reka-ui'
3
+ import { DialogRoot, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = defineProps<DialogRootProps>()
6
+ const emits = defineEmits<DialogRootEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <DialogRoot v-slot="slotProps" data-slot="dialog" v-bind="forwarded">
13
+ <slot v-bind="slotProps" />
14
+ </DialogRoot>
15
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { DialogCloseProps } from 'reka-ui'
3
+ import { DialogClose } from 'reka-ui'
4
+
5
+ const props = defineProps<DialogCloseProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <DialogClose data-slot="dialog-close" v-bind="props">
10
+ <slot />
11
+ </DialogClose>
12
+ </template>
@@ -0,0 +1,52 @@
1
+ <script setup lang="ts">
2
+ import type { DialogContentEmits, DialogContentProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { X } from '@lucide/vue'
5
+ import { reactiveOmit } from '@vueuse/core'
6
+ import { DialogClose, DialogContent, DialogPortal, useForwardPropsEmits } from 'reka-ui'
7
+ import { cn } from '@/lib/utils'
8
+ import DialogOverlay from './DialogOverlay.vue'
9
+
10
+ defineOptions({
11
+ inheritAttrs: false,
12
+ })
13
+
14
+ const props = withDefaults(
15
+ defineProps<DialogContentProps & { class?: HTMLAttributes['class']; showCloseButton?: boolean }>(),
16
+ {
17
+ showCloseButton: true,
18
+ },
19
+ )
20
+ const emits = defineEmits<DialogContentEmits>()
21
+
22
+ const delegatedProps = reactiveOmit(props, 'class')
23
+
24
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
25
+ </script>
26
+
27
+ <template>
28
+ <DialogPortal>
29
+ <DialogOverlay />
30
+ <DialogContent
31
+ data-slot="dialog-content"
32
+ v-bind="{ ...$attrs, ...forwarded }"
33
+ :class="
34
+ cn(
35
+ 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
36
+ props.class,
37
+ )
38
+ "
39
+ >
40
+ <slot />
41
+
42
+ <DialogClose
43
+ v-if="showCloseButton"
44
+ data-slot="dialog-close"
45
+ class="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
46
+ >
47
+ <X />
48
+ <span class="sr-only">Close</span>
49
+ </DialogClose>
50
+ </DialogContent>
51
+ </DialogPortal>
52
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { DialogDescriptionProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { DialogDescription, useForwardProps } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes['class'] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, 'class')
11
+
12
+ const forwardedProps = useForwardProps(delegatedProps)
13
+ </script>
14
+
15
+ <template>
16
+ <DialogDescription
17
+ data-slot="dialog-description"
18
+ v-bind="forwardedProps"
19
+ :class="cn('text-muted-foreground text-sm', props.class)"
20
+ >
21
+ <slot />
22
+ </DialogDescription>
23
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { DialogClose } from 'reka-ui'
4
+ import { cn } from '@/lib/utils'
5
+ import { Button } from '@/Components/ui/button'
6
+
7
+ const props = withDefaults(
8
+ defineProps<{
9
+ class?: HTMLAttributes['class']
10
+ showCloseButton?: boolean
11
+ }>(),
12
+ {
13
+ showCloseButton: false,
14
+ },
15
+ )
16
+ </script>
17
+
18
+ <template>
19
+ <div data-slot="dialog-footer" :class="cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', props.class)">
20
+ <slot />
21
+ <DialogClose v-if="showCloseButton" as-child>
22
+ <Button variant="outline"> Close </Button>
23
+ </DialogClose>
24
+ </div>
25
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '@/lib/utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div data-slot="dialog-header" :class="cn('flex flex-col gap-2 text-center sm:text-left', props.class)">
12
+ <slot />
13
+ </div>
14
+ </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import type { DialogOverlayProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { DialogOverlay } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const props = defineProps<DialogOverlayProps & { class?: HTMLAttributes['class'] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, 'class')
11
+ </script>
12
+
13
+ <template>
14
+ <DialogOverlay
15
+ data-slot="dialog-overlay"
16
+ v-bind="delegatedProps"
17
+ :class="
18
+ cn(
19
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80',
20
+ props.class,
21
+ )
22
+ "
23
+ >
24
+ <slot />
25
+ </DialogOverlay>
26
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { DialogTitleProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { DialogTitle, useForwardProps } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const props = defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, 'class')
11
+
12
+ const forwardedProps = useForwardProps(delegatedProps)
13
+ </script>
14
+
15
+ <template>
16
+ <DialogTitle
17
+ data-slot="dialog-title"
18
+ v-bind="forwardedProps"
19
+ :class="cn('text-lg leading-none font-semibold', props.class)"
20
+ >
21
+ <slot />
22
+ </DialogTitle>
23
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { DialogTriggerProps } from 'reka-ui'
3
+ import { DialogTrigger } from 'reka-ui'
4
+
5
+ const props = defineProps<DialogTriggerProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <DialogTrigger data-slot="dialog-trigger" v-bind="props">
10
+ <slot />
11
+ </DialogTrigger>
12
+ </template>
@@ -0,0 +1,9 @@
1
+ export { default as Dialog } from './Dialog.vue'
2
+ export { default as DialogClose } from './DialogClose.vue'
3
+ export { default as DialogContent } from './DialogContent.vue'
4
+ export { default as DialogDescription } from './DialogDescription.vue'
5
+ export { default as DialogFooter } from './DialogFooter.vue'
6
+ export { default as DialogHeader } from './DialogHeader.vue'
7
+ export { default as DialogOverlay } from './DialogOverlay.vue'
8
+ export { default as DialogTitle } from './DialogTitle.vue'
9
+ export { default as DialogTrigger } from './DialogTrigger.vue'
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuRootEmits, DropdownMenuRootProps } from 'reka-ui'
3
+ import { DropdownMenuRoot, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuRootProps>()
6
+ const emits = defineEmits<DropdownMenuRootEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <DropdownMenuRoot v-slot="slotProps" data-slot="dropdown-menu" v-bind="forwarded">
13
+ <slot v-bind="slotProps" />
14
+ </DropdownMenuRoot>
15
+ </template>
@@ -0,0 +1,37 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuContentEmits, DropdownMenuContentProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { DropdownMenuContent, DropdownMenuPortal, useForwardPropsEmits } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ defineOptions({
9
+ inheritAttrs: false,
10
+ })
11
+
12
+ const props = withDefaults(defineProps<DropdownMenuContentProps & { class?: HTMLAttributes['class'] }>(), {
13
+ sideOffset: 4,
14
+ })
15
+ const emits = defineEmits<DropdownMenuContentEmits>()
16
+
17
+ const delegatedProps = reactiveOmit(props, 'class')
18
+
19
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
20
+ </script>
21
+
22
+ <template>
23
+ <DropdownMenuPortal>
24
+ <DropdownMenuContent
25
+ data-slot="dropdown-menu-content"
26
+ v-bind="{ ...$attrs, ...forwarded }"
27
+ :class="
28
+ cn(
29
+ 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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-h-(--reka-dropdown-menu-content-available-height) min-w-[8rem] origin-(--reka-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',
30
+ props.class,
31
+ )
32
+ "
33
+ >
34
+ <slot />
35
+ </DropdownMenuContent>
36
+ </DropdownMenuPortal>
37
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuGroupProps } from 'reka-ui'
3
+ import { DropdownMenuGroup } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuGroupProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <DropdownMenuGroup data-slot="dropdown-menu-group" v-bind="props">
10
+ <slot />
11
+ </DropdownMenuGroup>
12
+ </template>
@@ -0,0 +1,41 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuItemProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { DropdownMenuItem, useForwardProps } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const props = withDefaults(
9
+ defineProps<
10
+ DropdownMenuItemProps & {
11
+ class?: HTMLAttributes['class']
12
+ inset?: boolean
13
+ variant?: 'default' | 'destructive'
14
+ }
15
+ >(),
16
+ {
17
+ variant: 'default',
18
+ },
19
+ )
20
+
21
+ const delegatedProps = reactiveOmit(props, 'inset', 'variant', 'class')
22
+
23
+ const forwardedProps = useForwardProps(delegatedProps)
24
+ </script>
25
+
26
+ <template>
27
+ <DropdownMenuItem
28
+ data-slot="dropdown-menu-item"
29
+ :data-inset="inset ? '' : undefined"
30
+ :data-variant="variant"
31
+ v-bind="forwardedProps"
32
+ :class="
33
+ cn(
34
+ 'focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*=\'text-\'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
35
+ props.class,
36
+ )
37
+ "
38
+ >
39
+ <slot />
40
+ </DropdownMenuItem>
41
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuLabelProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { DropdownMenuLabel, useForwardProps } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const props = defineProps<DropdownMenuLabelProps & { class?: HTMLAttributes['class']; inset?: boolean }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, 'class', 'inset')
11
+ const forwardedProps = useForwardProps(delegatedProps)
12
+ </script>
13
+
14
+ <template>
15
+ <DropdownMenuLabel
16
+ data-slot="dropdown-menu-label"
17
+ :data-inset="inset ? '' : undefined"
18
+ v-bind="forwardedProps"
19
+ :class="cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', props.class)"
20
+ >
21
+ <slot />
22
+ </DropdownMenuLabel>
23
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuSeparatorProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { DropdownMenuSeparator } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const props = defineProps<
9
+ DropdownMenuSeparatorProps & {
10
+ class?: HTMLAttributes['class']
11
+ }
12
+ >()
13
+
14
+ const delegatedProps = reactiveOmit(props, 'class')
15
+ </script>
16
+
17
+ <template>
18
+ <DropdownMenuSeparator
19
+ data-slot="dropdown-menu-separator"
20
+ v-bind="delegatedProps"
21
+ :class="cn('bg-border -mx-1 my-1 h-px', props.class)"
22
+ />
23
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import type { DropdownMenuTriggerProps } from 'reka-ui'
3
+ import { DropdownMenuTrigger, useForwardProps } from 'reka-ui'
4
+
5
+ const props = defineProps<DropdownMenuTriggerProps>()
6
+
7
+ const forwardedProps = useForwardProps(props)
8
+ </script>
9
+
10
+ <template>
11
+ <DropdownMenuTrigger data-slot="dropdown-menu-trigger" v-bind="forwardedProps">
12
+ <slot />
13
+ </DropdownMenuTrigger>
14
+ </template>
@@ -0,0 +1,7 @@
1
+ export { default as DropdownMenu } from './DropdownMenu.vue'
2
+ export { default as DropdownMenuContent } from './DropdownMenuContent.vue'
3
+ export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue'
4
+ export { default as DropdownMenuItem } from './DropdownMenuItem.vue'
5
+ export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue'
6
+ export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue'
7
+ export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue'
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { onMounted, ref } from 'vue'
4
+ import { useVModel } from '@vueuse/core'
5
+ import { cn } from '@/lib/utils'
6
+
7
+ const props = defineProps<{
8
+ defaultValue?: string | number
9
+ modelValue?: string | number
10
+ class?: HTMLAttributes['class']
11
+ }>()
12
+
13
+ const emits = defineEmits<{
14
+ (e: 'update:modelValue', payload: string | number): void
15
+ }>()
16
+
17
+ const modelValue = useVModel(props, 'modelValue', emits, {
18
+ passive: true,
19
+ defaultValue: props.defaultValue,
20
+ })
21
+
22
+ // Added for kaze: the upstream component exposes neither of these, and the
23
+ // scaffolded forms rely on both -- `autofocus` on the first field of a page,
24
+ // and an imperative focus() to return the cursor to a field that errored.
25
+ const input = ref<HTMLInputElement | null>(null)
26
+
27
+ onMounted(() => {
28
+ if (input.value?.hasAttribute('autofocus')) {
29
+ input.value?.focus()
30
+ }
31
+ })
32
+
33
+ defineExpose({ focus: () => input.value?.focus() })
34
+ </script>
35
+
36
+ <template>
37
+ <input
38
+ ref="input"
39
+ v-model="modelValue"
40
+ data-slot="input"
41
+ :class="
42
+ cn(
43
+ 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
44
+ 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',
45
+ 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
46
+ props.class,
47
+ )
48
+ "
49
+ />
50
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Input } from './Input.vue'
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import type { LabelProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { Label } from 'reka-ui'
6
+ import { cn } from '@/lib/utils'
7
+
8
+ const props = defineProps<LabelProps & { class?: HTMLAttributes['class'] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, 'class')
11
+ </script>
12
+
13
+ <template>
14
+ <Label
15
+ data-slot="label"
16
+ v-bind="delegatedProps"
17
+ :class="
18
+ cn(
19
+ 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',
20
+ props.class,
21
+ )
22
+ "
23
+ >
24
+ <slot />
25
+ </Label>
26
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Label } from './Label.vue'