Design + build spec
Brand, tokens, type scale, button system — the design contract.
ACTS — Design + Build spec
The one source of truth. Build to THIS, not from scratch. Ground everything in Bryan's Phase 1 v2 deck (docs/…Phase 1- V2 Bryan.pdf) and Steve's notes.
0. FIGMA IS THE SOURCE OF TRUTH (Bryan, 2026-08-12)
The Figma files are mostly right — when a screen differs from Figma, match Figma (token-mapped per skin, never raw hex). Rules of engagement:
- Files: "acts playground" (design frames) + the Make files ("Prayer Request Designs" v64+, "Pray Screen Variations", "Prayer Help Screen"). Newest iteration wins; the Make file's live version is newest of all.
- Known-good frames (node ids in acts playground): Ask wizard = "Prayer Request Designs" 18:1280 (+ Make v64 Classic variant). Pull via the Figma desktop MCP (
get_design_contexton design frames; Make files render live only — screenshot the desktop app). - How Bryan flags the right frame: EITHER right-click the frame → Copy link (the node-id pins it exactly), OR prefix the frame name with "✅", OR keep current-truth frames on one page named "CURRENT". Any of these beats describing the design in words.
- CTA spec (v64): massive 40px emoji flush left w/ soft drop shadow, no inner circles, title + reward stacked LEFT-justified after the icon, full-width, asymmetric padding.
.btn-bigimplements this — never fork it. - Old-style screens are bugs, not variants. When touching a screen, check it against its Figma frame and bring it forward.
1. Design rules (non-negotiable)
Brand. Cormorant Garamond (display, italic for feeling) + Instrument Sans (UI/body). Signature #ec612b vermillion. Four ring/layer colors: Me #ec612b · Another #e08a52 · Parish #4e8f5f · World #6d95c4. Warm gradient canvas (cream→terracotta), floating white cards with soft shadow, vermillion gradient Pray button. Photography of hands/people ("every image shows the helpers").
8pt grid (Apple). Spacing = multiples of 8, 4pt sub-step only. Tailwind p-2/p-4/p-6/p-8, gap-2/gap-4, mt-2/mt-4/mt-6. Never mt-1.5, p-5, or arbitrary -[..px] spacing. Touch targets ≥ 44pt.
Type scale (named, never arbitrary). largeTitle 34 · title 28 · headline 20 · body 17 · subhead 15 · caption 13. Classes: .t-hero .t-title .t-headline .t-body .t-sub .t-caption .eyebrow. Body line-height ~1.5.
One token source. app/globals.css @theme + [data-skin]. No hardcoded hex in components.
Pills, not dropdowns. For small option sets, use pill selectors (components/PillSelect / the .pill class), not <select>. Applies across the app forms (ask, offer, upload).
Selection + CTA consolidation (Bryan, 2026-08-11).
- Selected pill = black (ink) everywhere — no per-section accent on selection.
- CTA buttons = the selected skin's brand color (
--color-brand/--pray-gradient), one CTA color per design system. Section accents survive only in small identity cues (marks, eyebrows, counts). - View switcher = the deck's icon segmented control (grid · play · map pill, active = filled ink circle) on Home, Immersive, and Map.
- Pills are multi-select where several can be true (e.g. relationships — a mother AND a father). First code fills the FK column; the full list is kept in the activity log.
2. Screens — "the meat" (from the deck, 13 screens)
Native app (/app/*), skinnable. Home has three views; a persistent bottom nav Give · Receive · Donate.
- Home — Cards — one feed mixing open requests + answered-prayer stories. Card: photo · ACT TYPE eyebrow · title · "N people prayed" · I'll pray. Top switch: Cards / Immersive / Map.
- Home — Immersive — full-screen, one act fills the display, story overlaid, right-rail actions (pray count · Share · Next), big I'll pray, swipe up for next. This IS the 18–25 "night/immersive" skin.
- Home — Map — nearby acts on a map (selected pin big/bold), filters Nearby / Completed / Requests, list with distances.
- Act Detail — Open — hero photo · "PRAYER · ON BEHALF" · title · "Asked by Linda · for her mom" · "12 people have prayed" · I'll pray + Share + Invite.
- Act Detail — Geographic — hero · "CANDLE · AT A PLACE" · map+pin · "1.2 mi away" + Directions · "4 people have visited" · I'll light a candle + Share + Invite.
- Request — "I Need an Act" — dominant PRAY, then layer (me/another/parish/world), ask (Prayer/Candle/Visit), mode (once/group), "I have a different act ›".
- Completion loop — four candidates, testable side-by-side: SMS reply · two-tap · trust · timer (5:00 auto-complete). Trust is the default/lead (agree to pray, no tracking — fits the no-surveillance ethos). Completion creates the story.
- Story Card — "Susie prayed for Linda's mom", photo, "12 prayed · acts.app/a/linda", Share to Facebook + Copy link. Every completed act makes one.
- Helper Offer flow — "I'm headed to [place]; who wants [act] while I'm there?"
- Parish room — "12 praying right now", avatar stack, Join, "Fr. Miguel asked the parish to pray at 8:00 PM".
- Widget — daily "Pray at noon" moment + day-streak ring + Near You.
- Guest → member ladder, Witness / signup, Two sides + moderator.
- Donate + sponsor-donor (pledge per act / per pilgrimage day).
3. Steve's required features (his notes — must be present)
Gap list Steve flagged (Phase 1 missing vs. pitch):
- Place-anchored acts (candle at a named church, grave visit, shrine).
- Helper offer flow (two-sided, not just seeker requests).
- Proof of act — photo confirmation + shareable saint/prayer cards.
- Explicit mission catalog (Rosary, novena, candle, adoration, pilgrimage) — not one generic Pray.
- Gamification economy — points ("Heaven/Mission Credits"), effort-scaled rewards, category badges (Pilgrim, Hospital Intercessor, …), levels.
- Donation micro-gifts + sponsor-donor / walk-a-thon pledges.
- Geo-targeted tags — hospitals, airports, test centers, prisons, stadiums.
4. Skins (native app only, not admin hub)
acts (default brand) · modern · night(=immersive 18–25). lib/skins.ts + [data-skin] blocks. Hub picks which skin tester links open in.
5. Build order (proposed)
- Lock the grid/type system (globals type scale) — foundation.
- Home — Cards (the center) + bottom Give·Receive·Donate nav.
- Act Detail — Open + Geographic.
- Story Card + completion (start with two-tap + trust).
- Home — Immersive (night skin) + Map.
- Request flow polish · Parish room · Offer flow · Donate · gamification surfacing.
6. Clickables — four levels (Bryan, 2026-09-05 design review)
Every tappable thing is one of these, and looks like it. Native tokens in expo/lib/theme.ts (BTN, BTN_TEXT, LINK_TEXT, TAB_UNDERLINE).
| Level | Job | Looks like | Examples | |---|---|---|---| | L1 Primary | do the act | filled button — vermillion (ask side) or green (give side); one per screen | Amen · Yes — give $5 · Post my ask · I'm here — Check in | | L2 Secondary | the alternative, the next step | outlined button · soft-tinted pill · bold act-colored text in a gray bar | No, not today · Add intention · Pray • Go there • Comment · the card's icon row | | L3 Tertiary | change / settings / elsewhere | quiet Marian-blue text + chevron; never boxed, never filled | Change location › · Change place of worship › · profile's place line | | L4 Nav state | where am I | ink text, 2-pt vermillion underline when selected, muted otherwise | Home/Ask/Offer/Profile · All / Near / Congregation |
Rules: the vermillion underline is the only vermillion line — section rules are hairlines in line. A row that opens something carries a chevron. Points ride on L1/L2 labels only ("· +10 pts"), never on L3 or L4.
7 · Brutalist pass (native, 2026-09-05 — Bryan: "love it")
The mark is two things. The v1 logo (praying hands + expression lines + heart) splits into its halves: hands with the lines = the ASK, the heart = the GIVE. The masthead carries the whole mark, ink with a vermillion heart (BRAND = "brut", components/BrandMark.tsx).
The two doors ((tabs)/index.tsx): stacked *mark · tag · body · arrow*, same height. ASK = ink block, white hands-with-lines, white text. GIVE = white block, 2-pt ink line, red heart (T.red), ink text. The arrow sits beside the body copy, never in the title row. Open ("What does this mean?"): the doors go solid act colour with large cream titles, cream copy, white prompt rows, an × close per door; it folds on leaving and on any prompt.
Icons v3 (design/icons-v3/, components/icons/v3.ts, ICON_SET = "v3"): drawn in the v1 hands' own style — rounded chunky silhouettes, one ink. All icons black; the candle is just the flame, orange; "prayed" hands (rows, count lockups, explainer prompts) are the success green T.prayed. Tab bar: house · open palm (Ask) · hands-with-heart (Offer) · person. v1/v2 are tagged (icons-v1, icons-v2) and copied under design/icons-v*.
Buttons are square-ish — T.radiusBtn = 8 everywhere (Pray/Comment, prompts, ✓ Prayed, Add intention, parish, donate). No pills.
Tooling: scripts/svg.py + /svg skill — every SVG that arrives is rendered, split, and generated from; a picture of icons is traced. Logo explorations live in app/logo-lab.tsx (dev only).