@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
@@ -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
  }