@tanstack/create 0.62.0 → 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.
Files changed (74) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/frameworks/react/project/base/package.json +4 -7
  3. package/dist/frameworks/react/project/base/src/components/Header.tsx.ejs +0 -7
  4. package/dist/frameworks/react/project/base/src/routes/about.tsx.ejs +3 -8
  5. package/dist/frameworks/react/project/base/src/routes/index.tsx.ejs +7 -7
  6. package/dist/frameworks/react/project/base/src/styles.css.ejs +0 -18
  7. package/dist/frameworks/react/project/base/tsconfig.json.ejs +0 -1
  8. package/dist/frameworks/react/project/base/vite.config.ts.ejs +0 -2
  9. package/dist/frameworks/solid/project/base/package.json +3 -2
  10. package/dist/frameworks/solid/project/base/src/components/Header.tsx.ejs +51 -138
  11. package/dist/frameworks/solid/project/base/src/routes/__root.tsx.ejs +2 -5
  12. package/dist/frameworks/solid/project/base/src/routes/about.tsx.ejs +22 -0
  13. package/dist/frameworks/solid/project/base/src/routes/index.tsx.ejs +59 -94
  14. package/dist/frameworks/solid/project/base/src/styles.css.ejs +187 -7
  15. package/dist/frameworks/solid/project/base/vite.config.ts.ejs +1 -2
  16. package/dist/package-json.js +23 -1
  17. package/dist/types/package-json.d.ts +1 -5
  18. package/package.json +1 -1
  19. package/src/frameworks/react/project/base/package.json +4 -7
  20. package/src/frameworks/react/project/base/src/components/Header.tsx.ejs +0 -7
  21. package/src/frameworks/react/project/base/src/routes/about.tsx.ejs +3 -8
  22. package/src/frameworks/react/project/base/src/routes/index.tsx.ejs +7 -7
  23. package/src/frameworks/react/project/base/src/styles.css.ejs +0 -18
  24. package/src/frameworks/react/project/base/tsconfig.json.ejs +0 -1
  25. package/src/frameworks/react/project/base/vite.config.ts.ejs +0 -2
  26. package/src/frameworks/solid/project/base/package.json +3 -2
  27. package/src/frameworks/solid/project/base/src/components/Header.tsx.ejs +51 -138
  28. package/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs +2 -5
  29. package/src/frameworks/solid/project/base/src/routes/about.tsx.ejs +22 -0
  30. package/src/frameworks/solid/project/base/src/routes/index.tsx.ejs +59 -94
  31. package/src/frameworks/solid/project/base/src/styles.css.ejs +187 -7
  32. package/src/frameworks/solid/project/base/vite.config.ts.ejs +1 -2
  33. package/src/package-json.ts +32 -1
  34. package/tests/package-json.test.ts +32 -0
  35. package/dist/frameworks/react/project/base/content/blog/fifth-post.mdx.ejs +0 -54
  36. package/dist/frameworks/react/project/base/content/blog/first-post.md.ejs +0 -47
  37. package/dist/frameworks/react/project/base/content/blog/fourth-post.md.ejs +0 -42
  38. package/dist/frameworks/react/project/base/content/blog/second-post.mdx.ejs +0 -46
  39. package/dist/frameworks/react/project/base/content/blog/third-post.md.ejs +0 -49
  40. package/dist/frameworks/react/project/base/content-collections.ts.ejs +0 -37
  41. package/dist/frameworks/react/project/base/public/images/lagoon-1.svg +0 -13
  42. package/dist/frameworks/react/project/base/public/images/lagoon-2.svg +0 -12
  43. package/dist/frameworks/react/project/base/public/images/lagoon-3.svg +0 -12
  44. package/dist/frameworks/react/project/base/public/images/lagoon-4.svg +0 -12
  45. package/dist/frameworks/react/project/base/public/images/lagoon-5.svg +0 -12
  46. package/dist/frameworks/react/project/base/public/images/lagoon-about.svg +0 -14
  47. package/dist/frameworks/react/project/base/public/tanstack-circle-logo.png +0 -0
  48. package/dist/frameworks/react/project/base/public/tanstack-word-logo-white.svg +0 -1
  49. package/dist/frameworks/react/project/base/src/components/MdxCallout.tsx.ejs +0 -16
  50. package/dist/frameworks/react/project/base/src/components/MdxMetrics.tsx.ejs +0 -23
  51. package/dist/frameworks/react/project/base/src/lib/site.ts.ejs +0 -4
  52. package/dist/frameworks/react/project/base/src/routes/blog.$slug.tsx.ejs +0 -71
  53. package/dist/frameworks/react/project/base/src/routes/blog.index.tsx.ejs +0 -93
  54. package/dist/frameworks/react/project/base/src/routes/rss[.]xml.ts.ejs +0 -35
  55. package/src/frameworks/react/project/base/content/blog/fifth-post.mdx.ejs +0 -54
  56. package/src/frameworks/react/project/base/content/blog/first-post.md.ejs +0 -47
  57. package/src/frameworks/react/project/base/content/blog/fourth-post.md.ejs +0 -42
  58. package/src/frameworks/react/project/base/content/blog/second-post.mdx.ejs +0 -46
  59. package/src/frameworks/react/project/base/content/blog/third-post.md.ejs +0 -49
  60. package/src/frameworks/react/project/base/content-collections.ts.ejs +0 -37
  61. package/src/frameworks/react/project/base/public/images/lagoon-1.svg +0 -13
  62. package/src/frameworks/react/project/base/public/images/lagoon-2.svg +0 -12
  63. package/src/frameworks/react/project/base/public/images/lagoon-3.svg +0 -12
  64. package/src/frameworks/react/project/base/public/images/lagoon-4.svg +0 -12
  65. package/src/frameworks/react/project/base/public/images/lagoon-5.svg +0 -12
  66. package/src/frameworks/react/project/base/public/images/lagoon-about.svg +0 -14
  67. package/src/frameworks/react/project/base/public/tanstack-circle-logo.png +0 -0
  68. package/src/frameworks/react/project/base/public/tanstack-word-logo-white.svg +0 -1
  69. package/src/frameworks/react/project/base/src/components/MdxCallout.tsx.ejs +0 -16
  70. package/src/frameworks/react/project/base/src/components/MdxMetrics.tsx.ejs +0 -23
  71. package/src/frameworks/react/project/base/src/lib/site.ts.ejs +0 -4
  72. package/src/frameworks/react/project/base/src/routes/blog.$slug.tsx.ejs +0 -71
  73. package/src/frameworks/react/project/base/src/routes/blog.index.tsx.ejs +0 -93
  74. package/src/frameworks/react/project/base/src/routes/rss[.]xml.ts.ejs +0 -35
@@ -1,15 +1,195 @@
1
- @import "tailwindcss";
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
- @apply m-0;
5
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
6
- "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
7
- sans-serif;
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-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
14
- monospace;
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: [lucidePreprocess(), devtools(), <% for(const integration of integrations.filter(i => i.type === 'vite-plugin')) { %><%- integrationImportCode(integration) %>,<% } %>
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'],
@@ -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
- return {
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/create",
3
- "version": "0.62.0",
3
+ "version": "0.62.3",
4
4
  "description": "TanStack Application Builder Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -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.1.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
- "zod": "^4.3.5"
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
- Built for shipping fast.
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
- defaults so you can focus on product work instead of framework glue.
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
- Island hours, but for product teams.
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
- A tropical, breathable app starter with full-document SSR, server functions,
17
- streaming, and type-safe routing. Calm on the eyes. Fast in production.
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="/blog"
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
- Explore Posts
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 custom tokens.'],
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 hero and product narrative.
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;
@@ -8,7 +8,6 @@
8
8
  "baseUrl": ".",
9
9
  "paths": {
10
10
  "#/*": ["./src/*"],
11
- "content-collections": ["./.content-collections/generated"],
12
11
  "@/*": ["./src/*"]
13
12
  },
14
13
  "lib": ["ES2022", "DOM", "DOM.Iterable"],
@@ -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
- <% if (addOns.length === 0 && integrations.length === 0 && routes.length === 0) { ignoreFile() } %>import { Link } from '@tanstack/solid-router'
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 "<%= relativePath(integration.path) %>";
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
- for(const addOn of addOns) {
13
- for(const route of (addOn?.routes||[])?.filter(r => r.url && r.name)) {
14
- icons.add( route.icon || "Globe");
15
- if (route.children?.length) {
16
- icons.add("ChevronDown")
17
- icons.add("ChevronRight")
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
- <header class="p-4 flex items-center bg-gray-800 text-white shadow-lg">
40
- <button
41
- onClick={() => setIsOpen(true)}
42
- class="p-2 hover:bg-gray-700 rounded-lg transition-colors"
43
- aria-label="Open menu"
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
- </h1>
56
- </header>
30
+ </h2>
57
31
 
58
- <aside
59
- class={`fixed top-0 left-0 h-full w-80 bg-gray-900 text-white shadow-2xl z-50 transform transition-transform duration-300 ease-in-out flex flex-col ${
60
- isOpen() ? "translate-x-0" : "-translate-x-full"
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
- <nav class="flex-1 p-4 overflow-y-auto">
75
- <Link
76
- to="/"
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
- {/* Demo Links Start */}
89
- <% for(const addOn of addOns) {
90
- for(const route of (addOn?.routes||[])?.filter(r => r.url && r.name)) {
91
- if (route.children) { %>
92
- <div class="flex flex-row justify-between">
93
- <Link to="<%= route.url %>"
94
- onClick={() => setIsOpen(false)}
95
- class="flex-1 flex items-center gap-3 p-3 rounded-lg hover:bg-gray-800 transition-colors mb-2"
96
- activeProps={{
97
- class:
98
- "flex-1 flex items-center gap-3 p-3 rounded-lg bg-cyan-600 hover:bg-cyan-700 transition-colors mb-2",
99
- }}
100
- >
101
- <<%= route.icon || "Globe" %> size={20} />
102
- <span class="font-medium"><%= route.name %></span>
103
- </Link>
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
- <<%= route.icon || "Globe" %> size={20} />
139
- <span class="font-medium"><%= route.name %></span>
140
- </Link>
141
- <% } } } %>
142
- {/* Demo Links End */}
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
- </aside>
153
- </>
154
- );
65
+ </nav>
66
+ </header>
67
+ )
155
68
  }