# CC-2 Brief — Personas Card Component (Parallel Terminal) **Author:** PM **For:** Claude Code (waggle-os repo, second terminal, parallel to CC-1 Sprint 10 close-out) **Date:** 2026-04-22 **Task:** Task #18 (Regen Brand-Bee personas card) implementation phase **Priority:** Medium (non-blocking za Sprint 10; unblocks landing implementation post-launch prep) **Budget:** $0 (pure local implementation, zero API spend) **Wall-clock:** 2-4h CC time --- ## Critical boundary — CC-1 non-interference CC-1 je aktivan na Sprint 10 parallel close-out (Task 1.1 live-run + Task 1.5 Phase 2+3). CC-1 radi na: - `packages/server/src/benchmarks/**` — benchmark harness - `packages/memory-mcp/**` ili `packages/core/**` — hive-mind ClaudeAdapter - `preflight-results/**` — results artifacts - `sessions/**` — exit pings **CC-2 MORA da ostane u `apps/www/**` tree-u.** Ne dodiruj `packages/`, `preflight-results/`, `sessions/`, ili bilo koji drugi folder van `apps/www/`. Ako trebaš shared utility (npr. type definicija iz `packages/core`), importuj preko postojeće path mapping-a, ne kreiraj novu zavisnost. Specifično dozvoljeni paths za write: - `apps/www/src/components/**` - `apps/www/src/data/**` - `apps/www/src/app/design/personas/**` - `apps/www/src/types/**` (ako ne postoji već) - `apps/www/__tests__/**` ili equivalent test folder koji repo koristi --- ## Scope Implementiraj `BrandPersonasCard` React komponentu sa svim downstream implementacionim implikacijama iz `decisions/2026-04-22-landing-personas-ia-locked.md` Decision 3. Komponenta mora biti spreman za landing integration + reusable za buduće product contexts (onboarding, pricing section snippets) kroz `variant` prop. Svi copy strings dolaze iz ratifikovanog izvora — NE reinterpretiraj, NE polish, NE rewriting. --- ## Authoritative source files (CC čita, ne menja) 1. **Component contract:** `D:\Projects\PM-Waggle-OS\briefs\2026-04-22-brand-bee-personas-card-spec.md` — scaffold spec (updated 2026-04-22 sa ratifikovanim copy-om) 2. **Copy LOCKED:** `D:\Projects\PM-Waggle-OS\decisions\2026-04-22-personas-card-copy-locked.md` — 13 canonical role titles + JTBD strings 3. **Landing IA LOCKED:** `D:\Projects\PM-Waggle-OS\decisions\2026-04-22-landing-personas-ia-locked.md` — component contract implikacije (variant prop, onTileHover, CTA prop, reusable data source) 4. **Asset canon:** `D:\Projects\waggle-os\apps\www\public\brand\bee-*-dark.png` (11 canon + 2 pending from Task #24) 5. **Design system tokens:** `D:\Projects\waggle-os\apps\www\src\styles\globals.css` (already contains Hive DS tokens per 2026-04-20 setup) --- ## Deliverables ### 1. Data source — `apps/www/src/data/personas.ts` TypeScript module koji izvozi `personas` const kao read-only tuple sa 13 entry-ja. Copy MUST come verbatim from `decisions/2026-04-22-personas-card-copy-locked.md` canonical table. ```ts export interface Persona { slug: PersonaSlug; title: string; // "The Hunter" role: string; // "Finds the source you forgot you saved." alt: string; // accessible label for img — "Waggle {title} bee mascot" imagePath: string; // "/brand/bee-hunter-dark.png" order: number; // 1-13, canonical reading order } export type PersonaSlug = | "hunter" | "researcher" | "analyst" | "connector" | "architect" | "builder" | "writer" | "orchestrator" | "marketer" | "team" | "celebrating" | "confused" | "sleeping"; export const personas: readonly Persona[] = [ // 13 entries, ordering from decision log ] as const; ``` Slug mapping za image path: - `hunter` → `/brand/bee-hunter-dark.png` - `researcher` → `/brand/bee-researcher-dark.png` - `analyst` → `/brand/bee-analyst-dark.png` - `connector` → `/brand/bee-connector-dark.png` - `architect` → `/brand/bee-architect-dark.png` - `builder` → `/brand/bee-builder-dark.png` - `writer` → `/brand/bee-writer-dark.png` ← **placeholder state until Task #24 deploy** - `orchestrator` → `/brand/bee-orchestrator-dark.png` - `marketer` → `/brand/bee-marketer-dark.png` - `team` → `/brand/bee-team-dark.png` - `celebrating` → `/brand/bee-celebrating-dark.png` - `confused` → `/brand/bee-confused-dark.png` - `sleeping` → `/brand/bee-sleeping-dark.png` ← **placeholder state until Task #24 deploy** ### 2. Component — `apps/www/src/components/BrandPersonasCard.tsx` Functional React component, default export, zero required props. ```ts export interface BrandPersonasCardProps { heading?: string; // default "The Waggle Hive" subtitle?: string; // default: see below showFillerTiles?: boolean; // default true variant?: "landing" | "compact"; // default "landing" onTileHover?: (slug: PersonaSlug) => void; // default no-op onPersonaClick?: (slug: PersonaSlug) => void; // default no-op cta?: React.ReactNode; // optional CTA slot rendered below grid } ``` Default subtitle: `"Thirteen personas for the work your AI does while you sleep."` **Variant behavior:** - `"landing"` — full 13-tile grid, responsive (4×4 + 3 fillers on ≥1024px, 3×5 on 768-1023px, 2×7 on <768px), includes heading + subtitle + CTA slot - `"compact"` — stub implementation sa TypeScript-valid return ali renderuje TODO placeholder div. NE implementiraj puni compact layout u ovom sprintu; samo interface plumbing. Dodaj JSDoc `@todo compact variant scaffolding — implement in future sprint`. **Tile anatomy (verbatim iz scaffold spec-a):** - Background: hive-gradient `#0f1218` → `#080a0f`, 1px border `#1a1e27` - Hover: border transition to `#e5a000`, scale 1.02, 200ms ease-out, respects `prefers-reduced-motion` - Asset render: 256×256 area, centered, object-fit contain, `next/image` ako se koristi u repo-u - Role title: Inter 16/600, color `#f5b731` - Role line: Inter 13/400, color `#a0a3ad` **Filler tiles:** 3 angular positions sa `hex-texture-dark.png` at 40% opacity, no copy, aria-hidden. **Accessibility:** - Grid je `