# CRM UI Specification

**Product:** Torbat CRM (Enterprise Sales CRM)  
**Version:** Phase 6.3 frontend integration  
**Date:** 2026-07-26

## Product identity

| Aspect | Choice |
|--------|--------|
| Accent | `--crm-accent` indigo (`#6366f1` light / `#818cf8` dark) |
| Tone | Professional, minimal, low noise, desktop-first |
| Language | RTL-first (Persian labels) |
| Shell | Collapsible sidebar groups, mobile drawer, dark mode toggle |

Distinct from Accounting (sky/operational), Beauty (rose/warm), Healthcare (teal/clinical).

## Architecture

```
app/crm/                    # Thin routes only (page, layout, loading, error)
modules/crm/                # All business UI
  services/crm-api.ts       # Typed client → /api/crm BFF → :8003
  components/               # Shell, CRUD factory, breadcrumbs
  design-system/            # CrmTablePage, CrmStatGrid, CrmStatusChip
  features/sales/           # Page implementations
  constants/portals.ts      # Navigation
```

## Page inventory (41 routes)

All pages under `/crm/sales/*` unless noted.

| Area | Pages | Backend |
|------|-------|---------|
| Hub | `/crm/hub` | `/health` |
| Dashboards | overview, sales, pipeline, leads, activities, calendar | List aggregates |
| Entities | customers, companies, contacts, leads | Real CRUD APIs |
| Sales | deals, kanban, pipelines, quotes | opportunities, pipelines, quotes |
| Collaboration | activities, tasks, meetings, calls, emails, notes, timeline, documents | Phase 6.3 APIs |
| Marketing | tags | tags API; campaigns/segments scoped notice |
| Data | custom-fields, import, export | custom-fields; import N/A; export client CSV |
| Insights | reports, analytics, automation | computed / scoped |
| Admin | notifications, roles, permissions, integrations, api-keys, audit-logs, settings, health, capabilities | partial + static |

## Standard page contract

Every list page includes:

- `CrmPageLoader` / skeleton via `CrmTablePage`
- `CrmPageError` with 403 permission state
- `EmptyState` with create action
- Search (client-side filter)
- Sort dropdown (client-side)
- Pagination (client-side slice; server uses page/page_size fetch)
- Bulk selection + bulk delete where API supports
- Dialog create + Drawer edit + ConfirmDialog delete
- Toast via Sonner
- Breadcrumb via `CrmBreadcrumbs`

## Keyboard shortcuts

| Chord | Target |
|-------|--------|
| `g` then `o` | Overview dashboard |
| `g` then `l` | Leads |
| `g` then `c` | Contacts |
| `g` then `d` | Deals |
| `g` then `k` | Kanban |

## Out of scope (honest UI)

Pages show `CrmScopeNotice` instead of fake data:

- Campaigns, Segments, Import, Automation, Integrations, API Keys
- Global audit (per-entity audit only)
- `/capabilities` (health version only)

## API conventions

- Header: `Authorization: Bearer`, `X-Tenant-ID`
- Soft delete: `POST /{id}/delete` (leads, contacts, organizations)
- List: `page`, `page_size` — no server search/sort/filter
- Deals = `opportunities`; Customers = contacts + organizations

## Related

- [crm-component-map.md](./crm-component-map.md)
- [crm-routing-map.md](./crm-routing-map.md)
- [crm-validation-report.md](./crm-validation-report.md)
- [crm-responsive-report.md](./crm-responsive-report.md)
