Knowledge > Products > FuneralWiseAI > Design Direction
FuneralWiseAI — Admin Dashboard Design Direction
The funeral admin command center is a port of the WiseAI Realtor design system (
products/wiseai-realtor/design-direction.mdis the parent spec — layout archetypes, type scale, spacing, radius/elevation, density, and the 10 anti-patterns apply verbatim). This doc records only what is FUNERAL-SPECIFIC. Approved by the founder 2026-07-02; plan of recordC:\dev\PLAN_FUNERALWISE_DASHBOARD_REVAMP_2026-07-02.md.
Token mapping (realtor role → funeral value)
| Role | Realtor | Funeral |
|---|---|---|
| Rail/chrome | navy #0B1F3A | slate #1E293B, deep #0F172A |
| Single action color | teal #0F766E | deepened sage #3F685C (white text ~6.3:1 AA; brand #4D7C6F is tint-only), tint #EDF5F1 |
| Highlight/celebration ONLY (never body text) | gold #C49A3A | copper #B45309, tint #FEF3E2, text-on-tint #8A4A0B |
| Neutrals / semantic / type / spacing / radius / density | — | identical to realtor spec (#FAFAFA bg, #E6E8EB border, #18181B text, #6B7280 muted, Inter, 14px body, tabular-nums, rounded-2xl border-first low-shadow) |
| Pipeline stages (Arrangements) | 6 lead stages | New inquiry=blue · Arrangements=teal · Service set=amber · Completed=green · Aftercare=violet — always label+color (AODA) |
Tokens are INLINE hex in components (same convention as realtor — no CSS-variable layer yet; consolidation is a known cross-vertical lever). The serif/display fonts (Fraunces) belong to the funeral MARKETING site only — the admin stays neutral per the realtor "warmth lives in marketing" rule.
Shell (Phase 1 — PR #1106)
src/components/admin/funeral/shell/ — FuneralShell (app frame; 248px rail collapsible to 64px, hydration-safe localStorage persist; <lg off-canvas drawer), FuneralRail (nav from FUNERAL_TABS, copper at-need badge, sage inbox badge), FuneralTopBar (copper setup-progress pill from real setup state, Ask Grace launcher, at-need bell), nav-model.ts (IA = src/lib/verticals/funeral.ts FUNERAL_TABS; contract-tested). Gated strictly on verticalProfile?.key === 'funeral' in AdminDashboard — church/vet render the legacy tab chrome byte-identically. ?tab= deep links are the compatibility contract (funeral keys must resolve against FUNERAL_TABS, not church ALL_TABS).
Grace concierge (Phase 2 — PR #1110)
Port of Aria Phase-1 (products/wiseai-realtor Aria docs are the parent): read-only, zero write tools, deep-link screen registry over the 8 funeral tabs. Funeral-specific: grief-sensitive tone (never rushes, plain language), defer set (no legal advice, no specific prices to families, no grief counselling — 988 + "a director will reach out" AI-bridge escalation), guardrail belt src/lib/funeral/ai-guardrails.ts (audit-mode, Aria parity). Auth = admin-token resolution via resolveFuneralToken(); client-supplied tenant ids/headers are never trusted (cf. security P0 #1102). Endpoint /api/funeral/assistant, model Haiku 4.5 (GRACE_ONBOARDING_MODEL override) — runtime customer-facing carve-out, never batch.
Funeral data-layer rules (discovered 2026-07-02 — read before writing funeral queries)
church_voice_agents,voice_visitor_contacts,voice_prayer_requestsare VIEWS filteredvertical='church'overtenant_voice_agents,voice_visitor_inquiries,voice_urgent_requests(views aliastenant_id AS church_id). Funeral reads/writes must use the BASE tables withtenant_id+vertical='funeral'(fix PR #1108:getTenantVoiceAgentSafe, funeral metric branch, funeral inbox).voice_callback_requestsandvoice_call_logsare base tables scoped bychurch_id=funeral_homes.id(the tenant id;premium_funeral_homes.funeral_home_id=== it).moderation_violationsFKs referencechurches/organizationsonly — funeral tenant-scoped safety logging is schema-impossible today (open design item).fwa_*plans normalize to channelchat, soplanIncludesVoice({plan, channel})alone can never grant funeral tenants voice — fixed in PR #1115:getInboxStreamusesinboxIncludesVoice()(church path = planIncludesVoice verbatim; funeral additionally honorshasVoiceEntitlement= activetenant_voice_agentsrow ORpremium_funeral_homes.has_voice_subscription).- Demo tenant: Moelker Family Funeral Home, London ON —
funeralwiseai.com/admin/demo-moelker-7f3a, tenante0f4a11e-f00e-4a11-b000-000000000001, all seed rowse0f4a11e--prefixed +is_demo(scriptchurchwiseai-web/scripts/seed-moelker-funeral-demo.mjs, INSERT-only idempotent). The Kolssak tenant (demo-kolssak-51cb) is a live prospect — never use it for test data and never email them.
Daily-driver screens (Phase 3 — PR #1112)
FuneralInboxBody (3-pane inbox: funeral filter chips as saved-view list with live counts | item list with type/urgency/status chips + copper at-need/crisis edges | detail pane with server-redacted content, Grace AI-capture labels, Mark-contacted + escalate-to-director via existing APIs), FuneralAtNeedBody (urgency-ranked list + right drawer, transcript speaker rows), PrePlanningInquiriesTab (list + drawer, next-action emphasis). No new endpoints. Data-layer rule enforced in the funeral admin routes: token resolution must scope voice_* reads/ownership checks by the TENANT id (funeral_home_id), not the premium row id — the routes accept either for legacy rows.
Acceptance specs
acceptance/funeral-dashboard-command-center.md(shell + screens)acceptance/grace-onboarding-concierge-mvp.md(Grace)
Verification bar: Playwright on the REAL funeralwiseai.com host (previews skip the hostname rewrite), behavioral assertions, church-token regression alongside every funeral-gated change.