feat: project pages — banner uploads, OG embeds, share button
Renames the public profile detail page to "project page" in user-facing
copy and wires up a project banner that doubles as the link-card image
when the page URL is shared.
- Lexicon: add optional `banner` blob to com.atmosphereaccount.registry.profile
(PNG/JPEG/WebP, 3MB, recommended 1200x630 — matches OG card ratio).
- DB: additive banner_cid / banner_mime columns on profile + matching
read/write paths in lib/registry.ts and lib/profile-sync.ts.
- Profile API: accept banner blob refs and base64 uploads via PUT
/api/registry/profile, mirroring the avatar contract.
- Form: new banner upload slot in CreateProfileForm (above the avatar +
fields row) with preview, replace, and remove controls.
- Banner endpoint: /api/registry/banner/<did> redirects to the Bluesky
CDN banner URL, mirroring the avatar compatibility route.
- Project page: render banner at the top of /explore/<handle>, set
per-page OG/Twitter meta via state.pageMeta so the banner becomes the
link-card image (with project name + description in the card text).
- Share: new ShareButton island with Web Share API on platforms that
support it and copy-to-clipboard fallback elsewhere.
- Copy: rename "View profile" / "View public profile" / "Edit this
profile" to project-page wording where the target is a project page.
Lexicon JSON is updated in-repo only — publish via `goat lex publish
--update` when ready. Not pushed.
Made-with: Cursor