// === Flipbook sections: social, buzz, app preview, FAQ, footer === /* ---------- Social proof masonry ---------- */ const MASONRY = [ { tone: 'photo-fam', shape: 'tall', tag: "Mother's Day", img: "https://images.unsplash.com/photo-1542037104857-ffbb0b9155fb?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-travel', shape: 'square', tag: "Lisbon · 2024", img: "https://images.unsplash.com/photo-1502602898657-3e91760cbb34?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-pet', shape: 'wide', tag: "Mochi's year", img: "https://images.unsplash.com/photo-1583337130417-3346a1be7dee?auto=format&fit=crop&w=700&q=80" }, { tone: 'photo-couple', shape: 'tall', tag: "Five years us", img: "https://images.unsplash.com/photo-1519741497674-611481863552?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-birthday', shape: 'square', tag: "Eva turns 4", img: "https://images.unsplash.com/photo-1558636508-e0db3814bd1d?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-beach', shape: 'xtall', tag: "Summer 25", img: "https://images.unsplash.com/photo-1473496169904-658ba7c44d8a?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-fam', shape: 'wide', tag: "Sunday lunch", img: "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?auto=format&fit=crop&w=700&q=80" }, { tone: 'photo-couple', shape: 'square', tag: "Engaged ♥", img: "https://images.unsplash.com/photo-1529290130-4ca3753253ae?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-travel', shape: 'tall', tag: "Tokyo nights", img: "https://images.unsplash.com/photo-1542051841857-5f90071e7989?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-pet', shape: 'square', tag: "First walk", img: "https://images.unsplash.com/photo-1587300003388-59208cc962cb?auto=format&fit=crop&w=600&q=80" }, { tone: 'photo-birthday', shape: 'wide', tag: "Sweet sixteen", img: "https://images.unsplash.com/photo-1464349095431-e9a21285b5f3?auto=format&fit=crop&w=700&q=80" }, { tone: 'photo-beach', shape: 'tall', tag: "Costa Rica", img: "https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&fit=crop&w=600&q=80" }, ]; function Social() { return (
From the community

What people are making.

280,000 flipbooks created this month. Here's a tiny slice.

{MASONRY.map((m, i) => (
e.target.style.display='none'} />
{m.tag}
))}
); } /* ---------- Buzz cards (Reddit / Twitter style — original wording) ---------- */ const BUZZ = [ { body: <>okay I did not expect a flipbook app to make me cry on a tuesday. but here we are., glyph: '♥' }, { body: <>found this in the App Store random scroll. made one of my dog growing up. I've watched it like thirty times., glyph: '✨' }, { body: <>made a flipbook of mom's birthday and printed it. she keeps showing it to people. ten dollars best spent this year., glyph: '♥' }, { body: <>this feels like a real product. clean UI, no ads, no weird subscription wall. just makes a nice thing., glyph: '✴' }, { body: <>my partner asked what I was watching. I showed him my flipbook of our cat. he immediately made one of his nephew., glyph: '♥' }, { body: <>whoever designed this got every detail right. the paper texture, the page sound, the tiny shadow. actual craft., glyph: '✨' }, ]; function Buzz() { return (
The buzz

People won't stop talking about it.

{BUZZ.map((b, i) => (
{b.body}
{b.glyph}
))}
); } /* ---------- App preview phones ---------- */ function AppPreview() { return (
Inside the app

Designed to disappear.

Every screen has one job. No tutorials, no popups, no clutter. Just you and your memories.

{/* Phone 1 — Home */}
9:41● ●
Flipbook
Good morning,
Lila ✦
Mother's Day
26 pages · made yesterday
Mochi turns two
14 pages · last week
{/* Phone 2 — Create flow (center, larger) */}
9:41● ●
STEP 2 OF 4
Next →
Pick a theme.
Warm
Noir
Linen
Coast
Continue →
{/* Phone 3 — Store */}
9:41● ●
Store
BAG · 1
Printed flipbooks.
Pocket size
3.5 × 4.5 in
$14
Classic
5 × 7 in · hardcover
$28
Gift box
3 books · wrapped
$54
Home·Create·Store
); } /* ---------- FAQ ---------- */ const FAQS = [ { q: "Can I create a flipbook from a video?", a: "Yes — drop in any video up to 5 minutes. The app picks the strongest frames automatically, or you can scrub through and pick them by hand. iPhone, Android, and exported social videos all work." }, { q: "Can I create from photos?", a: "Of course. Pick anywhere from 10 to 300 photos. Reorder by drag, add captions, and the app handles the rest." }, { q: "Can I export as a GIF or MP4?", a: "Yep. One tap, three formats — GIF for messaging, MP4 for social, and PDF for printing. No watermark on any export." }, { q: "Can I order a printed flipbook?", a: "We print real flipbooks on 300gsm uncoated paper. Pocket size from $14, classic hardcover from $28. Ships in 3–5 days worldwide." }, { q: "Is there a free version?", a: "The first three flipbooks are free, fully featured. After that it's $4.99/month or $39/year, with no extra fees on exports. Printed books are sold separately." }, ]; function FAQ() { const [open, setOpen] = useState(0); return (
Questions, answered

Good to know.

{FAQS.map((f, i) => (
setOpen(open === i ? -1 : i)}>
{f.q}
{f.a}
))}
); } /* ---------- Final CTA + Footer ---------- */ function FinalCTA() { return (

Make one. Right now.

Your first three flipbooks are free. We promise the first one will surprise you.

Download on the App Store Get it on Google Play
Free · No ads · iOS 16+ · Android 12+
); } function Footer() { return ( ); } /* ---------- Upcoming Occasions ---------- */ function Occasions() { // Read OCCASIONS from window (loaded via occasions-data.js) const list = (typeof window !== 'undefined' && window.OCCASIONS) ? window.OCCASIONS : []; // Sort: upcoming dated first by daysAhead, then evergreen const dated = list.filter(o => o.daysAhead !== null).sort((a, b) => a.daysAhead - b.daysAhead); const evergreen = list.filter(o => o.daysAhead === null); const ordered = [...dated, ...evergreen]; return (
Gift ideas

Made for the days that matter.

Pre-built flipbook themes, printing timelines, and gift framing for every occasion. Pick yours.

{ordered.map((o, i) => (
{o.name} {o.daysAhead !== null ? ( {o.daysAhead < 1 ? 'Today' : o.daysAhead === 1 ? 'Tomorrow' : `In ${o.daysAhead} days`} ) : ( Evergreen )}
{o.headline.split(o.headlineEm)[0]}{o.headlineEm}{o.headline.split(o.headlineEm)[1]}
{o.sub.split('.')[0]}.
Make a gift
))}
); } Object.assign(window, { Occasions });