@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
  }
@@ -4,8 +4,7 @@ import { resolve } from 'node:path'
4
4
  import { createApp } from '../src/create-app.js'
5
5
 
6
6
  import { createMemoryEnvironment } from '../src/environment.js'
7
- import { FILE_ROUTER } from '../src/constants.js'
8
- import { AddOn, Options } from '../src/types.js'
7
+ import type { AddOn, Options } from '../src/types.js'
9
8
 
10
9
  const simpleOptions = {
11
10
  projectName: 'test',
@@ -43,7 +42,7 @@ const simpleOptions = {
43
42
  packageManager: 'pnpm',
44
43
  typescript: true,
45
44
  tailwind: true,
46
- mode: FILE_ROUTER,
45
+ mode: 'file-router',
47
46
  variableValues: {},
48
47
  } as unknown as Options
49
48
 
@@ -88,6 +87,43 @@ describe('createApp', () => {
88
87
  expect(output.commands.some(({ command }) => command === 'echo')).toBe(true)
89
88
  })
90
89
 
90
+ it.each(['react', 'solid'])(
91
+ 'generates routes for %s file-router apps after install',
92
+ async (frameworkId) => {
93
+ const { environment, output } = createMemoryEnvironment()
94
+ await createApp(environment, {
95
+ ...simpleOptions,
96
+ framework: {
97
+ ...simpleOptions.framework,
98
+ id: frameworkId,
99
+ },
100
+ install: true,
101
+ } as Options)
102
+
103
+ expect(output.commands).toContainEqual({
104
+ command: 'pnpm',
105
+ args: ['generate-routes'],
106
+ })
107
+ },
108
+ )
109
+
110
+ it('skips route generation when dependency install is skipped', async () => {
111
+ const { environment, output } = createMemoryEnvironment()
112
+ await createApp(environment, {
113
+ ...simpleOptions,
114
+ framework: {
115
+ ...simpleOptions.framework,
116
+ id: 'react',
117
+ },
118
+ install: false,
119
+ })
120
+
121
+ expect(output.commands).not.toContainEqual({
122
+ command: 'pnpm',
123
+ args: ['generate-routes'],
124
+ })
125
+ })
126
+
91
127
  it('should create an app - with a add-on', async () => {
92
128
  const { environment, output } = createMemoryEnvironment()
93
129
  await createApp(environment, {
@@ -0,0 +1,34 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { createFrameworkDefinition as createReactFrameworkDefinition } from '../src/frameworks/react/index.js'
4
+ import { createFrameworkDefinition as createSolidFrameworkDefinition } from '../src/frameworks/solid/index.js'
5
+
6
+ describe('framework templates', () => {
7
+ it.each([
8
+ ['React', createReactFrameworkDefinition],
9
+ ['Solid', createSolidFrameworkDefinition],
10
+ ])(
11
+ '%s gitignore does not exclude the generated route tree',
12
+ (_, createDefinition) => {
13
+ const framework = createDefinition()
14
+
15
+ expect(framework.base._dot_gitignore).not.toContain(
16
+ 'src/routeTree.gen.ts',
17
+ )
18
+ },
19
+ )
20
+
21
+ it.each([
22
+ ['React', createReactFrameworkDefinition],
23
+ ['Solid', createSolidFrameworkDefinition],
24
+ ])('%s includes route generation tooling', (_, createDefinition) => {
25
+ const framework = createDefinition()
26
+
27
+ expect(framework.base['package.json']).toContain(
28
+ '"generate-routes": "tsr generate"',
29
+ )
30
+ expect(
31
+ framework.optionalPackages['file-router'].devDependencies,
32
+ ).toHaveProperty('@tanstack/router-cli')
33
+ })
34
+ })