Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
f9996c0
docs(website): plan /app page revamp and add nav entry
samwillis Jun 3, 2026
83811fc
docs(website): reframe mobile as preview, fix /app plan inconsistencies
samwillis Jun 3, 2026
2446f46
docs(website): reframe /app rewrite as single PR + phases, fix nits
samwillis Jun 3, 2026
4c5ec5f
feat(website): scaffold /app rewrite (phase 1) — placeholder + sectio…
samwillis Jun 3, 2026
d363296
feat(website): /app phase 2 — hero rewrite + glyph row + §2 strap pair
samwillis Jun 3, 2026
58dfb8e
fix(website): /app phases 1+2 review — Mobile · Preview + cleanup
samwillis Jun 3, 2026
e6259b8
feat(website): /app phase 3 — three ways + scenarios + built for buil…
samwillis Jun 3, 2026
16dd3bc
fix(website): /app phase 3 review — locked copy + truthful comments
samwillis Jun 3, 2026
39e98ff
fix(website): /app phase 3 — name "software factory" in §3.5 scenario 1
samwillis Jun 3, 2026
4d39f30
feat(website): /app phase 4 — multi-device + bundled Horton
samwillis Jun 3, 2026
195a84e
fix(website): /app phase 4 review — trim §5 pillars + truthful comment
samwillis Jun 3, 2026
b7494cc
fix(website): /app copy review — drop section eyebrows, fix /quicksta…
samwillis Jun 3, 2026
5d27d76
fix(website): /app hero polish — divider + smaller pill + relocate re…
samwillis Jun 3, 2026
47f62da
fix(website): /app hero — strap + product-name title
samwillis Jun 3, 2026
7b13123
fix(website): /app §7a + §7b — product-name titles + rework mobile box
samwillis Jun 3, 2026
ace6b59
fix(website): /app §3 — tighter cards (shorter bodies, 4 short bullet…
samwillis Jun 3, 2026
e6c238a
website(app): drop trailing period from hero H1
samwillis Jun 3, 2026
b7796aa
website(app): rebalance hero platform row preview pill
samwillis Jun 3, 2026
23d0813
website(app): per-glyph Preview chips + drop hero strap
samwillis Jun 3, 2026
fac9781
website(app): link to /agents from hero sub-copy
samwillis Jun 3, 2026
b5fd243
website(app): drop trailing periods from section headings
samwillis Jun 3, 2026
44fe6c2
website(app): shrink hero preview chips, extend desktop/mobile divider
samwillis Jun 3, 2026
dd2d0bf
website(app): tighten hero preview chips against the platform label
samwillis Jun 3, 2026
72012be
website(app): give the hero preview chips a touch more room
samwillis Jun 3, 2026
2b6c5d2
website(app): set hero preview chip gap to ~5px
samwillis Jun 3, 2026
c790761
plan(app): add desktop + mobile mockup kit plan for §2 hero strap
samwillis Jun 3, 2026
a7ccfea
website(app): wire app-mockup framework + tokens probe (phase 1)
samwillis Jun 3, 2026
693a8bf
website(app): chrome primitives — frame, titlebar, traffic lights (ph…
samwillis Jun 3, 2026
8554145
feat(website): app mockup phase 3 — sidebar primitive
samwillis Jun 3, 2026
be80825
feat(website): app mockup phase 4 — chat + state primitives
samwillis Jun 3, 2026
ff1cd51
feat(website): app mockup phase 5 — desktop hero scene + chrome rearc…
samwillis Jun 3, 2026
297094e
feat(website): app mockup — replace CSS-drawn glyphs with real lucide…
samwillis Jun 3, 2026
06f0d16
feat(website): app mockup — drop agent-response avatar, add timeline …
samwillis Jun 3, 2026
5389b8f
mockup: align font sizes + button hit areas with live agents-server-ui
samwillis Jun 3, 2026
d6a0cfa
mockup: composer footer row — buttons sit beneath the textarea, not c…
samwillis Jun 3, 2026
366219f
mockup: stream agent response word-by-word, not character-by-character
samwillis Jun 3, 2026
be95053
mockup: gate code block + post paragraph + tool-call on cursor reachi…
samwillis Jun 3, 2026
c69379f
mockup: drop per-row divider on state-inspector event rows
samwillis Jun 3, 2026
d8b8df4
mockup: align macOS traffic lights with sidebar toggle / search / his…
samwillis Jun 3, 2026
49329f1
mockup: shrinkable runtime badges + 50/50 default split to match refe…
samwillis Jun 3, 2026
18e5333
mockup: hide chat-tile close X when state tile is dropped (single-til…
samwillis Jun 3, 2026
2b0c78c
mockup: tighter tile-header flex behaviour + sidebar breakpoint at 95…
samwillis Jun 3, 2026
a0f700c
mockup: drop small-caps + letter-spacing from user-message meta
samwillis Jun 3, 2026
aa4a77d
mockup: composer is a single 40-px flex row, not a 2-row grid
samwillis Jun 3, 2026
369cb18
mockup: align composer placeholder to left edge using footer-row layout
samwillis Jun 3, 2026
a40feaa
mockup: match live code-block and tool-call layouts
samwillis Jun 3, 2026
231751a
mockup: keep sidebar/workspace divider visible across the header
samwillis Jun 3, 2026
503449b
mockup: drop workspace soft shadow that was doubling the divider
samwillis Jun 3, 2026
04eaa1f
mockup: drop AppSidebar's redundant border-right
samwillis Jun 3, 2026
6ee5fd0
app page: integrate live desktop mockup into hero with shadow-DOM iso…
samwillis Jun 3, 2026
34b1a35
mockup shadow host: neutralise all inheritable text properties
samwillis Jun 3, 2026
b8a96de
hero mockup: scale desktop to 0.8 of layout size
samwillis Jun 3, 2026
5b41cfd
hero mockup: render desktop scene at 125 % and scale 0.8 to fit
samwillis Jun 3, 2026
75c8323
app page: fold desktop mockups into §3.5 scenarios
samwillis Jun 3, 2026
6b81bb0
app page: tailor §3.5 + §3 mockup content per scenario
samwillis Jun 4, 2026
fc3cb86
app page: drop §3 mockups, keep icon-only "Three ways" cards
samwillis Jun 4, 2026
d422db9
app page: drop §5 "Things you can ask Horton to do" prompt grid
samwillis Jun 4, 2026
a97f303
mockup chat: auto-pin to bottom + reposition tool-call before code block
samwillis Jun 4, 2026
6b49263
app page: rebuild §7b mobile section as two-store grid + repo note
samwillis Jun 4, 2026
d33ef91
app page: drop §3.5/§4 + merge §5+§6 into "Everything in the box"
samwillis Jun 4, 2026
36bb6a3
app page: reorder §3 to lead with "Build your own agents"
samwillis Jun 4, 2026
d3221f1
app page: tighten §4 to 3×3 grid + unboxed "Plus:" line
samwillis Jun 4, 2026
953ba68
app page: restyle §7a unsigned-preview note + reorder release-notes link
samwillis Jun 4, 2026
7446b71
app page: add §3 subtitle + tighten card bodies
samwillis Jun 4, 2026
40f9517
app page: centre §4 "Plus:" strip + fix wrapping orphan dot
samwillis Jun 4, 2026
d59322e
app page: tighten §7a unsigned-preview note copy + drop indent
samwillis Jun 4, 2026
69927b5
app mockup: add live mobile scene, time-synced to the desktop hero
samwillis Jun 4, 2026
43421a2
app page: tighten responsive mockup and mobile detection
samwillis Jun 4, 2026
e3909fc
app page: simplify copy and tighten typography
samwillis Jun 4, 2026
2f8aaf9
Merge origin/main into app page branch
samwillis Jun 4, 2026
b21cb32
app mockup: fix phone frame screen radius
samwillis Jun 4, 2026
bbaab53
app mockup: load production styles into shadow root
samwillis Jun 4, 2026
a8735dd
app page: wrap feature plus items in Safari
samwillis Jun 4, 2026
23610d1
app page: format download page copy
samwillis Jun 4, 2026
6d692cd
app page: untrack local plan docs
samwillis Jun 4, 2026
509de92
app mockup: drop reference screenshots
samwillis Jun 4, 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
13 changes: 13 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions website/.vitepress/theme/components/MegaNav.vue
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ const NAV = [
},
},
'|',
// App sits in its own visual group between the infra products
// (Agents / Streams / Sync) and the cloud / pricing cluster, with a
// divider on each side. It's neither an infra primitive nor cloud
// infrastructure — it's the desktop + mobile client surface for the
// whole platform, so it gets its own slot in the bar. Plain link
// (no dropdown) because the page is self-contained.
{ id: 'app', label: 'App', link: '/app' },
'|',
{
id: 'cloud',
label: 'Cloud',
Expand Down Expand Up @@ -173,6 +181,7 @@ const activeId = computed(() => {
if (p.startsWith('/agents') || p.startsWith('/docs/agents')) return 'agents'
if (p.startsWith('/streams') || p.startsWith('/docs/streams')) return 'streams'
if (p.startsWith('/sync') || p.startsWith('/docs/sync')) return 'sync'
if (p.startsWith('/app')) return 'app'
if (p.startsWith('/cloud')) return 'cloud'
if (p.startsWith('/pricing')) return 'pricing'
if (p.startsWith('/blog')) return 'blog'
Expand Down
2 changes: 2 additions & 0 deletions website/.vitepress/theme/components/MegaNavMobile.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ const NAV = [
],
},
'|',
{ id: 'app', label: 'App', link: '/app' },
'|',
{
id: 'cloud',
label: 'Cloud',
Expand Down
1 change: 1 addition & 0 deletions website/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"dependencies": {
"@electric-sql/pglite": "0.4.5",
"@electric-sql/pglite-repl": "0.3.5",
"lucide-vue-next": "^0.561.0",
"posthog-js": "^1.236.4"
}
}
82 changes: 82 additions & 0 deletions website/src/components/app-download/AdPlaceholder.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<script setup lang="ts">
/* Placeholder block for the /app page rewrite.

Drops a styled, dashed-border rectangle into a section as a stand-in
for content (text + cards + screenshots) that lands in later phases
of the rewrite. Mirrors the visual language of the rest of the
landing pages (rounded border, soft bg, mono label) so that
placeholders read as deliberate scaffolding rather than as broken
content if a reviewer browses the page mid-PR.

Each placeholder carries a `data-placeholder` attribute that names
the section / asset slot — useful both for reviewers reading the
diff and for grepping later when assets land. Swap each placeholder
for the real content one section at a time; the surrounding chrome
doesn't change. */
defineProps<{
/** Short label rendered inside the placeholder and written to the
* `data-placeholder` attribute. Two conventions in use today:
* - **Section slot** — e.g. `§3 — Three ways to use it`. Use when
* the placeholder stands in for an entire section's content
* (cards, copy, scenario grid, etc.) that lands in a later
* phase.
* - **Asset filename** — e.g. `desktop-hero.png`. Use when the
* placeholder stands in for a specific image / SVG slot that
* will be filled by a captured asset. The filename matches the
* final asset path under `website/public/img/app/`. */
name: string
/** Optional CSS aspect-ratio (e.g. "16/9", "21/9"). When omitted,
* the placeholder uses its content's intrinsic height with the
* shared `min-height` floor. */
aspect?: string
/** Optional second-line caption explaining what eventually lives
* in this slot. Kept short — full intent lives in the plan doc. */
sublabel?: string
}>()
</script>

<template>
<div
class="ad-placeholder"
:data-placeholder="name"
:style="aspect ? { aspectRatio: aspect } : undefined"
>
<span class="ad-placeholder-label mono">{{ name }}</span>
<span v-if="sublabel" class="ad-placeholder-sublabel">{{ sublabel }}</span>
</div>
</template>

<style scoped>
.ad-placeholder {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
padding: 40px 24px;
min-height: 200px;
width: 100%;
border: 1.5px dashed
color-mix(in srgb, var(--vp-c-text-3) 45%, var(--vp-c-divider));
border-radius: 16px;
background: color-mix(in srgb, var(--vp-c-bg-soft) 55%, transparent);
color: var(--vp-c-text-3);
text-align: center;
box-sizing: border-box;
}

.ad-placeholder-label {
font-size: 13px;
letter-spacing: 0.02em;
color: var(--vp-c-text-2);
word-break: break-word;
max-width: 640px;
}

.ad-placeholder-sublabel {
font-size: 12px;
line-height: 1.5;
color: var(--vp-c-text-3);
max-width: 520px;
}
</style>
Loading
Loading