@tanstack/create 0.68.0 → 0.68.2

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 (132) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/create-app.js +22 -0
  3. package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
  4. package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
  5. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
  6. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
  7. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
  8. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
  9. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
  10. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
  11. package/dist/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
  12. package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
  13. package/dist/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
  14. package/dist/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
  15. package/dist/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
  16. package/dist/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
  17. package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
  18. package/dist/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
  19. package/dist/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
  20. package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
  21. package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
  22. package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
  23. package/dist/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
  24. package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
  25. package/dist/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
  26. package/dist/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
  27. package/dist/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
  28. package/dist/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
  29. package/dist/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
  30. package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
  31. package/dist/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
  32. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
  33. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
  34. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
  35. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
  36. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
  37. package/dist/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
  38. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
  39. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
  40. package/dist/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
  41. package/dist/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
  42. package/dist/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
  43. package/dist/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
  44. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
  45. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
  46. package/dist/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
  47. package/dist/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
  48. package/dist/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
  49. package/dist/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
  50. package/dist/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
  51. package/dist/frameworks/react/project/base/package.json +1 -0
  52. package/dist/frameworks/react/project/base/src/styles.css.ejs +203 -0
  53. package/dist/frameworks/react/project/base/tsr.config.json +3 -0
  54. package/dist/frameworks/react/project/packages.json +3 -0
  55. package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
  56. package/dist/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
  57. package/dist/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
  58. package/dist/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
  59. package/dist/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
  60. package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
  61. package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
  62. package/dist/frameworks/solid/project/base/package.json +1 -0
  63. package/dist/frameworks/solid/project/base/src/styles.css.ejs +203 -0
  64. package/dist/frameworks/solid/project/base/tsr.config.json +3 -0
  65. package/dist/frameworks/solid/project/packages.json +3 -0
  66. package/package.json +1 -1
  67. package/src/create-app.ts +32 -1
  68. package/src/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
  69. package/src/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
  70. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
  71. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
  72. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
  73. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
  74. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
  75. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
  76. package/src/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
  77. package/src/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
  78. package/src/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
  79. package/src/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
  80. package/src/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
  81. package/src/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
  82. package/src/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
  83. package/src/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
  84. package/src/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
  85. package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
  86. package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
  87. package/src/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
  88. package/src/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
  89. package/src/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
  90. package/src/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
  91. package/src/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
  92. package/src/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
  93. package/src/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
  94. package/src/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
  95. package/src/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
  96. package/src/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
  97. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
  98. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
  99. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
  100. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
  101. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
  102. package/src/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
  103. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
  104. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
  105. package/src/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
  106. package/src/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
  107. package/src/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
  108. package/src/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
  109. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
  110. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
  111. package/src/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
  112. package/src/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
  113. package/src/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
  114. package/src/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
  115. package/src/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
  116. package/src/frameworks/react/project/base/package.json +1 -0
  117. package/src/frameworks/react/project/base/src/styles.css.ejs +203 -0
  118. package/src/frameworks/react/project/base/tsr.config.json +3 -0
  119. package/src/frameworks/react/project/packages.json +3 -0
  120. package/src/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
  121. package/src/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
  122. package/src/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
  123. package/src/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
  124. package/src/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
  125. package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
  126. package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
  127. package/src/frameworks/solid/project/base/package.json +1 -0
  128. package/src/frameworks/solid/project/base/src/styles.css.ejs +203 -0
  129. package/src/frameworks/solid/project/base/tsr.config.json +3 -0
  130. package/src/frameworks/solid/project/packages.json +3 -0
  131. package/tests/create-app.test.ts +39 -3
  132. package/tests/framework-template.test.ts +34 -0
@@ -19,15 +19,13 @@ export const Route = createFileRoute('/demo/sentry/testing')({
19
19
  Sentry.captureException(error)
20
20
  }, [error])
21
21
  return (
22
- <div className="min-h-screen flex items-center justify-center bg-[#181423]">
23
- <div className="text-center p-8">
22
+ <main className="demo-page demo-center">
23
+ <section className="demo-panel text-center">
24
24
  <SentryLogo />
25
- <h1 className="text-2xl font-bold text-white mt-4 mb-2">
26
- Something went wrong
27
- </h1>
28
- <p className="text-[#A49FB5]">{error.message}</p>
29
- </div>
30
- </div>
25
+ <h1 className="mt-4 mb-2 text-2xl font-bold">Something went wrong</h1>
26
+ <p className="demo-muted">{error.message}</p>
27
+ </section>
28
+ </main>
31
29
  )
32
30
  },
33
31
  })
@@ -101,48 +99,36 @@ function SentryButton({
101
99
  disabled?: boolean
102
100
  loading?: boolean
103
101
  }) {
104
- const baseColor = variant === 'error' ? '#E50045' : '#553DB8'
105
- const topColor = variant === 'error' ? '#FF1A5C' : '#7553FF'
106
-
107
102
  return (
108
103
  <button
109
104
  type="button"
110
105
  onClick={onClick}
111
106
  disabled={disabled || loading}
112
- className="group w-full rounded-lg text-white cursor-pointer border-none p-0 transition-all disabled:cursor-not-allowed disabled:opacity-60"
113
- style={{ backgroundColor: baseColor }}
107
+ className={`demo-button w-full px-6 py-4 text-base ${variant === 'error' ? 'demo-button-danger' : ''}`}
114
108
  >
115
- <span
116
- className="flex items-center justify-center gap-3 px-6 py-4 rounded-lg text-lg font-semibold transition-transform group-hover:-translate-y-1 group-active:translate-y-0 group-disabled:translate-y-0"
117
- style={{
118
- backgroundColor: topColor,
119
- border: `1px solid ${baseColor}`,
120
- }}
121
- >
122
- {loading && (
123
- <svg
124
- className="animate-spin h-5 w-5"
125
- xmlns="http://www.w3.org/2000/svg"
126
- fill="none"
127
- viewBox="0 0 24 24"
128
- >
129
- <circle
130
- className="opacity-25"
131
- cx="12"
132
- cy="12"
133
- r="10"
134
- stroke="currentColor"
135
- strokeWidth="4"
136
- />
137
- <path
138
- className="opacity-75"
139
- fill="currentColor"
140
- d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
141
- />
142
- </svg>
143
- )}
144
- {children}
145
- </span>
109
+ {loading && (
110
+ <svg
111
+ className="animate-spin h-5 w-5"
112
+ xmlns="http://www.w3.org/2000/svg"
113
+ fill="none"
114
+ viewBox="0 0 24 24"
115
+ >
116
+ <circle
117
+ className="opacity-25"
118
+ cx="12"
119
+ cy="12"
120
+ r="10"
121
+ stroke="currentColor"
122
+ strokeWidth="4"
123
+ />
124
+ <path
125
+ className="opacity-75"
126
+ fill="currentColor"
127
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
128
+ />
129
+ </svg>
130
+ )}
131
+ {children}
146
132
  </button>
147
133
  )
148
134
  }
@@ -158,14 +144,14 @@ function FeatureCard({
158
144
  description: string
159
145
  }) {
160
146
  return (
161
- <div className="bg-[#1C1825] rounded-xl p-4 border border-[#2D2640] hover:border-[#7553FF]/50 transition-all group">
147
+ <div className="demo-card transition-all group">
162
148
  <div className="flex items-center gap-3 mb-2">
163
- <div className="text-[#7553FF] group-hover:scale-110 transition-transform">
149
+ <div className="text-[var(--lagoon-deep)] group-hover:scale-110 transition-transform">
164
150
  {icon}
165
151
  </div>
166
- <h3 className="font-semibold text-white">{title}</h3>
152
+ <h3 className="font-semibold text-[var(--sea-ink)]">{title}</h3>
167
153
  </div>
168
- <p className="text-sm text-[#A49FB5] pl-9">{description}</p>
154
+ <p className="demo-muted pl-9 text-sm">{description}</p>
169
155
  </div>
170
156
  )
171
157
  }
@@ -192,9 +178,9 @@ function ResultBadge({
192
178
  return (
193
179
  <div className="mt-4 space-y-3">
194
180
  {type === 'error' && (
195
- <div className="flex items-center gap-2 bg-[#E50045]/10 border border-[#E50045]/30 rounded-lg px-4 py-3">
181
+ <div className="demo-alert demo-alert-danger flex items-center gap-2">
196
182
  <svg
197
- className="w-5 h-5 text-[#FF1A5C]"
183
+ className="w-5 h-5 text-[#9f3030]"
198
184
  fill="none"
199
185
  strokeLinecap="round"
200
186
  strokeLinejoin="round"
@@ -205,16 +191,16 @@ function ResultBadge({
205
191
  <title>Error captured</title>
206
192
  <path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
207
193
  </svg>
208
- <span className="text-[#FF1A5C] text-sm font-medium">
194
+ <span className="text-sm font-medium">
209
195
  Error captured and sent to Sentry
210
196
  </span>
211
197
  </div>
212
198
  )}
213
199
 
214
200
  {type === 'success' && (
215
- <div className="flex items-center gap-2 bg-[#00F261]/10 border border-[#00BF4D]/30 rounded-lg px-4 py-3">
201
+ <div className="demo-alert flex items-center gap-2">
216
202
  <svg
217
- className="w-5 h-5 text-[#00F261]"
203
+ className="w-5 h-5 text-[var(--palm)]"
218
204
  fill="none"
219
205
  strokeLinecap="round"
220
206
  strokeLinejoin="round"
@@ -225,7 +211,7 @@ function ResultBadge({
225
211
  <title>Trace complete</title>
226
212
  <path d="M5 13l4 4L19 7" />
227
213
  </svg>
228
- <span className="text-[#00F261] text-sm font-medium">
214
+ <span className="text-sm font-medium">
229
215
  Trace completed successfully
230
216
  </span>
231
217
  </div>
@@ -234,12 +220,12 @@ function ResultBadge({
234
220
  <button
235
221
  type="button"
236
222
  onClick={handleCopy}
237
- className="relative flex items-center gap-2 bg-[#7553FF]/10 hover:bg-[#7553FF]/20 border border-[#7553FF]/30 rounded-lg px-4 py-2 transition-all cursor-pointer w-full"
223
+ className="demo-list-item relative flex items-center gap-2 transition-all cursor-pointer w-full"
238
224
  >
239
- <span className="text-[#B3A1FF] text-sm">span.op:</span>
240
- <code className="text-[#7553FF] font-mono text-sm">{spanOp}</code>
225
+ <span className="demo-muted text-sm">span.op:</span>
226
+ <code className="font-mono text-sm">{spanOp}</code>
241
227
  <svg
242
- className="w-4 h-4 text-[#B3A1FF] ml-auto"
228
+ className="w-4 h-4 demo-muted ml-auto"
243
229
  fill="none"
244
230
  strokeLinecap="round"
245
231
  strokeLinejoin="round"
@@ -251,7 +237,7 @@ function ResultBadge({
251
237
  <path d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
252
238
  </svg>
253
239
  {copied && (
254
- <span className="absolute -top-8 left-1/2 -translate-x-1/2 bg-[#00F261] text-[#181423] text-xs font-medium px-2 py-1 rounded animate-pulse">
240
+ <span className="demo-pill absolute -top-8 left-1/2 -translate-x-1/2 animate-pulse">
255
241
  Copied!
256
242
  </span>
257
243
  )}
@@ -265,15 +251,15 @@ function ProgressBar({ loading }: { loading: boolean }) {
265
251
  return (
266
252
  <div className="mt-4 flex items-center gap-3">
267
253
  <div
268
- className={`w-3 h-3 rounded-full transition-all ${loading ? 'bg-[#7553FF] animate-pulse' : 'bg-[#00F261]'}`}
254
+ className={`w-3 h-3 rounded-full transition-all ${loading ? 'bg-[var(--lagoon)] animate-pulse' : 'bg-[var(--palm)]'}`}
269
255
  />
270
- <div className="flex-1 h-2 bg-[#2D2640] rounded-full overflow-hidden">
256
+ <div className="flex-1 h-2 bg-[var(--line)] rounded-full overflow-hidden">
271
257
  <div
272
- className="h-full bg-gradient-to-r from-[#7553FF] to-[#B3A1FF] rounded-full transition-all duration-500"
258
+ className="h-full bg-[var(--lagoon)] rounded-full transition-all duration-500"
273
259
  style={{ width: loading ? '60%' : '100%' }}
274
260
  />
275
261
  </div>
276
- <span className="text-xs text-[#A49FB5] w-16 text-right">
262
+ <span className="demo-muted text-xs w-16 text-right">
277
263
  {loading ? 'Running...' : 'Complete'}
278
264
  </span>
279
265
  </div>
@@ -378,39 +364,27 @@ function RouteComponent() {
378
364
  }
379
365
 
380
366
  return (
381
- <div
382
- className="min-h-screen text-white"
383
- style={{
384
- fontFamily:
385
- 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif',
386
- background:
387
- 'linear-gradient(180deg, #181423 0%, #1C1825 50%, #181423 100%)',
388
- }}
389
- >
390
- <div className="max-w-5xl mx-auto px-6 py-16">
391
- {/* Header */}
367
+ <main className="demo-page demo-page-wide">
368
+ <div className="mx-auto max-w-5xl">
392
369
  <div className="text-center mb-16">
393
370
  <div className="inline-flex items-center gap-4 mb-8">
394
- <div className="text-[#7553FF]">
371
+ <div className="text-[var(--lagoon-deep)]">
395
372
  <SentryLogo size={56} />
396
373
  </div>
397
374
  <div className="text-left">
398
- <h1 className="text-3xl font-bold text-white tracking-tight">
399
- Sentry Demo
400
- </h1>
401
- <p className="text-[#A49FB5] text-sm">
375
+ <h1 className="demo-title">Sentry Demo</h1>
376
+ <p className="demo-muted text-sm">
402
377
  Error monitoring & performance tracing
403
378
  </p>
404
379
  </div>
405
380
  </div>
406
- <p className="text-lg text-[#A49FB5] max-w-xl mx-auto leading-relaxed">
381
+ <p className="demo-muted mx-auto max-w-xl text-lg leading-relaxed">
407
382
  Click the buttons below to trigger errors and traces, then view them
408
383
  in your{' '}
409
384
  <a
410
385
  href="https://sentry.io"
411
386
  target="_blank"
412
387
  rel="noopener noreferrer"
413
- className="text-[#7553FF] hover:text-[#B3A1FF] underline transition-colors"
414
388
  >
415
389
  Sentry dashboard
416
390
  </a>
@@ -420,9 +394,9 @@ function RouteComponent() {
420
394
 
421
395
  {/* Sentry Not Initialized Warning */}
422
396
  {showWarning && (
423
- <div className="mb-8 flex items-center gap-3 bg-[#E5A000]/10 border border-[#E5A000]/30 rounded-xl px-6 py-4">
397
+ <div className="demo-alert mb-8 flex items-center gap-3">
424
398
  <svg
425
- className="w-6 h-6 text-[#E5A000] flex-shrink-0"
399
+ className="w-6 h-6 text-[var(--sea-ink-soft)] flex-shrink-0"
426
400
  fill="none"
427
401
  strokeLinecap="round"
428
402
  strokeLinejoin="round"
@@ -434,11 +408,10 @@ function RouteComponent() {
434
408
  <path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
435
409
  </svg>
436
410
  <div>
437
- <p className="text-[#E5A000] font-medium">
438
- Sentry is not initialized
439
- </p>
440
- <p className="text-[#A49FB5] text-sm mt-1">
441
- Set the <code className="bg-[#1C1825] px-1.5 py-0.5 rounded text-[#B3A1FF]">VITE_SENTRY_DSN</code> environment variable to enable error tracking and performance monitoring.
411
+ <p className="font-medium">Sentry is not initialized</p>
412
+ <p className="demo-muted text-sm mt-1">
413
+ Set the <code>VITE_SENTRY_DSN</code> environment variable to
414
+ enable error tracking and performance monitoring.
442
415
  </p>
443
416
  </div>
444
417
  </div>
@@ -487,10 +460,10 @@ function RouteComponent() {
487
460
  {/* Testing Panels */}
488
461
  <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
489
462
  {/* Client-Side Panel */}
490
- <div className="bg-[#1C1825] rounded-2xl p-8 border border-[#2D2640]">
463
+ <div className="demo-panel">
491
464
  <div className="flex items-center gap-3 mb-6">
492
- <div className="w-3 h-3 rounded-full bg-[#00F261]" />
493
- <h2 className="text-xl font-semibold">Client-Side Testing</h2>
465
+ <div className="w-3 h-3 rounded-full bg-[var(--palm)]" />
466
+ <h2 className="demo-section-title">Client-Side Testing</h2>
494
467
  </div>
495
468
 
496
469
  <div className="space-y-4">
@@ -539,10 +512,10 @@ function RouteComponent() {
539
512
  </div>
540
513
 
541
514
  {/* Server-Side Panel */}
542
- <div className="bg-[#1C1825] rounded-2xl p-8 border border-[#2D2640]">
515
+ <div className="demo-panel">
543
516
  <div className="flex items-center gap-3 mb-6">
544
- <div className="w-3 h-3 rounded-full bg-[#7553FF]" />
545
- <h2 className="text-xl font-semibold">Server-Side Testing</h2>
517
+ <div className="w-3 h-3 rounded-full bg-[var(--lagoon)]" />
518
+ <h2 className="demo-section-title">Server-Side Testing</h2>
546
519
  </div>
547
520
 
548
521
  <div className="space-y-4">
@@ -593,24 +566,20 @@ function RouteComponent() {
593
566
 
594
567
  {/* Footer Note */}
595
568
  <div className="mt-12 text-center">
596
- <p className="text-sm text-[#6E6C75]">
597
- This page uses{' '}
598
- <code className="bg-[#1C1825] px-2 py-1 rounded text-[#B3A1FF]">
599
- @sentry/tanstackstart-react
600
- </code>{' '}
601
- for full-stack error monitoring.
569
+ <p className="demo-muted text-sm">
570
+ This page uses <code>@sentry/tanstackstart-react</code> for
571
+ full-stack error monitoring.
602
572
  <br />
603
573
  <a
604
574
  href="https://docs.sentry.io/platforms/javascript/guides/tanstackstart-react/"
605
575
  target="_blank"
606
576
  rel="noopener noreferrer"
607
- className="text-[#7553FF] hover:text-[#B3A1FF] underline transition-colors"
608
577
  >
609
578
  Read the documentation →
610
579
  </a>
611
580
  </p>
612
581
  </div>
613
582
  </div>
614
- </div>
583
+ </main>
615
584
  )
616
585
  }
@@ -42,15 +42,15 @@ function DevtoolPanel() {
42
42
 
43
43
  return (
44
44
  <div className="p-4 grid gap-4 grid-cols-[1fr_10fr]">
45
- <div className="text-sm font-bold text-gray-500 whitespace-nowrap">
45
+ <div className="demo-muted whitespace-nowrap text-sm font-bold">
46
46
  First Name
47
47
  </div>
48
48
  <div className="text-sm">{state?.firstName}</div>
49
- <div className="text-sm font-bold text-gray-500 whitespace-nowrap">
49
+ <div className="demo-muted whitespace-nowrap text-sm font-bold">
50
50
  Last Name
51
51
  </div>
52
52
  <div className="text-sm">{state?.lastName}</div>
53
- <div className="text-sm font-bold text-gray-500 whitespace-nowrap">
53
+ <div className="demo-muted whitespace-nowrap text-sm font-bold">
54
54
  Full Name
55
55
  </div>
56
56
  <div className="text-sm">{state?.fullName}</div>
@@ -19,7 +19,7 @@ function FirstName() {
19
19
  onChange={(e) =>
20
20
  store.setState((state) => ({ ...state, firstName: e.target.value }))
21
21
  }
22
- className="bg-white/10 rounded-lg px-4 py-2 outline-none border border-white/20 hover:border-white/40 focus:border-white/60 transition-colors duration-200 placeholder-white/40"
22
+ className="demo-input"
23
23
  />
24
24
  )
25
25
  }
@@ -33,7 +33,7 @@ function LastName() {
33
33
  onChange={(e) =>
34
34
  store.setState((state) => ({ ...state, lastName: e.target.value }))
35
35
  }
36
- className="bg-white/10 rounded-lg px-4 py-2 outline-none border border-white/20 hover:border-white/40 focus:border-white/60 transition-colors duration-200 placeholder-white/40"
36
+ className="demo-input"
37
37
  />
38
38
  )
39
39
  }
@@ -41,7 +41,7 @@ function LastName() {
41
41
  function FullName() {
42
42
  const fName = useStore(fullName, (state) => state)
43
43
  return (
44
- <div className="bg-white/10 rounded-lg px-4 py-2 outline-none ">
44
+ <div className="demo-list-item font-medium">
45
45
  {fName}
46
46
  </div>
47
47
  )
@@ -49,20 +49,15 @@ function FullName() {
49
49
 
50
50
  function DemoStore() {
51
51
  return (
52
- <div
53
- className="min-h-[calc(100vh-32px)] text-white p-8 flex items-center justify-center w-full h-full"
54
- style={{
55
- backgroundImage:
56
- 'radial-gradient(50% 50% at 80% 80%, #f4a460 0%, #8b4513 70%, #1a0f0a 100%)',
57
- }}
58
- >
59
- <div className="bg-white/10 backdrop-blur-lg rounded-xl p-8 shadow-lg flex flex-col gap-4 text-3xl min-w-1/2">
60
- <h1 className="text-4xl font-bold mb-5">Store Example</h1>
52
+ <main className="demo-page demo-center">
53
+ <section className="demo-panel flex w-full max-w-xl flex-col gap-4">
54
+ <p className="island-kicker">TanStack Store</p>
55
+ <h1 className="demo-title mb-2">Store Example</h1>
61
56
  <FirstName />
62
57
  <LastName />
63
58
  <FullName />
64
- </div>
65
- </div>
59
+ </section>
60
+ </main>
66
61
  )
67
62
  }
68
63
 
@@ -1,41 +1,38 @@
1
- import React from "react";
1
+ import React from 'react'
2
2
 
3
3
  export interface ButtonProps {
4
- variant?: "primary" | "secondary" | "danger";
5
- size?: "small" | "medium" | "large";
6
- children: React.ReactNode;
7
- onClick?: () => void;
8
- disabled?: boolean;
9
- type?: "button" | "submit" | "reset";
10
- className?: string;
4
+ variant?: 'primary' | 'secondary' | 'danger'
5
+ size?: 'small' | 'medium' | 'large'
6
+ children: React.ReactNode
7
+ onClick?: () => void
8
+ disabled?: boolean
9
+ type?: 'button' | 'submit' | 'reset'
10
+ className?: string
11
11
  }
12
12
 
13
13
  export const Button: React.FC<ButtonProps> = ({
14
- variant = "primary",
15
- size = "medium",
14
+ variant = 'primary',
15
+ size = 'medium',
16
16
  children,
17
17
  onClick,
18
18
  disabled = false,
19
- type = "button",
20
- className = "",
19
+ type = 'button',
20
+ className = '',
21
21
  }) => {
22
22
  const baseStyles =
23
- "font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed";
23
+ 'demo-button disabled:opacity-50 disabled:cursor-not-allowed'
24
24
 
25
25
  const variantStyles = {
26
- primary:
27
- "bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500 dark:bg-blue-500 dark:hover:bg-blue-600",
28
- secondary:
29
- "bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-500 dark:bg-gray-700 dark:text-gray-100 dark:hover:bg-gray-600",
30
- danger:
31
- "bg-red-600 text-white hover:bg-red-700 focus:ring-red-500 dark:bg-red-500 dark:hover:bg-red-600",
32
- };
26
+ primary: '',
27
+ secondary: 'demo-button-secondary',
28
+ danger: 'demo-button-danger',
29
+ }
33
30
 
34
31
  const sizeStyles = {
35
- small: "px-3 py-1.5 text-sm",
36
- medium: "px-4 py-2 text-base",
37
- large: "px-6 py-3 text-lg",
38
- };
32
+ small: 'px-3 py-1.5 text-sm',
33
+ medium: 'px-4 py-2 text-base',
34
+ large: 'px-6 py-3 text-lg',
35
+ }
39
36
 
40
37
  return (
41
38
  <button
@@ -46,5 +43,5 @@ export const Button: React.FC<ButtonProps> = ({
46
43
  >
47
44
  {children}
48
45
  </button>
49
- );
50
- };
46
+ )
47
+ }
@@ -1,33 +1,29 @@
1
- import React from "react";
1
+ import React from 'react'
2
2
 
3
3
  export interface DialogProps {
4
- title: string;
5
- children: React.ReactNode;
6
- footer?: React.ReactNode;
7
- className?: string;
4
+ title: string
5
+ children: React.ReactNode
6
+ footer?: React.ReactNode
7
+ className?: string
8
8
  }
9
9
 
10
10
  export const Dialog: React.FC<DialogProps> = ({
11
11
  title,
12
12
  children,
13
13
  footer,
14
- className = "",
14
+ className = '',
15
15
  }) => {
16
16
  return (
17
- <div
18
- className={`bg-white dark:bg-gray-800 rounded-xl shadow-2xl border border-gray-200 dark:border-gray-700 overflow-hidden ${className}`}
19
- >
20
- <div className="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
21
- <h2 className="text-xl font-semibold text-gray-900 dark:text-gray-100">
22
- {title}
23
- </h2>
17
+ <div className={`demo-panel overflow-hidden p-0 ${className}`}>
18
+ <div className="border-b border-[var(--line)] px-6 py-4">
19
+ <h2 className="demo-section-title">{title}</h2>
24
20
  </div>
25
21
  <div className="px-6 py-6">{children}</div>
26
22
  {footer && (
27
- <div className="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700">
23
+ <div className="border-t border-[var(--line)] bg-[var(--chip-bg)] px-6 py-4">
28
24
  {footer}
29
25
  </div>
30
26
  )}
31
27
  </div>
32
- );
33
- };
28
+ )
29
+ }
@@ -1,30 +1,27 @@
1
- import React from "react";
1
+ import React from 'react'
2
2
 
3
3
  export interface InputProps {
4
- label: string;
5
- id: string;
6
- value?: string;
7
- onChange?: (value: string) => void;
8
- placeholder?: string;
9
- required?: boolean;
10
- className?: string;
4
+ label: string
5
+ id: string
6
+ value?: string
7
+ onChange?: (value: string) => void
8
+ placeholder?: string
9
+ required?: boolean
10
+ className?: string
11
11
  }
12
12
 
13
13
  export const Input: React.FC<InputProps> = ({
14
14
  label,
15
15
  id,
16
- value = "",
16
+ value = '',
17
17
  onChange,
18
18
  placeholder,
19
19
  required = false,
20
- className = "",
20
+ className = '',
21
21
  }) => {
22
22
  return (
23
23
  <div className={`flex flex-col gap-2 ${className}`}>
24
- <label
25
- htmlFor={id}
26
- className="text-sm font-medium text-gray-700 dark:text-gray-200"
27
- >
24
+ <label htmlFor={id} className="text-sm font-medium text-[var(--sea-ink)]">
28
25
  {label}
29
26
  {required && <span className="text-red-500 ml-1">*</span>}
30
27
  </label>
@@ -35,8 +32,8 @@ export const Input: React.FC<InputProps> = ({
35
32
  onChange={(e) => onChange?.(e.target.value)}
36
33
  placeholder={placeholder}
37
34
  required={required}
38
- className="px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 transition-colors"
35
+ className="demo-input"
39
36
  />
40
37
  </div>
41
- );
42
- };
38
+ )
39
+ }
@@ -1,17 +1,17 @@
1
- import React from "react";
1
+ import React from 'react'
2
2
 
3
3
  export interface RadioOption {
4
- value: string;
5
- label: string;
4
+ value: string
5
+ label: string
6
6
  }
7
7
 
8
8
  export interface RadioGroupProps {
9
- label: string;
10
- name: string;
11
- options: RadioOption[];
12
- value?: string;
13
- onChange?: (value: string) => void;
14
- className?: string;
9
+ label: string
10
+ name: string
11
+ options: RadioOption[]
12
+ value?: string
13
+ onChange?: (value: string) => void
14
+ className?: string
15
15
  }
16
16
 
17
17
  export const RadioGroup: React.FC<RadioGroupProps> = ({
@@ -20,11 +20,11 @@ export const RadioGroup: React.FC<RadioGroupProps> = ({
20
20
  options,
21
21
  value,
22
22
  onChange,
23
- className = "",
23
+ className = '',
24
24
  }) => {
25
25
  return (
26
26
  <div className={`flex flex-col gap-3 ${className}`}>
27
- <label className="text-sm font-medium text-gray-700 dark:text-gray-200">
27
+ <label className="text-sm font-medium text-[var(--sea-ink)]">
28
28
  {label}
29
29
  </label>
30
30
  <div className="flex gap-4">
@@ -39,14 +39,14 @@ export const RadioGroup: React.FC<RadioGroupProps> = ({
39
39
  value={option.value}
40
40
  checked={value === option.value}
41
41
  onChange={(e) => onChange?.(e.target.value)}
42
- className="w-4 h-4 text-blue-600 border-gray-300 dark:border-gray-600 focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 cursor-pointer"
42
+ className="h-4 w-4 cursor-pointer accent-[var(--lagoon-deep)]"
43
43
  />
44
- <span className="text-sm text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-gray-100 transition-colors">
44
+ <span className="demo-muted text-sm transition-colors group-hover:text-[var(--sea-ink)]">
45
45
  {option.label}
46
46
  </span>
47
47
  </label>
48
48
  ))}
49
49
  </div>
50
50
  </div>
51
- );
52
- };
51
+ )
52
+ }