@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.
Files changed (44) hide show
  1. package/README.md +20 -0
  2. package/dist/assets/index-BeVre1U8.js +213 -0
  3. package/dist/assets/index-BeVre1U8.js.map +1 -0
  4. package/dist/assets/index-Co-Y5wb2.css +1 -0
  5. package/dist/index.html +9 -3
  6. package/dist/logo-color-100w.png +0 -0
  7. package/index.html +7 -1
  8. package/lib/engine-handling/add-to-app-wrapper.ts +39 -15
  9. package/lib/engine-handling/create-app-wrapper.ts +17 -6
  10. package/lib/engine-handling/file-helpers.ts +4 -2
  11. package/lib/engine-handling/generate-initial-payload.ts +58 -51
  12. package/lib/index.ts +11 -1
  13. package/lib/types.d.ts +18 -11
  14. package/lib-dist/engine-handling/add-to-app-wrapper.d.ts +2 -0
  15. package/lib-dist/engine-handling/add-to-app-wrapper.js +14 -9
  16. package/lib-dist/engine-handling/create-app-wrapper.d.ts +2 -1
  17. package/lib-dist/engine-handling/create-app-wrapper.js +6 -4
  18. package/lib-dist/engine-handling/file-helpers.js +3 -2
  19. package/lib-dist/engine-handling/generate-initial-payload.d.ts +14 -22
  20. package/lib-dist/engine-handling/generate-initial-payload.js +44 -49
  21. package/lib-dist/index.d.ts +2 -0
  22. package/lib-dist/index.js +6 -1
  23. package/package.json +6 -4
  24. package/public/logo-color-100w.png +0 -0
  25. package/src/components/background-animation.tsx +229 -0
  26. package/src/components/cta-sidebar.tsx +28 -33
  27. package/src/components/file-navigator.tsx +72 -74
  28. package/src/components/header.tsx +31 -0
  29. package/src/components/sidebar-items/add-ons.tsx +48 -45
  30. package/src/components/sidebar-items/mode-selector.tsx +6 -4
  31. package/src/components/sidebar-items/project-name.tsx +4 -5
  32. package/src/components/sidebar-items/typescript-switch.tsx +3 -3
  33. package/src/components/startup-dialog.tsx +4 -6
  34. package/src/components/ui/switch.tsx +6 -6
  35. package/src/hooks/use-mounted.ts +9 -0
  36. package/src/hooks/use-preferred-reduced-motion.ts +27 -0
  37. package/src/index.tsx +19 -20
  38. package/src/store/project.ts +36 -20
  39. package/src/styles.css +90 -18
  40. package/src/types.d.ts +1 -1
  41. package/tailwind.config.cjs +47 -0
  42. package/dist/assets/index-D0-fpgzI.js +0 -223
  43. package/dist/assets/index-D0-fpgzI.js.map +0 -1
  44. package/dist/assets/index-D5brMzJg.css +0 -1
@@ -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-application',
22
- targetDir: 'my-application',
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 useOriginalSelectedAddOns = () =>
54
- useInitialData().data.options.chosenAddOns
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] && addOnState[addOnId].enabled) {
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 (&:is(.dark *));
8
+ @custom-variant dark (&:where(.dark, .dark *));
8
9
 
9
10
  body {
10
11
  @apply m-0;
11
12
  font-family:
12
- -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',
13
- 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
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
- source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
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: oklch(0.141 0.005 285.823);
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
- @apply border-border outline-ring/50;
184
+ scrollbar-color: theme(colors.gray.400) theme(colors.gray.100);
160
185
  }
161
- body {
162
- @apply bg-background text-foreground;
186
+
187
+ *::-webkit-scrollbar,
188
+ * scrollbar {
189
+ width: 1rem;
190
+ height: 1rem;
163
191
  }
164
- }
165
192
 
166
- [data-sidebar='group'] {
167
- background-color: hsl(240 5.9% 6%) !important;
168
- @apply mb-2 rounded-lg inset-shadow-gray-600 inset-shadow-sm;
169
- }
193
+ *::-webkit-scrollbar-track,
194
+ * scrollbar-track {
195
+ background: theme(colors.gray.100);
196
+ }
170
197
 
171
- [data-sidebar='content'] {
172
- @apply p-2 pt-5;
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
- [data-sidebar='header'] {
176
- @apply shadow-gray-700 shadow-md z-50;
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
@@ -80,7 +80,7 @@ export type InitialData = {
80
80
  applicationMode: ApplicationMode
81
81
  forcedRouterMode?: Mode
82
82
  forcedAddOns?: Array<string>
83
- registry: Registry | undefined
83
+ registry?: Registry | undefined
84
84
  }
85
85
 
86
86
  export type EventItem = {
@@ -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
+ }