···11+---
22+// Product story: editorial blocks, not a card grid.
33+---
44+55+<section id="product" class="section section--editorial wrap" aria-labelledby="product-heading">
66+ <header class="section__head">
77+ <p class="eyebrow">Product</p>
88+ <h2 id="product-heading" class="heading-xl">Built for the tab in front of you</h2>
99+ </header>
1010+ <div class="editorial-grid">
1111+ <article class="editorial-block">
1212+ <h3 class="heading-md">Verdict first</h3>
1313+ <p>One action pulls the lede out of long articles, tickets, and threads so you can bail early or read with intent.</p>
1414+ </article>
1515+ <article class="editorial-block">
1616+ <h3 class="heading-md">Questions stay grounded</h3>
1717+ <p>Follow-ups reference the page and the summary you already generated—no free-floating chat pretending it read for you.</p>
1818+ </article>
1919+ <article class="editorial-block">
2020+ <h3 class="heading-md">Your stack</h3>
2121+ <p>Ollama native, OpenAI-compatible hosts, Groq, LM Studio—pick the model and base URL in settings instead of a locked vendor.</p>
2222+ </article>
2323+ </div>
2424+</section>
+27
src/components/sections/FAQCompact.astro
···11+<section id="faq" class="section wrap" aria-labelledby="faq-heading">
22+ <header class="section__head">
33+ <p class="eyebrow">FAQ</p>
44+ <h2 id="faq-heading" class="heading-xl">When something blocks install</h2>
55+ </header>
66+ <div class="faq-stack">
77+ <details class="faq-disclosure">
88+ <summary>Cannot connect to localhost:11434</summary>
99+ <div class="faq-disclosure__body">
1010+ <p>
1111+ Run <span class="kbd">ollama serve</span>, confirm models with <span class="kbd">ollama list</span>, and keep
1212+ Native mode on <span class="kbd">http://localhost:11434</span> without <span class="kbd">/v1</span>.
1313+ </p>
1414+ </div>
1515+ </details>
1616+ <details class="faq-disclosure">
1717+ <summary>HTTP 403 or 405</summary>
1818+ <div class="faq-disclosure__body">
1919+ <p>
2020+ Wrong API mode for the URL: Native → no <span class="kbd">/v1</span>. OpenAI-compatible → include
2121+ <span class="kbd">/v1</span> (for example <span class="kbd">http://localhost:11434/v1</span> for Ollama
2222+ compatibility mode).
2323+ </p>
2424+ </div>
2525+ </details>
2626+ </div>
2727+</section>
+90
src/components/sections/HeroWithProof.astro
···11+---
22+/**
33+ * Hero imagery: add optional optimized assets (recommended ~1600–2400px wide, 3:2 or 16:10).
44+ * Drop files as `public/images/hero.avif` and `public/images/hero.webp` to replace the illustration
55+ * for LCP; `<picture>` sources are wired below when those files exist.
66+ */
77+import { existsSync } from "node:fs";
88+import path from "node:path";
99+1010+interface Props {
1111+ tangled: string;
1212+}
1313+1414+const { tangled } = Astro.props;
1515+1616+const imagesDir = path.join(process.cwd(), "public", "images");
1717+const hasAvif = existsSync(path.join(imagesDir, "hero.avif"));
1818+const hasWebp = existsSync(path.join(imagesDir, "hero.webp"));
1919+2020+const fallbackSrc = "/images/hero-illustration.svg";
2121+const alt =
2222+ "Lede extension popup over a browser page: summarize and ask questions grounded in the active tab.";
2323+---
2424+2525+<section class="hero-mast" aria-labelledby="hero-heading">
2626+ <div class="wrap hero-mast__grid reveal-group">
2727+ <div class="hero-mast__copy">
2828+ <p class="eyebrow reveal-item" style="--i: 0">Page summarizer and chat · Chrome and Firefox</p>
2929+ <h1 id="hero-heading" class="display-hero reveal-item" style="--i: 1">Don't bury the lede</h1>
3030+ <p class="deck reveal-item" style="--i: 2">
3131+ Summarize and ask about <strong>this tab</strong> before you spend twenty minutes on noise.
3232+ </p>
3333+ <p class="lede lede--tight reveal-item" style="--i: 3">
3434+ Answers trace the page you have open—not a blank assistant waiting for a prompt.
3535+ </p>
3636+ <div class="actions reveal-item" style="--i: 4">
3737+ <a class="btn btn--primary" href="#install">Install (beta)</a>
3838+ <a class="btn btn--secondary" href={tangled} target="_blank" rel="noopener noreferrer">
3939+ Extension repo on Tangled
4040+ </a>
4141+ </div>
4242+ <p class="eyebrow reveal-item" style="--i: 5; margin-top: var(--space-md)">Keyboard</p>
4343+ <p
4444+ class="reveal-item"
4545+ style="--i: 6; margin: 0; font-size: var(--text-sm); color: var(--color-ink-secondary)"
4646+ >
4747+ <span class="kbd">Ctrl</span> + <span class="kbd">Shift</span> + <span class="kbd">U</span>
4848+ <span aria-hidden="true"> · </span>
4949+ <span class="kbd">⌘</span> + <span class="kbd">Shift</span> + <span class="kbd">U</span> on macOS —
5050+ <em>Summarize with Lede</em>
5151+ </p>
5252+ </div>
5353+ <figure class="hero-proof reveal-item" style="--i: 3">
5454+ <div class="hero-proof__frame">
5555+ {
5656+ hasAvif || hasWebp ? (
5757+ <picture>
5858+ {hasAvif ? <source type="image/avif" srcset="/images/hero.avif" /> : null}
5959+ {hasWebp ? <source type="image/webp" srcset="/images/hero.webp" /> : null}
6060+ <img
6161+ src={hasWebp ? "/images/hero.webp" : "/images/hero.avif"}
6262+ width="1200"
6363+ height="750"
6464+ alt={alt}
6565+ decoding="async"
6666+ fetchpriority="high"
6767+ />
6868+ </picture>
6969+ ) : (
7070+ <img
7171+ src={fallbackSrc}
7272+ width="1200"
7373+ height="750"
7474+ alt={alt}
7575+ decoding="async"
7676+ fetchpriority="high"
7777+ />
7878+ )
7979+ }
8080+ </div>
8181+ <figcaption class="hero-proof__caption">
8282+ <span class="beta-tag">Beta</span>
8383+ <span class="hero-proof__capline">
8484+ Not in the Chrome Web Store or Firefox Add-ons yet—install from source, then wire Ollama or your API in
8585+ settings.
8686+ </span>
8787+ </figcaption>
8888+ </figure>
8989+ </div>
9090+</section>
+84
src/components/sections/InstallJourney.astro
···11+---
22+interface Props {
33+ tangled: string;
44+}
55+66+const { tangled } = Astro.props;
77+---
88+99+<section id="install" class="section section--install reveal-group" aria-labelledby="install-heading">
1010+ <div class="wrap">
1111+ <header class="section__head section__head--install">
1212+ <p class="eyebrow reveal-item" style="--i: 0">Install</p>
1313+ <h2 id="install-heading" class="heading-xl reveal-item" style="--i: 1">From repo to toolbar</h2>
1414+ </header>
1515+1616+ <div class="journey-band journey-band--callout reveal-item" style="--i: 2">
1717+ <p class="journey-band__text">
1818+ <strong>Clone webai-summarizer on Tangled</strong>—not this marketing repo. You need a folder that contains
1919+ <code class="kbd">manifest.json</code>. <code class="kbd">lede-website</code> is only this page.
2020+ </p>
2121+ </div>
2222+2323+ <div class="journey-strip reveal-item" style="--i: 3" aria-label="Three-step overview">
2424+ <div class="journey-strip__cell">
2525+ <span class="journey-strip__num" aria-hidden="true">1</span>
2626+ <h3 class="journey-strip__title">Get the code</h3>
2727+ <p class="journey-strip__body">Download or clone the extension repo so the project lives on disk.</p>
2828+ <a href={tangled} target="_blank" rel="noopener noreferrer">Open Tangled repo</a>
2929+ </div>
3030+ <div class="journey-strip__cell">
3131+ <span class="journey-strip__num" aria-hidden="true">2</span>
3232+ <h3 class="journey-strip__title">Choose a browser</h3>
3333+ <p class="journey-strip__body">Chrome uses unpacked load; Firefox uses a temporary add-on.</p>
3434+ </div>
3535+ <div class="journey-strip__cell">
3636+ <span class="journey-strip__num" aria-hidden="true">3</span>
3737+ <h3 class="journey-strip__title">Load and configure</h3>
3838+ <p class="journey-strip__body">Point settings at Ollama native or an OpenAI-compatible endpoint, then try a tab.</p>
3939+ </div>
4040+ </div>
4141+4242+ <div class="install-wrap reveal-item" style="--i: 4">
4343+ <div class="install-panel">
4444+ <div>
4545+ <h3 class="heading-lg">Chrome</h3>
4646+ <ol>
4747+ <li>Open <span class="kbd">chrome://extensions/</span></li>
4848+ <li>Enable <strong>Developer mode</strong></li>
4949+ <li>Click <strong>Load unpacked</strong></li>
5050+ <li>Select the <strong>webai-summarizer</strong> folder that contains <code class="kbd">manifest.json</code></li>
5151+ <li>Optional: shortcuts at <span class="kbd">chrome://extensions/shortcuts</span></li>
5252+ </ol>
5353+ </div>
5454+ <div>
5555+ <h3 class="heading-lg">Firefox</h3>
5656+ <ol>
5757+ <li>Open <span class="kbd">about:debugging#/runtime/this-firefox</span></li>
5858+ <li>Click <strong>Load Temporary Add-on</strong></li>
5959+ <li>Select <strong>manifest.json</strong> inside <strong>webai-summarizer</strong></li>
6060+ <li>Add-ons → gear → <strong>Manage Extension Shortcuts</strong> for the hotkey</li>
6161+ </ol>
6262+ <p class="firefox-note">
6363+ Temporary add-ons clear when you fully quit Firefox—reload during active dev sessions.
6464+ </p>
6565+ </div>
6666+ </div>
6767+ </div>
6868+6969+ <details class="disclosure reveal-item" style="--i: 5">
7070+ <summary>Advanced: build scripts per browser</summary>
7171+ <div class="disclosure__body">
7272+ <p>
7373+ If you already use split manifests, <span class="kbd">./build.sh chrome</span> or
7474+ <span class="kbd">./build.sh firefox</span> from the extension repo targets a specific build.
7575+ </p>
7676+ </div>
7777+ </details>
7878+7979+ <p class="repo-note reveal-item" style="--i: 6">
8080+ Source:
8181+ <a href={tangled} target="_blank" rel="noopener noreferrer">{tangled}</a>
8282+ </p>
8383+ </div>
8484+</section>
+24
src/components/sections/PrivacyBand.astro
···11+<section id="privacy" class="section section--dark" aria-labelledby="privacy-heading">
22+ <div class="wrap">
33+ <header class="section__head">
44+ <p class="eyebrow">Privacy and APIs</p>
55+ <h2 id="privacy-heading" class="heading-xl">Where text goes</h2>
66+ </header>
77+ <div class="split split--privacy">
88+ <div class="prose prose--dark">
99+ <h3 class="heading-md">Ollama native</h3>
1010+ <p>
1111+ <code class="kbd">/api/generate</code> on your machine. Base URL omits <span class="kbd">/v1</span>.
1212+ </p>
1313+ </div>
1414+ <div class="prose prose--dark">
1515+ <h3 class="heading-md">OpenAI-compatible</h3>
1616+ <p>
1717+ <code class="kbd">/v1/chat/completions</code> to the endpoint you configure. Content leaves the browser only when
1818+ you summarize or chat—not via a script on every site.
1919+ </p>
2020+ </div>
2121+ </div>
2222+ <p class="privacy-kicker prose prose--dark">Extraction is on-demand when you ask.</p>
2323+ </div>
2424+</section>
+29
src/components/sections/UsageMicro.astro
···11+<section id="usage" class="section section--tight-top wrap" aria-labelledby="usage-heading">
22+ <header class="section__head">
33+ <p class="eyebrow">In the popup</p>
44+ <h2 id="usage-heading" class="heading-xl">Three beats</h2>
55+ </header>
66+ <ol class="usage-flow">
77+ <li>
88+ <span class="usage-flow__label">01</span>
99+ <div>
1010+ <h3 class="heading-md">Land on the page</h3>
1111+ <p>Article, doc, issue—whatever you need to judge quickly.</p>
1212+ </div>
1313+ </li>
1414+ <li>
1515+ <span class="usage-flow__label">02</span>
1616+ <div>
1717+ <h3 class="heading-md">Open Lede</h3>
1818+ <p>Toolbar icon, context menu, or the keyboard shortcut.</p>
1919+ </div>
2020+ </li>
2121+ <li>
2222+ <span class="usage-flow__label">03</span>
2323+ <div>
2424+ <h3 class="heading-md">Summarize or ask</h3>
2525+ <p>Summarize for the lede, or type a question about this tab and press Enter.</p>
2626+ </div>
2727+ </li>
2828+ </ol>
2929+</section>