kaze 1.0.1 → 1.2.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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/kaze/commands/app/base_stack.rb +11 -5
  4. data/lib/kaze/commands/app/hotwire_stack.rb +4 -4
  5. data/lib/kaze/commands/app/inertia_react_stack.rb +16 -13
  6. data/lib/kaze/commands/app/inertia_vue_stack.rb +16 -13
  7. data/lib/kaze/version.rb +1 -1
  8. data/stubs/hotwire/app/assets/tailwind/application.css +21 -0
  9. data/stubs/hotwire/app/components/danger_button_component.rb +1 -1
  10. data/stubs/hotwire/app/components/dropdown_link_component.rb +1 -1
  11. data/stubs/hotwire/app/components/nav_link_component.rb +2 -2
  12. data/stubs/hotwire/app/components/primary_button_component.rb +1 -1
  13. data/stubs/hotwire/app/components/responsive_nav_link_component.rb +2 -2
  14. data/stubs/hotwire/app/components/secondary_button_component.rb +1 -1
  15. data/stubs/hotwire/app/components/text_input_component.rb +1 -1
  16. data/stubs/hotwire/app/views/auth/login.html.erb +2 -2
  17. data/stubs/hotwire/app/views/auth/register.html.erb +1 -1
  18. data/stubs/hotwire/app/views/auth/verify_email.html.erb +1 -1
  19. data/stubs/hotwire/app/views/dashboard/index.html.erb +1 -1
  20. data/stubs/hotwire/app/views/layouts/_navigation.html.erb +2 -2
  21. data/stubs/hotwire/app/views/layouts/application.html.erb +2 -2
  22. data/stubs/hotwire/app/views/layouts/guest.html.erb +1 -1
  23. data/stubs/hotwire/app/views/profile/edit.html.erb +3 -3
  24. data/stubs/hotwire/app/views/profile/partials/_update_profile_information_form.html.erb +1 -1
  25. data/stubs/hotwire/app/views/welcome/index.html.erb +4 -4
  26. data/stubs/inertia-react-ts/app/assets/tailwind/application.css +20 -0
  27. data/stubs/inertia-react-ts/app/javascript/Components/Checkbox.tsx +1 -1
  28. data/stubs/inertia-react-ts/app/javascript/Components/DangerButton.tsx +1 -1
  29. data/stubs/inertia-react-ts/app/javascript/Components/Dropdown.tsx +1 -1
  30. data/stubs/inertia-react-ts/app/javascript/Components/NavLink.tsx +1 -1
  31. data/stubs/inertia-react-ts/app/javascript/Components/PrimaryButton.tsx +1 -1
  32. data/stubs/inertia-react-ts/app/javascript/Components/ResponsiveNavLink.tsx +1 -1
  33. data/stubs/inertia-react-ts/app/javascript/Components/SecondaryButton.tsx +1 -1
  34. data/stubs/inertia-react-ts/app/javascript/Components/TextInput.tsx +1 -1
  35. data/stubs/inertia-react-ts/app/javascript/Layouts/AuthenticatedLayout.tsx +3 -3
  36. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Login.tsx +1 -1
  37. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/Register.tsx +1 -1
  38. data/stubs/inertia-react-ts/app/javascript/Pages/Auth/VerifyEmail.tsx +1 -1
  39. data/stubs/inertia-react-ts/app/javascript/Pages/Dashboard.tsx +1 -1
  40. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Edit.tsx +3 -3
  41. data/stubs/inertia-react-ts/app/javascript/Pages/Profile/Partials/UpdateProfileInformationForm.tsx +1 -1
  42. data/stubs/inertia-react-ts/app/javascript/Pages/Welcome.tsx +3 -3
  43. data/stubs/inertia-react-ts/package.json +1 -5
  44. data/stubs/inertia-vue-ts/app/assets/tailwind/application.css +20 -0
  45. data/stubs/inertia-vue-ts/app/javascript/Components/Checkbox.vue +1 -1
  46. data/stubs/inertia-vue-ts/app/javascript/Components/DangerButton.vue +1 -1
  47. data/stubs/inertia-vue-ts/app/javascript/Components/DropdownLink.vue +1 -1
  48. data/stubs/inertia-vue-ts/app/javascript/Components/NavLink.vue +2 -2
  49. data/stubs/inertia-vue-ts/app/javascript/Components/PrimaryButton.vue +1 -1
  50. data/stubs/inertia-vue-ts/app/javascript/Components/ResponsiveNavLink.vue +2 -2
  51. data/stubs/inertia-vue-ts/app/javascript/Components/SecondaryButton.vue +1 -1
  52. data/stubs/inertia-vue-ts/app/javascript/Components/TextInput.vue +1 -1
  53. data/stubs/inertia-vue-ts/app/javascript/Layouts/AuthenticatedLayout.vue +3 -3
  54. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Login.vue +1 -1
  55. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/Register.vue +1 -1
  56. data/stubs/inertia-vue-ts/app/javascript/Pages/Auth/VerifyEmail.vue +1 -1
  57. data/stubs/inertia-vue-ts/app/javascript/Pages/Dashboard.vue +1 -1
  58. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Edit.vue +3 -3
  59. data/stubs/inertia-vue-ts/app/javascript/Pages/Profile/Partials/UpdateProfileInformationForm.vue +1 -1
  60. data/stubs/inertia-vue-ts/app/javascript/Pages/Welcome.vue +3 -3
  61. data/stubs/inertia-vue-ts/package.json +1 -5
  62. metadata +6 -11
  63. data/stubs/default/app/assets/stylesheets/application.tailwind.css +0 -3
  64. data/stubs/hotwire/config/tailwind.config.js +0 -23
  65. data/stubs/inertia-react-ts/config/tailwind.config.js +0 -17
  66. data/stubs/inertia-vue-ts/config/tailwind.config.js +0 -17
@@ -39,7 +39,7 @@ export default function AuthenticatedLayout({ header, children }: PropsWithChild
39
39
  <span className="inline-flex rounded-md">
40
40
  <button
41
41
  type="button"
42
- className="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none transition ease-in-out duration-150"
42
+ className="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-hidden transition ease-in-out duration-150"
43
43
  >
44
44
  {user.name}
45
45
 
@@ -72,7 +72,7 @@ export default function AuthenticatedLayout({ header, children }: PropsWithChild
72
72
  <div className="-me-2 flex items-center sm:hidden">
73
73
  <button
74
74
  onClick={() => setShowingNavigationDropdown((previousState) => !previousState)}
75
- className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out"
75
+ className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-hidden focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out"
76
76
  >
77
77
  <svg className="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
78
78
  <path
@@ -119,7 +119,7 @@ export default function AuthenticatedLayout({ header, children }: PropsWithChild
119
119
  </nav>
120
120
 
121
121
  {header && (
122
- <header className="bg-white shadow">
122
+ <header className="bg-white shadow-sm">
123
123
  <div className="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">{header}</div>
124
124
  </header>
125
125
  )}
@@ -73,7 +73,7 @@ export default function Login({ status }: { status?: string }) {
73
73
  <div className="flex items-center justify-end mt-4">
74
74
  <Link
75
75
  href={password_request_path()}
76
- 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"
76
+ className="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
77
77
  >
78
78
  Forgot your password?
79
79
  </Link>
@@ -99,7 +99,7 @@ export default function Register() {
99
99
  <div className="flex items-center justify-end mt-4">
100
100
  <Link
101
101
  href={login_path()}
102
- 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"
102
+ className="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
103
103
  >
104
104
  Already registered?
105
105
  </Link>
@@ -36,7 +36,7 @@ export default function VerifyEmail({ status }: { status?: string }) {
36
36
  href={logout_path()}
37
37
  method="post"
38
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"
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-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
40
40
  >
41
41
  Log Out
42
42
  </Link>
@@ -10,7 +10,7 @@ export default function Dashboard() {
10
10
 
11
11
  <div className="py-12">
12
12
  <div className="max-w-7xl mx-auto sm:px-6 lg:px-8">
13
- <div className="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
13
+ <div className="bg-white dark:bg-gray-800 overflow-hidden shadow-xs sm:rounded-lg">
14
14
  <div className="p-6 text-gray-900 dark:text-gray-100">You're logged in!</div>
15
15
  </div>
16
16
  </div>
@@ -14,15 +14,15 @@ export default function Edit({ mustVerifyEmail, status }: PageProps<{ mustVerify
14
14
 
15
15
  <div className="py-12">
16
16
  <div className="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
17
- <div className="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
17
+ <div className="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
18
18
  <UpdateProfileInformationForm mustVerifyEmail={mustVerifyEmail} status={status} className="max-w-xl" />
19
19
  </div>
20
20
 
21
- <div className="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
21
+ <div className="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
22
22
  <UpdatePasswordForm className="max-w-xl" />
23
23
  </div>
24
24
 
25
- <div className="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
25
+ <div className="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
26
26
  <DeleteUserForm className="max-w-xl" />
27
27
  </div>
28
28
  </div>
@@ -80,7 +80,7 @@ export default function UpdateProfileInformation({
80
80
  href={verification_send_path()}
81
81
  method="post"
82
82
  as="button"
83
- 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"
83
+ className="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
84
84
  >
85
85
  Click here to re-send the verification email.
86
86
  </Link>
@@ -25,7 +25,7 @@ export default function Welcome({
25
25
  {user ? (
26
26
  <Link
27
27
  href={dashboard_path()}
28
- className="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-none focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
28
+ className="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-hidden focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
29
29
  >
30
30
  Dashboard
31
31
  </Link>
@@ -33,13 +33,13 @@ export default function Welcome({
33
33
  <>
34
34
  <Link
35
35
  href={login_path()}
36
- className="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-none focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
36
+ className="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-hidden focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
37
37
  >
38
38
  Log in
39
39
  </Link>
40
40
  <Link
41
41
  href={register_path()}
42
- className="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-none focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
42
+ className="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-hidden focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
43
43
  >
44
44
  Register
45
45
  </Link>
@@ -8,19 +8,15 @@
8
8
  "devDependencies": {
9
9
  "@headlessui/react": "^2.0.4",
10
10
  "@inertiajs/react": "^2.0.0",
11
- "@tailwindcss/forms": "^0.5.7",
12
11
  "@types/node": "^18.13.0",
13
12
  "@types/react": "^18.0.28",
14
13
  "@types/react-dom": "^18.0.10",
15
14
  "@vitejs/plugin-react": "^4.2.0",
16
- "autoprefixer": "^10.4.12",
17
15
  "axios": "^1.6.4",
18
- "postcss": "^8.4.31",
19
16
  "react": "^18.2.0",
20
17
  "react-dom": "^18.2.0",
21
- "tailwindcss": "^3.2.1",
22
18
  "typescript": "^5.6.3",
23
- "vite": "^5.2.11",
19
+ "vite": "^6.4.4",
24
20
  "vite-plugin-rails": "^0.5.0"
25
21
  }
26
22
  }
@@ -0,0 +1,20 @@
1
+ @import "tailwindcss";
2
+
3
+ @plugin "@tailwindcss/forms";
4
+
5
+ @source "../../../public/*.html";
6
+ @source "../../helpers/**/*.rb";
7
+ @source "../../views/**/*";
8
+ @source "../../javascript/**/*.vue";
9
+
10
+ @theme {
11
+ --font-sans: Inter, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
12
+ }
13
+
14
+ /* Tailwind v4 Preflight resets buttons to `cursor: default`; keep the v3 behaviour. */
15
+ @layer base {
16
+ button:not(:disabled),
17
+ [role="button"]:not(:disabled) {
18
+ cursor: pointer;
19
+ }
20
+ }
@@ -24,6 +24,6 @@ const proxyChecked = computed({
24
24
  type="checkbox"
25
25
  :value="value"
26
26
  v-model="proxyChecked"
27
- class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800"
27
+ class="rounded-sm dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-xs focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800"
28
28
  />
29
29
  </template>
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <button
3
- class="inline-flex items-center px-4 py-2 bg-red-600 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-red-500 active:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150"
3
+ class="inline-flex items-center px-4 py-2 bg-red-600 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-red-500 active:bg-red-700 focus:outline-hidden focus:ring-2 focus:ring-red-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150"
4
4
  >
5
5
  <slot />
6
6
  </button>
@@ -9,7 +9,7 @@ defineProps<{
9
9
  <template>
10
10
  <Link
11
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"
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-hidden focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out"
13
13
  >
14
14
  <slot />
15
15
  </Link>
@@ -9,8 +9,8 @@ const props = defineProps<{
9
9
 
10
10
  const classes = computed(() =>
11
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',
12
+ ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-hidden focus:border-indigo-700 transition duration-150 ease-in-out'
13
+ : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-hidden focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out',
14
14
  )
15
15
  </script>
16
16
 
@@ -1,6 +1,6 @@
1
1
  <template>
2
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"
3
+ class="inline-flex items-center px-4 py-2 bg-gray-800 dark:bg-gray-200 border border-transparent rounded-md font-semibold text-xs text-white dark:text-gray-800 uppercase tracking-widest hover:bg-gray-700 dark:hover:bg-white focus:bg-gray-700 dark:focus:bg-white active:bg-gray-900 dark:active:bg-gray-300 focus:outline-hidden focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150"
4
4
  >
5
5
  <slot />
6
6
  </button>
@@ -9,8 +9,8 @@ const props = defineProps<{
9
9
 
10
10
  const classes = computed(() =>
11
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',
12
+ ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-hidden focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out'
13
+ : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-hidden focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out',
14
14
  )
15
15
  </script>
16
16
 
@@ -12,7 +12,7 @@ withDefaults(
12
12
  <template>
13
13
  <button
14
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"
15
+ class="inline-flex items-center px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-500 rounded-md font-semibold text-xs text-gray-700 dark:text-gray-300 uppercase tracking-widest shadow-xs hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 disabled:opacity-25 transition ease-in-out duration-150"
16
16
  >
17
17
  <slot />
18
18
  </button>
@@ -16,7 +16,7 @@ defineExpose({ focus: () => input.value?.focus() })
16
16
 
17
17
  <template>
18
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"
19
+ class="border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-xs"
20
20
  v-model="model"
21
21
  ref="input"
22
22
  />
@@ -42,7 +42,7 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
42
42
  <span class="inline-flex rounded-md">
43
43
  <button
44
44
  type="button"
45
- class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-800 hover:text-gray-700 dark:hover:text-gray-300 focus:outline-none transition ease-in-out duration-150"
45
+ class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-800 hover:text-gray-700 dark:hover:text-gray-300 focus:outline-hidden transition ease-in-out duration-150"
46
46
  >
47
47
  {{ $page.props.auth.user.name }}
48
48
 
@@ -74,7 +74,7 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
74
74
  <div class="-me-2 flex items-center sm:hidden">
75
75
  <button
76
76
  @click="showingNavigationDropdown = !showingNavigationDropdown"
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"
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-hidden focus:bg-gray-100 dark:focus:bg-gray-900 focus:text-gray-500 dark:focus:text-gray-400 transition duration-150 ease-in-out"
78
78
  >
79
79
  <svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
80
80
  <path
@@ -137,7 +137,7 @@ const { pathname = '' } = typeof window !== 'undefined' ? window.location : {}
137
137
  </nav>
138
138
 
139
139
  <!-- Page Heading -->
140
- <header class="bg-white dark:bg-gray-800 shadow" v-if="$slots.header">
140
+ <header class="bg-white dark:bg-gray-800 shadow-sm" v-if="$slots.header">
141
141
  <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
142
142
  <slot name="header" />
143
143
  </div>
@@ -77,7 +77,7 @@ const submit = () => {
77
77
  <div class="flex items-center justify-end mt-4">
78
78
  <Link
79
79
  :href="password_request_path()"
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"
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-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
81
81
  >
82
82
  Forgot your password?
83
83
  </Link>
@@ -92,7 +92,7 @@ const submit = () => {
92
92
  <div class="flex items-center justify-end mt-4">
93
93
  <Link
94
94
  :href="login_path()"
95
- 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"
95
+ class="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
96
96
  >
97
97
  Already registered?
98
98
  </Link>
@@ -41,7 +41,7 @@ const verificationLinkSent = computed(() => props.status === 'verification-link-
41
41
  :href="logout_path()"
42
42
  method="post"
43
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"
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-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
45
45
  >Log Out</Link
46
46
  >
47
47
  </div>
@@ -13,7 +13,7 @@ import { Head } from '@inertiajs/vue3'
13
13
 
14
14
  <div class="py-12">
15
15
  <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
16
- <div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
16
+ <div class="bg-white dark:bg-gray-800 overflow-hidden shadow-xs sm:rounded-lg">
17
17
  <div class="p-6 text-gray-900 dark:text-gray-100">You're logged in!</div>
18
18
  </div>
19
19
  </div>
@@ -21,15 +21,15 @@ defineProps<{
21
21
 
22
22
  <div class="py-12">
23
23
  <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
24
- <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
24
+ <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
25
25
  <UpdateProfileInformationForm :must-verify-email="mustVerifyEmail" :status="status" class="max-w-xl" />
26
26
  </div>
27
27
 
28
- <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
28
+ <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
29
29
  <UpdatePasswordForm class="max-w-xl" />
30
30
  </div>
31
31
 
32
- <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
32
+ <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow-sm sm:rounded-lg">
33
33
  <DeleteUserForm class="max-w-xl" />
34
34
  </div>
35
35
  </div>
@@ -68,7 +68,7 @@ const form = useForm({
68
68
  :href="verification_send_path()"
69
69
  method="post"
70
70
  as="button"
71
- 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"
71
+ class="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800"
72
72
  >
73
73
  Click here to re-send the verification email.
74
74
  </Link>
@@ -22,7 +22,7 @@ defineProps<{
22
22
  <div class="-mx-3 flex flex-1 justify-end">
23
23
  <Link
24
24
  :href="dashboard_path()"
25
- class="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-none focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
25
+ class="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-hidden focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
26
26
  v-if="$page.props.auth.user"
27
27
  >
28
28
  Dashboard
@@ -30,13 +30,13 @@ defineProps<{
30
30
  <template v-else>
31
31
  <Link
32
32
  :href="login_path()"
33
- class="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-none focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
33
+ class="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-hidden focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
34
34
  >
35
35
  Log in
36
36
  </Link>
37
37
  <Link
38
38
  :href="register_path()"
39
- class="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-none focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
39
+ class="rounded-md px-3 py-2 text-black ring-1 ring-transparent transition hover:text-black/70 focus:outline-hidden focus-visible:ring-[#FF2D20] dark:text-white dark:hover:text-white/80 dark:focus-visible:ring-white"
40
40
  >
41
41
  Register
42
42
  </Link>
@@ -8,15 +8,11 @@
8
8
  "devDependencies": {
9
9
  "@headlessui/vue": "^1.7.22",
10
10
  "@inertiajs/vue3": "^2.0.0",
11
- "@tailwindcss/forms": "^0.5.7",
12
11
  "@types/node": "^18.13.0",
13
12
  "@vitejs/plugin-vue": "^5.0.5",
14
- "autoprefixer": "^10.4.12",
15
13
  "axios": "^1.6.4",
16
- "postcss": "^8.4.31",
17
- "tailwindcss": "^3.2.1",
18
14
  "typescript": "^5.6.3",
19
- "vite": "^5.2.11",
15
+ "vite": "^6.4.4",
20
16
  "vite-plugin-rails": "^0.5.0",
21
17
  "vue": "^3.4.27",
22
18
  "vue-tsc": "^2.0.21"
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kaze
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cuong Giang
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-02-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: thor
@@ -52,7 +51,6 @@ dependencies:
52
51
  - - ">="
53
52
  - !ruby/object:Gem::Version
54
53
  version: '0'
55
- description:
56
54
  email:
57
55
  - thaicuong.giang@gmail.com
58
56
  executables:
@@ -74,7 +72,6 @@ files:
74
72
  - lib/kaze/version.rb
75
73
  - stubs/default/Procfile.dev
76
74
  - stubs/default/app/assets/stylesheets/application.css
77
- - stubs/default/app/assets/stylesheets/application.tailwind.css
78
75
  - stubs/default/app/forms/application_form.rb
79
76
  - stubs/default/app/forms/auth/login_form.rb
80
77
  - stubs/default/app/forms/auth/new_password_form.rb
@@ -110,6 +107,7 @@ files:
110
107
  - stubs/default/test/integration/password_update_test.rb
111
108
  - stubs/default/test/integration/profile_test.rb
112
109
  - stubs/default/test/test_helper.rb
110
+ - stubs/hotwire/app/assets/tailwind/application.css
113
111
  - stubs/hotwire/app/components/application_logo_component.rb
114
112
  - stubs/hotwire/app/components/auth_session_status_component.rb
115
113
  - stubs/hotwire/app/components/danger_button_component.rb
@@ -159,7 +157,6 @@ files:
159
157
  - stubs/hotwire/app/views/profile/partials/_update_profile_information_form.html.erb
160
158
  - stubs/hotwire/app/views/welcome/index.html.erb
161
159
  - stubs/hotwire/config/importmap.rb
162
- - stubs/hotwire/config/tailwind.config.js
163
160
  - stubs/inertia-common/app/controllers/application_controller.rb
164
161
  - stubs/inertia-common/app/controllers/auth/authenticated_session_controller.rb
165
162
  - stubs/inertia-common/app/controllers/auth/email_verification_notification_controller.rb
@@ -181,6 +178,7 @@ files:
181
178
  - stubs/inertia-common/config/vite.json
182
179
  - stubs/inertia-common/test/integration/password_update_test.rb
183
180
  - stubs/inertia-common/test/integration/profile_test.rb
181
+ - stubs/inertia-react-ts/app/assets/tailwind/application.css
184
182
  - stubs/inertia-react-ts/app/javascript/Components/ApplicationLogo.tsx
185
183
  - stubs/inertia-react-ts/app/javascript/Components/Checkbox.tsx
186
184
  - stubs/inertia-react-ts/app/javascript/Components/DangerButton.tsx
@@ -212,10 +210,10 @@ files:
212
210
  - stubs/inertia-react-ts/app/javascript/types/index.d.ts
213
211
  - stubs/inertia-react-ts/app/javascript/types/vite-env.d.ts
214
212
  - stubs/inertia-react-ts/app/views/layouts/application.html.erb
215
- - stubs/inertia-react-ts/config/tailwind.config.js
216
213
  - stubs/inertia-react-ts/package.json
217
214
  - stubs/inertia-react-ts/tsconfig.json
218
215
  - stubs/inertia-react-ts/vite.config.ts
216
+ - stubs/inertia-vue-ts/app/assets/tailwind/application.css
219
217
  - stubs/inertia-vue-ts/app/javascript/Components/ApplicationLogo.vue
220
218
  - stubs/inertia-vue-ts/app/javascript/Components/Checkbox.vue
221
219
  - stubs/inertia-vue-ts/app/javascript/Components/DangerButton.vue
@@ -248,7 +246,6 @@ files:
248
246
  - stubs/inertia-vue-ts/app/javascript/types/index.d.ts
249
247
  - stubs/inertia-vue-ts/app/javascript/types/vite-env.d.ts
250
248
  - stubs/inertia-vue-ts/app/views/layouts/application.html.erb
251
- - stubs/inertia-vue-ts/config/tailwind.config.js
252
249
  - stubs/inertia-vue-ts/package.json
253
250
  - stubs/inertia-vue-ts/tsconfig.json
254
251
  - stubs/inertia-vue-ts/vite.config.ts
@@ -256,7 +253,6 @@ homepage: https://github.com/gtkvn/kaze
256
253
  licenses:
257
254
  - MIT
258
255
  metadata: {}
259
- post_install_message:
260
256
  rdoc_options: []
261
257
  require_paths:
262
258
  - lib
@@ -271,8 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
271
267
  - !ruby/object:Gem::Version
272
268
  version: '0'
273
269
  requirements: []
274
- rubygems_version: 3.5.16
275
- signing_key:
270
+ rubygems_version: 4.0.10
276
271
  specification_version: 4
277
272
  summary: Opinionated minimal Rails authentication scaffolding with Hotwire, React,
278
273
  or Vue + Tailwind.
@@ -1,3 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
@@ -1,23 +0,0 @@
1
- import defaultTheme from 'tailwindcss/defaultTheme'
2
- import forms from '@tailwindcss/forms'
3
-
4
- /** @type {import('tailwindcss').Config} */
5
- export default {
6
- content: [
7
- './public/*.html',
8
- './app/helpers/**/*.rb',
9
- './app/components/**/*',
10
- './app/views/**/*',
11
- './app/javascript/**/*.js',
12
- ],
13
-
14
- theme: {
15
- extend: {
16
- fontFamily: {
17
- sans: ['Inter', ...defaultTheme.fontFamily.sans],
18
- },
19
- },
20
- },
21
-
22
- plugins: [forms],
23
- }
@@ -1,17 +0,0 @@
1
- import defaultTheme from 'tailwindcss/defaultTheme'
2
- import forms from '@tailwindcss/forms'
3
-
4
- /** @type {import('tailwindcss').Config} */
5
- export default {
6
- content: ['./public/*.html', './app/helpers/**/*.rb', './app/views/**/*', './app/javascript/**/*.tsx'],
7
-
8
- theme: {
9
- extend: {
10
- fontFamily: {
11
- sans: ['Inter', ...defaultTheme.fontFamily.sans],
12
- },
13
- },
14
- },
15
-
16
- plugins: [forms],
17
- }
@@ -1,17 +0,0 @@
1
- import defaultTheme from 'tailwindcss/defaultTheme'
2
- import forms from '@tailwindcss/forms'
3
-
4
- /** @type {import('tailwindcss').Config} */
5
- export default {
6
- content: ['./public/*.html', './app/helpers/**/*.rb', './app/views/**/*', './app/javascript/**/*.vue'],
7
-
8
- theme: {
9
- extend: {
10
- fontFamily: {
11
- sans: ['Inter', ...defaultTheme.fontFamily.sans],
12
- },
13
- },
14
- },
15
-
16
- plugins: [forms],
17
- }