@tanstack/create 0.67.0 → 0.68.1
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.
- package/CHANGELOG.md +34 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
- package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
- package/dist/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
- package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
- package/dist/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
- package/dist/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
- package/dist/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
- package/dist/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
- package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
- package/dist/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
- package/dist/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
- package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
- package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
- package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
- package/dist/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
- package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
- package/dist/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
- package/dist/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
- package/dist/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
- package/dist/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
- package/dist/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
- package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
- package/dist/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
- package/dist/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
- package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
- package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
- package/dist/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
- package/dist/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
- package/dist/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
- package/dist/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
- package/dist/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
- package/dist/frameworks/react/project/base/_dot_gitignore +1 -0
- package/dist/frameworks/react/project/base/src/styles.css.ejs +203 -0
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
- package/dist/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
- package/dist/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
- package/dist/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
- package/dist/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
- package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
- package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
- package/dist/frameworks/solid/project/base/_dot_gitignore +1 -0
- package/dist/frameworks/solid/project/base/src/styles.css.ejs +203 -0
- package/package.json +1 -1
- package/src/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
- package/src/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
- package/src/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
- package/src/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
- package/src/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
- package/src/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
- package/src/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
- package/src/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
- package/src/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
- package/src/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
- package/src/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
- package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
- package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
- package/src/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
- package/src/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
- package/src/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
- package/src/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
- package/src/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
- package/src/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
- package/src/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
- package/src/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
- package/src/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
- package/src/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
- package/src/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
- package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
- package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
- package/src/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
- package/src/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
- package/src/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
- package/src/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
- package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
- package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
- package/src/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
- package/src/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
- package/src/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
- package/src/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
- package/src/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
- package/src/frameworks/react/project/base/_dot_gitignore +1 -0
- package/src/frameworks/react/project/base/src/styles.css.ejs +203 -0
- package/src/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
- package/src/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
- package/src/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
- package/src/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
- package/src/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
- package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
- package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
- package/src/frameworks/solid/project/base/_dot_gitignore +1 -0
- package/src/frameworks/solid/project/base/src/styles.css.ejs +203 -0
- package/tests/framework-template.test.ts +15 -0
|
@@ -1,37 +1,36 @@
|
|
|
1
|
-
import { createFileRoute } from
|
|
2
|
-
import { useState } from
|
|
3
|
-
import { authClient } from
|
|
1
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
2
|
+
import { useState } from 'react'
|
|
3
|
+
import { authClient } from '#/lib/auth-client'
|
|
4
4
|
|
|
5
|
-
export const Route = createFileRoute(
|
|
5
|
+
export const Route = createFileRoute('/demo/better-auth')({
|
|
6
6
|
component: BetterAuthDemo,
|
|
7
|
-
})
|
|
7
|
+
})
|
|
8
8
|
|
|
9
9
|
function BetterAuthDemo() {
|
|
10
|
-
const { data: session, isPending } = authClient.useSession()
|
|
11
|
-
const [isSignUp, setIsSignUp] = useState(false)
|
|
12
|
-
const [email, setEmail] = useState(
|
|
13
|
-
const [password, setPassword] = useState(
|
|
14
|
-
const [name, setName] = useState(
|
|
15
|
-
const [error, setError] = useState(
|
|
16
|
-
const [loading, setLoading] = useState(false)
|
|
10
|
+
const { data: session, isPending } = authClient.useSession()
|
|
11
|
+
const [isSignUp, setIsSignUp] = useState(false)
|
|
12
|
+
const [email, setEmail] = useState('')
|
|
13
|
+
const [password, setPassword] = useState('')
|
|
14
|
+
const [name, setName] = useState('')
|
|
15
|
+
const [error, setError] = useState('')
|
|
16
|
+
const [loading, setLoading] = useState(false)
|
|
17
17
|
|
|
18
18
|
if (isPending) {
|
|
19
19
|
return (
|
|
20
|
-
<
|
|
20
|
+
<main className="demo-page demo-center">
|
|
21
21
|
<div className="h-5 w-5 animate-spin rounded-full border-2 border-neutral-200 border-t-neutral-900 dark:border-neutral-800 dark:border-t-neutral-100" />
|
|
22
|
-
</
|
|
23
|
-
)
|
|
22
|
+
</main>
|
|
23
|
+
)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
if (session?.user) {
|
|
27
27
|
return (
|
|
28
|
-
<
|
|
29
|
-
<
|
|
28
|
+
<main className="demo-page demo-center">
|
|
29
|
+
<section className="demo-panel w-full max-w-md space-y-6">
|
|
30
30
|
<div className="space-y-1.5">
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
<p className="text-sm text-neutral-500 dark:text-neutral-400">
|
|
31
|
+
<p className="island-kicker mb-2">Better Auth</p>
|
|
32
|
+
<h1 className="demo-title">Welcome back</h1>
|
|
33
|
+
<p className="demo-muted text-sm">
|
|
35
34
|
You're signed in as {session.user.email}
|
|
36
35
|
</p>
|
|
37
36
|
</div>
|
|
@@ -42,7 +41,7 @@ function BetterAuthDemo() {
|
|
|
42
41
|
) : (
|
|
43
42
|
<div className="h-10 w-10 bg-neutral-200 dark:bg-neutral-800 flex items-center justify-center">
|
|
44
43
|
<span className="text-sm font-medium text-neutral-600 dark:text-neutral-400">
|
|
45
|
-
{session.user.name?.charAt(0).toUpperCase() ||
|
|
44
|
+
{session.user.name?.charAt(0).toUpperCase() || 'U'}
|
|
46
45
|
</span>
|
|
47
46
|
</div>
|
|
48
47
|
)}
|
|
@@ -60,32 +59,32 @@ function BetterAuthDemo() {
|
|
|
60
59
|
onClick={() => {
|
|
61
60
|
void authClient.signOut()
|
|
62
61
|
}}
|
|
63
|
-
className="
|
|
62
|
+
className="demo-button demo-button-secondary w-full"
|
|
64
63
|
>
|
|
65
64
|
Sign out
|
|
66
65
|
</button>
|
|
67
66
|
|
|
68
|
-
<p className="
|
|
69
|
-
Built with{
|
|
67
|
+
<p className="demo-muted text-center text-xs">
|
|
68
|
+
Built with{' '}
|
|
70
69
|
<a
|
|
71
70
|
href="https://better-auth.com"
|
|
72
71
|
target="_blank"
|
|
73
72
|
rel="noopener noreferrer"
|
|
74
|
-
className="font-medium
|
|
73
|
+
className="font-medium"
|
|
75
74
|
>
|
|
76
75
|
BETTER-AUTH
|
|
77
76
|
</a>
|
|
78
77
|
.
|
|
79
78
|
</p>
|
|
80
|
-
</
|
|
81
|
-
</
|
|
82
|
-
)
|
|
79
|
+
</section>
|
|
80
|
+
</main>
|
|
81
|
+
)
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
const handleSubmit = async (e: React.FormEvent) => {
|
|
86
|
-
e.preventDefault()
|
|
87
|
-
setError(
|
|
88
|
-
setLoading(true)
|
|
85
|
+
e.preventDefault()
|
|
86
|
+
setError('')
|
|
87
|
+
setLoading(true)
|
|
89
88
|
|
|
90
89
|
try {
|
|
91
90
|
if (isSignUp) {
|
|
@@ -93,36 +92,37 @@ function BetterAuthDemo() {
|
|
|
93
92
|
email,
|
|
94
93
|
password,
|
|
95
94
|
name,
|
|
96
|
-
})
|
|
95
|
+
})
|
|
97
96
|
if (result.error) {
|
|
98
|
-
setError(result.error.message ||
|
|
97
|
+
setError(result.error.message || 'Sign up failed')
|
|
99
98
|
}
|
|
100
99
|
} else {
|
|
101
100
|
const result = await authClient.signIn.email({
|
|
102
101
|
email,
|
|
103
102
|
password,
|
|
104
|
-
})
|
|
103
|
+
})
|
|
105
104
|
if (result.error) {
|
|
106
|
-
setError(result.error.message ||
|
|
105
|
+
setError(result.error.message || 'Sign in failed')
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
108
|
} catch (err) {
|
|
110
|
-
setError(
|
|
109
|
+
setError('An unexpected error occurred')
|
|
111
110
|
} finally {
|
|
112
|
-
setLoading(false)
|
|
111
|
+
setLoading(false)
|
|
113
112
|
}
|
|
114
|
-
}
|
|
113
|
+
}
|
|
115
114
|
|
|
116
115
|
return (
|
|
117
|
-
<
|
|
118
|
-
<
|
|
119
|
-
<
|
|
120
|
-
|
|
116
|
+
<main className="demo-page demo-center">
|
|
117
|
+
<section className="demo-panel w-full max-w-md">
|
|
118
|
+
<p className="island-kicker mb-2">Better Auth</p>
|
|
119
|
+
<h1 className="demo-title">
|
|
120
|
+
{isSignUp ? 'Create an account' : 'Sign in'}
|
|
121
121
|
</h1>
|
|
122
|
-
<p className="
|
|
122
|
+
<p className="demo-muted mt-2 mb-6 text-sm">
|
|
123
123
|
{isSignUp
|
|
124
|
-
?
|
|
125
|
-
:
|
|
124
|
+
? 'Enter your information to create an account'
|
|
125
|
+
: 'Enter your email below to login to your account'}
|
|
126
126
|
</p>
|
|
127
127
|
|
|
128
128
|
<form onSubmit={handleSubmit} className="grid gap-4">
|
|
@@ -139,7 +139,7 @@ function BetterAuthDemo() {
|
|
|
139
139
|
type="text"
|
|
140
140
|
value={name}
|
|
141
141
|
onChange={(e) => setName(e.target.value)}
|
|
142
|
-
className="
|
|
142
|
+
className="demo-input"
|
|
143
143
|
required
|
|
144
144
|
/>
|
|
145
145
|
</div>
|
|
@@ -154,7 +154,7 @@ function BetterAuthDemo() {
|
|
|
154
154
|
type="email"
|
|
155
155
|
value={email}
|
|
156
156
|
onChange={(e) => setEmail(e.target.value)}
|
|
157
|
-
className="
|
|
157
|
+
className="demo-input"
|
|
158
158
|
required
|
|
159
159
|
/>
|
|
160
160
|
</div>
|
|
@@ -171,22 +171,22 @@ function BetterAuthDemo() {
|
|
|
171
171
|
type="password"
|
|
172
172
|
value={password}
|
|
173
173
|
onChange={(e) => setPassword(e.target.value)}
|
|
174
|
-
className="
|
|
174
|
+
className="demo-input"
|
|
175
175
|
required
|
|
176
176
|
minLength={8}
|
|
177
177
|
/>
|
|
178
178
|
</div>
|
|
179
179
|
|
|
180
180
|
{error && (
|
|
181
|
-
<div className="
|
|
182
|
-
<p className="text-sm text-red-600
|
|
181
|
+
<div className="demo-alert demo-alert-danger">
|
|
182
|
+
<p className="text-sm text-red-600">{error}</p>
|
|
183
183
|
</div>
|
|
184
184
|
)}
|
|
185
185
|
|
|
186
186
|
<button
|
|
187
187
|
type="submit"
|
|
188
188
|
disabled={loading}
|
|
189
|
-
className="w-full
|
|
189
|
+
className="demo-button w-full"
|
|
190
190
|
>
|
|
191
191
|
{loading ? (
|
|
192
192
|
<span className="flex items-center justify-center gap-2">
|
|
@@ -194,9 +194,9 @@ function BetterAuthDemo() {
|
|
|
194
194
|
<span>Please wait</span>
|
|
195
195
|
</span>
|
|
196
196
|
) : isSignUp ? (
|
|
197
|
-
|
|
197
|
+
'Create account'
|
|
198
198
|
) : (
|
|
199
|
-
|
|
199
|
+
'Sign in'
|
|
200
200
|
)}
|
|
201
201
|
</button>
|
|
202
202
|
</form>
|
|
@@ -205,30 +205,30 @@ function BetterAuthDemo() {
|
|
|
205
205
|
<button
|
|
206
206
|
type="button"
|
|
207
207
|
onClick={() => {
|
|
208
|
-
setIsSignUp(!isSignUp)
|
|
209
|
-
setError(
|
|
208
|
+
setIsSignUp(!isSignUp)
|
|
209
|
+
setError('')
|
|
210
210
|
}}
|
|
211
|
-
className="
|
|
211
|
+
className="demo-muted text-sm transition-colors hover:text-[var(--sea-ink)]"
|
|
212
212
|
>
|
|
213
213
|
{isSignUp
|
|
214
|
-
?
|
|
214
|
+
? 'Already have an account? Sign in'
|
|
215
215
|
: "Don't have an account? Sign up"}
|
|
216
216
|
</button>
|
|
217
217
|
</div>
|
|
218
218
|
|
|
219
|
-
<p className="mt-6 text-
|
|
220
|
-
Built with{
|
|
219
|
+
<p className="demo-muted mt-6 text-center text-xs">
|
|
220
|
+
Built with{' '}
|
|
221
221
|
<a
|
|
222
222
|
href="https://better-auth.com"
|
|
223
223
|
target="_blank"
|
|
224
224
|
rel="noopener noreferrer"
|
|
225
|
-
className="font-medium
|
|
225
|
+
className="font-medium"
|
|
226
226
|
>
|
|
227
227
|
BETTER-AUTH
|
|
228
228
|
</a>
|
|
229
229
|
.
|
|
230
230
|
</p>
|
|
231
|
-
</
|
|
232
|
-
</
|
|
233
|
-
)
|
|
231
|
+
</section>
|
|
232
|
+
</main>
|
|
233
|
+
)
|
|
234
234
|
}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import { createFileRoute } from '@tanstack/react-router'
|
|
2
|
-
import {
|
|
3
|
-
SignIn,
|
|
4
|
-
SignedIn,
|
|
5
|
-
SignedOut,
|
|
6
|
-
useUser,
|
|
7
|
-
} from '@clerk/clerk-react'
|
|
2
|
+
import { SignIn, SignedIn, SignedOut, useUser } from '@clerk/clerk-react'
|
|
8
3
|
|
|
9
4
|
export const Route = createFileRoute('/demo/clerk')({
|
|
10
5
|
component: ClerkDemo,
|
|
@@ -12,27 +7,27 @@ export const Route = createFileRoute('/demo/clerk')({
|
|
|
12
7
|
|
|
13
8
|
function ClerkDemo() {
|
|
14
9
|
return (
|
|
15
|
-
<
|
|
16
|
-
<
|
|
10
|
+
<main className="demo-page demo-center">
|
|
11
|
+
<section className="demo-panel w-full max-w-md space-y-6">
|
|
17
12
|
<SignedOut>
|
|
18
13
|
<div className="space-y-1.5">
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
14
|
+
<p className="island-kicker mb-2">Clerk</p>
|
|
15
|
+
<h1 className="demo-title">Sign in to continue</h1>
|
|
16
|
+
<p className="demo-muted text-sm">
|
|
17
|
+
Clerk renders the sign-in UI, manages sessions, and handles social
|
|
18
|
+
providers for you.
|
|
24
19
|
</p>
|
|
25
20
|
</div>
|
|
26
21
|
<div className="flex justify-center pt-2">
|
|
27
22
|
<SignIn routing="hash" />
|
|
28
23
|
</div>
|
|
29
|
-
<p className="
|
|
24
|
+
<p className="demo-muted text-center text-xs">
|
|
30
25
|
Built with{' '}
|
|
31
26
|
<a
|
|
32
27
|
href="https://clerk.com"
|
|
33
28
|
target="_blank"
|
|
34
29
|
rel="noopener noreferrer"
|
|
35
|
-
className="font-medium
|
|
30
|
+
className="font-medium"
|
|
36
31
|
>
|
|
37
32
|
CLERK
|
|
38
33
|
</a>
|
|
@@ -43,8 +38,8 @@ function ClerkDemo() {
|
|
|
43
38
|
<SignedIn>
|
|
44
39
|
<SignedInGreeting />
|
|
45
40
|
</SignedIn>
|
|
46
|
-
</
|
|
47
|
-
</
|
|
41
|
+
</section>
|
|
42
|
+
</main>
|
|
48
43
|
)
|
|
49
44
|
}
|
|
50
45
|
|
|
@@ -58,12 +53,9 @@ function SignedInGreeting() {
|
|
|
58
53
|
return (
|
|
59
54
|
<div className="space-y-6">
|
|
60
55
|
<div className="space-y-1.5">
|
|
61
|
-
<
|
|
62
|
-
|
|
63
|
-
</
|
|
64
|
-
<p className="text-sm text-neutral-500 dark:text-neutral-400">
|
|
65
|
-
You're signed in as {email}
|
|
66
|
-
</p>
|
|
56
|
+
<p className="island-kicker mb-2">Clerk</p>
|
|
57
|
+
<h1 className="demo-title">Welcome back</h1>
|
|
58
|
+
<p className="demo-muted text-sm">You're signed in as {email}</p>
|
|
67
59
|
</div>
|
|
68
60
|
|
|
69
61
|
<div className="flex items-center gap-3">
|
|
@@ -86,13 +78,13 @@ function SignedInGreeting() {
|
|
|
86
78
|
</div>
|
|
87
79
|
</div>
|
|
88
80
|
|
|
89
|
-
<p className="
|
|
81
|
+
<p className="demo-muted text-center text-xs">
|
|
90
82
|
Manage your account from the avatar in the header. Built with{' '}
|
|
91
83
|
<a
|
|
92
84
|
href="https://clerk.com"
|
|
93
85
|
target="_blank"
|
|
94
86
|
rel="noopener noreferrer"
|
|
95
|
-
className="font-medium
|
|
87
|
+
className="font-medium"
|
|
96
88
|
>
|
|
97
89
|
CLERK
|
|
98
90
|
</a>
|
|
@@ -44,36 +44,25 @@ function ConvexTodos() {
|
|
|
44
44
|
const totalCount = todos?.length || 0
|
|
45
45
|
|
|
46
46
|
return (
|
|
47
|
-
<
|
|
48
|
-
className="
|
|
49
|
-
|
|
50
|
-
background:
|
|
51
|
-
'linear-gradient(135deg, #667a56 0%, #8fbc8f 25%, #90ee90 50%, #98fb98 75%, #f0fff0 100%)',
|
|
52
|
-
}}
|
|
53
|
-
>
|
|
54
|
-
<div className="w-full max-w-2xl">
|
|
55
|
-
{/* Header Card */}
|
|
56
|
-
<div className="bg-white/95 backdrop-blur-sm rounded-2xl shadow-2xl border border-green-200/50 p-8 mb-6">
|
|
47
|
+
<main className="demo-page">
|
|
48
|
+
<div className="mx-auto w-full max-w-2xl space-y-6">
|
|
49
|
+
<section className="demo-panel">
|
|
57
50
|
<div className="text-center">
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
</
|
|
61
|
-
<p className="text-green-600 text-lg">Powered by real-time sync</p>
|
|
51
|
+
<p className="island-kicker mb-2">Convex</p>
|
|
52
|
+
<h1 className="demo-title">Todos</h1>
|
|
53
|
+
<p className="demo-muted mt-2">Powered by real-time sync</p>
|
|
62
54
|
{totalCount > 0 && (
|
|
63
55
|
<div className="mt-4 flex justify-center space-x-6 text-sm">
|
|
64
|
-
<span className="
|
|
65
|
-
|
|
66
|
-
</span>
|
|
67
|
-
<span className="text-gray-600">
|
|
56
|
+
<span className="font-medium">{completedCount} completed</span>
|
|
57
|
+
<span className="demo-muted">
|
|
68
58
|
{totalCount - completedCount} remaining
|
|
69
59
|
</span>
|
|
70
60
|
</div>
|
|
71
61
|
)}
|
|
72
62
|
</div>
|
|
73
|
-
</
|
|
63
|
+
</section>
|
|
74
64
|
|
|
75
|
-
|
|
76
|
-
<div className="bg-white/95 backdrop-blur-sm rounded-2xl shadow-xl border border-green-200/50 p-6 mb-6">
|
|
65
|
+
<section className="demo-card">
|
|
77
66
|
<div className="flex gap-3">
|
|
78
67
|
<input
|
|
79
68
|
type="text"
|
|
@@ -85,42 +74,39 @@ function ConvexTodos() {
|
|
|
85
74
|
}
|
|
86
75
|
}}
|
|
87
76
|
placeholder="What needs to be done?"
|
|
88
|
-
className="
|
|
77
|
+
className="demo-input min-w-0 flex-1"
|
|
89
78
|
/>
|
|
90
79
|
<button
|
|
91
80
|
onClick={handleAddTodo}
|
|
92
81
|
disabled={!newTodo.trim()}
|
|
93
|
-
className="
|
|
82
|
+
className="demo-button"
|
|
94
83
|
>
|
|
95
84
|
<Plus size={20} />
|
|
96
85
|
Add
|
|
97
86
|
</button>
|
|
98
87
|
</div>
|
|
99
|
-
</
|
|
88
|
+
</section>
|
|
100
89
|
|
|
101
|
-
|
|
102
|
-
<div className="bg-white/95 backdrop-blur-sm rounded-2xl shadow-xl border border-green-200/50 overflow-hidden">
|
|
90
|
+
<section className="demo-card overflow-hidden p-0">
|
|
103
91
|
{!todos ? (
|
|
104
92
|
<div className="p-8 text-center">
|
|
105
|
-
<div className="
|
|
106
|
-
<p className="
|
|
93
|
+
<div className="mx-auto mb-4 h-8 w-8 animate-spin rounded-full border-b-2 border-[var(--lagoon-deep)]"></div>
|
|
94
|
+
<p className="demo-muted">Loading todos...</p>
|
|
107
95
|
</div>
|
|
108
96
|
) : todos.length === 0 ? (
|
|
109
97
|
<div className="p-12 text-center">
|
|
110
|
-
<Circle size={48} className="
|
|
111
|
-
<h3 className="
|
|
112
|
-
|
|
113
|
-
</h3>
|
|
114
|
-
<p className="text-green-600">
|
|
98
|
+
<Circle size={48} className="demo-muted mx-auto mb-4" />
|
|
99
|
+
<h3 className="demo-section-title mb-2">No todos yet</h3>
|
|
100
|
+
<p className="demo-muted">
|
|
115
101
|
Add your first todo above to get started!
|
|
116
102
|
</p>
|
|
117
103
|
</div>
|
|
118
104
|
) : (
|
|
119
|
-
<div className="divide-y divide-
|
|
105
|
+
<div className="divide-y divide-[var(--line)]">
|
|
120
106
|
{todos.map((todo, index) => (
|
|
121
107
|
<div
|
|
122
108
|
key={todo._id}
|
|
123
|
-
className={`p-4 flex items-center gap-4 hover:bg-
|
|
109
|
+
className={`p-4 flex items-center gap-4 transition-colors hover:bg-[var(--link-bg-hover)] ${
|
|
124
110
|
todo.completed ? 'opacity-75' : ''
|
|
125
111
|
}`}
|
|
126
112
|
style={{
|
|
@@ -131,8 +117,8 @@ function ConvexTodos() {
|
|
|
131
117
|
onClick={() => handleToggleTodo(todo._id)}
|
|
132
118
|
className={`flex-shrink-0 w-6 h-6 rounded-full border-2 flex items-center justify-center transition-all duration-200 ${
|
|
133
119
|
todo.completed
|
|
134
|
-
? '
|
|
135
|
-
: 'border-
|
|
120
|
+
? 'border-[var(--lagoon-deep)] bg-[var(--lagoon)] text-[var(--sea-ink)]'
|
|
121
|
+
: 'border-[var(--line)] text-transparent hover:border-[var(--lagoon-deep)] hover:text-[var(--lagoon-deep)]'
|
|
136
122
|
}`}
|
|
137
123
|
>
|
|
138
124
|
<Check size={14} />
|
|
@@ -141,8 +127,8 @@ function ConvexTodos() {
|
|
|
141
127
|
<span
|
|
142
128
|
className={`flex-1 text-lg transition-all duration-200 ${
|
|
143
129
|
todo.completed
|
|
144
|
-
? 'line-through
|
|
145
|
-
: 'text-
|
|
130
|
+
? 'line-through demo-muted'
|
|
131
|
+
: 'text-[var(--sea-ink)]'
|
|
146
132
|
}`}
|
|
147
133
|
>
|
|
148
134
|
{todo.text}
|
|
@@ -150,7 +136,7 @@ function ConvexTodos() {
|
|
|
150
136
|
|
|
151
137
|
<button
|
|
152
138
|
onClick={() => handleRemoveTodo(todo._id)}
|
|
153
|
-
className="flex-shrink-0 p-2
|
|
139
|
+
className="demo-button demo-button-danger flex-shrink-0 p-2"
|
|
154
140
|
>
|
|
155
141
|
<Trash2 size={18} />
|
|
156
142
|
</button>
|
|
@@ -158,15 +144,14 @@ function ConvexTodos() {
|
|
|
158
144
|
))}
|
|
159
145
|
</div>
|
|
160
146
|
)}
|
|
161
|
-
</
|
|
147
|
+
</section>
|
|
162
148
|
|
|
163
|
-
{/* Footer */}
|
|
164
149
|
<div className="text-center mt-6">
|
|
165
|
-
<p className="
|
|
166
|
-
Built with Convex
|
|
150
|
+
<p className="demo-muted text-sm">
|
|
151
|
+
Built with Convex, real-time updates, and synced state.
|
|
167
152
|
</p>
|
|
168
153
|
</div>
|
|
169
154
|
</div>
|
|
170
|
-
</
|
|
155
|
+
</main>
|
|
171
156
|
)
|
|
172
157
|
}
|
|
@@ -27,16 +27,16 @@ export default function ChatArea() {
|
|
|
27
27
|
|
|
28
28
|
return (
|
|
29
29
|
<>
|
|
30
|
-
<div className="px-4 py-6
|
|
30
|
+
<div className="flex-1 space-y-4 overflow-auto px-4 py-6">
|
|
31
31
|
<Messages messages={messages} user={user} />
|
|
32
32
|
</div>
|
|
33
33
|
|
|
34
|
-
<div className="
|
|
34
|
+
<div className="border-t border-[var(--line)] bg-[var(--chip-bg)] px-4 py-4">
|
|
35
35
|
<div className="flex items-center space-x-3">
|
|
36
36
|
<select
|
|
37
37
|
value={user}
|
|
38
38
|
onChange={(e) => setUser(e.target.value)}
|
|
39
|
-
className="
|
|
39
|
+
className="demo-select demo-input-fit text-sm"
|
|
40
40
|
>
|
|
41
41
|
<option value="Alice">Alice</option>
|
|
42
42
|
<option value="Bob">Bob</option>
|
|
@@ -49,14 +49,14 @@ export default function ChatArea() {
|
|
|
49
49
|
onChange={(e) => setMessage(e.target.value)}
|
|
50
50
|
onKeyDown={handleKeyPress}
|
|
51
51
|
placeholder="Type a message..."
|
|
52
|
-
className="
|
|
52
|
+
className="demo-input"
|
|
53
53
|
/>
|
|
54
54
|
</div>
|
|
55
55
|
|
|
56
56
|
<button
|
|
57
57
|
onClick={postMessage}
|
|
58
58
|
disabled={message.trim() === ''}
|
|
59
|
-
className="
|
|
59
|
+
className="demo-button"
|
|
60
60
|
>
|
|
61
61
|
Send
|
|
62
62
|
</button>
|
|
@@ -2,14 +2,10 @@ import type { Message } from '#/db-collections'
|
|
|
2
2
|
|
|
3
3
|
export const getAvatarColor = (username: string) => {
|
|
4
4
|
const colors = [
|
|
5
|
-
'bg-
|
|
6
|
-
'bg-
|
|
7
|
-
'bg-
|
|
8
|
-
'bg-
|
|
9
|
-
'bg-indigo-500',
|
|
10
|
-
'bg-red-500',
|
|
11
|
-
'bg-yellow-500',
|
|
12
|
-
'bg-teal-500',
|
|
5
|
+
'bg-[var(--lagoon-deep)]',
|
|
6
|
+
'bg-[var(--palm)]',
|
|
7
|
+
'bg-[var(--sea-ink-soft)]',
|
|
8
|
+
'bg-[var(--lagoon)]',
|
|
13
9
|
]
|
|
14
10
|
const index = username
|
|
15
11
|
.split('')
|
|
@@ -49,12 +45,12 @@ export default function Messages({
|
|
|
49
45
|
<div
|
|
50
46
|
className={`px-4 py-2 rounded-2xl ${
|
|
51
47
|
msg.user === user
|
|
52
|
-
? 'bg-
|
|
53
|
-
: '
|
|
48
|
+
? 'bg-[var(--lagoon-deep)] text-white rounded-br-md'
|
|
49
|
+
: 'border border-[var(--line)] bg-[var(--chip-bg)] text-[var(--sea-ink)] rounded-bl-md'
|
|
54
50
|
}`}
|
|
55
51
|
>
|
|
56
52
|
{msg.user !== user && (
|
|
57
|
-
<p className="
|
|
53
|
+
<p className="demo-muted mb-1 text-xs font-medium">
|
|
58
54
|
{msg.user}
|
|
59
55
|
</p>
|
|
60
56
|
)}
|
|
@@ -8,8 +8,10 @@ export const Route = createFileRoute('/demo/db-chat')({
|
|
|
8
8
|
|
|
9
9
|
function App() {
|
|
10
10
|
return (
|
|
11
|
-
<
|
|
12
|
-
<
|
|
13
|
-
|
|
11
|
+
<main className="demo-page demo-center">
|
|
12
|
+
<section className="demo-panel flex h-[70vh] w-full max-w-3xl flex-col overflow-hidden p-0">
|
|
13
|
+
<ChatArea />
|
|
14
|
+
</section>
|
|
15
|
+
</main>
|
|
14
16
|
)
|
|
15
17
|
}
|