kaze 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kaze/commands/install_command.rb +3 -1
  3. data/lib/kaze/commands/installs_hotwire_stack.rb +2 -2
  4. data/lib/kaze/commands/installs_inertia_stacks.rb +7 -7
  5. data/lib/kaze/version.rb +1 -1
  6. data/stubs/default/app/mailers/application_mailer.rb +1 -1
  7. data/stubs/default/app/mailers/user_mailer.rb +16 -1
  8. data/stubs/default/app/models/concerns/can_reset_password.rb +1 -1
  9. data/stubs/default/app/models/concerns/must_verify_email.rb +15 -0
  10. data/stubs/default/app/models/user.rb +1 -0
  11. data/stubs/default/app/views/user_mailer/reset_password.html.erb +2 -2
  12. data/stubs/default/app/views/user_mailer/verify_email.html.erb +33 -0
  13. data/stubs/default/config/routes.rb +4 -0
  14. data/stubs/default/db/migrate/20240101000000_create_users.rb +1 -0
  15. data/stubs/default/test/factories/users.rb +5 -0
  16. data/stubs/default/test/integration/auth/authentication_test.rb +4 -6
  17. data/stubs/default/test/integration/auth/email_verification_test.rb +40 -0
  18. data/stubs/default/test/integration/auth/password_reset_test.rb +3 -3
  19. data/stubs/default/test/integration/password_update_test.rb +2 -2
  20. data/stubs/default/test/integration/profile_test.rb +4 -4
  21. data/stubs/hotwire/app/components/modal_component.rb +5 -5
  22. data/stubs/hotwire/app/controllers/auth/authenticated_session_controller.rb +3 -2
  23. data/stubs/hotwire/app/controllers/auth/email_verification_notification_controller.rb +21 -0
  24. data/stubs/hotwire/app/controllers/auth/new_password_controller.rb +2 -2
  25. data/stubs/hotwire/app/controllers/auth/password_reset_link_controller.rb +1 -1
  26. data/stubs/hotwire/app/controllers/auth/registered_user_controller.rb +6 -2
  27. data/stubs/hotwire/app/controllers/auth/verified_email_controller.rb +23 -0
  28. data/stubs/hotwire/app/controllers/concerns/authenticate.rb +10 -0
  29. data/stubs/hotwire/app/controllers/concerns/validate_signature.rb +17 -0
  30. data/stubs/hotwire/app/controllers/password_controller.rb +1 -1
  31. data/stubs/hotwire/app/controllers/profile_controller.rb +2 -2
  32. data/stubs/hotwire/app/views/auth/verify_email.html.erb +23 -0
  33. data/stubs/hotwire/app/views/profile/partials/_delete_user_form.html.erb +1 -1
  34. data/stubs/inertia-common/app/controllers/auth/authenticated_session_controller.rb +3 -3
  35. data/stubs/inertia-common/app/controllers/auth/email_verification_notification_controller.rb +21 -0
  36. data/stubs/inertia-common/app/controllers/auth/new_password_controller.rb +2 -3
  37. data/stubs/inertia-common/app/controllers/auth/password_reset_link_controller.rb +3 -3
  38. data/stubs/inertia-common/app/controllers/auth/registered_user_controller.rb +6 -2
  39. data/stubs/inertia-common/app/controllers/auth/verified_email_controller.rb +23 -0
  40. data/stubs/inertia-common/app/controllers/concerns/authenticate.rb +10 -0
  41. data/stubs/inertia-common/app/controllers/concerns/validate_signature.rb +17 -0
  42. data/stubs/inertia-common/app/controllers/password_controller.rb +1 -1
  43. data/stubs/inertia-common/app/controllers/profile_controller.rb +2 -2
  44. data/stubs/inertia-common/test/integration/password_update_test.rb +2 -2
  45. data/stubs/inertia-common/test/integration/profile_test.rb +4 -4
  46. data/stubs/inertia-react-ts/app/javascript/Components/Checkbox.tsx +1 -4
  47. data/stubs/inertia-react-ts/app/javascript/Components/DangerButton.tsx +3 -5
  48. data/stubs/inertia-react-ts/app/javascript/Components/Dropdown.tsx +4 -25
  49. data/stubs/inertia-react-ts/app/javascript/Components/InputError.tsx +1 -4
  50. data/stubs/inertia-react-ts/app/javascript/Components/InputLabel.tsx +1 -4
  51. data/stubs/inertia-react-ts/app/javascript/Components/NavLink.tsx +3 -5
  52. data/stubs/inertia-react-ts/app/javascript/Components/PrimaryButton.tsx +3 -5
  53. data/stubs/inertia-react-ts/app/javascript/Components/SecondaryButton.tsx +3 -5
  54. data/stubs/inertia-react-ts/app/javascript/Components/TextInput.tsx +1 -7
  55. data/stubs/inertia-react-ts/app/javascript/Layouts/AuthenticatedLayout.tsx +14 -52
  56. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ForgotPassword.tsx +3 -6
  57. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Login.tsx +9 -23
  58. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Register.tsx +1 -4
  59. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ResetPassword.tsx +1 -4
  60. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/VerifyEmail.tsx +47 -0
  61. data/stubs/inertia-react-ts/app/javascript/Pages/Dashboard.tsx +2 -8
  62. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Edit.tsx +1 -5
  63. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.tsx +7 -19
  64. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/UpdatePasswordForm.tsx +7 -15
  65. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/UpdateProfileInformationForm.tsx +7 -16
  66. data/stubs/inertia-react-ts/app/javascript/Pages/Welcome.tsx +1 -2
  67. data/stubs/inertia-react-ts/app/javascript/entrypoints/application.tsx +1 -5
  68. data/stubs/inertia-react-ts/config/tailwind.config.js +1 -6
  69. data/stubs/inertia-vue-ts/app/javascript/Components/ApplicationLogo.vue +3 -1
  70. data/stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue +1 -4
  71. data/stubs/inertia-vue-ts/app/javascript/Components/Modal.vue +3 -13
  72. data/stubs/inertia-vue-ts/app/javascript/Layouts/AuthenticatedLayout.vue +10 -45
  73. data/stubs/inertia-vue-ts/app/javascript/Layouts/GuestLayout.vue +2 -6
  74. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ForgotPassword.vue +4 -11
  75. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Login.vue +2 -10
  76. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Register.vue +1 -5
  77. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ResetPassword.vue +1 -4
  78. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/VerifyEmail.vue +50 -0
  79. data/stubs/inertia-vue-ts/app/javascript/Pages/Dashboard.vue +3 -11
  80. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Edit.vue +2 -10
  81. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.vue +5 -9
  82. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/UpdatePasswordForm.vue +2 -9
  83. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/UpdateProfileInformationForm.vue +3 -13
  84. data/stubs/inertia-vue-ts/app/javascript/Pages/Welcome.vue +2 -5
  85. data/stubs/inertia-vue-ts/config/tailwind.config.js +1 -6
  86. metadata +14 -2
@@ -0,0 +1,47 @@
1
+ import GuestLayout from '@/Layouts/GuestLayout'
2
+ import PrimaryButton from '@/Components/PrimaryButton'
3
+ import { Head, Link, useForm } from '@inertiajs/react'
4
+ import { FormEventHandler } from 'react'
5
+ import { logout_path, verification_send_path } from '@/routes'
6
+
7
+ export default function VerifyEmail({ status }: { status?: string }) {
8
+ const { post, processing } = useForm({})
9
+
10
+ const submit: FormEventHandler = (e) => {
11
+ e.preventDefault()
12
+
13
+ post(verification_send_path())
14
+ }
15
+
16
+ return (
17
+ <GuestLayout>
18
+ <Head title="Email Verification" />
19
+
20
+ <div className="mb-4 text-sm text-gray-600 dark:text-gray-400">
21
+ Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we
22
+ just emailed to you? If you didn't receive the email, we will gladly send you another.
23
+ </div>
24
+
25
+ {status === 'verification-link-sent' && (
26
+ <div className="mb-4 font-medium text-sm text-green-600 dark:text-green-400">
27
+ A new verification link has been sent to the email address you provided during registration.
28
+ </div>
29
+ )}
30
+
31
+ <form onSubmit={submit}>
32
+ <div className="mt-4 flex items-center justify-between">
33
+ <PrimaryButton disabled={processing}>Resend Verification Email</PrimaryButton>
34
+
35
+ <Link
36
+ href={logout_path()}
37
+ method="post"
38
+ as="button"
39
+ className="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
40
+ >
41
+ Log Out
42
+ </Link>
43
+ </div>
44
+ </form>
45
+ </GuestLayout>
46
+ )
47
+ }
@@ -6,20 +6,14 @@ export default function Dashboard({ auth }: PageProps) {
6
6
  return (
7
7
  <AuthenticatedLayout
8
8
  user={auth.user}
9
- header={
10
- <h2 className="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">
11
- Dashboard
12
- </h2>
13
- }
9
+ header={<h2 className="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">Dashboard</h2>}
14
10
  >
15
11
  <Head title="Dashboard" />
16
12
 
17
13
  <div className="py-12">
18
14
  <div className="max-w-7xl mx-auto sm:px-6 lg:px-8">
19
15
  <div className="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
20
- <div className="p-6 text-gray-900 dark:text-gray-100">
21
- You're logged in!
22
- </div>
16
+ <div className="p-6 text-gray-900 dark:text-gray-100">You're logged in!</div>
23
17
  </div>
24
18
  </div>
25
19
  </div>
@@ -9,11 +9,7 @@ export default function Edit({ auth }: PageProps) {
9
9
  return (
10
10
  <AuthenticatedLayout
11
11
  user={auth.user}
12
- header={
13
- <h2 className="font-semibold text-xl text-gray-800 leading-tight">
14
- Profile
15
- </h2>
16
- }
12
+ header={<h2 className="font-semibold text-xl text-gray-800 leading-tight">Profile</h2>}
17
13
  >
18
14
  <Head title="Profile" />
19
15
 
@@ -8,11 +8,7 @@ import TextInput from '@/Components/TextInput'
8
8
  import { useForm } from '@inertiajs/react'
9
9
  import { profile_destroy_path } from '@/routes'
10
10
 
11
- export default function DeleteUserForm({
12
- className = '',
13
- }: {
14
- className?: string
15
- }) {
11
+ export default function DeleteUserForm({ className = '' }: { className?: string }) {
16
12
  const [confirmingUserDeletion, setConfirmingUserDeletion] = useState(false)
17
13
  const passwordInput = useRef<HTMLInputElement>(null)
18
14
 
@@ -54,9 +50,8 @@ export default function DeleteUserForm({
54
50
  <h2 className="text-lg font-medium text-gray-900">Delete Account</h2>
55
51
 
56
52
  <p className="mt-1 text-sm text-gray-600">
57
- Once your account is deleted, all of its resources and data will be
58
- permanently deleted. Before deleting your account, please download any
59
- data or information that you wish to retain.
53
+ Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your
54
+ account, please download any data or information that you wish to retain.
60
55
  </p>
61
56
  </header>
62
57
 
@@ -64,22 +59,15 @@ export default function DeleteUserForm({
64
59
 
65
60
  <Modal show={confirmingUserDeletion} onClose={closeModal}>
66
61
  <form onSubmit={deleteUser} className="p-6">
67
- <h2 className="text-lg font-medium text-gray-900">
68
- Are you sure you want to delete your account?
69
- </h2>
62
+ <h2 className="text-lg font-medium text-gray-900">Are you sure you want to delete your account?</h2>
70
63
 
71
64
  <p className="mt-1 text-sm text-gray-600">
72
- Once your account is deleted, all of its resources and data will be
73
- permanently deleted. Please enter your password to confirm you would
74
- like to permanently delete your account.
65
+ Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your
66
+ password to confirm you would like to permanently delete your account.
75
67
  </p>
76
68
 
77
69
  <div className="mt-6">
78
- <InputLabel
79
- htmlFor="password"
80
- value="Password"
81
- className="sr-only"
82
- />
70
+ <InputLabel htmlFor="password" value="Password" className="sr-only" />
83
71
 
84
72
  <TextInput
85
73
  id="password"
@@ -7,20 +7,15 @@ import { useForm } from '@inertiajs/react'
7
7
  import { Transition } from '@headlessui/react'
8
8
  import { password_update_path } from '@/routes'
9
9
 
10
- export default function UpdatePasswordForm({
11
- className = '',
12
- }: {
13
- className?: string
14
- }) {
10
+ export default function UpdatePasswordForm({ className = '' }: { className?: string }) {
15
11
  const passwordInput = useRef<HTMLInputElement>(null)
16
12
  const currentPasswordInput = useRef<HTMLInputElement>(null)
17
13
 
18
- const { data, setData, errors, put, reset, processing, recentlySuccessful } =
19
- useForm({
20
- current_password: '',
21
- password: '',
22
- password_confirmation: '',
23
- })
14
+ const { data, setData, errors, put, reset, processing, recentlySuccessful } = useForm({
15
+ current_password: '',
16
+ password: '',
17
+ password_confirmation: '',
18
+ })
24
19
 
25
20
  const updatePassword: FormEventHandler = (e) => {
26
21
  e.preventDefault()
@@ -86,10 +81,7 @@ export default function UpdatePasswordForm({
86
81
  </div>
87
82
 
88
83
  <div>
89
- <InputLabel
90
- htmlFor="password_confirmation"
91
- value="Confirm Password"
92
- />
84
+ <InputLabel htmlFor="password_confirmation" value="Confirm Password" />
93
85
 
94
86
  <TextInput
95
87
  id="password_confirmation"
@@ -8,18 +8,13 @@ import { FormEventHandler } from 'react'
8
8
  import { PageProps } from '@/types'
9
9
  import { profile_update_path } from '@/routes'
10
10
 
11
- export default function UpdateProfileInformation({
12
- className = '',
13
- }: {
14
- className?: string
15
- }) {
11
+ export default function UpdateProfileInformation({ className = '' }: { className?: string }) {
16
12
  const user = usePage<PageProps>().props.auth.user
17
13
 
18
- const { data, setData, patch, errors, processing, recentlySuccessful } =
19
- useForm({
20
- name: user.name,
21
- email: user.email,
22
- })
14
+ const { data, setData, patch, errors, processing, recentlySuccessful } = useForm({
15
+ name: user.name,
16
+ email: user.email,
17
+ })
23
18
 
24
19
  const submit: FormEventHandler = (e) => {
25
20
  e.preventDefault()
@@ -30,13 +25,9 @@ export default function UpdateProfileInformation({
30
25
  return (
31
26
  <section className={className}>
32
27
  <header>
33
- <h2 className="text-lg font-medium text-gray-900">
34
- Profile Information
35
- </h2>
28
+ <h2 className="text-lg font-medium text-gray-900">Profile Information</h2>
36
29
 
37
- <p className="mt-1 text-sm text-gray-600">
38
- Update your account's profile information and email address.
39
- </p>
30
+ <p className="mt-1 text-sm text-gray-600">Update your account's profile information and email address.</p>
40
31
  </header>
41
32
 
42
33
  <form onSubmit={submit} className="mt-6 space-y-6">
@@ -64,8 +64,7 @@ export default function Welcome({
64
64
  target="_blank"
65
65
  style={{
66
66
  transition: 'background 0.25s cubic-bezier(0.33, 1, 0.68, 1)',
67
- filter:
68
- 'drop-shadow(0 20px 13px rgb(0 0 0 / 0.03)) drop-shadow(0 8px 5px rgb(0 0 0 / 0.08))',
67
+ filter: 'drop-shadow(0 20px 13px rgb(0 0 0 / 0.03)) drop-shadow(0 8px 5px rgb(0 0 0 / 0.08))',
69
68
  }}
70
69
  >
71
70
  <img
@@ -25,11 +25,7 @@ const appName = import.meta.env.VITE_APP_NAME || 'Rails'
25
25
 
26
26
  createInertiaApp({
27
27
  title: (title) => `${title} - ${appName}`,
28
- resolve: (name) =>
29
- resolvePageComponent(
30
- `../Pages/${name}.tsx`,
31
- import.meta.glob('../Pages/**/*.tsx'),
32
- ),
28
+ resolve: (name) => resolvePageComponent(`../Pages/${name}.tsx`, import.meta.glob('../Pages/**/*.tsx')),
33
29
  setup({ el, App, props }) {
34
30
  const root = createRoot(el)
35
31
 
@@ -3,12 +3,7 @@ import forms from '@tailwindcss/forms'
3
3
 
4
4
  /** @type {import('tailwindcss').Config} */
5
5
  export default {
6
- content: [
7
- './public/*.html',
8
- './app/helpers/**/*.rb',
9
- './app/views/**/*',
10
- './app/javascript/**/*.tsx',
11
- ],
6
+ content: ['./public/*.html', './app/helpers/**/*.rb', './app/views/**/*', './app/javascript/**/*.tsx'],
12
7
 
13
8
  theme: {
14
9
  extend: {
@@ -1,5 +1,7 @@
1
1
  <template>
2
2
  <svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
3
- <path d="m 237.03985,281.43515 c -1.54085,-2.49315 -1.43016,-32.97159 0.24592,-67.72985 3.02813,-62.79557 2.98467,-63.24086 -6.84044,-70.12264 -5.43834,-3.80913 -16.32202,-6.92574 -24.18594,-6.92574 -22.00734,0 -30.84257,-6.63121 -30.84257,-23.14872 0,-18.460367 5.31742,-22.209117 35.7331,-25.191397 27.97004,-2.74248 30.5663,-4.04226 26.94175,-13.48771 -2.14986,-5.6024 -13.90805,-6.59952 -77.8227,-6.59952 -69.400535,0 -75.177944,-0.58548 -73.8551,-7.48424 1.284851,-6.700534 9.490461,-7.708169 78.36353,-9.622595 42.31063,-1.176095 74.04161,-3.44104 70.51333,-5.033217 -11.28272,-5.091508 -103.7232,-12.917843 -134.65799,-11.40068 l -29.878628,1.465415 -3.171696,17.106837 c -1.744436,9.40876 -4.948521,63.009007 -7.120182,119.111597 -2.277699,58.84196 -5.815243,103.87156 -8.360116,106.41647 -2.4264,2.42639 -7.676475,3.15877 -11.666833,1.62754 -5.877786,-2.25554 -6.747202,-6.22009 -4.579445,-20.88223 1.471667,-9.954 3.74014,-63.32438 5.041047,-118.60085 2.647925,-112.511911 3.2489,-117.857541 13.890324,-123.552663 4.513472,-2.415528 45.033525,-3.067128 100.341569,-1.613517 109.0299,2.86548 110.09891,3.263428 110.09891,40.985371 0,30.923222 -7.28516,39.906492 -35.24013,43.454229 -29.06687,3.68892 -37.46391,6.17185 -37.46391,11.07783 0,2.19365 11.40965,3.98851 25.35478,3.98851 37.65833,0 38.79584,2.06051 38.79584,70.27428 0,31.25825 -1.20855,65.65073 -2.68573,76.42778 -2.59506,18.93304 -11.18137,28.79145 -16.94872,19.45971 z M 102.84208,259.48743 c -5.809371,-2.9396 -13.184926,-10.12819 -16.390123,-15.97462 -8.396565,-15.3158 2.912296,-41.49358 19.494463,-45.12587 20.60401,-4.51326 22.42665,-5.69589 22.42665,-14.55198 0,-6.8018 -2.78507,-8.68766 -12.83013,-8.68766 -16.253558,0 -29.936969,-13.44405 -29.936969,-29.41328 0,-14.42513 5.553783,-19.82093 24.591079,-23.89154 9.82484,-2.1008 13.8993,-5.37975 13.8993,-11.1856 0,-6.50902 -3.05408,-8.21363 -14.71608,-8.21363 -16.019022,0 -24.105594,-7.285117 -14.699611,-13.242787 3.241585,-2.05321 12.812471,-3.76252 21.268621,-3.79858 19.92576,-0.0847 30.60952,11.25947 28.76224,30.540617 -1.22046,12.73879 -3.23695,14.76612 -18.47681,18.57607 -30.922304,7.73057 -36.377959,19.24518 -9.11843,19.24518 22.57064,0 29.1179,7.65172 27.56665,32.21701 l -1.34139,21.24186 -20.81946,5.13821 c -11.45071,2.826 -21.79219,6.1109 -22.981063,7.29978 -4.590664,4.59067 3.475793,15.68791 14.430943,19.85304 16.19851,6.15868 88.0503,3.43548 90.32313,-3.42324 1.28741,-3.88501 -5.33813,-5.34589 -24.24513,-5.34589 -19.38669,0 -26.01664,-1.51819 -26.01664,-5.9575 0,-8.34429 9.63998,-11.14934 38.3165,-11.14934 28.67934,0 35.63045,5.45011 33.61018,26.35253 -0.96086,9.94142 -4.50427,15.66293 -12.05276,19.46151 -14.27136,7.1817 -96.89032,7.20826 -111.06516,0.0342 z m 57.07409,-60.66299 c -4.41463,-11.5043 3.01548,-16.23905 21.50632,-13.70463 20.26375,2.77747 30.64103,-1.74032 26.8271,-11.67922 -1.8078,-4.7111 -8.00515,-6.84671 -19.86838,-6.84671 -19.48707,0 -22.72529,-6.68 -6.27087,-12.93598 25.01034,-9.50892 44.62703,0.19588 44.62703,22.07791 0,17.75258 -8.58709,23.84253 -37.57444,26.6478 -21.20481,2.05209 -27.38199,1.30033 -29.24676,-3.55917 z" />
3
+ <path
4
+ d="m 237.03985,281.43515 c -1.54085,-2.49315 -1.43016,-32.97159 0.24592,-67.72985 3.02813,-62.79557 2.98467,-63.24086 -6.84044,-70.12264 -5.43834,-3.80913 -16.32202,-6.92574 -24.18594,-6.92574 -22.00734,0 -30.84257,-6.63121 -30.84257,-23.14872 0,-18.460367 5.31742,-22.209117 35.7331,-25.191397 27.97004,-2.74248 30.5663,-4.04226 26.94175,-13.48771 -2.14986,-5.6024 -13.90805,-6.59952 -77.8227,-6.59952 -69.400535,0 -75.177944,-0.58548 -73.8551,-7.48424 1.284851,-6.700534 9.490461,-7.708169 78.36353,-9.622595 42.31063,-1.176095 74.04161,-3.44104 70.51333,-5.033217 -11.28272,-5.091508 -103.7232,-12.917843 -134.65799,-11.40068 l -29.878628,1.465415 -3.171696,17.106837 c -1.744436,9.40876 -4.948521,63.009007 -7.120182,119.111597 -2.277699,58.84196 -5.815243,103.87156 -8.360116,106.41647 -2.4264,2.42639 -7.676475,3.15877 -11.666833,1.62754 -5.877786,-2.25554 -6.747202,-6.22009 -4.579445,-20.88223 1.471667,-9.954 3.74014,-63.32438 5.041047,-118.60085 2.647925,-112.511911 3.2489,-117.857541 13.890324,-123.552663 4.513472,-2.415528 45.033525,-3.067128 100.341569,-1.613517 109.0299,2.86548 110.09891,3.263428 110.09891,40.985371 0,30.923222 -7.28516,39.906492 -35.24013,43.454229 -29.06687,3.68892 -37.46391,6.17185 -37.46391,11.07783 0,2.19365 11.40965,3.98851 25.35478,3.98851 37.65833,0 38.79584,2.06051 38.79584,70.27428 0,31.25825 -1.20855,65.65073 -2.68573,76.42778 -2.59506,18.93304 -11.18137,28.79145 -16.94872,19.45971 z M 102.84208,259.48743 c -5.809371,-2.9396 -13.184926,-10.12819 -16.390123,-15.97462 -8.396565,-15.3158 2.912296,-41.49358 19.494463,-45.12587 20.60401,-4.51326 22.42665,-5.69589 22.42665,-14.55198 0,-6.8018 -2.78507,-8.68766 -12.83013,-8.68766 -16.253558,0 -29.936969,-13.44405 -29.936969,-29.41328 0,-14.42513 5.553783,-19.82093 24.591079,-23.89154 9.82484,-2.1008 13.8993,-5.37975 13.8993,-11.1856 0,-6.50902 -3.05408,-8.21363 -14.71608,-8.21363 -16.019022,0 -24.105594,-7.285117 -14.699611,-13.242787 3.241585,-2.05321 12.812471,-3.76252 21.268621,-3.79858 19.92576,-0.0847 30.60952,11.25947 28.76224,30.540617 -1.22046,12.73879 -3.23695,14.76612 -18.47681,18.57607 -30.922304,7.73057 -36.377959,19.24518 -9.11843,19.24518 22.57064,0 29.1179,7.65172 27.56665,32.21701 l -1.34139,21.24186 -20.81946,5.13821 c -11.45071,2.826 -21.79219,6.1109 -22.981063,7.29978 -4.590664,4.59067 3.475793,15.68791 14.430943,19.85304 16.19851,6.15868 88.0503,3.43548 90.32313,-3.42324 1.28741,-3.88501 -5.33813,-5.34589 -24.24513,-5.34589 -19.38669,0 -26.01664,-1.51819 -26.01664,-5.9575 0,-8.34429 9.63998,-11.14934 38.3165,-11.14934 28.67934,0 35.63045,5.45011 33.61018,26.35253 -0.96086,9.94142 -4.50427,15.66293 -12.05276,19.46151 -14.27136,7.1817 -96.89032,7.20826 -111.06516,0.0342 z m 57.07409,-60.66299 c -4.41463,-11.5043 3.01548,-16.23905 21.50632,-13.70463 20.26375,2.77747 30.64103,-1.74032 26.8271,-11.67922 -1.8078,-4.7111 -8.00515,-6.84671 -19.86838,-6.84671 -19.48707,0 -22.72529,-6.68 -6.27087,-12.93598 25.01034,-9.50892 44.62703,0.19588 44.62703,22.07791 0,17.75258 -8.58709,23.84253 -37.57444,26.6478 -21.20481,2.05209 -27.38199,1.30033 -29.24676,-3.55917 z"
5
+ />
4
6
  </svg>
5
7
  </template>
@@ -66,10 +66,7 @@ const open = ref(false)
66
66
  style="display: none"
67
67
  @click="open = false"
68
68
  >
69
- <div
70
- class="rounded-md ring-1 ring-black ring-opacity-5"
71
- :class="contentClasses"
72
- >
69
+ <div class="rounded-md ring-1 ring-black ring-opacity-5" :class="contentClasses">
73
70
  <slot name="content" />
74
71
  </div>
75
72
  </div>
@@ -60,11 +60,7 @@ const maxWidthClass = computed(() => {
60
60
  <template>
61
61
  <Teleport to="body">
62
62
  <Transition leave-active-class="duration-200">
63
- <div
64
- v-show="show"
65
- class="fixed inset-0 overflow-y-auto px-4 py-6 sm:px-0 z-50"
66
- scroll-region
67
- >
63
+ <div v-show="show" class="fixed inset-0 overflow-y-auto px-4 py-6 sm:px-0 z-50" scroll-region>
68
64
  <Transition
69
65
  enter-active-class="ease-out duration-300"
70
66
  enter-from-class="opacity-0"
@@ -73,14 +69,8 @@ const maxWidthClass = computed(() => {
73
69
  leave-from-class="opacity-100"
74
70
  leave-to-class="opacity-0"
75
71
  >
76
- <div
77
- v-show="show"
78
- class="fixed inset-0 transform transition-all"
79
- @click="close"
80
- >
81
- <div
82
- class="absolute inset-0 bg-gray-500 dark:bg-gray-900 opacity-75"
83
- />
72
+ <div v-show="show" class="fixed inset-0 transform transition-all" @click="close">
73
+ <div class="absolute inset-0 bg-gray-500 dark:bg-gray-900 opacity-75" />
84
74
  </div>
85
75
  </Transition>
86
76
 
@@ -16,9 +16,7 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
16
16
  <template>
17
17
  <div>
18
18
  <div class="min-h-screen bg-gray-100 dark:bg-gray-900">
19
- <nav
20
- class="bg-white dark:bg-gray-800 border-b border-gray-100 dark:border-gray-700"
21
- >
19
+ <nav class="bg-white dark:bg-gray-800 border-b border-gray-100 dark:border-gray-700">
22
20
  <!-- Primary Navigation Menu -->
23
21
  <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
24
22
  <div class="flex justify-between h-16">
@@ -26,20 +24,13 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
26
24
  <!-- Logo -->
27
25
  <div class="shrink-0 flex items-center">
28
26
  <Link href="/">
29
- <ApplicationLogo
30
- class="block h-9 w-auto fill-current text-red-800 dark:text-red-200"
31
- />
27
+ <ApplicationLogo class="block h-9 w-auto fill-current text-red-800 dark:text-red-200" />
32
28
  </Link>
33
29
  </div>
34
30
 
35
31
  <!-- Navigation Links -->
36
32
  <div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
37
- <NavLink
38
- :href="dashboard_path()"
39
- :active="pathname.match(/dashboard/) != null"
40
- >
41
- Dashboard
42
- </NavLink>
33
+ <NavLink :href="dashboard_path()" :active="pathname.match(/dashboard/) != null"> Dashboard </NavLink>
43
34
  </div>
44
35
  </div>
45
36
 
@@ -72,16 +63,8 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
72
63
  </template>
73
64
 
74
65
  <template #content>
75
- <DropdownLink :href="profile_edit_path()">
76
- Profile
77
- </DropdownLink>
78
- <DropdownLink
79
- :href="logout_path()"
80
- method="post"
81
- as="button"
82
- >
83
- Log Out
84
- </DropdownLink>
66
+ <DropdownLink :href="profile_edit_path()"> Profile </DropdownLink>
67
+ <DropdownLink :href="logout_path()" method="post" as="button"> Log Out </DropdownLink>
85
68
  </template>
86
69
  </Dropdown>
87
70
  </div>
@@ -93,12 +76,7 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
93
76
  @click="showingNavigationDropdown = !showingNavigationDropdown"
94
77
  class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 dark:text-gray-500 hover:text-gray-500 dark:hover:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-900 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-900 focus:text-gray-500 dark:focus:text-gray-400 transition duration-150 ease-in-out"
95
78
  >
96
- <svg
97
- class="h-6 w-6"
98
- stroke="currentColor"
99
- fill="none"
100
- viewBox="0 0 24 24"
101
- >
79
+ <svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
102
80
  <path
103
81
  :class="{
104
82
  hidden: showingNavigationDropdown,
@@ -134,10 +112,7 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
134
112
  class="sm:hidden"
135
113
  >
136
114
  <div class="pt-2 pb-3 space-y-1">
137
- <ResponsiveNavLink
138
- :href="dashboard_path()"
139
- :active="pathname.match(/dashboard/) != null"
140
- >
115
+ <ResponsiveNavLink :href="dashboard_path()" :active="pathname.match(/dashboard/) != null">
141
116
  Dashboard
142
117
  </ResponsiveNavLink>
143
118
  </div>
@@ -145,9 +120,7 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
145
120
  <!-- Responsive Settings Options -->
146
121
  <div class="pt-4 pb-1 border-t border-gray-200 dark:border-gray-600">
147
122
  <div class="px-4">
148
- <div
149
- class="font-medium text-base text-gray-800 dark:text-gray-200"
150
- >
123
+ <div class="font-medium text-base text-gray-800 dark:text-gray-200">
151
124
  {{ $page.props.auth.user.name }}
152
125
  </div>
153
126
  <div class="font-medium text-sm text-gray-500">
@@ -156,16 +129,8 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
156
129
  </div>
157
130
 
158
131
  <div class="mt-3 space-y-1">
159
- <ResponsiveNavLink :href="profile_edit_path()">
160
- Profile
161
- </ResponsiveNavLink>
162
- <ResponsiveNavLink
163
- :href="logout_path()"
164
- method="post"
165
- as="button"
166
- >
167
- Log Out
168
- </ResponsiveNavLink>
132
+ <ResponsiveNavLink :href="profile_edit_path()"> Profile </ResponsiveNavLink>
133
+ <ResponsiveNavLink :href="logout_path()" method="post" as="button"> Log Out </ResponsiveNavLink>
169
134
  </div>
170
135
  </div>
171
136
  </div>
@@ -4,18 +4,14 @@ import { Link } from '@inertiajs/vue3'
4
4
  </script>
5
5
 
6
6
  <template>
7
- <div
8
- class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100 dark:bg-gray-900"
9
- >
7
+ <div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100 dark:bg-gray-900">
10
8
  <div>
11
9
  <Link href="/">
12
10
  <ApplicationLogo class="w-20 h-20 fill-current text-red-500" />
13
11
  </Link>
14
12
  </div>
15
13
 
16
- <div
17
- class="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"
18
- >
14
+ <div class="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">
19
15
  <slot />
20
16
  </div>
21
17
  </div>
@@ -25,15 +25,11 @@ const submit = () => {
25
25
  <Head title="Forgot Password" />
26
26
 
27
27
  <div class="mb-4 text-sm text-gray-600 dark:text-gray-400">
28
- Forgot your password? No problem. Just let us know your email address and
29
- we will email you a password reset link that will allow you to choose a
30
- new one.
28
+ Forgot your password? No problem. Just let us know your email address and we will email you a password reset link
29
+ that will allow you to choose a new one.
31
30
  </div>
32
31
 
33
- <div
34
- v-if="status"
35
- class="mb-4 font-medium text-sm text-green-600 dark:text-green-400"
36
- >
32
+ <div v-if="status" class="mb-4 font-medium text-sm text-green-600 dark:text-green-400">
37
33
  {{ status }}
38
34
  </div>
39
35
 
@@ -55,10 +51,7 @@ const submit = () => {
55
51
  </div>
56
52
 
57
53
  <div class="flex items-center justify-end mt-4">
58
- <PrimaryButton
59
- :class="{ 'opacity-25': form.processing }"
60
- :disabled="form.processing"
61
- >
54
+ <PrimaryButton :class="{ 'opacity-25': form.processing }" :disabled="form.processing">
62
55
  Email Password Reset Link
63
56
  </PrimaryButton>
64
57
  </div>
@@ -9,7 +9,6 @@ import { Head, Link, useForm } from '@inertiajs/vue3'
9
9
  import { login_path, password_request_path } from '@/routes'
10
10
 
11
11
  defineProps<{
12
- canResetPassword?: boolean
13
12
  status?: string
14
13
  }>()
15
14
 
@@ -71,26 +70,19 @@ const submit = () => {
71
70
  <div class="block mt-4">
72
71
  <label class="flex items-center">
73
72
  <Checkbox name="remember" v-model:checked="form.remember" />
74
- <span class="ms-2 text-sm text-gray-600 dark:text-gray-400"
75
- >Remember me</span
76
- >
73
+ <span class="ms-2 text-sm text-gray-600 dark:text-gray-400">Remember me</span>
77
74
  </label>
78
75
  </div>
79
76
 
80
77
  <div class="flex items-center justify-end mt-4">
81
78
  <Link
82
- v-if="canResetPassword"
83
79
  :href="password_request_path()"
84
80
  class="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
85
81
  >
86
82
  Forgot your password?
87
83
  </Link>
88
84
 
89
- <PrimaryButton
90
- class="ms-4"
91
- :class="{ 'opacity-25': form.processing }"
92
- :disabled="form.processing"
93
- >
85
+ <PrimaryButton class="ms-4" :class="{ 'opacity-25': form.processing }" :disabled="form.processing">
94
86
  Log in
95
87
  </PrimaryButton>
96
88
  </div>
@@ -97,11 +97,7 @@ const submit = () => {
97
97
  Already registered?
98
98
  </Link>
99
99
 
100
- <PrimaryButton
101
- class="ms-4"
102
- :class="{ 'opacity-25': form.processing }"
103
- :disabled="form.processing"
104
- >
100
+ <PrimaryButton class="ms-4" :class="{ 'opacity-25': form.processing }" :disabled="form.processing">
105
101
  Register
106
102
  </PrimaryButton>
107
103
  </div>
@@ -80,10 +80,7 @@ const submit = () => {
80
80
  </div>
81
81
 
82
82
  <div class="flex items-center justify-end mt-4">
83
- <PrimaryButton
84
- :class="{ 'opacity-25': form.processing }"
85
- :disabled="form.processing"
86
- >
83
+ <PrimaryButton :class="{ 'opacity-25': form.processing }" :disabled="form.processing">
87
84
  Reset Password
88
85
  </PrimaryButton>
89
86
  </div>
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import GuestLayout from '@/Layouts/GuestLayout.vue'
4
+ import PrimaryButton from '@/Components/PrimaryButton.vue'
5
+ import { Head, Link, useForm } from '@inertiajs/vue3'
6
+ import { logout_path, verification_send_path } from '@/routes'
7
+
8
+ const props = defineProps<{
9
+ status?: string
10
+ }>()
11
+
12
+ const form = useForm({})
13
+
14
+ const submit = () => {
15
+ form.post(verification_send_path())
16
+ }
17
+
18
+ const verificationLinkSent = computed(() => props.status === 'verification-link-sent')
19
+ </script>
20
+
21
+ <template>
22
+ <GuestLayout>
23
+ <Head title="Email Verification" />
24
+
25
+ <div class="mb-4 text-sm text-gray-600 dark:text-gray-400">
26
+ Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just
27
+ emailed to you? If you didn't receive the email, we will gladly send you another.
28
+ </div>
29
+
30
+ <div class="mb-4 font-medium text-sm text-green-600 dark:text-green-400" v-if="verificationLinkSent">
31
+ A new verification link has been sent to the email address you provided during registration.
32
+ </div>
33
+
34
+ <form @submit.prevent="submit">
35
+ <div class="mt-4 flex items-center justify-between">
36
+ <PrimaryButton :class="{ 'opacity-25': form.processing }" :disabled="form.processing">
37
+ Resend Verification Email
38
+ </PrimaryButton>
39
+
40
+ <Link
41
+ :href="logout_path()"
42
+ method="post"
43
+ as="button"
44
+ class="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
45
+ >Log Out</Link
46
+ >
47
+ </div>
48
+ </form>
49
+ </GuestLayout>
50
+ </template>
@@ -8,21 +8,13 @@ import { Head } from '@inertiajs/vue3'
8
8
 
9
9
  <AuthenticatedLayout>
10
10
  <template #header>
11
- <h2
12
- class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight"
13
- >
14
- Dashboard
15
- </h2>
11
+ <h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">Dashboard</h2>
16
12
  </template>
17
13
 
18
14
  <div class="py-12">
19
15
  <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
20
- <div
21
- class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg"
22
- >
23
- <div class="p-6 text-gray-900 dark:text-gray-100">
24
- You're logged in!
25
- </div>
16
+ <div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
17
+ <div class="p-6 text-gray-900 dark:text-gray-100">You're logged in!</div>
26
18
  </div>
27
19
  </div>
28
20
  </div>
@@ -16,21 +16,13 @@ defineProps<{
16
16
 
17
17
  <AuthenticatedLayout>
18
18
  <template #header>
19
- <h2
20
- class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight"
21
- >
22
- Profile
23
- </h2>
19
+ <h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">Profile</h2>
24
20
  </template>
25
21
 
26
22
  <div class="py-12">
27
23
  <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
28
24
  <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
29
- <UpdateProfileInformationForm
30
- :must-verify-email="mustVerifyEmail"
31
- :status="status"
32
- class="max-w-xl"
33
- />
25
+ <UpdateProfileInformationForm :must-verify-email="mustVerifyEmail" :status="status" class="max-w-xl" />
34
26
  </div>
35
27
 
36
28
  <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">