Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
d773248
feat(web): add rehype-pretty-code and shiki for docs highlighting
blove May 8, 2026
4e1ff9c
feat(web): add custom Dawn shiki theme
blove May 8, 2026
87cdb78
feat(web): wire rehype-pretty-code into MDX pipeline with Dawn theme
blove May 8, 2026
48c242d
feat(web): add CodeGroup MDX component for multi-file tabs
blove May 8, 2026
0937968
feat(web): add Pre and InlineCode MDX components
blove May 8, 2026
522e937
feat(web): wire Pre, InlineCode, and CodeGroup into MDX components
blove May 8, 2026
4b78fdb
feat(web): add styles for inline code and shiki line containers
blove May 8, 2026
b1c1817
feat(web): swap logo wall to simpleicons monochrome SVGs with name la…
blove May 8, 2026
e55ba39
test(web): add smoke page for code-block variants
blove May 8, 2026
007872f
feat(web): add shiki highlight helper for landing snippets
blove May 8, 2026
6250e7a
feat(web): rewrite landing CodeExample using shiki pipeline
blove May 8, 2026
5ed36e0
chore(web): remove code-blocks smoke test page
blove May 8, 2026
cef0ef9
feat(web): drop tech pills from hero, remove stats strip, set LICENSE…
blove May 8, 2026
aabc39b
chore(web): biome lint fixes for code-blocks + logo wall
blove May 8, 2026
18ad1a8
docs: add code-blocks spec and implementation plan
blove May 8, 2026
8b2dba1
docs: add landing dawn arc design spec
blove May 8, 2026
eb86e0a
docs: add landing dawn arc implementation plan
blove May 8, 2026
a53c772
feat(web): add palette stops table for landing dawn arc
blove May 8, 2026
7d08ffa
feat(web): add palette interpolation engine
blove May 8, 2026
4281662
feat(web): add landing palette CSS variables with reduced-motion fall…
blove May 8, 2026
d9883a3
feat(web): add PaletteScroller client component
blove May 8, 2026
d8cd5d7
feat(web): mount PaletteScroller, remove LandingAmbient
blove May 8, 2026
9ff4653
feat(web): drop hardcoded section backgrounds for landing arc inherit…
blove May 8, 2026
52ad98a
feat(web): migrate landing section surfaces and text to palette varia…
blove May 8, 2026
5c1680b
feat(web): rewrite CtaSection as full-width dawn-rising panel with do…
blove May 8, 2026
cb11854
feat(web): expand vertical breathing room across daylight sections
blove May 8, 2026
f0b83b2
docs: add big-reveal section design spec
blove May 8, 2026
53ca328
docs: add big-reveal section implementation plan
blove May 8, 2026
527c520
feat(web): add BigReveal full-height pull-quote section
blove May 8, 2026
aca4444
feat(web): mount BigReveal between Comparison and Solution
blove May 8, 2026
358c083
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 8, 2026
3ee4482
feat(web): tune palette stops, restore fixed-dark code surfaces in Co…
blove May 8, 2026
71088e1
docs: add pattern section (ArchitectureSection redesign) spec
blove May 8, 2026
72b642d
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 8, 2026
2ac26be
docs: add pattern section implementation plan
blove May 8, 2026
c03a1c5
feat(web): rewrite ArchitectureSection as the pattern moment (Next.js…
blove May 8, 2026
afe3b5e
feat(web): pass 3a — daylight footer, shiki scaffold blocks, deploy c…
blove May 8, 2026
3dbca65
feat(web): support dark logo variant for daylight footer context
blove May 8, 2026
68253f8
feat(web): rewrite FeatureGrid as 3-column categorized layout
blove May 8, 2026
c2d0b42
fix(web): full-page polish — shiki ProblemSection, clearer headers, d…
blove May 9, 2026
5b4dfc0
docs: add quick-check section design spec
blove May 9, 2026
8613a35
feat(web): rewrite Quick check section as meta-framework brand wall +…
blove May 9, 2026
9d5e1b2
fix(web): mobile responsive — hide brand-wall pills below md, tighten…
blove May 9, 2026
a39c384
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 9, 2026
150c7e8
docs: add Flow + Ecosystem section design spec
blove May 9, 2026
6fdb0a2
feat(web): rewrite Flow + Ecosystem sections
blove May 9, 2026
54c1d07
refactor(web): move EcosystemSection before CodeExample on landing
blove May 9, 2026
c4f395b
docs: add docs chrome polish design spec
blove May 10, 2026
c7fbb48
docs: add docs chrome polish plan
blove May 10, 2026
02065f1
feat(web): polish docs chrome — full-width layout, flat sidebar, tigh…
blove May 10, 2026
5b7f322
fix(web): collapse double line spacing in code blocks via grid layout
blove May 10, 2026
054c818
docs: add mobile menu design spec
blove May 10, 2026
8246a74
feat(web): add mobile menu — full-screen overlay with site + docs nav
blove May 10, 2026
2426e0a
docs: add Phase B docs content pass spec + plan
blove May 10, 2026
11108fc
feat(web): restructure docs sidebar — relabel sections, add Agents entry
blove May 10, 2026
44139da
docs: add Agents page (extracted from routes.mdx, expanded)
blove May 10, 2026
fe2fefd
feat(web): mount /docs/agents route
blove May 10, 2026
45431af
docs: trim routes.mdx — drop duplicated Agents/Tools/State/Middleware…
blove May 10, 2026
ce170bf
docs: structural consistency pass — uniform Lede → Examples → Referen…
blove May 10, 2026
d8aa0df
feat(web): add Mental Model docs page (Phase A.1)
blove May 10, 2026
31435d2
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 10, 2026
427ba0b
feat(web): add API Reference docs page (Phase A.2)
blove May 10, 2026
c7ca46c
fix(web): vertically center copy button in single-line code blocks
blove May 10, 2026
36435e1
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 10, 2026
9de946b
docs(spec): Phase A.3 — recipes design
blove May 10, 2026
aa11bcd
feat(web): add Recipes section (Phase A.3)
blove May 10, 2026
796f89b
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 10, 2026
b565d51
docs(spec): Phase A.4 — FAQ design
blove May 10, 2026
1fac758
feat(web): add FAQ page (Phase A.4)
blove May 10, 2026
0b3a6b6
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 10, 2026
8fd6632
docs(spec): Phase C — migrating from LangGraph design
blove May 10, 2026
ec5e41c
feat(web): add Migrating from LangGraph walkthrough (Phase C)
blove May 10, 2026
bdc342b
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 10, 2026
656a4a4
docs: cross-page polish — link audit, cross-refs, voice consistency
blove May 10, 2026
1668ba3
feat(web): always-on code block header with tab pill + multi-file exa…
blove May 10, 2026
7435eaa
fix(web): wire CodeGroup + RehypeFigure to use title from figcaption …
blove May 10, 2026
5b4f2be
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
1364779
feat(web): header polish + code-block + folder tree alignment
blove May 11, 2026
813d525
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
43724c4
feat(web): page actions menu + reusable RelatedCards grid
blove May 11, 2026
ffa89ba
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
d60527d
feat(web): rewrite Getting Started as a tight sales-y quickstart
blove May 11, 2026
059a5f2
fix(web): docs-check + hydration mismatch in RehypeFigure
blove May 11, 2026
dcfdb3b
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
8add227
feat(web): GitHub stars badge in nav + StarsSection on landing
blove May 11, 2026
4ace898
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
3de88e6
feat(web): hardcode 100+ stars; remove fork count and live fetcher
blove May 11, 2026
66e24a3
docs(spec): redesign ProblemSection — fragmentation-led, friendly voice
blove May 11, 2026
2ed8f7a
feat(web): redesign ProblemSection — fragmentation lead, friendly voice
blove May 11, 2026
da45b12
docs(spec): hero + identity rewrite (positioning batch A)
blove May 11, 2026
ecb373f
feat(web): hero positioning rewrite — "Build LangGraph agents like Ne…
blove May 11, 2026
5896f30
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
b78748f
docs(spec): trust + qualification sections (positioning batch B)
blove May 11, 2026
86f27d9
feat(web): trust + qualification sections (positioning batch B)
blove May 11, 2026
631209e
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
a52193f
docs(spec): migration CTA section (positioning batch C)
blove May 11, 2026
72ab510
feat(web): migration CTA section (positioning batch C)
blove May 11, 2026
6f108ea
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
9a7bf31
docs(spec): comic strip section — character/dialog landing break
blove May 11, 2026
f6dc444
feat(web): comic strip landing section — two devs comparing notes
blove May 11, 2026
c74e7ec
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
ac325fc
feat(web): swap comic strip placeholders for AI-generated panel art
blove May 11, 2026
8f8af9a
Merge remote-tracking branch 'origin/main' into claude/silly-panini-d…
blove May 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 37 additions & 117 deletions apps/web/app/components/landing/ComicStrip.tsx
Original file line number Diff line number Diff line change
@@ -1,128 +1,37 @@
import type { ReactNode } from "react"

// Placeholder stick-figure illustrations for v1. Each panel is a simple
// monochrome amber-stroke SVG. Swap these out for commissioned cartoony art
// in a follow-up commit — the structure here is stable enough to swap visuals
// without touching the dialog/layout.

function Panel1SVG() {
return (
<svg viewBox="0 0 200 140" fill="none" stroke="currentColor" strokeWidth="1.5">
<title>Frustrated developer at a cluttered desk</title>
{/* Desk */}
<line x1="30" y1="100" x2="170" y2="100" />
{/* Monitor */}
<rect x="60" y="50" width="80" height="50" rx="2" />
{/* Boilerplate code lines on monitor */}
<line x1="68" y1="62" x2="120" y2="62" strokeWidth="1" />
<line x1="68" y1="70" x2="130" y2="70" strokeWidth="1" />
<line x1="68" y1="78" x2="115" y2="78" strokeWidth="1" />
<line x1="68" y1="86" x2="125" y2="86" strokeWidth="1" />
{/* Developer (stick figure) */}
<circle cx="100" cy="28" r="8" />
<line x1="100" y1="36" x2="100" y2="55" />
{/* Frown */}
<path d="M 96 28 Q 100 31 104 28" />
{/* Sad eyebrows */}
<line x1="94" y1="24" x2="98" y2="26" strokeWidth="1" />
<line x1="102" y1="26" x2="106" y2="24" strokeWidth="1" />
</svg>
)
}

function Panel2SVG() {
return (
<svg viewBox="0 0 200 140" fill="none" stroke="currentColor" strokeWidth="1.5">
<title>Developer with head in hands</title>
{/* Desk */}
<line x1="30" y1="100" x2="170" y2="100" />
{/* Developer head */}
<circle cx="100" cy="50" r="14" />
{/* Hands covering face */}
<path d="M 86 50 Q 92 60 100 58 Q 108 60 114 50" />
{/* Arms going up to head */}
<line x1="84" y1="52" x2="76" y2="78" />
<line x1="116" y1="52" x2="124" y2="78" />
{/* Body slumped */}
<line x1="100" y1="64" x2="100" y2="98" />
</svg>
)
}

function Panel3SVG() {
return (
<svg viewBox="0 0 200 140" fill="none" stroke="currentColor" strokeWidth="1.5">
<title>Second developer entering with a coffee mug</title>
{/* Desk */}
<line x1="30" y1="100" x2="170" y2="100" />
{/* Dev A still at desk */}
<circle cx="70" cy="50" r="8" />
<line x1="70" y1="58" x2="70" y2="92" />
<line x1="70" y1="92" x2="60" y2="100" />
<line x1="70" y1="92" x2="80" y2="100" />
{/* Monitor */}
<rect x="50" y="58" width="40" height="28" rx="2" />
{/* Dev B entering, holding mug */}
<circle cx="140" cy="50" r="9" />
{/* Smile */}
<path d="M 136 52 Q 140 56 144 52" />
<line x1="140" y1="59" x2="140" y2="92" />
<line x1="140" y1="92" x2="130" y2="100" />
<line x1="140" y1="92" x2="150" y2="100" />
{/* Arm with mug */}
<line x1="140" y1="68" x2="124" y2="74" />
<rect x="116" y="68" width="10" height="10" rx="1" />
{/* Steam */}
<path d="M 119 64 Q 120 60 121 64" strokeWidth="1" />
<path d="M 123 64 Q 124 60 125 64" strokeWidth="1" />
</svg>
)
}

function Panel4SVG() {
return (
<svg viewBox="0 0 200 140" fill="none" stroke="currentColor" strokeWidth="1.5">
<title>Developer looking at a clean three-file project</title>
{/* Desk */}
<line x1="30" y1="120" x2="170" y2="120" />
{/* Monitor */}
<rect x="55" y="45" width="90" height="65" rx="2" />
{/* Three-file tree on monitor */}
<line x1="65" y1="60" x2="80" y2="60" strokeWidth="1" />
<line x1="70" y1="72" x2="115" y2="72" strokeWidth="1" />
<line x1="70" y1="84" x2="118" y2="84" strokeWidth="1" />
<line x1="70" y1="96" x2="105" y2="96" strokeWidth="1" />
{/* Developer (above the monitor area, slightly raised eyebrows) */}
<circle cx="100" cy="25" r="7" />
{/* Surprised mouth */}
<circle cx="100" cy="27" r="2" />
{/* Raised eyebrows */}
<line x1="94" y1="20" x2="98" y2="19" strokeWidth="1" />
<line x1="102" y1="19" x2="106" y2="20" strokeWidth="1" />
<line x1="100" y1="32" x2="100" y2="45" />
</svg>
)
}
import Image from "next/image"

interface Panel {
readonly speaker: "Dev A" | "Dev B"
readonly line: string
readonly illustration: ReactNode
readonly src: string
readonly alt: string
}

const PANELS: readonly Panel[] = [
{ speaker: "Dev A", line: "Fifth StateGraph this month.", illustration: <Panel1SVG /> },
{
speaker: "Dev A",
line: "Fifth StateGraph this month.",
src: "/comic/panel-1.png",
alt: "Developer at a cluttered desk, frowning at a monitor full of code, hand on chin.",
},
{
speaker: "Dev A",
line: "This isn't agent code. This is project structure.",
illustration: <Panel2SVG />,
src: "/comic/panel-2.png",
alt: "Same developer slumped forward with both hands pressed against their temples, the monitor still cluttered.",
},
{
speaker: "Dev B",
line: "You know Next.js, right? Same thing for LangGraph.",
illustration: <Panel3SVG />,
src: "/comic/panel-3.png",
alt: "A second developer in a mustard hoodie walks in with a coffee mug, leaning toward the first developer's screen with a small smile.",
},
{
speaker: "Dev A",
line: "…wait, that's it?",
src: "/comic/panel-4.png",
alt: "The first developer sits upright, wide-eyed in surprise, the monitor now showing a clean three-line file tree.",
},
{ speaker: "Dev A", line: "…wait, that's it?", illustration: <Panel4SVG /> },
]

export function ComicStrip() {
Expand All @@ -137,14 +46,25 @@ export function ComicStrip() {

<div className="max-w-6xl mx-auto grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
{PANELS.map((p) => (
<div key={p.line} className="landing-surface border border-border-subtle rounded-lg p-5">
<div className="aspect-[200/140] flex items-center justify-center text-accent-amber mb-4">
{p.illustration}
<div
key={p.line}
className="landing-surface border border-border-subtle rounded-lg overflow-hidden"
>
<div className="aspect-square relative bg-bg-card">
<Image
src={p.src}
alt={p.alt}
fill
sizes="(min-width: 1024px) 25vw, (min-width: 768px) 50vw, 100vw"
className="object-cover"
/>
</div>
<div className="p-5">
<p className="text-sm leading-relaxed">
<strong className="text-text-primary font-medium">{p.speaker}:</strong>{" "}
<span className="landing-text-muted">{p.line}</span>
</p>
</div>
<p className="text-sm leading-relaxed">
<strong className="text-text-primary font-medium">{p.speaker}:</strong>{" "}
<span className="landing-text-muted">{p.line}</span>
</p>
</div>
))}
</div>
Expand Down
Binary file added apps/web/public/comic/panel-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/comic/panel-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/comic/panel-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/comic/panel-4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading