// Kelappa Landing — mock app screenshots for the real product lineup: // CCV, VText, FloFi, Switcher. function ScreenFrame({ device = 'iphone', children, width, height }) { if (device === 'iphone') { const W = width ?? 240, H = height ?? 500; return (
{children}
); } if (device === 'mac') { const W = width ?? 460, H = height ?? 290; return (
{children}
); } } // ── CCV · notch portal (macOS) ───────────────────────────── function CCVMock({ t }) { return (
{/* Simulated MacBook top edge with notch */}
{/* widened notch acting as a file portal */}
{/* camera dot */} {/* file inside the portal */}
villa_invoice.pdf parked · drag to take
{/* coral pulse around portal */}
{/* Desktop wallpaper showing under the notch */}
{/* a file being dragged toward the notch */} {/* dashed arrow up */}
The Portal
Drop anything. Take it anywhere.
3 items parked
); } // ── VText · dictation overlay (macOS) ────────────────────── function VTextMock({ t }) { return ( {/* fake document underneath */}
Reply to Nyoman about the villa
────────────────────────
Hi Nyoman, thanks for getting back. I wanted to follow up on the
invoice |
{/* dictation modal */}
{/* mic */}
⌘⇧ · listening · 0:08
{/* waveform */}
{[3, 7, 12, 9, 5, 11, 6].map((h, i) => )}
"could we move the payment to next monday since the bank holiday is on friday and i don't want this to get stuck in limbo"
{['Insert', 'Shorter', 'Softer', 'Translate → EN'].map((b, i) => ( {b} ))}
); } // ── FloFi · finance (iOS) ───────────────────────────────── function FloFiMock({ t }) { return (
This week · gentle view
$1,247 · left for the month
↑ you are on track
{/* gentle bar chart */}
{[28, 36, 22, 44, 30, 38, 18].map((h, i) => (
))}
MTWTFSS
{/* categories */}
{[ { name: 'Food & coffee', c: t.coral, v: 184 }, { name: 'Rent & home', c: t.husk, v: 720 }, { name: 'Fun & other', c: t.saffron, v: 96 }, ].map((cat) => (
{cat.name} ${cat.v}
))}
Today you have $47 for fun.
); } // ── Switcher · auto layout fix (macOS) ───────────────────── function SwitcherMock({ t }) { return ( {/* document with text */}
Compose · message
Hi Wira,
руддщ {' '} hello {' '}— could you take a look at the build?
I think the api thing is broken again. | 
{/* small toast in corner */}
RU→EN
Switched to English "руддщ" → "hello"
); } // ── Teleprompter · tablet inside a rig (web) ─────────────── function TeleprompterMock({ t }) { // Outer black "rig" with a tilted glass over a horizontal tablet. return (
{/* rig base */}
{/* lens hole on the rig front */}
{/* glass + tablet area */}
tablet · landscape 120 wpm · mirror on
{/* scrolling script — mirrored hint via transform */}
…and that's why we built this in the first place.
Today we're shipping three things by Friday.
One — the smallest version that still feels finished.
play read into the lens →
); } // ── Telesufler · floating overlay (macOS) ────────────────── function TelesuflerMock({ t }) { return ( {/* fake screen-share view behind the overlay */}
{/* simulated slide / shared screen */}
screen sharing · slide 4 / 12
Q3 plan — three bets
{[t.coral, t.lagoon, t.palm].map((c) => (
))}
• Launch the chat bot to 20 villas
• Wire up the new pricing engine
• Ship Telesufler 1.1
{/* tiny self-view tile, top-right corner — the user's camera */}
You {/* camera lens dot */}
{/* floating telesufler window — sits right under the camera tile */}
always on top 0:42
Hi everyone, thanks for jumping on.
Three updates — shipping, hiring, Bali offsite.
First — the bot is live in beta.
⌥⇧
{/* "invisible to viewers" badge */}
{/* eye-off icon */} Hidden when you share screen
); } Object.assign(window, { ScreenFrame, CCVMock, VTextMock, FloFiMock, SwitcherMock, TeleprompterMock, TelesuflerMock, });