@tanstack/create 0.62.1 → 0.62.3
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 +18 -0
- package/dist/frameworks/react/project/base/package.json +4 -7
- package/dist/frameworks/react/project/base/src/components/Header.tsx.ejs +0 -7
- package/dist/frameworks/react/project/base/src/routes/about.tsx.ejs +3 -8
- package/dist/frameworks/react/project/base/src/routes/index.tsx.ejs +7 -7
- package/dist/frameworks/react/project/base/src/styles.css.ejs +0 -18
- package/dist/frameworks/react/project/base/tsconfig.json.ejs +0 -1
- package/dist/frameworks/react/project/base/vite.config.ts.ejs +0 -2
- package/dist/frameworks/solid/project/base/package.json +3 -2
- package/dist/frameworks/solid/project/base/src/components/Header.tsx.ejs +51 -138
- package/dist/frameworks/solid/project/base/src/routes/__root.tsx.ejs +2 -5
- package/dist/frameworks/solid/project/base/src/routes/about.tsx.ejs +22 -0
- package/dist/frameworks/solid/project/base/src/routes/index.tsx.ejs +59 -94
- package/dist/frameworks/solid/project/base/src/styles.css.ejs +187 -7
- package/dist/frameworks/solid/project/base/vite.config.ts.ejs +1 -2
- package/dist/package-json.js +23 -1
- package/dist/types/package-json.d.ts +1 -5
- package/package.json +1 -1
- package/src/frameworks/react/project/base/package.json +4 -7
- package/src/frameworks/react/project/base/src/components/Header.tsx.ejs +0 -7
- package/src/frameworks/react/project/base/src/routes/about.tsx.ejs +3 -8
- package/src/frameworks/react/project/base/src/routes/index.tsx.ejs +7 -7
- package/src/frameworks/react/project/base/src/styles.css.ejs +0 -18
- package/src/frameworks/react/project/base/tsconfig.json.ejs +0 -1
- package/src/frameworks/react/project/base/vite.config.ts.ejs +0 -2
- package/src/frameworks/solid/project/base/package.json +3 -2
- package/src/frameworks/solid/project/base/src/components/Header.tsx.ejs +51 -138
- package/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs +2 -5
- package/src/frameworks/solid/project/base/src/routes/about.tsx.ejs +22 -0
- package/src/frameworks/solid/project/base/src/routes/index.tsx.ejs +59 -94
- package/src/frameworks/solid/project/base/src/styles.css.ejs +187 -7
- package/src/frameworks/solid/project/base/vite.config.ts.ejs +1 -2
- package/src/package-json.ts +32 -1
- package/tests/package-json.test.ts +32 -0
- package/dist/frameworks/react/project/base/content/blog/fifth-post.mdx.ejs +0 -54
- package/dist/frameworks/react/project/base/content/blog/first-post.md.ejs +0 -47
- package/dist/frameworks/react/project/base/content/blog/fourth-post.md.ejs +0 -42
- package/dist/frameworks/react/project/base/content/blog/second-post.mdx.ejs +0 -46
- package/dist/frameworks/react/project/base/content/blog/third-post.md.ejs +0 -49
- package/dist/frameworks/react/project/base/content-collections.ts.ejs +0 -37
- package/dist/frameworks/react/project/base/public/images/lagoon-1.svg +0 -13
- package/dist/frameworks/react/project/base/public/images/lagoon-2.svg +0 -12
- package/dist/frameworks/react/project/base/public/images/lagoon-3.svg +0 -12
- package/dist/frameworks/react/project/base/public/images/lagoon-4.svg +0 -12
- package/dist/frameworks/react/project/base/public/images/lagoon-5.svg +0 -12
- package/dist/frameworks/react/project/base/public/images/lagoon-about.svg +0 -14
- package/dist/frameworks/react/project/base/public/tanstack-circle-logo.png +0 -0
- package/dist/frameworks/react/project/base/public/tanstack-word-logo-white.svg +0 -1
- package/dist/frameworks/react/project/base/src/components/MdxCallout.tsx.ejs +0 -16
- package/dist/frameworks/react/project/base/src/components/MdxMetrics.tsx.ejs +0 -23
- package/dist/frameworks/react/project/base/src/lib/site.ts.ejs +0 -4
- package/dist/frameworks/react/project/base/src/routes/blog.$slug.tsx.ejs +0 -71
- package/dist/frameworks/react/project/base/src/routes/blog.index.tsx.ejs +0 -93
- package/dist/frameworks/react/project/base/src/routes/rss[.]xml.ts.ejs +0 -35
- package/src/frameworks/react/project/base/content/blog/fifth-post.mdx.ejs +0 -54
- package/src/frameworks/react/project/base/content/blog/first-post.md.ejs +0 -47
- package/src/frameworks/react/project/base/content/blog/fourth-post.md.ejs +0 -42
- package/src/frameworks/react/project/base/content/blog/second-post.mdx.ejs +0 -46
- package/src/frameworks/react/project/base/content/blog/third-post.md.ejs +0 -49
- package/src/frameworks/react/project/base/content-collections.ts.ejs +0 -37
- package/src/frameworks/react/project/base/public/images/lagoon-1.svg +0 -13
- package/src/frameworks/react/project/base/public/images/lagoon-2.svg +0 -12
- package/src/frameworks/react/project/base/public/images/lagoon-3.svg +0 -12
- package/src/frameworks/react/project/base/public/images/lagoon-4.svg +0 -12
- package/src/frameworks/react/project/base/public/images/lagoon-5.svg +0 -12
- package/src/frameworks/react/project/base/public/images/lagoon-about.svg +0 -14
- package/src/frameworks/react/project/base/public/tanstack-circle-logo.png +0 -0
- package/src/frameworks/react/project/base/public/tanstack-word-logo-white.svg +0 -1
- package/src/frameworks/react/project/base/src/components/MdxCallout.tsx.ejs +0 -16
- package/src/frameworks/react/project/base/src/components/MdxMetrics.tsx.ejs +0 -23
- package/src/frameworks/react/project/base/src/lib/site.ts.ejs +0 -4
- package/src/frameworks/react/project/base/src/routes/blog.$slug.tsx.ejs +0 -71
- package/src/frameworks/react/project/base/src/routes/blog.index.tsx.ejs +0 -93
- package/src/frameworks/react/project/base/src/routes/rss[.]xml.ts.ejs +0 -35
|
@@ -1,15 +1,195 @@
|
|
|
1
|
-
@import
|
|
1
|
+
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,700&family=Manrope:wght@400;500;600;700;800&display=swap');
|
|
2
|
+
@import 'tailwindcss';
|
|
3
|
+
|
|
4
|
+
:root {
|
|
5
|
+
--sea-ink: #173a40;
|
|
6
|
+
--sea-ink-soft: #416166;
|
|
7
|
+
--lagoon: #4fb8b2;
|
|
8
|
+
--lagoon-deep: #328f97;
|
|
9
|
+
--palm: #2f6a4a;
|
|
10
|
+
--sand: #e7f0e8;
|
|
11
|
+
--foam: #f3faf5;
|
|
12
|
+
--surface: rgba(255, 255, 255, 0.74);
|
|
13
|
+
--surface-strong: rgba(255, 255, 255, 0.9);
|
|
14
|
+
--line: rgba(23, 58, 64, 0.14);
|
|
15
|
+
--inset-glint: rgba(255, 255, 255, 0.82);
|
|
16
|
+
--kicker: rgba(47, 106, 74, 0.9);
|
|
17
|
+
--bg-base: #e7f3ec;
|
|
18
|
+
--header-bg: rgba(251, 255, 248, 0.84);
|
|
19
|
+
--chip-bg: rgba(255, 255, 255, 0.8);
|
|
20
|
+
--chip-line: rgba(47, 106, 74, 0.18);
|
|
21
|
+
--link-bg-hover: rgba(255, 255, 255, 0.9);
|
|
22
|
+
--hero-a: rgba(79, 184, 178, 0.36);
|
|
23
|
+
--hero-b: rgba(47, 106, 74, 0.2);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
* {
|
|
27
|
+
box-sizing: border-box;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
html,
|
|
31
|
+
body,
|
|
32
|
+
#app {
|
|
33
|
+
min-height: 100%;
|
|
34
|
+
}
|
|
2
35
|
|
|
3
36
|
body {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
37
|
+
margin: 0;
|
|
38
|
+
color: var(--sea-ink);
|
|
39
|
+
font-family: 'Manrope', ui-sans-serif, system-ui, sans-serif;
|
|
40
|
+
background-color: var(--bg-base);
|
|
41
|
+
background:
|
|
42
|
+
radial-gradient(1100px 620px at -8% -10%, var(--hero-a), transparent 58%),
|
|
43
|
+
radial-gradient(1050px 620px at 112% -12%, var(--hero-b), transparent 62%),
|
|
44
|
+
radial-gradient(720px 380px at 50% 115%, rgba(79, 184, 178, 0.1), transparent 68%),
|
|
45
|
+
linear-gradient(
|
|
46
|
+
180deg,
|
|
47
|
+
color-mix(in oklab, var(--sand) 68%, white) 0%,
|
|
48
|
+
var(--foam) 44%,
|
|
49
|
+
var(--bg-base) 100%
|
|
50
|
+
);
|
|
51
|
+
overflow-x: hidden;
|
|
8
52
|
-webkit-font-smoothing: antialiased;
|
|
9
53
|
-moz-osx-font-smoothing: grayscale;
|
|
10
54
|
}
|
|
11
55
|
|
|
56
|
+
a {
|
|
57
|
+
color: var(--lagoon-deep);
|
|
58
|
+
text-decoration-color: rgba(50, 143, 151, 0.4);
|
|
59
|
+
text-decoration-thickness: 1px;
|
|
60
|
+
text-underline-offset: 2px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
a:hover {
|
|
64
|
+
color: #246f76;
|
|
65
|
+
}
|
|
66
|
+
|
|
12
67
|
code {
|
|
13
|
-
font-
|
|
14
|
-
|
|
68
|
+
font-size: 0.9em;
|
|
69
|
+
border: 1px solid var(--line);
|
|
70
|
+
background: color-mix(in oklab, var(--surface-strong) 82%, white 18%);
|
|
71
|
+
border-radius: 7px;
|
|
72
|
+
padding: 2px 7px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.page-wrap {
|
|
76
|
+
width: min(1080px, calc(100% - 2rem));
|
|
77
|
+
margin-inline: auto;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.display-title {
|
|
81
|
+
font-family: 'Fraunces', Georgia, serif;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.island-shell {
|
|
85
|
+
border: 1px solid var(--line);
|
|
86
|
+
background: linear-gradient(165deg, var(--surface-strong), var(--surface));
|
|
87
|
+
box-shadow:
|
|
88
|
+
0 1px 0 var(--inset-glint) inset,
|
|
89
|
+
0 22px 44px rgba(30, 90, 72, 0.1),
|
|
90
|
+
0 6px 18px rgba(23, 58, 64, 0.08);
|
|
91
|
+
backdrop-filter: blur(4px);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.feature-card {
|
|
95
|
+
background: linear-gradient(
|
|
96
|
+
165deg,
|
|
97
|
+
color-mix(in oklab, var(--surface-strong) 93%, white 7%),
|
|
98
|
+
var(--surface)
|
|
99
|
+
);
|
|
100
|
+
box-shadow:
|
|
101
|
+
0 1px 0 var(--inset-glint) inset,
|
|
102
|
+
0 18px 34px rgba(30, 90, 72, 0.1),
|
|
103
|
+
0 4px 14px rgba(23, 58, 64, 0.06);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.site-header {
|
|
107
|
+
position: sticky;
|
|
108
|
+
top: 0;
|
|
109
|
+
z-index: 50;
|
|
110
|
+
border-bottom: 1px solid var(--line);
|
|
111
|
+
background: var(--header-bg);
|
|
112
|
+
backdrop-filter: blur(10px);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.nav-shell {
|
|
116
|
+
display: flex;
|
|
117
|
+
flex-wrap: wrap;
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 0.5rem 0.75rem;
|
|
120
|
+
padding: 0.75rem 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.brand-pill {
|
|
124
|
+
display: inline-flex;
|
|
125
|
+
align-items: center;
|
|
126
|
+
gap: 0.5rem;
|
|
127
|
+
border-radius: 999px;
|
|
128
|
+
border: 1px solid var(--chip-line);
|
|
129
|
+
background: var(--chip-bg);
|
|
130
|
+
padding: 0.5rem 0.875rem;
|
|
131
|
+
color: var(--sea-ink);
|
|
132
|
+
text-decoration: none;
|
|
133
|
+
box-shadow: 0 8px 24px rgba(30, 90, 72, 0.08);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.brand-dot {
|
|
137
|
+
height: 0.5rem;
|
|
138
|
+
width: 0.5rem;
|
|
139
|
+
border-radius: 999px;
|
|
140
|
+
background: linear-gradient(90deg, #56c6be, #7ed3bf);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.island-kicker {
|
|
144
|
+
letter-spacing: 0.16em;
|
|
145
|
+
text-transform: uppercase;
|
|
146
|
+
font-weight: 700;
|
|
147
|
+
font-size: 0.69rem;
|
|
148
|
+
color: var(--kicker);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.nav-link {
|
|
152
|
+
position: relative;
|
|
153
|
+
display: inline-flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
color: var(--sea-ink-soft);
|
|
156
|
+
text-decoration: none;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.nav-link::after {
|
|
160
|
+
content: '';
|
|
161
|
+
position: absolute;
|
|
162
|
+
left: 0;
|
|
163
|
+
bottom: -6px;
|
|
164
|
+
width: 100%;
|
|
165
|
+
height: 2px;
|
|
166
|
+
transform: scaleX(0);
|
|
167
|
+
transform-origin: left;
|
|
168
|
+
background: linear-gradient(90deg, var(--lagoon), #7ed3bf);
|
|
169
|
+
transition: transform 170ms ease;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.nav-link:hover,
|
|
173
|
+
.nav-link.is-active {
|
|
174
|
+
color: var(--sea-ink);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.nav-link:hover::after,
|
|
178
|
+
.nav-link.is-active::after {
|
|
179
|
+
transform: scaleX(1);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.rise-in {
|
|
183
|
+
animation: rise-in 700ms cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@keyframes rise-in {
|
|
187
|
+
from {
|
|
188
|
+
opacity: 0;
|
|
189
|
+
transform: translateY(12px);
|
|
190
|
+
}
|
|
191
|
+
to {
|
|
192
|
+
opacity: 1;
|
|
193
|
+
transform: translateY(0);
|
|
194
|
+
}
|
|
15
195
|
}
|
|
@@ -10,10 +10,9 @@ import { tanstackStart } from "@tanstack/solid-start/plugin/vite";
|
|
|
10
10
|
import solidPlugin from 'vite-plugin-solid';
|
|
11
11
|
<% for(const integration of integrations.filter(i => i.type === 'vite-plugin')) { %><%- integrationImportContent(integration) %>
|
|
12
12
|
<% } %>
|
|
13
|
-
import lucidePreprocess from "vite-plugin-lucide-preprocess";
|
|
14
13
|
|
|
15
14
|
export default defineConfig({
|
|
16
|
-
plugins: [
|
|
15
|
+
plugins: [devtools(), <% for(const integration of integrations.filter(i => i.type === 'vite-plugin')) { %><%- integrationImportCode(integration) %>,<% } %>
|
|
17
16
|
// this is the plugin that enables path aliases
|
|
18
17
|
viteTsConfigPaths({
|
|
19
18
|
projects: ['./tsconfig.json'],
|
package/dist/package-json.js
CHANGED
|
@@ -2,7 +2,7 @@ import { render } from 'ejs';
|
|
|
2
2
|
import { formatCommand, sortObject } from './utils.js';
|
|
3
3
|
import { getPackageManagerExecuteCommand } from './package-manager.js';
|
|
4
4
|
export function mergePackageJSON(packageJSON, overlayPackageJSON) {
|
|
5
|
-
|
|
5
|
+
const mergedPackageJSON = {
|
|
6
6
|
...packageJSON,
|
|
7
7
|
...(overlayPackageJSON || {}),
|
|
8
8
|
dependencies: {
|
|
@@ -18,6 +18,28 @@ export function mergePackageJSON(packageJSON, overlayPackageJSON) {
|
|
|
18
18
|
...(overlayPackageJSON?.scripts || {}),
|
|
19
19
|
},
|
|
20
20
|
};
|
|
21
|
+
const baseOnlyBuiltDependencies = Array.isArray(packageJSON.pnpm?.onlyBuiltDependencies)
|
|
22
|
+
? packageJSON.pnpm.onlyBuiltDependencies
|
|
23
|
+
: [];
|
|
24
|
+
const overlayOnlyBuiltDependencies = Array.isArray(overlayPackageJSON?.pnpm?.onlyBuiltDependencies)
|
|
25
|
+
? overlayPackageJSON.pnpm.onlyBuiltDependencies
|
|
26
|
+
: [];
|
|
27
|
+
const onlyBuiltDependencies = [
|
|
28
|
+
...new Set([
|
|
29
|
+
...baseOnlyBuiltDependencies,
|
|
30
|
+
...overlayOnlyBuiltDependencies,
|
|
31
|
+
]),
|
|
32
|
+
];
|
|
33
|
+
if (packageJSON.pnpm || overlayPackageJSON?.pnpm) {
|
|
34
|
+
mergedPackageJSON.pnpm = {
|
|
35
|
+
...packageJSON.pnpm,
|
|
36
|
+
...overlayPackageJSON?.pnpm,
|
|
37
|
+
};
|
|
38
|
+
if (onlyBuiltDependencies.length) {
|
|
39
|
+
mergedPackageJSON.pnpm.onlyBuiltDependencies = onlyBuiltDependencies;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return mergedPackageJSON;
|
|
21
43
|
}
|
|
22
44
|
export function createPackageJSON(options) {
|
|
23
45
|
const packageManager = options.packageManager;
|
|
@@ -1,7 +1,3 @@
|
|
|
1
1
|
import type { Options } from './types.js';
|
|
2
|
-
export declare function mergePackageJSON(packageJSON: Record<string, any>, overlayPackageJSON?: Record<string, any>):
|
|
3
|
-
dependencies: any;
|
|
4
|
-
devDependencies: any;
|
|
5
|
-
scripts: any;
|
|
6
|
-
};
|
|
2
|
+
export declare function mergePackageJSON(packageJSON: Record<string, any>, overlayPackageJSON?: Record<string, any>): Record<string, any>;
|
|
7
3
|
export declare function createPackageJSON(options: Options): any;
|
package/package.json
CHANGED
|
@@ -22,10 +22,6 @@
|
|
|
22
22
|
"react-dom": "^19.2.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@content-collections/core": "^0.13.1",
|
|
26
|
-
"@content-collections/markdown": "^0.1.4",
|
|
27
|
-
"@content-collections/mdx": "^0.2.2",
|
|
28
|
-
"@content-collections/vite": "^0.2.8",
|
|
29
25
|
"@tailwindcss/typography": "^0.5.16",
|
|
30
26
|
"@tanstack/devtools-vite": "^0.3.11",
|
|
31
27
|
"@testing-library/dom": "^10.4.0",
|
|
@@ -34,11 +30,12 @@
|
|
|
34
30
|
"@types/react-dom": "^19.2.0",
|
|
35
31
|
"@vitejs/plugin-react": "^5.0.4",
|
|
36
32
|
"jsdom": "^27.0.0",
|
|
37
|
-
"remark-gfm": "^4.0.1",
|
|
38
33
|
"typescript": "^5.7.2",
|
|
39
34
|
"vite": "^7.1.7",
|
|
40
35
|
"vite-tsconfig-paths": "^5.1.4",
|
|
41
|
-
"vitest": "^3.0.5"
|
|
42
|
-
|
|
36
|
+
"vitest": "^3.0.5"
|
|
37
|
+
},
|
|
38
|
+
"pnpm": {
|
|
39
|
+
"onlyBuiltDependencies": ["esbuild", "lightningcss"]
|
|
43
40
|
}
|
|
44
41
|
}
|
|
@@ -69,13 +69,6 @@ export default function Header() {
|
|
|
69
69
|
<Link to="/" className="nav-link" activeProps={{ className: 'nav-link is-active' }}>
|
|
70
70
|
Home
|
|
71
71
|
</Link>
|
|
72
|
-
<Link
|
|
73
|
-
to="/blog"
|
|
74
|
-
className="nav-link"
|
|
75
|
-
activeProps={{ className: 'nav-link is-active' }}
|
|
76
|
-
>
|
|
77
|
-
Blog
|
|
78
|
-
</Link>
|
|
79
72
|
<Link
|
|
80
73
|
to="/about"
|
|
81
74
|
className="nav-link"
|
|
@@ -8,18 +8,13 @@ function About() {
|
|
|
8
8
|
return (
|
|
9
9
|
<main className="page-wrap px-4 py-12">
|
|
10
10
|
<section className="island-shell rounded-2xl p-6 sm:p-8">
|
|
11
|
-
<img
|
|
12
|
-
src="/images/lagoon-about.svg"
|
|
13
|
-
alt=""
|
|
14
|
-
className="mb-6 h-56 w-full rounded-2xl object-cover"
|
|
15
|
-
/>
|
|
16
11
|
<p className="island-kicker mb-2">About</p>
|
|
17
12
|
<h1 className="display-title mb-3 text-4xl font-bold text-[var(--sea-ink)] sm:text-5xl">
|
|
18
|
-
|
|
13
|
+
A small starter with room to grow.
|
|
19
14
|
</h1>
|
|
20
15
|
<p className="m-0 max-w-3xl text-base leading-8 text-[var(--sea-ink-soft)]">
|
|
21
|
-
TanStack Start gives you type-safe routing, server functions, and modern SSR
|
|
22
|
-
|
|
16
|
+
TanStack Start gives you type-safe routing, server functions, and modern SSR defaults.
|
|
17
|
+
Use this as a clean foundation, then layer in your own routes, styling, and add-ons.
|
|
23
18
|
</p>
|
|
24
19
|
</section>
|
|
25
20
|
</main>
|
|
@@ -10,18 +10,18 @@ function App() {
|
|
|
10
10
|
<div className="pointer-events-none absolute -bottom-20 -right-20 h-56 w-56 rounded-full bg-[radial-gradient(circle,rgba(47,106,74,0.18),transparent_66%)]" />
|
|
11
11
|
<p className="island-kicker mb-3">TanStack Start Base Template</p>
|
|
12
12
|
<h1 className="display-title mb-5 max-w-3xl text-4xl leading-[1.02] font-bold tracking-tight text-[var(--sea-ink)] sm:text-6xl">
|
|
13
|
-
|
|
13
|
+
Start simple, ship quickly.
|
|
14
14
|
</h1>
|
|
15
15
|
<p className="mb-8 max-w-2xl text-base text-[var(--sea-ink-soft)] sm:text-lg">
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
This base starter intentionally keeps things light: two routes, clean structure,
|
|
17
|
+
and the essentials you need to build from scratch.
|
|
18
18
|
</p>
|
|
19
19
|
<div className="flex flex-wrap gap-3">
|
|
20
20
|
<a
|
|
21
|
-
href="/
|
|
21
|
+
href="/about"
|
|
22
22
|
className="rounded-full border border-[rgba(50,143,151,0.3)] bg-[rgba(79,184,178,0.14)] px-5 py-2.5 text-sm font-semibold text-[var(--lagoon-deep)] no-underline transition hover:-translate-y-0.5 hover:bg-[rgba(79,184,178,0.24)]"
|
|
23
23
|
>
|
|
24
|
-
|
|
24
|
+
About This Starter
|
|
25
25
|
</a>
|
|
26
26
|
<a
|
|
27
27
|
href="https://tanstack.com/router"
|
|
@@ -39,7 +39,7 @@ function App() {
|
|
|
39
39
|
['Type-Safe Routing', 'Routes and links stay in sync across every page.'],
|
|
40
40
|
['Server Functions', 'Call server code from your UI without creating API boilerplate.'],
|
|
41
41
|
['Streaming by Default', 'Ship progressively rendered responses for faster experiences.'],
|
|
42
|
-
['Tailwind Native', 'Design quickly with utility-first styling and
|
|
42
|
+
['Tailwind Native', 'Design quickly with utility-first styling and reusable tokens.'],
|
|
43
43
|
].map(([title, desc], index) => (
|
|
44
44
|
<article
|
|
45
45
|
key={title}
|
|
@@ -56,7 +56,7 @@ function App() {
|
|
|
56
56
|
<p className="island-kicker mb-2">Quick Start</p>
|
|
57
57
|
<ul className="m-0 list-disc space-y-2 pl-5 text-sm text-[var(--sea-ink-soft)]">
|
|
58
58
|
<li>
|
|
59
|
-
Edit <code>src/routes/index.tsx</code> to customize the
|
|
59
|
+
Edit <code>src/routes/index.tsx</code> to customize the home page.
|
|
60
60
|
</li>
|
|
61
61
|
<li>
|
|
62
62
|
Update <code>src/components/Header.tsx</code> and <code>src/components/Footer.tsx</code>{' '}
|
|
@@ -154,24 +154,6 @@ pre code {
|
|
|
154
154
|
color: inherit;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
.prose pre {
|
|
158
|
-
border: 1px solid var(--line);
|
|
159
|
-
border-radius: 12px;
|
|
160
|
-
background: #1d2e45;
|
|
161
|
-
color: #e8efff;
|
|
162
|
-
overflow-x: auto;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
.prose {
|
|
166
|
-
overflow-wrap: anywhere;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.prose table {
|
|
170
|
-
display: block;
|
|
171
|
-
width: 100%;
|
|
172
|
-
overflow-x: auto;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
157
|
.page-wrap {
|
|
176
158
|
width: min(1080px, calc(100% - 2rem));
|
|
177
159
|
margin-inline: auto;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { defineConfig } from 'vite'
|
|
2
2
|
import { devtools } from '@tanstack/devtools-vite'
|
|
3
|
-
import contentCollections from '@content-collections/vite'
|
|
4
3
|
import tsconfigPaths from 'vite-tsconfig-paths'
|
|
5
4
|
<% if (addOnEnabled.paraglide) { -%>
|
|
6
5
|
import { paraglideVitePlugin } from "@inlang/paraglide-js"
|
|
@@ -21,7 +20,6 @@ const config = defineConfig({
|
|
|
21
20
|
outdir: './src/paraglide',
|
|
22
21
|
strategy: ['url', "baseLocale"],
|
|
23
22
|
}), <% } %><% for(const integration of integrations.filter(i => i.type === 'vite-plugin')) { %><%- integrationImportCode(integration) %>,<% } %>
|
|
24
|
-
contentCollections(),
|
|
25
23
|
tsconfigPaths({ projects: ['./tsconfig.json'] }),
|
|
26
24
|
tailwindcss(),
|
|
27
25
|
<% if (routerOnly) { %>tanstackRouter({ target: 'react', autoCodeSplitting: true }),<% } else { %>tanstackStart(),<% } %>
|
|
@@ -14,15 +14,16 @@
|
|
|
14
14
|
"@tanstack/solid-router-devtools": "^1.133.20",
|
|
15
15
|
"@tanstack/solid-router-ssr-query": "^1.132.25",
|
|
16
16
|
"@tanstack/solid-start": "^1.133.20",
|
|
17
|
-
"lucide-solid": "^0.544.0",
|
|
18
17
|
"solid-js": "^1.9.9",
|
|
19
18
|
"vite-tsconfig-paths": "^5.1.4"
|
|
20
19
|
},
|
|
21
20
|
"devDependencies": {
|
|
22
21
|
"@tanstack/devtools-vite": "^0.3.11",
|
|
23
|
-
"vite-plugin-lucide-preprocess": "^1.4.6",
|
|
24
22
|
"vite-plugin-solid": "^2.11.10",
|
|
25
23
|
"typescript": "^5.7.2",
|
|
26
24
|
"vite": "^7.1.7"
|
|
25
|
+
},
|
|
26
|
+
"pnpm": {
|
|
27
|
+
"onlyBuiltDependencies": ["esbuild", "lightningcss"]
|
|
27
28
|
}
|
|
28
29
|
}
|
|
@@ -1,155 +1,68 @@
|
|
|
1
|
-
|
|
1
|
+
import { Link } from '@tanstack/solid-router'
|
|
2
2
|
<% for(const integration of integrations.filter(i => i.type === 'header-user')) { %>
|
|
3
|
-
import <%= integration.jsName %> from
|
|
4
|
-
<% }
|
|
5
|
-
const icons = new Set([
|
|
6
|
-
"Menu",
|
|
7
|
-
"X",
|
|
8
|
-
"Home",
|
|
9
|
-
"Globe",
|
|
10
|
-
])
|
|
3
|
+
import <%= integration.jsName %> from '<%= relativePath(integration.path) %>'
|
|
4
|
+
<% } %>
|
|
11
5
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
<%
|
|
7
|
+
const demoRoutes = [];
|
|
8
|
+
for (const addOn of addOns) {
|
|
9
|
+
for (const route of (addOn?.routes || []).filter((r) => r.url && r.name)) {
|
|
10
|
+
demoRoutes.push({ url: route.url, name: route.name });
|
|
11
|
+
for (const child of route.children || []) {
|
|
12
|
+
if (child?.url && child?.name) {
|
|
13
|
+
demoRoutes.push({ url: child.url, name: child.name });
|
|
14
|
+
}
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
17
|
}
|
|
18
|
+
const userHeaders = integrations.filter((i) => i.type === 'header-user');
|
|
21
19
|
%>
|
|
22
|
-
import { createSignal } from 'solid-js';
|
|
23
|
-
import {
|
|
24
|
-
<%= Array.from(icons).sort().join(", ") %>
|
|
25
|
-
} from "lucide-solid";
|
|
26
20
|
|
|
27
21
|
export default function Header() {
|
|
28
|
-
<%
|
|
29
|
-
const hasNestedRouteGroups = addOns.some(a => a.routes?.some(r => r.children?.length));
|
|
30
|
-
const userHeaders = integrations.filter(i => i.type === 'header-user');
|
|
31
|
-
%>
|
|
32
|
-
const [isOpen, setIsOpen] = createSignal(false);
|
|
33
|
-
<% if (hasNestedRouteGroups) { %>
|
|
34
|
-
const [groupedExpanded, setGroupedExpanded] = createSignal<Record<string, boolean>>({});
|
|
35
|
-
<% } %>
|
|
36
|
-
|
|
37
22
|
return (
|
|
38
|
-
|
|
39
|
-
<
|
|
40
|
-
<
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
>
|
|
45
|
-
<Menu size={24} />
|
|
46
|
-
</button>
|
|
47
|
-
<h1 class="ml-4 text-xl font-semibold">
|
|
48
|
-
<Link to="/">
|
|
49
|
-
<img
|
|
50
|
-
src="/logo192.png"
|
|
51
|
-
alt="TanStack Logo"
|
|
52
|
-
class="h-10"
|
|
53
|
-
/>
|
|
23
|
+
<header class="site-header px-4">
|
|
24
|
+
<nav class="page-wrap nav-shell">
|
|
25
|
+
<h2 class="m-0 flex-shrink-0 text-base font-semibold tracking-tight">
|
|
26
|
+
<Link to="/" class="brand-pill">
|
|
27
|
+
<span class="brand-dot" />
|
|
28
|
+
TanStack Start
|
|
54
29
|
</Link>
|
|
55
|
-
</
|
|
56
|
-
</header>
|
|
30
|
+
</h2>
|
|
57
31
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}`}
|
|
62
|
-
>
|
|
63
|
-
<div class="flex items-center justify-between p-4 border-b border-gray-700">
|
|
64
|
-
<h2 class="text-xl font-bold">Navigation</h2>
|
|
65
|
-
<button
|
|
66
|
-
onClick={() => setIsOpen(false)}
|
|
67
|
-
class="p-2 hover:bg-gray-800 rounded-lg transition-colors"
|
|
68
|
-
aria-label="Close menu"
|
|
69
|
-
>
|
|
70
|
-
<X size={24} />
|
|
71
|
-
</button>
|
|
32
|
+
<div class="ml-auto flex items-center gap-2">
|
|
33
|
+
<% for (const integration of userHeaders) { %><<%= integration.jsName %> />
|
|
34
|
+
<% } %>
|
|
72
35
|
</div>
|
|
73
36
|
|
|
74
|
-
<
|
|
75
|
-
<Link
|
|
76
|
-
|
|
77
|
-
onClick={() => setIsOpen(false)}
|
|
78
|
-
class="flex items-center gap-3 p-3 rounded-lg hover:bg-gray-800 transition-colors mb-2"
|
|
79
|
-
activeProps={{
|
|
80
|
-
class:
|
|
81
|
-
"flex items-center gap-3 p-3 rounded-lg bg-cyan-600 hover:bg-cyan-700 transition-colors mb-2",
|
|
82
|
-
}}
|
|
83
|
-
>
|
|
84
|
-
<Home size={20} />
|
|
85
|
-
<span class="font-medium">Home</span>
|
|
37
|
+
<div class="order-3 flex w-full flex-wrap items-center gap-x-4 gap-y-1 pb-1 text-sm font-semibold sm:order-2 sm:w-auto sm:flex-nowrap sm:pb-0">
|
|
38
|
+
<Link to="/" class="nav-link" activeProps={{ class: 'nav-link is-active' }}>
|
|
39
|
+
Home
|
|
86
40
|
</Link>
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
<button
|
|
105
|
-
class="p-2 hover:bg-gray-800 rounded-lg transition-colors"
|
|
106
|
-
onClick={() => setGroupedExpanded(prev => ({ ...prev, <%= route.jsName %>: !prev.<%= route.jsName %> }))}>
|
|
107
|
-
{groupedExpanded().<%= route.jsName %> ? <ChevronDown size={20} /> : <ChevronRight size={20} />}
|
|
108
|
-
</button>
|
|
109
|
-
</div>
|
|
110
|
-
{groupedExpanded().<%= route.jsName %> && (
|
|
111
|
-
<div class="flex flex-col ml-4">
|
|
112
|
-
<% for(const child of route.children) { %>
|
|
113
|
-
<Link
|
|
114
|
-
to="<%= child.url %>"
|
|
115
|
-
onClick={() => setIsOpen(false)}
|
|
116
|
-
class="flex items-center gap-3 p-3 rounded-lg hover:bg-gray-800 transition-colors mb-2"
|
|
117
|
-
activeProps={{
|
|
118
|
-
class:
|
|
119
|
-
"flex items-center gap-3 p-3 rounded-lg bg-cyan-600 hover:bg-cyan-700 transition-colors mb-2",
|
|
120
|
-
}}
|
|
121
|
-
>
|
|
122
|
-
<<%= child.icon || "Globe" %> size={20} />
|
|
123
|
-
<span class="font-medium"><%= child.name %></span>
|
|
124
|
-
</Link>
|
|
125
|
-
<% } %>
|
|
126
|
-
</div>
|
|
127
|
-
)}
|
|
128
|
-
<% } else { %>
|
|
129
|
-
<Link
|
|
130
|
-
to="<%= route.url %>"
|
|
131
|
-
onClick={() => setIsOpen(false)}
|
|
132
|
-
class="flex items-center gap-3 p-3 rounded-lg hover:bg-gray-800 transition-colors mb-2"
|
|
133
|
-
activeProps={{
|
|
134
|
-
class:
|
|
135
|
-
"flex items-center gap-3 p-3 rounded-lg bg-cyan-600 hover:bg-cyan-700 transition-colors mb-2",
|
|
136
|
-
}}
|
|
41
|
+
<Link to="/about" class="nav-link" activeProps={{ class: 'nav-link is-active' }}>
|
|
42
|
+
About
|
|
43
|
+
</Link>
|
|
44
|
+
<a
|
|
45
|
+
href="https://tanstack.com/start/latest/docs/framework/solid/overview"
|
|
46
|
+
target="_blank"
|
|
47
|
+
rel="noreferrer"
|
|
48
|
+
class="nav-link"
|
|
49
|
+
>
|
|
50
|
+
Docs
|
|
51
|
+
</a>
|
|
52
|
+
<% if (demoRoutes.length > 0) { %><details class="relative w-full sm:w-auto">
|
|
53
|
+
<summary class="nav-link list-none cursor-pointer">Demos</summary>
|
|
54
|
+
<div class="mt-2 min-w-56 rounded-xl border border-[var(--line)] bg-[var(--header-bg)] p-2 shadow-lg sm:absolute sm:right-0">
|
|
55
|
+
<% for (const route of demoRoutes) { %><a
|
|
56
|
+
href="<%= route.url %>"
|
|
57
|
+
class="block rounded-lg px-3 py-2 text-sm text-[var(--sea-ink-soft)] no-underline transition hover:bg-[var(--link-bg-hover)] hover:text-[var(--sea-ink)]"
|
|
137
58
|
>
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
</nav>
|
|
144
|
-
|
|
145
|
-
<% if (userHeaders.length > 0) { %>
|
|
146
|
-
<div class="p-4 border-t border-gray-700 bg-gray-800 flex flex-col gap-2">
|
|
147
|
-
<% for(const integration of userHeaders) { %>
|
|
148
|
-
<<%= integration.jsName %> />
|
|
149
|
-
<% } %>
|
|
59
|
+
<%= route.name %>
|
|
60
|
+
</a>
|
|
61
|
+
<% } %>
|
|
62
|
+
</div>
|
|
63
|
+
</details><% } %>
|
|
150
64
|
</div>
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
);
|
|
65
|
+
</nav>
|
|
66
|
+
</header>
|
|
67
|
+
)
|
|
155
68
|
}
|