Skip to content

Commit 3d693be

Browse files
btraversclaude
andcommitted
refine(landing): editorial Principles section + refined hero copy
Apply the design-system refinement (claude design `refined/`): - Principles: drop the filled, bordered cards (same weight as the package cards) for an editorial 3-column grid — no fill, hairline rules, ghost numerals (01/02/03). "Why" now reads lighter than the "what" package cards. Headline becomes the punchier "The compiler should catch what tests can't."; lede retuned to match. - Hero: refined copy — lede reworded, CTAs become "Explore the packages" (primary → #projects) and "View on GitHub" (ghost, GitHub icon). Numerals use --text-accent (AA-tuned) rather than the refined file's raw --accent, so they stay readable in light mode. Verified in dark, light and mobile (single-column with the dividers flipped to top rules; no overflow). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 16957d1 commit 3d693be

1 file changed

Lines changed: 23 additions & 16 deletions

File tree

apps/website/.vitepress/theme/Landing.vue

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,13 @@ onMounted(() => {
116116
</div>
117117
<h1 class="btv-title"><span class="btv-pink">btrav</span><span>stack</span></h1>
118118
<p class="btv-lead">An expressive, robust TypeScript backend.</p>
119-
<p class="btv-sub">A small stack of type-safe building blocks for Node — contracts for your messaging and workflows, and a principled way to handle errors. Define things once, let the types flow everywhere.</p>
119+
<p class="btv-sub">A small set of type-safe building blocks for Node. Describe your messaging, workflows and errors once — and let the types flow to every call site.</p>
120120
<div class="btv-cta-row">
121-
<a href="https://github.com/btravstack" target="_blank" rel="noopener" class="cta-primary btv-primary-btn">
121+
<a href="#projects" class="cta-primary btv-primary-btn">Explore the packages</a>
122+
<a href="https://github.com/btravstack" target="_blank" rel="noopener" class="cta-ghost btv-ghost-cta">
122123
<svg width="18" height="18" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
123-
Explore the org
124+
View on GitHub
124125
</a>
125-
<a href="#projects" class="cta-ghost btv-ghost-cta">See the packages</a>
126126
</div>
127127
<div class="btv-pills">
128128
<span v-for="p in projects" :key="p.name" class="btv-pill">{{ p.name }}</span>
@@ -132,11 +132,11 @@ onMounted(() => {
132132

133133
<section id="philosophy" class="btv-section btv-narrow">
134134
<p class="btv-eyebrow">Why btravstack</p>
135-
<h2 class="btv-h2 btv-h2-wide">Building blocks for the TypeScript backend.</h2>
136-
<p class="btv-section-lead">Each package is small, focused and does one thing well — but they share a worldview: your interfaces are contracts, failure is part of the type, and the compiler should catch what tests can't.</p>
137-
<div class="grid-3 btv-prin">
138-
<div v-for="pr in principles" :key="pr.num" class="btv-prin-card">
139-
<div class="btv-prin-num">{{ pr.num }}</div>
135+
<h2 class="btv-h2 btv-h2-wide">The compiler should catch what tests can't.</h2>
136+
<p class="btv-section-lead">Each package is small, focused and does one thing well — but they share a worldview: your interfaces are contracts, failure is part of the type, and bad data stops at the door.</p>
137+
<div class="btv-prin">
138+
<div v-for="pr in principles" :key="pr.num" class="btv-prin-item">
139+
<span class="btv-prin-num">{{ pr.num }}</span>
140140
<h3 class="btv-prin-title">{{ pr.title }}</h3>
141141
<p class="btv-prin-body">{{ pr.body }}</p>
142142
</div>
@@ -313,13 +313,20 @@ onMounted(() => {
313313
.btv-h2-wide { max-width: 680px; }
314314
.btv-section-lead { margin: 16px 0 0; max-width: 640px; font-size: 16.5px; line-height: 1.65; color: var(--muted); }
315315
316-
/* Principles */
317-
.btv-prin { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; margin-top: 34px; }
318-
.btv-prin-card { background: var(--card); border: 1px solid var(--border); border-radius: 16px; padding: 22px; box-shadow: var(--card-rest-shadow); transition: transform .2s ease, border-color .2s ease; }
319-
.btv-prin-card:hover { transform: translateY(-3px); border-color: var(--border-2); }
320-
.btv-prin-num { width: 38px; height: 38px; border-radius: 10px; display: flex; align-items: center; justify-content: center; background: var(--accent-wash); border: 1px solid var(--accent-line); color: var(--text-accent); font-family: var(--mono); font-weight: 600; font-size: 15px; }
321-
.btv-prin-title { margin: 16px 0 0; font-weight: 700; font-size: 18px; letter-spacing: -0.3px; color: var(--text); }
322-
.btv-prin-body { margin: 9px 0 0; font-size: 14.5px; line-height: 1.6; color: var(--muted); }
316+
/* Principles — editorial, deliberately lighter than the filled package cards:
317+
no fill, hairline rules, ghost numerals. Reads as "why"; the filled package
318+
cards below read as "what". */
319+
.btv-prin { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0; margin-top: 44px; border-top: 1px solid var(--border-2); }
320+
.btv-prin-item { padding: 30px 30px 8px; border-left: 1px solid var(--border); }
321+
.btv-prin-item:first-child { border-left: none; padding-left: 0; }
322+
.btv-prin-num { font-family: var(--mono); font-weight: 500; font-size: 13px; letter-spacing: 1px; color: var(--text-accent); opacity: .85; }
323+
.btv-prin-title { margin: 18px 0 0; font-weight: 700; font-size: 19px; letter-spacing: -0.3px; color: var(--text); }
324+
.btv-prin-body { margin: 10px 0 0; font-size: 14.5px; line-height: 1.62; color: var(--muted); }
325+
@media (max-width: 880px) {
326+
.btv-prin { grid-template-columns: minmax(0, 1fr); }
327+
.btv-prin-item { border-left: none; padding: 26px 0 8px; border-top: 1px solid var(--border); }
328+
.btv-prin-item:first-child { border-top: none; padding-top: 30px; }
329+
}
323330
324331
/* Project cards */
325332
.btv-projects { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }

0 commit comments

Comments
 (0)