@tanstack/cta-ui 0.10.0-alpha.26 → 0.10.0-alpha.28
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/README.md +20 -0
- package/dist/assets/index-BeVre1U8.js +213 -0
- package/dist/assets/index-BeVre1U8.js.map +1 -0
- package/dist/assets/index-Co-Y5wb2.css +1 -0
- package/dist/index.html +9 -3
- package/dist/logo-color-100w.png +0 -0
- package/index.html +7 -1
- package/lib/engine-handling/add-to-app-wrapper.ts +39 -15
- package/lib/engine-handling/create-app-wrapper.ts +17 -6
- package/lib/engine-handling/file-helpers.ts +4 -2
- package/lib/engine-handling/generate-initial-payload.ts +58 -51
- package/lib/index.ts +11 -1
- package/lib/types.d.ts +18 -11
- package/lib-dist/engine-handling/add-to-app-wrapper.d.ts +2 -0
- package/lib-dist/engine-handling/add-to-app-wrapper.js +14 -9
- package/lib-dist/engine-handling/create-app-wrapper.d.ts +2 -1
- package/lib-dist/engine-handling/create-app-wrapper.js +6 -4
- package/lib-dist/engine-handling/file-helpers.js +3 -2
- package/lib-dist/engine-handling/generate-initial-payload.d.ts +14 -22
- package/lib-dist/engine-handling/generate-initial-payload.js +44 -49
- package/lib-dist/index.d.ts +2 -0
- package/lib-dist/index.js +6 -1
- package/package.json +6 -4
- package/public/logo-color-100w.png +0 -0
- package/src/components/background-animation.tsx +229 -0
- package/src/components/cta-sidebar.tsx +28 -33
- package/src/components/file-navigator.tsx +72 -74
- package/src/components/header.tsx +31 -0
- package/src/components/sidebar-items/add-ons.tsx +48 -45
- package/src/components/sidebar-items/mode-selector.tsx +6 -4
- package/src/components/sidebar-items/project-name.tsx +4 -5
- package/src/components/sidebar-items/typescript-switch.tsx +3 -3
- package/src/components/startup-dialog.tsx +4 -6
- package/src/components/ui/switch.tsx +6 -6
- package/src/hooks/use-mounted.ts +9 -0
- package/src/hooks/use-preferred-reduced-motion.ts +27 -0
- package/src/index.tsx +19 -20
- package/src/store/project.ts +36 -20
- package/src/styles.css +90 -18
- package/src/types.d.ts +1 -1
- package/tailwind.config.cjs +47 -0
- package/dist/assets/index-D0-fpgzI.js +0 -223
- package/dist/assets/index-D0-fpgzI.js.map +0 -1
- package/dist/assets/index-D5brMzJg.css +0 -1
package/src/store/project.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useMemo } from 'react'
|
|
1
|
+
import { useCallback, useEffect, useMemo } from 'react'
|
|
2
2
|
import { create } from 'zustand'
|
|
3
3
|
import { persist } from 'zustand/middleware'
|
|
4
4
|
import { useQuery } from '@tanstack/react-query'
|
|
@@ -10,6 +10,18 @@ import type { Mode, SerializedOptions } from '@tanstack/cta-engine'
|
|
|
10
10
|
import type { AddOnInfo, DryRunOutput, StarterInfo } from '@/types.js'
|
|
11
11
|
import { dryRunAddToApp, dryRunCreateApp, loadInitialData } from '@/lib/api'
|
|
12
12
|
|
|
13
|
+
export const useProjectOptions = create<SerializedOptions>(() => ({
|
|
14
|
+
framework: 'react-cra',
|
|
15
|
+
mode: 'file-router',
|
|
16
|
+
projectName: 'my-app',
|
|
17
|
+
targetDir: 'my-app',
|
|
18
|
+
typescript: true,
|
|
19
|
+
tailwind: true,
|
|
20
|
+
git: true,
|
|
21
|
+
chosenAddOns: [],
|
|
22
|
+
packageManager: 'pnpm',
|
|
23
|
+
}))
|
|
24
|
+
|
|
13
25
|
const useInitialData = () =>
|
|
14
26
|
useQuery({
|
|
15
27
|
queryKey: ['initial-data'],
|
|
@@ -18,8 +30,8 @@ const useInitialData = () =>
|
|
|
18
30
|
options: {
|
|
19
31
|
framework: 'react-cra',
|
|
20
32
|
mode: 'file-router',
|
|
21
|
-
projectName: 'my-
|
|
22
|
-
targetDir: 'my-
|
|
33
|
+
projectName: 'my-app',
|
|
34
|
+
targetDir: 'my-app',
|
|
23
35
|
typescript: true,
|
|
24
36
|
tailwind: true,
|
|
25
37
|
git: true,
|
|
@@ -50,8 +62,8 @@ export const useRegistry = () => useInitialData().data.registry
|
|
|
50
62
|
|
|
51
63
|
export const useProjectLocalFiles = () => useInitialData().data.localFiles
|
|
52
64
|
export const useOriginalOutput = () => useInitialData().data.output
|
|
53
|
-
export const
|
|
54
|
-
|
|
65
|
+
export const useOriginalOptions = () => useInitialData().data.options
|
|
66
|
+
export const useOriginalSelectedAddOns = () => useOriginalOptions().chosenAddOns
|
|
55
67
|
export const useApplicationMode = () => useInitialData().data.applicationMode
|
|
56
68
|
export const useReady = () => useInitialData().isFetched
|
|
57
69
|
export const useCodeRouterAddOns = () =>
|
|
@@ -59,18 +71,6 @@ export const useCodeRouterAddOns = () =>
|
|
|
59
71
|
export const useFileRouterAddOns = () =>
|
|
60
72
|
useInitialData().data.addOns['file-router']
|
|
61
73
|
|
|
62
|
-
export const useProjectOptions = create<SerializedOptions>(() => ({
|
|
63
|
-
framework: 'react-cra',
|
|
64
|
-
mode: 'file-router',
|
|
65
|
-
projectName: 'my-app',
|
|
66
|
-
targetDir: 'my-app',
|
|
67
|
-
typescript: true,
|
|
68
|
-
tailwind: true,
|
|
69
|
-
git: true,
|
|
70
|
-
chosenAddOns: [],
|
|
71
|
-
packageManager: 'pnpm',
|
|
72
|
-
}))
|
|
73
|
-
|
|
74
74
|
const useApplicationSettings = create<{
|
|
75
75
|
includeFiles: Array<string>
|
|
76
76
|
}>(() => ({
|
|
@@ -128,7 +128,7 @@ export function useAddOns() {
|
|
|
128
128
|
for (const addOn of originalSelectedAddOns) {
|
|
129
129
|
originalAddOns.add(addOn)
|
|
130
130
|
}
|
|
131
|
-
for (const addOn of forcedAddOns) {
|
|
131
|
+
for (const addOn of forcedAddOns || []) {
|
|
132
132
|
originalAddOns.add(addOn)
|
|
133
133
|
}
|
|
134
134
|
return getAddOnStatus(
|
|
@@ -148,7 +148,7 @@ export function useAddOns() {
|
|
|
148
148
|
const addOns = new Set(
|
|
149
149
|
Object.keys(addOnState).filter((addOn) => addOnState[addOn].selected),
|
|
150
150
|
)
|
|
151
|
-
for (const addOn of forcedAddOns) {
|
|
151
|
+
for (const addOn of forcedAddOns || []) {
|
|
152
152
|
addOns.add(addOn)
|
|
153
153
|
}
|
|
154
154
|
return Array.from(addOns)
|
|
@@ -156,7 +156,7 @@ export function useAddOns() {
|
|
|
156
156
|
|
|
157
157
|
const toggleAddOn = useCallback(
|
|
158
158
|
(addOnId: string) => {
|
|
159
|
-
if (addOnState[addOnId]
|
|
159
|
+
if (addOnState[addOnId].enabled) {
|
|
160
160
|
if (addOnState[addOnId].selected) {
|
|
161
161
|
useMutableAddOns.setState((state) => ({
|
|
162
162
|
userSelectedAddOns: state.userSelectedAddOns.filter(
|
|
@@ -328,4 +328,20 @@ export function setProjectStarter(starter: StarterInfo | undefined) {
|
|
|
328
328
|
useProjectStarter.setState(() => ({
|
|
329
329
|
projectStarter: starter,
|
|
330
330
|
}))
|
|
331
|
+
if (starter) {
|
|
332
|
+
useProjectOptions.setState({
|
|
333
|
+
mode: starter.mode,
|
|
334
|
+
})
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export function useManager() {
|
|
339
|
+
const ready = useReady()
|
|
340
|
+
const originalOptions = useOriginalOptions()
|
|
341
|
+
|
|
342
|
+
useEffect(() => {
|
|
343
|
+
if (ready) {
|
|
344
|
+
useProjectOptions.setState(originalOptions)
|
|
345
|
+
}
|
|
346
|
+
}, [ready])
|
|
331
347
|
}
|
package/src/styles.css
CHANGED
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
@import 'tailwindcss';
|
|
2
|
+
@layer theme, base, components, utilities;
|
|
2
3
|
|
|
3
4
|
@plugin "tailwindcss-animate";
|
|
4
5
|
|
|
5
6
|
@source inline("bg-green-500");
|
|
6
7
|
|
|
7
|
-
@custom-variant dark (&:
|
|
8
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
8
9
|
|
|
9
10
|
body {
|
|
10
11
|
@apply m-0;
|
|
11
12
|
font-family:
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
'Inter',
|
|
14
|
+
ui-sans-serif,
|
|
15
|
+
system-ui,
|
|
16
|
+
sans-serif,
|
|
17
|
+
'Apple Color Emoji',
|
|
18
|
+
'Segoe UI Emoji',
|
|
19
|
+
Segoe UI Symbol,
|
|
20
|
+
'Noto Color Emoji';
|
|
14
21
|
-webkit-font-smoothing: antialiased;
|
|
15
22
|
-moz-osx-font-smoothing: grayscale;
|
|
16
23
|
}
|
|
17
24
|
|
|
18
25
|
code {
|
|
26
|
+
font-size: 12px;
|
|
19
27
|
font-family:
|
|
20
|
-
|
|
28
|
+
'JetBrains Mono',
|
|
29
|
+
Menlo,
|
|
30
|
+
Monaco,
|
|
31
|
+
Consolas,
|
|
32
|
+
monospace,
|
|
33
|
+
Courier New;
|
|
34
|
+
white-space: pre;
|
|
35
|
+
-webkit-overflow-scrolling: touch;
|
|
21
36
|
}
|
|
22
37
|
|
|
23
38
|
:root {
|
|
@@ -57,7 +72,7 @@ code {
|
|
|
57
72
|
}
|
|
58
73
|
|
|
59
74
|
.dark {
|
|
60
|
-
--background:
|
|
75
|
+
--background: rgb(3, 7, 18);
|
|
61
76
|
--foreground: oklch(0.985 0 0);
|
|
62
77
|
--card: oklch(0.141 0.005 285.823);
|
|
63
78
|
--card-foreground: oklch(0.985 0 0);
|
|
@@ -155,25 +170,74 @@ code {
|
|
|
155
170
|
}
|
|
156
171
|
|
|
157
172
|
@layer base {
|
|
173
|
+
html,
|
|
174
|
+
body {
|
|
175
|
+
@apply text-gray-900 bg-gray-50 dark:bg-black dark:text-gray-200;
|
|
176
|
+
background: rgb(3, 7, 18);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.using-mouse * {
|
|
180
|
+
outline: none !important;
|
|
181
|
+
}
|
|
182
|
+
|
|
158
183
|
* {
|
|
159
|
-
|
|
184
|
+
scrollbar-color: theme(colors.gray.400) theme(colors.gray.100);
|
|
160
185
|
}
|
|
161
|
-
|
|
162
|
-
|
|
186
|
+
|
|
187
|
+
*::-webkit-scrollbar,
|
|
188
|
+
* scrollbar {
|
|
189
|
+
width: 1rem;
|
|
190
|
+
height: 1rem;
|
|
163
191
|
}
|
|
164
|
-
}
|
|
165
192
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
193
|
+
*::-webkit-scrollbar-track,
|
|
194
|
+
* scrollbar-track {
|
|
195
|
+
background: theme(colors.gray.100);
|
|
196
|
+
}
|
|
170
197
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
198
|
+
*::-webkit-scrollbar-thumb,
|
|
199
|
+
* scrollbar-thumb {
|
|
200
|
+
background: theme(colors.gray.300);
|
|
201
|
+
border-radius: 0.5rem;
|
|
202
|
+
border: 3px solid theme(colors.gray.100);
|
|
203
|
+
}
|
|
174
204
|
|
|
175
|
-
|
|
176
|
-
|
|
205
|
+
html.dark {
|
|
206
|
+
&,
|
|
207
|
+
* {
|
|
208
|
+
color-scheme: dark;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
&,
|
|
212
|
+
* {
|
|
213
|
+
scrollbar-color: theme(colors.gray.700) theme(colors.gray.800);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
&::-webkit-scrollbar,
|
|
217
|
+
*::-webkit-scrollbar,
|
|
218
|
+
* scrollbar {
|
|
219
|
+
width: 1rem;
|
|
220
|
+
height: 1rem;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
& *::-webkit-scrollbar-track,
|
|
224
|
+
*::-webkit-scrollbar-track,
|
|
225
|
+
* scrollbar-track {
|
|
226
|
+
background: theme(colors.gray.800);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
&::-webkit-scrollbar-thumb,
|
|
230
|
+
*::-webkit-scrollbar-thumb,
|
|
231
|
+
* scrollbar-thumb {
|
|
232
|
+
background: theme(colors.gray.600);
|
|
233
|
+
border-radius: 0.5rem;
|
|
234
|
+
border: 3px solid theme(colors.gray.800);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
[disabled] {
|
|
239
|
+
@apply opacity-50 pointer-events-none;
|
|
240
|
+
}
|
|
177
241
|
}
|
|
178
242
|
|
|
179
243
|
.cm-changedLine {
|
|
@@ -183,3 +247,11 @@ code {
|
|
|
183
247
|
.file-filters {
|
|
184
248
|
background-color: oklch(0.2 0.005 285.823);
|
|
185
249
|
}
|
|
250
|
+
|
|
251
|
+
.font-black {
|
|
252
|
+
font-weight: 900;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.font-medium {
|
|
256
|
+
font-weight: 800;
|
|
257
|
+
}
|
package/src/types.d.ts
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
content: ['./src/**/*.{js,ts,jsx,tsx}', './index.html'],
|
|
4
|
+
plugins: [require('@tailwindcss/typography')],
|
|
5
|
+
darkMode: 'class',
|
|
6
|
+
theme: {
|
|
7
|
+
extend: {
|
|
8
|
+
fontFamily: {
|
|
9
|
+
sans: `"Inter", ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"`,
|
|
10
|
+
},
|
|
11
|
+
zIndex: {
|
|
12
|
+
'-10': '-10',
|
|
13
|
+
},
|
|
14
|
+
boxShadow: {
|
|
15
|
+
sm: '0 1px 2px 0 rgba(0, 0, 0, 0.03)',
|
|
16
|
+
DEFAULT:
|
|
17
|
+
'0 1px 3px 0 rgba(0, 0, 0, 0.05), 0 1px 2px 0 rgba(0, 0, 0, 0.03)',
|
|
18
|
+
md: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
|
|
19
|
+
lg: '0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.03)',
|
|
20
|
+
xl: '0 20px 25px -5px rgba(0, 0, 0, 0.05), 0 10px 10px -5px rgba(0, 0, 0, 0.02)',
|
|
21
|
+
'2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.2)',
|
|
22
|
+
'3xl': '0 35px 60px -15px rgba(0, 0, 0, 0.25)',
|
|
23
|
+
inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.04)',
|
|
24
|
+
none: 'none',
|
|
25
|
+
},
|
|
26
|
+
aria: {
|
|
27
|
+
current: 'current="location"',
|
|
28
|
+
},
|
|
29
|
+
colors: {
|
|
30
|
+
twine: {
|
|
31
|
+
50: '#f8f5ee',
|
|
32
|
+
100: '#eee6d3',
|
|
33
|
+
200: '#dfcda9',
|
|
34
|
+
300: '#cdac77',
|
|
35
|
+
400: '#bd9051',
|
|
36
|
+
500: '#ae7d44',
|
|
37
|
+
600: '#956339',
|
|
38
|
+
700: '#784b30',
|
|
39
|
+
800: '#653f2e',
|
|
40
|
+
900: '#58362b',
|
|
41
|
+
950: '#321c16',
|
|
42
|
+
},
|
|
43
|
+
discord: '#536bbd',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
}
|