@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
@@ -49,68 +49,57 @@ function App() {
49
49
  }
50
50
 
51
51
  if (!todos) {
52
- return <DBConnectionError />
52
+ return (
53
+ <main className="demo-page demo-center">
54
+ <section className="demo-panel w-full max-w-2xl">
55
+ <DBConnectionError />
56
+ </section>
57
+ </main>
58
+ )
53
59
  }
54
60
 
55
61
  return (
56
- <div
57
- className="flex items-center justify-center min-h-screen bg-gradient-to-br from-purple-100 to-blue-100 p-4 text-white"
58
- style={{
59
- backgroundImage:
60
- 'radial-gradient(circle at 5% 40%, #63F655 0%, #00E0D9 40%, #1a0f0a 100%)',
61
- }}
62
- >
63
- <div className="w-full max-w-2xl p-8 rounded-xl backdrop-blur-md bg-black/50 shadow-xl border-8 border-black/10">
64
- <div className="flex items-center justify-center gap-4 mb-8 bg-black/30 p-4 rounded-lg">
65
- <div className="relative">
66
- <div className="absolute -inset-1 bg-gradient-to-r from-emerald-400 to-cyan-400 rounded-lg blur opacity-75 group-hover:opacity-100 transition duration-1000"></div>
67
- <div className="relative">
68
- <img
69
- src="/demo-neon.svg"
70
- alt="Neon Logo"
71
- className="w-12 h-12 transform hover:scale-110 transition-transform duration-200"
72
- />
73
- </div>
62
+ <main className="demo-page demo-center">
63
+ <section className="demo-panel w-full max-w-2xl">
64
+ <header className="mb-8 flex items-center gap-4">
65
+ <span className="demo-card flex h-14 w-14 items-center justify-center p-3">
66
+ <img src="/demo-neon.svg" alt="Neon Logo" className="h-8 w-8" />
67
+ </span>
68
+ <div>
69
+ <p className="island-kicker mb-2">Database</p>
70
+ <h1 className="demo-title">Neon Demo</h1>
74
71
  </div>
75
- <h1 className="text-3xl font-bold bg-gradient-to-r from-emerald-200 to-cyan-200 text-transparent bg-clip-text">
76
- Neon Database Demo
77
- </h1>
78
- </div>
72
+ </header>
79
73
  {todos && (
80
74
  <>
81
- <h1 className="text-2xl font-bold mb-4">Todos</h1>
75
+ <h2 className="demo-section-title mb-4">Todos</h2>
82
76
  <ul className="space-y-3 mb-6">
83
77
  {todos.map((todo: { id: number; title: string }) => (
84
- <li
85
- key={todo.id}
86
- className="bg-white/10 backdrop-blur-sm rounded-lg p-4 shadow-sm border border-white/20 transition-all hover:bg-white/20 hover:scale-[1.02] cursor-pointer group"
87
- >
78
+ <li key={todo.id} className="demo-list-item">
88
79
  <div className="flex items-center justify-between">
89
- <span className="text-lg font-medium group-hover:text-white/90">
90
- {todo.title}
91
- </span>
92
- <span className="text-xs text-white/50">#{todo.id}</span>
80
+ <span className="font-medium">{todo.title}</span>
81
+ <span className="demo-muted text-xs">#{todo.id}</span>
93
82
  </div>
94
83
  </li>
95
84
  ))}
96
85
  </ul>
97
- <form onSubmit={handleSubmit} className="mt-4 flex gap-2">
86
+ <form
87
+ onSubmit={handleSubmit}
88
+ className="mt-4 flex flex-col gap-2 sm:flex-row"
89
+ >
98
90
  <input
99
91
  type="text"
100
92
  name="title"
101
- className="w-full px-4 py-2 rounded-md border border-gray-300 focus:outline-none focus:ring-2 focus:ring-[#00E0D9] bg-black/20"
93
+ className="demo-input min-w-0 flex-1"
102
94
  />
103
- <button
104
- type="submit"
105
- className="px-6 py-2 bg-[#00E0D9] text-black font-medium rounded-md hover:bg-[#00E0D9]/80 focus:outline-none focus:ring-2 focus:ring-[#00E0D9] focus:ring-offset-2 transition-colors disabled:opacity-50 whitespace-nowrap"
106
- >
95
+ <button type="submit" className="demo-button whitespace-nowrap">
107
96
  Add Todo
108
97
  </button>
109
98
  </form>
110
99
  </>
111
100
  )}
112
- </div>
113
- </div>
101
+ </section>
102
+ </main>
114
103
  )
115
104
  }
116
105
 
@@ -134,31 +123,23 @@ function DBConnectionError() {
134
123
  </svg>
135
124
  </div>
136
125
  <h2 className="text-2xl font-bold mb-4">Database Connection Issue</h2>
137
- <div className="text-lg mb-6">The Neon database is not connected.</div>
138
- <div className="bg-black/30 p-6 rounded-lg max-w-xl mx-auto">
126
+ <div className="demo-muted text-lg mb-6">
127
+ The Neon database is not connected.
128
+ </div>
129
+ <div className="demo-card max-w-xl mx-auto text-left">
139
130
  <h3 className="text-lg font-semibold mb-4">Required Steps to Fix:</h3>
140
131
  <ul className="space-y-4 text-left list-none">
141
132
  <li className="flex items-start">
142
- <span className="inline-flex items-center justify-center w-8 h-8 rounded-full bg-amber-500 text-black font-bold mr-3 min-w-8 min-h-8">
143
- 1
144
- </span>
133
+ <span className="demo-pill mr-3 min-w-8 justify-center">1</span>
145
134
  <div>
146
- Use the{' '}
147
- <code className="bg-black/30 px-2 py-1 rounded">db/init.sql</code>{' '}
148
- file to create the database
135
+ Use the <code>db/init.sql</code> file to create the database
149
136
  </div>
150
137
  </li>
151
138
  <li className="flex items-start">
152
- <span className="inline-flex items-center justify-center w-8 h-8 rounded-full bg-amber-500 text-black font-bold mr-3 min-w-8 min-h-8">
153
- 2
154
- </span>
139
+ <span className="demo-pill mr-3 min-w-8 justify-center">2</span>
155
140
  <div>
156
- Set the{' '}
157
- <code className="bg-black/30 px-2 py-1 rounded">
158
- DATABASE_URL
159
- </code>{' '}
160
- environment variable to the connection string of your Neon
161
- database
141
+ Set the <code>DATABASE_URL</code> environment variable to the
142
+ connection string of your Neon database
162
143
  </div>
163
144
  </li>
164
145
  </ul>
@@ -36,22 +36,14 @@ function ORPCTodos() {
36
36
  }, [addTodo, todo])
37
37
 
38
38
  return (
39
- <div
40
- className="flex items-center justify-center min-h-screen bg-gradient-to-br from-purple-100 to-blue-100 p-4 text-white"
41
- style={{
42
- backgroundImage:
43
- 'radial-gradient(50% 50% at 50% 50%, #D2149D 0%, #8E1066 50%, #2D0A1F 100%)',
44
- }}
45
- >
46
- <div className="w-full max-w-2xl p-8 rounded-xl backdrop-blur-md bg-black/50 shadow-xl border-8 border-black/10">
47
- <h1 className="text-2xl mb-4">oRPC Todos list</h1>
39
+ <main className="demo-page demo-center">
40
+ <section className="demo-panel w-full max-w-2xl">
41
+ <p className="island-kicker mb-2">oRPC</p>
42
+ <h1 className="demo-title mb-6">Todos</h1>
48
43
  <ul className="mb-4 space-y-2">
49
44
  {data?.map((t) => (
50
- <li
51
- key={t.id}
52
- className="bg-white/10 border border-white/20 rounded-lg p-3 backdrop-blur-sm shadow-md"
53
- >
54
- <span className="text-lg text-white">{t.name}</span>
45
+ <li key={t.id} className="demo-list-item">
46
+ <span className="text-base font-medium">{t.name}</span>
55
47
  </li>
56
48
  ))}
57
49
  </ul>
@@ -66,17 +58,17 @@ function ORPCTodos() {
66
58
  }
67
59
  }}
68
60
  placeholder="Enter a new todo..."
69
- className="w-full px-4 py-3 rounded-lg border border-white/20 bg-white/10 backdrop-blur-sm text-white placeholder-white/60 focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-transparent"
61
+ className="demo-input"
70
62
  />
71
63
  <button
72
64
  disabled={todo.trim().length === 0}
73
65
  onClick={submitTodo}
74
- className="bg-blue-500 hover:bg-blue-600 disabled:bg-blue-500/50 disabled:cursor-not-allowed text-white font-bold py-3 px-4 rounded-lg transition-colors"
66
+ className="demo-button"
75
67
  >
76
68
  Add todo
77
69
  </button>
78
70
  </div>
79
- </div>
80
- </div>
71
+ </section>
72
+ </main>
81
73
  )
82
74
  }
@@ -9,16 +9,15 @@ export const Route = createFileRoute("/demo/i18n")({
9
9
 
10
10
  function App() {
11
11
  return (
12
- <div className="text-center">
13
- <header className="min-h-screen flex flex-col items-center justify-center bg-[#282c34] text-white text-[calc(10px+2vmin)] gap-4">
12
+ <main className="demo-page demo-center text-center">
13
+ <section className="demo-panel flex w-full max-w-2xl flex-col items-center gap-4">
14
14
  <img
15
15
  src={logo}
16
- className="h-[40vmin] pointer-events-none animate-[spin_20s_linear_infinite]"
16
+ className="pointer-events-none h-28 animate-[spin_20s_linear_infinite]"
17
17
  alt="logo"
18
18
  />
19
- <p>{m.example_message({ username: "TanStack Router" })}</p>
19
+ <p className="demo-muted text-lg">{m.example_message({ username: "TanStack Router" })}</p>
20
20
  <a
21
- className="text-[#61dafb] hover:underline"
22
21
  href="https://inlang.com/m/gerre34r/library-inlang-paraglideJs"
23
22
  target="_blank"
24
23
  rel="noopener noreferrer"
@@ -28,7 +27,7 @@ function App() {
28
27
  <div className="mt-3">
29
28
  <LocaleSwitcher />
30
29
  </div>
31
- </header>
32
- </div>
30
+ </section>
31
+ </main>
33
32
  );
34
33
  }
@@ -21,61 +21,60 @@ function PostHogDemo() {
21
21
  }
22
22
 
23
23
  return (
24
- <div className="min-h-screen bg-gray-900 text-white p-8">
25
- <div className="max-w-md mx-auto">
26
- <h1 className="text-3xl font-bold mb-6">PostHog Demo</h1>
24
+ <main className="demo-page demo-center">
25
+ <section className="demo-panel w-full max-w-md">
26
+ <p className="island-kicker mb-2">Analytics</p>
27
+ <h1 className="demo-title mb-6">PostHog Demo</h1>
27
28
 
28
29
  {!isConfigured && (
29
- <div className="mb-4 p-4 bg-yellow-900/50 border border-yellow-600 rounded-lg">
30
- <p className="text-yellow-200 text-sm">
30
+ <div className="demo-alert mb-4">
31
+ <p className="text-sm">
31
32
  <strong>Warning:</strong> VITE_POSTHOG_KEY is not configured.
32
- Events won't be sent to PostHog. Add it to your{' '}
33
- <code className="bg-yellow-900 px-1 rounded">.env</code> file.
33
+ Events won't be sent to PostHog. Add it to your <code>.env</code>{' '}
34
+ file.
34
35
  </p>
35
36
  </div>
36
37
  )}
37
38
 
38
- <div className="bg-gray-800 rounded-lg p-6">
39
- <p className="text-gray-400 mb-4">
39
+ <div className="demo-card">
40
+ <p className="demo-muted mb-4">
40
41
  Click the button below to send events to PostHog. Check your PostHog
41
42
  dashboard to see them appear in real-time.
42
43
  </p>
43
44
 
44
45
  <button
45
46
  onClick={() => trackEvent('button_clicked', { button: 'demo' })}
46
- className="w-full bg-cyan-600 hover:bg-cyan-700 px-4 py-3 rounded font-medium"
47
+ className="demo-button w-full"
47
48
  >
48
49
  Track Click
49
50
  </button>
50
51
 
51
52
  {isConfigured && (
52
- <div className="mt-6 p-4 bg-gray-700 rounded">
53
- <p className="text-sm text-gray-400">Events sent this session:</p>
54
- <p className="text-4xl font-bold text-cyan-400">{eventCount}</p>
53
+ <div className="demo-list-item mt-6">
54
+ <p className="demo-muted text-sm">Events sent this session:</p>
55
+ <p className="text-4xl font-bold">{eventCount}</p>
55
56
  </div>
56
57
  )}
57
58
  </div>
58
59
 
59
- <p className="mt-4 text-sm text-gray-400">
60
+ <p className="demo-muted mt-4 text-sm">
60
61
  Open your{' '}
61
62
  <a
62
63
  href="https://app.posthog.com/events"
63
64
  target="_blank"
64
65
  rel="noopener noreferrer"
65
- className="text-cyan-400 hover:text-cyan-300 underline"
66
66
  >
67
67
  PostHog Events
68
68
  </a>{' '}
69
69
  page to see these events appear.
70
70
  </p>
71
71
 
72
- <p className="mt-2 text-sm text-gray-400">
72
+ <p className="demo-muted mt-2 text-sm">
73
73
  Learn more in the{' '}
74
74
  <a
75
75
  href="https://posthog.com/docs/libraries/react"
76
76
  target="_blank"
77
77
  rel="noopener noreferrer"
78
- className="text-cyan-400 hover:text-cyan-300 underline"
79
78
  >
80
79
  PostHog React docs
81
80
  </a>
@@ -83,11 +82,9 @@ function PostHogDemo() {
83
82
  </p>
84
83
 
85
84
  <div className="mt-8">
86
- <Link to="/" className="text-cyan-400 hover:text-cyan-300">
87
- &larr; Back to Home
88
- </Link>
85
+ <Link to="/">&larr; Back to Home</Link>
89
86
  </div>
90
- </div>
91
- </div>
87
+ </section>
88
+ </main>
92
89
  )
93
90
  }
@@ -54,21 +54,22 @@ function PowerSyncDemo() {
54
54
  </p>
55
55
  <h1 className="text-3xl font-semibold tracking-tight">PowerSync</h1>
56
56
  <p className="text-sm text-[var(--sea-ink-soft)]">
57
- This demo writes to the local SQLite database immediately. Replace the sample
58
- schema and backend connector with your real PowerSync configuration.
57
+ This demo writes to the local SQLite database immediately. Replace
58
+ the sample schema and backend connector with your real PowerSync
59
+ configuration.
59
60
  </p>
60
61
  </header>
61
62
 
62
- <section className="rounded-3xl border border-[var(--line)] bg-white/70 p-5 shadow-sm">
63
+ <section className="demo-card">
63
64
  <h2 className="text-sm font-semibold uppercase tracking-[0.16em] text-[var(--sea-ink-soft)]">
64
65
  Connection State
65
66
  </h2>
66
- <pre className="mt-3 overflow-auto rounded-2xl bg-[var(--chip-bg)] p-4 text-xs leading-6 text-[var(--sea-ink)]">
67
+ <pre className="demo-code-block mt-3 overflow-auto text-xs leading-6">
67
68
  {JSON.stringify(status, null, 2)}
68
69
  </pre>
69
70
  </section>
70
71
 
71
- <section className="rounded-3xl border border-[var(--line)] bg-white/70 p-5 shadow-sm">
72
+ <section className="demo-card">
72
73
  <h2 className="text-sm font-semibold uppercase tracking-[0.16em] text-[var(--sea-ink-soft)]">
73
74
  Local Todos
74
75
  </h2>
@@ -77,39 +78,39 @@ function PowerSyncDemo() {
77
78
  {error}
78
79
  </p>
79
80
  ) : null}
80
- <form className="mt-4 flex flex-col gap-3 sm:flex-row" onSubmit={addTodo}>
81
+ <form
82
+ className="mt-4 flex flex-col gap-3 sm:flex-row"
83
+ onSubmit={addTodo}
84
+ >
81
85
  <label className="sr-only" htmlFor="powersync-todo-description">
82
86
  Todo description
83
87
  </label>
84
88
  <input
85
89
  id="powersync-todo-description"
86
- className="min-w-0 flex-1 rounded-2xl border border-[var(--line)] bg-white px-4 py-3 text-sm text-[var(--sea-ink)] outline-none"
90
+ className="demo-input min-w-0 flex-1"
87
91
  onChange={(event) => setDescription(event.target.value)}
88
92
  placeholder="Write to the local PowerSync database"
89
93
  value={description}
90
94
  />
91
- <button
92
- className="rounded-2xl bg-[var(--sea-ink)] px-4 py-3 text-sm font-semibold text-white"
93
- type="submit"
94
- >
95
+ <button className="demo-button" type="submit">
95
96
  Insert Local Row
96
97
  </button>
97
98
  </form>
98
99
 
99
100
  <ul className="mt-5 space-y-3">
100
101
  {todos.length === 0 ? (
101
- <li className="rounded-2xl border border-dashed border-[var(--line)] px-4 py-5 text-sm text-[var(--sea-ink-soft)]">
102
- No rows yet. Insert one locally, then wire `uploadData()` to send it upstream.
102
+ <li className="demo-list-item text-sm text-[var(--sea-ink-soft)]">
103
+ No rows yet. Insert one locally, then wire `uploadData()` to
104
+ send it upstream.
103
105
  </li>
104
106
  ) : (
105
107
  todos.map((todo) => (
106
- <li
107
- className="rounded-2xl border border-[var(--line)] bg-[var(--chip-bg)] px-4 py-4"
108
- key={todo.id}
109
- >
108
+ <li className="demo-list-item" key={todo.id}>
110
109
  <div className="flex items-start justify-between gap-4">
111
110
  <div>
112
- <p className="font-medium text-[var(--sea-ink)]">{todo.description}</p>
111
+ <p className="font-medium text-[var(--sea-ink)]">
112
+ {todo.description}
113
+ </p>
113
114
  <p className="mt-1 text-xs text-[var(--sea-ink-soft)]">
114
115
  {todo.created_at}
115
116
  </p>
@@ -46,141 +46,91 @@ function DemoPrisma() {
46
46
  }
47
47
 
48
48
  return (
49
- <div
50
- className="flex items-center justify-center min-h-screen p-4 text-white"
51
- style={{
52
- background:
53
- 'linear-gradient(135deg, #0c1a2b 0%, #1a2332 50%, #16202e 100%)',
54
- }}
55
- >
56
- <div
57
- className="w-full max-w-2xl p-8 rounded-xl shadow-2xl border border-white/10"
58
- style={{
59
- background:
60
- 'linear-gradient(135deg, rgba(22, 32, 46, 0.95) 0%, rgba(12, 26, 43, 0.95) 100%)',
61
- backdropFilter: 'blur(10px)',
62
- }}
63
- >
64
- <div
65
- className="flex items-center justify-center gap-4 mb-8 p-4 rounded-lg"
66
- style={{
67
- background:
68
- 'linear-gradient(90deg, rgba(93, 103, 227, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%)',
69
- border: '1px solid rgba(93, 103, 227, 0.2)',
70
- }}
71
- >
72
- <div className="relative group">
73
- <div className="absolute -inset-2 bg-gradient-to-r from-indigo-500 via-purple-500 to-indigo-500 rounded-lg blur-lg opacity-60 group-hover:opacity-100 transition duration-500"></div>
74
- <div className="relative bg-gradient-to-br from-indigo-600 to-purple-600 p-3 rounded-lg">
75
- <img
76
- src="/prisma.svg"
77
- alt="Prisma Logo"
78
- className="w-8 h-8 transform group-hover:scale-110 transition-transform duration-300"
79
- />
80
- </div>
49
+ <main className="demo-page demo-center">
50
+ <section className="demo-panel w-full max-w-2xl">
51
+ <header className="mb-8 flex items-center gap-4">
52
+ <span className="demo-card flex h-14 w-14 items-center justify-center p-3">
53
+ <img src="/prisma.svg" alt="Prisma Logo" className="h-8 w-8" />
54
+ </span>
55
+ <div>
56
+ <p className="island-kicker mb-2">Database</p>
57
+ <h1 className="demo-title">Prisma Demo</h1>
81
58
  </div>
82
- <h1 className="text-3xl font-bold bg-gradient-to-r from-indigo-300 via-purple-300 to-indigo-300 text-transparent bg-clip-text">
83
- Prisma Database Demo
84
- </h1>
85
- </div>
59
+ </header>
86
60
 
87
- <h2 className="text-2xl font-bold mb-4 text-indigo-200">Todos</h2>
61
+ <h2 className="demo-section-title mb-4">Todos</h2>
88
62
 
89
63
  <ul className="space-y-3 mb-6">
90
64
  {todos.map((todo) => (
91
65
  <li
92
66
  key={todo.id}
93
- className="rounded-lg p-4 shadow-md border transition-all hover:scale-[1.02] cursor-pointer group"
94
- style={{
95
- background:
96
- 'linear-gradient(135deg, rgba(93, 103, 227, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%)',
97
- borderColor: 'rgba(93, 103, 227, 0.3)',
98
- }}
67
+ className="demo-list-item"
99
68
  >
100
69
  <div className="flex items-center justify-between">
101
- <span className="text-lg font-medium text-white group-hover:text-indigo-200 transition-colors">
102
- {todo.title}
103
- </span>
104
- <span className="text-xs text-indigo-300/70">#{todo.id}</span>
70
+ <span className="font-medium">{todo.title}</span>
71
+ <span className="demo-muted text-xs">#{todo.id}</span>
105
72
  </div>
106
73
  </li>
107
74
  ))}
108
75
  {todos.length === 0 && (
109
- <li className="text-center py-8 text-indigo-300/70">
76
+ <li className="demo-list-item text-center demo-muted">
110
77
  No todos yet. Create one below!
111
78
  </li>
112
79
  )}
113
80
  </ul>
114
81
 
115
- <form onSubmit={handleSubmit} className="flex gap-2">
82
+ <form onSubmit={handleSubmit} className="flex flex-col gap-2 sm:flex-row">
116
83
  <input
117
84
  type="text"
118
85
  name="title"
119
86
  placeholder="Add a new todo..."
120
- className="flex-1 px-4 py-3 rounded-lg border focus:outline-none focus:ring-2 transition-all text-white placeholder-indigo-300/50"
121
- style={{
122
- background: 'rgba(93, 103, 227, 0.1)',
123
- borderColor: 'rgba(93, 103, 227, 0.3)',
124
- focusRing: 'rgba(93, 103, 227, 0.5)',
125
- }}
87
+ className="demo-input min-w-0 flex-1"
126
88
  />
127
89
  <button
128
90
  type="submit"
129
- className="px-6 py-3 font-semibold rounded-lg shadow-lg transition-all duration-200 hover:shadow-xl hover:scale-105 active:scale-95 whitespace-nowrap"
130
- style={{
131
- background: 'linear-gradient(135deg, #5d67e3 0%, #8b5cf6 100%)',
132
- color: 'white',
133
- }}
91
+ className="demo-button whitespace-nowrap"
134
92
  >
135
93
  Add Todo
136
94
  </button>
137
95
  </form>
138
96
 
139
- <div
140
- className="mt-8 p-6 rounded-lg border"
141
- style={{
142
- background: 'rgba(93, 103, 227, 0.05)',
143
- borderColor: 'rgba(93, 103, 227, 0.2)',
144
- }}
145
- >
146
- <h3 className="text-lg font-semibold mb-2 text-indigo-200">
97
+ <div className="demo-card mt-8">
98
+ <h3 className="demo-section-title mb-2">
147
99
  Powered by Prisma ORM
148
100
  </h3>
149
- <p className="text-sm text-indigo-300/80 mb-4">
101
+ <p className="demo-muted mb-4 text-sm">
150
102
  Next-generation ORM for Node.js & TypeScript with PostgreSQL
151
103
  </p>
152
104
  <div className="space-y-2 text-sm">
153
- <p className="text-indigo-200 font-medium">Setup Instructions:</p>
154
- <ol className="list-decimal list-inside space-y-2 text-indigo-300/80">
105
+ <p className="font-medium">Setup Instructions:</p>
106
+ <ol className="demo-muted list-inside list-decimal space-y-2">
155
107
  <li>
156
108
  Configure your{' '}
157
- <code className="px-2 py-1 rounded bg-black/30 text-purple-300">
158
- DATABASE_URL
159
- </code>{' '}
109
+ <code>DATABASE_URL</code>{' '}
160
110
  in .env.local
161
111
  </li>
162
112
  <li>
163
113
  Run:{' '}
164
- <code className="px-2 py-1 rounded bg-black/30 text-purple-300">
114
+ <code>
165
115
  <%- getPackageManagerExecuteScript('prisma', ['generate']) %>
166
116
  </code>
167
117
  </li>
168
118
  <li>
169
119
  Run:{' '}
170
- <code className="px-2 py-1 rounded bg-black/30 text-purple-300">
120
+ <code>
171
121
  <%- getPackageManagerExecuteScript('prisma', ['db', 'push']) %>
172
122
  </code>
173
123
  </li>
174
124
  <li>
175
125
  Optional:{' '}
176
- <code className="px-2 py-1 rounded bg-black/30 text-purple-300">
126
+ <code>
177
127
  <%- getPackageManagerExecuteScript('prisma', ['studio']) %>
178
128
  </code>
179
129
  </li>
180
130
  </ol>
181
131
  </div>
182
132
  </div>
183
- </div>
184
- </div>
133
+ </section>
134
+ </main>
185
135
  )
186
136
  }