Design System

Platform

App

Generated from rumor-mobile-expo's real tailwind.config.js and src/components/ui — not hand-authored, and not yet reconciled against Figma (this pass ran code-side only). Brand tokens (color, type) are confirmed identical to web; elevation and motion aren't tokenized on mobile yet.

Color

Curated from token-map.json — the closed vocabulary /figma-ds-sync generated.

background

bg-background

#ffffff
foreground

text-foreground

#1f1f1f
card

bg-card / text-card-foreground

#ffffff
popover

bg-popover / text-popover-foreground

#ffffff
primary

bg-primary / text-primary

#1f1f1f
primary-fg

text-primary-foreground

#ffffff
secondary

bg-secondary / text-secondary

#eeeeee
muted

bg-muted

#f7f7f7
muted-fg

text-muted-foreground

#a2a1a1
accent

bg-accent

#f3eeea
accent-fg

text-accent-foreground

#a28b7f
destructive

bg-destructive / text-destructive

#9d0d11
border

border-border

#e1e1e1
input

border-input

#e1e1e1
ring

ring-ring

#1f1f1f
rumor-lime

bg-rumor-lime / text-rumor-lime

#b7ff00
rumor-black

bg-rumor-black / text-rumor-black

#1f1f1f
near-black

bg-near-black

#050505
warm-stone

bg-warm-stone / text-warm-stone

#cdbab1
support-global-link

text-support-global-link

#a28b7f
success

text-success / bg-success

#167e60
success-bg

bg-success-bg

#e8f2ef
success-border

border-success-border

#b9d8cf
warning

text-warning / bg-warning

#d9a21f
warning-bg

bg-warning-bg

#fef8e9
warning-border

border-warning-border

#fbe8bd
danger

text-danger / bg-danger

#9d0d11
danger-bg

bg-danger-bg

#f5e7e7
danger-border

border-danger-border

#e2b6b8
info

text-info / bg-info

#0d729d
info-bg

bg-info-bg

#e7f1f5
info-border

border-info-border

#b6d5e2
content-neutral

text-content-neutral

#b5b5b5
content-neutral-body

text-content-neutral-body

#838282
content-neutral-soft

text-content-neutral-soft

#9b9b9b
content-neutral-disabled

text-content-neutral-disabled

#9c9c9c
content-neutral-placeholder

text-content-neutral-placeholder

#a2a1a1
surface-muted

bg-surface-muted

#efefef
surface-warm

bg-surface-warm

#e8e0db
divider-soft

border-divider-soft

#e5e5e5
graphite

text-graphite

#3f3f3f

DESIGN.md

The full generated brand layer — typography, components, spacing, motion, accessibility.

content/mobile/DESIGN.md
# DESIGN.md — Rumor Mobile > Generated by `/figma-ds-sync` (code-side only — no Figma URL this pass; see the reconciliation > note below). Source: `tailwind.config.js` + `src/components/ui/*`, read 2026-07-01. Tokens are > stated as **NativeWind classes** so generated code copies them directly. Every value here exists > in `token-map.json` — nothing here is invented. ## 1. Visual Theme & Atmosphere Clean, editorial, near-monochrome — the same language as Rumor's web product. Crisp white canvas, near-black ink, generous whitespace, soft hairline dividers. Restrained and premium; color is an accent, not a field. Two accents carry brand energy: warm stone (`warm-stone`) for quiet emphasis, and an electric lime (`rumor-lime`) used sparingly — never as a large field or text-on-white. Tags: minimal · editorial · high-contrast · warm-neutral accents. ## 2. Color System - **Canvas / ink:** `bg-background` (#fff) · `text-foreground` (#1f1f1f). - **Primary (actions, emphasis):** `bg-primary` / `text-primary` (#1f1f1f), on-primary `text-primary-foreground` (#fff). - **Secondary / muted surfaces:** `bg-secondary` (#eee) · `bg-muted` (#f7f7f7) with `text-muted-foreground` (#a2a1a1). - **Accent (warm):** `bg-accent` (#f3eeea) · `text-accent-foreground` (#a28b7f) · `bg-warm-stone` / `text-warm-stone` (#cdbab1). - **Brand:** `bg-rumor-lime` (#b7ff00) — accent only, never large fields or text-on-white. - **Links:** `text-support-global-link` (#a28b7f, stone) — matches web's resolved link color. - **Status:** success `text-success` (#167e60) on `bg-success-bg`; warning `text-warning` (#d9a21f) on `bg-warning-bg`; danger `text-danger` (#9d0d11) on `bg-danger-bg`; info `text-info` (#0d729d) on `bg-info-bg` — each pairs with a matching `*-border` token. - **Lines:** `border-border` (#e1e1e1), softer `border-divider-soft` (#e5e5e5). - **Neutral content scale:** `text-content-neutral` (#b5b5b5) → `text-content-neutral-body` (#838282) for secondary text, `text-content-neutral-disabled` (#9c9c9c) for disabled, `text-content-neutral-placeholder` (#a2a1a1) for placeholders. - **Neutral surfaces:** `bg-surface-muted` (#efefef) · `bg-surface-warm` (#e8e0db). **Reconciliation note:** every value above is confirmed identical to web's `content/design.md` in the `rumor-design-system` microsite (background, foreground, border, warm-stone, all four status colors, ABC Diatype + Romie fonts). Brand tokens are shared across platforms; nothing here was picked independently. `tailwind.config.js` carries real duplicate-token debt beyond what's listed (a dozen+ near-identical grays, dozens of one-off pixel-matched values) — see `token-map.json`'s `$excludedAsNoise` for the full list of what was deliberately left out of the closed vocabulary. ## 3. Typography - **Sans (UI/body):** ABCDiatype — `font-dia-light` / `font-dia` / `font-dia-medium` / `font-dia-bold`. - **Serif (display/editorial):** RomieTrial — `font-romie` / `font-romie-medium` / `font-romie-bold`. Reserved for large display titles and editorial moments — never body copy, same rule as web. - **Scale:** `text-xxs` (8px) · `text-11` · `text-13` · base · `text-16` · `text-18` · `text-title` (26px) · `text-stat-display` (40px). - **Display titles:** pair large sizes with tight tracking — `tracking-tight-s` (-0.5px) / `tracking-tight-m` (-0.75px) / `tracking-tight-xl` (-2px) — and `leading-snug-x` (1.2). Body uses `leading-relaxed-x` (1.4). - Prefer `ThemedText` (`@/components/themed-text`) over the raw `Text` primitive — it composes the shared `Text` and provides the design-system typography variants + `muted` support out of the box (per this repo's own `CLAUDE.md`). ## 4. Components & Patterns Real, shipped primitives in `src/components/ui/*` (46 files) — build from these, never re-implement one: - **Structure:** `app-header` (title + composed `BackButton` — the same "app header with back button" signature pattern as web), `bottom-sheet` (blur-backed, via `expo-blur`'s `BlurView` — the native equivalent of web's `glass` elevation token), `bottom-sheet-actions`, `bottom-action-bar`, `dialog`. - **Selection & input:** `segmented-control` (typed `SegmentedOption<T>[]`, optional count badges — the native equivalent of web's Guest/Host segmented toggle), `select`, `checkbox`, `switch` (a documented compact `sm` variant: 24×16 track, 12px thumb — sized directly off Figma, per the component's own code comment), `compact-switch`, `date-time-sheet`, `otp-input`, `phone-input`, `text-input` / `controlled-input`, `form-field`. - **Feedback:** `toast`, `toast-badge`, `banner`, `action-banner`, `notification-badge`, `badge` (pill geometry — `rounded-rumor-full`, shared with web's signature pill shape), `skeleton`. - **Content:** `text` / `typography` / `themed-text` (see §3), `accordion`, `collapsible`, `fading-divider`, `separator`, `horizontal-scroll-fade`, `reorderable-list`, `swipeable-row`, `map-preview`, `pdf-view`, `rich-text-editor` / `rich-text-toolbar`. - **Overlays:** `anchored-popover`, `anchored-tooltip`, `info-tooltip`, `tooltip`, `link-sheet`, `leave-without-saving-sheet`, `dropdown-menu`. - Compound components over polymorphic children (`Button` + composed `Text`, not a `string | ReactNode` prop) — already the pattern in `button.tsx`. - Use the existing `Dialog`/bottom-sheet primitives for sheet-style overlays before adding a native sheet dependency (per `CLAUDE.md`). ## 5. Spacing & Layout - Use the spacing scale via padding/`gap` classes: `p-2.5`=10, `p-3`=12, `p-3.75`=15, `p-4.5`=18, `p-5.5`=22, `p-7.5`=30, `p-15`=60. **`gap` for space-between, padding for space-within** — not child margins. - Radii: cards/sheets `rounded-2.5` (10) / `rounded-2.5xl` (20) / `rounded-3xl` (24) / `rounded-5xl` (32); pills `rounded-rumor-full` (128px — identical to web's signature pill radius). Pair `borderRadius` with `borderCurve: 'continuous'` for the native squircle look. - Respect safe areas; hairline borders at `border` width or the `1.5` variant. ## 6. Motion & Interaction - Reanimated, native-thread, 60fps. Animate **only GPU props** (transform/opacity); derive visuals from ground-truth state via interpolation — never store `scale`/`opacity` in state. - Scroll position via shared values, never `useState`. Press feedback via Gesture/Pressable, not JS state churn. - **Known gap:** unlike web (`design.md` §Motion: `200ms` / `cubic-bezier(0.4, 0, 0.2, 1)`), there are no duration/easing tokens in `tailwind.config.js` today — these conventions live only as prose in `AGENTS.md`. Tokenizing them is a deliberate future addition, not something this sync can invent. ## Rationale Near-monochrome + one warm accent + one electric accent reads premium and keeps focus on content, matching web exactly at the brand-token level. The dual type system (Diatype sans + Romie serif) gives editorial contrast without a third family, again shared with web. ## Accessibility - Every interactive element needs an `accessibilityRole` + `accessibilityLabel` (also what behavior tests query by). - Maintain contrast: body text at `text-foreground`/`text-content-neutral-body`, never the fainter `content-neutral` for primary copy. - Hit targets ≥ 44pt; honor reduced-motion for the animation layer. ## Known gaps (see `token-map.json` `$knownGaps`) - **No 5-step elevation scale** — only two ad-hoc shadow keys exist (`bottom-cta-shadow`, `bottom-large`). Web's five-tier `xs/s/m/l/xl` elevation system has no mobile equivalent yet. - **No motion tokens** — duration/easing exist only as prose guidance, not as tailwind config values. - **No Figma reconciliation this pass** — this sync ran code-side only (`tailwind.config.js` + `src/components/ui/*`), no Figma URL. `code-connect.json` is intentionally absent; re-run with a Figma file URL once the design-system-of-record question (which Figma file maps to mobile) is settled to add Code Connect mapping and cross-check against Figma variables.