@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.
- package/CHANGELOG.md +24 -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
|
@@ -27,8 +27,7 @@ import "@fontsource/inter/400.css"
|
|
|
27
27
|
import { HydrationScript } from 'solid-js/web'
|
|
28
28
|
import { Suspense } from 'solid-js'
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
<% } %>
|
|
30
|
+
import Header from '../components/Header'
|
|
32
31
|
<% for(const addOn of addOns) {
|
|
33
32
|
for(const init of addOn.main?.initialize || []) { %>
|
|
34
33
|
<%- init %>
|
|
@@ -52,9 +51,7 @@ function RootComponent() {
|
|
|
52
51
|
<body>
|
|
53
52
|
<HeadContent />
|
|
54
53
|
<Suspense>
|
|
55
|
-
|
|
56
|
-
<Header />
|
|
57
|
-
<% } %>
|
|
54
|
+
<Header />
|
|
58
55
|
<Outlet />
|
|
59
56
|
<TanStackRouterDevtools />
|
|
60
57
|
<% for(const integration of integrations.filter(i => i.type === 'layout')) { %>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createFileRoute } from '@tanstack/solid-router'
|
|
2
|
+
|
|
3
|
+
export const Route = createFileRoute('/about')({
|
|
4
|
+
component: About,
|
|
5
|
+
})
|
|
6
|
+
|
|
7
|
+
function About() {
|
|
8
|
+
return (
|
|
9
|
+
<main class="page-wrap px-4 py-12">
|
|
10
|
+
<section class="island-shell rounded-2xl p-6 sm:p-8">
|
|
11
|
+
<p class="island-kicker mb-2">About</p>
|
|
12
|
+
<h1 class="display-title mb-3 text-4xl font-bold text-[var(--sea-ink)] sm:text-5xl">
|
|
13
|
+
A small starter with room to grow.
|
|
14
|
+
</h1>
|
|
15
|
+
<p class="m-0 max-w-3xl text-base leading-8 text-[var(--sea-ink-soft)]">
|
|
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.
|
|
18
|
+
</p>
|
|
19
|
+
</section>
|
|
20
|
+
</main>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
@@ -1,103 +1,68 @@
|
|
|
1
|
-
import { createFileRoute } from
|
|
2
|
-
import { For } from "solid-js"
|
|
3
|
-
import {
|
|
4
|
-
Zap, Server, Route as RouteIcon, Shield, Waves, Sparkles,
|
|
5
|
-
} from "lucide-solid";
|
|
1
|
+
import { createFileRoute } from '@tanstack/solid-router'
|
|
6
2
|
|
|
7
|
-
export const Route = createFileRoute(
|
|
3
|
+
export const Route = createFileRoute('/')({ component: App })
|
|
8
4
|
|
|
9
5
|
function App() {
|
|
10
|
-
const features = [
|
|
11
|
-
{
|
|
12
|
-
icon: <Zap class="w-12 h-12 text-cyan-400" />,
|
|
13
|
-
title: "Powerful Server Functions",
|
|
14
|
-
description: "Write server-side code that seamlessly integrates with your client components. Type-safe, secure, and simple.",
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
icon: <Server class="w-12 h-12 text-cyan-400" />,
|
|
18
|
-
title: "Flexible Server Side Rendering",
|
|
19
|
-
description: "Full-document SSR, streaming, and progressive enhancement out of the box. Control exactly what renders where.",
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
icon: <RouteIcon class="w-12 h-12 text-cyan-400" />,
|
|
23
|
-
title: "API Routes",
|
|
24
|
-
description: "Build type-safe API endpoints alongside your application. No separate backend needed.",
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
icon: <Shield class="w-12 h-12 text-cyan-400" />,
|
|
28
|
-
title: "Strongly Typed Everything",
|
|
29
|
-
description: "End-to-end type safety from server to client. Catch errors before they reach production.",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
icon: <Waves class="w-12 h-12 text-cyan-400" />,
|
|
33
|
-
title: "Full Streaming Support",
|
|
34
|
-
description: "Stream data from server to client progressively. Perfect for AI applications and real-time updates.",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
icon: <Sparkles class="w-12 h-12 text-cyan-400" />,
|
|
38
|
-
title: "Next Generation Ready",
|
|
39
|
-
description: "Built from the ground up for modern web applications. Deploy anywhere JavaScript runs.",
|
|
40
|
-
},
|
|
41
|
-
];
|
|
42
|
-
|
|
43
6
|
return (
|
|
44
|
-
<
|
|
45
|
-
<section class="relative
|
|
46
|
-
<div class="absolute
|
|
47
|
-
<div class="
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
href="https://tanstack.com/start"
|
|
72
|
-
target="_blank"
|
|
73
|
-
rel="noopener noreferrer"
|
|
74
|
-
class="px-8 py-3 bg-cyan-500 hover:bg-cyan-600 text-white font-semibold rounded-lg transition-colors shadow-lg shadow-cyan-500/50"
|
|
75
|
-
>
|
|
76
|
-
Documentation
|
|
77
|
-
</a>
|
|
78
|
-
<p class="text-gray-400 text-sm mt-2">
|
|
79
|
-
Begin your TanStack Start journey by editing{" "}
|
|
80
|
-
<code class="px-2 py-1 bg-slate-700 rounded text-cyan-400">
|
|
81
|
-
/src/routes/index.tsx
|
|
82
|
-
</code>
|
|
83
|
-
</p>
|
|
84
|
-
</div>
|
|
7
|
+
<main class="page-wrap px-4 pb-8 pt-14">
|
|
8
|
+
<section class="island-shell rise-in relative overflow-hidden rounded-[2rem] px-6 py-10 sm:px-10 sm:py-14">
|
|
9
|
+
<div class="pointer-events-none absolute -left-20 -top-24 h-56 w-56 rounded-full bg-[radial-gradient(circle,rgba(79,184,178,0.32),transparent_66%)]" />
|
|
10
|
+
<div class="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
|
+
<p class="island-kicker mb-3">TanStack Start Base Template</p>
|
|
12
|
+
<h1 class="display-title mb-5 max-w-3xl text-4xl leading-[1.02] font-bold tracking-tight text-[var(--sea-ink)] sm:text-6xl">
|
|
13
|
+
Start simple, ship quickly.
|
|
14
|
+
</h1>
|
|
15
|
+
<p class="mb-8 max-w-2xl text-base text-[var(--sea-ink-soft)] sm:text-lg">
|
|
16
|
+
This base starter intentionally keeps things light: two routes, clean structure,
|
|
17
|
+
and the essentials you need to build from scratch.
|
|
18
|
+
</p>
|
|
19
|
+
<div class="flex flex-wrap gap-3">
|
|
20
|
+
<a
|
|
21
|
+
href="/about"
|
|
22
|
+
class="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
|
+
>
|
|
24
|
+
About This Starter
|
|
25
|
+
</a>
|
|
26
|
+
<a
|
|
27
|
+
href="https://tanstack.com/router"
|
|
28
|
+
target="_blank"
|
|
29
|
+
rel="noopener noreferrer"
|
|
30
|
+
class="rounded-full border border-[rgba(23,58,64,0.2)] bg-white/50 px-5 py-2.5 text-sm font-semibold text-[var(--sea-ink)] no-underline transition hover:-translate-y-0.5 hover:border-[rgba(23,58,64,0.35)]"
|
|
31
|
+
>
|
|
32
|
+
Router Guide
|
|
33
|
+
</a>
|
|
85
34
|
</div>
|
|
86
35
|
</section>
|
|
87
36
|
|
|
88
|
-
<section class="
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
37
|
+
<section class="mt-8 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
38
|
+
{[
|
|
39
|
+
['Type-Safe Routing', 'Routes and links stay in sync across every page.'],
|
|
40
|
+
['Server Functions', 'Call server code from your UI without creating API boilerplate.'],
|
|
41
|
+
['Streaming by Default', 'Ship progressively rendered responses for faster experiences.'],
|
|
42
|
+
['Tailwind Native', 'Design quickly with utility-first styling and reusable tokens.'],
|
|
43
|
+
].map(([title, desc], index) => (
|
|
44
|
+
<article
|
|
45
|
+
class="island-shell feature-card rise-in rounded-2xl p-5"
|
|
46
|
+
style={{ 'animation-delay': `${index * 90 + 80}ms` }}
|
|
47
|
+
>
|
|
48
|
+
<h2 class="mb-2 text-base font-semibold text-[var(--sea-ink)]">{title}</h2>
|
|
49
|
+
<p class="m-0 text-sm text-[var(--sea-ink-soft)]">{desc}</p>
|
|
50
|
+
</article>
|
|
51
|
+
))}
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<section class="island-shell mt-8 rounded-2xl p-6">
|
|
55
|
+
<p class="island-kicker mb-2">Quick Start</p>
|
|
56
|
+
<ul class="m-0 list-disc space-y-2 pl-5 text-sm text-[var(--sea-ink-soft)]">
|
|
57
|
+
<li>Edit <code>src/routes/index.tsx</code> to customize the home page.</li>
|
|
58
|
+
<li>
|
|
59
|
+
Update <code>src/components/Header.tsx</code> for navigation and product links.
|
|
60
|
+
</li>
|
|
61
|
+
<li>
|
|
62
|
+
Add routes in <code>src/routes</code> and tweak visual tokens in <code>src/styles.css</code>.
|
|
63
|
+
</li>
|
|
64
|
+
</ul>
|
|
100
65
|
</section>
|
|
101
|
-
</
|
|
102
|
-
)
|
|
66
|
+
</main>
|
|
67
|
+
)
|
|
103
68
|
}
|
|
@@ -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/src/package-json.ts
CHANGED
|
@@ -7,7 +7,7 @@ export function mergePackageJSON(
|
|
|
7
7
|
packageJSON: Record<string, any>,
|
|
8
8
|
overlayPackageJSON?: Record<string, any>,
|
|
9
9
|
) {
|
|
10
|
-
|
|
10
|
+
const mergedPackageJSON: Record<string, any> = {
|
|
11
11
|
...packageJSON,
|
|
12
12
|
...(overlayPackageJSON || {}),
|
|
13
13
|
dependencies: {
|
|
@@ -23,6 +23,37 @@ export function mergePackageJSON(
|
|
|
23
23
|
...(overlayPackageJSON?.scripts || {}),
|
|
24
24
|
},
|
|
25
25
|
}
|
|
26
|
+
|
|
27
|
+
const baseOnlyBuiltDependencies = Array.isArray(
|
|
28
|
+
packageJSON.pnpm?.onlyBuiltDependencies,
|
|
29
|
+
)
|
|
30
|
+
? packageJSON.pnpm.onlyBuiltDependencies
|
|
31
|
+
: []
|
|
32
|
+
const overlayOnlyBuiltDependencies = Array.isArray(
|
|
33
|
+
overlayPackageJSON?.pnpm?.onlyBuiltDependencies,
|
|
34
|
+
)
|
|
35
|
+
? overlayPackageJSON.pnpm.onlyBuiltDependencies
|
|
36
|
+
: []
|
|
37
|
+
|
|
38
|
+
const onlyBuiltDependencies = [
|
|
39
|
+
...new Set([
|
|
40
|
+
...baseOnlyBuiltDependencies,
|
|
41
|
+
...overlayOnlyBuiltDependencies,
|
|
42
|
+
]),
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
if (packageJSON.pnpm || overlayPackageJSON?.pnpm) {
|
|
46
|
+
mergedPackageJSON.pnpm = {
|
|
47
|
+
...packageJSON.pnpm,
|
|
48
|
+
...overlayPackageJSON?.pnpm,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (onlyBuiltDependencies.length) {
|
|
52
|
+
mergedPackageJSON.pnpm.onlyBuiltDependencies = onlyBuiltDependencies
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return mergedPackageJSON
|
|
26
57
|
}
|
|
27
58
|
|
|
28
59
|
export function createPackageJSON(options: Options) {
|
|
@@ -92,6 +92,38 @@ describe('createPackageJSON', () => {
|
|
|
92
92
|
})
|
|
93
93
|
})
|
|
94
94
|
|
|
95
|
+
it('should merge pnpm onlyBuiltDependencies from base and add-ons', () => {
|
|
96
|
+
const packageJSON = createPackageJSON({
|
|
97
|
+
chosenAddOns: [
|
|
98
|
+
{
|
|
99
|
+
packageTemplate:
|
|
100
|
+
'{"pnpm": {"onlyBuiltDependencies": ["better-sqlite3"]}}',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
addOnOptions: {},
|
|
104
|
+
mode: 'file-router',
|
|
105
|
+
typescript: true,
|
|
106
|
+
tailwind: true,
|
|
107
|
+
projectName: 'test',
|
|
108
|
+
framework: {
|
|
109
|
+
basePackageJSON: {
|
|
110
|
+
pnpm: {
|
|
111
|
+
onlyBuiltDependencies: ['esbuild', 'lightningcss'],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
optionalPackages: {
|
|
115
|
+
typescript: {},
|
|
116
|
+
tailwindcss: {},
|
|
117
|
+
'file-router': {},
|
|
118
|
+
},
|
|
119
|
+
} as unknown as Framework,
|
|
120
|
+
} as unknown as Options)
|
|
121
|
+
|
|
122
|
+
expect(packageJSON.pnpm).toEqual({
|
|
123
|
+
onlyBuiltDependencies: ['esbuild', 'lightningcss', 'better-sqlite3'],
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
|
|
95
127
|
it('should provide execute command helper in package templates', () => {
|
|
96
128
|
const packageJSON = createPackageJSON({
|
|
97
129
|
chosenAddOns: [
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 'Velvet Runtime Notes'
|
|
3
|
-
description: 'Use color tokens to keep light and dark themes aligned.'
|
|
4
|
-
pubDate: 'Aug 05 2024'
|
|
5
|
-
heroImage: '/images/lagoon-5.svg'
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Semantic tokens keep your UI stable while the brand evolves.
|
|
9
|
-
|
|
10
|
-
Instead of hard-coding one-off colors in components, shape a small set of
|
|
11
|
-
variables and map all surfaces to those variables.
|
|
12
|
-
|
|
13
|
-
## Why this matters
|
|
14
|
-
|
|
15
|
-
- You can restyle the app in minutes instead of days
|
|
16
|
-
- Light and dark themes stay behaviorally consistent
|
|
17
|
-
- Add-on pages inherit your visual identity by default
|
|
18
|
-
|
|
19
|
-
<MdxCallout title="MDX Component Demo">
|
|
20
|
-
This callout is rendered from JSX inside an MDX post. It is useful for
|
|
21
|
-
release notes, warnings, and migration tips where you want stronger visual
|
|
22
|
-
emphasis than plain markdown blocks.
|
|
23
|
-
</MdxCallout>
|
|
24
|
-
|
|
25
|
-
<MdxMetrics
|
|
26
|
-
items={[
|
|
27
|
-
{ label: 'Token count', value: '12 core vars' },
|
|
28
|
-
{ label: 'Theme modes', value: 'light + dark + auto' },
|
|
29
|
-
{ label: 'Restyle time', value: '< 30 min' },
|
|
30
|
-
]}
|
|
31
|
-
/>
|
|
32
|
-
|
|
33
|
-
### Token-to-component mapping
|
|
34
|
-
|
|
35
|
-
| Token | Typical usage |
|
|
36
|
-
| --- | --- |
|
|
37
|
-
| `--surface` | Card backgrounds |
|
|
38
|
-
| `--line` | Borders and separators |
|
|
39
|
-
| `--lagoon-deep` | Links and active nav |
|
|
40
|
-
|
|
41
|
-
Keep the mapping documented and your team will make fewer ad-hoc styling calls.
|
|
42
|
-
|
|
43
|
-
### Example: deriving UI from semantic tokens
|
|
44
|
-
|
|
45
|
-
```tsx
|
|
46
|
-
const button = {
|
|
47
|
-
color: 'var(--sea-ink)',
|
|
48
|
-
background: 'var(--surface)',
|
|
49
|
-
borderColor: 'var(--line)',
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
MDX is useful here because you can interleave narrative, tables, code blocks,
|
|
54
|
-
and custom JSX components in one authoring surface.
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 'Neon Mango Protocol'
|
|
3
|
-
description: 'A quick walkthrough of the starter foundations.'
|
|
4
|
-
pubDate: 'Jul 08 2024'
|
|
5
|
-
heroImage: '/images/lagoon-3.svg'
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
This starter ships with routes, SSR, and a calm visual system out of the box.
|
|
9
|
-
|
|
10
|
-
Start by editing route files, then layer in add-ons as needed.
|
|
11
|
-
|
|
12
|
-
## What you get on day one
|
|
13
|
-
|
|
14
|
-
- Full-document SSR using TanStack Start
|
|
15
|
-
- Type-safe file routing with generated route types
|
|
16
|
-
- A reusable design token system for light and dark themes
|
|
17
|
-
|
|
18
|
-
The goal is simple: let teams ship product pages and APIs without spending the
|
|
19
|
-
first week wiring framework internals.
|
|
20
|
-
|
|
21
|
-
### Suggested order of operations
|
|
22
|
-
|
|
23
|
-
1. Make the home route feel like your product
|
|
24
|
-
2. Add one feature route and one API route
|
|
25
|
-
3. Introduce add-ons only after your core UX is clear
|
|
26
|
-
|
|
27
|
-
> Keep the first commit boring. Reliable defaults beat clever setup code.
|
|
28
|
-
|
|
29
|
-
## Baseline delivery checklist
|
|
30
|
-
|
|
31
|
-
Before introducing custom infra, confirm these are green:
|
|
32
|
-
|
|
33
|
-
- `pnpm dev` starts cleanly
|
|
34
|
-
- one server route returns typed data
|
|
35
|
-
- one API route validates input/output
|
|
36
|
-
- one integration test exercises a full page render
|
|
37
|
-
|
|
38
|
-
When these are in place, you can iterate quickly without losing confidence.
|
|
39
|
-
|
|
40
|
-
### Example request flow
|
|
41
|
-
|
|
42
|
-
1. Client navigation enters route loader
|
|
43
|
-
2. Loader calls server function
|
|
44
|
-
3. Server function reads data source and returns typed payload
|
|
45
|
-
4. Route component renders immediately with stable shape
|
|
46
|
-
|
|
47
|
-
That flow is simple, predictable, and easy to debug.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 'Static Tide Almanac'
|
|
3
|
-
description: 'Dial in layout polish and image rhythm across cards.'
|
|
4
|
-
pubDate: 'Jul 29 2024'
|
|
5
|
-
heroImage: '/images/lagoon-1.svg'
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
As your app grows, visual rhythm matters as much as feature scope.
|
|
9
|
-
|
|
10
|
-
Use larger feature cards to call attention to primary content, then support with
|
|
11
|
-
smaller cards for secondary updates.
|
|
12
|
-
|
|
13
|
-
## Practical layout pattern
|
|
14
|
-
|
|
15
|
-
Use one featured card followed by standard cards in a responsive grid:
|
|
16
|
-
|
|
17
|
-
- `lg:col-span-2` for the featured story
|
|
18
|
-
- regular span for supporting posts
|
|
19
|
-
- consistent card media height below `lg`
|
|
20
|
-
|
|
21
|
-
That gives you hierarchy without reinventing every breakpoint.
|
|
22
|
-
|
|
23
|
-
### A quick spacing rule
|
|
24
|
-
|
|
25
|
-
Pair spacing in steps of 4 (`p-4`, `p-8`, `gap-4`, `gap-8`) and only break that
|
|
26
|
-
rule for hero sections.
|
|
27
|
-
|
|
28
|
-
## Card hierarchy recipe
|
|
29
|
-
|
|
30
|
-
For content-heavy indexes, this sequence works well:
|
|
31
|
-
|
|
32
|
-
1. One featured card with expanded width
|
|
33
|
-
2. Three to six standard cards for breadth
|
|
34
|
-
3. Optional utility card for onboarding links
|
|
35
|
-
|
|
36
|
-
Keep title sizes mostly consistent and let width + image treatment carry
|
|
37
|
-
hierarchy. That avoids jarring jumps as breakpoints shift.
|
|
38
|
-
|
|
39
|
-
### Avoiding layout drift
|
|
40
|
-
|
|
41
|
-
If cards start to look uneven, check image heights first, then paragraph length.
|
|
42
|
-
Consistency there usually fixes 80% of visual noise.
|