thatcher 1.0.4

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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +398 -0
  3. package/package.json +73 -0
  4. package/src/adapters/google-auth.js +148 -0
  5. package/src/adapters/google-drive.js +209 -0
  6. package/src/app/api/[entity]/[[...path]]/route.js +33 -0
  7. package/src/app/api/audit/dashboard/route.js +77 -0
  8. package/src/app/api/audit/logs/route.js +46 -0
  9. package/src/app/api/audit/permissions/[id]/route.js +37 -0
  10. package/src/app/api/audit/permissions/route.js +93 -0
  11. package/src/app/api/audit/permissions/stats/route.js +29 -0
  12. package/src/app/api/audit/route.js +79 -0
  13. package/src/app/api/audit/stats/route.js +18 -0
  14. package/src/app/api/auth/google/callback/route.js +94 -0
  15. package/src/app/api/auth/google/route.js +58 -0
  16. package/src/app/api/auth/login/route.js +121 -0
  17. package/src/app/api/auth/logout/route.js +52 -0
  18. package/src/app/api/auth/me/route.js +16 -0
  19. package/src/app/api/auth/mwr-bridge/route.js +77 -0
  20. package/src/app/api/auth/password-reset/route.js +65 -0
  21. package/src/app/api/cron/trigger/route.js +58 -0
  22. package/src/app/api/csrf-token/route.js +8 -0
  23. package/src/app/api/debug/config/route.js +22 -0
  24. package/src/app/api/debug/hooks/route.js +16 -0
  25. package/src/app/api/debug/plugins/route.js +20 -0
  26. package/src/app/api/debug/sqlite/route.js +21 -0
  27. package/src/app/api/debug/sync/route.js +29 -0
  28. package/src/app/api/debug/workflow/route.js +20 -0
  29. package/src/app/api/domains/[domain]/route.js +26 -0
  30. package/src/app/api/domains/route.js +21 -0
  31. package/src/app/api/email/allocate/batch/route.js +106 -0
  32. package/src/app/api/email/allocate/route.js +141 -0
  33. package/src/app/api/email/receive/route.js +158 -0
  34. package/src/app/api/email/route.js +3 -0
  35. package/src/app/api/email/send/route.js +77 -0
  36. package/src/app/api/email/unallocated/route.js +47 -0
  37. package/src/app/api/files/[id]/route.js +38 -0
  38. package/src/app/api/health/route.js +95 -0
  39. package/src/app/api/metrics/route.js +73 -0
  40. package/src/app/api/monitoring/dashboard/route.js +18 -0
  41. package/src/cli.js +243 -0
  42. package/src/config/config-loader.js +112 -0
  43. package/src/config/constants.js +127 -0
  44. package/src/config/env.js +164 -0
  45. package/src/config/spec-helpers.js +232 -0
  46. package/src/engine.server.js +212 -0
  47. package/src/index.js +368 -0
  48. package/src/lib/accessibility.js +162 -0
  49. package/src/lib/action-factory.js +34 -0
  50. package/src/lib/action-utils.js +21 -0
  51. package/src/lib/alert-manager.js +189 -0
  52. package/src/lib/api-error-wrapper.js +125 -0
  53. package/src/lib/api-helpers.js +53 -0
  54. package/src/lib/api.js +82 -0
  55. package/src/lib/audit-logger-enhanced.js +117 -0
  56. package/src/lib/audit-logger.js +193 -0
  57. package/src/lib/auth-middleware.js +102 -0
  58. package/src/lib/auth-route-helpers.js +83 -0
  59. package/src/lib/business-rules-engine.js +86 -0
  60. package/src/lib/compression.js +44 -0
  61. package/src/lib/config-field-helpers.js +91 -0
  62. package/src/lib/config-generator-engine.js +445 -0
  63. package/src/lib/config-helpers.js +120 -0
  64. package/src/lib/connection-guard.js +79 -0
  65. package/src/lib/crud-action-helpers.js +34 -0
  66. package/src/lib/crud-factory.js +83 -0
  67. package/src/lib/crud-handlers.js +244 -0
  68. package/src/lib/csrf-protection.js +63 -0
  69. package/src/lib/database-core.js +258 -0
  70. package/src/lib/database-migrations.js +96 -0
  71. package/src/lib/date-utils.js +159 -0
  72. package/src/lib/db-backup.js +97 -0
  73. package/src/lib/db-monitor.js +127 -0
  74. package/src/lib/domain-loader.js +82 -0
  75. package/src/lib/email-sender.js +100 -0
  76. package/src/lib/error-boundary.js +134 -0
  77. package/src/lib/error-handler.js +84 -0
  78. package/src/lib/error-recovery.js +190 -0
  79. package/src/lib/error-resilience.js +130 -0
  80. package/src/lib/errors.js +69 -0
  81. package/src/lib/events-engine.js +182 -0
  82. package/src/lib/field-iterator.js +50 -0
  83. package/src/lib/field-registry.js +68 -0
  84. package/src/lib/field-types.js +154 -0
  85. package/src/lib/generic-crud-handler.js +32 -0
  86. package/src/lib/health-monitor.js +134 -0
  87. package/src/lib/hook-engine.js +169 -0
  88. package/src/lib/hot-reload/cache-invalidator.js +115 -0
  89. package/src/lib/hot-reload/checkpoint.js +95 -0
  90. package/src/lib/hot-reload/debug-exposure.js +67 -0
  91. package/src/lib/hot-reload/directory-watcher.js +96 -0
  92. package/src/lib/hot-reload/index.js +50 -0
  93. package/src/lib/hot-reload/mutex.js +75 -0
  94. package/src/lib/hot-reload/promise-container.js +66 -0
  95. package/src/lib/hot-reload/route-wrapper.js +46 -0
  96. package/src/lib/hot-reload/safe-error.js +51 -0
  97. package/src/lib/hot-reload/supervisor.js +161 -0
  98. package/src/lib/hot-reload/timeout-wrapper.js +52 -0
  99. package/src/lib/http-methods-factory.js +25 -0
  100. package/src/lib/index-optimizer.js +96 -0
  101. package/src/lib/index.js +35 -0
  102. package/src/lib/list-data-transform.js +39 -0
  103. package/src/lib/log-aggregator.js +116 -0
  104. package/src/lib/logger.js +55 -0
  105. package/src/lib/metrics-collector.js +102 -0
  106. package/src/lib/minifier.js +19 -0
  107. package/src/lib/monitoring-init.js +67 -0
  108. package/src/lib/next-compat.js +80 -0
  109. package/src/lib/next-polyfills.js +135 -0
  110. package/src/lib/perf-monitor.js +91 -0
  111. package/src/lib/progress-components.js +181 -0
  112. package/src/lib/query-cache.js +126 -0
  113. package/src/lib/query-engine-write.js +221 -0
  114. package/src/lib/query-engine.js +399 -0
  115. package/src/lib/query-perf.js +117 -0
  116. package/src/lib/query-string-adapter.js +75 -0
  117. package/src/lib/realtime-server.js +67 -0
  118. package/src/lib/render-cache.js +61 -0
  119. package/src/lib/request-tracker.js +43 -0
  120. package/src/lib/resource-hints.js +29 -0
  121. package/src/lib/resource-monitor.js +117 -0
  122. package/src/lib/response-formatter.js +80 -0
  123. package/src/lib/route-helpers.js +33 -0
  124. package/src/lib/route-resolver.js +142 -0
  125. package/src/lib/safe-json.js +8 -0
  126. package/src/lib/server-bootstrap.js +71 -0
  127. package/src/lib/stage-pipeline.js +153 -0
  128. package/src/lib/state-protocol.js +171 -0
  129. package/src/lib/state-transport-client.js +169 -0
  130. package/src/lib/state-transport-reconnect.js +121 -0
  131. package/src/lib/state-transport-server.js +181 -0
  132. package/src/lib/static-server.js +97 -0
  133. package/src/lib/status-helpers.js +98 -0
  134. package/src/lib/universal-handler.js +7 -0
  135. package/src/lib/utils.js +93 -0
  136. package/src/lib/validate.js +197 -0
  137. package/src/lib/validation/business-validators.js +61 -0
  138. package/src/lib/validation/csrf.js +51 -0
  139. package/src/lib/validation/file-validators.js +34 -0
  140. package/src/lib/validation/format-validators.js +106 -0
  141. package/src/lib/validation/index.js +19 -0
  142. package/src/lib/validation/rate-limit.js +31 -0
  143. package/src/lib/validation/security-validators.js +78 -0
  144. package/src/lib/validation-middleware.js +133 -0
  145. package/src/lib/validators.js +105 -0
  146. package/src/lib/with-audit-logging.js +63 -0
  147. package/src/lib/with-error-handler.js +31 -0
  148. package/src/lib/workflow-engine.js +250 -0
  149. package/src/server/server.js +305 -0
  150. package/src/services/collaborator-role.service.js +205 -0
  151. package/src/services/email-sender.js +105 -0
  152. package/src/services/notification-engine.js +110 -0
  153. package/src/services/permission.service.js +181 -0
  154. package/src/ui/advanced-search-renderer.js +42 -0
  155. package/src/ui/advanced-widgets.js +47 -0
  156. package/src/ui/auth-pages.js +114 -0
  157. package/src/ui/auth-styles.js +53 -0
  158. package/src/ui/client.js +99 -0
  159. package/src/ui/collaboration-dialogs.js +31 -0
  160. package/src/ui/common-handlers.js +156 -0
  161. package/src/ui/component-engine.js +103 -0
  162. package/src/ui/dashboard-renderer.js +150 -0
  163. package/src/ui/dialog-engine.js +147 -0
  164. package/src/ui/dialog-factory.js +38 -0
  165. package/src/ui/engagement-cards.js +76 -0
  166. package/src/ui/engagement-dialogs.js +100 -0
  167. package/src/ui/engagement-grid-renderer.js +109 -0
  168. package/src/ui/entity-renderer.js +176 -0
  169. package/src/ui/event-delegation.js +108 -0
  170. package/src/ui/fetch-json.js +24 -0
  171. package/src/ui/file-dialogs.js +81 -0
  172. package/src/ui/flexup-report-renderer.js +173 -0
  173. package/src/ui/format-helpers.js +102 -0
  174. package/src/ui/global-tags.js +144 -0
  175. package/src/ui/highlight-threading-renderer.js +176 -0
  176. package/src/ui/idle-logout.js +156 -0
  177. package/src/ui/job-management-renderer.js +61 -0
  178. package/src/ui/layout.js +219 -0
  179. package/src/ui/letter-dialogs.js +37 -0
  180. package/src/ui/ml-console-renderer.js +108 -0
  181. package/src/ui/monitoring-dashboard-client.js +136 -0
  182. package/src/ui/monitoring-dashboard.js +134 -0
  183. package/src/ui/notifications-renderer.js +51 -0
  184. package/src/ui/page-handler-admin.js +121 -0
  185. package/src/ui/page-handler-helpers.js +111 -0
  186. package/src/ui/page-handler-reviews.js +165 -0
  187. package/src/ui/page-handler-rfi.js +42 -0
  188. package/src/ui/page-handler.js +210 -0
  189. package/src/ui/password-reset-page.js +146 -0
  190. package/src/ui/perf-helpers.js +96 -0
  191. package/src/ui/perf-renderer.js +71 -0
  192. package/src/ui/permissions-ui.js +163 -0
  193. package/src/ui/picker-dialogs.js +100 -0
  194. package/src/ui/render-helpers.js +124 -0
  195. package/src/ui/renderer.js +35 -0
  196. package/src/ui/review-comparison-renderer.js +58 -0
  197. package/src/ui/review-detail-panels.js +71 -0
  198. package/src/ui/review-detail-renderer.js +170 -0
  199. package/src/ui/review-detail-script.js +95 -0
  200. package/src/ui/review-mwr-renderer.js +113 -0
  201. package/src/ui/review-renderer.js +202 -0
  202. package/src/ui/review-widgets.js +88 -0
  203. package/src/ui/review-zone-nav.js +12 -0
  204. package/src/ui/rfi-detail-renderer.js +191 -0
  205. package/src/ui/rfi-renderer.js +194 -0
  206. package/src/ui/rfi-report-renderer.js +56 -0
  207. package/src/ui/rippleui.css +1 -0
  208. package/src/ui/settings-renderer-advanced.js +195 -0
  209. package/src/ui/settings-renderer-advanced2.js +158 -0
  210. package/src/ui/settings-renderer-teams.js +112 -0
  211. package/src/ui/settings-renderer.js +166 -0
  212. package/src/ui/spacing-system.js +155 -0
  213. package/src/ui/standalone-login.js +109 -0
  214. package/src/ui/styles.css +2530 -0
  215. package/src/ui/styles2.css +1602 -0
  216. package/src/ui/test-page.js +23 -0
  217. package/src/ui/validation-rules.js +73 -0
  218. package/src/ui/validation-ui.js +147 -0
  219. package/src/ui/virtual-scroll.js +107 -0
  220. package/src/ui/webjsx.js +61 -0
  221. package/src/ui/widgets.js +152 -0
@@ -0,0 +1,2530 @@
1
+ :root {
2
+ --primary: #2563eb;
3
+ --primary-hover: #1d4ed8;
4
+ --base-content: #1a1a1a;
5
+ --base-100: #ffffff;
6
+ --base-200: #f9fafb;
7
+ --base-300: #f3f4f6;
8
+ --success: #10b981;
9
+ --warning: #f59e0b;
10
+ --error: #ef4444;
11
+ --info: #3b82f6;
12
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
13
+ --shadow-md: 0 4px 6px rgba(0,0,0,0.07);
14
+ --shadow-lg: 0 10px 15px rgba(0,0,0,0.1);
15
+ }
16
+
17
+ * { box-sizing: border-box; }
18
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #f8fafc; min-height: 100vh; color: var(--base-content); }
19
+
20
+ /* Dark mode support */
21
+ @media (prefers-color-scheme: dark) {
22
+ :root {
23
+ --primary: #60a5fa;
24
+ --primary-hover: #3b82f6;
25
+ --base-content: #f5f5f5;
26
+ --base-100: #1a1a1a;
27
+ --base-200: #2d2d2d;
28
+ --base-300: #3d3d3d;
29
+ --success: #34d399;
30
+ --warning: #fbbf24;
31
+ --error: #f87171;
32
+ --info: #60a5fa;
33
+ }
34
+ body { background: #0f172a; color: #f5f5f5; }
35
+ input, select, textarea { background: #1a1a1a; color: #f5f5f5; border-color: #3d3d3d; }
36
+ .btn-ghost { color: #f5f5f5; }
37
+ .btn-ghost:hover { background: rgba(255,255,255,0.1); }
38
+ }
39
+
40
+ /* Z-index scale: organized stacking context */
41
+ :root {
42
+ --z-dropdown: 10;
43
+ --z-sticky: 20;
44
+ --z-fixed: 30;
45
+ --z-modal-backdrop: 90;
46
+ --z-modal: 100;
47
+ --z-tooltip: 110;
48
+ --z-notification: 120;
49
+ --z-topmost: 1000;
50
+ /* Spacing scale */
51
+ --space-xs: 0.25rem; /* 4px */
52
+ --space-sm: 0.5rem; /* 8px */
53
+ --space-md: 0.75rem; /* 12px */
54
+ --space-lg: 1rem; /* 16px */
55
+ --space-xl: 1.5rem; /* 24px */
56
+ --space-2xl: 2rem; /* 32px */
57
+ }
58
+
59
+ /* Layout */
60
+ .center-screen { display: flex; align-items: center; justify-content: center; min-height: 100vh; }
61
+ .container { max-width: 1200px; margin: 0 auto; }
62
+ .container-lg { max-width: 1400px; margin: 0 auto; }
63
+
64
+ /* Buttons */
65
+ .btn {
66
+ display: inline-flex;
67
+ align-items: center;
68
+ gap: 0.5rem;
69
+ border: none;
70
+ border-radius: 0.5rem;
71
+ font-weight: 500;
72
+ cursor: pointer;
73
+ transition: all 0.2s;
74
+ text-decoration: none;
75
+ }
76
+ .btn-primary { background-color: var(--primary); color: white; transition: all 0.2s ease; }
77
+ .btn-primary:hover { background-color: var(--primary-hover); transform: translateY(-1px); box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
78
+ .btn-primary:active { transform: translateY(0); }
79
+ .btn-error { background-color: var(--error); color: white; transition: all 0.2s ease; }
80
+ .btn-error:hover { background-color: #dc2626; transform: translateY(-1px); box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
81
+ .btn-error:active { transform: translateY(0); }
82
+ .btn-success { background-color: var(--success); color: white; transition: all 0.2s ease; }
83
+ .btn-success:hover { background-color: #059669; transform: translateY(-1px); box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
84
+ .btn-success:active { transform: translateY(0); }
85
+ .btn-warning { background-color: var(--warning); color: white; transition: all 0.2s ease; }
86
+ .btn-warning:hover { background-color: #d97706; transform: translateY(-1px); box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
87
+ .btn-warning:active { transform: translateY(0); }
88
+ .btn-info { background-color: var(--info); color: white; transition: all 0.2s ease; }
89
+ .btn-info:hover { background-color: #1d4ed8; transform: translateY(-1px); box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
90
+ .btn-info:active { transform: translateY(0); }
91
+ .btn-outline { border: 1px solid currentColor; background: transparent; transition: all 0.2s ease; }
92
+ .btn-outline:hover { background: rgba(0,0,0,0.05); }
93
+ .btn-ghost { background: transparent; color: var(--base-content); transition: all 0.2s ease; }
94
+ .btn-ghost:hover { background: rgba(0,0,0,0.05); }
95
+ @media (prefers-color-scheme: dark) {
96
+ .btn-outline:hover { background: rgba(255,255,255,0.08); }
97
+ }
98
+ .btn-ghost:active { opacity: 0.8; }
99
+ .btn-xs { padding: 0.25rem 0.5rem; font-size: 0.75rem; min-height: 24px; }
100
+ .btn-sm { padding: 0.5rem 1rem; font-size: 1rem; min-height: 36px; }
101
+ .btn-md { padding: 0.75rem 1.5rem; font-size: 1rem; min-height: 40px; }
102
+ .btn-lg { padding: 0.75rem 1.5rem; font-size: 1rem; min-height: 44px; }
103
+ .btn-block { width: 100%; }
104
+ /* Ensure minimum touch targets on mobile */
105
+ @media (hover: none) and (pointer: coarse) {
106
+ .btn { min-height: 44px; min-width: 44px; }
107
+ }
108
+
109
+ /* Forms */
110
+ .form-group { display: flex; flex-direction: column; gap: 0.25rem; }
111
+ .form-label { font-weight: 600; font-size: 1rem; color: var(--base-content); display: block; }
112
+ .form-input,
113
+ .form-textarea,
114
+ input[type="text"],
115
+ input[type="email"],
116
+ input[type="password"],
117
+ input[type="number"],
118
+ input[type="date"],
119
+ input[type="search"],
120
+ select,
121
+ textarea {
122
+ width: 100%;
123
+ padding: 0.75rem 1rem;
124
+ border: 1px solid #d1d5db;
125
+ border-radius: 0.5rem;
126
+ font-size: 1rem;
127
+ outline: none;
128
+ transition: border-color 0.15s, box-shadow 0.15s;
129
+ background: var(--base-100);
130
+ color: var(--base-content);
131
+ }
132
+ input:focus,
133
+ input:focus-visible,
134
+ select:focus,
135
+ textarea:focus,
136
+ textarea:focus-visible,
137
+ .form-input:focus,
138
+ .form-textarea:focus {
139
+ border-color: var(--primary);
140
+ box-shadow: 0 0 0 3px rgba(37,99,235,0.1);
141
+ outline: 2px solid var(--primary);
142
+ outline-offset: 2px;
143
+ }
144
+ /* Accessibility: Visible focus indicator for all interactive elements */
145
+ button:focus-visible,
146
+ a:focus-visible,
147
+ [role="button"]:focus-visible,
148
+ [tabindex]:focus-visible {
149
+ outline: 2px solid var(--primary);
150
+ outline-offset: 2px;
151
+ }
152
+ input:disabled,
153
+ select:disabled,
154
+ textarea:disabled {
155
+ background: #f9fafb;
156
+ color: #9ca3af;
157
+ cursor: not-allowed;
158
+ opacity: 0.6;
159
+ }
160
+ input[readonly],
161
+ select[readonly],
162
+ textarea[readonly] {
163
+ background: #f9fafb;
164
+ color: #6b7280;
165
+ cursor: default;
166
+ }
167
+ /* Input states */
168
+ .input-error, .form-input.error, input.error {
169
+ border-color: var(--error) !important;
170
+ background-color: rgba(239,68,68,0.02);
171
+ }
172
+ .input-error:focus, .form-input.error:focus, input.error:focus {
173
+ box-shadow: 0 0 0 3px rgba(239,68,68,0.1) !important;
174
+ }
175
+ .input-success, .form-input.success, input.success {
176
+ border-color: var(--success) !important;
177
+ background-color: rgba(16,185,129,0.02);
178
+ }
179
+ .input-success:focus, .form-input.success:focus, input.success:focus {
180
+ box-shadow: 0 0 0 3px rgba(16,185,129,0.1) !important;
181
+ }
182
+ .input-bordered { border: 1px solid #d1d5db; }
183
+ .input-sm { padding: 0.5rem 0.5rem; font-size: 0.75rem; }
184
+ .select-bordered { border: 1px solid #d1d5db; }
185
+ .select-sm { padding: 0.5rem 0.5rem; font-size: 0.75rem; }
186
+ .textarea-bordered { border: 1px solid #d1d5db; }
187
+ .file-input-bordered { border: 1px solid #d1d5db; }
188
+ .checkbox-sm { width: 1rem; height: 1rem; }
189
+ .checkbox-primary { accent-color: var(--primary); }
190
+
191
+ /* Cards */
192
+ .card {
193
+ background: var(--base-100);
194
+ border: 1px solid #e5e7eb;
195
+ border-radius: 0.5rem;
196
+ box-shadow: var(--shadow-sm);
197
+ overflow: hidden;
198
+ }
199
+ .card-clean { background: var(--base-100); border-radius: 0.5rem; box-shadow: var(--shadow-md); }
200
+ .card-clean-body { padding: 1.5rem; }
201
+ .card-body { padding: 1.5rem; }
202
+ .card-header { padding: 1.5rem 1.5rem 1rem; border-bottom: 1px solid #e5e7eb; }
203
+ .card-footer { padding: 1rem 1.5rem; border-top: 1px solid #e5e7eb; }
204
+ .card-title { font-size: 1.125rem; font-weight: 600; margin: 0; }
205
+ .card-subtitle { font-size: 1rem; color: #6b7280; margin: 0; }
206
+
207
+ /* Tables */
208
+ .table-container { overflow-x: auto; }
209
+ table {
210
+ width: 100%;
211
+ border-collapse: collapse;
212
+ background: var(--base-100);
213
+ }
214
+ th, td { padding: 0.75rem 1rem; text-align: left; }
215
+ th { background: var(--base-200); font-weight: 600; font-size: 1rem; color: #6b7280; }
216
+ tbody tr:hover { background: var(--base-300); }
217
+ td { border-bottom: 1px solid #e5e7eb; }
218
+ tr:last-child td { border-bottom: none; }
219
+ .table-hover tbody tr { cursor: pointer; transition: background 0.15s; }
220
+ .table-hover tbody tr:hover { background: #f3f4f6; }
221
+
222
+ /* Grid System */
223
+ .grid { display: grid; }
224
+ .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
225
+ .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
226
+ .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
227
+ .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
228
+ .gap-1 { gap: 0.25rem; }
229
+ .gap-2 { gap: 0.5rem; }
230
+ .gap-3 { gap: 0.75rem; }
231
+ .gap-4 { gap: 1rem; }
232
+ .gap-6 { gap: 1.5rem; }
233
+ .gap-8 { gap: 2rem; }
234
+
235
+ /* Flexbox */
236
+ .flex { display: flex; }
237
+ .flex-col { flex-direction: column; }
238
+ .flex-wrap { flex-wrap: wrap; }
239
+ .flex-1 { flex: 1; }
240
+ .items-start { align-items: flex-start; }
241
+ .items-center { align-items: center; }
242
+ .items-end { align-items: flex-end; }
243
+ .justify-start { justify-content: flex-start; }
244
+ .justify-center { justify-content: center; }
245
+ .justify-between { justify-content: space-between; }
246
+ .justify-end { justify-content: flex-end; }
247
+
248
+ /* Spacing - Margin */
249
+ .m-0 { margin: 0; }
250
+ .m-1 { margin: 0.25rem; }
251
+ .m-2 { margin: 0.5rem; }
252
+ .m-4 { margin: 1rem; }
253
+ .mb-1 { margin-bottom: 0.25rem; }
254
+ .mb-2 { margin-bottom: 0.5rem; }
255
+ .mb-3 { margin-bottom: 0.75rem; }
256
+ .mb-4 { margin-bottom: 1rem; }
257
+ .mb-5 { margin-bottom: 1.25rem; }
258
+ .mb-6 { margin-bottom: 1.5rem; }
259
+ .mb-8 { margin-bottom: 2rem; }
260
+ .mt-1 { margin-top: 0.25rem; }
261
+ .mt-2 { margin-top: 0.5rem; }
262
+ .mt-3 { margin-top: 0.75rem; }
263
+ .mt-4 { margin-top: 1rem; }
264
+ .mt-6 { margin-top: 1.5rem; }
265
+ .ml-1 { margin-left: 0.25rem; }
266
+ .ml-2 { margin-left: 0.5rem; }
267
+ .ml-4 { margin-left: 1rem; }
268
+ .ml-6 { margin-left: 1.5rem; }
269
+ .mr-1 { margin-right: 0.25rem; }
270
+ .mr-2 { margin-right: 0.5rem; }
271
+ .mr-4 { margin-right: 1rem; }
272
+ .mx-auto { margin-left: auto; margin-right: auto; }
273
+
274
+ /* Spacing - Padding */
275
+ .p-1 { padding: 0.25rem; }
276
+ .p-2 { padding: 0.5rem; }
277
+ .p-3 { padding: 0.75rem; }
278
+ .p-4 { padding: 1rem; }
279
+ .p-6 { padding: 1.5rem; }
280
+ .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }
281
+ .px-4 { padding-left: 1rem; padding-right: 1rem; }
282
+ .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
283
+ .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
284
+ .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }
285
+ .py-4 { padding-top: 1rem; padding-bottom: 1rem; }
286
+ .py-8 { padding-top: 2rem; padding-bottom: 2rem; }
287
+ .py-12 { padding-top: 3rem; padding-bottom: 3rem; }
288
+ .pt-2 { padding-top: 0.5rem; }
289
+ .pt-4 { padding-top: 1rem; }
290
+
291
+ /* Width and Height */
292
+ .w-full { width: 100%; }
293
+ .w-auto { width: auto; }
294
+ .w-1 { width: 0.25rem; }
295
+ .w-2 { width: 0.5rem; }
296
+ .w-4 { width: 1rem; }
297
+ .w-6 { width: 1.5rem; }
298
+ .w-8 { width: 2rem; }
299
+ .w-10 { width: 2.5rem; }
300
+ .w-12 { width: 3rem; }
301
+ .w-52 { width: 13rem; }
302
+ .w-96 { max-width: 24rem; width: 100%; }
303
+ .h-auto { height: auto; }
304
+ .h-8 { height: 2rem; }
305
+ .h-10 { height: 2.5rem; }
306
+ .h-12 { height: 3rem; }
307
+ .max-w-sm { max-width: 24rem; }
308
+ .max-w-md { max-width: 28rem; }
309
+ .max-w-lg { max-width: 32rem; }
310
+ .max-w-2xl { max-width: 42rem; }
311
+ .max-w-4xl { max-width: 56rem; }
312
+ .min-h-screen { min-height: 100vh; }
313
+ .min-h-32 { min-height: 8rem; }
314
+ .min-w-48 { min-width: 12rem; }
315
+
316
+ /* Typography */
317
+ .text-xs { font-size: 0.75rem; }
318
+ .text-sm { font-size: 1rem; }
319
+ .text-base { font-size: 1rem; }
320
+ .text-lg { font-size: 1.125rem; }
321
+ .text-xl { font-size: 1.25rem; }
322
+ .text-2xl { font-size: 1.5rem; }
323
+ .text-3xl { font-size: 1.875rem; }
324
+ .text-center { text-align: center; }
325
+ .text-left { text-align: left; }
326
+ .text-right { text-align: right; }
327
+ .font-normal { font-weight: 400; }
328
+ .font-medium { font-weight: 500; }
329
+ .font-semibold { font-weight: 600; }
330
+ .font-bold { font-weight: 700; }
331
+ .uppercase { text-transform: uppercase; }
332
+ .lowercase { text-transform: lowercase; }
333
+ .capitalize { text-transform: capitalize; }
334
+
335
+ /* Colors - Text */
336
+ .text-white { color: white; }
337
+ .text-gray-400 { color: #9ca3af; }
338
+ .text-gray-500 { color: #6b7280; }
339
+ .text-gray-600 { color: #4b5563; }
340
+ .text-gray-700 { color: #374151; }
341
+ .text-base-content { color: var(--base-content); }
342
+ .text-base-content\/40 { color: rgba(26, 26, 26, 0.4); }
343
+ .text-base-content\/50 { color: rgba(26, 26, 26, 0.5); }
344
+ .text-base-content\/60 { color: rgba(26, 26, 26, 0.6); }
345
+ .text-green-600 { color: #16a34a; }
346
+ .text-red-500 { color: #ef4444; }
347
+
348
+ /* Colors - Background */
349
+ .bg-white { background-color: white; }
350
+ .bg-primary { background-color: var(--primary); }
351
+ .bg-base-100 { background-color: var(--base-100); }
352
+ .bg-base-200 { background-color: var(--base-200); }
353
+ .bg-gray-50 { background-color: #f9fafb; }
354
+ .bg-gray-100 { background-color: #f3f4f6; }
355
+ .bg-green-50 { background-color: #f0fdf4; }
356
+ .bg-red-50 { background-color: #fef2f2; }
357
+ .bg-blue-50 { background-color: #eff6ff; }
358
+ .bg-primary\/10 { background-color: rgba(37, 99, 235, 0.1); }
359
+
360
+ /* Colors - Border */
361
+ .border-base-200 { border-color: #e5e7eb; }
362
+ .border-gray-100 { border-color: #f3f4f6; }
363
+ .border-gray-200 { border-color: #e5e7eb; }
364
+ .border-gray-300 { border-color: #d1d5db; }
365
+ .border-b { border-bottom: 1px solid #e5e7eb; }
366
+ .border-t { border-top: 1px solid #e5e7eb; }
367
+ .border-l { border-left: 1px solid #e5e7eb; }
368
+ .border-l-4 { border-left: 4px solid; }
369
+
370
+ /* Badges */
371
+ .badge {
372
+ display: inline-block;
373
+ padding: 0.5rem 1rem;
374
+ border-radius: 9999px;
375
+ font-size: 0.75rem;
376
+ font-weight: 600;
377
+ }
378
+ .badge-primary { background: rgba(37, 99, 235, 0.1); color: #2563eb; }
379
+ .badge-success { background: rgba(16, 185, 129, 0.1); color: #10b981; }
380
+ .badge-error { background: rgba(239, 68, 68, 0.1); color: #ef4444; }
381
+ .badge-warning { background: rgba(245, 158, 11, 0.1); color: #f59e0b; }
382
+ .badge-secondary { background: #f3f4f6; color: #6b7280; }
383
+ .badge-flat-primary { background: #dbeafe; color: #1e40af; }
384
+ .badge-flat-success { background: #dcfce7; color: #166534; }
385
+ .badge-flat-error { background: #fee2e2; color: #991b1b; }
386
+ .badge-flat-secondary { background: #f3f4f6; color: #475569; }
387
+ .badge-flat-warning { background: #fef3c7; color: #92400e; }
388
+ .badge-stage { display: inline-block; padding: 0.5rem 1rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 500; }
389
+ .badge-status { display: inline-block; padding: 0.5rem 1rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 500; }
390
+
391
+ /* Pills */
392
+ .pill {
393
+ display: inline-flex;
394
+ align-items: center;
395
+ padding: 0.5rem 1rem;
396
+ border-radius: 9999px;
397
+ font-size: 1rem;
398
+ font-weight: 500;
399
+ gap: 0.5rem;
400
+ }
401
+ .pill-primary { background: #dbeafe; color: #1d4ed8; }
402
+ .pill-success { background: #dcfce7; color: #166534; }
403
+ .pill-danger { background: #fee2e2; color: #991b1b; }
404
+ .pill-warning { background: #fef3c7; color: #92400e; }
405
+ .pill-neutral { background: #f1f5f9; color: #475569; }
406
+ .pill-info { background: #dbeafe; color: #1d4ed8; }
407
+
408
+ /* Shadows */
409
+ .shadow { box-shadow: var(--shadow-sm); }
410
+ .shadow-sm { box-shadow: var(--shadow-sm); }
411
+ .shadow-md { box-shadow: var(--shadow-md); }
412
+ .shadow-lg { box-shadow: var(--shadow-lg); }
413
+
414
+ /* Borders and Radius */
415
+ .rounded { border-radius: 0.25rem; }
416
+ .rounded-sm { border-radius: 0.25rem; }
417
+ .rounded-md { border-radius: 0.5rem; }
418
+ .rounded-lg { border-radius: 0.5rem; }
419
+ .rounded-full { border-radius: 9999px; }
420
+
421
+ /* Display */
422
+ .hidden { display: none; }
423
+ .block { display: block; }
424
+ .inline { display: inline; }
425
+ .inline-block { display: inline-block; }
426
+ .inline-flex { display: inline-flex; }
427
+
428
+ /* Utilities */
429
+ .cursor-pointer { cursor: pointer; }
430
+ .cursor-default { cursor: default; }
431
+ .cursor-not-allowed { cursor: not-allowed; }
432
+ .pointer-events-none { pointer-events: none; }
433
+ .opacity-50 { opacity: 0.5; }
434
+ .opacity-75 { opacity: 0.75; }
435
+ .transition { transition: all 0.2s; }
436
+ .transition-shadow { transition: box-shadow 0.2s; }
437
+
438
+ /* Hover and Interaction */
439
+ .hover\:underline:hover { text-decoration: underline; }
440
+ .hover\:bg-gray-50:hover { background-color: #f9fafb; }
441
+ .hover\:text-primary:hover { color: var(--primary); }
442
+
443
+ /* Label styles */
444
+ .label {
445
+ display: flex;
446
+ flex-direction: column;
447
+ gap: 0.25rem;
448
+ }
449
+ .label-text {
450
+ font-size: 1rem;
451
+ font-weight: 600;
452
+ color: var(--base-content);
453
+ }
454
+ .label-text-alt {
455
+ font-size: 0.75rem;
456
+ color: #6b7280;
457
+ }
458
+
459
+ /* Space Y utilities */
460
+ .space-y-1 > * + * { margin-top: 0.25rem; }
461
+ .space-y-2 > * + * { margin-top: 0.5rem; }
462
+ .space-y-3 > * + * { margin-top: 0.75rem; }
463
+ .space-y-4 > * + * { margin-top: 1rem; }
464
+ .space-y-6 > * + * { margin-top: 1.5rem; }
465
+
466
+ /* Space X utilities */
467
+ .space-x-1 > * + * { margin-left: 0.25rem; }
468
+ .space-x-2 > * + * { margin-left: 0.5rem; }
469
+ .space-x-3 > * + * { margin-left: 0.75rem; }
470
+ .space-x-4 > * + * { margin-left: 1rem; }
471
+
472
+ /* Text decoration */
473
+ .underline { text-decoration: underline; }
474
+ .no-underline { text-decoration: none; }
475
+ .line-through { text-decoration: line-through; }
476
+
477
+ /* Overflow */
478
+ .overflow-hidden { overflow: hidden; }
479
+ .overflow-x-auto { overflow-x: auto; }
480
+ .overflow-y-auto { overflow-y: auto; }
481
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
482
+
483
+ /* Whitespace */
484
+ .whitespace-nowrap { white-space: nowrap; }
485
+ .whitespace-pre-wrap { white-space: pre-wrap; }
486
+ .break-words { word-break: break-word; }
487
+
488
+ /* Aspect ratio */
489
+ .aspect-video { aspect-ratio: 16 / 9; }
490
+ .aspect-square { aspect-ratio: 1 / 1; }
491
+
492
+ /* Z-index */
493
+ .z-0 { z-index: 0; }
494
+ .z-10 { z-index: 10; }
495
+ .z-20 { z-index: 20; }
496
+ .z-30 { z-index: 30; }
497
+ .z-40 { z-index: 40; }
498
+ .z-50 { z-index: 50; }
499
+
500
+ /* Responsive Media Queries */
501
+ @media (max-width: 640px) {
502
+ .sm\:hidden { display: none; }
503
+ .sm\:block { display: block; }
504
+ .sm\:flex { display: flex; }
505
+ .sm\:grid { display: grid; }
506
+ .sm\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
507
+ .sm\:gap-2 { gap: 0.5rem; }
508
+ .sm\:gap-4 { gap: 1rem; }
509
+ }
510
+
511
+ @media (min-width: 640px) {
512
+ .sm\:flex { display: flex; }
513
+ .sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
514
+ .sm\:gap-3 { gap: 0.75rem; }
515
+ }
516
+
517
+ @media (min-width: 768px) {
518
+ .md\:flex { display: flex; }
519
+ .md\:hidden { display: none; }
520
+ .md\:grid { display: grid; }
521
+ .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
522
+ .md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
523
+ .md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
524
+ .md\:gap-2 { gap: 0.5rem; }
525
+ .md\:gap-4 { gap: 1rem; }
526
+ .md\:gap-6 { gap: 1.5rem; }
527
+ .md\:p-6 { padding: 1.5rem; }
528
+ }
529
+
530
+ @media (min-width: 1024px) {
531
+ .lg\:flex { display: flex; }
532
+ .lg\:grid { display: grid; }
533
+ .lg\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
534
+ .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
535
+ .lg\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
536
+ .lg\:gap-4 { gap: 1rem; }
537
+ .lg\:gap-6 { gap: 1.5rem; }
538
+ }
539
+ /* Navbar */
540
+ .navbar {
541
+ display: flex;
542
+ align-items: center;
543
+ justify-content: space-between;
544
+ padding: 0.5rem 1rem;
545
+ background: white;
546
+ border-bottom: 1px solid #e5e7eb;
547
+ box-shadow: var(--shadow-sm);
548
+ }
549
+ .navbar-start { display: flex; align-items: center; gap: 1rem; }
550
+ .navbar-end { display: flex; align-items: center; gap: 1rem; }
551
+ .navbar-brand { font-size: 1.25rem; font-weight: 700; color: var(--primary); text-decoration: none; }
552
+
553
+ /* Dropdown */
554
+ .dropdown {
555
+ position: relative;
556
+ display: inline-block;
557
+ }
558
+ .dropdown-end { position: relative; }
559
+ .dropdown-toggle { display: flex; align-items: center; gap: 0.5rem; background: transparent; border: none; cursor: pointer; }
560
+ .dropdown-menu {
561
+ position: absolute;
562
+ right: 0;
563
+ top: 100%;
564
+ z-index: 50;
565
+ background: white;
566
+ border-radius: 0.5rem;
567
+ box-shadow: var(--shadow-lg);
568
+ min-width: 10rem;
569
+ display: none;
570
+ border: 1px solid #e5e7eb;
571
+ overflow: hidden;
572
+ }
573
+ .dropdown.open .dropdown-menu { display: block; }
574
+ .dropdown-header {
575
+ padding: 0.5rem 1rem;
576
+ font-size: 1rem;
577
+ color: #6b7280;
578
+ border-bottom: 1px solid #e5e7eb;
579
+ font-weight: 600;
580
+ }
581
+ .dropdown-menu li { list-style: none; }
582
+ .dropdown-menu li a {
583
+ display: block;
584
+ padding: 0.75rem 1rem;
585
+ color: #374151;
586
+ text-decoration: none;
587
+ transition: background 0.15s;
588
+ }
589
+ .dropdown-menu li a:hover { background: #f9fafb; color: var(--primary); }
590
+ @media (prefers-color-scheme: dark) {
591
+ .dropdown-menu li a:hover { background: #2d2d2d; color: var(--primary); }
592
+ }
593
+ /* Required marker */
594
+ .required-marker { color: var(--error); margin-left: 2px; }
595
+
596
+ /* Button states */
597
+ .btn-loading {
598
+ opacity: 0.7;
599
+ pointer-events: none;
600
+ }
601
+ .btn-loading::after { content: '...'; }
602
+ .btn-disabled {
603
+ opacity: 0.5;
604
+ cursor: not-allowed;
605
+ pointer-events: none;
606
+ }
607
+
608
+ /* Modals and Dialogs */
609
+ .modal-overlay,
610
+ .confirm-overlay {
611
+ position: fixed;
612
+ inset: 0;
613
+ background: rgba(0,0,0,0.5);
614
+ display: flex;
615
+ align-items: center;
616
+ justify-content: center;
617
+ z-index: 100;
618
+ animation: fade-in 0.15s ease-out;
619
+ }
620
+ .modal-dialog,
621
+ .confirm-dialog,
622
+ .modal-content {
623
+ background: var(--base-100);
624
+ border-radius: 0.5rem;
625
+ padding: 1.5rem;
626
+ max-width: 500px;
627
+ width: 90%;
628
+ box-shadow: var(--shadow-lg);
629
+ max-height: 90vh;
630
+ overflow-y: auto;
631
+ animation: slide-up 0.2s ease-out;
632
+ }
633
+ .modal-confirm-dialog {
634
+ max-width: 400px;
635
+ }
636
+ .modal-form-group {
637
+ margin-bottom: 1rem;
638
+ }
639
+ .modal-form-group:last-child {
640
+ margin-bottom: 0;
641
+ }
642
+ .modal-title,
643
+ .confirm-title {
644
+ font-size: 1.25rem;
645
+ font-weight: 600;
646
+ margin-bottom: 0.5rem;
647
+ color: var(--base-content);
648
+ }
649
+ .modal-subtitle {
650
+ font-size: 1rem;
651
+ color: #6b7280;
652
+ margin-bottom: 1.5rem;
653
+ }
654
+ .confirm-message {
655
+ color: #6b7280;
656
+ margin-bottom: 1.5rem;
657
+ line-height: 1.5;
658
+ }
659
+ .modal-actions,
660
+ .confirm-actions {
661
+ display: flex;
662
+ gap: 0.75rem;
663
+ justify-content: flex-end;
664
+ padding-top: 1.5rem;
665
+ border-top: 1px solid #e5e7eb;
666
+ margin-top: 1.5rem;
667
+ }
668
+ @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
669
+ @keyframes slide-up { from { transform: translateY(1.5rem); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
670
+
671
+ /* Breadcrumb */
672
+ .breadcrumb {
673
+ display: flex;
674
+ align-items: center;
675
+ gap: 0.5rem;
676
+ font-size: 1rem;
677
+ color: #6b7280;
678
+ margin-bottom: 1rem;
679
+ }
680
+ .breadcrumb a {
681
+ color: var(--primary);
682
+ text-decoration: none;
683
+ transition: color 0.15s;
684
+ }
685
+ .breadcrumb a:hover { text-decoration: underline; }
686
+ .breadcrumb-separator { color: #9ca3af; }
687
+
688
+ /* Toast Notifications */
689
+ .toast-container {
690
+ position: fixed;
691
+ top: 1rem;
692
+ right: 1rem;
693
+ z-index: 200;
694
+ display: flex;
695
+ flex-direction: column;
696
+ gap: 0.75rem;
697
+ pointer-events: none;
698
+ }
699
+ .toast {
700
+ padding: 1rem 1.25rem;
701
+ border-radius: 0.5rem;
702
+ box-shadow: var(--shadow-lg);
703
+ animation: toast-in 0.3s ease-out;
704
+ max-width: 320px;
705
+ pointer-events: auto;
706
+ border-left: 4px solid transparent;
707
+ }
708
+ .toast-success {
709
+ background: #f0fdf4;
710
+ color: #166534;
711
+ border-left-color: var(--success);
712
+ }
713
+ .toast-error {
714
+ background: #fef2f2;
715
+ color: #991b1b;
716
+ border-left-color: var(--error);
717
+ }
718
+ .toast-info {
719
+ background: #eff6ff;
720
+ color: #1e40af;
721
+ border-left-color: var(--info);
722
+ }
723
+ .toast-warning {
724
+ background: #fffbeb;
725
+ color: #92400e;
726
+ border-left-color: var(--warning);
727
+ }
728
+ @keyframes toast-in { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: translateX(0); } }
729
+
730
+ /* Tooltip */
731
+ .tooltip {
732
+ position: relative;
733
+ display: inline-block;
734
+ }
735
+ .tooltip::after {
736
+ content: attr(data-tip);
737
+ position: absolute;
738
+ bottom: 100%;
739
+ left: 50%;
740
+ transform: translateX(-50%);
741
+ padding: 0.5rem 0.75rem;
742
+ background: #1f2937;
743
+ color: white;
744
+ font-size: 0.75rem;
745
+ border-radius: 0.5rem;
746
+ white-space: nowrap;
747
+ opacity: 0;
748
+ pointer-events: none;
749
+ transition: opacity 0.2s;
750
+ margin-bottom: 0.5rem;
751
+ z-index: 10;
752
+ }
753
+ .tooltip:hover::after { opacity: 1; }
754
+
755
+ /* Access Denied */
756
+ .access-denied {
757
+ text-align: center;
758
+ padding: 4rem 2rem;
759
+ min-height: 50vh;
760
+ display: flex;
761
+ flex-direction: column;
762
+ align-items: center;
763
+ justify-content: center;
764
+ }
765
+ .access-denied-icon {
766
+ font-size: 4rem;
767
+ color: var(--error);
768
+ margin-bottom: 1rem;
769
+ line-height: 1;
770
+ }
771
+ .access-denied h1 {
772
+ font-size: 1.5rem;
773
+ font-weight: 600;
774
+ margin-bottom: 0.5rem;
775
+ }
776
+ .access-denied p {
777
+ color: #6b7280;
778
+ margin-bottom: 1.5rem;
779
+ max-width: 28rem;
780
+ line-height: 1.5;
781
+ }
782
+ /* Progress bars */
783
+ .linear-progress {
784
+ width: 100%;
785
+ border-radius: 9999px;
786
+ background: #e5e7eb;
787
+ overflow: hidden;
788
+ position: relative;
789
+ height: 0.5rem;
790
+ }
791
+ .linear-progress-bar {
792
+ height: 100%;
793
+ border-radius: 9999px;
794
+ transition: width 0.3s ease;
795
+ min-width: 0;
796
+ background: var(--primary);
797
+ }
798
+ .linear-progress-bar.success { background: var(--success); }
799
+ .linear-progress-bar.warning { background: var(--warning); }
800
+ .linear-progress-bar.error { background: var(--error); }
801
+ .linear-progress-wrap {
802
+ display: flex;
803
+ align-items: center;
804
+ gap: 0.75rem;
805
+ }
806
+ .linear-progress-wrap .progress-label {
807
+ font-size: 1rem;
808
+ color: #374151;
809
+ white-space: nowrap;
810
+ flex: 1;
811
+ }
812
+ .linear-progress-wrap .progress-pct {
813
+ font-size: 1rem;
814
+ font-weight: 600;
815
+ white-space: nowrap;
816
+ min-width: 3rem;
817
+ text-align: right;
818
+ }
819
+
820
+ /* Circular progress */
821
+ .circular-progress {
822
+ position: relative;
823
+ display: inline-flex;
824
+ align-items: center;
825
+ justify-content: center;
826
+ }
827
+ .circular-progress svg { transform: rotate(-90deg); }
828
+ .circular-progress-text {
829
+ position: absolute;
830
+ inset: 0;
831
+ display: flex;
832
+ flex-direction: column;
833
+ align-items: center;
834
+ justify-content: center;
835
+ }
836
+ .circular-progress-pct {
837
+ font-size: 1.25rem;
838
+ font-weight: 700;
839
+ color: var(--base-content);
840
+ line-height: 1;
841
+ }
842
+ .circular-progress-label {
843
+ font-size: 0.75rem;
844
+ color: #6b7280;
845
+ margin-top: 0.25rem;
846
+ }
847
+
848
+ /* Pipeline and stage pills */
849
+ .engagement-pipeline {
850
+ display: flex;
851
+ align-items: center;
852
+ gap: 0;
853
+ overflow-x: auto;
854
+ padding: 0.5rem 0;
855
+ }
856
+ .stage-pill {
857
+ padding: 0.5rem 0.75rem;
858
+ font-size: 0.75rem;
859
+ font-weight: 500;
860
+ white-space: nowrap;
861
+ border: 1px solid #e5e7eb;
862
+ position: relative;
863
+ background: white;
864
+ color: #6b7280;
865
+ }
866
+ .stage-pill:first-child { border-radius: 9999px 0 0 9999px; }
867
+ .stage-pill:last-child { border-radius: 0 9999px 9999px 0; }
868
+ .stage-pill:only-child { border-radius: 9999px; }
869
+ .stage-pill.stage-active {
870
+ font-weight: 700;
871
+ background: var(--primary);
872
+ color: white;
873
+ border-color: var(--primary);
874
+ box-shadow: 0 0 0 2px rgba(37,99,235,0.2);
875
+ z-index: 1;
876
+ }
877
+ .stage-pill.stage-completed {
878
+ opacity: 0.7;
879
+ background: #f3f4f6;
880
+ }
881
+
882
+ /* Empty state */
883
+ .empty-state {
884
+ display: flex;
885
+ flex-direction: column;
886
+ align-items: center;
887
+ justify-content: center;
888
+ padding: 3rem 1.5rem;
889
+ text-align: center;
890
+ min-height: 200px;
891
+ }
892
+ .empty-state-icon {
893
+ font-size: 3rem;
894
+ margin-bottom: 1rem;
895
+ line-height: 1;
896
+ opacity: 0.5;
897
+ }
898
+ .empty-state-title {
899
+ font-size: 1.125rem;
900
+ font-weight: 600;
901
+ color: var(--base-content);
902
+ margin-bottom: 0.5rem;
903
+ }
904
+ .empty-state-msg {
905
+ color: #6b7280;
906
+ font-size: 1rem;
907
+ margin-bottom: 1.5rem;
908
+ max-width: 24rem;
909
+ line-height: 1.5;
910
+ }
911
+
912
+ /* Sortable lists */
913
+ .sortable-list {
914
+ list-style: none;
915
+ padding: 0;
916
+ margin: 0;
917
+ }
918
+ .sortable-item {
919
+ display: flex;
920
+ align-items: center;
921
+ gap: 0.75rem;
922
+ padding: 0.75rem 1rem;
923
+ background: white;
924
+ border: 1px solid #e5e7eb;
925
+ border-radius: 0.5rem;
926
+ margin-bottom: 0.25rem;
927
+ cursor: grab;
928
+ transition: box-shadow 0.15s, background 0.15s;
929
+ }
930
+ .sortable-item:active { cursor: grabbing; }
931
+ .sortable-item:hover { background: #f9fafb; }
932
+ @media (prefers-color-scheme: dark) {
933
+ .sortable-item:hover { background: #2d2d2d; }
934
+ }
935
+ .sortable-item.drag-over {
936
+ box-shadow: 0 0 0 2px var(--primary);
937
+ background: #f0f7ff;
938
+ }
939
+ .sortable-handle {
940
+ color: #9ca3af;
941
+ font-size: 1.25rem;
942
+ -webkit-user-select: none;
943
+ user-select: none;
944
+ cursor: grab;
945
+ flex-shrink: 0;
946
+ }
947
+
948
+ /* Choice options */
949
+ .choice-group {
950
+ display: flex;
951
+ flex-direction: column;
952
+ gap: 0.5rem;
953
+ }
954
+ .choice-option {
955
+ display: flex;
956
+ align-items: center;
957
+ gap: 0.75rem;
958
+ padding: 0.75rem 1rem;
959
+ border: 1px solid #e5e7eb;
960
+ border-radius: 0.5rem;
961
+ cursor: pointer;
962
+ transition: border-color 0.15s, background 0.15s;
963
+ background: white;
964
+ }
965
+ .choice-option:hover {
966
+ border-color: var(--primary);
967
+ background: #f0f7ff;
968
+ }
969
+ @media (prefers-color-scheme: dark) {
970
+ .choice-option {
971
+ background: #1a1a1a;
972
+ border-color: #3d3d3d;
973
+ color: #f5f5f5;
974
+ }
975
+ .choice-option:hover {
976
+ background: #2d2d2d;
977
+ border-color: var(--primary);
978
+ }
979
+ .choice-label { color: #f5f5f5; }
980
+ }
981
+ .choice-option input[type="radio"],
982
+ .choice-option input[type="checkbox"] {
983
+ cursor: pointer;
984
+ accent-color: var(--primary);
985
+ }
986
+ .choice-option input:checked + .choice-label {
987
+ font-weight: 600;
988
+ color: var(--primary);
989
+ }
990
+ .choice-label {
991
+ font-size: 1rem;
992
+ color: #374151;
993
+ cursor: pointer;
994
+ }
995
+
996
+ /* Attachment cards */
997
+ .attachment-card {
998
+ display: flex;
999
+ align-items: center;
1000
+ gap: 0.75rem;
1001
+ padding: 0.75rem 1rem;
1002
+ border: 1px solid #e5e7eb;
1003
+ border-radius: 0.5rem;
1004
+ background: white;
1005
+ transition: all 0.15s;
1006
+ }
1007
+ .attachment-card:hover {
1008
+ border-color: var(--primary);
1009
+ background: #f0f7ff;
1010
+ }
1011
+ @media (prefers-color-scheme: dark) {
1012
+ .attachment-card {
1013
+ background: #1a1a1a;
1014
+ border-color: #3d3d3d;
1015
+ }
1016
+ .attachment-card:hover {
1017
+ background: #2d2d2d;
1018
+ border-color: var(--primary);
1019
+ }
1020
+ .attachment-name { color: #f5f5f5; }
1021
+ }
1022
+ .attachment-icon {
1023
+ font-size: 1.5rem;
1024
+ flex-shrink: 0;
1025
+ opacity: 0.7;
1026
+ }
1027
+ .attachment-info {
1028
+ flex: 1;
1029
+ min-width: 0;
1030
+ }
1031
+ .attachment-name {
1032
+ font-size: 1rem;
1033
+ font-weight: 500;
1034
+ color: var(--base-content);
1035
+ overflow: hidden;
1036
+ text-overflow: ellipsis;
1037
+ white-space: nowrap;
1038
+ margin-bottom: 0.25rem;
1039
+ }
1040
+ .attachment-size {
1041
+ font-size: 0.75rem;
1042
+ color: #9ca3af;
1043
+ }
1044
+ .attachment-actions {
1045
+ display: flex;
1046
+ gap: 0.5rem;
1047
+ flex-shrink: 0;
1048
+ }.attachment-size { font-size: 0.75rem; color: #6b7280; }
1049
+ .attachment-preview { max-width: 100%; max-height: 200px; border-radius: 0.5rem; margin-top: 0.5rem; }
1050
+ .user-avatar { display: inline-flex; align-items: center; justify-content: center; border-radius: 9999px; color: white; font-weight: 600; position: relative; flex-shrink: 0; line-height: 1; vertical-align: middle; -webkit-user-select: none; user-select: none; }
1051
+ .avatar-status { position: absolute; bottom: 0; right: 0; border-radius: 9999px; border: 2px solid white; }
1052
+ .avatar-status-online { background: #22c55e; }
1053
+ .avatar-status-offline { background: #9ca3af; }
1054
+ .avatar-group { display: inline-flex; align-items: center; }
1055
+ .avatar-group-item { margin-left: -8px; position: relative; }
1056
+ .avatar-group-item:first-child { margin-left: 0; }
1057
+ .avatar-group-item .user-avatar { border: 2px solid white; }
1058
+ .avatar-group-overflow { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 9999px; background: #e5e7eb; color: #374151; font-size: 0.75rem; font-weight: 600; margin-left: -8px; border: 2px solid white; position: relative; z-index: 0; }
1059
+ .status-label { display: inline-block; padding: 0.2rem 0.75rem; border-radius: 9999px; font-size: 0.7rem; font-weight: 500; white-space: nowrap; line-height: 1.4; }
1060
+ .info-bubble { display: inline-flex; align-items: center; justify-content: center; color: #9ca3af; cursor: help; position: relative; vertical-align: middle; }
1061
+ .info-bubble:hover { color: #6b7280; }
1062
+ .info-bubble::after { content: attr(data-tooltip); position: absolute; padding: 0.5rem 0.75rem; background: #1f2937; color: white; font-size: 0.75rem; border-radius: 0.5rem; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.15s; z-index: 50; max-width: 240px; white-space: normal; line-height: 1.4; }
1063
+ .info-bubble:hover::after { opacity: 1; }
1064
+ .info-bubble-top::after { bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%); }
1065
+ .info-bubble-bottom::after { top: calc(100% + 6px); left: 50%; transform: translateX(-50%); }
1066
+ .info-bubble-left::after { right: calc(100% + 6px); top: 50%; transform: translateY(-50%); }
1067
+ .info-bubble-right::after { left: calc(100% + 6px); top: 50%; transform: translateY(-50%); }
1068
+ .engagement-card { transition: box-shadow 0.15s, transform 0.15s; }
1069
+ .engagement-card:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.1); transform: translateY(-1px); }
1070
+ .engagement-card-progress { width: 100%; height: 4px; border-radius: 9999px; background: #e5e7eb; overflow: hidden; margin-top: 0.5rem; }
1071
+ .engagement-card-progress-bar { height: 100%; border-radius: 9999px; background: var(--primary); transition: width 0.3s ease; }
1072
+ .engagement-card-team { display: flex; align-items: center; }
1073
+ .mobile-card .card-body { padding: 0.75rem; }
1074
+ .mobile-card { border-radius: 0.5rem; }
1075
+ .sidebar-review-panel { position: fixed; right: 0; top: 0; bottom: 0; width: 320px; background: white; box-shadow: -2px 0 8px rgba(0,0,0,0.1); z-index: 40; display: flex; flex-direction: column; transition: transform 0.2s ease; }
1076
+ .sidebar-review-panel.sidebar-collapsed { transform: translateX(100%); }
1077
+ .sidebar-header { display: flex; align-items: center; justify-content: space-between; padding: 1rem; border-bottom: 1px solid #e5e7eb; }
1078
+ .sidebar-toggle { font-size: 1.25rem; line-height: 1; }
1079
+ .sidebar-body { padding: 1rem; overflow-y: auto; flex: 1; }
1080
+ .sidebar-section { padding: 0.75rem 0; border-bottom: 1px solid #f3f4f6; display: flex; flex-direction: column; gap: 0.25rem; }
1081
+ .sidebar-section:last-child { border-bottom: none; }
1082
+ .sidebar-meta-row { display: flex; justify-content: space-between; align-items: center; padding: 0.25rem 0; }
1083
+ @media (max-width: 768px) {
1084
+ .mobile-card { display: block; }
1085
+ .desktop-table { display: none; }
1086
+ .sidebar-review-panel { width: 100%; }
1087
+ }
1088
+ @media (min-width: 768px) {
1089
+ .mobile-card-list { display: none; }
1090
+ .desktop-table { display: block; }
1091
+ }
1092
+ .settings-grid { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 1rem; }
1093
+ @media (min-width: 768px) { .settings-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
1094
+ @media (min-width: 1024px) { .settings-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
1095
+ .settings-card { display: flex; align-items: flex-start; gap: 1rem; padding: 1.25rem; background: white; border-radius: 0.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.1); text-decoration: none; color: inherit; transition: box-shadow 0.15s, transform 0.15s; cursor: pointer; border: 1px solid #e5e7eb; }
1096
+ .settings-card:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.1); transform: translateY(-1px); border-color: var(--primary); }
1097
+ .settings-card-icon { font-size: 2rem; line-height: 1; flex-shrink: 0; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; background: #eff6ff; border-radius: 0.5rem; }
1098
+ .settings-card-body { flex: 1; min-width: 0; }
1099
+ .settings-card-title { font-size: 1rem; font-weight: 600; color: #111827; margin-bottom: 0.25rem; }
1100
+ .settings-card-desc { font-size: 0.8rem; color: #6b7280; line-height: 1.4; }
1101
+ .settings-card-count { display: inline-block; padding: 0.25rem 0.5rem; border-radius: 9999px; background: #f3f4f6; color: #374151; font-size: 0.75rem; font-weight: 500; margin-top: 0.5rem; }
1102
+ .settings-back { display: inline-flex; align-items: center; gap: 0.5rem; color: var(--primary); font-size: 1rem; text-decoration: none; margin-bottom: 1rem; }
1103
+ .settings-back:hover { text-decoration: underline; }
1104
+ .color-swatch { display: inline-block; width: 1.25rem; height: 1.25rem; border-radius: 0.25rem; border: 1px solid #d1d5db; vertical-align: middle; }
1105
+ .color-palette { display: flex; gap: 0.5rem; flex-wrap: wrap; }
1106
+ .color-palette-item { width: 2rem; height: 2rem; border-radius: 0.5rem; border: 2px solid transparent; cursor: pointer; transition: border-color 0.15s, transform 0.1s; }
1107
+ .color-palette-item:hover { transform: scale(1.1); }
1108
+ .color-palette-item.selected { border-color: #111827; box-shadow: 0 0 0 2px white, 0 0 0 4px #111827; }
1109
+ .toggle-wrap { display: flex; align-items: center; justify-content: space-between; padding: 0.75rem 0; border-bottom: 1px solid #f3f4f6; }
1110
+ .toggle-wrap:last-child { border-bottom: none; }
1111
+ .toggle-label { font-size: 1rem; color: #374151; }
1112
+ .toggle-desc { font-size: 0.75rem; color: #9ca3af; margin-top: 0.25rem; }
1113
+ .toggle-switch { position: relative; display: inline-block; width: 2.75rem; height: 1.5rem; flex-shrink: 0; }
1114
+ .toggle-switch input { opacity: 0; width: 0; height: 0; }
1115
+ .toggle-slider { position: absolute; inset: 0; background: #d1d5db; border-radius: 9999px; cursor: pointer; transition: background 0.2s; }
1116
+ .toggle-slider::before { content: ''; position: absolute; width: 1.125rem; height: 1.125rem; left: 0.1875rem; bottom: 0.1875rem; background: white; border-radius: 9999px; transition: transform 0.2s; }
1117
+ .toggle-switch input:checked + .toggle-slider { background: var(--primary); }
1118
+ .toggle-switch input:checked + .toggle-slider::before { transform: translateX(1.25rem); }
1119
+ .integration-card { display: flex; align-items: center; gap: 1rem; padding: 1.25rem; background: white; border-radius: 0.5rem; border: 1px solid #e5e7eb; }
1120
+ .integration-icon { font-size: 2rem; flex-shrink: 0; width: 3rem; text-align: center; }
1121
+ .integration-body { flex: 1; min-width: 0; }
1122
+ .integration-name { font-weight: 600; color: #111827; }
1123
+ .integration-meta { font-size: 0.75rem; color: #6b7280; margin-top: 0.25rem; }
1124
+ .integration-status { display: inline-flex; align-items: center; gap: 0.5rem; font-size: 0.75rem; font-weight: 500; }
1125
+ .integration-dot { width: 0.5rem; height: 0.5rem; border-radius: 9999px; }
1126
+ .integration-dot-on { background: #22c55e; }
1127
+ .integration-dot-off { background: #ef4444; }
1128
+ .inline-form { background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 0.5rem; padding: 1rem; margin-top: 0.75rem; }
1129
+ .inline-form-row { display: flex; gap: 0.75rem; align-items: flex-end; flex-wrap: wrap; }
1130
+ .inline-form-field { display: flex; flex-direction: column; gap: 0.25rem; }
1131
+ .inline-form-field label { font-size: 0.75rem; font-weight: 500; color: #6b7280; }
1132
+ .reorder-btn { padding: 0.25rem; background: none; border: 1px solid #d1d5db; border-radius: 0.25rem; cursor: pointer; font-size: 0.75rem; line-height: 1; }
1133
+ .reorder-btn:hover { background: #f3f4f6; }
1134
+ @media (prefers-color-scheme: dark) {
1135
+ .reorder-btn { border-color: #3d3d3d; }
1136
+ .reorder-btn:hover { background: #2d2d2d; }
1137
+ }
1138
+ .filter-bar { display: flex; gap: 0.75rem; align-items: flex-end; flex-wrap: wrap; margin-bottom: 1rem; padding: 0.75rem; background: #f9fafb; border-radius: 0.5rem; border: 1px solid #e5e7eb; }
1139
+ .filter-field { display: flex; flex-direction: column; gap: 0.25rem; }
1140
+ .filter-field label { font-size: 0.75rem; font-weight: 500; color: #6b7280; }
1141
+ .modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 100; }
1142
+ .modal-dialog { background: white; border-radius: 0.75rem; padding: 1.5rem; max-width: 520px; width: 90%; max-height: 90vh; overflow-y: auto; box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1); }
1143
+ .modal-title { font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; color: #111827; }
1144
+ .modal-actions { display: flex; gap: 0.5rem; justify-content: flex-end; margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid #e5e7eb; }
1145
+ .modal-form-group { margin-bottom: 1rem; }
1146
+ .modal-form-group label { display: block; font-size: 1rem; font-weight: 500; color: #374151; margin-bottom: 0.25rem; }
1147
+ .risk-badge { display: inline-block; padding: 0.5rem 1rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; }
1148
+ .risk-low { background: #d1fae5; color: #065f46; }
1149
+ .risk-medium { background: #fef3c7; color: #92400e; }
1150
+ .risk-high { background: #fed7aa; color: #9a3412; }
1151
+ .risk-critical { background: #fee2e2; color: #991b1b; }
1152
+ .activity-item { display: flex; gap: 0.75rem; padding: 0.75rem 0; border-bottom: 1px solid #f3f4f6; }
1153
+ .activity-item:last-child { border-bottom: none; }
1154
+ .activity-dot { width: 0.5rem; height: 0.5rem; border-radius: 9999px; margin-top: 0.5rem; flex-shrink: 0; }
1155
+ .activity-body { flex: 1; min-width: 0; }
1156
+ .activity-text { font-size: 1rem; color: #374151; }
1157
+ .activity-time { font-size: 0.75rem; color: #9ca3af; margin-top: 0.25rem; }
1158
+ .checkbox-group { display: flex; flex-direction: column; gap: 0.5rem; }
1159
+ .checkbox-group label { display: flex; align-items: center; gap: 0.5rem; font-size: 1rem; color: #374151; cursor: pointer; }
1160
+ .client-info-row { display: flex; justify-content: space-between; align-items: center; padding: 0.5rem 0; border-bottom: 1px solid #f3f4f6; }
1161
+ .client-info-row:last-child { border-bottom: none; }
1162
+ .client-info-label { font-size: 1rem; color: #6b7280; }
1163
+ .client-info-value { font-size: 1rem; font-weight: 500; color: #111827; }
1164
+ .mobile-menu-toggle { display: none; }
1165
+ .mobile-nav-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 90; opacity: 0; pointer-events: none; transition: opacity 0.2s; }
1166
+ .mobile-nav-overlay.open { opacity: 1; pointer-events: auto; }
1167
+ .mobile-nav-drawer { position: fixed; top: 0; left: 0; bottom: 0; width: 280px; max-width: 80vw; background: white; z-index: 95; transform: translateX(-100%); transition: transform 0.25s ease; box-shadow: 2px 0 8px rgba(0,0,0,0.15); display: flex; flex-direction: column; }
1168
+ .mobile-nav-drawer.open { transform: translateX(0); }
1169
+ .mobile-nav-header { display: flex; align-items: center; justify-content: space-between; padding: 1rem; border-bottom: 1px solid #e5e7eb; }
1170
+ .mobile-nav-items { flex: 1; overflow-y: auto; padding: 0.5rem 0; }
1171
+ .mobile-nav-item { display: block; padding: 0.75rem 1rem; color: #374151; font-size: 1rem; text-decoration: none; transition: background 0.15s; }
1172
+ .mobile-nav-item:hover { background: #f3f4f6; }
1173
+ @media (prefers-color-scheme: dark) {
1174
+ .mobile-nav-item { color: #f5f5f5; }
1175
+ .mobile-nav-item:hover { background: #2d2d2d; }
1176
+ }
1177
+ .mobile-nav-footer { padding: 1rem; border-top: 1px solid #e5e7eb; }
1178
+ @media (max-width: 768px) {
1179
+ .mobile-menu-toggle { display: inline-flex; }
1180
+ }
1181
+
1182
+ /* Dialog overlay (reusable) */
1183
+ .dialog-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 100; }
1184
+ .dialog-panel { background: white; border-radius: 0.75rem; padding: 1.5rem; max-width: 480px; width: 90%; max-height: 85vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0,0,0,0.2); }
1185
+ .dialog-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1rem; }
1186
+ .dialog-title { font-size: 1.125rem; font-weight: 600; color: #111827; }
1187
+ .dialog-close { background: none; border: none; font-size: 1.5rem; color: #9ca3af; cursor: pointer; line-height: 1; padding: 0; }
1188
+ .dialog-close:hover { color: #374151; }
1189
+ @media (prefers-color-scheme: dark) {
1190
+ .dialog-close { color: #9ca3af; }
1191
+ .dialog-close:hover { color: #f5f5f5; }
1192
+ }
1193
+ .dialog-body { margin-bottom: 1.25rem; }
1194
+ .dialog-footer { display: flex; gap: 0.5rem; justify-content: flex-end; }
1195
+
1196
+ /* F-RFI-37: Color Picker Dialog */
1197
+ .color-picker-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.75rem; padding: 0.5rem 0; }
1198
+ .cpd-swatch { width: 100%; aspect-ratio: 1; border-radius: 0.5rem; border: 3px solid transparent; cursor: pointer; transition: border-color 0.15s, transform 0.15s; }
1199
+ .cpd-swatch:hover { transform: scale(1.1); }
1200
+ .cpd-swatch.cpd-selected { border-color: #111827; box-shadow: 0 0 0 2px white, 0 0 0 4px #111827; }
1201
+ .cpd-preview { display: inline-block; width: 24px; height: 24px; border-radius: 0.5rem; border: 1px solid #e5e7eb; vertical-align: middle; cursor: pointer; }
1202
+
1203
+ /* F-UI-06: Date Choice Dialog */
1204
+ .date-presets { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.75rem; }
1205
+ .date-preset-btn { padding: 0.5rem 0.75rem; border-radius: 9999px; border: 1px solid #e5e7eb; background: white; cursor: pointer; font-size: 0.8rem; color: #374151; transition: background 0.15s, border-color 0.15s; }
1206
+ .date-preset-btn:hover { background: #f0f7ff; border-color: var(--primary); color: var(--primary); }
1207
+
1208
+ /* F-LIFE-02: Stage Transition Dialog */
1209
+ .stage-trans-arrow { display: flex; align-items: center; justify-content: center; padding: 0.75rem 0; }
1210
+ .stage-trans-block { display: flex; align-items: center; gap: 0.75rem; padding: 0.75rem; border-radius: 0.5rem; }
1211
+ .stage-trans-current { background: #f0f7ff; border: 1px solid #bfdbfe; }
1212
+ .stage-trans-next { background: #f0fdf4; border: 1px solid #bbf7d0; }
1213
+ .stage-trans-dot { width: 12px; height: 12px; border-radius: 9999px; flex-shrink: 0; }
1214
+
1215
+ /* F-LIFE-04: Stage Pipeline */
1216
+ .stage-pipeline { display: flex; align-items: center; gap: 0; overflow-x: auto; padding: 0.5rem 0; }
1217
+ .spl-pill { display: flex; align-items: center; justify-content: center; padding: 0.5rem 1rem; font-size: 0.75rem; font-weight: 500; white-space: nowrap; border: 1px solid #e5e7eb; position: relative; cursor: default; transition: box-shadow 0.15s; }
1218
+ .spl-pill:first-child { border-radius: 9999px 0 0 9999px; }
1219
+ .spl-pill:last-child { border-radius: 0 9999px 9999px 0; }
1220
+ .spl-past { opacity: 0.85; }
1221
+ .spl-past::after { content: ''; position: absolute; inset: 0; background: rgba(34,197,94,0.08); pointer-events: none; }
1222
+ .spl-current { font-weight: 700; z-index: 1; box-shadow: 0 0 0 2px rgba(37,99,235,0.5); animation: spl-pulse 2s ease-in-out infinite; }
1223
+ .spl-future { background: #f9fafb; color: #6b7280; border-color: #e5e7eb; }
1224
+ .spl-clickable { cursor: pointer; }
1225
+ .spl-clickable:hover { box-shadow: 0 0 0 2px rgba(37,99,235,0.3); }
1226
+ @keyframes spl-pulse { 0%, 100% { box-shadow: 0 0 0 2px rgba(37,99,235,0.5); } 50% { box-shadow: 0 0 0 4px rgba(37,99,235,0.25); } }
1227
+
1228
+ /* F-DET-05: Activity Timeline */
1229
+ .act-timeline { position: relative; padding-left: 2rem; }
1230
+ .act-timeline::before { content: ''; position: absolute; left: 0.75rem; top: 0; bottom: 0; width: 2px; background: #e5e7eb; }
1231
+ .act-tl-item { position: relative; padding-bottom: 1.25rem; }
1232
+ .act-tl-item:last-child { padding-bottom: 0; }
1233
+ .act-tl-icon { position: absolute; left: -2rem; top: 0; width: 1.5rem; height: 1.5rem; border-radius: 9999px; display: flex; align-items: center; justify-content: center; font-size: 0.7rem; border: 2px solid white; z-index: 1; }
1234
+ .act-tl-created { background: #dbeafe; color: #1e40af; }
1235
+ .act-tl-updated { background: #fef3c7; color: #92400e; }
1236
+ .act-tl-status_changed { background: #ede9fe; color: #5b21b6; }
1237
+ .act-tl-commented { background: #d1fae5; color: #065f46; }
1238
+ .act-tl-assigned { background: #fce7f3; color: #9d174d; }
1239
+ .act-tl-uploaded { background: #e0e7ff; color: #3730a3; }
1240
+ .act-tl-content { background: white; border: 1px solid #f3f4f6; border-radius: 0.5rem; padding: 0.75rem 1rem; }
1241
+ .act-tl-header { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.25rem; }
1242
+ .act-tl-desc { font-size: 1rem; color: #374151; }
1243
+ .act-tl-time { font-size: 0.7rem; color: #9ca3af; }
1244
+ .act-tl-more { display: flex; align-items: center; justify-content: center; padding: 0.5rem; margin-top: 0.5rem; }
1245
+
1246
+ /* F-TEAM-01: Team Assignment Dialog */
1247
+ .tad-search { width: 100%; padding: 0.5rem 0.75rem; border: 1px solid #e5e7eb; border-radius: 0.5rem; font-size: 1rem; margin-bottom: 0.5rem; }
1248
+ .tad-search:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 2px rgba(37,99,235,0.15); }
1249
+ .tad-list { max-height: 280px; overflow-y: auto; display: flex; flex-direction: column; gap: 0.25rem; }
1250
+ .tad-row { display: flex; align-items: center; gap: 0.75rem; padding: 0.5rem 0.75rem; border-radius: 0.5rem; cursor: pointer; transition: background 0.1s; }
1251
+ .tad-row:hover { background: #f3f4f6; }
1252
+ @media (prefers-color-scheme: dark) {
1253
+ .tad-row:hover { background: #2d2d2d; }
1254
+ .tad-name, .tad-email { color: #f5f5f5; }
1255
+ }
1256
+ .tad-row input[type="checkbox"] { flex-shrink: 0; accent-color: var(--primary); width: 16px; height: 16px; }
1257
+ .tad-name { font-size: 1rem; color: #111827; }
1258
+ .tad-email { font-size: 0.75rem; color: #6b7280; }
1259
+
1260
+ /* F-TEAM-02: Team Selector */
1261
+ .ts-wrap { position: relative; }
1262
+ .ts-badges { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 0.5rem; min-height: 1.5rem; }
1263
+ .ts-badge { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.2rem 0.5rem; background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 9999px; font-size: 0.75rem; color: #1e40af; }
1264
+ .ts-badge-x { cursor: pointer; font-size: 1rem; line-height: 1; color: #6b7280; }
1265
+ .ts-badge-x:hover { color: #ef4444; }
1266
+ @media (prefers-color-scheme: dark) {
1267
+ .ts-badge { background: #1e3a8a; border-color: #1e40af; color: #93c5fd; }
1268
+ }
1269
+ .ts-dropdown { border: 1px solid #e5e7eb; border-radius: 0.5rem; background: white; box-shadow: 0 4px 12px rgba(0,0,0,0.08); max-height: 0; overflow: hidden; transition: max-height 0.2s ease; }
1270
+ .ts-dropdown.ts-open { max-height: 320px; overflow-y: auto; }
1271
+
1272
+ /* M-ARCHIVE-01: Archive Context */
1273
+ .archive-ctx { display: flex; flex-direction: column; gap: 0.5rem; padding: 0.75rem; background: #fef3c7; border-radius: 0.5rem; margin-bottom: 1rem; font-size: 1rem; color: #92400e; }
1274
+ .archive-type-input { width: 100%; padding: 0.5rem 0.75rem; border: 1px solid #e5e7eb; border-radius: 0.5rem; font-size: 1rem; margin-top: 0.5rem; }
1275
+ .archive-type-input:focus { outline: none; border-color: #ef4444; box-shadow: 0 0 0 2px rgba(239,68,68,0.15); }
1276
+
1277
+ /* M-STATUS-01/02: Review Toggles */
1278
+ .rvw-toggle { display: inline-flex; align-items: center; gap: 0.75rem; }
1279
+ .rvw-toggle-track { position: relative; width: 44px; height: 24px; background: #d1d5db; border-radius: 9999px; cursor: pointer; transition: background 0.2s; flex-shrink: 0; }
1280
+ .rvw-toggle-track.rvw-on { background: var(--primary); }
1281
+ .rvw-toggle-track.rvw-on.rvw-green { background: #22c55e; }
1282
+ .rvw-toggle-track.rvw-on.rvw-purple { background: #8b5cf6; }
1283
+ .rvw-toggle-knob { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: white; border-radius: 9999px; transition: transform 0.2s; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }
1284
+ .rvw-toggle-track.rvw-on .rvw-toggle-knob { transform: translateX(20px); }
1285
+ .rvw-toggle-label { font-size: 1rem; font-weight: 500; color: #374151; display: flex; align-items: center; gap: 0.5rem; }
1286
+
1287
+ /* M-STATUS-03: Bulk Resolve */
1288
+ .bulk-resolve-count { display: flex; align-items: center; justify-content: center; font-size: 2rem; font-weight: 700; color: #dc2626; padding: 1rem; background: #fef2f2; border-radius: 0.75rem; margin-bottom: 0.75rem; }
1289
+ .bulk-resolve-label { text-align: center; font-size: 1rem; color: #6b7280; margin-bottom: 1rem; }
1290
+
1291
+ /* Review Tab Bar */
1292
+ .review-tab-bar { display: flex; gap: 0; border-bottom: 2px solid #e5e7eb; margin-bottom: 1rem; overflow-x: auto; }
1293
+ .review-tab { padding: 0.75rem 1rem; font-size: 1rem; font-weight: 500; color: #6b7280; background: none; border: none; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; white-space: nowrap; transition: color 0.15s, border-color 0.15s; }
1294
+ .review-tab:hover { color: #374151; }
1295
+ @media (prefers-color-scheme: dark) {
1296
+ .review-tab { color: #9ca3af; }
1297
+ .review-tab:hover { color: #f5f5f5; }
1298
+ .review-tab-active { color: var(--primary); }
1299
+ .review-tab-count { background: #1e40af; color: #93c5fd; }
1300
+ .review-tab-active .review-tab-count { background: #1e40af; color: var(--primary); }
1301
+ }
1302
+ .review-tab-active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }
1303
+ .review-tab-count { display: inline-flex; align-items: center; justify-content: center; min-width: 1.25rem; height: 1.25rem; padding: 0 0.5rem; border-radius: 9999px; background: #e5e7eb; color: #374151; font-size: 0.7rem; font-weight: 600; margin-left: 0.5rem; }
1304
+ .review-tab-active .review-tab-count { background: #eff6ff; color: var(--primary); }
1305
+ .review-hidden { display: none; }
1306
+
1307
+ /* Review Group List */
1308
+ .review-grouped-list { display: flex; flex-direction: column; gap: 0.5rem; }
1309
+ .review-group { border: 1px solid #e5e7eb; border-radius: 0.5rem; overflow: hidden; }
1310
+ .review-group-header { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1rem; background: #f9fafb; cursor: pointer; -webkit-user-select: none; user-select: none; }
1311
+ .review-group-header:hover { background: #f3f4f6; }
1312
+ @media (prefers-color-scheme: dark) {
1313
+ .review-group { border-color: #3d3d3d; }
1314
+ .review-group-header { background: #2d2d2d; color: #f5f5f5; }
1315
+ .review-group-header:hover { background: #3d3d3d; }
1316
+ }
1317
+ .review-group-arrow { font-size: 0.75rem; transition: transform 0.2s; }
1318
+ .review-group-collapsed .review-group-arrow { transform: rotate(-90deg); }
1319
+ .review-group-collapsed .review-group-body { display: none; }
1320
+ .review-group-body { }
1321
+ .review-group-item { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; padding: 0.75rem 1rem; border-top: 1px solid #f3f4f6; cursor: pointer; transition: background 0.1s; font-size: 1rem; }
1322
+ .review-group-item:hover { background: #f9fafb; }
1323
+ @media (prefers-color-scheme: dark) {
1324
+ .review-group-item { border-color: #2d2d2d; color: #f5f5f5; }
1325
+ .review-group-item:hover { background: #2d2d2d; }
1326
+ }
1327
+
1328
+ /* Review Section Rows */
1329
+ .review-section-row { border: 1px solid #e5e7eb; border-radius: 0.5rem; margin-bottom: 0.5rem; overflow: hidden; }
1330
+ .review-section-header { display: flex; align-items: center; gap: 0.75rem; padding: 0.75rem 1rem; background: #f9fafb; cursor: pointer; -webkit-user-select: none; user-select: none; }
1331
+ .review-section-header:hover { background: #f3f4f6; }
1332
+ @media (prefers-color-scheme: dark) {
1333
+ .review-section-row { border-color: #3d3d3d; }
1334
+ .review-section-header { background: #2d2d2d; color: #f5f5f5; }
1335
+ .review-section-header:hover { background: #3d3d3d; }
1336
+ }
1337
+ .review-section-body { display: none; padding: 0.75rem 1rem; }
1338
+ .review-section-expanded .review-section-body { display: block; }
1339
+ .review-section-expanded .review-group-arrow { transform: rotate(0deg); }
1340
+ .review-section-stats { padding: 0.5rem 0; }
1341
+
1342
+ /* Review Context Menu */
1343
+ .review-ctx-menu { position: absolute; z-index: 100; background: white; border-radius: 0.5rem; box-shadow: 0 10px 25px rgba(0,0,0,0.12); min-width: 160px; padding: 0.5rem 0; border: 1px solid #e5e7eb; }
1344
+ .ctx-item { padding: 0.5rem 1rem; font-size: 1rem; color: #374151; cursor: pointer; transition: background 0.1s; }
1345
+ .ctx-item:hover { background: #f3f4f6; }
1346
+ .ctx-danger { color: #ef4444; }
1347
+ .ctx-danger:hover { background: #fef2f2; }
1348
+ @media (prefers-color-scheme: dark) {
1349
+ .review-ctx-menu { background: #1a1a1a; border-color: #3d3d3d; }
1350
+ .ctx-item { color: #f5f5f5; }
1351
+ .ctx-item:hover { background: #2d2d2d; }
1352
+ .ctx-danger:hover { background: #7f1d1d; }
1353
+ }
1354
+ .ctx-sep { height: 1px; background: #e5e7eb; margin: 0.25rem 0; }
1355
+
1356
+ /* Home Panel Tabs */
1357
+ .home-panel { min-height: 100px; }
1358
+
1359
+ /* Splash Screen */
1360
+ .splash-screen { position: fixed; inset: 0; z-index: 9999; background: white; display: flex; align-items: center; justify-content: center; transition: opacity 0.4s ease; }
1361
+ .splash-screen.splash-hide { opacity: 0; pointer-events: none; }
1362
+ .splash-content { text-align: center; }
1363
+ .splash-logo { width: 64px; height: 64px; border-radius: 1rem; display: flex; align-items: center; justify-content: center; color: white; font-size: 2rem; font-weight: 700; margin: 0 auto 1rem; }
1364
+ .splash-name { font-size: 1.5rem; font-weight: 600; color: #111827; margin-bottom: 1.5rem; }
1365
+ .splash-spinner { display: flex; justify-content: center; }
1366
+ .splash-spinner-ring { width: 32px; height: 32px; border: 3px solid #e5e7eb; border-top-color: var(--splash-color, var(--primary)); border-radius: 9999px; animation: splash-spin 0.8s linear infinite; }
1367
+ @keyframes splash-spin { to { transform: rotate(360deg); } }
1368
+
1369
+ /* Service Worker Update Banner */
1370
+ .sw-banner { position: fixed; bottom: 1rem; left: 50%; transform: translateX(-50%); z-index: 200; background: #1e293b; color: white; padding: 0.75rem 1rem; border-radius: 0.75rem; display: flex; align-items: center; gap: 0.75rem; box-shadow: 0 8px 25px rgba(0,0,0,0.15); }
1371
+ .sw-banner-text { font-size: 1rem; white-space: nowrap; }
1372
+
1373
+ /* DataGrid */
1374
+ .dg-wrapper { overflow-x: auto; border: 1px solid #e5e7eb; border-radius: 0.5rem; }
1375
+ .dg-table { width: 100%; border-collapse: collapse; }
1376
+ .dg-table th { padding: 0.75rem 1rem; background: #f9fafb; font-size: 0.75rem; font-weight: 600; color: #6b7280; text-transform: uppercase; letter-spacing: 0.025em; border-bottom: 1px solid #e5e7eb; }
1377
+ .dg-table td { padding: 0.75rem 1rem; font-size: 1rem; border-bottom: 1px solid #f3f4f6; }
1378
+ .dg-sortable { cursor: pointer; -webkit-user-select: none; user-select: none; }
1379
+ .dg-sortable:hover { color: var(--primary); }
1380
+ .dg-sort-indicator { margin-left: 0.25rem; font-size: 0.75rem; }
1381
+ .dg-filter { margin-top: 0.5rem; }
1382
+ .dg-filter-input { width: 100%; padding: 0.25rem 0.5rem; border: 1px solid #e5e7eb; border-radius: 0.25rem; font-size: 0.75rem; }
1383
+ .dg-filter-input:focus { outline: none; border-color: var(--primary); }
1384
+ .dg-group-header { background: #f3f4f6; cursor: pointer; -webkit-user-select: none; user-select: none; }
1385
+ .dg-group-header td { font-weight: 600; font-size: 1rem; padding: 0.5rem 0.75rem; }
1386
+ .dg-group-arrow { display: inline-block; margin-right: 0.5rem; font-size: 0.7rem; transition: transform 0.15s; }
1387
+ .dg-group-count { font-weight: 400; color: #6b7280; font-size: 0.8rem; margin-left: 0.5rem; }
1388
+ .dg-data-row:hover { background: #f9fafb; }
1389
+ .dg-expand-col { width: 28px; padding: 0.5rem; }
1390
+ .dg-expand-btn { background: none; border: 1px solid #d1d5db; border-radius: 0.25rem; cursor: pointer; font-size: 0.75rem; padding: 0.25rem 0.5rem; color: #6b7280; transition: background 0.1s; }
1391
+ .dg-expand-btn:hover { background: #f3f4f6; }
1392
+ .dg-expand-open { transform: rotate(90deg); }
1393
+ .dg-detail-row { background: #fafbfc; }
1394
+ .dg-detail-panel { padding: 0.75rem; border-left: 3px solid var(--primary); }
1395
+
1396
+ /* Collapsible Sidebar */
1397
+
1398
+ /* ============================================
1399
+ MOBILE-FIRST RESPONSIVE ENHANCEMENTS
1400
+ ============================================ */
1401
+
1402
+ /* Touch-friendly base sizes */
1403
+ @media (max-width: 768px) {
1404
+ /* Base html adjustments for mobile */
1405
+ html {
1406
+ font-size: 14px;
1407
+ }
1408
+
1409
+ body {
1410
+ -webkit-text-size-adjust: 100%;
1411
+ overscroll-behavior-y: contain;
1412
+ }
1413
+
1414
+ /* Container adjustments */
1415
+ .container, .container-lg {
1416
+ padding-left: var(--page-gutter, 0.75rem);
1417
+ padding-right: var(--page-gutter, 0.75rem);
1418
+ }
1419
+
1420
+ /* Navbar mobile */
1421
+ .navbar {
1422
+ padding: 0.5rem 0.75rem;
1423
+ flex-wrap: wrap;
1424
+ gap: 0.5rem;
1425
+ }
1426
+ .navbar-start, .navbar-end {
1427
+ gap: 0.5rem;
1428
+ }
1429
+ .navbar-brand {
1430
+ font-size: 1rem;
1431
+ }
1432
+
1433
+ /* Button touch targets - minimum 44px */
1434
+ .btn {
1435
+ min-height: 44px;
1436
+ min-width: 44px;
1437
+ padding: 0.75rem 1rem;
1438
+ font-size: 0.9375rem;
1439
+ }
1440
+ .btn-xs {
1441
+ min-height: 32px;
1442
+ min-width: 32px;
1443
+ padding: 0.5rem 0.5rem;
1444
+ font-size: 0.75rem;
1445
+ }
1446
+ .btn-sm {
1447
+ min-height: 36px;
1448
+ min-width: 36px;
1449
+ padding: 0.5rem 0.75rem;
1450
+ font-size: 0.8125rem;
1451
+ }
1452
+ .btn-lg {
1453
+ min-height: 52px;
1454
+ padding: 1rem 1.5rem;
1455
+ font-size: 1.0625rem;
1456
+ }
1457
+ .btn-block-mobile {
1458
+ width: 100%;
1459
+ justify-content: center;
1460
+ }
1461
+
1462
+ /* Form inputs - larger touch targets */
1463
+ .form-input,
1464
+ .form-textarea,
1465
+ input[type="text"],
1466
+ input[type="email"],
1467
+ input[type="password"],
1468
+ input[type="number"],
1469
+ input[type="date"],
1470
+ input[type="search"],
1471
+ select,
1472
+ textarea {
1473
+ min-height: 44px;
1474
+ padding: 0.75rem 1rem;
1475
+ font-size: 1rem;
1476
+ -webkit-appearance: none;
1477
+ appearance: none;
1478
+ }
1479
+ select {
1480
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
1481
+ background-repeat: no-repeat;
1482
+ background-position: right 0.75rem center;
1483
+ padding-right: 2.25rem;
1484
+ }
1485
+ textarea {
1486
+ min-height: 100px;
1487
+ }
1488
+ .form-group {
1489
+ margin-bottom: 1rem;
1490
+ }
1491
+ .form-label {
1492
+ font-size: 0.9375rem;
1493
+ margin-bottom: 0.5rem;
1494
+ }
1495
+
1496
+ /* Card mobile optimizations */
1497
+ .card {
1498
+ margin-left: -0.75rem;
1499
+ margin-right: -0.75rem;
1500
+ border-radius: 0;
1501
+ border-left: none;
1502
+ border-right: none;
1503
+ }
1504
+ .card-body {
1505
+ padding: 1rem;
1506
+ }
1507
+ .card-header, .card-footer {
1508
+ padding: 1rem;
1509
+ }
1510
+
1511
+ /* Table mobile - horizontal scroll + card transform */
1512
+ .table-container {
1513
+ margin-left: -0.75rem;
1514
+ margin-right: -0.75rem;
1515
+ padding-left: 0.75rem;
1516
+ padding-right: 0.75rem;
1517
+ overflow-x: auto;
1518
+ -webkit-overflow-scrolling: touch;
1519
+ }
1520
+ table {
1521
+ min-width: 600px;
1522
+ }
1523
+ th, td {
1524
+ padding: 0.75rem;
1525
+ font-size: 1rem;
1526
+ }
1527
+ th {
1528
+ font-size: 0.75rem;
1529
+ }
1530
+
1531
+ /* Grid mobile */
1532
+ .grid {
1533
+ gap: 0.75rem;
1534
+ }
1535
+ .grid-cols-1, .grid-cols-2, .grid-cols-3, .grid-cols-4 {
1536
+ grid-template-columns: 1fr;
1537
+ }
1538
+
1539
+ /* Flex mobile */
1540
+ .flex, .flex-col, .flex-wrap {
1541
+ gap: 0.5rem;
1542
+ }
1543
+ .flex-wrap-mobile {
1544
+ flex-wrap: wrap;
1545
+ }
1546
+ .flex-col-mobile {
1547
+ flex-direction: column;
1548
+ }
1549
+ .flex-center-mobile {
1550
+ justify-content: center;
1551
+ align-items: center;
1552
+ }
1553
+
1554
+ /* Spacing mobile */
1555
+ .p-1, .p-2, .p-3, .p-4, .p-6 {
1556
+ padding: 0.75rem;
1557
+ }
1558
+ .py-2, .py-3, .py-4 {
1559
+ padding-top: 0.5rem;
1560
+ padding-bottom: 0.5rem;
1561
+ }
1562
+ .px-2, .px-4 {
1563
+ padding-left: 0.75rem;
1564
+ padding-right: 0.75rem;
1565
+ }
1566
+ .m-0, .m-1, .m-2, .m-4 {
1567
+ margin: 0.5rem;
1568
+ }
1569
+ .mb-2, .mb-3, .mb-4, .mb-6 {
1570
+ margin-bottom: 0.75rem;
1571
+ }
1572
+ .mt-2, .mt-3, .mt-4, .mt-6 {
1573
+ margin-top: 0.75rem;
1574
+ }
1575
+
1576
+ /* Modal/Dialog mobile - full screen */
1577
+ .modal-overlay,
1578
+ .confirm-overlay,
1579
+ .dialog-overlay {
1580
+ align-items: flex-end;
1581
+ padding: 0;
1582
+ }
1583
+ .modal-dialog,
1584
+ .confirm-dialog,
1585
+ .modal-content,
1586
+ .dialog-panel {
1587
+ width: 100%;
1588
+ max-width: 100%;
1589
+ max-height: 90vh;
1590
+ border-radius: 1rem 1rem 0 0;
1591
+ padding: 1.25rem;
1592
+ margin: 0;
1593
+ animation: slide-up-mobile 0.25s ease-out;
1594
+ }
1595
+ .modal-content {
1596
+ max-height: 85vh;
1597
+ }
1598
+ .modal-title, .confirm-title, .dialog-title {
1599
+ font-size: 1.25rem;
1600
+ }
1601
+ .modal-actions, .confirm-actions, .dialog-footer {
1602
+ flex-direction: column;
1603
+ gap: 0.5rem;
1604
+ padding-top: 1rem;
1605
+ }
1606
+ .modal-actions .btn, .confirm-actions .btn, .dialog-footer .btn {
1607
+ width: 100%;
1608
+ justify-content: center;
1609
+ }
1610
+ @keyframes slide-up-mobile {
1611
+ from { transform: translateY(100%); }
1612
+ to { transform: translateY(0); }
1613
+ }
1614
+
1615
+ /* Toast mobile */
1616
+ .toast-container {
1617
+ left: 0.5rem;
1618
+ right: 0.5rem;
1619
+ top: 0.5rem;
1620
+ }
1621
+ .toast {
1622
+ max-width: 100%;
1623
+ width: 100%;
1624
+ }
1625
+
1626
+ /* Dropdown mobile */
1627
+ .dropdown-menu {
1628
+ position: fixed;
1629
+ left: 0.5rem;
1630
+ right: 0.5rem;
1631
+ top: auto;
1632
+ bottom: 0;
1633
+ width: auto;
1634
+ max-width: 100%;
1635
+ border-radius: 1rem 1rem 0 0;
1636
+ transform: translateY(100%);
1637
+ transition: transform 0.2s ease;
1638
+ }
1639
+ .dropdown.open .dropdown-menu {
1640
+ transform: translateY(0);
1641
+ }
1642
+
1643
+ /* Stats row mobile */
1644
+ .stats-row {
1645
+ grid-template-columns: repeat(2, 1fr);
1646
+ gap: 0.75rem;
1647
+ }
1648
+ .stat-card {
1649
+ padding: 1rem;
1650
+ }
1651
+ .stat-card-value {
1652
+ font-size: 1.5rem;
1653
+ }
1654
+ .stat-card-label {
1655
+ font-size: 0.75rem;
1656
+ }
1657
+
1658
+ /* Breadcrumb mobile */
1659
+ .breadcrumb {
1660
+ font-size: 0.8125rem;
1661
+ overflow: hidden;
1662
+ text-overflow: ellipsis;
1663
+ white-space: nowrap;
1664
+ }
1665
+
1666
+ /* Page header mobile */
1667
+ .page-header {
1668
+ flex-direction: column;
1669
+ align-items: flex-start;
1670
+ gap: 0.75rem;
1671
+ }
1672
+ .page-title {
1673
+ font-size: 1.25rem;
1674
+ }
1675
+
1676
+ /* Table toolbar mobile */
1677
+ .table-toolbar {
1678
+ flex-direction: column;
1679
+ align-items: stretch;
1680
+ gap: 0.75rem;
1681
+ padding: 1rem;
1682
+ }
1683
+ .table-search {
1684
+ min-width: unset;
1685
+ width: 100%;
1686
+ }
1687
+ .table-filter {
1688
+ width: 100%;
1689
+ }
1690
+ .table-filter select {
1691
+ width: 100%;
1692
+ }
1693
+ .table-count {
1694
+ text-align: center;
1695
+ margin-left: 0;
1696
+ }
1697
+
1698
+ /* Tab bar mobile */
1699
+ .tab-bar {
1700
+ overflow-x: auto;
1701
+ -webkit-overflow-scrolling: touch;
1702
+ flex-wrap: nowrap;
1703
+ padding: 0.5rem;
1704
+ gap: 0.25rem;
1705
+ scrollbar-width: none;
1706
+ }
1707
+ .tab-bar::-webkit-scrollbar {
1708
+ display: none;
1709
+ }
1710
+ .tab-btn {
1711
+ flex-shrink: 0;
1712
+ padding: 0.75rem 1rem;
1713
+ font-size: 1rem;
1714
+ }
1715
+
1716
+ /* Badge/Pill mobile */
1717
+ .badge, .pill {
1718
+ font-size: 0.6875rem;
1719
+ padding: 0.25rem 0.5rem;
1720
+ }
1721
+
1722
+ /* Empty state mobile */
1723
+ .empty-state {
1724
+ padding: 2rem 1rem;
1725
+ }
1726
+ .empty-state-icon {
1727
+ font-size: 2.5rem;
1728
+ }
1729
+ .empty-state-title {
1730
+ font-size: 1rem;
1731
+ }
1732
+ .empty-state-msg {
1733
+ font-size: 0.8125rem;
1734
+ max-width: 100%;
1735
+ }
1736
+
1737
+ /* Filter bar mobile */
1738
+ .filter-bar {
1739
+ flex-direction: column;
1740
+ padding: 0.75rem;
1741
+ gap: 0.5rem;
1742
+ }
1743
+ .filter-field {
1744
+ width: 100%;
1745
+ }
1746
+ .filter-field label {
1747
+ font-size: 0.8125rem;
1748
+ }
1749
+ .filter-field input,
1750
+ .filter-field select {
1751
+ width: 100%;
1752
+ }
1753
+
1754
+ /* Inline form mobile */
1755
+ .inline-form {
1756
+ padding: 0.75rem;
1757
+ }
1758
+ .inline-form-row {
1759
+ flex-direction: column;
1760
+ gap: 0.5rem;
1761
+ }
1762
+ .inline-form-field {
1763
+ width: 100%;
1764
+ }
1765
+
1766
+ /* Settings grid mobile */
1767
+ .settings-grid {
1768
+ grid-template-columns: 1fr;
1769
+ }
1770
+ .settings-card {
1771
+ padding: 1rem;
1772
+ }
1773
+ .settings-card-icon {
1774
+ width: 2.5rem;
1775
+ height: 2.5rem;
1776
+ font-size: 1.5rem;
1777
+ }
1778
+ .settings-card-title {
1779
+ font-size: 0.9375rem;
1780
+ }
1781
+ .settings-card-desc {
1782
+ font-size: 0.75rem;
1783
+ }
1784
+
1785
+ /* Avatar mobile */
1786
+ .user-avatar {
1787
+ width: 36px;
1788
+ height: 36px;
1789
+ font-size: 1rem;
1790
+ }
1791
+
1792
+ /* Engagement pipeline mobile */
1793
+ .engagement-pipeline,
1794
+ .stage-pipeline {
1795
+ padding: 0.5rem;
1796
+ gap: 0.25rem;
1797
+ }
1798
+ .stage-pill {
1799
+ padding: 0.5rem 0.75rem;
1800
+ font-size: 0.6875rem;
1801
+ }
1802
+
1803
+ /* Activity item mobile */
1804
+ .activity-item {
1805
+ flex-direction: column;
1806
+ gap: 0.5rem;
1807
+ padding: 0.75rem 0;
1808
+ }
1809
+
1810
+ /* Review tab bar mobile */
1811
+ .review-tab-bar {
1812
+ padding: 0 0.5rem;
1813
+ }
1814
+ .review-tab {
1815
+ padding: 0.5rem 0.75rem;
1816
+ font-size: 0.8125rem;
1817
+ }
1818
+ .review-tab-count {
1819
+ min-width: 1rem;
1820
+ height: 1rem;
1821
+ font-size: 0.75rem;
1822
+ }
1823
+
1824
+ /* Toggle switch mobile */
1825
+ .toggle-wrap {
1826
+ flex-direction: column;
1827
+ align-items: flex-start;
1828
+ gap: 0.5rem;
1829
+ padding: 0.75rem 0;
1830
+ }
1831
+ .toggle-label {
1832
+ font-size: 0.9375rem;
1833
+ }
1834
+ .toggle-desc {
1835
+ font-size: 0.75rem;
1836
+ }
1837
+
1838
+ /* Form section mobile */
1839
+ .form-section {
1840
+ padding: 1rem;
1841
+ margin-left: -0.75rem;
1842
+ margin-right: -0.75rem;
1843
+ border-radius: 0;
1844
+ border-left: none;
1845
+ border-right: none;
1846
+ }
1847
+ .form-section-title {
1848
+ font-size: 1rem;
1849
+ padding-bottom: 0.75rem;
1850
+ }
1851
+ .form-grid, .form-grid-3 {
1852
+ grid-template-columns: 1fr;
1853
+ gap: 1rem;
1854
+ }
1855
+ .form-actions {
1856
+ flex-direction: column;
1857
+ padding-top: 1rem;
1858
+ }
1859
+ .form-actions .btn {
1860
+ width: 100%;
1861
+ justify-content: center;
1862
+ }
1863
+
1864
+ /* DataGrid mobile */
1865
+ .dg-wrapper {
1866
+ margin-left: -0.75rem;
1867
+ margin-right: -0.75rem;
1868
+ border-radius: 0;
1869
+ border-left: none;
1870
+ border-right: none;
1871
+ }
1872
+ .dg-table {
1873
+ min-width: 500px;
1874
+ }
1875
+ .dg-filter-input {
1876
+ font-size: 1rem;
1877
+ padding: 0.5rem;
1878
+ }
1879
+
1880
+ /* Sidebar review panel mobile */
1881
+ .sidebar-review-panel {
1882
+ width: 100%;
1883
+ max-width: 100%;
1884
+ }
1885
+
1886
+ /* Alert strip mobile */
1887
+ .alert-strip {
1888
+ flex-direction: column;
1889
+ gap: 0.5rem;
1890
+ text-align: center;
1891
+ padding: 1rem;
1892
+ }
1893
+
1894
+ /* Cards list mobile */
1895
+ .card-list-mobile {
1896
+ display: flex;
1897
+ flex-direction: column;
1898
+ gap: 0.75rem;
1899
+ }
1900
+ .card-list-mobile .card {
1901
+ margin: 0;
1902
+ border-radius: 0.5rem;
1903
+ border: 1px solid #e5e7eb;
1904
+ }
1905
+
1906
+ /* Text sizes mobile */
1907
+ .text-xs { font-size: 0.6875rem; }
1908
+ .text-sm { font-size: 0.8125rem; }
1909
+ .text-base { font-size: 0.9375rem; }
1910
+ .text-lg { font-size: 1.0625rem; }
1911
+ .text-xl { font-size: 1.1875rem; }
1912
+ .text-2xl { font-size: 1.375rem; }
1913
+ .text-3xl { font-size: 1.75rem; }
1914
+
1915
+ /* Show/hide mobile helpers */
1916
+ .hide-mobile { display: none !important; }
1917
+ .show-mobile { display: block !important; }
1918
+ .show-mobile-flex { display: flex !important; }
1919
+ .show-mobile-inline-flex { display: inline-flex !important; }
1920
+
1921
+ /* Full width mobile */
1922
+ .w-full-mobile { width: 100% !important; }
1923
+
1924
+ /* Margin mobile helpers */
1925
+ .mb-0-mobile { margin-bottom: 0 !important; }
1926
+ .mt-2-mobile { margin-top: 0.5rem !important; }
1927
+ .mt-4-mobile { margin-top: 1rem !important; }
1928
+ .mb-2-mobile { margin-bottom: 0.5rem !important; }
1929
+ .mb-4-mobile { margin-bottom: 1rem !important; }
1930
+
1931
+ /* Padding mobile helpers */
1932
+ .p-0-mobile { padding: 0 !important; }
1933
+ .p-2-mobile { padding: 0.5rem !important; }
1934
+ .p-4-mobile { padding: 1rem !important; }
1935
+
1936
+ /* Overflow mobile */
1937
+ .overflow-x-auto-mobile {
1938
+ overflow-x: auto;
1939
+ -webkit-overflow-scrolling: touch;
1940
+ }
1941
+
1942
+ /* Sticky mobile header */
1943
+ .sticky-mobile {
1944
+ position: sticky;
1945
+ top: 0;
1946
+ z-index: 10;
1947
+ background: inherit;
1948
+ }
1949
+
1950
+ /* Touch scroll container */
1951
+ .touch-scroll {
1952
+ overflow-x: auto;
1953
+ -webkit-overflow-scrolling: touch;
1954
+ scrollbar-width: none;
1955
+ }
1956
+ .touch-scroll::-webkit-scrollbar {
1957
+ display: none;
1958
+ }
1959
+
1960
+ /* Mobile bottom spacing for nav */
1961
+ .mobile-nav-spacer {
1962
+ height: 80px;
1963
+ }
1964
+
1965
+ /* Action bar mobile (fixed bottom) */
1966
+ .action-bar-mobile {
1967
+ position: fixed;
1968
+ bottom: 0;
1969
+ left: 0;
1970
+ right: 0;
1971
+ background: white;
1972
+ border-top: 1px solid #e5e7eb;
1973
+ padding: 0.75rem;
1974
+ display: flex;
1975
+ gap: 0.5rem;
1976
+ z-index: 50;
1977
+ box-shadow: 0 -2px 8px rgba(0,0,0,0.08);
1978
+ }
1979
+ .action-bar-mobile .btn {
1980
+ flex: 1;
1981
+ justify-content: center;
1982
+ }
1983
+
1984
+ /* Safe area inset for notched devices */
1985
+ @supports (padding-bottom: env(safe-area-inset-bottom)) {
1986
+ .action-bar-mobile {
1987
+ padding-bottom: calc(0.75rem + env(safe-area-inset-bottom));
1988
+ }
1989
+ }
1990
+ }
1991
+
1992
+ /* Tablet breakpoint (768px - 1023px) */
1993
+ @media (min-width: 768px) and (max-width: 1023px) {
1994
+ html {
1995
+ font-size: 14px;
1996
+ }
1997
+
1998
+ .container, .container-lg {
1999
+ padding-left: 1rem;
2000
+ padding-right: 1rem;
2001
+ }
2002
+
2003
+ .grid-cols-2-tablet {
2004
+ grid-template-columns: repeat(2, 1fr);
2005
+ }
2006
+ .grid-cols-3-tablet {
2007
+ grid-template-columns: repeat(3, 1fr);
2008
+ }
2009
+
2010
+ .stats-row {
2011
+ grid-template-columns: repeat(3, 1fr);
2012
+ }
2013
+
2014
+ .card {
2015
+ margin-left: 0;
2016
+ margin-right: 0;
2017
+ border-radius: 0.5rem;
2018
+ border: 1px solid #e5e7eb;
2019
+ }
2020
+
2021
+ .modal-dialog,
2022
+ .confirm-dialog,
2023
+ .modal-content,
2024
+ .dialog-panel {
2025
+ max-width: 90%;
2026
+ }
2027
+
2028
+ .hide-tablet { display: none !important; }
2029
+ .show-tablet { display: block !important; }
2030
+ }
2031
+
2032
+ /* Small mobile (under 480px) */
2033
+ @media (max-width: 479px) {
2034
+ html {
2035
+ font-size: 13px;
2036
+ }
2037
+
2038
+ .btn {
2039
+ padding: 0.5625rem 1rem;
2040
+ font-size: 1rem;
2041
+ }
2042
+
2043
+ .stats-row {
2044
+ grid-template-columns: 1fr;
2045
+ }
2046
+
2047
+ .table-toolbar {
2048
+ padding: 0.75rem;
2049
+ }
2050
+
2051
+ .form-input, select, textarea {
2052
+ font-size: 16px; /* Prevents iOS zoom on focus */
2053
+ }
2054
+
2055
+ .page-title {
2056
+ font-size: 1.125rem;
2057
+ }
2058
+
2059
+ .hide-xs { display: none !important; }
2060
+ }
2061
+
2062
+ /* Large desktop (1024px+) */
2063
+ @media (min-width: 1024px) {
2064
+ .hide-desktop { display: none !important; }
2065
+ }
2066
+
2067
+ /* Print styles */
2068
+ @media print {
2069
+ .no-print {
2070
+ display: none !important;
2071
+ }
2072
+ body {
2073
+ font-size: 12pt;
2074
+ }
2075
+ .card, .table-wrap {
2076
+ box-shadow: none;
2077
+ border: 1px solid #ccc;
2078
+ }
2079
+ }
2080
+ .sidebar-collapsible { position: relative; width: 240px; min-height: 100vh; background: white; border-right: 1px solid #e5e7eb; display: flex; flex-direction: column; transition: width 0.2s ease; flex-shrink: 0; }
2081
+ .sidebar-collapsible.sidebar-collapsed { width: 48px; overflow: hidden; }
2082
+ .sidebar-collapsed .sidebar-inner { opacity: 0; pointer-events: none; }
2083
+ .sidebar-collapsed .sidebar-collapse-btn { opacity: 1; pointer-events: auto; }
2084
+ .sidebar-inner { padding: 0.5rem; flex: 1; opacity: 1; transition: opacity 0.15s; }
2085
+ .sidebar-collapse-btn { background: none; border: none; cursor: pointer; padding: 0.5rem; font-size: 1.25rem; color: #6b7280; width: 100%; text-align: center; }
2086
+ .sidebar-collapse-btn:hover { color: #374151; background: #f3f4f6; border-radius: 0.5rem; }
2087
+ @media (prefers-color-scheme: dark) {
2088
+ .sidebar-collapse-btn:hover { color: #f5f5f5; background: #2d2d2d; }
2089
+ }
2090
+ .sidebar-section { margin-bottom: 0.25rem; }
2091
+ .sidebar-section-header { display: flex; align-items: center; justify-content: space-between; padding: 0.5rem 0.75rem; font-size: 0.75rem; font-weight: 600; color: #6b7280; text-transform: uppercase; letter-spacing: 0.05em; cursor: pointer; -webkit-user-select: none; user-select: none; }
2092
+ .sidebar-section-header:hover { color: #374151; }
2093
+ @media (prefers-color-scheme: dark) {
2094
+ .sidebar-section-header { color: #9ca3af; }
2095
+ .sidebar-section-header:hover { color: #f5f5f5; }
2096
+ }
2097
+ .sidebar-section-arrow { font-size: 0.75rem; transition: transform 0.2s; }
2098
+ .sidebar-section-closed .sidebar-section-body { display: none; }
2099
+ .sidebar-section-closed .sidebar-section-arrow { transform: rotate(-90deg); }
2100
+ .sidebar-link { display: block; padding: 0.5rem 0.75rem; font-size: 1rem; color: #374151; text-decoration: none; border-radius: 0.5rem; transition: background 0.1s; }
2101
+ .sidebar-link:hover { background: #f3f4f6; }
2102
+ @media (prefers-color-scheme: dark) {
2103
+ .sidebar-link { color: #f5f5f5; }
2104
+ .sidebar-link:hover { background: #2d2d2d; }
2105
+ .sidebar-link-active { background: #1e40af; color: var(--primary); }
2106
+ }
2107
+ .sidebar-link-active { background: #eff6ff; color: var(--primary); font-weight: 500; }
2108
+ .sidebar-resize-handle { position: absolute; top: 0; right: -3px; bottom: 0; width: 6px; cursor: col-resize; z-index: 10; }
2109
+ .sidebar-resize-handle:hover { background: rgba(37,99,235,0.2); }
2110
+
2111
+ /* Accordion */
2112
+ .accordion { display: flex; flex-direction: column; gap: 0; border: 1px solid #e5e7eb; border-radius: 0.5rem; overflow: hidden; }
2113
+ .accordion-item { border-bottom: 1px solid #e5e7eb; }
2114
+ .accordion-item:last-child { border-bottom: none; }
2115
+ .accordion-summary { padding: 0.75rem 1rem; font-weight: 500; cursor: pointer; -webkit-user-select: none; user-select: none; list-style: none; display: flex; align-items: center; justify-content: space-between; }
2116
+ .accordion-summary:hover { background: #f9fafb; }
2117
+ @media (prefers-color-scheme: dark) {
2118
+ .accordion { border-color: #3d3d3d; }
2119
+ .accordion-item { border-color: #3d3d3d; }
2120
+ .accordion-summary { color: #f5f5f5; }
2121
+ .accordion-summary:hover { background: #2d2d2d; }
2122
+ .accordion-summary::after { color: #9ca3af; }
2123
+ .accordion-content { border-color: #2d2d2d; color: #f5f5f5; }
2124
+ }
2125
+ .accordion-summary::marker { display: none; }
2126
+ .accordion-summary::-webkit-details-marker { display: none; }
2127
+ .accordion-summary::after { content: '\\25BC'; font-size: 0.75rem; color: #9ca3af; transition: transform 0.2s; }
2128
+ details[open] .accordion-summary::after { transform: rotate(180deg); }
2129
+ .accordion-content { padding: 0.75rem 1rem; border-top: 1px solid #f3f4f6; }
2130
+
2131
+ /* Divider */
2132
+ .divider { border: none; border-top: 1px solid #e5e7eb; margin: 1rem 0; }
2133
+ .divider-labeled { display: flex; align-items: center; gap: 0.75rem; margin: 1rem 0; }
2134
+ .divider-line { flex: 1; border: none; border-top: 1px solid #e5e7eb; }
2135
+ .divider-text { font-size: 0.75rem; color: #9ca3af; white-space: nowrap; }
2136
+
2137
+ /* Flex column utility */
2138
+ .flex-col { flex-direction: column; }
2139
+
2140
+ /* Accessibility: Focus indicators */
2141
+ .btn:focus-visible, .select:focus-visible, .input:focus-visible, .textarea:focus-visible,
2142
+ .file-input:focus-visible, .checkbox:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }
2143
+ .dialog-close:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; border-radius: 4px; }
2144
+ .ctx-item:focus-visible { outline: 2px solid #2563eb; outline-offset: -2px; }
2145
+ .cpd-swatch:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }
2146
+ .color-palette-item:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }
2147
+ .rvw-toggle-track:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; border-radius: 9999px; }
2148
+ .toggle-switch input:focus-visible + .toggle-slider { outline: 2px solid #2563eb; outline-offset: 2px; }
2149
+ .tad-row:focus-visible { outline: 2px solid #2563eb; outline-offset: -2px; }
2150
+ .review-tab:focus-visible { outline: 2px solid #2563eb; outline-offset: -2px; }
2151
+ .sidebar-link:focus-visible { outline: 2px solid #2563eb; outline-offset: -2px; }
2152
+ .accordion-summary:focus-visible { outline: 2px solid #2563eb; outline-offset: -2px; }
2153
+
2154
+ /* Accessibility: High contrast mode */
2155
+ @media (forced-colors: active) {
2156
+ .btn-primary { border: 2px solid ButtonText; }
2157
+ .badge-stage, .badge-status, .status-label { border: 1px solid ButtonText; }
2158
+ .linear-progress-bar { forced-color-adjust: none; }
2159
+ .toggle-slider { border: 1px solid ButtonText; }
2160
+ .dialog-overlay, .confirm-overlay, .modal-overlay { background: rgba(0,0,0,0.75); }
2161
+ }
2162
+
2163
+ /* Accessibility: Reduced motion */
2164
+ @media (prefers-reduced-motion: reduce) {
2165
+ *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
2166
+ .toast { animation: none; }
2167
+ .splash-spinner-ring { animation: none; }
2168
+ }
2169
+
2170
+ /* Accessibility: Screen-reader-only class */
2171
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border-width: 0; }
2172
+
2173
+ /* Accessibility: Error feedback for forms */
2174
+ [aria-invalid="true"], .input-error { border-color: #ef4444 !important; box-shadow: 0 0 0 1px #ef4444; }
2175
+ .error-message { color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem; }
2176
+ .error-message::before { content: ''; display: inline; }
2177
+
2178
+
2179
+ /* ===== MOBILE RESPONSIVE ===== */
2180
+ @media (max-width: 768px) {
2181
+ .nav-links-desktop { display: none !important; }
2182
+ .nav-hamburger { display: flex !important; }
2183
+ .p-6 { padding: 1rem !important; }
2184
+ h1 { font-size: 1.2rem !important; }
2185
+ .table-responsive { overflow-x: auto; -webkit-overflow-scrolling: touch; }
2186
+ table { min-width: 480px; }
2187
+ .card-body { padding: 0.75rem; }
2188
+ .grid-cols-2, .grid-cols-4 { grid-template-columns: 1fr !important; }
2189
+ .md\:grid-cols-3, .md\:grid-cols-4 { grid-template-columns: 1fr !important; }
2190
+ .confirm-dialog { width: 95vw; max-width: 95vw; margin: 0 auto; }
2191
+ .dialog-panel { width: 95vw !important; max-width: 95vw !important; }
2192
+ .flex-mobile-col { flex-direction: column !important; }
2193
+ .hide-mobile { display: none !important; }
2194
+ }
2195
+ @media (max-width: 640px) {
2196
+ .lg\:grid-cols-2 { grid-template-columns: 1fr !important; }
2197
+ .page-header { flex-direction: column; gap: 12px; align-items: flex-start !important; }
2198
+ .page-header > * { width: 100%; }
2199
+ .page-header a, .page-header button { width: auto; }
2200
+ input[type="text"], input[type="email"], input[type="number"], select, textarea {
2201
+ width: 100% !important; max-width: 100% !important;
2202
+ }
2203
+ }
2204
+ @media (min-width: 769px) {
2205
+ .nav-hamburger { display: none !important; }
2206
+ .nav-links-desktop { display: flex !important; }
2207
+ }
2208
+
2209
+ /* ===== GLOBAL POLISH ===== */
2210
+ :root {
2211
+ --color-primary: #04141f;
2212
+ --color-accent: #1976d2;
2213
+ --color-bg: #f7f8fa;
2214
+ --color-surface: #fff;
2215
+ --color-border: #e0e0e0;
2216
+ --color-text: #1a1a1a;
2217
+ --color-muted: #888;
2218
+ --shadow-card: 0 1px 3px rgba(0,0,0,0.1);
2219
+ --transition-fast: 0.15s ease;
2220
+ }
2221
+ body { font-size: 15px; color: var(--color-text); background: var(--color-bg); }
2222
+ @media (max-width: 768px) { body { font-size: 14px; } }
2223
+
2224
+ /* Button hover transitions */
2225
+ a[style*="background:#1976d2"], a[style*="background:#04141f"],
2226
+ button[style*="background:#1976d2"], button[style*="background:#04141f"] {
2227
+ transition: opacity var(--transition-fast), box-shadow var(--transition-fast) !important;
2228
+ }
2229
+ a[style*="background:#1976d2"]:hover, a[style*="background:#04141f"]:hover,
2230
+ button[style*="background:#1976d2"]:hover, button[style*="background:#04141f"]:hover {
2231
+ opacity: 0.9; box-shadow: 0 2px 8px rgba(0,0,0,0.2);
2232
+ }
2233
+
2234
+ /* Table hover and sticky header */
2235
+ #eng-table thead tr, #client-tbody ~ thead tr, table thead tr {
2236
+ position: sticky; top: 0; z-index: 1;
2237
+ }
2238
+ tbody tr { transition: background var(--transition-fast); }
2239
+
2240
+ /* Input focus polish */
2241
+ input:focus, select:focus, textarea:focus {
2242
+ outline: none !important;
2243
+ border-color: #04141f !important;
2244
+ box-shadow: 0 0 0 2px rgba(4,20,31,0.12) !important;
2245
+ }
2246
+
2247
+ /* Card shadow consistency */
2248
+ div[style*="box-shadow:0 1px 4px"] {
2249
+ box-shadow: var(--shadow-card) !important;
2250
+ }
2251
+
2252
+ /* Scrollbar styling */
2253
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
2254
+ ::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 3px; }
2255
+ ::-webkit-scrollbar-thumb { background: #ccc; border-radius: 3px; }
2256
+ ::-webkit-scrollbar-thumb:hover { background: #aaa; }
2257
+
2258
+ /* Loading skeleton */
2259
+ .skeleton { background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; animation: skeleton-wave 1.5s infinite; border-radius: 4px; }
2260
+ @keyframes skeleton-wave { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
2261
+
2262
+ /* Spinner for button loading states */
2263
+ .btn-spinner { display: inline-block; width: 12px; height: 12px; border: 2px solid rgba(255,255,255,0.4); border-top-color: #fff; border-radius: 50%; animation: btn-spin 0.7s linear infinite; margin-right: 6px; vertical-align: middle; }
2264
+ @keyframes btn-spin { to { transform: rotate(360deg); } }
2265
+
2266
+ /* Empty state polish */
2267
+ .empty-state-icon { opacity: 0.4; }
2268
+
2269
+ /* Page title consistency */
2270
+ h1[style*="font-size:1.4rem"] { font-size: 1.25rem !important; font-weight: 700 !important; color: #04141f !important; }
2271
+
2272
+ /* Badge/pill consistency */
2273
+ span[style*="border-radius:10px"] { border-radius: 4px !important; }
2274
+ span[style*="border-radius:4px"] { padding: 2px 8px !important; font-size: 0.72rem !important; }
2275
+
2276
+
2277
+ /* ===== STATS COMPONENT (DaisyUI-compatible, used by dashboard & client detail) ===== */
2278
+ .stats { display: flex; flex-wrap: wrap; width: 100%; background: white; border-radius: 0.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 1.5rem; overflow: hidden; }
2279
+ .stat { display: flex; flex-direction: column; padding: 1.25rem 1.5rem; flex: 1; min-width: 140px; border-right: 1px solid #f3f4f6; cursor: pointer; text-decoration: none; color: inherit; transition: background 0.15s; }
2280
+ .stat:last-child { border-right: none; }
2281
+ .stat:hover { background: #f9fafb; }
2282
+ @media (prefers-color-scheme: dark) {
2283
+ .stat:hover { background: #2d2d2d; }
2284
+ }
2285
+ .stat-title { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: #6b7280; margin-bottom: 0.25rem; white-space: nowrap; }
2286
+ .stat-value { font-size: 2rem; font-weight: 700; color: #111827; line-height: 1.2; }
2287
+ .stat-desc { font-size: 0.75rem; color: #9ca3af; margin-top: 0.25rem; }
2288
+ .stat-value.text-error { color: #ef4444; }
2289
+ .stat-value.text-primary { color: #2563eb; }
2290
+ .stat-value.text-success { color: #22c55e; }
2291
+ @media (max-width: 640px) {
2292
+ .stats { flex-direction: column; }
2293
+ .stat { border-right: none; border-bottom: 1px solid #f3f4f6; }
2294
+ .stat:last-child { border-bottom: none; }
2295
+ }
2296
+
2297
+ /* ===== RESPONSIVE GRID UTILITIES ===== */
2298
+ @media (min-width: 640px) {
2299
+ .sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2300
+ .sm\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
2301
+ }
2302
+ @media (min-width: 768px) {
2303
+ .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2304
+ .md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
2305
+ .md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
2306
+ .md\:p-6 { padding: 1.5rem; }
2307
+ }
2308
+ @media (min-width: 1024px) {
2309
+ .lg\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2310
+ .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
2311
+ .lg\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
2312
+ }
2313
+
2314
+ /* ===== BREADCRUMB FIX (bullet list style used in some renderers) ===== */
2315
+ nav.breadcrumbs ul { display: flex; align-items: center; flex-wrap: wrap; gap: 0.25rem; padding: 0; margin: 0 0 1rem 0; list-style: none; font-size: 1rem; color: #6b7280; }
2316
+ nav.breadcrumbs ul li { display: flex; align-items: center; gap: 0.25rem; }
2317
+ nav.breadcrumbs ul li::before { content: '/'; color: #9ca3af; margin-right: 0.25rem; }
2318
+ nav.breadcrumbs ul li:first-child::before { display: none; }
2319
+ nav.breadcrumbs ul li a { color: #2563eb; text-decoration: none; }
2320
+ nav.breadcrumbs ul li a:hover { text-decoration: underline; }
2321
+
2322
+ /* ===== SHADOW UTILITY ===== */
2323
+ .shadow-md { box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06); }
2324
+ .hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05); }
2325
+ .transition-shadow { transition: box-shadow 0.15s ease; }
2326
+
2327
+
2328
+ /* ===== MISSING UTILITY CLASSES ===== */
2329
+ .ml-1 { margin-left: 0.25rem; }
2330
+ .ml-2 { margin-left: 0.5rem; }
2331
+ .mr-1 { margin-right: 0.25rem; }
2332
+ .mr-2 { margin-right: 0.5rem; }
2333
+ .gap-1 { gap: 0.25rem; }
2334
+ .gap-3 { gap: 0.75rem; }
2335
+ .gap-5 { gap: 1.25rem; }
2336
+ .gap-6 { gap: 1.5rem; }
2337
+ .min-w-8 { min-width: 2rem; }
2338
+ .min-w-48 { min-width: 12rem; }
2339
+ .max-w-48 { max-width: 12rem; }
2340
+ .max-w-40 { max-width: 10rem; }
2341
+ .flex-1 { flex: 1 1 0%; }
2342
+ .flex-shrink-0 { flex-shrink: 0; }
2343
+ .flex-col { flex-direction: column; }
2344
+ .min-h-48 { min-height: 12rem; }
2345
+ .max-h-96 { max-height: 24rem; }
2346
+ .max-h-screen { max-height: 100vh; }
2347
+ .overflow-y-auto { overflow-y: auto; }
2348
+ .overflow-x-auto { overflow-x: auto; }
2349
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2350
+ .whitespace-nowrap { white-space: nowrap; }
2351
+ .font-semibold { font-weight: 600; }
2352
+ .text-base { font-size: 1rem; }
2353
+ .tracking-wider { letter-spacing: 0.05em; }
2354
+ .uppercase { text-transform: uppercase; }
2355
+ .border { border: 1px solid #e5e7eb; }
2356
+ .border-t { border-top: 1px solid #e5e7eb; }
2357
+ .border-b { border-bottom: 1px solid #e5e7eb; }
2358
+ .rounded { border-radius: 0.25rem; }
2359
+ .rounded-sm { border-radius: 0.25rem; }
2360
+ .h-4 { height: 1rem; }
2361
+ .h-8 { height: 2rem; }
2362
+ .w-4 { width: 1rem; }
2363
+ .w-8 { width: 2rem; }
2364
+ .w-5 { width: 1.25rem; }
2365
+ .h-5 { height: 1.25rem; }
2366
+ .w-6 { width: 1.5rem; }
2367
+ .h-6 { height: 1.5rem; }
2368
+ .p-0 { padding: 0; }
2369
+ .p-3 { padding: 0.75rem; }
2370
+ .p-4 { padding: 1rem; }
2371
+ .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
2372
+ .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }
2373
+ .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; }
2374
+ .pt-3 { padding-top: 0.75rem; }
2375
+ .pb-3 { padding-bottom: 0.75rem; }
2376
+ .mt-1 { margin-top: 0.25rem; }
2377
+ .mt-3 { margin-top: 0.75rem; }
2378
+ .mb-1 { margin-bottom: 0.25rem; }
2379
+ .mb-3 { margin-bottom: 0.75rem; }
2380
+ .col-span-full { grid-column: 1 / -1; }
2381
+ .transition-colors { transition: background-color 0.15s ease, color 0.15s ease; }
2382
+ .transition { transition: all 0.15s ease; }
2383
+ .opacity-30 { opacity: 0.3; }
2384
+ .inset-0 { inset: 0; }
2385
+ .last\:border-0:last-child { border: 0; }
2386
+
2387
+ /* Tab count badge */
2388
+ .tab .badge { display: inline-flex; align-items: center; justify-content: center; min-width: 1.25rem; height: 1.25rem; padding: 0 0.5rem; border-radius: 9999px; background: rgba(0,0,0,0.15); color: inherit; font-size: 0.7rem; font-weight: 600; margin-left: 0.25rem; }
2389
+ .tab-active .badge { background: rgba(255,255,255,0.3); }
2390
+ .badge-sm { font-size: 0.65rem; padding: 0.1rem 0.4rem; }
2391
+
2392
+ /* Alert component */
2393
+ .alert { padding: 1rem; border-radius: 0.5rem; display: flex; align-items: center; gap: 0.75rem; margin-bottom: 1rem; }
2394
+ .alert-error { background: #fee2e2; color: #991b1b; border: 1px solid #fecaca; }
2395
+ .alert-warning { background: #fef3c7; color: #92400e; border: 1px solid #fde68a; }
2396
+ .alert-success { background: #d1fae5; color: #065f46; border: 1px solid #a7f3d0; }
2397
+ .alert-info { background: #dbeafe; color: #1e40af; border: 1px solid #bfdbfe; }
2398
+
2399
+ /* Progress bar */
2400
+ .progress { width: 100%; height: 0.5rem; border-radius: 9999px; background: #e5e7eb; overflow: hidden; appearance: none; -webkit-appearance: none; display: block; }
2401
+ .progress::-webkit-progress-bar { background: #e5e7eb; border-radius: 9999px; }
2402
+ .progress::-webkit-progress-value { background: #2563eb; border-radius: 9999px; }
2403
+ .progress::-moz-progress-bar { background: #2563eb; border-radius: 9999px; }
2404
+ .progress-primary::-webkit-progress-value { background: #2563eb; }
2405
+ .progress-primary::-moz-progress-bar { background: #2563eb; }
2406
+
2407
+ /* Text color utilities */
2408
+ .text-base-content { color: #111827; }
2409
+ .text-base-content\/60 { color: rgba(17,24,39,0.6); }
2410
+ .text-base-content\/50 { color: rgba(17,24,39,0.5); }
2411
+ .text-base-content\/40 { color: rgba(17,24,39,0.4); }
2412
+ .text-base-content\/30 { color: rgba(17,24,39,0.3); }
2413
+ .text-primary { color: #2563eb; }
2414
+ .text-error { color: #ef4444; }
2415
+ .text-success { color: #22c55e; }
2416
+ .text-warning { color: #f59e0b; }
2417
+
2418
+ /* Background utilities */
2419
+ .bg-base-100 { background-color: #ffffff; }
2420
+ .bg-base-200 { background-color: #f3f4f6; }
2421
+ .bg-base-50 { background-color: #f9fafb; }
2422
+ .bg-primary\/10 { background-color: rgba(37,99,235,0.1); }
2423
+ .hover\:bg-base-200:hover { background-color: #f3f4f6; }
2424
+
2425
+ /* Card component */
2426
+ .card { background: white; border-radius: 0.5rem; overflow: hidden; }
2427
+ .card-body { padding: 1.25rem; }
2428
+ .card-title { font-size: 1.125rem; font-weight: 600; color: #111827; margin-bottom: 0.5rem; display: flex; align-items: center; gap: 0.5rem; }
2429
+
2430
+ /* Table component */
2431
+ .table { width: 100%; border-collapse: collapse; }
2432
+ .table th { padding: 0.75rem 1rem; text-align: left; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: #6b7280; background: #f9fafb; border-bottom: 1px solid #e5e7eb; }
2433
+ .table td { padding: 0.75rem 1rem; border-bottom: 1px solid #f3f4f6; }
2434
+ .table-hover tbody tr:hover { background: #f9fafb; }
2435
+ .table-container { overflow-x: auto; }
2436
+
2437
+ /* Modal */
2438
+ .modal { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 200; align-items: center; justify-content: center; }
2439
+ .modal-content { background: white; border-radius: 0.75rem; padding: 1.5rem; max-width: 90vw; max-height: 90vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0,0,0,0.2); }
2440
+ .modal-action { display: flex; gap: 0.5rem; justify-content: flex-end; margin-top: 1rem; }
2441
+ .modal-overlay { position: absolute; inset: 0; }
2442
+ .rounded-box { border-radius: 0.75rem; }
2443
+
2444
+ /* Tabs */
2445
+ .tabs { display: flex; flex-wrap: wrap; gap: 0.25rem; }
2446
+ .tabs-boxed { background: #f3f4f6; padding: 0.25rem; border-radius: 0.5rem; }
2447
+ .tab { padding: 0.5rem 1rem; border-radius: 0.5rem; font-size: 0.8rem; font-weight: 500; cursor: pointer; border: none; background: none; color: #6b7280; transition: background 0.15s, color 0.15s; white-space: nowrap; display: inline-flex; align-items: center; }
2448
+ .tab:hover { background: rgba(0,0,0,0.05); color: #374151; }
2449
+ @media (prefers-color-scheme: dark) {
2450
+ .tab:hover { background: rgba(255,255,255,0.08); color: #f5f5f5; }
2451
+ }
2452
+ .tab-active { background: white; color: #111827; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-weight: 600; }
2453
+
2454
+ /* Input/Select/Textarea */
2455
+ .input, .select, .textarea { border: 1px solid #e5e7eb; border-radius: 0.5rem; padding: 0.5rem 0.75rem; font-size: 1rem; width: 100%; background: white; color: #111827; }
2456
+ .input:focus, .select:focus, .textarea:focus { border-color: #2563eb; outline: none; box-shadow: 0 0 0 2px rgba(37,99,235,0.15); }
2457
+ .input-solid, .select-solid, .textarea-solid { background: #f9fafb; }
2458
+ .max-w-full { max-width: 100%; }
2459
+
2460
+ /* Form */
2461
+ .form-group { margin-bottom: 1rem; }
2462
+ .label { display: flex; flex-direction: column; margin-bottom: 0.25rem; }
2463
+ .label-text { font-size: 1rem; font-weight: 500; color: #374151; }
2464
+ .checkbox { width: 1rem; height: 1rem; cursor: pointer; accent-color: #2563eb; }
2465
+ .checkbox-primary { accent-color: #2563eb; }
2466
+
2467
+ /* Divider */
2468
+ .divider { display: flex; align-items: center; gap: 0.75rem; margin: 1rem 0; }
2469
+ .divider::before, .divider::after { content: ''; flex: 1; border-top: 1px solid #e5e7eb; }
2470
+
2471
+ /* Hidden */
2472
+ .hidden { display: none !important; }
2473
+
2474
+ /* Button base if not from RippleUI */
2475
+ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.5rem 1rem; border-radius: 0.5rem; font-size: 1rem; font-weight: 500; cursor: pointer; border: none; transition: background 0.15s, opacity 0.15s; text-decoration: none; }
2476
+
2477
+
2478
+ /* ===== BUTTON VARIANT FIXES ===== */
2479
+ .btn-outline-primary { background: transparent; color: #2563eb; border: 1px solid #2563eb; }
2480
+ .btn-outline-primary:hover { background: #2563eb; color: white; }
2481
+ .btn-ghost { background: transparent; color: #374151; border: 1px solid #d1d5db; }
2482
+ .btn-ghost:hover { background: #f3f4f6; border-color: #9ca3af; }
2483
+ .btn-xs { padding: 0.2rem 0.6rem; font-size: 0.75rem; border-radius: 0.25rem; min-height: 28px; }
2484
+ .btn-sm { padding: 0.35rem 0.75rem; font-size: 0.8rem; border-radius: 0.5rem; min-height: 32px; }
2485
+ .btn-primary { background: #2563eb; color: white; border: 1px solid #2563eb; }
2486
+ .btn-primary:hover { background: #1d4ed8; border-color: #1d4ed8; }
2487
+ .btn-error { background: #ef4444; color: white; border: 1px solid #ef4444; }
2488
+ .btn-error:hover { background: #dc2626; border-color: #dc2626; }
2489
+ .btn-success { background: #22c55e; color: white; border: 1px solid #22c55e; }
2490
+ .btn-warning { background: #f59e0b; color: white; border: 1px solid #f59e0b; }
2491
+
2492
+ /* ===== DARK MODE COMPONENT OVERRIDES ===== */
2493
+ @media (prefers-color-scheme: dark) {
2494
+ .modal-dialog, .confirm-dialog, .modal-content, .dialog-panel, .modal-confirm-dialog {
2495
+ background: #1a1a1a; color: #f5f5f5; border: 1px solid #3d3d3d;
2496
+ }
2497
+ .sidebar-review-panel, .sidebar-collapsible, .mobile-nav-drawer {
2498
+ background: #1a1a1a; border-color: #3d3d3d;
2499
+ }
2500
+ .settings-card, .integration-card { background: #1a1a1a; border-color: #3d3d3d; color: #f5f5f5; }
2501
+ .review-ctx-menu, .ts-dropdown { background: #1a1a1a; border-color: #3d3d3d; }
2502
+ .act-tl-content { background: #2d2d2d; border-color: #3d3d3d; }
2503
+ .date-preset-btn { background: #2d2d2d; border-color: #3d3d3d; color: #f5f5f5; }
2504
+ .date-preset-btn:hover { background: #4d4d4d; }
2505
+ .splash-screen { background: #0f172a; }
2506
+ .stats { background: #1a1a1a; }
2507
+ .card { background: #1a1a1a; border-color: #3d3d3d; }
2508
+ .tab-active { background: #2d2d2d; color: #f5f5f5; }
2509
+ .input, .select, .textarea { background: #1a1a1a; color: #f5f5f5; border-color: #3d3d3d; }
2510
+ .modal-form-group input, .modal-form-group select, .modal-form-group textarea {
2511
+ background: #2d2d2d; color: #f5f5f5; border-color: #3d3d3d;
2512
+ }
2513
+ .card-clean { background: #1a1a1a; border-color: #3d3d3d; }
2514
+ .card-clean-body { color: #f5f5f5; }
2515
+ .table-hover tbody tr:hover { background: #2d2d2d; }
2516
+ .rvw-toggle-knob { background: #f5f5f5; }
2517
+ .badge-stage[data-stage="info_gathering"],
2518
+ .badge-stage[data-stage="commencement"] { background: #1e3a8a !important; color: #60a5fa !important; }
2519
+ .badge-stage[data-stage="team_execution"],
2520
+ .badge-stage[data-stage="partner_review"] { background: #78350f !important; color: #fbbf24 !important; }
2521
+ .badge-stage[data-stage="finalization"],
2522
+ .badge-stage[data-stage="closeout"] { background: #064e3b !important; color: #34d399 !important; }
2523
+ .stage-pill[data-stage="info_gathering"],
2524
+ .stage-pill[data-stage="commencement"] { background: #1e3a8a !important; color: #60a5fa !important; }
2525
+ .stage-pill[data-stage="team_execution"],
2526
+ .stage-pill[data-stage="partner_review"] { background: #78350f !important; color: #fbbf24 !important; }
2527
+ .stage-pill[data-stage="finalization"],
2528
+ .stage-pill[data-stage="closeout"] { background: #064e3b !important; color: #34d399 !important; }
2529
+ }
2530
+