kaze 0.5.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kaze/commands/install_command.rb +18 -4
  3. data/lib/kaze/commands/installs_hotwire_stack.rb +5 -2
  4. data/lib/kaze/commands/installs_inertia_stacks.rb +13 -3
  5. data/lib/kaze/version.rb +1 -1
  6. data/stubs/default/app/forms/auth/login_form.rb +2 -8
  7. data/stubs/default/app/forms/update_profile_information_form.rb +1 -1
  8. data/stubs/default/app/models/auth.rb +57 -0
  9. data/stubs/default/app/models/current.rb +1 -1
  10. data/stubs/default/app/validators/current_password_validator.rb +1 -1
  11. data/stubs/default/app/views/layouts/mailer.html.erb +367 -372
  12. data/stubs/default/app/views/layouts/mailer.text.erb +1 -4
  13. data/stubs/default/app/views/user_mailer/reset_password.html.erb +21 -26
  14. data/stubs/default/test/factories/users.rb +7 -0
  15. data/stubs/default/test/integration/auth/authentication_test.rb +43 -0
  16. data/stubs/default/test/integration/auth/password_reset_test.rb +41 -0
  17. data/stubs/default/test/integration/auth/registration_test.rb +21 -0
  18. data/stubs/default/test/integration/password_update_test.rb +28 -0
  19. data/stubs/default/test/integration/profile_test.rb +51 -0
  20. data/stubs/default/test/test_helper.rb +38 -0
  21. data/stubs/hotwire/app/components/dropdown_component.html.erb +17 -18
  22. data/stubs/hotwire/app/components/modal_component.html.erb +55 -59
  23. data/stubs/hotwire/app/controllers/application_controller.rb +1 -0
  24. data/stubs/hotwire/app/controllers/auth/authenticated_session_controller.rb +10 -7
  25. data/stubs/hotwire/app/controllers/auth/new_password_controller.rb +3 -1
  26. data/stubs/hotwire/app/controllers/auth/password_reset_link_controller.rb +3 -1
  27. data/stubs/hotwire/app/controllers/auth/registered_user_controller.rb +4 -2
  28. data/stubs/hotwire/app/controllers/concerns/authenticate.rb +5 -20
  29. data/stubs/hotwire/app/controllers/concerns/redirect_if_authenticated.rb +19 -0
  30. data/stubs/hotwire/app/controllers/concerns/set_current_auth.rb +9 -0
  31. data/stubs/hotwire/app/controllers/password_controller.rb +1 -1
  32. data/stubs/hotwire/app/controllers/profile_controller.rb +6 -4
  33. data/stubs/hotwire/app/controllers/welcome_controller.rb +1 -1
  34. data/stubs/hotwire/app/javascript/application.js +3 -3
  35. data/stubs/hotwire/app/views/auth/forgot_password.html.erb +12 -17
  36. data/stubs/hotwire/app/views/auth/login.html.erb +0 -9
  37. data/stubs/hotwire/app/views/auth/register.html.erb +0 -13
  38. data/stubs/hotwire/app/views/auth/reset_password.html.erb +0 -7
  39. data/stubs/hotwire/app/views/dashboard/index.html.erb +9 -10
  40. data/stubs/hotwire/app/views/layouts/_navigation.html.erb +77 -87
  41. data/stubs/hotwire/app/views/layouts/application.html.erb +0 -9
  42. data/stubs/hotwire/app/views/layouts/guest.html.erb +0 -6
  43. data/stubs/hotwire/app/views/profile/edit.html.erb +19 -22
  44. data/stubs/hotwire/app/views/profile/partials/_delete_user_form.html.erb +32 -42
  45. data/stubs/hotwire/app/views/profile/partials/_update_password_form.html.erb +42 -55
  46. data/stubs/hotwire/app/views/profile/partials/_update_profile_information_form.html.erb +36 -46
  47. data/stubs/hotwire/app/views/welcome/index.html.erb +34 -46
  48. data/stubs/hotwire/config/tailwind.config.js +2 -2
  49. data/stubs/inertia-common/app/controllers/application_controller.rb +1 -0
  50. data/stubs/inertia-common/app/controllers/auth/authenticated_session_controller.rb +10 -7
  51. data/stubs/inertia-common/app/controllers/auth/new_password_controller.rb +3 -1
  52. data/stubs/inertia-common/app/controllers/auth/password_reset_link_controller.rb +3 -1
  53. data/stubs/inertia-common/app/controllers/auth/registered_user_controller.rb +4 -2
  54. data/stubs/inertia-common/app/controllers/concerns/authenticate.rb +5 -20
  55. data/stubs/inertia-common/app/controllers/concerns/handle_inertia_requests.rb +1 -1
  56. data/stubs/inertia-common/app/controllers/concerns/redirect_if_authenticated.rb +19 -0
  57. data/stubs/inertia-common/app/controllers/concerns/set_current_auth.rb +9 -0
  58. data/stubs/inertia-common/app/controllers/password_controller.rb +1 -1
  59. data/stubs/inertia-common/app/controllers/profile_controller.rb +5 -3
  60. data/stubs/inertia-common/app/controllers/welcome_controller.rb +1 -1
  61. data/stubs/inertia-common/test/integration/password_update_test.rb +28 -0
  62. data/stubs/inertia-common/test/integration/profile_test.rb +51 -0
  63. data/stubs/inertia-react-ts/app/javascript/Components/ApplicationLogo.tsx +13 -9
  64. data/stubs/inertia-react-ts/app/javascript/Components/Checkbox.tsx +12 -12
  65. data/stubs/inertia-react-ts/app/javascript/Components/DangerButton.tsx +20 -15
  66. data/stubs/inertia-react-ts/app/javascript/Components/Dropdown.tsx +115 -88
  67. data/stubs/inertia-react-ts/app/javascript/Components/InputError.tsx +14 -7
  68. data/stubs/inertia-react-ts/app/javascript/Components/InputLabel.tsx +15 -7
  69. data/stubs/inertia-react-ts/app/javascript/Components/Modal.tsx +60 -60
  70. data/stubs/inertia-react-ts/app/javascript/Components/NavLink.tsx +21 -16
  71. data/stubs/inertia-react-ts/app/javascript/Components/PrimaryButton.tsx +20 -15
  72. data/stubs/inertia-react-ts/app/javascript/Components/ResponsiveNavLink.tsx +19 -14
  73. data/stubs/inertia-react-ts/app/javascript/Components/SecondaryButton.tsx +22 -16
  74. data/stubs/inertia-react-ts/app/javascript/Components/TextInput.tsx +32 -24
  75. data/stubs/inertia-react-ts/app/javascript/Layouts/AuthenticatedLayout.tsx +157 -117
  76. data/stubs/inertia-react-ts/app/javascript/Layouts/GuestLayout.tsx +15 -15
  77. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ForgotPassword.tsx +52 -49
  78. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Login.tsx +90 -82
  79. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Register.tsx +118 -115
  80. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/ResetPassword.tsx +63 -60
  81. data/stubs/inertia-react-ts/app/javascript/Pages/Dashboard.tsx +23 -17
  82. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Edit.tsx +31 -27
  83. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.tsx +109 -99
  84. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/UpdatePasswordForm.tsx +121 -113
  85. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/UpdateProfileInformationForm.tsx +76 -69
  86. data/stubs/inertia-react-ts/app/javascript/Pages/Welcome.tsx +87 -63
  87. data/stubs/inertia-react-ts/app/javascript/entrypoints/application.tsx +32 -25
  88. data/stubs/inertia-react-ts/app/views/layouts/application.html.erb +0 -4
  89. data/stubs/inertia-react-ts/config/tailwind.config.js +2 -2
  90. data/stubs/inertia-react-ts/vite.config.ts +2 -5
  91. data/stubs/inertia-vue-ts/app/javascript/Components/ApplicationLogo.vue +10 -6
  92. data/stubs/inertia-vue-ts/app/javascript/Components/Checkbox.vue +18 -18
  93. data/stubs/inertia-vue-ts/app/javascript/Components/DangerButton.vue +5 -5
  94. data/stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue +60 -57
  95. data/stubs/inertia-vue-ts/app/javascript/Components/DropdownLink.vue +9 -9
  96. data/stubs/inertia-vue-ts/app/javascript/Components/InputError.vue +7 -7
  97. data/stubs/inertia-vue-ts/app/javascript/Components/InputLabel.vue +6 -6
  98. data/stubs/inertia-vue-ts/app/javascript/Components/Modal.vue +84 -74
  99. data/stubs/inertia-vue-ts/app/javascript/Components/NavLink.vue +12 -12
  100. data/stubs/inertia-vue-ts/app/javascript/Components/PrimaryButton.vue +5 -5
  101. data/stubs/inertia-vue-ts/app/javascript/Components/ResponsiveNavLink.vue +12 -12
  102. data/stubs/inertia-vue-ts/app/javascript/Components/SecondaryButton.vue +13 -13
  103. data/stubs/inertia-vue-ts/app/javascript/Components/TextInput.vue +13 -13
  104. data/stubs/inertia-vue-ts/app/javascript/Layouts/AuthenticatedLayout.vue +168 -136
  105. data/stubs/inertia-vue-ts/app/javascript/Layouts/GuestLayout.vue +15 -13
  106. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ForgotPassword.vue +56 -49
  107. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Login.vue +78 -72
  108. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Register.vue +101 -97
  109. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/ResetPassword.vue +71 -68
  110. data/stubs/inertia-vue-ts/app/javascript/Pages/Dashboard.vue +22 -14
  111. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Edit.vue +34 -30
  112. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/DeleteUserForm.vue +87 -83
  113. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/UpdatePasswordForm.vue +105 -98
  114. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/UpdateProfileInformationForm.vue +69 -59
  115. data/stubs/inertia-vue-ts/app/javascript/Pages/Welcome.vue +74 -47
  116. data/stubs/inertia-vue-ts/app/views/layouts/application.html.erb +0 -4
  117. data/stubs/inertia-vue-ts/config/tailwind.config.js +2 -2
  118. data/stubs/inertia-vue-ts/vite.config.ts +2 -5
  119. metadata +18 -6
  120. data/stubs/hotwire/bin/vite +0 -27
  121. data/stubs/inertia-common/Procfile.dev +0 -3
  122. /data/stubs/{hotwire → default}/Procfile.dev +0 -0
  123. /data/stubs/hotwire/app/javascript/{alpinejs.js → alpinejs.stub} +0 -0
@@ -1,75 +1,78 @@
1
1
  <script setup lang="ts">
2
- import { computed, onMounted, onUnmounted, ref } from 'vue';
2
+ import { computed, onMounted, onUnmounted, ref } from 'vue'
3
3
 
4
4
  const props = withDefaults(
5
- defineProps<{
6
- align?: 'left' | 'right';
7
- width?: '48';
8
- contentClasses?: string;
9
- }>(),
10
- {
11
- align: 'right',
12
- width: '48',
13
- contentClasses: 'py-1 bg-white dark:bg-gray-700',
14
- }
15
- );
5
+ defineProps<{
6
+ align?: 'left' | 'right'
7
+ width?: '48'
8
+ contentClasses?: string
9
+ }>(),
10
+ {
11
+ align: 'right',
12
+ width: '48',
13
+ contentClasses: 'py-1 bg-white dark:bg-gray-700',
14
+ },
15
+ )
16
16
 
17
17
  const closeOnEscape = (e: KeyboardEvent) => {
18
- if (open.value && e.key === 'Escape') {
19
- open.value = false;
20
- }
21
- };
18
+ if (open.value && e.key === 'Escape') {
19
+ open.value = false
20
+ }
21
+ }
22
22
 
23
- onMounted(() => document.addEventListener('keydown', closeOnEscape));
24
- onUnmounted(() => document.removeEventListener('keydown', closeOnEscape));
23
+ onMounted(() => document.addEventListener('keydown', closeOnEscape))
24
+ onUnmounted(() => document.removeEventListener('keydown', closeOnEscape))
25
25
 
26
26
  const widthClass = computed(() => {
27
- return {
28
- 48: 'w-48',
29
- }[props.width.toString()];
30
- });
27
+ return {
28
+ 48: 'w-48',
29
+ }[props.width.toString()]
30
+ })
31
31
 
32
32
  const alignmentClasses = computed(() => {
33
- if (props.align === 'left') {
34
- return 'ltr:origin-top-left rtl:origin-top-right start-0';
35
- } else if (props.align === 'right') {
36
- return 'ltr:origin-top-right rtl:origin-top-left end-0';
37
- } else {
38
- return 'origin-top';
39
- }
40
- });
33
+ if (props.align === 'left') {
34
+ return 'ltr:origin-top-left rtl:origin-top-right start-0'
35
+ } else if (props.align === 'right') {
36
+ return 'ltr:origin-top-right rtl:origin-top-left end-0'
37
+ } else {
38
+ return 'origin-top'
39
+ }
40
+ })
41
41
 
42
- const open = ref(false);
42
+ const open = ref(false)
43
43
  </script>
44
44
 
45
45
  <template>
46
- <div class="relative">
47
- <div @click="open = !open">
48
- <slot name="trigger" />
49
- </div>
46
+ <div class="relative">
47
+ <div @click="open = !open">
48
+ <slot name="trigger" />
49
+ </div>
50
50
 
51
- <!-- Full Screen Dropdown Overlay -->
52
- <div v-show="open" class="fixed inset-0 z-40" @click="open = false"></div>
51
+ <!-- Full Screen Dropdown Overlay -->
52
+ <div v-show="open" class="fixed inset-0 z-40" @click="open = false"></div>
53
53
 
54
- <Transition
55
- enter-active-class="transition ease-out duration-200"
56
- enter-from-class="opacity-0 scale-95"
57
- enter-to-class="opacity-100 scale-100"
58
- leave-active-class="transition ease-in duration-75"
59
- leave-from-class="opacity-100 scale-100"
60
- leave-to-class="opacity-0 scale-95"
54
+ <Transition
55
+ enter-active-class="transition ease-out duration-200"
56
+ enter-from-class="opacity-0 scale-95"
57
+ enter-to-class="opacity-100 scale-100"
58
+ leave-active-class="transition ease-in duration-75"
59
+ leave-from-class="opacity-100 scale-100"
60
+ leave-to-class="opacity-0 scale-95"
61
+ >
62
+ <div
63
+ v-show="open"
64
+ class="absolute z-50 mt-2 rounded-md shadow-lg"
65
+ :class="[widthClass, alignmentClasses]"
66
+ style="display: none"
67
+ @click="open = false"
68
+ >
69
+ <div
70
+ class="rounded-md ring-1 ring-black ring-opacity-5"
71
+ :class="contentClasses"
61
72
  >
62
- <div
63
- v-show="open"
64
- class="absolute z-50 mt-2 rounded-md shadow-lg"
65
- :class="[widthClass, alignmentClasses]"
66
- style="display: none"
67
- @click="open = false"
68
- >
69
- <div class="rounded-md ring-1 ring-black ring-opacity-5" :class="contentClasses">
70
- <slot name="content" />
71
- </div>
72
- </div>
73
- </Transition>
74
- </div>
73
+ <slot name="content" />
74
+ </div>
75
+ </div>
76
+ </Transition>
77
+ </div>
75
78
  </template>
@@ -1,16 +1,16 @@
1
1
  <script setup lang="ts">
2
- import { Link } from '@inertiajs/vue3';
2
+ import { Link } from '@inertiajs/vue3'
3
3
 
4
4
  defineProps<{
5
- href: string;
6
- }>();
5
+ href: string
6
+ }>()
7
7
  </script>
8
8
 
9
9
  <template>
10
- <Link
11
- :href="href"
12
- class="block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out"
13
- >
14
- <slot />
15
- </Link>
10
+ <Link
11
+ :href="href"
12
+ class="block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out"
13
+ >
14
+ <slot />
15
+ </Link>
16
16
  </template>
@@ -1,13 +1,13 @@
1
1
  <script setup lang="ts">
2
2
  defineProps<{
3
- message?: string;
4
- }>();
3
+ message?: string
4
+ }>()
5
5
  </script>
6
6
 
7
7
  <template>
8
- <div v-show="message">
9
- <p class="text-sm text-red-600 dark:text-red-400">
10
- {{ message }}
11
- </p>
12
- </div>
8
+ <div v-show="message">
9
+ <p class="text-sm text-red-600 dark:text-red-400">
10
+ {{ message }}
11
+ </p>
12
+ </div>
13
13
  </template>
@@ -1,12 +1,12 @@
1
1
  <script setup lang="ts">
2
2
  defineProps<{
3
- value?: string;
4
- }>();
3
+ value?: string
4
+ }>()
5
5
  </script>
6
6
 
7
7
  <template>
8
- <label class="block font-medium text-sm text-gray-700 dark:text-gray-300">
9
- <span v-if="value">{{ value }}</span>
10
- <span v-else><slot /></span>
11
- </label>
8
+ <label class="block font-medium text-sm text-gray-700 dark:text-gray-300">
9
+ <span v-if="value">{{ value }}</span>
10
+ <span v-else><slot /></span>
11
+ </label>
12
12
  </template>
@@ -1,96 +1,106 @@
1
1
  <script setup lang="ts">
2
- import { computed, onMounted, onUnmounted, watch } from 'vue';
2
+ import { computed, onMounted, onUnmounted, watch } from 'vue'
3
3
 
4
4
  const props = withDefaults(
5
- defineProps<{
6
- show?: boolean;
7
- maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';
8
- closeable?: boolean;
9
- }>(),
10
- {
11
- show: false,
12
- maxWidth: '2xl',
13
- closeable: true,
14
- }
15
- );
5
+ defineProps<{
6
+ show?: boolean
7
+ maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl'
8
+ closeable?: boolean
9
+ }>(),
10
+ {
11
+ show: false,
12
+ maxWidth: '2xl',
13
+ closeable: true,
14
+ },
15
+ )
16
16
 
17
- const emit = defineEmits(['close']);
17
+ const emit = defineEmits(['close'])
18
18
 
19
19
  watch(
20
- () => props.show,
21
- () => {
22
- if (props.show) {
23
- document.body.style.overflow = 'hidden';
24
- } else {
25
- document.body.style.overflow = 'visible';
26
- }
20
+ () => props.show,
21
+ () => {
22
+ if (props.show) {
23
+ document.body.style.overflow = 'hidden'
24
+ } else {
25
+ document.body.style.overflow = 'visible'
27
26
  }
28
- );
27
+ },
28
+ )
29
29
 
30
30
  const close = () => {
31
- if (props.closeable) {
32
- emit('close');
33
- }
34
- };
31
+ if (props.closeable) {
32
+ emit('close')
33
+ }
34
+ }
35
35
 
36
36
  const closeOnEscape = (e: KeyboardEvent) => {
37
- if (e.key === 'Escape' && props.show) {
38
- close();
39
- }
40
- };
37
+ if (e.key === 'Escape' && props.show) {
38
+ close()
39
+ }
40
+ }
41
41
 
42
- onMounted(() => document.addEventListener('keydown', closeOnEscape));
42
+ onMounted(() => document.addEventListener('keydown', closeOnEscape))
43
43
 
44
44
  onUnmounted(() => {
45
- document.removeEventListener('keydown', closeOnEscape);
46
- document.body.style.overflow = 'visible';
47
- });
45
+ document.removeEventListener('keydown', closeOnEscape)
46
+ document.body.style.overflow = 'visible'
47
+ })
48
48
 
49
49
  const maxWidthClass = computed(() => {
50
- return {
51
- sm: 'sm:max-w-sm',
52
- md: 'sm:max-w-md',
53
- lg: 'sm:max-w-lg',
54
- xl: 'sm:max-w-xl',
55
- '2xl': 'sm:max-w-2xl',
56
- }[props.maxWidth];
57
- });
50
+ return {
51
+ sm: 'sm:max-w-sm',
52
+ md: 'sm:max-w-md',
53
+ lg: 'sm:max-w-lg',
54
+ xl: 'sm:max-w-xl',
55
+ '2xl': 'sm:max-w-2xl',
56
+ }[props.maxWidth]
57
+ })
58
58
  </script>
59
59
 
60
60
  <template>
61
- <Teleport to="body">
62
- <Transition leave-active-class="duration-200">
63
- <div v-show="show" class="fixed inset-0 overflow-y-auto px-4 py-6 sm:px-0 z-50" scroll-region>
64
- <Transition
65
- enter-active-class="ease-out duration-300"
66
- enter-from-class="opacity-0"
67
- enter-to-class="opacity-100"
68
- leave-active-class="ease-in duration-200"
69
- leave-from-class="opacity-100"
70
- leave-to-class="opacity-0"
71
- >
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" />
74
- </div>
75
- </Transition>
61
+ <Teleport to="body">
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
+ >
68
+ <Transition
69
+ enter-active-class="ease-out duration-300"
70
+ enter-from-class="opacity-0"
71
+ enter-to-class="opacity-100"
72
+ leave-active-class="ease-in duration-200"
73
+ leave-from-class="opacity-100"
74
+ leave-to-class="opacity-0"
75
+ >
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
+ />
84
+ </div>
85
+ </Transition>
76
86
 
77
- <Transition
78
- enter-active-class="ease-out duration-300"
79
- enter-from-class="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
80
- enter-to-class="opacity-100 translate-y-0 sm:scale-100"
81
- leave-active-class="ease-in duration-200"
82
- leave-from-class="opacity-100 translate-y-0 sm:scale-100"
83
- leave-to-class="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
84
- >
85
- <div
86
- v-show="show"
87
- class="mb-6 bg-white dark:bg-gray-800 rounded-lg overflow-hidden shadow-xl transform transition-all sm:w-full sm:mx-auto"
88
- :class="maxWidthClass"
89
- >
90
- <slot v-if="show" />
91
- </div>
92
- </Transition>
93
- </div>
87
+ <Transition
88
+ enter-active-class="ease-out duration-300"
89
+ enter-from-class="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
90
+ enter-to-class="opacity-100 translate-y-0 sm:scale-100"
91
+ leave-active-class="ease-in duration-200"
92
+ leave-from-class="opacity-100 translate-y-0 sm:scale-100"
93
+ leave-to-class="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
94
+ >
95
+ <div
96
+ v-show="show"
97
+ class="mb-6 bg-white dark:bg-gray-800 rounded-lg overflow-hidden shadow-xl transform transition-all sm:w-full sm:mx-auto"
98
+ :class="maxWidthClass"
99
+ >
100
+ <slot v-if="show" />
101
+ </div>
94
102
  </Transition>
95
- </Teleport>
103
+ </div>
104
+ </Transition>
105
+ </Teleport>
96
106
  </template>
@@ -1,21 +1,21 @@
1
1
  <script setup lang="ts">
2
- import { computed } from 'vue';
3
- import { Link } from '@inertiajs/vue3';
2
+ import { computed } from 'vue'
3
+ import { Link } from '@inertiajs/vue3'
4
4
 
5
5
  const props = defineProps<{
6
- href: string;
7
- active?: boolean;
8
- }>();
6
+ href: string
7
+ active?: boolean
8
+ }>()
9
9
 
10
10
  const classes = computed(() =>
11
- props.active
12
- ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out'
13
- : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-none focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out'
14
- );
11
+ props.active
12
+ ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out'
13
+ : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-none focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out',
14
+ )
15
15
  </script>
16
16
 
17
17
  <template>
18
- <Link :href="href" :class="classes">
19
- <slot />
20
- </Link>
18
+ <Link :href="href" :class="classes">
19
+ <slot />
20
+ </Link>
21
21
  </template>
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <button
3
- class="inline-flex items-center px-4 py-2 bg-gray-800 dark:bg-gray-200 border border-transparent rounded-md font-semibold text-xs text-white dark:text-gray-800 uppercase tracking-widest hover:bg-gray-700 dark:hover:bg-white focus:bg-gray-700 dark:focus:bg-white active:bg-gray-900 dark:active:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150"
4
- >
5
- <slot />
6
- </button>
2
+ <button
3
+ class="inline-flex items-center px-4 py-2 bg-gray-800 dark:bg-gray-200 border border-transparent rounded-md font-semibold text-xs text-white dark:text-gray-800 uppercase tracking-widest hover:bg-gray-700 dark:hover:bg-white focus:bg-gray-700 dark:focus:bg-white active:bg-gray-900 dark:active:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150"
4
+ >
5
+ <slot />
6
+ </button>
7
7
  </template>
@@ -1,21 +1,21 @@
1
1
  <script setup lang="ts">
2
- import { computed } from 'vue';
3
- import { Link } from '@inertiajs/vue3';
2
+ import { computed } from 'vue'
3
+ import { Link } from '@inertiajs/vue3'
4
4
 
5
5
  const props = defineProps<{
6
- href: string;
7
- active?: boolean;
8
- }>();
6
+ href: string
7
+ active?: boolean
8
+ }>()
9
9
 
10
10
  const classes = computed(() =>
11
- props.active
12
- ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-none focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out'
13
- : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out'
14
- );
11
+ props.active
12
+ ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-none focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out'
13
+ : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out',
14
+ )
15
15
  </script>
16
16
 
17
17
  <template>
18
- <Link :href="href" :class="classes">
19
- <slot />
20
- </Link>
18
+ <Link :href="href" :class="classes">
19
+ <slot />
20
+ </Link>
21
21
  </template>
@@ -1,19 +1,19 @@
1
1
  <script setup lang="ts">
2
2
  withDefaults(
3
- defineProps<{
4
- type?: 'button' | 'submit' | 'reset';
5
- }>(),
6
- {
7
- type: 'button',
8
- }
9
- );
3
+ defineProps<{
4
+ type?: 'button' | 'submit' | 'reset'
5
+ }>(),
6
+ {
7
+ type: 'button',
8
+ },
9
+ )
10
10
  </script>
11
11
 
12
12
  <template>
13
- <button
14
- :type="type"
15
- class="inline-flex items-center px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-500 rounded-md font-semibold text-xs text-gray-700 dark:text-gray-300 uppercase tracking-widest shadow-sm hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 disabled:opacity-25 transition ease-in-out duration-150"
16
- >
17
- <slot />
18
- </button>
13
+ <button
14
+ :type="type"
15
+ class="inline-flex items-center px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-500 rounded-md font-semibold text-xs text-gray-700 dark:text-gray-300 uppercase tracking-widest shadow-sm hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 disabled:opacity-25 transition ease-in-out duration-150"
16
+ >
17
+ <slot />
18
+ </button>
19
19
  </template>
@@ -1,23 +1,23 @@
1
1
  <script setup lang="ts">
2
- import { onMounted, ref } from 'vue';
2
+ import { onMounted, ref } from 'vue'
3
3
 
4
- const model = defineModel<string>({ required: true });
4
+ const model = defineModel<string>({ required: true })
5
5
 
6
- const input = ref<HTMLInputElement | null>(null);
6
+ const input = ref<HTMLInputElement | null>(null)
7
7
 
8
8
  onMounted(() => {
9
- if (input.value?.hasAttribute('autofocus')) {
10
- input.value?.focus();
11
- }
12
- });
9
+ if (input.value?.hasAttribute('autofocus')) {
10
+ input.value?.focus()
11
+ }
12
+ })
13
13
 
14
- defineExpose({ focus: () => input.value?.focus() });
14
+ defineExpose({ focus: () => input.value?.focus() })
15
15
  </script>
16
16
 
17
17
  <template>
18
- <input
19
- class="border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm"
20
- v-model="model"
21
- ref="input"
22
- />
18
+ <input
19
+ class="border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm"
20
+ v-model="model"
21
+ ref="input"
22
+ />
23
23
  </template>