Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

11 — Design System Mapping (CRM Module)

Maps CRM UI to the shared design system (00-shared/04_Design_System_Mapping.md, tokens in 00-shared/02_Design_Tokens.md — proposed defaults until designer sign-off). Defines status → semantic-color rules, type scale usage, and shared component substitutions.


1. Status color semantics (single source)

Lead statuses (lead.schema.ts:7-13):

StatusRole colorContainerToken intent
newonSecondaryContainersecondaryContainerneutral/awaiting
contactedonPrimaryContainerprimaryContainerin-progress
qualifiedonTertiaryContainertertiaryContainerwarm/positive
convertedonSuccessContainersuccessContainerterminal-success
closedonSurfaceVariantsurfaceVariantterminal-muted

Admission statuses (admission.schema.ts:7-17): open states use neutral secondary/primary/tertiary containers; approved/converted → success; rejected → error container; waitlisted → surfaceVariant.

Campaign statuses (campaign.schema.ts:7-12): active → success-tinted border; draft/paused/completed → surface variants with icon.

Rule: never color-only — every badge has icon + label (00-shared/09:76).

2. Source icons & typography

  • Source icons per 07 §2 (material symbols, 20 dp default).
  • Typography: list rows → titleMedium (name) / bodySmall (meta); detail headers → headlineSmall; stat cards → headlineMedium (number) / labelLarge (caption); timeline → bodyMedium + labelSmall timestamps.

3. Shared components → module mapping

Shared (00-shared/03)Module usage
AppCardpipeline/placement/documents/interview/notes cards (S2/S6)
AppListTileleads/admissions rows (wrapped in module tiles 07 §3,7)
AppChipsfilter rows (07 §13), panel/mode chips, source chips
AppBadgestatus badges (07 §1,6)
AppAvataridentity (40/56 dp), initials from name
AppTimelinefollow-up timeline (S2), workflow timeline (S6, read-only)
AppDialogConvert (S4), Decision (S9)
AppBottomSheetforms (S3, follow-up, document, interview, campaign)
AppDatePickerscheduledAt, dates (datetime variant for follow-up/interview)
AppSegmentedButtondecision choice, interview mode
AppSkeleton / AppEmptyState / AppErrorState / AppOfflineBannerall list/detail states
AppFABcreate actions (gated by permission)
AppTextFieldall form fields

4. Spacing & density

  • List rows: 72 dp height (avatar 40 + two lines) — dense enough for a working queue; detail cards 16 dp padding.
  • Filter rows: 8 dp above list; chips 8 dp gap.
  • Bottom action bars: 8 dp safe-area padding; primary action right-aligned.
  • Tablet: two-pane master-detail with 320 dp min detail width; sheets ≤ 560 dp.

5. Empty & error states (copy)

StateIllustrationCopy
No leadsinbox"No leads yet — create your first lead"
No leads in filterfilter_alt_off"No leads in this status" + Clear filter
No admissionsdescription"No applications yet"
No campaignscampaign"No campaigns yet"
Lead 404search_off"Lead not found"
Offlinecloud_offstandard AppOfflineBanner + cached list
Permissionlock"Ask your admin for CRM access" (when crm.read missing)

6. Accessibility tokens

  • Overdue text: color.error at ≥ 4.5:1 on card surface; paired with alert icon.
  • Focus ring: 2 dp outline in color.primary; minimum touch targets 48 dp (chips 40 dp acceptable with padding).
  • Dark mode: all container pairs defined in tokens; goldens cover light/dark × 3 sizes for badges/timeline/stat cards (07 §Composition rules).

7. Motion tokens (per 00-shared/08)

Standard curves/easings; durations per 10 §6. Status chip transitions use the m-fast emphasis variant; timeline stagger is the only module-specific choreography.

8. Copy & i18n

All strings keyed under crm.* (see 07 §Composition rules, 08 §1); server business-4xx messages fall back via error-code → key mapping (00-shared/11 §9). Locale: en first, org-locales on demand.