@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
@@ -14,18 +14,14 @@ function RouteComponent() {
14
14
  const strapiArticles = Route.useLoaderData()
15
15
 
16
16
  return (
17
- <div class="min-h-screen bg-gradient-to-b from-slate-900 via-slate-800 to-slate-900 p-8">
18
- <div class="max-w-7xl mx-auto">
19
- <h1 class="text-4xl font-bold mb-8 text-white">
20
- <span class="bg-gradient-to-r from-cyan-400 to-blue-400 bg-clip-text text-transparent">
21
- Strapi
22
- </span>{' '}
23
- <span class="text-gray-300">Articles</span>
24
- </h1>
17
+ <main class="demo-page demo-page-wide">
18
+ <div>
19
+ <p class="island-kicker mb-2">CMS</p>
20
+ <h1 class="demo-title mb-8">Strapi Articles</h1>
25
21
 
26
22
  <Show
27
23
  when={strapiArticles() && strapiArticles().length > 0}
28
- fallback={<p class="text-gray-400">No articles found.</p>}
24
+ fallback={<p class="demo-muted">No articles found.</p>}
29
25
  >
30
26
  <div class="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
31
27
  <For each={strapiArticles()}>
@@ -35,25 +31,25 @@ function RouteComponent() {
35
31
  params={{ articleId: article.documentId }}
36
32
  class="block"
37
33
  >
38
- <article class="bg-slate-800/50 backdrop-blur-sm border border-slate-700 rounded-xl p-6 hover:border-cyan-500/50 transition-all duration-300 hover:shadow-lg hover:shadow-cyan-500/10 cursor-pointer h-full">
39
- <h2 class="text-xl font-semibold text-white mb-3">
34
+ <article class="demo-card h-full cursor-pointer transition hover:-translate-y-0.5">
35
+ <h2 class="mb-3 text-xl font-semibold">
40
36
  {article.title || 'Untitled'}
41
37
  </h2>
42
38
 
43
39
  {article.description && (
44
- <p class="text-gray-400 mb-4 leading-relaxed">
40
+ <p class="demo-muted mb-4 leading-relaxed">
45
41
  {article.description}
46
42
  </p>
47
43
  )}
48
44
 
49
45
  {article.content && (
50
- <p class="text-gray-400 line-clamp-3 leading-relaxed">
46
+ <p class="demo-muted line-clamp-3 leading-relaxed">
51
47
  {article.content}
52
48
  </p>
53
49
  )}
54
50
 
55
51
  {article.createdAt && (
56
- <p class="text-sm text-cyan-400/70 mt-4">
52
+ <p class="demo-muted mt-4 text-sm">
57
53
  {new Date(article.createdAt).toLocaleDateString()}
58
54
  </p>
59
55
  )}
@@ -64,6 +60,6 @@ function RouteComponent() {
64
60
  </div>
65
61
  </Show>
66
62
  </div>
67
- </div>
63
+ </main>
68
64
  )
69
65
  }
@@ -13,12 +13,9 @@ function RouteComponent() {
13
13
  const article = Route.useLoaderData()
14
14
 
15
15
  return (
16
- <div class="min-h-screen bg-gradient-to-b from-slate-900 via-slate-800 to-slate-900 p-8">
17
- <div class="max-w-4xl mx-auto">
18
- <Link
19
- to="/demo/strapi"
20
- class="inline-flex items-center text-cyan-400 hover:text-cyan-300 mb-6 transition-colors"
21
- >
16
+ <main class="demo-page">
17
+ <div class="mx-auto max-w-4xl">
18
+ <Link to="/demo/strapi" class="mb-6 inline-flex items-center">
22
19
  <svg
23
20
  xmlns="http://www.w3.org/2000/svg"
24
21
  class="h-5 w-5 mr-2"
@@ -34,13 +31,11 @@ function RouteComponent() {
34
31
  Back to Articles
35
32
  </Link>
36
33
 
37
- <article class="bg-slate-800/50 backdrop-blur-sm border border-slate-700 rounded-xl p-8">
38
- <h1 class="text-4xl font-bold text-white mb-4">
39
- {article()?.title || 'Untitled'}
40
- </h1>
34
+ <article class="demo-panel">
35
+ <h1 class="demo-title mb-4">{article()?.title || 'Untitled'}</h1>
41
36
 
42
37
  {article()?.createdAt && (
43
- <p class="text-sm text-cyan-400/70 mb-6">
38
+ <p class="demo-muted mb-6 text-sm">
44
39
  Published on{' '}
45
40
  {new Date(
46
41
  article()?.createdAt || article()?.attributes?.createdAt,
@@ -54,10 +49,8 @@ function RouteComponent() {
54
49
 
55
50
  {article()?.description && (
56
51
  <div class="mb-6">
57
- <h2 class="text-xl font-semibold text-gray-300 mb-3">
58
- Description
59
- </h2>
60
- <p class="text-gray-400 leading-relaxed">
52
+ <h2 class="demo-section-title mb-3">Description</h2>
53
+ <p class="demo-muted leading-relaxed">
61
54
  {article()?.description || article()?.attributes?.description}
62
55
  </p>
63
56
  </div>
@@ -65,14 +58,14 @@ function RouteComponent() {
65
58
 
66
59
  {article()?.content && (
67
60
  <div>
68
- <h2 class="text-xl font-semibold text-gray-300 mb-3">Content</h2>
69
- <div class="text-gray-400 leading-relaxed whitespace-pre-wrap">
61
+ <h2 class="demo-section-title mb-3">Content</h2>
62
+ <div class="demo-muted whitespace-pre-wrap leading-relaxed">
70
63
  {article()?.content}
71
64
  </div>
72
65
  </div>
73
66
  )}
74
67
  </article>
75
68
  </div>
76
- </div>
69
+ </main>
77
70
  )
78
71
  }
@@ -4,6 +4,7 @@
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite dev --port 3000",
7
+ "generate-routes": "tsr generate",
7
8
  "build": "vite build",
8
9
  "start": "node .output/server/index.mjs",
9
10
  "preview": "vite preview",
@@ -120,6 +120,209 @@ code {
120
120
  0 4px 14px rgba(23, 58, 64, 0.06);
121
121
  }
122
122
 
123
+ .demo-page {
124
+ width: min(1080px, calc(100% - 2rem));
125
+ margin-inline: auto;
126
+ padding-block: clamp(2.25rem, 6vw, 4.5rem);
127
+ color: var(--sea-ink);
128
+ }
129
+
130
+ .demo-page-wide {
131
+ width: min(1280px, calc(100% - 2rem));
132
+ }
133
+
134
+ .demo-center {
135
+ min-height: calc(100vh - 13rem);
136
+ display: flex;
137
+ align-items: center;
138
+ justify-content: center;
139
+ }
140
+
141
+ .demo-panel,
142
+ .demo-card {
143
+ border: 1px solid var(--line);
144
+ background: linear-gradient(165deg, var(--surface-strong), var(--surface));
145
+ box-shadow:
146
+ 0 1px 0 var(--inset-glint) inset,
147
+ 0 18px 34px rgba(30, 90, 72, 0.1),
148
+ 0 4px 14px rgba(23, 58, 64, 0.06);
149
+ backdrop-filter: blur(4px);
150
+ }
151
+
152
+ .demo-panel {
153
+ border-radius: 1.25rem;
154
+ padding: clamp(1.25rem, 4vw, 2rem);
155
+ }
156
+
157
+ .demo-card {
158
+ border-radius: 1rem;
159
+ padding: 1rem;
160
+ }
161
+
162
+ .demo-title {
163
+ margin: 0;
164
+ color: var(--sea-ink);
165
+ font-size: clamp(1.75rem, 4vw, 2.75rem);
166
+ line-height: 1.05;
167
+ font-weight: 800;
168
+ letter-spacing: 0;
169
+ }
170
+
171
+ .demo-section-title {
172
+ margin: 0;
173
+ color: var(--sea-ink);
174
+ font-size: 1rem;
175
+ font-weight: 700;
176
+ }
177
+
178
+ .demo-muted {
179
+ color: var(--sea-ink-soft);
180
+ }
181
+
182
+ .demo-input,
183
+ .demo-select,
184
+ .demo-textarea {
185
+ width: 100%;
186
+ border: 1px solid var(--line);
187
+ border-radius: 0.75rem;
188
+ background: color-mix(in oklab, var(--surface-strong) 88%, white 12%);
189
+ color: var(--sea-ink);
190
+ outline: none;
191
+ transition: border-color 180ms ease, box-shadow 180ms ease, background-color 180ms ease;
192
+ }
193
+
194
+ .demo-input,
195
+ .demo-select {
196
+ padding: 0.7rem 0.9rem;
197
+ }
198
+
199
+ .demo-input-fit {
200
+ width: auto;
201
+ }
202
+
203
+ .demo-textarea {
204
+ min-height: 7rem;
205
+ padding: 0.8rem 0.9rem;
206
+ resize: vertical;
207
+ }
208
+
209
+ .demo-input:focus,
210
+ .demo-select:focus,
211
+ .demo-textarea:focus {
212
+ border-color: color-mix(in oklab, var(--lagoon-deep) 58%, var(--line));
213
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--lagoon) 24%, transparent);
214
+ }
215
+
216
+ .demo-button {
217
+ display: inline-flex;
218
+ align-items: center;
219
+ justify-content: center;
220
+ gap: 0.5rem;
221
+ border: 1px solid color-mix(in oklab, var(--lagoon-deep) 34%, var(--line));
222
+ border-radius: 0.85rem;
223
+ background: color-mix(in oklab, var(--lagoon) 22%, var(--surface-strong));
224
+ color: var(--sea-ink);
225
+ padding: 0.72rem 1rem;
226
+ font-size: 0.9rem;
227
+ font-weight: 700;
228
+ line-height: 1;
229
+ cursor: pointer;
230
+ }
231
+
232
+ .demo-button:hover {
233
+ transform: translateY(-1px);
234
+ background: color-mix(in oklab, var(--lagoon) 30%, var(--surface-strong));
235
+ }
236
+
237
+ .demo-button:disabled {
238
+ cursor: not-allowed;
239
+ opacity: 0.55;
240
+ transform: none;
241
+ }
242
+
243
+ .demo-button-secondary {
244
+ border-color: var(--line);
245
+ background: color-mix(in oklab, var(--surface-strong) 74%, transparent);
246
+ color: var(--sea-ink-soft);
247
+ }
248
+
249
+ .demo-button-danger {
250
+ border-color: rgba(196, 71, 71, 0.28);
251
+ background: rgba(196, 71, 71, 0.1);
252
+ color: #9f3030;
253
+ }
254
+
255
+ .demo-list-item {
256
+ border: 1px solid var(--line);
257
+ border-radius: 0.9rem;
258
+ background: color-mix(in oklab, var(--chip-bg) 82%, transparent);
259
+ padding: 0.9rem 1rem;
260
+ }
261
+
262
+ .demo-pill {
263
+ display: inline-flex;
264
+ align-items: center;
265
+ gap: 0.35rem;
266
+ border: 1px solid var(--chip-line);
267
+ border-radius: 999px;
268
+ background: var(--chip-bg);
269
+ color: var(--sea-ink-soft);
270
+ padding: 0.35rem 0.65rem;
271
+ font-size: 0.75rem;
272
+ font-weight: 700;
273
+ }
274
+
275
+ .demo-alert {
276
+ border: 1px solid rgba(193, 126, 42, 0.3);
277
+ border-radius: 1rem;
278
+ background: rgba(193, 126, 42, 0.1);
279
+ color: var(--sea-ink);
280
+ padding: 1rem;
281
+ }
282
+
283
+ .demo-alert-danger {
284
+ border-color: rgba(196, 71, 71, 0.3);
285
+ background: rgba(196, 71, 71, 0.1);
286
+ }
287
+
288
+ .demo-code-block {
289
+ border: 1px solid var(--line);
290
+ border-radius: 1rem;
291
+ background: color-mix(in oklab, var(--chip-bg) 88%, transparent);
292
+ color: var(--sea-ink);
293
+ padding: 1rem;
294
+ }
295
+
296
+ .demo-table-shell {
297
+ overflow-x: auto;
298
+ border: 1px solid var(--line);
299
+ border-radius: 1rem;
300
+ background: color-mix(in oklab, var(--surface-strong) 78%, transparent);
301
+ }
302
+
303
+ .demo-table {
304
+ width: 100%;
305
+ border-collapse: collapse;
306
+ color: var(--sea-ink);
307
+ }
308
+
309
+ .demo-table th,
310
+ .demo-table td {
311
+ border-bottom: 1px solid var(--line);
312
+ padding: 0.75rem 1rem;
313
+ text-align: left;
314
+ }
315
+
316
+ .demo-table th {
317
+ background: color-mix(in oklab, var(--chip-bg) 88%, transparent);
318
+ color: var(--sea-ink);
319
+ font-weight: 700;
320
+ }
321
+
322
+ .demo-table tr:hover td {
323
+ background: color-mix(in oklab, var(--lagoon) 8%, transparent);
324
+ }
325
+
123
326
  .site-header {
124
327
  position: sticky;
125
328
  top: 0;
@@ -0,0 +1,3 @@
1
+ {
2
+ "target": "solid"
3
+ }
@@ -11,6 +11,9 @@
11
11
  }
12
12
  },
13
13
  "file-router": {
14
+ "devDependencies": {
15
+ "@tanstack/router-cli": "^1.133.21"
16
+ },
14
17
  "dependencies": {
15
18
  "@tanstack/router-plugin": "^1.133.21"
16
19
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/create",
3
- "version": "0.68.0",
3
+ "version": "0.68.2",
4
4
  "description": "TanStack Application Builder Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/create-app.ts CHANGED
@@ -31,7 +31,7 @@ function stripExamplesFromOptions(options: Options): Options {
31
31
  !isDemoFilePath(route.path) &&
32
32
  !(route.url && route.url.startsWith('/demo')),
33
33
  )
34
-
34
+
35
35
  const filteredIntegrations = (addOn.integrations || []).filter(
36
36
  (integration) => !isDemoFilePath(integration.path)
37
37
  )
@@ -277,6 +277,37 @@ async function runCommandsAndInstallDependencies(
277
277
  await installShadcnComponents(environment, options.targetDir, options)
278
278
 
279
279
  await setupIntent(environment, options.targetDir, options)
280
+
281
+ if (shouldGenerateRoutes(options)) {
282
+ s.start(`Generating route tree...`)
283
+ const command = getPackageManagerScriptCommand(options.packageManager, [
284
+ 'generate-routes',
285
+ ])
286
+ const cmd = formatCommand(command)
287
+ environment.startStep({
288
+ id: 'generate-routes',
289
+ type: 'command',
290
+ message: cmd,
291
+ })
292
+ await environment.execute(
293
+ command.command,
294
+ command.args,
295
+ options.targetDir,
296
+ {
297
+ inherit: true,
298
+ },
299
+ )
300
+ environment.finishStep('generate-routes', 'Route tree generated')
301
+ s.stop(`Route tree generated`)
302
+ }
303
+ }
304
+
305
+ function shouldGenerateRoutes(options: Options) {
306
+ return (
307
+ options.install !== false &&
308
+ options.mode === 'file-router' &&
309
+ (options.framework.id === 'react' || options.framework.id === 'solid')
310
+ )
280
311
  }
281
312
 
282
313
  async function seedEnvValues(environment: Environment, options: Options) {
@@ -24,7 +24,7 @@ function Messages({ messages }: { messages: ChatMessages }) {
24
24
 
25
25
  if (!messages.length) {
26
26
  return (
27
- <div className="flex-1 flex items-center justify-center text-gray-400 text-sm">
27
+ <div className="demo-muted flex flex-1 items-center justify-center text-sm">
28
28
  Ask me anything! I'm here to help.
29
29
  </div>
30
30
  )
@@ -36,9 +36,7 @@ function Messages({ messages }: { messages: ChatMessages }) {
36
36
  <div
37
37
  key={id}
38
38
  className={`py-3 ${
39
- role === 'assistant'
40
- ? 'bg-linear-to-r from-orange-500/5 to-red-600/5'
41
- : 'bg-transparent'
39
+ role === 'assistant' ? 'bg-[var(--chip-bg)]' : 'bg-transparent'
42
40
  }`}
43
41
  >
44
42
  {parts.map((part, index) => {
@@ -46,15 +44,15 @@ function Messages({ messages }: { messages: ChatMessages }) {
46
44
  return (
47
45
  <div key={index} className="flex items-start gap-2 px-4">
48
46
  {role === 'assistant' ? (
49
- <div className="w-6 h-6 rounded-lg bg-linear-to-r from-orange-500 to-red-600 flex items-center justify-center text-xs font-medium text-white flex-shrink-0">
47
+ <div className="flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-lg bg-[var(--lagoon-deep)] text-xs font-medium text-white">
50
48
  AI
51
49
  </div>
52
50
  ) : (
53
- <div className="w-6 h-6 rounded-lg bg-gray-700 flex items-center justify-center text-xs font-medium text-white flex-shrink-0">
51
+ <div className="flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-lg bg-[var(--sea-ink-soft)] text-xs font-medium text-white">
54
52
  Y
55
53
  </div>
56
54
  )}
57
- <div className="flex-1 min-w-0 text-white prose dark:prose-invert max-w-none prose-sm">
55
+ <div className="min-w-0 flex-1 max-w-none text-sm text-[var(--sea-ink)]">
58
56
  <Streamdown>{part.content}</Streamdown>
59
57
  </div>
60
58
  </div>
@@ -87,7 +85,7 @@ export default function AIAssistant() {
87
85
  <div className="relative z-50">
88
86
  <button
89
87
  onClick={() => showAIAssistant.setState((state) => !state)}
90
- className="w-full flex items-center justify-between px-4 py-2.5 rounded-lg bg-linear-to-r from-green-700 to-green-900 text-white hover:opacity-90 transition-opacity"
88
+ className="demo-button w-full justify-between px-4 py-2.5"
91
89
  >
92
90
  <div className="flex items-center gap-2">
93
91
  <BotIcon size={24} />
@@ -97,12 +95,14 @@ export default function AIAssistant() {
97
95
  </button>
98
96
 
99
97
  {isOpen && (
100
- <div className="absolute bottom-0 left-full ml-2 w-[700px] h-[600px] bg-gray-900 rounded-lg shadow-xl border border-orange-500/20 flex flex-col">
101
- <div className="flex items-center justify-between p-3 border-b border-orange-500/20">
102
- <h3 className="font-semibold text-white">AI Assistant</h3>
98
+ <div className="demo-panel fixed inset-x-4 top-20 z-[100] flex h-[calc(100vh-6rem)] max-h-[600px] flex-col overflow-hidden p-0 sm:left-auto sm:w-[min(calc(100vw-2rem),700px)]">
99
+ <div className="flex items-center justify-between border-b border-[var(--line)] p-3">
100
+ <h3 className="font-semibold text-[var(--sea-ink)]">
101
+ AI Assistant
102
+ </h3>
103
103
  <button
104
104
  onClick={() => showAIAssistant.setState((state) => !state)}
105
- className="text-gray-400 hover:text-white transition-colors"
105
+ className="demo-muted transition-colors hover:text-[var(--sea-ink)]"
106
106
  >
107
107
  <X className="w-4 h-4" />
108
108
  </button>
@@ -110,7 +110,7 @@ export default function AIAssistant() {
110
110
 
111
111
  <Messages messages={messages} />
112
112
 
113
- <div className="p-3 border-t border-orange-500/20">
113
+ <div className="border-t border-[var(--line)] p-3">
114
114
  <form
115
115
  onSubmit={(e) => {
116
116
  e.preventDefault()
@@ -125,7 +125,7 @@ export default function AIAssistant() {
125
125
  value={input}
126
126
  onChange={(e) => setInput(e.target.value)}
127
127
  placeholder="Type your message..."
128
- className="w-full rounded-lg border border-orange-500/20 bg-gray-800/50 pl-3 pr-10 py-2 text-sm text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-500/50 focus:border-transparent resize-none overflow-hidden"
128
+ className="demo-textarea pr-10 text-sm"
129
129
  rows={1}
130
130
  style={{ minHeight: '36px', maxHeight: '120px' }}
131
131
  onInput={(e) => {
@@ -145,7 +145,7 @@ export default function AIAssistant() {
145
145
  <button
146
146
  type="submit"
147
147
  disabled={!input.trim()}
148
- className="absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-orange-500 hover:text-orange-400 disabled:text-gray-500 transition-colors focus:outline-none"
148
+ className="absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-[var(--lagoon-deep)] transition-colors hover:text-[var(--sea-ink)] disabled:text-[var(--sea-ink-soft)]"
149
149
  >
150
150
  <Send className="w-4 h-4" />
151
151
  </button>
@@ -11,7 +11,7 @@ export default function GuitarRecommendation({ id }: { id: string }) {
11
11
  return null
12
12
  }
13
13
  return (
14
- <div className="my-4 rounded-lg overflow-hidden border border-orange-500/20 bg-gray-800/50">
14
+ <div className="demo-card my-4 overflow-hidden p-0">
15
15
  <div className="aspect-[4/3] relative overflow-hidden">
16
16
  <img
17
17
  src={guitar.image}
@@ -20,23 +20,25 @@ export default function GuitarRecommendation({ id }: { id: string }) {
20
20
  />
21
21
  </div>
22
22
  <div className="p-4">
23
- <h3 className="text-lg font-semibold text-white mb-2">{guitar.name}</h3>
24
- <p className="text-sm text-gray-300 mb-3 line-clamp-2">
23
+ <h3 className="mb-2 text-lg font-semibold text-[var(--sea-ink)]">
24
+ {guitar.name}
25
+ </h3>
26
+ <p className="demo-muted mb-3 line-clamp-2 text-sm">
25
27
  {guitar.shortDescription}
26
28
  </p>
27
29
  <div className="flex items-center justify-between">
28
- <div className="text-lg font-bold text-emerald-400">
30
+ <div className="text-lg font-bold text-[var(--lagoon-deep)]">
29
31
  ${guitar.price}
30
32
  </div>
31
33
  <button
32
34
  onClick={() => {
33
35
  navigate({
34
- to: '/example/guitars/$guitarId',
36
+ to: '/demo/guitars/$guitarId',
35
37
  params: { guitarId: guitar.id.toString() },
36
38
  })
37
39
  showAIAssistant.setState(() => false)
38
40
  }}
39
- className="bg-gradient-to-r from-orange-500 to-red-600 text-white px-4 py-1.5 rounded-lg text-sm hover:opacity-90 transition-opacity"
41
+ className="demo-button px-4 py-1.5 text-sm"
40
42
  >
41
43
  View Details
42
44
  </button>