feat(www): landing page (#25)
* design: landing page spec + app icon asset * chore(www): add anime.js, fonts, and landing page screenshot assets * feat(www): add design tokens, fonts, shared layout * feat(www): add landing page sections and styling * feat(www): add theme toggle and anime.js viewport animations * feat(www): feedback updates — no hero card, os-aware download, footer email, lowercase colored heading * feat(www): remove screenshot borders, move macos hint below ctas, mobile github fallback * feat(www): keep hero CTAs side by side * feat(www): set initial nav border to transparent * feat(www): add Rybbit prod-only, sitemap, SEO head, OG image, robots.txt, 404 page * docs(AGENTS): include www landing page version in release sync checklist * chore(www): add railpack.json for Dokploy deploy (force node provider, TZ) * chore(www): use bun for Railpack deploy (packageManager + standalone www/bun.lock) * docs(AGENTS): note www/bun.lock sync for Railpack deploys * chore(www): add vitest test tooling * feat(www): add FAQ data source * feat(www): add SEO JSON-LD builders * feat(www): add Seo JSON-LD component * feat(www): wire Seo component and social/meta tags into Layout * feat(www): add homepage JSON-LD, keyword H1, data-driven FAQ * fix(www): point Roadmap footer link to GitHub * feat(www): add lastmod to sitemap * perf(www): self-host anime.js * refactor(www): move nav and footer into shared Layout * feat(www): add changelog page * fix(www): make shared component styles global in Layout * perf(www): optimize screenshots with Astro Image (webp/avif + srcset) * feat(www): add web app manifest * feat(www): add helpful links to 404 page * fix(www): shorten homepage H1 copy * fix(www): OS-aware navbar download + footer layout * feat(www): build full changelog from v0.7.0 to v0.7.10
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
# Gridline landing page — design spec
|
||||
|
||||
**Date:** 2026-10-05
|
||||
**Scope:** `www/` Astro site, single long-scrolling landing page, first public-facing marketing page.
|
||||
**Approach:** Zen Browser layout + Gridline app visual identity. Dark-first with system-aware light mode.
|
||||
|
||||
---
|
||||
|
||||
## Goal
|
||||
|
||||
Replace the current default Astro starter page with a focused landing page whose primary action is **downloading the desktop app**. Secondary actions: view GitHub repo, read feature highlights, open FAQ answers.
|
||||
|
||||
---
|
||||
|
||||
## Sections (in order)
|
||||
|
||||
1. **Nav** — fixed, translucent, pill nav on scroll
|
||||
2. **Hero** — eyebrow, headline, subtitle, dual CTA, app screenshot card
|
||||
3. **Why Gridline** — three value props
|
||||
4. **Feature highlights** — four feature cards with screenshots
|
||||
5. **Open source** — GitHub callout
|
||||
6. **FAQ** — five accordion items
|
||||
7. **Footer** — Zen-style big footer
|
||||
|
||||
---
|
||||
|
||||
## Design system
|
||||
|
||||
### Typography
|
||||
|
||||
| Role | Font | Package |
|
||||
|------|------|---------|
|
||||
| Serif display headings | Literata | `@fontsource-variable/literata` |
|
||||
| Sans-serif body / UI | Outfit | `@fontsource-variable/outfit` |
|
||||
| Monospace code / labels | Space Mono | `@fontsource/space-mono` |
|
||||
|
||||
### Color tokens
|
||||
|
||||
| Token | Dark value | Light value |
|
||||
|-------|------------|-------------|
|
||||
| `--bg` | `#0a0a0a` | `#fafafa` |
|
||||
| `--surface` | `rgba(255,255,255,0.04)` | `rgba(0,0,0,0.03)` |
|
||||
| `--surface-elevated` | `rgba(255,255,255,0.07)` | `rgba(0,0,0,0.06)` |
|
||||
| `--border` | `rgba(255,255,255,0.10)` | `rgba(0,0,0,0.10)` |
|
||||
| `--text` | `rgba(255,255,255,0.90)` | `#171717` |
|
||||
| `--text-muted` | `rgba(255,255,255,0.55)` | `#737373` |
|
||||
| `--primary` | `#3b82f6` | `#2563eb` |
|
||||
| `--primary-hover` | `#60a5fa` | `#1d4ed8` |
|
||||
| `--accent` | `#f59e0b` | `#d97706` |
|
||||
|
||||
### Radius & spacing
|
||||
|
||||
- Buttons: `9999px` pill
|
||||
- Large cards / screenshot frame: `1.5rem`
|
||||
- Small cards: `1rem`
|
||||
- Section vertical gap: `6rem` desktop, `4rem` mobile
|
||||
- Max container width: `1200px`
|
||||
|
||||
---
|
||||
|
||||
## Section details
|
||||
|
||||
### Nav
|
||||
|
||||
- Logo + wordmark on left (icon SVG + “Gridline” in Sans)
|
||||
- Links on right: Features, GitHub, Download
|
||||
- Theme toggle icon button
|
||||
- On scroll past hero: background gains `--surface` with backdrop blur
|
||||
|
||||
### Hero
|
||||
|
||||
- Eyebrow: `OPEN-SOURCE DATABASE GUI` in Space Mono uppercase, small, amber
|
||||
- H1: serif, “One app for every database.”
|
||||
- Subtitle: sans, max-width ~560px
|
||||
- CTA row:
|
||||
- Primary pill: “Download for macOS” (OS-detected, default macOS)
|
||||
- Secondary ghost pill: “View on GitHub”
|
||||
- App screenshot card: query-editor.png inside rounded glass frame with subtle gradient border
|
||||
- Version note below screenshot: “Free for personal and commercial use · Apache 2.0 · v0.7.10”
|
||||
|
||||
### Why Gridline
|
||||
|
||||
- Heading: “Everything the paid apps lock behind a subscription.”
|
||||
- Three glass cards:
|
||||
1. **No limits** — connections, tabs, saved queries, exports.
|
||||
2. **DB-to-DB sync** — pipe pg_dump → pg_restore between live connections.
|
||||
3. **Deeper PG explorer** — functions, triggers, sequences, enums, extensions.
|
||||
|
||||
### Feature highlights
|
||||
|
||||
- 2×2 grid of cards. Each card has:
|
||||
- Small icon / monospace label
|
||||
- Heading
|
||||
- One-line description
|
||||
- Screenshot image (home, er-diagram, data-grid, json-popover)
|
||||
|
||||
Cards:
|
||||
|
||||
1. **Query & edit** — query editor + virtualized data grid — `query-editor.png`
|
||||
2. **Visualize schemas** — ER diagram with cross-schema FKs — `er-diagram.png`
|
||||
3. **Move data** — backup, restore, DB-to-DB sync — `home.png` or abstract graphic
|
||||
4. **Manage objects** — functions, triggers, roles, grants — `data-grid.png`
|
||||
|
||||
### Open source
|
||||
|
||||
- Centered section with GitHub star count (static for now, can be dynamic later)
|
||||
- Heading: “Built in public. No VC roadmap, no rug pulls.”
|
||||
- CTA: “Star on GitHub”
|
||||
|
||||
### FAQ
|
||||
|
||||
- Five accordion items, first open by default:
|
||||
1. Is Gridline really free for commercial use?
|
||||
2. Which databases are supported?
|
||||
3. How is this different from TablePlus / Beekeeper / DB Pro?
|
||||
4. Do you store my database credentials?
|
||||
5. Can I self-host or contribute?
|
||||
|
||||
### Footer
|
||||
|
||||
- Zen-style big footer, 4-column layout
|
||||
- Brand blurb + three link columns: Product, Project, Connect
|
||||
- Bottom bar: copyright + license + small tagline
|
||||
|
||||
---
|
||||
|
||||
## Theme behavior
|
||||
|
||||
- Default follows system `prefers-color-scheme`.
|
||||
- Toggle persists choice to `localStorage` key `gridline-theme`.
|
||||
- `html` gets class `.light` when light mode is active; base styles target `:root` for dark.
|
||||
- Tailwind v4 configured with CSS variables in `global.css`.
|
||||
|
||||
---
|
||||
|
||||
## Motion
|
||||
|
||||
Use `animejs` loaded as a script in the landing page only (no need site-wide yet).
|
||||
|
||||
### Hero entrance
|
||||
|
||||
1. Nav: `translateY(-20px)`, opacity 0 → 1, 600ms, easeOutExpo
|
||||
2. Eyebrow: 80ms delay, `translateY(15px)` → 0
|
||||
3. H1 words: split by word, stagger 60ms, `translateY(30px)` → 0
|
||||
4. Subtitle + buttons: 150ms delay, `translateY(20px)` → 0
|
||||
5. Screenshot card: scale 0.96 → 1, opacity 0 → 1, 800ms
|
||||
|
||||
### Scroll reveals
|
||||
|
||||
- Each section observes IntersectionObserver threshold 0.15.
|
||||
- On enter: direct children animate `translateY(40px)` → 0, opacity 0 → 1, stagger 80–120ms.
|
||||
- `prefers-reduced-motion`: skip transform, only fade opacity.
|
||||
|
||||
### Micro-interactions
|
||||
|
||||
- Primary CTA hover: scale 1.02, brighter background, larger shadow
|
||||
- Nav link hover: underline slides in from left
|
||||
- Theme toggle: rotate + crossfade 300ms
|
||||
- FAQ accordion: height + opacity expand, chevron rotate 180°
|
||||
|
||||
---
|
||||
|
||||
## Assets
|
||||
|
||||
| Asset | Source | Destination |
|
||||
|-------|--------|-------------|
|
||||
| Gridline icon SVG | `desktop/src-tauri/icons/icon.svg` | `www/public/gridline-icon.svg` |
|
||||
| Query editor screenshot | `screenshots/query-editor.png` | `www/public/screenshots/query-editor.png` |
|
||||
| ER diagram screenshot | `screenshots/er-diagram.png` | `www/public/screenshots/er-diagram.png` |
|
||||
| Home screenshot | `screenshots/home.png` | `www/public/screenshots/home.png` |
|
||||
| Data grid screenshot | `screenshots/data-grid.png` | `www/public/screenshots/data-grid.png` |
|
||||
| JSON popover screenshot | `screenshots/json-popover.png` | `www/public/screenshots/json-popover.png` |
|
||||
|
||||
---
|
||||
|
||||
## Tech notes
|
||||
|
||||
- Astro 7 + Tailwind CSS v4 + TypeScript.
|
||||
- `animejs` added as dependency.
|
||||
- Fontsource packages added for all three typefaces.
|
||||
- Landing page implemented as `www/src/pages/index.astro` with Astro components / vanilla JS for motion.
|
||||
- No framework components needed for this version; keep it static and fast.
|
||||
|
||||
---
|
||||
|
||||
## Open questions / future iterations
|
||||
|
||||
- Dynamic GitHub star count.
|
||||
- OS-aware download button text.
|
||||
- Multi-page expansion (Docs, Changelog, Download) after landing page ships.
|
||||
- Testimonial / social proof section if we collect quotes.
|
||||
Reference in New Issue
Block a user