@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
@@ -20,35 +20,37 @@ const SAMPLE_RECIPES = [
20
20
 
21
21
  function RecipeCard({ recipe }: { recipe: Recipe }) {
22
22
  const difficultyColors = {
23
- easy: 'bg-green-500/20 text-green-400',
24
- medium: 'bg-yellow-500/20 text-yellow-400',
25
- hard: 'bg-red-500/20 text-red-400',
23
+ easy: 'demo-pill',
24
+ medium: 'demo-pill',
25
+ hard: 'demo-pill',
26
26
  }
27
27
 
28
28
  return (
29
29
  <div className="space-y-6">
30
30
  {/* Header */}
31
31
  <div>
32
- <h3 className="text-2xl font-bold text-white mb-2">{recipe.name}</h3>
33
- <p className="text-gray-400">{recipe.description}</p>
32
+ <h3 className="text-2xl font-bold text-[var(--sea-ink)] mb-2">
33
+ {recipe.name}
34
+ </h3>
35
+ <p className="demo-muted">{recipe.description}</p>
34
36
  </div>
35
37
 
36
38
  {/* Meta info */}
37
39
  <div className="flex flex-wrap gap-4">
38
- <div className="flex items-center gap-2 text-gray-300">
39
- <Clock className="w-4 h-4 text-orange-400" />
40
+ <div className="demo-muted flex items-center gap-2">
41
+ <Clock className="w-4 h-4 text-[var(--lagoon-deep)]" />
40
42
  <span className="text-sm">Prep: {recipe.prepTime}</span>
41
43
  </div>
42
- <div className="flex items-center gap-2 text-gray-300">
43
- <Clock className="w-4 h-4 text-orange-400" />
44
+ <div className="demo-muted flex items-center gap-2">
45
+ <Clock className="w-4 h-4 text-[var(--lagoon-deep)]" />
44
46
  <span className="text-sm">Cook: {recipe.cookTime}</span>
45
47
  </div>
46
- <div className="flex items-center gap-2 text-gray-300">
47
- <Users className="w-4 h-4 text-orange-400" />
48
+ <div className="demo-muted flex items-center gap-2">
49
+ <Users className="w-4 h-4 text-[var(--lagoon-deep)]" />
48
50
  <span className="text-sm">{recipe.servings} servings</span>
49
51
  </div>
50
52
  <div
51
- className={`flex items-center gap-2 px-2 py-1 rounded-full ${
53
+ className={`flex items-center gap-2 ${
52
54
  difficultyColors[recipe.difficulty]
53
55
  }`}
54
56
  >
@@ -59,16 +61,16 @@ function RecipeCard({ recipe }: { recipe: Recipe }) {
59
61
 
60
62
  {/* Ingredients */}
61
63
  <div>
62
- <h4 className="text-lg font-semibold text-white mb-3">Ingredients</h4>
64
+ <h4 className="text-lg font-semibold text-[var(--sea-ink)] mb-3">
65
+ Ingredients
66
+ </h4>
63
67
  <ul className="grid grid-cols-1 md:grid-cols-2 gap-2">
64
68
  {recipe.ingredients.map((ing, idx) => (
65
- <li key={idx} className="flex items-start gap-2 text-gray-300">
66
- <span className="text-orange-400">•</span>
69
+ <li key={idx} className="demo-muted flex items-start gap-2">
70
+ <span className="text-[var(--lagoon-deep)]">•</span>
67
71
  <span>
68
72
  <span className="font-medium">{ing.amount}</span> {ing.item}
69
- {ing.notes && (
70
- <span className="text-gray-500 text-sm"> ({ing.notes})</span>
71
- )}
73
+ {ing.notes && <span className="text-sm"> ({ing.notes})</span>}
72
74
  </span>
73
75
  </li>
74
76
  ))}
@@ -77,11 +79,13 @@ function RecipeCard({ recipe }: { recipe: Recipe }) {
77
79
 
78
80
  {/* Instructions */}
79
81
  <div>
80
- <h4 className="text-lg font-semibold text-white mb-3">Instructions</h4>
82
+ <h4 className="text-lg font-semibold text-[var(--sea-ink)] mb-3">
83
+ Instructions
84
+ </h4>
81
85
  <ol className="space-y-3">
82
86
  {recipe.instructions.map((step, idx) => (
83
- <li key={idx} className="flex gap-3 text-gray-300">
84
- <span className="flex-shrink-0 w-6 h-6 bg-orange-500/20 text-orange-400 rounded-full flex items-center justify-center text-sm font-medium">
87
+ <li key={idx} className="demo-muted flex gap-3">
88
+ <span className="flex-shrink-0 w-6 h-6 rounded-full border border-[var(--line)] bg-[var(--chip-bg)] text-[var(--sea-ink)] flex items-center justify-center text-sm font-medium">
85
89
  {idx + 1}
86
90
  </span>
87
91
  <span>{step}</span>
@@ -93,11 +97,13 @@ function RecipeCard({ recipe }: { recipe: Recipe }) {
93
97
  {/* Tips */}
94
98
  {recipe.tips && recipe.tips.length > 0 && (
95
99
  <div>
96
- <h4 className="text-lg font-semibold text-white mb-3">Tips</h4>
100
+ <h4 className="text-lg font-semibold text-[var(--sea-ink)] mb-3">
101
+ Tips
102
+ </h4>
97
103
  <ul className="space-y-2">
98
104
  {recipe.tips.map((tip, idx) => (
99
- <li key={idx} className="flex items-start gap-2 text-gray-300">
100
- <span className="text-yellow-400">*</span>
105
+ <li key={idx} className="demo-muted flex items-start gap-2">
106
+ <span className="text-[var(--lagoon-deep)]">*</span>
101
107
  <span>{tip}</span>
102
108
  </li>
103
109
  ))}
@@ -108,27 +114,27 @@ function RecipeCard({ recipe }: { recipe: Recipe }) {
108
114
  {/* Nutrition */}
109
115
  {recipe.nutritionPerServing && (
110
116
  <div>
111
- <h4 className="text-lg font-semibold text-white mb-3">
117
+ <h4 className="text-lg font-semibold text-[var(--sea-ink)] mb-3">
112
118
  Nutrition (per serving)
113
119
  </h4>
114
120
  <div className="flex flex-wrap gap-4 text-sm">
115
121
  {recipe.nutritionPerServing.calories && (
116
- <span className="px-3 py-1 bg-gray-700 rounded-full text-gray-300">
122
+ <span className="demo-pill">
117
123
  {recipe.nutritionPerServing.calories} cal
118
124
  </span>
119
125
  )}
120
126
  {recipe.nutritionPerServing.protein && (
121
- <span className="px-3 py-1 bg-gray-700 rounded-full text-gray-300">
127
+ <span className="demo-pill">
122
128
  Protein: {recipe.nutritionPerServing.protein}
123
129
  </span>
124
130
  )}
125
131
  {recipe.nutritionPerServing.carbs && (
126
- <span className="px-3 py-1 bg-gray-700 rounded-full text-gray-300">
132
+ <span className="demo-pill">
127
133
  Carbs: {recipe.nutritionPerServing.carbs}
128
134
  </span>
129
135
  )}
130
136
  {recipe.nutritionPerServing.fat && (
131
- <span className="px-3 py-1 bg-gray-700 rounded-full text-gray-300">
137
+ <span className="demo-pill">
132
138
  Fat: {recipe.nutritionPerServing.fat}
133
139
  </span>
134
140
  )}
@@ -182,26 +188,24 @@ function StructuredPage() {
182
188
  const canExecute = !!(!isLoading && recipeName.trim() && !error)
183
189
 
184
190
  return (
185
- <div className="min-h-[calc(100vh-80px)] bg-gray-900 p-6">
186
- <div className="max-w-6xl mx-auto">
191
+ <main className="demo-page demo-page-wide">
192
+ <div>
187
193
  <div className="flex items-center gap-3 mb-6">
188
- <ChefHat className="w-8 h-8 text-orange-500" />
189
- <h1 className="text-2xl font-bold text-white">
190
- One-Shot & Structured Output
191
- </h1>
194
+ <ChefHat className="w-8 h-8 text-[var(--lagoon-deep)]" />
195
+ <h1 className="demo-title">One-Shot & Structured Output</h1>
192
196
  </div>
193
197
 
194
- <p className="text-gray-400 mb-6">
198
+ <p className="demo-muted mb-6">
195
199
  Compare two output modes:{' '}
196
- <strong className="text-orange-400">One-Shot</strong> returns freeform
197
- markdown, while{' '}
198
- <strong className="text-orange-400">Structured</strong> returns
200
+ <strong className="text-[var(--sea-ink)]">One-Shot</strong> returns
201
+ freeform markdown, while{' '}
202
+ <strong className="text-[var(--sea-ink)]">Structured</strong> returns
199
203
  validated JSON conforming to a Zod schema.
200
204
  </p>
201
205
 
202
206
  <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
203
207
  <div>
204
- <label className="block text-sm font-medium text-gray-300 mb-2">
208
+ <label className="mb-2 block text-sm font-medium text-[var(--sea-ink)]">
205
209
  Recipe Name
206
210
  </label>
207
211
  <input
@@ -210,11 +214,11 @@ function StructuredPage() {
210
214
  onChange={(e) => setRecipeName(e.target.value)}
211
215
  disabled={isLoading}
212
216
  placeholder="e.g., Chocolate Chip Cookies"
213
- className="w-full rounded-lg border border-orange-500/20 bg-gray-800 px-3 py-2 text-sm text-white focus:outline-none focus:ring-2 focus:ring-orange-500/50"
217
+ className="demo-input text-sm"
214
218
  />
215
219
 
216
220
  <div className="mt-2">
217
- <label className="block text-sm font-medium text-gray-300 mb-2">
221
+ <label className="mb-2 block text-sm font-medium text-[var(--sea-ink)]">
218
222
  Quick Picks
219
223
  </label>
220
224
  <div className="flex flex-wrap gap-2">
@@ -223,7 +227,7 @@ function StructuredPage() {
223
227
  key={name}
224
228
  onClick={() => setRecipeName(name)}
225
229
  disabled={isLoading}
226
- className="px-2 py-1 text-xs bg-gray-800 hover:bg-gray-700 text-gray-300 rounded-lg border border-gray-700 transition-colors"
230
+ className="demo-button demo-button-secondary px-2 py-1 text-xs"
227
231
  >
228
232
  {name}
229
233
  </button>
@@ -237,18 +241,14 @@ function StructuredPage() {
237
241
  <button
238
242
  onClick={() => handleGenerate('oneshot')}
239
243
  disabled={!canExecute}
240
- className={`px-4 py-2 rounded-lg text-sm font-medium transition-colors text-white ${
241
- !canExecute ? 'bg-gray-600' : 'bg-orange-500'
242
- }`}
244
+ className="demo-button"
243
245
  >
244
246
  One-Shot (Markdown)
245
247
  </button>
246
248
  <button
247
249
  onClick={() => handleGenerate('structured')}
248
250
  disabled={!canExecute}
249
- className={`px-4 py-2 rounded-lg text-sm font-medium transition-colors text-white ${
250
- !canExecute ? 'bg-gray-600' : 'bg-blue-500'
251
- }`}
251
+ className="demo-button"
252
252
  >
253
253
  Structured (JSON)
254
254
  </button>
@@ -256,29 +256,18 @@ function StructuredPage() {
256
256
  </div>
257
257
  </div>
258
258
 
259
- {/* Output Panel */}
260
- <div className="mt-5 lg:col-span-2 bg-gray-800 rounded-lg p-6 border border-orange-500/20">
259
+ <div className="demo-panel mt-5 lg:col-span-2">
261
260
  <div className="flex items-center justify-between mb-4">
262
- <h2 className="text-lg font-semibold text-white">
263
- Generated Recipe
264
- </h2>
261
+ <h2 className="demo-section-title">Generated Recipe</h2>
265
262
  {result && (
266
- <span
267
- className={`px-2 py-1 rounded text-xs font-medium ${
268
- result.mode === 'structured'
269
- ? 'bg-purple-500/20 text-purple-400'
270
- : 'bg-blue-500/20 text-blue-400'
271
- }`}
272
- >
263
+ <span className="demo-pill">
273
264
  {result.mode === 'structured' ? 'Structured JSON' : 'Markdown'}
274
265
  </span>
275
266
  )}
276
267
  </div>
277
268
 
278
269
  {error && (
279
- <div className="p-4 bg-red-500/10 border border-red-500/20 rounded-lg text-red-400 mb-4">
280
- {error}
281
- </div>
270
+ <div className="demo-alert demo-alert-danger mb-4">{error}</div>
282
271
  )}
283
272
 
284
273
  {result ? (
@@ -286,13 +275,13 @@ function StructuredPage() {
286
275
  {result.mode === 'structured' && result.recipe ? (
287
276
  <RecipeCard recipe={result.recipe} />
288
277
  ) : result.markdown ? (
289
- <div className="prose prose-invert max-w-none">
278
+ <div className="max-w-none">
290
279
  <Streamdown>{result.markdown}</Streamdown>
291
280
  </div>
292
281
  ) : null}
293
282
  </div>
294
283
  ) : !error && !isLoading ? (
295
- <div className="flex flex-col items-center justify-center h-64 text-gray-500">
284
+ <div className="demo-muted flex h-64 flex-col items-center justify-center">
296
285
  <ChefHat className="w-16 h-16 mb-4 opacity-50" />
297
286
  <p>
298
287
  Enter a recipe name and click "Generate Recipe" to get started.
@@ -301,7 +290,7 @@ function StructuredPage() {
301
290
  ) : null}
302
291
  </div>
303
292
  </div>
304
- </div>
293
+ </main>
305
294
  )
306
295
  }
307
296
 
@@ -17,35 +17,30 @@ function RouteComponent() {
17
17
  const guitar = Route.useLoaderData()
18
18
 
19
19
  return (
20
- <div className="relative min-h-[100vh] flex items-center bg-black text-white p-5">
21
- <div className="relative z-10 w-[60%] bg-gray-900/60 backdrop-blur-md rounded-2xl p-8 border border-gray-800/50 shadow-xl">
22
- <Link
23
- to="/example/guitars"
24
- className="inline-block mb-4 text-emerald-400 hover:text-emerald-300"
25
- >
26
- &larr; Back to all guitars
27
- </Link>
28
- <h1 className="text-3xl font-bold mb-4">{guitar.name}</h1>
29
- <p className="text-gray-300 mb-6">{guitar.description}</p>
30
- <div className="flex items-center justify-between">
31
- <div className="text-2xl font-bold text-emerald-400">
32
- ${guitar.price}
20
+ <main className="demo-page">
21
+ <div className="grid gap-8 lg:grid-cols-[minmax(0,1fr)_minmax(20rem,28rem)] lg:items-center">
22
+ <section className="demo-panel">
23
+ <Link to="/demo/guitars/" className="mb-4 inline-block">
24
+ &larr; Back to all guitars
25
+ </Link>
26
+ <h1 className="demo-title mb-4">{guitar.name}</h1>
27
+ <p className="demo-muted mb-6">{guitar.description}</p>
28
+ <div className="flex items-center justify-between">
29
+ <div className="text-2xl font-bold text-[var(--lagoon-deep)]">
30
+ ${guitar.price}
31
+ </div>
32
+ <button className="demo-button">Add to Cart</button>
33
33
  </div>
34
- <button className="bg-emerald-600 hover:bg-emerald-500 text-white px-6 py-2 rounded-lg transition-colors">
35
- Add to Cart
36
- </button>
37
- </div>
38
- </div>
34
+ </section>
39
35
 
40
- <div className="absolute top-0 right-0 w-[55%] h-full z-0">
41
- <div className="w-full h-full overflow-hidden rounded-2xl border-4 border-gray-800 shadow-2xl">
36
+ <div className="demo-card overflow-hidden p-0">
42
37
  <img
43
38
  src={guitar.image}
44
39
  alt={guitar.name}
45
- className="w-full h-full object-cover guitar-image"
40
+ className="guitar-image h-full w-full object-cover"
46
41
  />
47
42
  </div>
48
43
  </div>
49
- </div>
44
+ </main>
50
45
  )
51
46
  }
@@ -8,48 +8,42 @@ export const Route = createFileRoute('/demo/guitars/')({
8
8
 
9
9
  function GuitarsIndex() {
10
10
  return (
11
- <div className="bg-black text-white p-5">
12
- <h1 className="text-3xl font-bold mb-8 text-center">Featured Guitars</h1>
13
- <div className="flex flex-wrap gap-12 justify-center">
11
+ <main className="demo-page demo-page-wide">
12
+ <h1 className="demo-title mb-8 text-center">Featured Guitars</h1>
13
+ <div className="grid gap-6 md:grid-cols-2 xl:grid-cols-3">
14
14
  {guitars.map((guitar) => (
15
- <div
16
- key={guitar.id}
17
- className="w-full md:w-[calc(50%-1.5rem)] xl:w-[calc(33.333%-2rem)] relative mb-24"
18
- >
15
+ <div key={guitar.id}>
19
16
  <Link
20
- to="/example/guitars/$guitarId"
17
+ to="/demo/guitars/$guitarId"
21
18
  params={{
22
19
  guitarId: guitar.id.toString(),
23
20
  }}
21
+ className="block no-underline"
24
22
  >
25
- <div className="relative z-0 w-full aspect-square mb-8">
26
- <div className="w-full h-full overflow-hidden rounded-2xl border-4 border-gray-800 shadow-2xl">
23
+ <article className="demo-card h-full overflow-hidden p-0 transition hover:-translate-y-0.5">
24
+ <div className="aspect-square overflow-hidden">
27
25
  <img
28
26
  src={guitar.image}
29
27
  alt={guitar.name}
30
- className="w-full h-full object-cover guitar-image group-hover:scale-105 transition-transform duration-500"
28
+ className="guitar-image h-full w-full object-cover transition-transform duration-500 hover:scale-105"
31
29
  />
32
- <div className="absolute inset-0 bg-gradient-to-t from-black/40 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
33
30
  </div>
34
-
35
- <div className="absolute bottom-4 left-1/2 transform -translate-x-1/2 bg-emerald-500/80 text-white px-4 py-2 rounded-full text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity duration-300 backdrop-blur-sm">
36
- View Details
37
- </div>
38
- </div>
39
-
40
- <div className="absolute bottom-0 right-0 z-10 w-[80%] bg-gray-900/60 backdrop-blur-md rounded-2xl p-5 border border-gray-800/50 shadow-xl transform translate-y-[40%]">
41
- <h2 className="text-xl font-bold mb-2">{guitar.name}</h2>
42
- <p className="text-gray-300 mb-3 line-clamp-2">
43
- {guitar.shortDescription}
44
- </p>
45
- <div className="text-xl font-bold text-emerald-400">
46
- ${guitar.price}
31
+ <div className="p-5">
32
+ <h2 className="mb-2 text-xl font-bold text-[var(--sea-ink)]">
33
+ {guitar.name}
34
+ </h2>
35
+ <p className="demo-muted mb-3 line-clamp-2">
36
+ {guitar.shortDescription}
37
+ </p>
38
+ <div className="text-xl font-bold text-[var(--lagoon-deep)]">
39
+ ${guitar.price}
40
+ </div>
47
41
  </div>
48
- </div>
42
+ </article>
49
43
  </Link>
50
44
  </div>
51
45
  ))}
52
46
  </div>
53
- </div>
47
+ </main>
54
48
  )
55
49
  }
@@ -33,43 +33,40 @@ function RouteComponent() {
33
33
  const { data } = useReadQuery(queryRef)
34
34
 
35
35
  return (
36
- <div className="p-4">
37
- <h2 className="text-2xl font-bold mb-4">Apollo Client Demo</h2>
38
- <div className="bg-blue-100 border border-blue-400 text-blue-700 px-4 py-3 rounded mb-4">
39
- <p className="font-bold">Apollo Client is configured!</p>
40
- <p className="text-sm mt-2">
41
- This demo uses{' '}
42
- <code className="bg-blue-200 px-1 rounded">preloadQuery</code> in the
43
- loader and{' '}
44
- <code className="bg-blue-200 px-1 rounded">useReadQuery</code> in the
45
- component for optimal streaming SSR performance.
46
- </p>
47
- </div>
48
- <div className="bg-gray-100 p-4 rounded">
49
- <h3 className="font-bold mb-2">Query Result:</h3>
50
- <pre className="text-sm overflow-x-auto">
51
- {JSON.stringify(data, null, 2)}
52
- </pre>
53
- </div>
54
- <div className="mt-4 text-sm text-gray-600">
55
- <p>📝 Next steps:</p>
56
- <ul className="list-disc ml-6 mt-2">
57
- <li>
58
- Configure your GraphQL endpoint in{' '}
59
- <code className="bg-gray-200 px-1 rounded">src/router.tsx</code>
60
- </li>
61
- <li>Replace the example query with your actual GraphQL schema</li>
62
- <li>
63
- Learn more:{' '}
64
- <a
65
- href="https://www.apollographql.com/docs/react"
66
- className="text-blue-600 hover:underline"
67
- >
68
- Apollo Client Docs
69
- </a>
70
- </li>
71
- </ul>
72
- </div>
73
- </div>
36
+ <main className="demo-page">
37
+ <section className="demo-panel">
38
+ <p className="island-kicker mb-2">GraphQL</p>
39
+ <h1 className="demo-title mb-6">Apollo Client Demo</h1>
40
+ <div className="demo-alert mb-4">
41
+ <p className="font-bold">Apollo Client is configured!</p>
42
+ <p className="text-sm mt-2">
43
+ This demo uses <code>preloadQuery</code> in the loader and{' '}
44
+ <code>useReadQuery</code> in the component for optimal streaming SSR
45
+ performance.
46
+ </p>
47
+ </div>
48
+ <div className="demo-code-block">
49
+ <h3 className="font-bold mb-2">Query Result:</h3>
50
+ <pre className="text-sm overflow-x-auto">
51
+ {JSON.stringify(data, null, 2)}
52
+ </pre>
53
+ </div>
54
+ <div className="demo-muted mt-4 text-sm">
55
+ <p className="font-medium text-[var(--sea-ink)]">Next steps:</p>
56
+ <ul className="list-disc ml-6 mt-2">
57
+ <li>
58
+ Configure your GraphQL endpoint in <code>src/router.tsx</code>
59
+ </li>
60
+ <li>Replace the example query with your actual GraphQL schema</li>
61
+ <li>
62
+ Learn more:{' '}
63
+ <a href="https://www.apollographql.com/docs/react">
64
+ Apollo Client Docs
65
+ </a>
66
+ </li>
67
+ </ul>
68
+ </div>
69
+ </section>
70
+ </main>
74
71
  )
75
72
  }