kaze 0.8.0 → 0.9.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 (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">