feat(deck): ask offers two entry points ($400k/10% and $900k/25%)

$400k for 10% gets things started; $900k for 25% funds full execution.
The Ask slide now shows both as side-by-side options, each with its
annual profit share on SolLunar's recomputed node profit. Slide 7
(ownership) stays the base $400k/10% structure, matching the 45/45/10 bar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Patrick Mulligan 2026-08-01 01:11:15 +02:00
commit 321d4dc840
2 changed files with 53 additions and 28 deletions

View file

@ -462,12 +462,23 @@ export const buildings = [
}, },
] ]
/** The investor ask. */ /** The investor ask — two entry points into SolLunar Society. */
export const investorAsk = { export const investorAsk = {
amount: 400_000, options: [
equity: 0.1, {
valuation: 4_000_000, amount: 400_000,
scenarios: [0.1, 0.25], // profit-share scenarios on the recomputed yearly profit equity: 0.1,
label: 'Get started',
blurb: 'Seeds the launch — sign the lease, fit out the space and open the doors.',
},
{
amount: 900_000,
equity: 0.25,
label: 'Full execution',
blurb: 'Funds the full build-out and the first operating year end to end.',
featured: true,
},
],
} }
/** Roadmap / replication story. SolLunar Society first, then the network. */ /** Roadmap / replication story. SolLunar Society first, then the network. */

View file

@ -4,39 +4,53 @@ import Icon from '../components/Icon.vue'
import { brand, investorAsk, pnl, fmtUsd } from '../data' import { brand, investorAsk, pnl, fmtUsd } from '../data'
const pct = (n: number) => Math.round(n * 100) const pct = (n: number) => Math.round(n * 100)
// annual profit-share per scenario, on the recomputed yearly profit // annual profit share per option, on the recomputed yearly profit
const shares = investorAsk.scenarios.map((s) => ({ equity: s, annual: Math.round(pnl.yearlyProfit * s) })) const options = investorAsk.options.map((o) => ({ ...o, annual: Math.round(pnl.yearlyProfit * o.equity) }))
</script> </script>
<template> <template>
<SlideFrame center> <SlideFrame center>
<p class="text-xs font-semibold uppercase tracking-[0.3em] text-amber">The ask</p> <p class="text-xs font-semibold uppercase tracking-[0.3em] text-amber">The ask</p>
<h2 class="mt-4 font-display text-4xl font-semibold text-fg sm:text-5xl"> <h2 class="mt-4 font-display text-4xl font-semibold text-fg sm:text-5xl">Two ways in</h2>
{{ fmtUsd(investorAsk.amount) }} for {{ pct(investorAsk.equity) }}% of SolLunar Society <p class="mt-3 text-fg-muted">Invest in SolLunar Society the first node, opening in Austin.</p>
</h2>
<p class="mt-3 text-fg-muted">
{{ fmtUsd(investorAsk.valuation) }} valuation · the first node, open in Austin
</p>
<!-- profit-share scenarios --> <!-- the two options -->
<div class="mt-8 flex flex-wrap items-stretch justify-center gap-4"> <div class="mx-auto mt-9 grid w-full max-w-2xl gap-5 sm:grid-cols-2">
<div <div
v-for="s in shares" v-for="o in options"
:key="s.equity" :key="o.label"
class="rounded-2xl border border-line bg-surface px-6 py-4" class="relative flex flex-col rounded-2xl border p-6 text-left"
:class="o.featured ? 'border-indigo-500/50 bg-indigo-500/[0.07]' : 'border-line bg-surface'"
> >
<p class="text-xs uppercase tracking-wider text-fg-muted">{{ pct(s.equity) }}% share</p> <span
<p class="mt-1 font-display text-3xl font-bold text-fg">{{ fmtUsd(s.annual) }}</p> v-if="o.featured"
<p class="text-xs text-fg-muted">/ yr profit</p> class="absolute -top-3 left-6 rounded-full bg-indigo-400 px-3 py-0.5 text-[11px] font-semibold uppercase tracking-wider text-on-accent"
</div> >
<div class="rounded-2xl border border-pine-500/40 bg-pine-500/[0.07] px-6 py-4"> Full build
<p class="text-xs uppercase tracking-wider text-pine">Node profit</p> </span>
<p class="mt-1 font-display text-3xl font-bold text-fg">{{ fmtUsd(pnl.yearlyProfit) }}</p> <p
<p class="text-xs text-fg-muted">/ yr (recomputed)</p> class="text-xs font-semibold uppercase tracking-wider"
:class="o.featured ? 'text-indigo' : 'text-fg-muted'"
>
{{ o.label }}
</p>
<div class="mt-1 flex items-baseline gap-2">
<span class="font-display text-4xl font-bold text-fg">{{ fmtUsd(o.amount) }}</span>
<span class="text-sm text-fg-muted">for {{ pct(o.equity) }}%</span>
</div>
<p class="mt-2 flex-1 text-sm text-fg-muted">{{ o.blurb }}</p>
<p class="mt-4 border-t border-line pt-3 text-sm text-fg">
~<span class="font-semibold">{{ fmtUsd(o.annual) }}</span
><span class="text-fg-muted"> / yr profit share</span>
</p>
</div> </div>
</div> </div>
<div class="mt-9 flex flex-col items-center gap-3 sm:flex-row"> <p class="mt-5 text-xs text-fg-muted">
Both on SolLunar Societys ~{{ fmtUsd(pnl.yearlyProfit) }}/yr node profit (recomputed).
</p>
<div class="mt-8 flex flex-col items-center gap-3 sm:flex-row">
<a <a
:href="`mailto:${brand.contactEmail}`" :href="`mailto:${brand.contactEmail}`"
class="inline-flex items-center gap-2 rounded-full bg-amber-400 px-6 py-3 font-semibold text-on-accent transition hover:bg-amber-300" class="inline-flex items-center gap-2 rounded-full bg-amber-400 px-6 py-3 font-semibold text-on-accent transition hover:bg-amber-300"
@ -52,7 +66,7 @@ const shares = investorAsk.scenarios.map((s) => ({ equity: s, annual: Math.round
</button> </button>
</div> </div>
<p class="mt-9 max-w-xl text-sm text-fg-muted"> <p class="mt-8 max-w-xl text-sm text-fg-muted">
Prove the model in Austin, then replicate it on Lab 484 the summit gathering and the farm are next. Prove the model in Austin, then replicate it on Lab 484 the summit gathering and the farm are next.
</p> </p>
</SlideFrame> </SlideFrame>