@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.
- package/CHANGELOG.md +16 -0
- package/dist/create-app.js +22 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
- package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
- package/dist/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
- package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
- package/dist/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
- package/dist/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
- package/dist/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
- package/dist/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
- package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
- package/dist/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
- package/dist/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
- package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
- package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
- package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
- package/dist/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
- package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
- package/dist/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
- package/dist/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
- package/dist/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
- package/dist/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
- package/dist/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
- package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
- package/dist/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
- package/dist/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
- package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
- package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
- package/dist/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
- package/dist/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
- package/dist/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
- package/dist/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
- package/dist/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
- package/dist/frameworks/react/project/base/package.json +1 -0
- package/dist/frameworks/react/project/base/src/styles.css.ejs +203 -0
- package/dist/frameworks/react/project/base/tsr.config.json +3 -0
- package/dist/frameworks/react/project/packages.json +3 -0
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
- package/dist/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
- package/dist/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
- package/dist/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
- package/dist/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
- package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
- package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
- package/dist/frameworks/solid/project/base/package.json +1 -0
- package/dist/frameworks/solid/project/base/src/styles.css.ejs +203 -0
- package/dist/frameworks/solid/project/base/tsr.config.json +3 -0
- package/dist/frameworks/solid/project/packages.json +3 -0
- package/package.json +1 -1
- package/src/create-app.ts +32 -1
- package/src/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
- package/src/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
- package/src/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
- package/src/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
- package/src/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
- package/src/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
- package/src/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
- package/src/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
- package/src/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
- package/src/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
- package/src/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
- package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
- package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
- package/src/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
- package/src/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
- package/src/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
- package/src/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
- package/src/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
- package/src/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
- package/src/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
- package/src/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
- package/src/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
- package/src/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
- package/src/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
- package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
- package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
- package/src/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
- package/src/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
- package/src/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
- package/src/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
- package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
- package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
- package/src/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
- package/src/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
- package/src/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
- package/src/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
- package/src/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
- package/src/frameworks/react/project/base/package.json +1 -0
- package/src/frameworks/react/project/base/src/styles.css.ejs +203 -0
- package/src/frameworks/react/project/base/tsr.config.json +3 -0
- package/src/frameworks/react/project/packages.json +3 -0
- package/src/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
- package/src/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
- package/src/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
- package/src/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
- package/src/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
- package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
- package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
- package/src/frameworks/solid/project/base/package.json +1 -0
- package/src/frameworks/solid/project/base/src/styles.css.ejs +203 -0
- package/src/frameworks/solid/project/base/tsr.config.json +3 -0
- package/src/frameworks/solid/project/packages.json +3 -0
- package/tests/create-app.test.ts +39 -3
- package/tests/framework-template.test.ts +34 -0
|
@@ -47,141 +47,91 @@ function DemoDrizzle() {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
return (
|
|
50
|
-
<
|
|
51
|
-
className="
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
style={{
|
|
60
|
-
background:
|
|
61
|
-
'linear-gradient(135deg, rgba(22, 32, 46, 0.95) 0%, rgba(12, 26, 43, 0.95) 100%)',
|
|
62
|
-
backdropFilter: 'blur(10px)',
|
|
63
|
-
}}
|
|
64
|
-
>
|
|
65
|
-
<div
|
|
66
|
-
className="flex items-center justify-center gap-4 mb-8 p-4 rounded-lg"
|
|
67
|
-
style={{
|
|
68
|
-
background:
|
|
69
|
-
'linear-gradient(90deg, rgba(93, 103, 227, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%)',
|
|
70
|
-
border: '1px solid rgba(93, 103, 227, 0.2)',
|
|
71
|
-
}}
|
|
72
|
-
>
|
|
73
|
-
<div className="relative group">
|
|
74
|
-
<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>
|
|
75
|
-
<div className="relative bg-gradient-to-br from-indigo-600 to-purple-600 p-3 rounded-lg">
|
|
76
|
-
<img
|
|
77
|
-
src="/drizzle.svg"
|
|
78
|
-
alt="Drizzle Logo"
|
|
79
|
-
className="w-8 h-8 transform group-hover:scale-110 transition-transform duration-300"
|
|
80
|
-
/>
|
|
81
|
-
</div>
|
|
50
|
+
<main className="demo-page demo-center">
|
|
51
|
+
<section className="demo-panel w-full max-w-2xl">
|
|
52
|
+
<header className="mb-8 flex items-center gap-4">
|
|
53
|
+
<span className="demo-card flex h-14 w-14 items-center justify-center p-3">
|
|
54
|
+
<img src="/drizzle.svg" alt="Drizzle Logo" className="h-8 w-8" />
|
|
55
|
+
</span>
|
|
56
|
+
<div>
|
|
57
|
+
<p className="island-kicker mb-2">Database</p>
|
|
58
|
+
<h1 className="demo-title">Drizzle Demo</h1>
|
|
82
59
|
</div>
|
|
83
|
-
|
|
84
|
-
Drizzle Database Demo
|
|
85
|
-
</h1>
|
|
86
|
-
</div>
|
|
60
|
+
</header>
|
|
87
61
|
|
|
88
|
-
<h2 className="
|
|
62
|
+
<h2 className="demo-section-title mb-4">Todos</h2>
|
|
89
63
|
|
|
90
64
|
<ul className="space-y-3 mb-6">
|
|
91
65
|
{todos.map((todo) => (
|
|
92
66
|
<li
|
|
93
67
|
key={todo.id}
|
|
94
|
-
className="
|
|
95
|
-
style={{
|
|
96
|
-
background:
|
|
97
|
-
'linear-gradient(135deg, rgba(93, 103, 227, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%)',
|
|
98
|
-
borderColor: 'rgba(93, 103, 227, 0.3)',
|
|
99
|
-
}}
|
|
68
|
+
className="demo-list-item"
|
|
100
69
|
>
|
|
101
70
|
<div className="flex items-center justify-between">
|
|
102
|
-
<span className="
|
|
103
|
-
|
|
104
|
-
</span>
|
|
105
|
-
<span className="text-xs text-indigo-300/70">#{todo.id}</span>
|
|
71
|
+
<span className="font-medium">{todo.title}</span>
|
|
72
|
+
<span className="demo-muted text-xs">#{todo.id}</span>
|
|
106
73
|
</div>
|
|
107
74
|
</li>
|
|
108
75
|
))}
|
|
109
76
|
{todos.length === 0 && (
|
|
110
|
-
<li className="
|
|
77
|
+
<li className="demo-list-item text-center demo-muted">
|
|
111
78
|
No todos yet. Create one below!
|
|
112
79
|
</li>
|
|
113
80
|
)}
|
|
114
81
|
</ul>
|
|
115
82
|
|
|
116
|
-
<form onSubmit={handleSubmit} className="flex gap-2">
|
|
83
|
+
<form onSubmit={handleSubmit} className="flex flex-col gap-2 sm:flex-row">
|
|
117
84
|
<input
|
|
118
85
|
type="text"
|
|
119
86
|
name="title"
|
|
120
87
|
placeholder="Add a new todo..."
|
|
121
|
-
className="
|
|
122
|
-
style={{
|
|
123
|
-
background: 'rgba(93, 103, 227, 0.1)',
|
|
124
|
-
borderColor: 'rgba(93, 103, 227, 0.3)',
|
|
125
|
-
focusRing: 'rgba(93, 103, 227, 0.5)',
|
|
126
|
-
}}
|
|
88
|
+
className="demo-input min-w-0 flex-1"
|
|
127
89
|
/>
|
|
128
90
|
<button
|
|
129
91
|
type="submit"
|
|
130
|
-
className="
|
|
131
|
-
style={{
|
|
132
|
-
background: 'linear-gradient(135deg, #5d67e3 0%, #8b5cf6 100%)',
|
|
133
|
-
color: 'white',
|
|
134
|
-
}}
|
|
92
|
+
className="demo-button whitespace-nowrap"
|
|
135
93
|
>
|
|
136
94
|
Add Todo
|
|
137
95
|
</button>
|
|
138
96
|
</form>
|
|
139
97
|
|
|
140
|
-
<div
|
|
141
|
-
className="
|
|
142
|
-
style={{
|
|
143
|
-
background: 'rgba(93, 103, 227, 0.05)',
|
|
144
|
-
borderColor: 'rgba(93, 103, 227, 0.2)',
|
|
145
|
-
}}
|
|
146
|
-
>
|
|
147
|
-
<h3 className="text-lg font-semibold mb-2 text-indigo-200">
|
|
98
|
+
<div className="demo-card mt-8">
|
|
99
|
+
<h3 className="demo-section-title mb-2">
|
|
148
100
|
Powered by Drizzle ORM
|
|
149
101
|
</h3>
|
|
150
|
-
<p className="
|
|
102
|
+
<p className="demo-muted mb-4 text-sm">
|
|
151
103
|
Next-generation ORM for Node.js & TypeScript with PostgreSQL
|
|
152
104
|
</p>
|
|
153
105
|
<div className="space-y-2 text-sm">
|
|
154
|
-
<p className="
|
|
155
|
-
<ol className="
|
|
106
|
+
<p className="font-medium">Setup Instructions:</p>
|
|
107
|
+
<ol className="demo-muted list-inside list-decimal space-y-2">
|
|
156
108
|
<li>
|
|
157
109
|
Configure your{' '}
|
|
158
|
-
<code
|
|
159
|
-
DATABASE_URL
|
|
160
|
-
</code>{' '}
|
|
110
|
+
<code>DATABASE_URL</code>{' '}
|
|
161
111
|
in .env.local
|
|
162
112
|
</li>
|
|
163
113
|
<li>
|
|
164
114
|
Run:{' '}
|
|
165
|
-
<code
|
|
115
|
+
<code>
|
|
166
116
|
<%- getPackageManagerExecuteScript('drizzle-kit', ['generate']) %>
|
|
167
117
|
</code>
|
|
168
118
|
</li>
|
|
169
119
|
<li>
|
|
170
120
|
Run:{' '}
|
|
171
|
-
<code
|
|
121
|
+
<code>
|
|
172
122
|
<%- getPackageManagerExecuteScript('drizzle-kit', ['migrate']) %>
|
|
173
123
|
</code>
|
|
174
124
|
</li>
|
|
175
125
|
<li>
|
|
176
126
|
Optional:{' '}
|
|
177
|
-
<code
|
|
127
|
+
<code>
|
|
178
128
|
<%- getPackageManagerExecuteScript('drizzle-kit', ['studio']) %>
|
|
179
129
|
</code>
|
|
180
130
|
</li>
|
|
181
131
|
</ol>
|
|
182
132
|
</div>
|
|
183
133
|
</div>
|
|
184
|
-
</
|
|
185
|
-
</
|
|
134
|
+
</section>
|
|
135
|
+
</main>
|
|
186
136
|
)
|
|
187
137
|
}
|
package/dist/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs
CHANGED
|
@@ -33,7 +33,7 @@ function ErrorMessages({
|
|
|
33
33
|
{errors.map((error) => (
|
|
34
34
|
<div
|
|
35
35
|
key={typeof error === 'string' ? error : error.message}
|
|
36
|
-
className="
|
|
36
|
+
className="mt-1 text-sm font-semibold text-red-600"
|
|
37
37
|
>
|
|
38
38
|
{typeof error === 'string' ? error : error.message}
|
|
39
39
|
</div>
|
|
@@ -54,7 +54,7 @@ export function TextField({
|
|
|
54
54
|
|
|
55
55
|
return (
|
|
56
56
|
<div>
|
|
57
|
-
<Label htmlFor={label} className="mb-2 text-
|
|
57
|
+
<Label htmlFor={label} className="mb-2 text-sm font-semibold text-[var(--sea-ink)]">
|
|
58
58
|
{label}
|
|
59
59
|
</Label>
|
|
60
60
|
<Input
|
|
@@ -80,7 +80,7 @@ export function TextArea({
|
|
|
80
80
|
|
|
81
81
|
return (
|
|
82
82
|
<div>
|
|
83
|
-
<Label htmlFor={label} className="mb-2 text-
|
|
83
|
+
<Label htmlFor={label} className="mb-2 text-sm font-semibold text-[var(--sea-ink)]">
|
|
84
84
|
{label}
|
|
85
85
|
</Label>
|
|
86
86
|
<ShadcnTextarea
|
|
@@ -143,7 +143,7 @@ export function Slider({ label }: { label: string }) {
|
|
|
143
143
|
|
|
144
144
|
return (
|
|
145
145
|
<div>
|
|
146
|
-
<Label htmlFor={label} className="mb-2 text-
|
|
146
|
+
<Label htmlFor={label} className="mb-2 text-sm font-semibold text-[var(--sea-ink)]">
|
|
147
147
|
{label}
|
|
148
148
|
</Label>
|
|
149
149
|
<ShadcnSlider
|
|
@@ -186,7 +186,7 @@ export function SubscribeButton({ label }: { label: string }) {
|
|
|
186
186
|
<button
|
|
187
187
|
type="submit"
|
|
188
188
|
disabled={isSubmitting}
|
|
189
|
-
className="
|
|
189
|
+
className="demo-button"
|
|
190
190
|
>
|
|
191
191
|
{label}
|
|
192
192
|
</button>
|
|
@@ -205,7 +205,7 @@ function ErrorMessages({
|
|
|
205
205
|
{errors.map((error) => (
|
|
206
206
|
<div
|
|
207
207
|
key={typeof error === 'string' ? error : error.message}
|
|
208
|
-
className="
|
|
208
|
+
className="mt-1 text-sm font-semibold text-red-600"
|
|
209
209
|
>
|
|
210
210
|
{typeof error === 'string' ? error : error.message}
|
|
211
211
|
</div>
|
|
@@ -226,14 +226,14 @@ export function TextField({
|
|
|
226
226
|
|
|
227
227
|
return (
|
|
228
228
|
<div>
|
|
229
|
-
<label htmlFor={label} className="block
|
|
229
|
+
<label htmlFor={label} className="mb-2 block text-sm font-semibold text-[var(--sea-ink)]">
|
|
230
230
|
{label}
|
|
231
231
|
<input
|
|
232
232
|
value={field.state.value}
|
|
233
233
|
placeholder={placeholder}
|
|
234
234
|
onBlur={field.handleBlur}
|
|
235
235
|
onChange={(e) => field.handleChange(e.target.value)}
|
|
236
|
-
className="
|
|
236
|
+
className="demo-input mt-2"
|
|
237
237
|
/>
|
|
238
238
|
</label>
|
|
239
239
|
{field.state.meta.isTouched && <ErrorMessages errors={errors} />}
|
|
@@ -253,14 +253,14 @@ export function TextArea({
|
|
|
253
253
|
|
|
254
254
|
return (
|
|
255
255
|
<div>
|
|
256
|
-
<label htmlFor={label} className="block
|
|
256
|
+
<label htmlFor={label} className="mb-2 block text-sm font-semibold text-[var(--sea-ink)]">
|
|
257
257
|
{label}
|
|
258
258
|
<textarea
|
|
259
259
|
value={field.state.value}
|
|
260
260
|
onBlur={field.handleBlur}
|
|
261
261
|
rows={rows}
|
|
262
262
|
onChange={(e) => field.handleChange(e.target.value)}
|
|
263
|
-
className="
|
|
263
|
+
className="demo-textarea mt-2"
|
|
264
264
|
/>
|
|
265
265
|
</label>
|
|
266
266
|
{field.state.meta.isTouched && <ErrorMessages errors={errors} />}
|
|
@@ -281,7 +281,7 @@ export function Select({
|
|
|
281
281
|
|
|
282
282
|
return (
|
|
283
283
|
<div>
|
|
284
|
-
<label htmlFor={label} className="block
|
|
284
|
+
<label htmlFor={label} className="mb-2 block text-sm font-semibold text-[var(--sea-ink)]">
|
|
285
285
|
{label}
|
|
286
286
|
</label>
|
|
287
287
|
<select
|
|
@@ -289,7 +289,7 @@ export function Select({
|
|
|
289
289
|
value={field.state.value}
|
|
290
290
|
onBlur={field.handleBlur}
|
|
291
291
|
onChange={(e) => field.handleChange(e.target.value)}
|
|
292
|
-
className="
|
|
292
|
+
className="demo-select"
|
|
293
293
|
>
|
|
294
294
|
{values.map((value) => (
|
|
295
295
|
<option key={value.value} value={value.value}>
|
|
@@ -45,14 +45,15 @@ function AddressForm() {
|
|
|
45
45
|
})
|
|
46
46
|
|
|
47
47
|
return (
|
|
48
|
-
<
|
|
49
|
-
className="
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
48
|
+
<main className="demo-page demo-center">
|
|
49
|
+
<section className="demo-panel w-full max-w-2xl">
|
|
50
|
+
<div className="mb-6">
|
|
51
|
+
<p className="island-kicker mb-2">TanStack Form</p>
|
|
52
|
+
<h1 className="demo-title">Address Form</h1>
|
|
53
|
+
<p className="demo-muted mt-2">
|
|
54
|
+
Nested fields, field-level validation, and a select input.
|
|
55
|
+
</p>
|
|
56
|
+
</div>
|
|
56
57
|
<form
|
|
57
58
|
onSubmit={(e) => {
|
|
58
59
|
e.preventDefault()
|
|
@@ -198,8 +199,8 @@ function AddressForm() {
|
|
|
198
199
|
</form.AppForm>
|
|
199
200
|
</div>
|
|
200
201
|
</form>
|
|
201
|
-
</
|
|
202
|
-
</
|
|
202
|
+
</section>
|
|
203
|
+
</main>
|
|
203
204
|
)
|
|
204
205
|
}
|
|
205
206
|
|
|
@@ -33,14 +33,15 @@ function SimpleForm() {
|
|
|
33
33
|
})
|
|
34
34
|
|
|
35
35
|
return (
|
|
36
|
-
<
|
|
37
|
-
className="
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
<main className="demo-page demo-center">
|
|
37
|
+
<section className="demo-panel w-full max-w-2xl">
|
|
38
|
+
<div className="mb-6">
|
|
39
|
+
<p className="island-kicker mb-2">TanStack Form</p>
|
|
40
|
+
<h1 className="demo-title">Simple Form</h1>
|
|
41
|
+
<p className="demo-muted mt-2">
|
|
42
|
+
A small validated form using the generated field helpers.
|
|
43
|
+
</p>
|
|
44
|
+
</div>
|
|
44
45
|
<form
|
|
45
46
|
onSubmit={(e) => {
|
|
46
47
|
e.preventDefault()
|
|
@@ -63,8 +64,8 @@ function SimpleForm() {
|
|
|
63
64
|
</form.AppForm>
|
|
64
65
|
</div>
|
|
65
66
|
</form>
|
|
66
|
-
</
|
|
67
|
-
</
|
|
67
|
+
</section>
|
|
68
|
+
</main>
|
|
68
69
|
)
|
|
69
70
|
}
|
|
70
71
|
|
|
@@ -32,22 +32,14 @@ function ORPCTodos() {
|
|
|
32
32
|
}, [todo])
|
|
33
33
|
|
|
34
34
|
return (
|
|
35
|
-
<
|
|
36
|
-
className="
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
'radial-gradient(70% 70% at 20% 20%, #07A798 0%, #045C4B 60%, #01251F 100%)',
|
|
40
|
-
}}
|
|
41
|
-
>
|
|
42
|
-
<div className="w-full max-w-2xl p-8 rounded-xl backdrop-blur-md bg-black/50 shadow-xl border-8 border-black/10">
|
|
43
|
-
<h1 className="text-2xl mb-4">MCP Todos list</h1>
|
|
35
|
+
<main className="demo-page demo-center">
|
|
36
|
+
<section className="demo-panel w-full max-w-2xl">
|
|
37
|
+
<p className="island-kicker mb-2">MCP</p>
|
|
38
|
+
<h1 className="demo-title mb-6">Todos</h1>
|
|
44
39
|
<ul className="mb-4 space-y-2">
|
|
45
40
|
{todos?.map((t) => (
|
|
46
|
-
<li
|
|
47
|
-
|
|
48
|
-
className="bg-white/10 border border-white/20 rounded-lg p-3 backdrop-blur-sm shadow-md"
|
|
49
|
-
>
|
|
50
|
-
<span className="text-lg text-white">{t.title}</span>
|
|
41
|
+
<li key={t.id} className="demo-list-item">
|
|
42
|
+
<span className="text-base font-medium">{t.title}</span>
|
|
51
43
|
</li>
|
|
52
44
|
))}
|
|
53
45
|
</ul>
|
|
@@ -62,17 +54,17 @@ function ORPCTodos() {
|
|
|
62
54
|
}
|
|
63
55
|
}}
|
|
64
56
|
placeholder="Enter a new todo..."
|
|
65
|
-
className="
|
|
57
|
+
className="demo-input"
|
|
66
58
|
/>
|
|
67
59
|
<button
|
|
68
60
|
disabled={todo.trim().length === 0}
|
|
69
61
|
onClick={submitTodo}
|
|
70
|
-
className="
|
|
62
|
+
className="demo-button"
|
|
71
63
|
>
|
|
72
64
|
Add todo
|
|
73
65
|
</button>
|
|
74
66
|
</div>
|
|
75
|
-
</
|
|
76
|
-
</
|
|
67
|
+
</section>
|
|
68
|
+
</main>
|
|
77
69
|
)
|
|
78
70
|
}
|
|
@@ -49,68 +49,57 @@ function App() {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
if (!todos) {
|
|
52
|
-
return
|
|
52
|
+
return (
|
|
53
|
+
<main className="demo-page demo-center">
|
|
54
|
+
<section className="demo-panel w-full max-w-2xl">
|
|
55
|
+
<DBConnectionError />
|
|
56
|
+
</section>
|
|
57
|
+
</main>
|
|
58
|
+
)
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
return (
|
|
56
|
-
<
|
|
57
|
-
className="
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
<div className="relative">
|
|
66
|
-
<div className="absolute -inset-1 bg-gradient-to-r from-emerald-400 to-cyan-400 rounded-lg blur opacity-75 group-hover:opacity-100 transition duration-1000"></div>
|
|
67
|
-
<div className="relative">
|
|
68
|
-
<img
|
|
69
|
-
src="/demo-neon.svg"
|
|
70
|
-
alt="Neon Logo"
|
|
71
|
-
className="w-12 h-12 transform hover:scale-110 transition-transform duration-200"
|
|
72
|
-
/>
|
|
73
|
-
</div>
|
|
62
|
+
<main className="demo-page demo-center">
|
|
63
|
+
<section className="demo-panel w-full max-w-2xl">
|
|
64
|
+
<header className="mb-8 flex items-center gap-4">
|
|
65
|
+
<span className="demo-card flex h-14 w-14 items-center justify-center p-3">
|
|
66
|
+
<img src="/demo-neon.svg" alt="Neon Logo" className="h-8 w-8" />
|
|
67
|
+
</span>
|
|
68
|
+
<div>
|
|
69
|
+
<p className="island-kicker mb-2">Database</p>
|
|
70
|
+
<h1 className="demo-title">Neon Demo</h1>
|
|
74
71
|
</div>
|
|
75
|
-
|
|
76
|
-
Neon Database Demo
|
|
77
|
-
</h1>
|
|
78
|
-
</div>
|
|
72
|
+
</header>
|
|
79
73
|
{todos && (
|
|
80
74
|
<>
|
|
81
|
-
<
|
|
75
|
+
<h2 className="demo-section-title mb-4">Todos</h2>
|
|
82
76
|
<ul className="space-y-3 mb-6">
|
|
83
77
|
{todos.map((todo: { id: number; title: string }) => (
|
|
84
|
-
<li
|
|
85
|
-
key={todo.id}
|
|
86
|
-
className="bg-white/10 backdrop-blur-sm rounded-lg p-4 shadow-sm border border-white/20 transition-all hover:bg-white/20 hover:scale-[1.02] cursor-pointer group"
|
|
87
|
-
>
|
|
78
|
+
<li key={todo.id} className="demo-list-item">
|
|
88
79
|
<div className="flex items-center justify-between">
|
|
89
|
-
<span className="
|
|
90
|
-
|
|
91
|
-
</span>
|
|
92
|
-
<span className="text-xs text-white/50">#{todo.id}</span>
|
|
80
|
+
<span className="font-medium">{todo.title}</span>
|
|
81
|
+
<span className="demo-muted text-xs">#{todo.id}</span>
|
|
93
82
|
</div>
|
|
94
83
|
</li>
|
|
95
84
|
))}
|
|
96
85
|
</ul>
|
|
97
|
-
<form
|
|
86
|
+
<form
|
|
87
|
+
onSubmit={handleSubmit}
|
|
88
|
+
className="mt-4 flex flex-col gap-2 sm:flex-row"
|
|
89
|
+
>
|
|
98
90
|
<input
|
|
99
91
|
type="text"
|
|
100
92
|
name="title"
|
|
101
|
-
className="
|
|
93
|
+
className="demo-input min-w-0 flex-1"
|
|
102
94
|
/>
|
|
103
|
-
<button
|
|
104
|
-
type="submit"
|
|
105
|
-
className="px-6 py-2 bg-[#00E0D9] text-black font-medium rounded-md hover:bg-[#00E0D9]/80 focus:outline-none focus:ring-2 focus:ring-[#00E0D9] focus:ring-offset-2 transition-colors disabled:opacity-50 whitespace-nowrap"
|
|
106
|
-
>
|
|
95
|
+
<button type="submit" className="demo-button whitespace-nowrap">
|
|
107
96
|
Add Todo
|
|
108
97
|
</button>
|
|
109
98
|
</form>
|
|
110
99
|
</>
|
|
111
100
|
)}
|
|
112
|
-
</
|
|
113
|
-
</
|
|
101
|
+
</section>
|
|
102
|
+
</main>
|
|
114
103
|
)
|
|
115
104
|
}
|
|
116
105
|
|
|
@@ -134,31 +123,23 @@ function DBConnectionError() {
|
|
|
134
123
|
</svg>
|
|
135
124
|
</div>
|
|
136
125
|
<h2 className="text-2xl font-bold mb-4">Database Connection Issue</h2>
|
|
137
|
-
<div className="text-lg mb-6">
|
|
138
|
-
|
|
126
|
+
<div className="demo-muted text-lg mb-6">
|
|
127
|
+
The Neon database is not connected.
|
|
128
|
+
</div>
|
|
129
|
+
<div className="demo-card max-w-xl mx-auto text-left">
|
|
139
130
|
<h3 className="text-lg font-semibold mb-4">Required Steps to Fix:</h3>
|
|
140
131
|
<ul className="space-y-4 text-left list-none">
|
|
141
132
|
<li className="flex items-start">
|
|
142
|
-
<span className="
|
|
143
|
-
1
|
|
144
|
-
</span>
|
|
133
|
+
<span className="demo-pill mr-3 min-w-8 justify-center">1</span>
|
|
145
134
|
<div>
|
|
146
|
-
Use the
|
|
147
|
-
<code className="bg-black/30 px-2 py-1 rounded">db/init.sql</code>{' '}
|
|
148
|
-
file to create the database
|
|
135
|
+
Use the <code>db/init.sql</code> file to create the database
|
|
149
136
|
</div>
|
|
150
137
|
</li>
|
|
151
138
|
<li className="flex items-start">
|
|
152
|
-
<span className="
|
|
153
|
-
2
|
|
154
|
-
</span>
|
|
139
|
+
<span className="demo-pill mr-3 min-w-8 justify-center">2</span>
|
|
155
140
|
<div>
|
|
156
|
-
Set the
|
|
157
|
-
|
|
158
|
-
DATABASE_URL
|
|
159
|
-
</code>{' '}
|
|
160
|
-
environment variable to the connection string of your Neon
|
|
161
|
-
database
|
|
141
|
+
Set the <code>DATABASE_URL</code> environment variable to the
|
|
142
|
+
connection string of your Neon database
|
|
162
143
|
</div>
|
|
163
144
|
</li>
|
|
164
145
|
</ul>
|
|
@@ -36,22 +36,14 @@ function ORPCTodos() {
|
|
|
36
36
|
}, [addTodo, todo])
|
|
37
37
|
|
|
38
38
|
return (
|
|
39
|
-
<
|
|
40
|
-
className="
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
'radial-gradient(50% 50% at 50% 50%, #D2149D 0%, #8E1066 50%, #2D0A1F 100%)',
|
|
44
|
-
}}
|
|
45
|
-
>
|
|
46
|
-
<div className="w-full max-w-2xl p-8 rounded-xl backdrop-blur-md bg-black/50 shadow-xl border-8 border-black/10">
|
|
47
|
-
<h1 className="text-2xl mb-4">oRPC Todos list</h1>
|
|
39
|
+
<main className="demo-page demo-center">
|
|
40
|
+
<section className="demo-panel w-full max-w-2xl">
|
|
41
|
+
<p className="island-kicker mb-2">oRPC</p>
|
|
42
|
+
<h1 className="demo-title mb-6">Todos</h1>
|
|
48
43
|
<ul className="mb-4 space-y-2">
|
|
49
44
|
{data?.map((t) => (
|
|
50
|
-
<li
|
|
51
|
-
|
|
52
|
-
className="bg-white/10 border border-white/20 rounded-lg p-3 backdrop-blur-sm shadow-md"
|
|
53
|
-
>
|
|
54
|
-
<span className="text-lg text-white">{t.name}</span>
|
|
45
|
+
<li key={t.id} className="demo-list-item">
|
|
46
|
+
<span className="text-base font-medium">{t.name}</span>
|
|
55
47
|
</li>
|
|
56
48
|
))}
|
|
57
49
|
</ul>
|
|
@@ -66,17 +58,17 @@ function ORPCTodos() {
|
|
|
66
58
|
}
|
|
67
59
|
}}
|
|
68
60
|
placeholder="Enter a new todo..."
|
|
69
|
-
className="
|
|
61
|
+
className="demo-input"
|
|
70
62
|
/>
|
|
71
63
|
<button
|
|
72
64
|
disabled={todo.trim().length === 0}
|
|
73
65
|
onClick={submitTodo}
|
|
74
|
-
className="
|
|
66
|
+
className="demo-button"
|
|
75
67
|
>
|
|
76
68
|
Add todo
|
|
77
69
|
</button>
|
|
78
70
|
</div>
|
|
79
|
-
</
|
|
80
|
-
</
|
|
71
|
+
</section>
|
|
72
|
+
</main>
|
|
81
73
|
)
|
|
82
74
|
}
|
|
@@ -9,16 +9,15 @@ export const Route = createFileRoute("/demo/i18n")({
|
|
|
9
9
|
|
|
10
10
|
function App() {
|
|
11
11
|
return (
|
|
12
|
-
<
|
|
13
|
-
<
|
|
12
|
+
<main className="demo-page demo-center text-center">
|
|
13
|
+
<section className="demo-panel flex w-full max-w-2xl flex-col items-center gap-4">
|
|
14
14
|
<img
|
|
15
15
|
src={logo}
|
|
16
|
-
className="
|
|
16
|
+
className="pointer-events-none h-28 animate-[spin_20s_linear_infinite]"
|
|
17
17
|
alt="logo"
|
|
18
18
|
/>
|
|
19
|
-
<p>{m.example_message({ username: "TanStack Router" })}</p>
|
|
19
|
+
<p className="demo-muted text-lg">{m.example_message({ username: "TanStack Router" })}</p>
|
|
20
20
|
<a
|
|
21
|
-
className="text-[#61dafb] hover:underline"
|
|
22
21
|
href="https://inlang.com/m/gerre34r/library-inlang-paraglideJs"
|
|
23
22
|
target="_blank"
|
|
24
23
|
rel="noopener noreferrer"
|
|
@@ -28,7 +27,7 @@ function App() {
|
|
|
28
27
|
<div className="mt-3">
|
|
29
28
|
<LocaleSwitcher />
|
|
30
29
|
</div>
|
|
31
|
-
</
|
|
32
|
-
</
|
|
30
|
+
</section>
|
|
31
|
+
</main>
|
|
33
32
|
);
|
|
34
33
|
}
|