diff --git a/STATUS.md b/STATUS.md index b0fb757..efbde84 100644 --- a/STATUS.md +++ b/STATUS.md @@ -65,6 +65,7 @@ Off-plan riders (pulled forward, rename-independent): - 2026-07-11: Stripe decision — GO. S18–S21 build starts 2026-07-11; pricing per `docs/ideation/2026-07-02-embeds-spec.md` §4 ladder ($29/mo or $290/yr Pro, $15/mo or $150/yr nonprofit, network hand-negotiated). Stripe is the institutional-embeds rail only; HCB is the citizen-donations rail; the two are never conflated. - 2026-07-11: S12 ruling — quiet-submit now (registry + directory submissions run this week; review/listing latency burns down while unannounced), the public announcement itself still holds for the late Aug–Sep window. - 2026-07-11: Pregen + Blob portraits — both armed, pending owner secrets (~$2.50–3.80/mo pregen + ~cents/mo Blob), surfaced and approved. +- 2026-07-15: HCB application DENIED (HCB currently sponsors teen hacker builds only) — the citizen-donations rail is undecided again; About/footer copy scrubbed of every fiscal-sponsor/501(c)(3)/tax-deductible claim and `DonateSupport` retired in branch `feat/funding-transparency` (founder-funded framing is the single truthful surface); `DONATE_URL` stays null until a replacement rail is chosen. ## Issues & learnings ledger (compound these) diff --git a/app/[locale]/about/page.tsx b/app/[locale]/about/page.tsx index 7190f00..fea561c 100644 --- a/app/[locale]/about/page.tsx +++ b/app/[locale]/about/page.tsx @@ -1,6 +1,5 @@ import type { Metadata } from 'next'; import { setRequestLocale, getTranslations } from 'next-intl/server'; -import { DonateSupport } from '@/components/DonateSupport'; import { hreflangAlternates } from '@/lib/hreflang'; import { DONATE_URL } from '@/lib/site'; @@ -27,6 +26,26 @@ export default async function AboutPage({ params }: { params: Promise<{ locale:

{t('fundingTitle')}

{t('fundingBody')}

+ {/* The one support ask on this page (the HCB fiscal-sponsorship route + was denied 2026-07-15, so the former DonateSupport section and its + sponsor/tax-deductible claims are retired). Dark by construction + until DONATE_URL is set - one constant, no second flag. Never + claims tax-deductibility or nonprofit status - this is a personal, + founder-funded contribution, not a charitable gift. Link-out only: + never an iframe or a payment field on Oravan's own infra (§6). */} + {DONATE_URL && ( +

+ {t('fundingSupportBody')}{' '} + + {t('fundingSupportCta')} + +

+ )}
{/* Who's accountable + how to reach a person — surfaced outside the @@ -37,12 +56,6 @@ export default async function AboutPage({ params }: { params: Promise<{ locale:

{t('accountabilityTitle')}

{t('accountabilityBody')}

- - {/* §6: the donations leg — link-out only, never a payment field on our - own infra. Dark by construction until DONATE_URL is set (HCB - onboarding is separate, in-flight paperwork); flipping that one - constant is the entire code change needed to light this up. */} - ); } diff --git a/components/DonateSupport.tsx b/components/DonateSupport.tsx deleted file mode 100644 index 637ce1c..0000000 --- a/components/DonateSupport.tsx +++ /dev/null @@ -1,42 +0,0 @@ -'use client'; - -import { ArrowUpRight } from 'lucide-react'; -import { useTranslations } from 'next-intl'; - -/* - * §6's donations leg, isolated into its own component so the ask copy and - * link-out live in one place: donateUrl is a plain prop, and the About - * page's one real call site passes the DONATE_URL constant from lib/site.ts. - * Dark by construction whenever donateUrl is null/undefined - no heading, - * no ask copy, no link, nothing. - * - * The prop also doubles as forward-compatible test infrastructure for - * injecting a fixture value - not currently exercised as a live render, - * since this project's Playwright setup can't render a Oravan component - * directly (see tests/donate.unit.spec.ts, which instead checks the - * source-level wiring). tests/donate.spec.ts covers what IS live-verified: - * today's real dark state, end to end in a browser. - * - * Link-out only: target="_blank" + rel="noopener noreferrer", never an - * iframe, never a payment field rendered on Oravan's own infra. - */ -export function DonateSupport({ donateUrl }: { donateUrl: string | null }) { - const t = useTranslations('about'); - if (!donateUrl) return null; - - return ( -
-

{t('supportTitle')}

-

{t('supportBody')}

- - {t('donateCta')} - - -
- ); -} diff --git a/components/Footer.tsx b/components/Footer.tsx index 03a4a3e..e367585 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -23,6 +23,28 @@ export function Footer({ donateUrl = DONATE_URL }: { donateUrl?: string | null }

{t('footer.lore')}

{t('footer.mission')}

{t('footer.aiNote')}

+ {/* Phase 1/2 funding transparency line: dark copy today (DONATE_URL + null), automatically upgrades to the "funded + supporters" line + with a Support Oravan link the moment DONATE_URL is set - one + constant, no separate flag, same pattern as the nav Donate link + below. */} +

+ {donateUrl ? ( + <> + {t('footer.fundingLive')}{' '} + + {t('footer.fundingCta')} + + + ) : ( + t('footer.funding') + )} +