@nextsparkjs/theme-crm 0.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CRM_PLAN.md +343 -0
  2. package/about.md +122 -0
  3. package/config/app.config.ts +185 -0
  4. package/config/billing.config.ts +187 -0
  5. package/config/dashboard.config.ts +372 -0
  6. package/config/dev.config.ts +55 -0
  7. package/config/features.config.ts +336 -0
  8. package/config/flows.config.ts +511 -0
  9. package/config/permissions.config.ts +297 -0
  10. package/config/theme.config.ts +111 -0
  11. package/entities/activities/activities.config.ts +61 -0
  12. package/entities/activities/activities.fields.ts +362 -0
  13. package/entities/activities/activities.service.ts +503 -0
  14. package/entities/activities/activities.types.ts +117 -0
  15. package/entities/activities/messages/en.json +123 -0
  16. package/entities/activities/messages/es.json +123 -0
  17. package/entities/activities/migrations/020_activities_table.sql +123 -0
  18. package/entities/activities/migrations/021_activities_metas.sql +114 -0
  19. package/entities/activities/migrations/022_activities_sample_data.sql +420 -0
  20. package/entities/campaigns/campaigns.config.ts +61 -0
  21. package/entities/campaigns/campaigns.fields.ts +413 -0
  22. package/entities/campaigns/campaigns.service.ts +426 -0
  23. package/entities/campaigns/campaigns.types.ts +124 -0
  24. package/entities/campaigns/messages/en.json +145 -0
  25. package/entities/campaigns/messages/es.json +145 -0
  26. package/entities/campaigns/migrations/001_campaigns_table.sql +127 -0
  27. package/entities/campaigns/migrations/002_campaigns_metas.sql +114 -0
  28. package/entities/campaigns/migrations/003_campaigns_sample_data.sql +364 -0
  29. package/entities/companies/companies.config.ts +61 -0
  30. package/entities/companies/companies.fields.ts +429 -0
  31. package/entities/companies/companies.service.ts +566 -0
  32. package/entities/companies/companies.types.ts +125 -0
  33. package/entities/companies/messages/en.json +146 -0
  34. package/entities/companies/messages/es.json +146 -0
  35. package/entities/companies/migrations/001_companies_table.sql +150 -0
  36. package/entities/companies/migrations/002_companies_metas.sql +114 -0
  37. package/entities/companies/migrations/003_companies_sample_data.sql +246 -0
  38. package/entities/contacts/contacts.config.ts +61 -0
  39. package/entities/contacts/contacts.fields.ts +359 -0
  40. package/entities/contacts/contacts.service.ts +509 -0
  41. package/entities/contacts/contacts.types.ts +108 -0
  42. package/entities/contacts/messages/en.json +117 -0
  43. package/entities/contacts/messages/es.json +117 -0
  44. package/entities/contacts/migrations/001_contacts_table.sql +134 -0
  45. package/entities/contacts/migrations/002_contacts_metas.sql +114 -0
  46. package/entities/contacts/migrations/003_contacts_sample_data.sql +421 -0
  47. package/entities/leads/leads.config.ts +61 -0
  48. package/entities/leads/leads.fields.ts +336 -0
  49. package/entities/leads/leads.service.ts +496 -0
  50. package/entities/leads/leads.types.ts +114 -0
  51. package/entities/leads/messages/en.json +132 -0
  52. package/entities/leads/messages/es.json +132 -0
  53. package/entities/leads/migrations/001_leads_table.sql +150 -0
  54. package/entities/leads/migrations/002_leads_metas.sql +120 -0
  55. package/entities/leads/migrations/003_leads_sample_data.sql +242 -0
  56. package/entities/notes/messages/en.json +114 -0
  57. package/entities/notes/messages/es.json +114 -0
  58. package/entities/notes/migrations/020_notes_table.sql +118 -0
  59. package/entities/notes/migrations/021_notes_metas.sql +114 -0
  60. package/entities/notes/migrations/022_notes_sample_data.sql +275 -0
  61. package/entities/notes/notes.config.ts +61 -0
  62. package/entities/notes/notes.fields.ts +283 -0
  63. package/entities/notes/notes.service.ts +320 -0
  64. package/entities/notes/notes.types.ts +102 -0
  65. package/entities/opportunities/messages/en.json +107 -0
  66. package/entities/opportunities/messages/es.json +107 -0
  67. package/entities/opportunities/migrations/010_opportunities_table.sql +145 -0
  68. package/entities/opportunities/migrations/011_opportunities_metas.sql +114 -0
  69. package/entities/opportunities/migrations/012_opportunities_sample_data.sql +438 -0
  70. package/entities/opportunities/opportunities.config.ts +61 -0
  71. package/entities/opportunities/opportunities.fields.ts +416 -0
  72. package/entities/opportunities/opportunities.service.ts +525 -0
  73. package/entities/opportunities/opportunities.types.ts +135 -0
  74. package/entities/pipelines/messages/en.json +115 -0
  75. package/entities/pipelines/messages/es.json +115 -0
  76. package/entities/pipelines/migrations/001_pipelines_table.sql +106 -0
  77. package/entities/pipelines/migrations/002_pipelines_metas.sql +114 -0
  78. package/entities/pipelines/migrations/003_pipelines_sample_data.sql +91 -0
  79. package/entities/pipelines/pipelines.config.ts +62 -0
  80. package/entities/pipelines/pipelines.fields.ts +193 -0
  81. package/entities/pipelines/pipelines.service.ts +383 -0
  82. package/entities/pipelines/pipelines.types.ts +78 -0
  83. package/entities/products/messages/en.json +135 -0
  84. package/entities/products/messages/es.json +135 -0
  85. package/entities/products/migrations/001_products_table.sql +117 -0
  86. package/entities/products/migrations/002_products_metas.sql +114 -0
  87. package/entities/products/migrations/003_products_sample_data.sql +247 -0
  88. package/entities/products/products.config.ts +62 -0
  89. package/entities/products/products.fields.ts +361 -0
  90. package/entities/products/products.service.ts +437 -0
  91. package/entities/products/products.types.ts +125 -0
  92. package/lib/crm-constants.ts +77 -0
  93. package/lib/crm-utils.ts +185 -0
  94. package/lib/selectors.ts +333 -0
  95. package/messages/en.json +131 -0
  96. package/messages/es.json +131 -0
  97. package/migrations/999_theme_sample_data.sql +473 -0
  98. package/package.json +18 -0
  99. package/pendings.md +205 -0
  100. package/permissions-matrix.md +216 -0
  101. package/styles/components.css +414 -0
  102. package/styles/crm-theme.css +358 -0
  103. package/styles/globals.css +576 -0
  104. package/styles/variables.css +111 -0
  105. package/templates/dashboard/(main)/activities/components/ActivityCard.tsx +169 -0
  106. package/templates/dashboard/(main)/activities/components/ActivityTimeline.tsx +165 -0
  107. package/templates/dashboard/(main)/activities/page.tsx +297 -0
  108. package/templates/dashboard/(main)/campaigns/page.tsx +373 -0
  109. package/templates/dashboard/(main)/companies/page.tsx +296 -0
  110. package/templates/dashboard/(main)/contacts/page.tsx +347 -0
  111. package/templates/dashboard/(main)/layout.tsx +98 -0
  112. package/templates/dashboard/(main)/leads/page.tsx +335 -0
  113. package/templates/dashboard/(main)/opportunities/[id]/edit/page.tsx +95 -0
  114. package/templates/dashboard/(main)/opportunities/create/page.tsx +94 -0
  115. package/templates/dashboard/(main)/opportunities/page.tsx +350 -0
  116. package/templates/dashboard/(main)/pipelines/[id]/edit/page.tsx +95 -0
  117. package/templates/dashboard/(main)/pipelines/[id]/page.tsx +143 -0
  118. package/templates/dashboard/(main)/pipelines/create/page.tsx +94 -0
  119. package/templates/dashboard/(main)/pipelines/page.tsx +234 -0
  120. package/templates/dashboard/(main)/products/[id]/edit/page.tsx +97 -0
  121. package/templates/dashboard/(main)/products/[id]/page.tsx +509 -0
  122. package/templates/dashboard/(main)/products/create/page.tsx +96 -0
  123. package/templates/dashboard/(main)/products/page.tsx +308 -0
  124. package/templates/shared/ActionButtons.tsx +41 -0
  125. package/templates/shared/CRMDashboard.tsx +519 -0
  126. package/templates/shared/CRMDataTable.tsx +441 -0
  127. package/templates/shared/CRMMetricCard.tsx +76 -0
  128. package/templates/shared/CRMMobileNav.tsx +172 -0
  129. package/templates/shared/CRMSidebar.tsx +346 -0
  130. package/templates/shared/CRMTopBar.tsx +265 -0
  131. package/templates/shared/DealCard.tsx +123 -0
  132. package/templates/shared/EntityCard.tsx +58 -0
  133. package/templates/shared/OpportunityForm.tsx +649 -0
  134. package/templates/shared/PipelineForm.tsx +367 -0
  135. package/templates/shared/PipelineKanban.tsx +194 -0
  136. package/templates/shared/QuickFilters.tsx +47 -0
  137. package/templates/shared/StageColumn.tsx +175 -0
  138. package/templates/shared/StageSelect.tsx +177 -0
  139. package/templates/shared/StagesRepeater.tsx +317 -0
  140. package/templates/shared/index.ts +9 -0
@@ -0,0 +1,576 @@
1
+ /**
2
+ * CRM Theme - Global Styles
3
+ *
4
+ * Professional, data-focused design for enterprise CRM.
5
+ * Clean interface with emphasis on data visualization.
6
+ *
7
+ * Design System: Purple/Violet primary, Plus Jakarta Sans typography
8
+ */
9
+
10
+ /* ============================================================================
11
+ Base Design System Variables (Custom Theme Override)
12
+ ============================================================================ */
13
+
14
+ :root {
15
+ /* Core Colors - Purple/Violet Theme */
16
+ --background: oklch(0.9940 0 0);
17
+ --foreground: oklch(0 0 0);
18
+ --card: oklch(0.9940 0 0);
19
+ --card-foreground: oklch(0 0 0);
20
+ --popover: oklch(0.9911 0 0);
21
+ --popover-foreground: oklch(0 0 0);
22
+ --primary: oklch(0.5393 0.2713 286.7462);
23
+ --primary-foreground: oklch(1.0000 0 0);
24
+ --secondary: oklch(0.9540 0.0063 255.4755);
25
+ --secondary-foreground: oklch(0.1344 0 0);
26
+ --muted: oklch(0.9702 0 0);
27
+ --muted-foreground: oklch(0.4386 0 0);
28
+ --accent: oklch(0.9393 0.0288 266.3680);
29
+ --accent-foreground: oklch(0.5445 0.1903 259.4848);
30
+ --destructive: oklch(0.6290 0.1902 23.0704);
31
+ --destructive-foreground: oklch(1.0000 0 0);
32
+ --border: oklch(0.9300 0.0094 286.2156);
33
+ --input: oklch(0.9401 0 0);
34
+ --ring: oklch(0 0 0);
35
+
36
+ /* Chart Colors */
37
+ --chart-1: oklch(0.7459 0.1483 156.4499);
38
+ --chart-2: oklch(0.5393 0.2713 286.7462);
39
+ --chart-3: oklch(0.7336 0.1758 50.5517);
40
+ --chart-4: oklch(0.5828 0.1809 259.7276);
41
+ --chart-5: oklch(0.5590 0 0);
42
+
43
+ /* Sidebar */
44
+ --sidebar: oklch(0.9777 0.0051 247.8763);
45
+ --sidebar-foreground: oklch(0 0 0);
46
+ --sidebar-primary: oklch(0 0 0);
47
+ --sidebar-primary-foreground: oklch(1.0000 0 0);
48
+ --sidebar-accent: oklch(0.9401 0 0);
49
+ --sidebar-accent-foreground: oklch(0 0 0);
50
+ --sidebar-border: oklch(0.9401 0 0);
51
+ --sidebar-ring: oklch(0 0 0);
52
+
53
+ /* Typography */
54
+ --font-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
55
+ --font-serif: 'Lora', Georgia, serif;
56
+ --font-mono: 'IBM Plex Mono', monospace;
57
+
58
+ /* Radius & Spacing */
59
+ --radius: 1.4rem;
60
+ --spacing: 0.27rem;
61
+ --tracking-normal: -0.025em;
62
+
63
+ /* Shadows */
64
+ --shadow-2xs: 0px 2px 3px 0px hsl(0 0% 0% / 0.08);
65
+ --shadow-xs: 0px 2px 3px 0px hsl(0 0% 0% / 0.08);
66
+ --shadow-sm: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 1px 2px -1px hsl(0 0% 0% / 0.16);
67
+ --shadow: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 1px 2px -1px hsl(0 0% 0% / 0.16);
68
+ --shadow-md: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 2px 4px -1px hsl(0 0% 0% / 0.16);
69
+ --shadow-lg: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 4px 6px -1px hsl(0 0% 0% / 0.16);
70
+ --shadow-xl: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 8px 10px -1px hsl(0 0% 0% / 0.16);
71
+ --shadow-2xl: 0px 2px 3px 0px hsl(0 0% 0% / 0.40);
72
+
73
+ /* CRM-Specific: Pipeline stage colors */
74
+ --stage-qualification: oklch(0.55 0.22 286);
75
+ --stage-needs-analysis: oklch(0.55 0.18 150);
76
+ --stage-proposal: oklch(0.65 0.18 80);
77
+ --stage-negotiation: oklch(0.55 0.2 320);
78
+ --stage-won: oklch(0.55 0.18 150);
79
+ --stage-lost: oklch(0.55 0.22 25);
80
+
81
+ /* CRM-Specific: Lead score colors */
82
+ --score-hot: oklch(0.55 0.22 25);
83
+ --score-warm: oklch(0.65 0.18 80);
84
+ --score-cold: oklch(0.55 0.22 286);
85
+
86
+ /* CRM-Specific: Status colors */
87
+ --status-new: oklch(0.55 0.22 286);
88
+ --status-active: oklch(0.55 0.18 150);
89
+ --status-pending: oklch(0.65 0.18 80);
90
+ --status-completed: oklch(0.55 0.18 150);
91
+ --status-cancelled: oklch(0.5 0.02 260);
92
+
93
+ /* CRM-Specific: Priority colors */
94
+ --priority-urgent: oklch(0.55 0.22 25);
95
+ --priority-high: oklch(0.65 0.18 80);
96
+ --priority-medium: oklch(0.55 0.22 286);
97
+ --priority-low: oklch(0.5 0.02 260);
98
+
99
+ /* Card shadows */
100
+ --card-shadow-idle: var(--shadow-sm);
101
+ --card-shadow-hover: var(--shadow-lg);
102
+
103
+ /* Animation */
104
+ --transition-fast: 100ms ease;
105
+ --transition-normal: 200ms ease;
106
+ }
107
+
108
+ /* Dark mode */
109
+ .dark {
110
+ --background: oklch(0.2223 0.0060 271.1393);
111
+ --foreground: oklch(0.9551 0 0);
112
+ --card: oklch(0.2568 0.0076 274.6528);
113
+ --card-foreground: oklch(0.9551 0 0);
114
+ --popover: oklch(0.2568 0.0076 274.6528);
115
+ --popover-foreground: oklch(0.9551 0 0);
116
+ --primary: oklch(0.6132 0.2294 291.7437);
117
+ --primary-foreground: oklch(1.0000 0 0);
118
+ --secondary: oklch(0.2940 0.0130 272.9312);
119
+ --secondary-foreground: oklch(0.9551 0 0);
120
+ --muted: oklch(0.2940 0.0130 272.9312);
121
+ --muted-foreground: oklch(0.7058 0 0);
122
+ --accent: oklch(0.2795 0.0368 260.0310);
123
+ --accent-foreground: oklch(0.7857 0.1153 246.6596);
124
+ --destructive: oklch(0.7106 0.1661 22.2162);
125
+ --destructive-foreground: oklch(1.0000 0 0);
126
+ --border: oklch(0.3289 0.0092 268.3843);
127
+ --input: oklch(0.3289 0.0092 268.3843);
128
+ --ring: oklch(0.6132 0.2294 291.7437);
129
+
130
+ --chart-1: oklch(0.8003 0.1821 151.7110);
131
+ --chart-2: oklch(0.6132 0.2294 291.7437);
132
+ --chart-3: oklch(0.8077 0.1035 19.5706);
133
+ --chart-4: oklch(0.6691 0.1569 260.1063);
134
+ --chart-5: oklch(0.7058 0 0);
135
+
136
+ --sidebar: oklch(0.2011 0.0039 286.0396);
137
+ --sidebar-foreground: oklch(0.9551 0 0);
138
+ --sidebar-primary: oklch(0.6132 0.2294 291.7437);
139
+ --sidebar-primary-foreground: oklch(1.0000 0 0);
140
+ --sidebar-accent: oklch(0.2940 0.0130 272.9312);
141
+ --sidebar-accent-foreground: oklch(0.6132 0.2294 291.7437);
142
+ --sidebar-border: oklch(0.3289 0.0092 268.3843);
143
+ --sidebar-ring: oklch(0.6132 0.2294 291.7437);
144
+
145
+ /* CRM-Specific: Dark mode adjustments */
146
+ --stage-qualification: oklch(0.50 0.20 286);
147
+ --stage-needs-analysis: oklch(0.45 0.16 150);
148
+ --stage-proposal: oklch(0.55 0.16 80);
149
+ --stage-negotiation: oklch(0.50 0.18 320);
150
+ --stage-won: oklch(0.45 0.16 150);
151
+ --stage-lost: oklch(0.45 0.2 25);
152
+ }
153
+
154
+ /* Theme inline mapping for Tailwind */
155
+ @theme inline {
156
+ --color-background: var(--background);
157
+ --color-foreground: var(--foreground);
158
+ --color-card: var(--card);
159
+ --color-card-foreground: var(--card-foreground);
160
+ --color-popover: var(--popover);
161
+ --color-popover-foreground: var(--popover-foreground);
162
+ --color-primary: var(--primary);
163
+ --color-primary-foreground: var(--primary-foreground);
164
+ --color-secondary: var(--secondary);
165
+ --color-secondary-foreground: var(--secondary-foreground);
166
+ --color-muted: var(--muted);
167
+ --color-muted-foreground: var(--muted-foreground);
168
+ --color-accent: var(--accent);
169
+ --color-accent-foreground: var(--accent-foreground);
170
+ --color-destructive: var(--destructive);
171
+ --color-destructive-foreground: var(--destructive-foreground);
172
+ --color-border: var(--border);
173
+ --color-input: var(--input);
174
+ --color-ring: var(--ring);
175
+ --color-chart-1: var(--chart-1);
176
+ --color-chart-2: var(--chart-2);
177
+ --color-chart-3: var(--chart-3);
178
+ --color-chart-4: var(--chart-4);
179
+ --color-chart-5: var(--chart-5);
180
+ --color-sidebar: var(--sidebar);
181
+ --color-sidebar-foreground: var(--sidebar-foreground);
182
+ --color-sidebar-primary: var(--sidebar-primary);
183
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
184
+ --color-sidebar-accent: var(--sidebar-accent);
185
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
186
+ --color-sidebar-border: var(--sidebar-border);
187
+ --color-sidebar-ring: var(--sidebar-ring);
188
+
189
+ --font-sans: var(--font-sans);
190
+ --font-mono: var(--font-mono);
191
+ --font-serif: var(--font-serif);
192
+
193
+ --radius-sm: calc(var(--radius) - 4px);
194
+ --radius-md: calc(var(--radius) - 2px);
195
+ --radius-lg: var(--radius);
196
+ --radius-xl: calc(var(--radius) + 4px);
197
+
198
+ --shadow-2xs: var(--shadow-2xs);
199
+ --shadow-xs: var(--shadow-xs);
200
+ --shadow-sm: var(--shadow-sm);
201
+ --shadow: var(--shadow);
202
+ --shadow-md: var(--shadow-md);
203
+ --shadow-lg: var(--shadow-lg);
204
+ --shadow-xl: var(--shadow-xl);
205
+ --shadow-2xl: var(--shadow-2xl);
206
+
207
+ --tracking-tighter: calc(var(--tracking-normal) - 0.05em);
208
+ --tracking-tight: calc(var(--tracking-normal) - 0.025em);
209
+ --tracking-normal: var(--tracking-normal);
210
+ --tracking-wide: calc(var(--tracking-normal) + 0.025em);
211
+ --tracking-wider: calc(var(--tracking-normal) + 0.05em);
212
+ --tracking-widest: calc(var(--tracking-normal) + 0.1em);
213
+ }
214
+
215
+ /* ============================================================================
216
+ Base Styles
217
+ ============================================================================ */
218
+
219
+ body {
220
+ font-feature-settings: "cv02", "cv03", "cv04", "cv11";
221
+ }
222
+
223
+ /* ============================================================================
224
+ Typography
225
+ ============================================================================ */
226
+
227
+ .crm-heading {
228
+ font-weight: 600;
229
+ letter-spacing: -0.02em;
230
+ line-height: 1.3;
231
+ }
232
+
233
+ .crm-stat-value {
234
+ font-size: 2rem;
235
+ font-weight: 700;
236
+ letter-spacing: -0.03em;
237
+ line-height: 1;
238
+ }
239
+
240
+ .crm-stat-label {
241
+ font-size: 0.75rem;
242
+ font-weight: 500;
243
+ text-transform: uppercase;
244
+ letter-spacing: 0.05em;
245
+ color: var(--muted-foreground);
246
+ }
247
+
248
+ /* ============================================================================
249
+ Pipeline Kanban
250
+ ============================================================================ */
251
+
252
+ .pipeline-container {
253
+ display: flex;
254
+ gap: 1rem;
255
+ overflow-x: auto;
256
+ padding: 1rem;
257
+ min-height: calc(100vh - 200px);
258
+ }
259
+
260
+ .pipeline-column {
261
+ width: 300px;
262
+ flex-shrink: 0;
263
+ background: oklch(from var(--muted) l c h / 0.3);
264
+ border-radius: var(--radius);
265
+ display: flex;
266
+ flex-direction: column;
267
+ }
268
+
269
+ .pipeline-header {
270
+ padding: 1rem;
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: space-between;
274
+ border-bottom: 2px solid;
275
+ }
276
+
277
+ .pipeline-header.stage-qualification { border-color: var(--stage-qualification); }
278
+ .pipeline-header.stage-needs-analysis { border-color: var(--stage-needs-analysis); }
279
+ .pipeline-header.stage-proposal { border-color: var(--stage-proposal); }
280
+ .pipeline-header.stage-negotiation { border-color: var(--stage-negotiation); }
281
+ .pipeline-header.stage-won { border-color: var(--stage-won); }
282
+ .pipeline-header.stage-lost { border-color: var(--stage-lost); }
283
+
284
+ .pipeline-stats {
285
+ display: flex;
286
+ gap: 1rem;
287
+ font-size: 0.75rem;
288
+ color: var(--muted-foreground);
289
+ }
290
+
291
+ .pipeline-cards {
292
+ flex: 1;
293
+ overflow-y: auto;
294
+ padding: 0.5rem;
295
+ display: flex;
296
+ flex-direction: column;
297
+ gap: 0.5rem;
298
+ }
299
+
300
+ /* ============================================================================
301
+ Deal Card
302
+ ============================================================================ */
303
+
304
+ .deal-card {
305
+ background: var(--card);
306
+ border-radius: var(--radius-sm);
307
+ padding: 0.875rem;
308
+ box-shadow: var(--card-shadow-idle);
309
+ cursor: pointer;
310
+ transition: box-shadow var(--transition-fast), transform var(--transition-fast);
311
+ }
312
+
313
+ .deal-card:hover {
314
+ box-shadow: var(--card-shadow-hover);
315
+ transform: translateY(-1px);
316
+ }
317
+
318
+ .deal-name {
319
+ font-size: 0.875rem;
320
+ font-weight: 600;
321
+ color: var(--foreground);
322
+ margin-bottom: 0.25rem;
323
+ }
324
+
325
+ .deal-company {
326
+ font-size: 0.75rem;
327
+ color: var(--muted-foreground);
328
+ margin-bottom: 0.5rem;
329
+ }
330
+
331
+ .deal-amount {
332
+ font-size: 1rem;
333
+ font-weight: 700;
334
+ color: var(--primary);
335
+ }
336
+
337
+ .deal-meta {
338
+ display: flex;
339
+ align-items: center;
340
+ justify-content: space-between;
341
+ margin-top: 0.5rem;
342
+ font-size: 0.75rem;
343
+ color: var(--muted-foreground);
344
+ }
345
+
346
+ /* ============================================================================
347
+ Lead Score Badge
348
+ ============================================================================ */
349
+
350
+ .lead-score {
351
+ display: inline-flex;
352
+ align-items: center;
353
+ justify-content: center;
354
+ width: 2rem;
355
+ height: 2rem;
356
+ border-radius: 9999px;
357
+ font-size: 0.75rem;
358
+ font-weight: 700;
359
+ color: white;
360
+ }
361
+
362
+ .lead-score.hot { background: var(--score-hot); }
363
+ .lead-score.warm { background: var(--score-warm); }
364
+ .lead-score.cold { background: var(--score-cold); }
365
+
366
+ /* ============================================================================
367
+ Status Badges
368
+ ============================================================================ */
369
+
370
+ .status-badge {
371
+ display: inline-flex;
372
+ align-items: center;
373
+ padding: 0.125rem 0.5rem;
374
+ border-radius: 9999px;
375
+ font-size: 0.675rem;
376
+ font-weight: 600;
377
+ text-transform: uppercase;
378
+ letter-spacing: 0.025em;
379
+ }
380
+
381
+ .status-badge.new { background: var(--status-new); color: white; }
382
+ .status-badge.contacted { background: var(--status-active); color: white; }
383
+ .status-badge.qualified { background: var(--status-pending); color: white; }
384
+ .status-badge.converted { background: var(--status-completed); color: white; }
385
+ .status-badge.lost { background: var(--status-cancelled); color: white; }
386
+
387
+ /* ============================================================================
388
+ Priority Indicators
389
+ ============================================================================ */
390
+
391
+ .priority-indicator {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ gap: 0.25rem;
395
+ }
396
+
397
+ .priority-dot {
398
+ width: 0.5rem;
399
+ height: 0.5rem;
400
+ border-radius: 9999px;
401
+ }
402
+
403
+ .priority-dot.urgent { background: var(--priority-urgent); }
404
+ .priority-dot.high { background: var(--priority-high); }
405
+ .priority-dot.medium { background: var(--priority-medium); }
406
+ .priority-dot.low { background: var(--priority-low); }
407
+
408
+ /* ============================================================================
409
+ Stats Cards
410
+ ============================================================================ */
411
+
412
+ .stats-grid {
413
+ display: grid;
414
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
415
+ gap: 1rem;
416
+ }
417
+
418
+ .stat-card {
419
+ background: var(--card);
420
+ border: 1px solid var(--border);
421
+ border-radius: var(--radius);
422
+ padding: 1.25rem;
423
+ display: flex;
424
+ flex-direction: column;
425
+ }
426
+
427
+ .stat-card-icon {
428
+ width: 2.5rem;
429
+ height: 2.5rem;
430
+ border-radius: var(--radius-sm);
431
+ display: flex;
432
+ align-items: center;
433
+ justify-content: center;
434
+ margin-bottom: 0.75rem;
435
+ background: oklch(from var(--primary) l c h / 0.1);
436
+ color: var(--primary);
437
+ }
438
+
439
+ .stat-trend {
440
+ display: inline-flex;
441
+ align-items: center;
442
+ gap: 0.25rem;
443
+ font-size: 0.75rem;
444
+ margin-top: 0.5rem;
445
+ }
446
+
447
+ .stat-trend.positive { color: var(--stage-won); }
448
+ .stat-trend.negative { color: var(--stage-lost); }
449
+
450
+ /* ============================================================================
451
+ Activity Timeline
452
+ ============================================================================ */
453
+
454
+ .activity-timeline {
455
+ display: flex;
456
+ flex-direction: column;
457
+ }
458
+
459
+ .activity-item {
460
+ display: flex;
461
+ gap: 0.75rem;
462
+ padding: 0.75rem 0;
463
+ border-bottom: 1px solid oklch(from var(--border) l c h / 0.5);
464
+ }
465
+
466
+ .activity-item:last-child {
467
+ border-bottom: none;
468
+ }
469
+
470
+ .activity-icon {
471
+ width: 2rem;
472
+ height: 2rem;
473
+ border-radius: 9999px;
474
+ display: flex;
475
+ align-items: center;
476
+ justify-content: center;
477
+ flex-shrink: 0;
478
+ background: var(--muted);
479
+ color: var(--muted-foreground);
480
+ }
481
+
482
+ .activity-icon.call { background: var(--stage-qualification); color: white; }
483
+ .activity-icon.email { background: var(--stage-needs-analysis); color: white; }
484
+ .activity-icon.meeting { background: var(--stage-proposal); color: white; }
485
+ .activity-icon.task { background: var(--stage-negotiation); color: white; }
486
+
487
+ .activity-content {
488
+ flex: 1;
489
+ min-width: 0;
490
+ }
491
+
492
+ .activity-title {
493
+ font-size: 0.875rem;
494
+ font-weight: 500;
495
+ color: var(--foreground);
496
+ }
497
+
498
+ .activity-description {
499
+ font-size: 0.75rem;
500
+ color: var(--muted-foreground);
501
+ margin-top: 0.125rem;
502
+ }
503
+
504
+ .activity-time {
505
+ font-size: 0.675rem;
506
+ color: var(--muted-foreground);
507
+ margin-top: 0.25rem;
508
+ }
509
+
510
+ /* ============================================================================
511
+ Data Tables
512
+ ============================================================================ */
513
+
514
+ .crm-table {
515
+ width: 100%;
516
+ border-collapse: collapse;
517
+ }
518
+
519
+ .crm-table th {
520
+ text-align: left;
521
+ font-size: 0.75rem;
522
+ font-weight: 600;
523
+ text-transform: uppercase;
524
+ letter-spacing: 0.05em;
525
+ color: var(--muted-foreground);
526
+ padding: 0.75rem 1rem;
527
+ border-bottom: 1px solid var(--border);
528
+ }
529
+
530
+ .crm-table td {
531
+ padding: 0.875rem 1rem;
532
+ border-bottom: 1px solid oklch(from var(--border) l c h / 0.5);
533
+ font-size: 0.875rem;
534
+ }
535
+
536
+ .crm-table tr:hover {
537
+ background: oklch(from var(--muted) l c h / 0.3);
538
+ }
539
+
540
+ /* ============================================================================
541
+ Charts
542
+ ============================================================================ */
543
+
544
+ .chart-container {
545
+ background: var(--card);
546
+ border: 1px solid var(--border);
547
+ border-radius: var(--radius);
548
+ padding: 1.5rem;
549
+ }
550
+
551
+ .chart-title {
552
+ font-size: 0.875rem;
553
+ font-weight: 600;
554
+ margin-bottom: 1rem;
555
+ }
556
+
557
+ /* ============================================================================
558
+ Responsive Adjustments
559
+ ============================================================================ */
560
+
561
+ @media (max-width: 768px) {
562
+ .pipeline-column {
563
+ width: 280px;
564
+ }
565
+
566
+ .stats-grid {
567
+ grid-template-columns: repeat(2, 1fr);
568
+ }
569
+ }
570
+
571
+ @media (max-width: 480px) {
572
+ .stats-grid {
573
+ grid-template-columns: 1fr;
574
+ }
575
+ }
576
+
@@ -0,0 +1,111 @@
1
+ /**
2
+ * CRM Theme Variables
3
+ * Color palette and design tokens for SalesForce Pro CRM
4
+ */
5
+
6
+ :root {
7
+ /* Brand Colors */
8
+ --crm-primary: #0B5FFF;
9
+ --crm-primary-hover: #0A54E6;
10
+ --crm-primary-light: #E6F0FF;
11
+ --crm-secondary: #6B46C1;
12
+ --crm-secondary-hover: #5A3BA8;
13
+ --crm-accent: #10B981;
14
+ --crm-accent-hover: #0E9F6E;
15
+ --crm-warning: #F59E0B;
16
+ --crm-warning-hover: #D97706;
17
+ --crm-danger: #EF4444;
18
+ --crm-danger-hover: #DC2626;
19
+
20
+ /* Pipeline Stage Colors */
21
+ --stage-qualification: #3B82F6;
22
+ --stage-analysis: #10B981;
23
+ --stage-proposal: #F59E0B;
24
+ --stage-negotiation: #8B5CF6;
25
+ --stage-won: #059669;
26
+ --stage-lost: #DC2626;
27
+
28
+ /* Activity Type Colors */
29
+ --activity-call: #3B82F6;
30
+ --activity-email: #8B5CF6;
31
+ --activity-meeting: #10B981;
32
+ --activity-task: #F59E0B;
33
+ --activity-note: #6B7280;
34
+
35
+ /* Semantic Colors */
36
+ --crm-bg-primary: #FFFFFF;
37
+ --crm-bg-secondary: #F9FAFB;
38
+ --crm-bg-tertiary: #F3F4F6;
39
+ --crm-border: #E5E7EB;
40
+ --crm-border-light: #F3F4F6;
41
+
42
+ /* Text Colors */
43
+ --crm-text-primary: #111827;
44
+ --crm-text-secondary: #6B7280;
45
+ --crm-text-tertiary: #9CA3AF;
46
+ --crm-text-inverse: #FFFFFF;
47
+
48
+ /* Spacing */
49
+ --crm-space-xs: 0.25rem; /* 4px */
50
+ --crm-space-sm: 0.5rem; /* 8px */
51
+ --crm-space-md: 1rem; /* 16px */
52
+ --crm-space-lg: 1.5rem; /* 24px */
53
+ --crm-space-xl: 2rem; /* 32px */
54
+ --crm-space-2xl: 3rem; /* 48px */
55
+
56
+ /* Border Radius */
57
+ --crm-radius-sm: 0.375rem; /* 6px */
58
+ --crm-radius-md: 0.5rem; /* 8px */
59
+ --crm-radius-lg: 0.75rem; /* 12px */
60
+ --crm-radius-xl: 1rem; /* 16px */
61
+
62
+ /* Shadows */
63
+ --crm-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
64
+ --crm-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
65
+ --crm-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
66
+ --crm-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
67
+
68
+ /* Typography */
69
+ --crm-font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
70
+ --crm-font-mono: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;
71
+
72
+ /* Font Sizes */
73
+ --crm-text-xs: 0.75rem; /* 12px */
74
+ --crm-text-sm: 0.875rem; /* 14px */
75
+ --crm-text-base: 1rem; /* 16px */
76
+ --crm-text-lg: 1.125rem; /* 18px */
77
+ --crm-text-xl: 1.25rem; /* 20px */
78
+ --crm-text-2xl: 1.5rem; /* 24px */
79
+ --crm-text-3xl: 1.875rem; /* 30px */
80
+
81
+ /* Font Weights */
82
+ --crm-font-normal: 400;
83
+ --crm-font-medium: 500;
84
+ --crm-font-semibold: 600;
85
+ --crm-font-bold: 700;
86
+
87
+ /* Transitions */
88
+ --crm-transition-fast: 150ms ease-in-out;
89
+ --crm-transition-base: 200ms ease-in-out;
90
+ --crm-transition-slow: 300ms ease-in-out;
91
+
92
+ /* Z-index layers */
93
+ --crm-z-dropdown: 1000;
94
+ --crm-z-modal: 1050;
95
+ --crm-z-tooltip: 1100;
96
+ --crm-z-notification: 1150;
97
+ }
98
+
99
+ /* Dark mode support (optional for future) */
100
+ @media (prefers-color-scheme: dark) {
101
+ :root {
102
+ --crm-bg-primary: #111827;
103
+ --crm-bg-secondary: #1F2937;
104
+ --crm-bg-tertiary: #374151;
105
+ --crm-border: #4B5563;
106
+ --crm-border-light: #374151;
107
+ --crm-text-primary: #F9FAFB;
108
+ --crm-text-secondary: #D1D5DB;
109
+ --crm-text-tertiary: #9CA3AF;
110
+ }
111
+ }