---
title: Sales Presentation & Deck Visuals
slug: presentation
status: active
owner: hazem
updated: 2026-06-18
refs:
  - moon-lab-presentation.html
  - moon-lab-presentation-ar.html
  - assets/deck/
plans: []
related:
  - production
---

## Context
The customer-facing **sales/pitch decks** + how we produce their visuals (real screenshots and, optionally, AI-generated on-brand imagery). The decks are self-contained, zero-dependency HTML presentations served from the web root.

## The decks
- **`moon-lab-presentation.html`** (EN) + **`moon-lab-presentation-ar.html`** (AR) at the web root → live at `https://moonui.elbaset.com/moon-lab-presentation.html`. They are a **language pair**, cross-linked with **relative** hrefs (lang chip) → must stay in the **same folder**. `<meta name="robots" content="noindex">`.
- **27 slides** (EN). Acts: **I · The Platform → II · The Opportunity → III · Beyond the Bench** (full-bleed AI-image dividers). **Market/Saudi stats sit in the MIDDLE** (Act II), not the front — the deck opens with the problem + product strengths and uses the market as the "why now". **5 wireframe "Strength" slides** (Nano Banana diagrams, `.wf-split` layout): Investigations engine (panels/formula builder/histopath templates/packages), Reports &amp; Printing, Analyzer integration + Middleware, B2B courier/custody, Payments &amp; Insurance (Tabby/Tamara + BUPA/Tawuniya via NPHIES — insurers named as examples, NOT claimed as clients). 3 real-screenshot slides are now **AI-polished product shots** (Nano Banana *image-edit*: the real screenshot composited into a glowing glass browser window, 3D-floated on a dark studio bg with reflection + floating accent chips — `gen/pro-{catalog,b2b,dashboard}.jpg`, shown borderless via `.shot-art`; slightly softer than the crisp originals, but the slide callouts carry the hard numbers). Edit helper: `/tmp/edit.py` (input image + prompt → `gemini-2.5-flash-image`). **Empty-pipeline dashboard fixed** → cropped to the data-rich strip (`gen/dash-data.jpg`). A subtle global texture (`gen/bg-texture.jpg`, `.app-bg` fixed) sits behind every slide. **Animated "wow" hero (slide 1)** — cinematic AI moon (`gen/hero-a.jpg`; alts `hero-b/c`) under `.hero` with ken-burns zoom, drifting aurora, rotating orbital rings, JS-spawned floating particles, a shimmer-sweep gold wordmark + pulsing `×`, and a bobbing scroll cue (all CSS/JS, zero-dep, reduced-motion-safe). Design system: fonts **Clash Display + Satoshi + JetBrains Mono**; tokens `--gold #f5a623 / --sky #38bdf8 / --green #34d399 / --bg #070b16`; **viewport-fit is a hard rule** (`.slide` = `100dvh`, `clamp()` type, `overflow:hidden`, no internal scroll); reveal anim `.rv` + `.d1..d5`; scroll-snap; dots + progress + counter; lang chip.
- **Act / image slides** use `.slide.act` (+ `.act-title`, `.act-cta`) with `<div class="act-bg">` reading `--img` from an inline `style="--img:url(...)"`; an `.act-bg::after` dark-left gradient keeps text legible over the image. Imagery is **tasteful — title + 3 act dividers + CTA only**, NOT one per slide.
- **Shared CSS atoms** to reuse when adding slides: `.kicker .card .grid2c/.grid3c .split .statN .chart-wrap .bars .flow .fgrid .vs .module-ring`, plus the screenshot components **`.shot-split / .shot-frame / .shot-live / .shot-cap`** (browser-framed real-screen slides).
- **Add a slide** = copy a `<section class="slide">` block; the counter/dots **auto-update** (JS uses `slides.length`) — no manual renumber needed (decorative kicker numbers are cosmetic only).

## Real screenshots (preferred over illustrations)
3 "**Live product · real screen**" slides embed real captures in `assets/deck/{catalog,b2b,dashboard}.png` (Catalog 1819 tests · B2B "own separate portal" · Mission-Control with live data). Capture recipe (Playwright) is in memory **`deck-screenshot-capture`**: cached `chromium-1223` via `executablePath`, PrimeNG login `#password input`, LIS routes `/app/lab/*`, click the **"30 Days"** filter to populate data, viewport 1600×1000 @2×.

## AI image generation — providers & how to call (for deck backgrounds/textures)
Use only for **abstract, on-brand** visuals (gradients/textures/hero), never literal medical illustrations.

| Provider | Model | Key prefix | Endpoint shape |
|---|---|---|---|
| **Google Gemini "Nano Banana"** | `gemini-2.5-flash-image` | `AIza…` | `POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-image:generateContent?key=$KEY` → image returned as base64 in response `parts[].inlineData`. Also does image **editing/compositing**. |
| **OpenAI** | `gpt-image-1` (or `dall-e-3`) | `sk-proj-…` | `POST https://api.openai.com/v1/images/generations` header `Authorization: Bearer $KEY`, body `{model,prompt,size}` → b64. |
| **WaveSpeed** (aggregator: Flux/SDXL/…) | many | `wsk_live_…` | `Authorization: Bearer $KEY`; see `wavespeed.ai/accesskey` + their API docs. Use for model variety (Flux = good abstract texture). |

**✅ Proven working (2026-06-18):** Nano Banana (`gemini-2.5-flash-image`) via `generateContent` with body `{"contents":[{"parts":[{"text":PROMPT}]}],"generationConfig":{"responseModalities":["IMAGE"],"imageConfig":{"aspectRatio":"16:9"}}}` → image returned base64 in `candidates[0].content.parts[].inlineData.data`. Helper pattern saved (reads key from `/home/moonui/.gemini_key`). The deck's 5 act backgrounds were generated this way → `assets/deck/gen/{cover,act1-opportunity,act2-platform,act3-network,cta}.jpg` (PNG output **converted to JPG q82 via `convert`** → 6.8MB ⇒ 240KB total; keep screenshots as PNG for sharp text). Newer image models also available to this key: `gemini-3-pro-image`, `imagen-4.0-*` (Imagen uses the `:predict` method, not generateContent).

## Decisions & why
- **Screenshots > AI illustrations for THIS deck.** Its strength is real product + editorial/abstract design; generic AI illustrations trigger the "generic AI deck" anti-pattern and cheapen it. Keep any generated art abstract & on-palette.
- **Decks live in the web root** (not `knowledge-base/plans/`) because they are presentations, not internal plans — see the move back on 2026-06-18.

## 🔐 Security — API keys (READ)
- **Keys NEVER go in the repo / KB / chat.** This repo (`public_html`) is git-versioned → a committed secret lives in history forever and can be pushed/shared.
- **Keys live OUTSIDE the repo**, read at runtime: `/home/moonui/.gemini_key`, `/home/moonui/.openai_key`, `/home/moonui/.wavespeed_key` (`chmod 600`), or env vars `GEMINI_KEY` / `OPENAI_KEY` / `WAVESPEED_KEY`. Create via the session: `! umask 077; printf '%s' '<KEY>' > /home/moonui/.<provider>_key`. Use: `KEY=$(cat /home/moonui/.gemini_key)`.
- Repo `.gitignore` blocks `*_key` / `.env` as a safety net.
- ⚠️ The OpenAI + WaveSpeed + Google keys **pasted in chat on 2026-06-18 are COMPROMISED — rotate before any use.**

## Open / next
- Mirror the 3 "Live product" slides into the **AR deck** (`moon-lab-presentation-ar.html`).
- Optional: generate abstract on-brand hero/section backgrounds once a key is supplied securely (per the rule above).
- Could capture the actual **external-lab partner portal** screen if a working portal login is provided (the `testlab` account is not on the Dev backend).
