@stacksjs/defaults 0.75.233 → 0.75.236

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 (53) hide show
  1. package/ai/skills/stacks-dashboard/SKILL.md +2 -2
  2. package/ai/skills/stacks-database/SKILL.md +1 -1
  3. package/ai/skills/stacks-deploy/SKILL.md +3 -2
  4. package/ai/skills/stacks-migrations/SKILL.md +2 -2
  5. package/ai/skills/stacks-native/CATALOG.md +8 -8
  6. package/ai/skills/stacks-realtime/SKILL.md +4 -2
  7. package/app/Actions/Monitoring/error-provider.ts +129 -12
  8. package/app/Models/Error.ts +21 -0
  9. package/ide/vscode/package.json +1 -1
  10. package/package.json +2 -2
  11. package/resources/components/Dashboard/Auth/AuthCard.stx +29 -0
  12. package/resources/components/Dashboard/Auth/ForgotPassword.stx +65 -79
  13. package/resources/components/Dashboard/Auth/Login.stx +73 -82
  14. package/resources/components/Dashboard/Auth/Register.stx +121 -135
  15. package/resources/components/Dashboard/Auth/ResetPassword.stx +88 -102
  16. package/resources/components/Dashboard/Buddy/BuddyAssistant.stx +11 -15
  17. package/resources/components/Dashboard/Commerce/CommerceCategoriesDashboard.stx +8 -20
  18. package/resources/components/Dashboard/Commerce/CommerceCouponsDashboard.stx +8 -20
  19. package/resources/components/Dashboard/Commerce/CommerceCustomersDashboard.stx +8 -20
  20. package/resources/components/Dashboard/Commerce/CommerceGiftCardsDashboard.stx +8 -20
  21. package/resources/components/Dashboard/Commerce/CommerceManufacturersDashboard.stx +13 -24
  22. package/resources/components/Dashboard/Commerce/CommerceOrdersDashboard.stx +8 -20
  23. package/resources/components/Dashboard/Commerce/CommerceOverviewDashboard.stx +17 -21
  24. package/resources/components/Dashboard/Commerce/CommercePaymentsDashboard.stx +7 -19
  25. package/resources/components/Dashboard/Commerce/CommercePosDashboard.stx +4 -16
  26. package/resources/components/Dashboard/Commerce/CommerceProductsDashboard.stx +8 -20
  27. package/resources/components/Dashboard/Commerce/CommerceReviewsDashboard.stx +7 -18
  28. package/resources/components/Dashboard/Commerce/CommerceTaxesDashboard.stx +13 -24
  29. package/resources/components/Dashboard/Commerce/CommerceUnitsDashboard.stx +13 -24
  30. package/resources/components/Dashboard/Commerce/CommerceVariantsDashboard.stx +7 -18
  31. package/resources/components/Dashboard/Commerce/Delivery/CouriersDashboard.stx +7 -13
  32. package/resources/components/Dashboard/Commerce/Delivery/DeliveryOverviewDashboard.stx +12 -16
  33. package/resources/components/Dashboard/Commerce/Delivery/DeliveryRoutesDashboard.stx +7 -13
  34. package/resources/components/Dashboard/Commerce/Delivery/DigitalDeliveriesDashboard.stx +7 -13
  35. package/resources/components/Dashboard/Commerce/Delivery/LicenseKeysDashboard.stx +7 -13
  36. package/resources/components/Dashboard/Commerce/Delivery/ShippingMethodsDashboard.stx +7 -13
  37. package/resources/components/Dashboard/Commerce/Delivery/ShippingRatesDashboard.stx +7 -13
  38. package/resources/components/Dashboard/Commerce/Delivery/ShippingZonesDashboard.stx +7 -13
  39. package/resources/components/Dashboard/Commerce/PrintDevicesDashboard.stx +8 -20
  40. package/resources/components/Dashboard/Commerce/PrintLogsDashboard.stx +7 -19
  41. package/resources/components/Dashboard/Commerce/ProductWaitlistDashboard.stx +12 -16
  42. package/resources/components/Dashboard/Commerce/RestaurantWaitlistDashboard.stx +12 -16
  43. package/resources/components/Dashboard/Deployments/DeploymentList.stx +17 -21
  44. package/resources/components/Dashboard/Marketing/AbandonedCartsDashboard.stx +6 -10
  45. package/resources/components/Dashboard/Marketing/CampaignsDashboard.stx +6 -10
  46. package/resources/components/Dashboard/Marketing/MarketingListsDashboard.stx +9 -13
  47. package/resources/components/Dashboard/Marketing/SocialPostsDashboard.stx +6 -10
  48. package/resources/components/Dashboard/Queue/QueueDashboard.stx +12 -16
  49. package/resources/components/Dashboard/Realtime/RealtimeDashboard.stx +6 -10
  50. package/resources/components/Dashboard/Releases/ReleaseDashboard.stx +6 -10
  51. package/resources/components/Dashboard/UI/MetricCards.stx +32 -0
  52. package/resources/components/Dashboard/UI/PageHeader.stx +25 -66
  53. package/resources/components/Dashboard/UI/Table.stx +79 -6
@@ -56,94 +56,85 @@ function handleSubmit(): void {
56
56
  }
57
57
  </script>
58
58
 
59
- <div class="flex items-center justify-center px-4 py-12 min-h-screen">
60
- <div class="max-w-sm w-full">
61
- <div class="mb-8 text-center">
62
- <div class="inline-flex items-center justify-center mb-4 h-12 w-12 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl shadow-blue-500/25 shadow-lg">
63
- <span class="h-7 w-7 text-white i-hugeicons-cube"></span>
59
+ <AuthCard :title="title()" :subtitle="subtitle()">
60
+
61
+ <div class="p-6 bg-white dark:bg-neutral-900 border border-neutral-200/60 rounded-2xl dark:border-neutral-800 shadow-black/5 shadow-xl dark:shadow-black/20">
62
+ <div :if="error()" role="alert" class="mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 rounded-lg dark:border-red-800">
63
+ <div class="flex gap-2 items-center">
64
+ <span class="h-4 w-4 text-red-600 dark:text-red-400 i-hugeicons-alert-circle"></span>
65
+ <p class="text-red-600 text-sm dark:text-red-400">{{ error() }}</p>
64
66
  </div>
65
- <h1 class="font-semibold text-2xl text-neutral-900 dark:text-white">{{ title() }}</h1>
66
- <p class="mt-2 text-neutral-500 text-sm dark:text-neutral-400">{{ subtitle() }}</p>
67
67
  </div>
68
68
 
69
- <div class="p-6 bg-white dark:bg-neutral-900 border border-neutral-200/60 rounded-2xl dark:border-neutral-800 shadow-black/5 shadow-xl dark:shadow-black/20">
70
- <div :if="error()" role="alert" class="mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 rounded-lg dark:border-red-800">
71
- <div class="flex gap-2 items-center">
72
- <span class="h-4 w-4 text-red-600 dark:text-red-400 i-hugeicons-alert-circle"></span>
73
- <p class="text-red-600 text-sm dark:text-red-400">{{ error() }}</p>
74
- </div>
69
+ <form @submit.prevent="handleSubmit">
70
+ <div class="mb-4">
71
+ <Input
72
+ type="email"
73
+ label="Email address"
74
+ placeholder="you@example.com"
75
+ v-model:value="email"
76
+ @blur="validateEmail()"
77
+ :error="fieldError('email')"
78
+ required
79
+ :disabled="isLoading()"
80
+ />
75
81
  </div>
76
82
 
77
- <form @submit.prevent="handleSubmit">
78
- <div class="mb-4">
79
- <Input
80
- type="email"
81
- label="Email address"
82
- placeholder="you@example.com"
83
- v-model:value="email"
84
- @blur="validateEmail()"
85
- :error="fieldError('email')"
86
- required
87
- :disabled="isLoading()"
88
- />
89
- </div>
90
-
91
- <div class="mb-4">
92
- <Input
93
- type="password"
94
- label="Password"
95
- placeholder="Enter your password"
96
- v-model:value="password"
97
- @blur="validatePassword()"
98
- :error="fieldError('password')"
99
- required
83
+ <div class="mb-4">
84
+ <Input
85
+ type="password"
86
+ label="Password"
87
+ placeholder="Enter your password"
88
+ v-model:value="password"
89
+ @blur="validatePassword()"
90
+ :error="fieldError('password')"
91
+ required
92
+ :disabled="isLoading()"
93
+ />
94
+ </div>
95
+
96
+ <div class="flex items-center justify-between mb-6">
97
+ <label :if="showRememberMe()" class="flex gap-2 items-center cursor-pointer">
98
+ <input
99
+ type="checkbox"
100
+ class="h-4 w-4 text-blue-500 bg-white dark:bg-neutral-800 border-neutral-300 rounded dark:border-neutral-600 focus:ring-blue-500/40 focus:ring-offset-0"
101
+ x-model="rememberMe"
100
102
  :disabled="isLoading()"
101
103
  />
102
- </div>
103
-
104
- <div class="flex items-center justify-between mb-6">
105
- <label :if="showRememberMe()" class="flex gap-2 items-center cursor-pointer">
106
- <input
107
- type="checkbox"
108
- class="h-4 w-4 text-blue-500 bg-white dark:bg-neutral-800 border-neutral-300 rounded dark:border-neutral-600 focus:ring-blue-500/40 focus:ring-offset-0"
109
- x-model="rememberMe"
110
- :disabled="isLoading()"
111
- />
112
- <span class="text-neutral-600 text-sm dark:text-neutral-400">Remember me</span>
113
- </label>
114
-
115
- <a :if="showForgotPassword()" href="/forgot-password" class="font-medium text-blue-600 text-sm dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
116
- Forgot password?
117
- </a>
118
- </div>
119
-
120
- <Button
121
- type="submit"
122
- variant="primary"
123
- size="lg"
124
- fullWidth
125
- :loading="isLoading()"
126
- :disabled="isLoading() || !email() || !password()"
127
- >
128
- <span :if="isLoading()">Signing in...</span>
129
- <span :if="!isLoading()">Sign in</span>
130
- </Button>
131
- </form>
132
-
133
- {{--
134
- Anything that belongs with the credentials, inside the same card:
135
- the social sign-in buttons the /login page fills this with. It is a
136
- slot because the provider list has to be computed server-side by
137
- `configuredSocialProviders()`, and this component is client-only.
138
- --}}
139
- <slot name="social" />
140
- </div>
104
+ <span class="text-neutral-600 text-sm dark:text-neutral-400">Remember me</span>
105
+ </label>
106
+
107
+ <a :if="showForgotPassword()" href="/forgot-password" class="font-medium text-blue-600 text-sm dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
108
+ Forgot password?
109
+ </a>
110
+ </div>
141
111
 
142
- <p :if="showSignUp()" class="mt-6 text-center text-neutral-500 text-sm dark:text-neutral-400">
143
- Don't have an account?
144
- <a href="/register" class="font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
145
- Sign up
146
- </a>
147
- </p>
112
+ <Button
113
+ type="submit"
114
+ variant="primary"
115
+ size="lg"
116
+ fullWidth
117
+ :loading="isLoading()"
118
+ :disabled="isLoading() || !email() || !password()"
119
+ >
120
+ <span :if="isLoading()">Signing in...</span>
121
+ <span :if="!isLoading()">Sign in</span>
122
+ </Button>
123
+ </form>
124
+
125
+ {{--
126
+ Anything that belongs with the credentials, inside the same card:
127
+ the social sign-in buttons the /login page fills this with. It is a
128
+ slot because the provider list has to be computed server-side by
129
+ `configuredSocialProviders()`, and this component is client-only.
130
+ --}}
131
+ <slot name="social" />
148
132
  </div>
149
- </div>
133
+
134
+ <p :if="showSignUp()" class="mt-6 text-center text-neutral-500 text-sm dark:text-neutral-400">
135
+ Don't have an account?
136
+ <a href="/register" class="font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
137
+ Sign up
138
+ </a>
139
+ </p>
140
+ </AuthCard>
@@ -98,148 +98,134 @@ function handleSubmit(): void {
98
98
  })
99
99
  }
100
100
  </script>
101
- <div class="flex items-center justify-center px-4 py-12 min-h-screen">
102
- <div class="max-w-sm w-full">
103
- <!-- Logo/Brand -->
104
- <div class="mb-8 text-center">
105
- <div class="inline-flex items-center justify-center mb-4 h-12 w-12 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl shadow-blue-500/25 shadow-lg">
106
- <span class="h-7 w-7 text-white i-hugeicons-cube"></span>
107
- </div>
108
- <h1 class="font-semibold text-2xl text-neutral-900 dark:text-white">
109
- {{ title() }}
110
- </h1>
111
- <p class="mt-2 text-neutral-500 text-sm dark:text-neutral-400">
112
- {{ subtitle() }}
113
- </p>
114
- </div>
115
-
116
- <!-- Register Form -->
117
- <div class="p-6 bg-white dark:bg-neutral-900 border border-neutral-200/60 rounded-2xl dark:border-neutral-800 shadow-black/5 shadow-xl dark:shadow-black/20">
118
- <!-- Error Message -->
119
- <div :if="error()" class="mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 rounded-lg dark:border-red-800">
120
- <div class="flex gap-2 items-center">
121
- <div class="h-4 w-4 text-red-600 dark:text-red-400 i-hugeicons-alert-circle"></div>
122
- <p class="text-red-600 text-sm dark:text-red-400">{{ error() }}</p>
123
- </div>
101
+ <AuthCard :title="title()" :subtitle="subtitle()">
102
+
103
+ <!-- Register Form -->
104
+ <div class="p-6 bg-white dark:bg-neutral-900 border border-neutral-200/60 rounded-2xl dark:border-neutral-800 shadow-black/5 shadow-xl dark:shadow-black/20">
105
+ <!-- Error Message -->
106
+ <div :if="error()" class="mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 rounded-lg dark:border-red-800">
107
+ <div class="flex gap-2 items-center">
108
+ <div class="h-4 w-4 text-red-600 dark:text-red-400 i-hugeicons-alert-circle"></div>
109
+ <p class="text-red-600 text-sm dark:text-red-400">{{ error() }}</p>
124
110
  </div>
111
+ </div>
125
112
 
126
- <form @submit.prevent="handleSubmit">
127
- <!-- Name Field -->
128
- <div class="mb-4">
129
- <Input
130
- type="text"
131
- label="Full name"
132
- placeholder="John Doe"
133
- v-model:value="name"
134
- :error="fieldError('name')"
135
- required
136
- :disabled="isLoading()"
137
- />
138
- </div>
113
+ <form @submit.prevent="handleSubmit">
114
+ <!-- Name Field -->
115
+ <div class="mb-4">
116
+ <Input
117
+ type="text"
118
+ label="Full name"
119
+ placeholder="John Doe"
120
+ v-model:value="name"
121
+ :error="fieldError('name')"
122
+ required
123
+ :disabled="isLoading()"
124
+ />
125
+ </div>
139
126
 
140
- <!-- Email Field -->
141
- <div class="mb-4">
142
- <Input
143
- type="email"
144
- label="Email address"
145
- placeholder="you@example.com"
146
- v-model:value="email"
147
- @blur="validateEmail()"
148
- :error="fieldError('email')"
149
- required
150
- :disabled="isLoading()"
151
- />
152
- </div>
127
+ <!-- Email Field -->
128
+ <div class="mb-4">
129
+ <Input
130
+ type="email"
131
+ label="Email address"
132
+ placeholder="you@example.com"
133
+ v-model:value="email"
134
+ @blur="validateEmail()"
135
+ :error="fieldError('email')"
136
+ required
137
+ :disabled="isLoading()"
138
+ />
139
+ </div>
153
140
 
154
- <!-- Password Field -->
155
- <div class="mb-4">
156
- <Input
157
- type="password"
158
- label="Password"
159
- placeholder="At least 8 characters"
160
- v-model:value="password"
161
- @input="validatePassword()"
162
- @blur="validatePassword()"
163
- :error="fieldError('password')"
164
- required
165
- :disabled="isLoading()"
166
- />
167
- <!-- Password Strength Indicator -->
168
- <div :if="password().length > 0" class="mt-2">
169
- <div class="flex gap-1">
170
- <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 1 ? (passwordStrength() <= 1 ? 'bg-red-500' : passwordStrength() === 2 ? 'bg-orange-500' : passwordStrength() === 3 ? 'bg-yellow-500' : 'bg-green-500') : 'bg-neutral-200 dark:bg-neutral-700'"></div>
171
- <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 2 ? (passwordStrength() === 2 ? 'bg-orange-500' : passwordStrength() === 3 ? 'bg-yellow-500' : 'bg-green-500') : 'bg-neutral-200 dark:bg-neutral-700'"></div>
172
- <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 3 ? (passwordStrength() === 3 ? 'bg-yellow-500' : 'bg-green-500') : 'bg-neutral-200 dark:bg-neutral-700'"></div>
173
- <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 4 ? 'bg-green-500' : 'bg-neutral-200 dark:bg-neutral-700'"></div>
174
- </div>
175
- <p class="mt-1 text-xs" :class="passwordStrength() <= 1 ? 'text-red-500' : passwordStrength() === 2 ? 'text-orange-500' : passwordStrength() === 3 ? 'text-yellow-600 dark:text-yellow-400' : 'text-green-500'">
176
- {{ passwordStrengthLabel() }}
177
- </p>
141
+ <!-- Password Field -->
142
+ <div class="mb-4">
143
+ <Input
144
+ type="password"
145
+ label="Password"
146
+ placeholder="At least 8 characters"
147
+ v-model:value="password"
148
+ @input="validatePassword()"
149
+ @blur="validatePassword()"
150
+ :error="fieldError('password')"
151
+ required
152
+ :disabled="isLoading()"
153
+ />
154
+ <!-- Password Strength Indicator -->
155
+ <div :if="password().length > 0" class="mt-2">
156
+ <div class="flex gap-1">
157
+ <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 1 ? (passwordStrength() <= 1 ? 'bg-red-500' : passwordStrength() === 2 ? 'bg-orange-500' : passwordStrength() === 3 ? 'bg-yellow-500' : 'bg-green-500') : 'bg-neutral-200 dark:bg-neutral-700'"></div>
158
+ <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 2 ? (passwordStrength() === 2 ? 'bg-orange-500' : passwordStrength() === 3 ? 'bg-yellow-500' : 'bg-green-500') : 'bg-neutral-200 dark:bg-neutral-700'"></div>
159
+ <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 3 ? (passwordStrength() === 3 ? 'bg-yellow-500' : 'bg-green-500') : 'bg-neutral-200 dark:bg-neutral-700'"></div>
160
+ <div class="flex-1 h-1 rounded-full" :class="passwordStrength() >= 4 ? 'bg-green-500' : 'bg-neutral-200 dark:bg-neutral-700'"></div>
178
161
  </div>
179
- </div>
162
+ <p class="mt-1 text-xs" :class="passwordStrength() <= 1 ? 'text-red-500' : passwordStrength() === 2 ? 'text-orange-500' : passwordStrength() === 3 ? 'text-yellow-600 dark:text-yellow-400' : 'text-green-500'">
163
+ {{ passwordStrengthLabel() }}
164
+ </p>
165
+ </div>
166
+ </div>
167
+
168
+ <!-- Confirm Password Field -->
169
+ <div class="mb-4">
170
+ <Input
171
+ type="password"
172
+ label="Confirm password"
173
+ placeholder="Confirm your password"
174
+ v-model:value="passwordConfirmation"
175
+ @input="validateConfirmation()"
176
+ :error="fieldError('passwordConfirmation')"
177
+ required
178
+ :disabled="isLoading()"
179
+ />
180
+ </div>
180
181
 
181
- <!-- Confirm Password Field -->
182
- <div class="mb-4">
183
- <Input
184
- type="password"
185
- label="Confirm password"
186
- placeholder="Confirm your password"
187
- v-model:value="passwordConfirmation"
188
- @input="validateConfirmation()"
189
- :error="fieldError('passwordConfirmation')"
190
- required
182
+ <!-- Terms Checkbox -->
183
+ <div class="mb-6">
184
+ <label class="flex gap-2 items-start cursor-pointer">
185
+ <input
186
+ type="checkbox"
187
+ class="mt-0.5 h-4 w-4 text-blue-500 bg-white dark:bg-neutral-800 border-neutral-300 rounded dark:border-neutral-600 focus:ring-blue-500/40 focus:ring-offset-0"
188
+ x-model="agreeToTerms"
191
189
  :disabled="isLoading()"
192
190
  />
193
- </div>
194
-
195
- <!-- Terms Checkbox -->
196
- <div class="mb-6">
197
- <label class="flex gap-2 items-start cursor-pointer">
198
- <input
199
- type="checkbox"
200
- class="mt-0.5 h-4 w-4 text-blue-500 bg-white dark:bg-neutral-800 border-neutral-300 rounded dark:border-neutral-600 focus:ring-blue-500/40 focus:ring-offset-0"
201
- x-model="agreeToTerms"
202
- :disabled="isLoading()"
203
- />
204
- <span class="text-neutral-600 text-sm dark:text-neutral-400">
205
- I agree to the
206
- <a href="/terms" class="text-blue-600 dark:text-blue-400 hover:text-blue-500">Terms of Service</a>
207
- and
208
- <a href="/privacy" class="text-blue-600 dark:text-blue-400 hover:text-blue-500">Privacy Policy</a>
209
- </span>
210
- </label>
211
- <p :if="fieldError('terms')" class="mt-1 text-red-600 text-sm dark:text-red-400">{{ fieldError('terms') }}</p>
212
- </div>
191
+ <span class="text-neutral-600 text-sm dark:text-neutral-400">
192
+ I agree to the
193
+ <a href="/terms" class="text-blue-600 dark:text-blue-400 hover:text-blue-500">Terms of Service</a>
194
+ and
195
+ <a href="/privacy" class="text-blue-600 dark:text-blue-400 hover:text-blue-500">Privacy Policy</a>
196
+ </span>
197
+ </label>
198
+ <p :if="fieldError('terms')" class="mt-1 text-red-600 text-sm dark:text-red-400">{{ fieldError('terms') }}</p>
199
+ </div>
213
200
 
214
- <!-- Submit Button -->
215
- <Button
216
- type="submit"
217
- variant="primary"
218
- size="lg"
219
- fullWidth
220
- :loading="isLoading()"
221
- :disabled="isLoading()"
222
- >
223
- <span :if="isLoading()">Creating account...</span>
224
- <span :if="!isLoading()">Create account</span>
225
- </Button>
226
- </form>
227
-
228
- {{--
229
- Anything that belongs with the credentials, inside the same card:
230
- the social sign-in buttons the /register page fills this with. It is
231
- a slot because the provider list has to be computed server-side by
232
- `configuredSocialProviders()`, and this component is client-only.
233
- --}}
234
- <slot name="social" />
235
- </div>
236
-
237
- <!-- Login Link -->
238
- <p :if="showLogin()" class="mt-6 text-center text-neutral-500 text-sm dark:text-neutral-400">
239
- Already have an account?
240
- <a href="/login" class="font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
241
- Sign in
242
- </a>
243
- </p>
201
+ <!-- Submit Button -->
202
+ <Button
203
+ type="submit"
204
+ variant="primary"
205
+ size="lg"
206
+ fullWidth
207
+ :loading="isLoading()"
208
+ :disabled="isLoading()"
209
+ >
210
+ <span :if="isLoading()">Creating account...</span>
211
+ <span :if="!isLoading()">Create account</span>
212
+ </Button>
213
+ </form>
214
+
215
+ {{--
216
+ Anything that belongs with the credentials, inside the same card:
217
+ the social sign-in buttons the /register page fills this with. It is
218
+ a slot because the provider list has to be computed server-side by
219
+ `configuredSocialProviders()`, and this component is client-only.
220
+ --}}
221
+ <slot name="social" />
244
222
  </div>
245
- </div>
223
+
224
+ <!-- Login Link -->
225
+ <p :if="showLogin()" class="mt-6 text-center text-neutral-500 text-sm dark:text-neutral-400">
226
+ Already have an account?
227
+ <a href="/login" class="font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
228
+ Sign in
229
+ </a>
230
+ </p>
231
+ </AuthCard>