@tanstack/create 0.68.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
  3. package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
  4. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
  5. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
  6. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
  7. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
  8. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
  9. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
  10. package/dist/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
  11. package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
  12. package/dist/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
  13. package/dist/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
  14. package/dist/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
  15. package/dist/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
  16. package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
  17. package/dist/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
  18. package/dist/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
  19. package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
  20. package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
  21. package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
  22. package/dist/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
  23. package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
  24. package/dist/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
  25. package/dist/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
  26. package/dist/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
  27. package/dist/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
  28. package/dist/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
  29. package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
  30. package/dist/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
  31. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
  32. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
  33. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
  34. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
  35. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
  36. package/dist/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
  37. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
  38. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
  39. package/dist/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
  40. package/dist/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
  41. package/dist/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
  42. package/dist/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
  43. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
  44. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
  45. package/dist/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
  46. package/dist/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
  47. package/dist/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
  48. package/dist/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
  49. package/dist/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
  50. package/dist/frameworks/react/project/base/_dot_gitignore +1 -0
  51. package/dist/frameworks/react/project/base/src/styles.css.ejs +203 -0
  52. package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
  53. package/dist/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
  54. package/dist/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
  55. package/dist/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
  56. package/dist/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
  57. package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
  58. package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
  59. package/dist/frameworks/solid/project/base/_dot_gitignore +1 -0
  60. package/dist/frameworks/solid/project/base/src/styles.css.ejs +203 -0
  61. package/package.json +1 -1
  62. package/src/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
  63. package/src/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
  64. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
  65. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
  66. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
  67. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
  68. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
  69. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
  70. package/src/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
  71. package/src/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
  72. package/src/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
  73. package/src/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
  74. package/src/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
  75. package/src/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
  76. package/src/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
  77. package/src/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
  78. package/src/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
  79. package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
  80. package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
  81. package/src/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
  82. package/src/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
  83. package/src/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
  84. package/src/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
  85. package/src/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
  86. package/src/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
  87. package/src/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
  88. package/src/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
  89. package/src/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
  90. package/src/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
  91. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
  92. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
  93. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
  94. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
  95. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
  96. package/src/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
  97. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
  98. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
  99. package/src/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
  100. package/src/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
  101. package/src/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
  102. package/src/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
  103. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
  104. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
  105. package/src/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
  106. package/src/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
  107. package/src/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
  108. package/src/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
  109. package/src/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
  110. package/src/frameworks/react/project/base/_dot_gitignore +1 -0
  111. package/src/frameworks/react/project/base/src/styles.css.ejs +203 -0
  112. package/src/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
  113. package/src/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
  114. package/src/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
  115. package/src/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
  116. package/src/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
  117. package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
  118. package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
  119. package/src/frameworks/solid/project/base/_dot_gitignore +1 -0
  120. package/src/frameworks/solid/project/base/src/styles.css.ejs +203 -0
  121. package/tests/framework-template.test.ts +15 -0
@@ -1,37 +1,36 @@
1
- import { createFileRoute } from "@tanstack/react-router";
2
- import { useState } from "react";
3
- import { authClient } from "#/lib/auth-client";
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("/demo/better-auth")({
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
- <div className="flex items-center justify-center py-10">
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
- </div>
23
- );
22
+ </main>
23
+ )
24
24
  }
25
25
 
26
26
  if (session?.user) {
27
27
  return (
28
- <div className="flex justify-center py-10 px-4">
29
- <div className="w-full max-w-md p-6 space-y-6">
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
- <h1 className="text-lg font-semibold leading-none tracking-tight">
32
- Welcome back
33
- </h1>
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() || "U"}
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="w-full h-9 px-4 text-sm font-medium border border-neutral-300 dark:border-neutral-700 hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors"
62
+ className="demo-button demo-button-secondary w-full"
64
63
  >
65
64
  Sign out
66
65
  </button>
67
66
 
68
- <p className="text-xs text-center text-neutral-400 dark:text-neutral-500">
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 hover:text-neutral-600 dark:hover:text-neutral-300"
73
+ className="font-medium"
75
74
  >
76
75
  BETTER-AUTH
77
76
  </a>
78
77
  .
79
78
  </p>
80
- </div>
81
- </div>
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 || "Sign up failed");
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 || "Sign in failed");
105
+ setError(result.error.message || 'Sign in failed')
107
106
  }
108
107
  }
109
108
  } catch (err) {
110
- setError("An unexpected error occurred");
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
- <div className="flex justify-center py-10 px-4">
118
- <div className="w-full max-w-md p-6">
119
- <h1 className="text-lg font-semibold leading-none tracking-tight">
120
- {isSignUp ? "Create an account" : "Sign in"}
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="text-sm text-neutral-500 dark:text-neutral-400 mt-2 mb-6">
122
+ <p className="demo-muted mt-2 mb-6 text-sm">
123
123
  {isSignUp
124
- ? "Enter your information to create an account"
125
- : "Enter your email below to login to your account"}
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="flex h-9 w-full border border-neutral-300 dark:border-neutral-700 bg-transparent px-3 text-sm focus:outline-none focus:border-neutral-900 dark:focus:border-neutral-100 disabled:cursor-not-allowed disabled:opacity-50"
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="flex h-9 w-full border border-neutral-300 dark:border-neutral-700 bg-transparent px-3 text-sm focus:outline-none focus:border-neutral-900 dark:focus:border-neutral-100 disabled:cursor-not-allowed disabled:opacity-50"
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="flex h-9 w-full border border-neutral-300 dark:border-neutral-700 bg-transparent px-3 text-sm focus:outline-none focus:border-neutral-900 dark:focus:border-neutral-100 disabled:cursor-not-allowed disabled:opacity-50"
174
+ className="demo-input"
175
175
  required
176
176
  minLength={8}
177
177
  />
178
178
  </div>
179
179
 
180
180
  {error && (
181
- <div className="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 p-3">
182
- <p className="text-sm text-red-600 dark:text-red-400">{error}</p>
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 h-9 px-4 text-sm font-medium text-white bg-neutral-900 hover:bg-neutral-800 dark:bg-neutral-50 dark:text-neutral-900 dark:hover:bg-neutral-200 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
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
- "Create account"
197
+ 'Create account'
198
198
  ) : (
199
- "Sign in"
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="text-sm text-neutral-500 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors"
211
+ className="demo-muted text-sm transition-colors hover:text-[var(--sea-ink)]"
212
212
  >
213
213
  {isSignUp
214
- ? "Already have an account? Sign in"
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-xs text-center text-neutral-400 dark:text-neutral-500">
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 hover:text-neutral-600 dark:hover:text-neutral-300"
225
+ className="font-medium"
226
226
  >
227
227
  BETTER-AUTH
228
228
  </a>
229
229
  .
230
230
  </p>
231
- </div>
232
- </div>
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
- <div className="flex justify-center py-10 px-4">
16
- <div className="w-full max-w-md p-6 space-y-6">
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
- <h1 className="text-lg font-semibold leading-none tracking-tight">
20
- Sign in to continue
21
- </h1>
22
- <p className="text-sm text-neutral-500 dark:text-neutral-400">
23
- Clerk renders the sign-in UI, manages sessions, and handles social providers for you.
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="text-xs text-center text-neutral-400 dark:text-neutral-500">
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 hover:text-neutral-600 dark:hover:text-neutral-300"
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
- </div>
47
- </div>
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
- <h1 className="text-lg font-semibold leading-none tracking-tight">
62
- Welcome back
63
- </h1>
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="text-xs text-center text-neutral-400 dark:text-neutral-500">
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 hover:text-neutral-600 dark:hover:text-neutral-300"
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
- <div
48
- className="min-h-screen flex items-center justify-center p-4"
49
- style={{
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
- <h1 className="text-4xl font-bold text-green-800 mb-2">
59
- Convex Todos
60
- </h1>
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="text-green-700 font-medium">
65
- {completedCount} completed
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
- </div>
63
+ </section>
74
64
 
75
- {/* Add Todo Card */}
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="flex-1 px-4 py-3 rounded-xl border-2 border-green-200 focus:border-green-400 focus:outline-none text-gray-800 placeholder-gray-500 bg-white/80 transition-colors"
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="bg-gradient-to-r from-green-500 to-green-600 hover:from-green-600 hover:to-green-700 disabled:from-gray-300 disabled:to-gray-400 disabled:cursor-not-allowed text-white font-semibold py-3 px-6 rounded-xl transition-all duration-200 flex items-center gap-2 shadow-lg hover:shadow-xl"
82
+ className="demo-button"
94
83
  >
95
84
  <Plus size={20} />
96
85
  Add
97
86
  </button>
98
87
  </div>
99
- </div>
88
+ </section>
100
89
 
101
- {/* Todos List */}
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="animate-spin rounded-full h-8 w-8 border-b-2 border-green-500 mx-auto mb-4"></div>
106
- <p className="text-green-600">Loading todos...</p>
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="text-green-300 mx-auto mb-4" />
111
- <h3 className="text-xl font-semibold text-green-800 mb-2">
112
- No todos yet
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-green-100">
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-green-50/50 transition-colors ${
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
- ? 'bg-green-500 border-green-500 text-white'
135
- : 'border-green-300 hover:border-green-400 text-transparent hover:text-green-400'
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 text-gray-500'
145
- : 'text-gray-800'
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 text-red-400 hover:text-red-600 hover:bg-red-50 rounded-lg transition-colors"
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
- </div>
147
+ </section>
162
148
 
163
- {/* Footer */}
164
149
  <div className="text-center mt-6">
165
- <p className="text-green-700/80 text-sm">
166
- Built with Convex • Real-time updates Always in sync
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
- </div>
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 space-y-4">
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="bg-white border-t border-gray-200 px-4 py-4">
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="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
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="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
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="px-6 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
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-blue-500',
6
- 'bg-green-500',
7
- 'bg-purple-500',
8
- 'bg-pink-500',
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-blue-500 text-white rounded-br-md'
53
- : 'bg-white text-gray-800 border border-gray-200 rounded-bl-md'
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="text-xs text-gray-500 mb-1 font-medium">
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
- <div className="flex flex-col h-screen bg-gray-50">
12
- <ChatArea />
13
- </div>
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
  }