@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
@@ -8,48 +8,42 @@ export const Route = createFileRoute('/demo/guitars/')({
8
8
 
9
9
  function GuitarsIndex() {
10
10
  return (
11
- <div className="bg-black text-white p-5">
12
- <h1 className="text-3xl font-bold mb-8 text-center">Featured Guitars</h1>
13
- <div className="flex flex-wrap gap-12 justify-center">
11
+ <main className="demo-page demo-page-wide">
12
+ <h1 className="demo-title mb-8 text-center">Featured Guitars</h1>
13
+ <div className="grid gap-6 md:grid-cols-2 xl:grid-cols-3">
14
14
  {guitars.map((guitar) => (
15
- <div
16
- key={guitar.id}
17
- className="w-full md:w-[calc(50%-1.5rem)] xl:w-[calc(33.333%-2rem)] relative mb-24"
18
- >
15
+ <div key={guitar.id}>
19
16
  <Link
20
- to="/example/guitars/$guitarId"
17
+ to="/demo/guitars/$guitarId"
21
18
  params={{
22
19
  guitarId: guitar.id.toString(),
23
20
  }}
21
+ className="block no-underline"
24
22
  >
25
- <div className="relative z-0 w-full aspect-square mb-8">
26
- <div className="w-full h-full overflow-hidden rounded-2xl border-4 border-gray-800 shadow-2xl">
23
+ <article className="demo-card h-full overflow-hidden p-0 transition hover:-translate-y-0.5">
24
+ <div className="aspect-square overflow-hidden">
27
25
  <img
28
26
  src={guitar.image}
29
27
  alt={guitar.name}
30
- className="w-full h-full object-cover guitar-image group-hover:scale-105 transition-transform duration-500"
28
+ className="guitar-image h-full w-full object-cover transition-transform duration-500 hover:scale-105"
31
29
  />
32
- <div className="absolute inset-0 bg-gradient-to-t from-black/40 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
33
30
  </div>
34
-
35
- <div className="absolute bottom-4 left-1/2 transform -translate-x-1/2 bg-emerald-500/80 text-white px-4 py-2 rounded-full text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity duration-300 backdrop-blur-sm">
36
- View Details
37
- </div>
38
- </div>
39
-
40
- <div className="absolute bottom-0 right-0 z-10 w-[80%] bg-gray-900/60 backdrop-blur-md rounded-2xl p-5 border border-gray-800/50 shadow-xl transform translate-y-[40%]">
41
- <h2 className="text-xl font-bold mb-2">{guitar.name}</h2>
42
- <p className="text-gray-300 mb-3 line-clamp-2">
43
- {guitar.shortDescription}
44
- </p>
45
- <div className="text-xl font-bold text-emerald-400">
46
- ${guitar.price}
31
+ <div className="p-5">
32
+ <h2 className="mb-2 text-xl font-bold text-[var(--sea-ink)]">
33
+ {guitar.name}
34
+ </h2>
35
+ <p className="demo-muted mb-3 line-clamp-2">
36
+ {guitar.shortDescription}
37
+ </p>
38
+ <div className="text-xl font-bold text-[var(--lagoon-deep)]">
39
+ ${guitar.price}
40
+ </div>
47
41
  </div>
48
- </div>
42
+ </article>
49
43
  </Link>
50
44
  </div>
51
45
  ))}
52
46
  </div>
53
- </div>
47
+ </main>
54
48
  )
55
49
  }
@@ -33,43 +33,40 @@ function RouteComponent() {
33
33
  const { data } = useReadQuery(queryRef)
34
34
 
35
35
  return (
36
- <div className="p-4">
37
- <h2 className="text-2xl font-bold mb-4">Apollo Client Demo</h2>
38
- <div className="bg-blue-100 border border-blue-400 text-blue-700 px-4 py-3 rounded mb-4">
39
- <p className="font-bold">Apollo Client is configured!</p>
40
- <p className="text-sm mt-2">
41
- This demo uses{' '}
42
- <code className="bg-blue-200 px-1 rounded">preloadQuery</code> in the
43
- loader and{' '}
44
- <code className="bg-blue-200 px-1 rounded">useReadQuery</code> in the
45
- component for optimal streaming SSR performance.
46
- </p>
47
- </div>
48
- <div className="bg-gray-100 p-4 rounded">
49
- <h3 className="font-bold mb-2">Query Result:</h3>
50
- <pre className="text-sm overflow-x-auto">
51
- {JSON.stringify(data, null, 2)}
52
- </pre>
53
- </div>
54
- <div className="mt-4 text-sm text-gray-600">
55
- <p>📝 Next steps:</p>
56
- <ul className="list-disc ml-6 mt-2">
57
- <li>
58
- Configure your GraphQL endpoint in{' '}
59
- <code className="bg-gray-200 px-1 rounded">src/router.tsx</code>
60
- </li>
61
- <li>Replace the example query with your actual GraphQL schema</li>
62
- <li>
63
- Learn more:{' '}
64
- <a
65
- href="https://www.apollographql.com/docs/react"
66
- className="text-blue-600 hover:underline"
67
- >
68
- Apollo Client Docs
69
- </a>
70
- </li>
71
- </ul>
72
- </div>
73
- </div>
36
+ <main className="demo-page">
37
+ <section className="demo-panel">
38
+ <p className="island-kicker mb-2">GraphQL</p>
39
+ <h1 className="demo-title mb-6">Apollo Client Demo</h1>
40
+ <div className="demo-alert mb-4">
41
+ <p className="font-bold">Apollo Client is configured!</p>
42
+ <p className="text-sm mt-2">
43
+ This demo uses <code>preloadQuery</code> in the loader and{' '}
44
+ <code>useReadQuery</code> in the component for optimal streaming SSR
45
+ performance.
46
+ </p>
47
+ </div>
48
+ <div className="demo-code-block">
49
+ <h3 className="font-bold mb-2">Query Result:</h3>
50
+ <pre className="text-sm overflow-x-auto">
51
+ {JSON.stringify(data, null, 2)}
52
+ </pre>
53
+ </div>
54
+ <div className="demo-muted mt-4 text-sm">
55
+ <p className="font-medium text-[var(--sea-ink)]">Next steps:</p>
56
+ <ul className="list-disc ml-6 mt-2">
57
+ <li>
58
+ Configure your GraphQL endpoint in <code>src/router.tsx</code>
59
+ </li>
60
+ <li>Replace the example query with your actual GraphQL schema</li>
61
+ <li>
62
+ Learn more:{' '}
63
+ <a href="https://www.apollographql.com/docs/react">
64
+ Apollo Client Docs
65
+ </a>
66
+ </li>
67
+ </ul>
68
+ </div>
69
+ </section>
70
+ </main>
74
71
  )
75
72
  }
@@ -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>