evaldoc 1.0.0

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 (139) hide show
  1. package/.env.staging.example +19 -0
  2. package/.firebaserc +6 -0
  3. package/.github/workflows/auto-merge-to-main.yml +28 -0
  4. package/.github/workflows/ci.yml +27 -0
  5. package/.github/workflows/npxhub-publish.yml +170 -0
  6. package/.prettierignore +4 -0
  7. package/.prettierrc.json +7 -0
  8. package/README.md +142 -0
  9. package/SRS.md +448 -0
  10. package/apphosting.staging.yaml +48 -0
  11. package/apphosting.yaml +50 -0
  12. package/bin/evaldoc.cjs +105 -0
  13. package/cors.json +8 -0
  14. package/docs/ARCHITECTURE.md +769 -0
  15. package/docs/ARCHITECTURE_SUMMARY.md +323 -0
  16. package/docs/DEPLOYMENT.md +86 -0
  17. package/docs/DEPLOYMENT_STEPS.md +373 -0
  18. package/docs/DEPLOY_FIRESTORE_RULES.md +239 -0
  19. package/docs/DEPLOY_STORAGE_RULES.md +82 -0
  20. package/docs/DOCTOR_TUTORIAL.md +467 -0
  21. package/docs/FIREBASE_STORAGE_CORS_FIX.md +131 -0
  22. package/docs/FIXES_APPLIED.md +128 -0
  23. package/docs/IMPLEMENTATION.md +498 -0
  24. package/docs/IMPLEMENTATION_COMPLETE.md +317 -0
  25. package/docs/LLM-SETUP.md +216 -0
  26. package/docs/MANUAL_TEST_GUIDE.md +327 -0
  27. package/docs/PATIENT_GUIDE.md +451 -0
  28. package/docs/PLATFORM_OVERVIEW.md +194 -0
  29. package/docs/QUICKSTART.md +252 -0
  30. package/docs/QUICK_REFERENCE.md +222 -0
  31. package/docs/READY_TO_TEST.md +383 -0
  32. package/docs/RUN.md +237 -0
  33. package/docs/START_TESTING.md +130 -0
  34. package/docs/STRIPE_CONNECT_SETUP.md +454 -0
  35. package/docs/SYSTEM_READY.md +345 -0
  36. package/docs/THREADS_IMPLEMENTATION_COMPLETE.md +431 -0
  37. package/docs/THREAD_IMPLEMENTATION_GUIDE.md +345 -0
  38. package/docs/firebasefiles.md +21 -0
  39. package/docs/homepage.md +1208 -0
  40. package/docs/payments.md +159 -0
  41. package/eslint.config.js +76 -0
  42. package/firebase.json +27 -0
  43. package/firestore.indexes.json +88 -0
  44. package/firestore.rules +125 -0
  45. package/functions/package-lock.json +2884 -0
  46. package/functions/package.json +20 -0
  47. package/functions/src/analytics.js +101 -0
  48. package/functions/src/audit.js +28 -0
  49. package/functions/src/auth.js +19 -0
  50. package/functions/src/drafts.js +128 -0
  51. package/functions/src/feedback.js +164 -0
  52. package/functions/src/firebase-init.js +29 -0
  53. package/functions/src/i18n.js +134 -0
  54. package/functions/src/limits.js +27 -0
  55. package/functions/src/llm.js +271 -0
  56. package/functions/src/ner.js +162 -0
  57. package/functions/src/notifications.js +273 -0
  58. package/functions/src/orgs.js +127 -0
  59. package/functions/src/patient-api.js +545 -0
  60. package/functions/src/payment.js +830 -0
  61. package/functions/src/safety.js +188 -0
  62. package/functions/src/stripe-config.js +33 -0
  63. package/functions/src/topics.js +94 -0
  64. package/functions/src/triage.js +191 -0
  65. package/functions/src/utils.js +28 -0
  66. package/functions/src/validate.js +177 -0
  67. package/functions/test-firebase.js +36 -0
  68. package/jest.config.js +18 -0
  69. package/package.json +52 -0
  70. package/public/404.html +93 -0
  71. package/public/app/analytics.html +336 -0
  72. package/public/app/analytics.js +177 -0
  73. package/public/app/app.css +1400 -0
  74. package/public/app/app.js +1754 -0
  75. package/public/app/config.js +14 -0
  76. package/public/app/inbox-threads.js +843 -0
  77. package/public/app/inbox.html +598 -0
  78. package/public/app/inbox.js +397 -0
  79. package/public/app/index.html +612 -0
  80. package/public/assets/logo.jpg +0 -0
  81. package/public/chat.html +137 -0
  82. package/public/css/chat.css +870 -0
  83. package/public/css/landing-enhance.css +298 -0
  84. package/public/css/styles.css +1198 -0
  85. package/public/favicon.svg +5 -0
  86. package/public/find-doctor.html +220 -0
  87. package/public/index.html +399 -0
  88. package/public/js/chat-threads.js +513 -0
  89. package/public/js/chat.js +832 -0
  90. package/public/js/search.js +41 -0
  91. package/public/privacy.html +101 -0
  92. package/public/robots.txt +6 -0
  93. package/public/site.webmanifest +12 -0
  94. package/public/terms.html +110 -0
  95. package/scripts/create-test-provider.js +55 -0
  96. package/scripts/deploy-staging.sh +51 -0
  97. package/scripts/fix-provider.js +39 -0
  98. package/scripts/quick-test.sh +37 -0
  99. package/scripts/test-chat.sh +54 -0
  100. package/scripts/test-multi-turn.js +137 -0
  101. package/scripts/test-ner-simple.js +28 -0
  102. package/scripts/test-ner.js +60 -0
  103. package/scripts/test-stripe-connect.js +304 -0
  104. package/scripts/test-webhook-secret.sh +24 -0
  105. package/server.js +3864 -0
  106. package/storage.rules +22 -0
  107. package/test-api.json +1 -0
  108. package/tests/emulator/README.md +38 -0
  109. package/tests/emulator/counters.emulator.test.js +81 -0
  110. package/tests/integration/api-account-selfserve.test.js +312 -0
  111. package/tests/integration/api-admin-digest.test.js +202 -0
  112. package/tests/integration/api-chat-satisfaction.test.js +259 -0
  113. package/tests/integration/api-doctor-drafts.test.js +236 -0
  114. package/tests/integration/api-doctor-inbox.test.js +401 -0
  115. package/tests/integration/api-org.test.js +328 -0
  116. package/tests/integration/api-payment.test.js +664 -0
  117. package/tests/integration/api-provider-settings.test.js +475 -0
  118. package/tests/integration/api-qr.test.js +121 -0
  119. package/tests/integration/api-security.test.js +241 -0
  120. package/tests/integration/api-stripe-search.test.js +303 -0
  121. package/tests/integration/api-webhook-deletion.test.js +231 -0
  122. package/tests/mocks/firebase-admin.js +220 -0
  123. package/tests/unit/analytics.test.js +151 -0
  124. package/tests/unit/audit-bugs.test.js +203 -0
  125. package/tests/unit/chat-ui-logic.test.js +283 -0
  126. package/tests/unit/drafts.test.js +104 -0
  127. package/tests/unit/feedback.test.js +148 -0
  128. package/tests/unit/i18n.test.js +229 -0
  129. package/tests/unit/llm-retry.test.js +122 -0
  130. package/tests/unit/notifications.test.js +155 -0
  131. package/tests/unit/orgs.test.js +328 -0
  132. package/tests/unit/payment.test.js +889 -0
  133. package/tests/unit/safety-edge-cases.test.js +509 -0
  134. package/tests/unit/safety-srs-compliance.test.js +252 -0
  135. package/tests/unit/safety.test.js +291 -0
  136. package/tests/unit/server-helpers.test.js +774 -0
  137. package/tests/unit/topics-limits.test.js +158 -0
  138. package/tests/unit/triage.test.js +152 -0
  139. package/tests/unit/validate.test.js +408 -0
@@ -0,0 +1,1400 @@
1
+ /* EvalDoc Provider Console - Feyti Medical Group Theme */
2
+
3
+ :root {
4
+ /* Feyti Medical Group Brand Colors */
5
+ --primary: #297b56;
6
+ --primary-dark: #1e5c40;
7
+ --primary-light: #3a9d6f;
8
+ --accent: #297b56;
9
+ --background: #fbfbfb;
10
+
11
+ /* Neutral Colors */
12
+ --ink: #111827;
13
+ --muted: rgba(17, 24, 39, 0.6);
14
+ --gray-50: #f9fafb;
15
+ --gray-100: #f3f4f6;
16
+ --gray-200: #e5e7eb;
17
+ --gray-400: #9ca3af;
18
+ --gray-600: #4b5563;
19
+ --gray-800: #1f2937;
20
+ --gray-900: #111827;
21
+ --white: #ffffff;
22
+
23
+ /* Status Colors */
24
+ --danger: #dc2626;
25
+ --success: #297b56;
26
+ --warning: #f59e0b;
27
+
28
+ /* Shadows & Effects */
29
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
30
+ --shadow: 0 4px 6px rgba(0, 0, 0, 0.07);
31
+ --shadow-lg: 0 10px 25px rgba(0, 0, 0, 0.1);
32
+ --radius: 12px;
33
+ --radius-sm: 8px;
34
+ --radius-lg: 16px;
35
+ --transition: all 0.2s ease;
36
+ }
37
+
38
+ * {
39
+ box-sizing: border-box;
40
+ margin: 0;
41
+ padding: 0;
42
+ }
43
+
44
+ body {
45
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
46
+ sans-serif;
47
+ color: var(--ink);
48
+ min-height: 100vh;
49
+ background: var(--background);
50
+ -webkit-font-smoothing: antialiased;
51
+ line-height: 1.6;
52
+ }
53
+
54
+ .dashboard-bg {
55
+ position: fixed;
56
+ inset: 0;
57
+ background: linear-gradient(
58
+ 135deg,
59
+ rgba(41, 123, 86, 0.03) 0%,
60
+ transparent 60%
61
+ ),
62
+ radial-gradient(
63
+ circle at 80% 20%,
64
+ rgba(41, 123, 86, 0.05) 0%,
65
+ transparent 50%
66
+ );
67
+ z-index: -1;
68
+ }
69
+
70
+ /* Topbar */
71
+ .topbar {
72
+ padding: 1.25rem 4rem;
73
+ display: flex;
74
+ justify-content: space-between;
75
+ align-items: center;
76
+ background: rgba(255, 255, 255, 0.95);
77
+ backdrop-filter: blur(10px);
78
+ border-bottom: 1px solid var(--gray-200);
79
+ position: sticky;
80
+ top: 0;
81
+ z-index: 100;
82
+ }
83
+
84
+ .brand {
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 1rem;
88
+ }
89
+
90
+ .logo-img {
91
+ height: 50px;
92
+ width: auto;
93
+ object-fit: contain;
94
+ border-radius: 8px;
95
+ }
96
+
97
+ .pill {
98
+ background: var(--primary);
99
+ color: white;
100
+ padding: 0.5rem 1rem;
101
+ border-radius: 999px;
102
+ font-weight: 600;
103
+ font-size: 0.9rem;
104
+ letter-spacing: 0.02em;
105
+ }
106
+
107
+ .subtitle {
108
+ font-size: 0.95rem;
109
+ color: var(--muted);
110
+ font-weight: 500;
111
+ }
112
+
113
+ /* Container */
114
+ .container {
115
+ max-width: 1200px;
116
+ margin: 2rem auto 4rem;
117
+ padding: 0 2rem;
118
+ display: grid;
119
+ gap: 2rem;
120
+ }
121
+
122
+ /* Cards */
123
+ .card {
124
+ background: var(--white);
125
+ padding: 2rem;
126
+ border-radius: var(--radius);
127
+ box-shadow: var(--shadow);
128
+ border: 1px solid var(--gray-200);
129
+ }
130
+
131
+ /* Typography */
132
+ h1 {
133
+ font-size: 2.25rem;
134
+ font-weight: 700;
135
+ margin-bottom: 0.5rem;
136
+ color: var(--primary);
137
+ }
138
+
139
+ h2 {
140
+ font-size: 1.5rem;
141
+ font-weight: 600;
142
+ margin-bottom: 1rem;
143
+ color: var(--ink);
144
+ }
145
+
146
+ h3 {
147
+ font-size: 1.25rem;
148
+ font-weight: 600;
149
+ margin-bottom: 0.75rem;
150
+ color: var(--ink);
151
+ }
152
+
153
+ p {
154
+ color: var(--muted);
155
+ margin-bottom: 1rem;
156
+ line-height: 1.6;
157
+ }
158
+
159
+ /* Forms */
160
+ .auth-grid {
161
+ display: grid;
162
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
163
+ gap: 2rem;
164
+ margin-top: 1.5rem;
165
+ }
166
+
167
+ .form {
168
+ display: grid;
169
+ gap: 1.5rem;
170
+ }
171
+
172
+ .grid {
173
+ display: grid;
174
+ gap: 1.5rem;
175
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
176
+ }
177
+
178
+ .grid-2 {
179
+ display: grid;
180
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
181
+ gap: 1.5rem;
182
+ }
183
+
184
+ label {
185
+ display: flex;
186
+ flex-direction: column;
187
+ gap: 0.5rem;
188
+ font-weight: 500;
189
+ font-size: 0.95rem;
190
+ color: var(--ink);
191
+ }
192
+
193
+ input[type="text"],
194
+ input[type="email"],
195
+ input[type="password"],
196
+ input[type="number"],
197
+ textarea,
198
+ select {
199
+ padding: 0.75rem 1rem;
200
+ border: 2px solid var(--gray-200);
201
+ border-radius: var(--radius);
202
+ font-size: 1rem;
203
+ font-family: inherit;
204
+ transition: var(--transition);
205
+ background: var(--white);
206
+ color: var(--ink);
207
+ }
208
+
209
+ input[type="text"]:focus,
210
+ input[type="email"]:focus,
211
+ input[type="password"]:focus,
212
+ input[type="number"]:focus,
213
+ textarea:focus,
214
+ select:focus {
215
+ outline: none;
216
+ border-color: var(--primary);
217
+ box-shadow: 0 0 0 3px rgba(41, 123, 86, 0.1);
218
+ }
219
+
220
+ input[type="file"] {
221
+ padding: 0.5rem;
222
+ border: 2px dashed var(--gray-200);
223
+ border-radius: var(--radius);
224
+ font-size: 0.95rem;
225
+ cursor: pointer;
226
+ transition: var(--transition);
227
+ }
228
+
229
+ input[type="file"]:hover {
230
+ border-color: var(--primary);
231
+ background: rgba(41, 123, 86, 0.02);
232
+ }
233
+
234
+ textarea {
235
+ min-height: 100px;
236
+ resize: vertical;
237
+ }
238
+
239
+ /* Buttons */
240
+ button {
241
+ padding: 0.875rem 1.5rem;
242
+ background: var(--primary);
243
+ color: white;
244
+ border: none;
245
+ border-radius: var(--radius);
246
+ font-size: 1rem;
247
+ font-weight: 600;
248
+ cursor: pointer;
249
+ transition: var(--transition);
250
+ font-family: inherit;
251
+ }
252
+
253
+ button:hover {
254
+ background: var(--primary-dark);
255
+ transform: translateY(-1px);
256
+ box-shadow: var(--shadow);
257
+ }
258
+
259
+ button:active {
260
+ transform: translateY(0);
261
+ }
262
+
263
+ button:disabled {
264
+ opacity: 0.5;
265
+ cursor: not-allowed;
266
+ transform: none;
267
+ }
268
+
269
+ button.secondary {
270
+ background: var(--white);
271
+ color: var(--primary);
272
+ border: 2px solid var(--primary);
273
+ }
274
+
275
+ button.secondary:hover {
276
+ background: var(--gray-100);
277
+ }
278
+
279
+ button.ghost {
280
+ background: transparent;
281
+ color: var(--primary);
282
+ border: 1px solid var(--gray-200);
283
+ }
284
+
285
+ button.ghost:hover {
286
+ background: var(--gray-100);
287
+ border-color: var(--primary);
288
+ }
289
+
290
+ /* Navigation Links */
291
+ .nav-links {
292
+ display: flex;
293
+ gap: 1rem;
294
+ margin-bottom: 1.5rem;
295
+ }
296
+
297
+ .nav-link {
298
+ color: rgba(255, 255, 255, 0.6);
299
+ text-decoration: none;
300
+ padding: 0.5rem 1rem;
301
+ border-radius: 6px;
302
+ transition: all 0.2s;
303
+ font-size: 0.95rem;
304
+ font-weight: 500;
305
+ }
306
+
307
+ .nav-link:hover {
308
+ background: rgba(255, 255, 255, 0.05);
309
+ color: #4fb3a4;
310
+ }
311
+
312
+ .nav-link.active {
313
+ background: rgba(79, 179, 164, 0.2);
314
+ color: #4fb3a4;
315
+ }
316
+
317
+ /* Utility Classes */
318
+ .hidden {
319
+ display: none !important;
320
+ }
321
+
322
+ .hint {
323
+ font-size: 0.875rem;
324
+ color: var(--muted);
325
+ margin-top: 0.25rem;
326
+ }
327
+
328
+ .error {
329
+ color: #dc2626;
330
+ font-size: 0.875rem;
331
+ margin-top: 0.5rem;
332
+ }
333
+
334
+ /* Stats */
335
+ .stats {
336
+ display: grid;
337
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
338
+ gap: 1.5rem;
339
+ margin: 1.5rem 0;
340
+ }
341
+
342
+ .stats > div {
343
+ display: flex;
344
+ flex-direction: column;
345
+ gap: 0.5rem;
346
+ }
347
+
348
+ .stat-label {
349
+ font-size: 0.875rem;
350
+ color: var(--muted);
351
+ font-weight: 500;
352
+ }
353
+
354
+ .stat {
355
+ font-size: 2rem;
356
+ font-weight: 700;
357
+ color: var(--primary);
358
+ }
359
+
360
+ /* Share Link */
361
+ .share-link {
362
+ background: var(--gray-100);
363
+ padding: 1rem;
364
+ border-radius: var(--radius);
365
+ font-family: "SF Mono", "Monaco", monospace;
366
+ font-size: 0.9rem;
367
+ word-break: break-all;
368
+ margin: 1rem 0;
369
+ color: var(--ink);
370
+ border: 1px solid var(--gray-200);
371
+ }
372
+
373
+ #qrCanvas {
374
+ display: block;
375
+ margin: 1.5rem auto;
376
+ border-radius: var(--radius);
377
+ border: 2px solid var(--gray-200);
378
+ padding: 0.5rem;
379
+ background: white;
380
+ }
381
+
382
+ /* Topics */
383
+ .topics {
384
+ display: flex;
385
+ flex-wrap: wrap;
386
+ gap: 0.75rem;
387
+ margin: 1rem 0;
388
+ }
389
+
390
+ .topic-tag {
391
+ background: var(--gray-100);
392
+ padding: 0.5rem 1rem;
393
+ border-radius: 999px;
394
+ font-size: 0.875rem;
395
+ display: flex;
396
+ align-items: center;
397
+ gap: 0.5rem;
398
+ border: 1px solid var(--gray-200);
399
+ transition: var(--transition);
400
+ }
401
+
402
+ .topic-tag:hover {
403
+ border-color: var(--primary);
404
+ background: rgba(41, 123, 86, 0.05);
405
+ }
406
+
407
+ .topic-remove {
408
+ cursor: pointer;
409
+ font-weight: 700;
410
+ color: var(--muted);
411
+ transition: var(--transition);
412
+ }
413
+
414
+ .topic-remove:hover {
415
+ color: #dc2626;
416
+ }
417
+
418
+ .topic-chip {
419
+ display: inline-flex;
420
+ align-items: center;
421
+ gap: 0.4rem;
422
+ padding: 0.45rem 0.9rem;
423
+ border-radius: 999px;
424
+ font-size: 0.85rem;
425
+ cursor: pointer;
426
+ border: 1px solid var(--gray-300);
427
+ background: var(--gray-100);
428
+ color: var(--muted);
429
+ opacity: 0.7;
430
+ transition: var(--transition);
431
+ }
432
+
433
+ .topic-chip:hover {
434
+ border-color: var(--primary);
435
+ opacity: 1;
436
+ }
437
+
438
+ .topic-chip.topic-active {
439
+ background: rgba(41, 123, 86, 0.08);
440
+ border-color: var(--primary);
441
+ color: var(--primary);
442
+ opacity: 1;
443
+ font-weight: 500;
444
+ }
445
+
446
+ .topic-chip input[type="checkbox"] {
447
+ accent-color: var(--primary);
448
+ }
449
+
450
+ /* Conversations */
451
+ .conversation-list {
452
+ display: grid;
453
+ gap: 1rem;
454
+ margin-top: 1rem;
455
+ }
456
+
457
+ .conversation-item {
458
+ padding: 1.25rem;
459
+ background: var(--gray-100);
460
+ border-radius: var(--radius);
461
+ border: 1px solid var(--gray-200);
462
+ cursor: pointer;
463
+ transition: var(--transition);
464
+ }
465
+
466
+ .conversation-item:hover {
467
+ border-color: var(--primary);
468
+ background: rgba(41, 123, 86, 0.03);
469
+ transform: translateY(-2px);
470
+ box-shadow: var(--shadow);
471
+ }
472
+
473
+ .conversation-header {
474
+ display: flex;
475
+ justify-content: space-between;
476
+ align-items: center;
477
+ margin-bottom: 0.75rem;
478
+ }
479
+
480
+ .conversation-patient {
481
+ font-weight: 600;
482
+ color: var(--ink);
483
+ font-size: 1.05rem;
484
+ }
485
+
486
+ .conversation-date {
487
+ font-size: 0.875rem;
488
+ color: var(--muted);
489
+ }
490
+
491
+ .conversation-preview {
492
+ color: var(--gray-600);
493
+ font-size: 0.95rem;
494
+ line-height: 1.5;
495
+ }
496
+
497
+ .escalation-badge {
498
+ background: #fee2e2;
499
+ color: #dc2626;
500
+ padding: 0.25rem 0.75rem;
501
+ border-radius: 999px;
502
+ font-size: 0.8rem;
503
+ font-weight: 600;
504
+ margin-left: 0.5rem;
505
+ }
506
+
507
+ /* Transactions */
508
+ .transaction-item {
509
+ padding: 1rem;
510
+ border-bottom: 1px solid var(--gray-200);
511
+ display: grid;
512
+ grid-template-columns: 2fr 1fr 1fr 1fr;
513
+ gap: 1rem;
514
+ align-items: center;
515
+ }
516
+
517
+ .transaction-item:last-child {
518
+ border-bottom: none;
519
+ }
520
+
521
+ .transaction-status {
522
+ padding: 0.25rem 0.75rem;
523
+ border-radius: 999px;
524
+ font-size: 0.85rem;
525
+ font-weight: 600;
526
+ text-align: center;
527
+ }
528
+
529
+ .transaction-status.succeeded {
530
+ background: #d1fae5;
531
+ color: #059669;
532
+ }
533
+
534
+ .transaction-status.pending {
535
+ background: #fef3c7;
536
+ color: #d97706;
537
+ }
538
+
539
+ .transaction-status.failed {
540
+ background: #fee2e2;
541
+ color: #dc2626;
542
+ }
543
+
544
+ /* Fieldset */
545
+ fieldset {
546
+ border: 2px solid var(--gray-200);
547
+ border-radius: var(--radius);
548
+ padding: 1.5rem;
549
+ margin: 1rem 0;
550
+ }
551
+
552
+ legend {
553
+ padding: 0 0.75rem;
554
+ font-weight: 600;
555
+ color: var(--primary);
556
+ }
557
+
558
+ /* Links */
559
+ a {
560
+ color: var(--primary);
561
+ text-decoration: none;
562
+ transition: var(--transition);
563
+ }
564
+
565
+ a:hover {
566
+ color: var(--primary-dark);
567
+ text-decoration: underline;
568
+ }
569
+
570
+ /* Responsive */
571
+ @media (max-width: 768px) {
572
+ .topbar {
573
+ padding: 1rem 1.5rem;
574
+ }
575
+
576
+ .container {
577
+ padding: 0 1rem;
578
+ }
579
+
580
+ .auth-grid,
581
+ .grid,
582
+ .grid-2 {
583
+ grid-template-columns: 1fr;
584
+ }
585
+
586
+ .stats {
587
+ grid-template-columns: 1fr;
588
+ }
589
+
590
+ h1 {
591
+ font-size: 1.75rem;
592
+ }
593
+
594
+ h2 {
595
+ font-size: 1.25rem;
596
+ }
597
+
598
+ .transaction-item {
599
+ grid-template-columns: 1fr;
600
+ gap: 0.5rem;
601
+ }
602
+ }
603
+
604
+ @media (max-width: 480px) {
605
+ .pill {
606
+ font-size: 0.8rem;
607
+ padding: 0.4rem 0.8rem;
608
+ }
609
+
610
+ .subtitle {
611
+ display: none;
612
+ }
613
+
614
+ button {
615
+ width: 100%;
616
+ }
617
+ }
618
+
619
+ /* ── Waitlist panel (provider console) ─────────────────────── */
620
+ .waitlist-badge {
621
+ display: inline-block;
622
+ background: linear-gradient(135deg, var(--accent, #4fb3a4), #3a8a7e);
623
+ color: #fff;
624
+ font-size: 0.8rem;
625
+ font-weight: 600;
626
+ padding: 0.35rem 0.85rem;
627
+ border-radius: 999px;
628
+ margin-bottom: 1.25rem;
629
+ letter-spacing: 0.03em;
630
+ }
631
+
632
+ #waitlistForm input {
633
+ display: block;
634
+ width: 100%;
635
+ margin-bottom: 0.75rem;
636
+ box-sizing: border-box;
637
+ }
638
+
639
+ #waitlistMessage {
640
+ margin-top: 0.5rem;
641
+ min-height: 1.2rem;
642
+ }
643
+
644
+ /* Transcript modal */
645
+ .transcript-modal {
646
+ position: fixed;
647
+ inset: 0;
648
+ background: rgba(0,0,0,0.6);
649
+ display: flex;
650
+ align-items: center;
651
+ justify-content: center;
652
+ z-index: 1000;
653
+ backdrop-filter: blur(3px);
654
+ }
655
+ .transcript-content {
656
+ background: white;
657
+ border-radius: 12px;
658
+ width: min(600px, 92vw);
659
+ max-height: 80vh;
660
+ display: flex;
661
+ flex-direction: column;
662
+ box-shadow: 0 20px 60px rgba(0,0,0,0.3);
663
+ }
664
+ .transcript-header {
665
+ display: flex;
666
+ justify-content: space-between;
667
+ align-items: center;
668
+ padding: 1rem 1.25rem;
669
+ border-bottom: 1px solid #eee;
670
+ }
671
+ .transcript-header h3 { margin: 0; }
672
+ .transcript-close {
673
+ background: none;
674
+ border: none;
675
+ font-size: 1.5rem;
676
+ cursor: pointer;
677
+ color: #666;
678
+ padding: 0 0.25rem;
679
+ }
680
+ .transcript-body {
681
+ padding: 1rem 1.25rem;
682
+ overflow-y: auto;
683
+ flex: 1;
684
+ }
685
+ .transcript-msg {
686
+ padding: 0.5rem 0;
687
+ border-bottom: 1px solid #f0f0f0;
688
+ font-size: 0.9rem;
689
+ line-height: 1.5;
690
+ }
691
+ .transcript-user { color: var(--accent); }
692
+ .transcript-time {
693
+ font-size: 0.7rem;
694
+ color: #888;
695
+ margin-top: 0.2rem;
696
+ }
697
+ .transcript-assistant { color: #333; }
698
+
699
+ /* Load more button */
700
+ .load-more-btn {
701
+ display: block;
702
+ width: 100%;
703
+ padding: 0.75rem;
704
+ margin-top: 0.75rem;
705
+ background: #f5f5f5;
706
+ border: 1px solid #ddd;
707
+ border-radius: 8px;
708
+ cursor: pointer;
709
+ font-size: 0.9rem;
710
+ color: var(--accent);
711
+ font-weight: 600;
712
+ }
713
+ .load-more-btn:hover { background: #eee; }
714
+
715
+ /* Conversation item hover */
716
+ .conversation-item:hover {
717
+ background: rgba(0,0,0,0.03);
718
+ border-radius: 8px;
719
+ }
720
+
721
+ /* Toast notification */
722
+ .toast {
723
+ position: fixed;
724
+ bottom: 2rem;
725
+ left: 50%;
726
+ transform: translateX(-50%) translateY(20px);
727
+ background: #1b3a2b;
728
+ color: white;
729
+ padding: 0.75rem 1.5rem;
730
+ border-radius: 8px;
731
+ font-size: 0.9rem;
732
+ font-weight: 500;
733
+ z-index: 9999;
734
+ opacity: 0;
735
+ transition: opacity 0.3s, transform 0.3s;
736
+ pointer-events: none;
737
+ }
738
+ .toast-visible { opacity: 1; transform: translateX(-50%) translateY(0); }
739
+ .toast-error { background: #dc2626; }
740
+
741
+ /* Notification bell */
742
+ .notification-bell {
743
+ cursor: pointer;
744
+ border: none;
745
+ background: none;
746
+ }
747
+ .notification-badge {
748
+ position: absolute;
749
+ top: -2px;
750
+ right: -4px;
751
+ background: #dc3545;
752
+ color: #fff;
753
+ font-size: 0.6rem;
754
+ font-weight: 700;
755
+ width: 18px;
756
+ height: 18px;
757
+ border-radius: 50%;
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: center;
761
+ line-height: 1;
762
+ }
763
+
764
+ /* Notification dropdown */
765
+ .notification-dropdown {
766
+ position: fixed;
767
+ top: 56px;
768
+ right: 1rem;
769
+ width: 340px;
770
+ max-height: 420px;
771
+ background: #1a1a1a;
772
+ border: 1px solid #333;
773
+ border-radius: 10px;
774
+ box-shadow: 0 8px 32px rgba(0,0,0,0.4);
775
+ z-index: 10000;
776
+ overflow: hidden;
777
+ }
778
+ .notification-dropdown-header {
779
+ display: flex;
780
+ justify-content: space-between;
781
+ align-items: center;
782
+ padding: 0.75rem 1rem;
783
+ border-bottom: 1px solid #333;
784
+ color: #e0e0e0;
785
+ }
786
+ .notification-list {
787
+ max-height: 360px;
788
+ overflow-y: auto;
789
+ }
790
+ .notification-item {
791
+ padding: 0.75rem 1rem;
792
+ border-bottom: 1px solid #222;
793
+ cursor: pointer;
794
+ }
795
+ .notification-item:hover {
796
+ background: #222;
797
+ }
798
+ .notification-item.unread {
799
+ border-left: 3px solid #4fb3a4;
800
+ }
801
+ .notification-title {
802
+ font-weight: 600;
803
+ font-size: 0.85rem;
804
+ color: #e0e0e0;
805
+ }
806
+ .notification-body {
807
+ font-size: 0.8rem;
808
+ color: #999;
809
+ margin-top: 0.2rem;
810
+ }
811
+ .notification-time {
812
+ font-size: 0.7rem;
813
+ color: #666;
814
+ margin-top: 0.25rem;
815
+ }
816
+ .notification-empty {
817
+ padding: 2rem;
818
+ text-align: center;
819
+ color: #666;
820
+ }
821
+
822
+ /* Loading skeleton */
823
+ .loading-skeleton {
824
+ padding: 1rem 0;
825
+ }
826
+ .skeleton {
827
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
828
+ background-size: 200% 100%;
829
+ animation: shimmer 1.5s infinite;
830
+ border-radius: 8px;
831
+ }
832
+ .skeleton-line {
833
+ height: 14px;
834
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
835
+ background-size: 200% 100%;
836
+ animation: shimmer 1.5s infinite;
837
+ border-radius: 4px;
838
+ margin-bottom: 0.75rem;
839
+ }
840
+ .skeleton-line.short {
841
+ width: 60%;
842
+ }
843
+ .skeleton-stat {
844
+ display: inline-block;
845
+ width: 3rem;
846
+ height: 2rem;
847
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
848
+ background-size: 200% 100%;
849
+ animation: shimmer 1.5s infinite;
850
+ border-radius: 8px;
851
+ vertical-align: middle;
852
+ }
853
+ @keyframes shimmer {
854
+ 0% { background-position: 200% 0; }
855
+ 100% { background-position: -200% 0; }
856
+ }
857
+
858
+ /* Stat loading pulse */
859
+ .stat-loading {
860
+ display: inline-block;
861
+ width: 2rem;
862
+ height: 1.2rem;
863
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
864
+ background-size: 200% 100%;
865
+ animation: shimmer 1.5s infinite;
866
+ border-radius: 4px;
867
+ vertical-align: middle;
868
+ }
869
+
870
+ /* Plan & Usage card */
871
+ .plan-info {
872
+ display: flex;
873
+ align-items: center;
874
+ gap: 1.5rem;
875
+ margin-top: 1rem;
876
+ }
877
+ .plan-badge {
878
+ display: inline-block;
879
+ padding: 0.35rem 1rem;
880
+ border-radius: 999px;
881
+ font-size: 0.85rem;
882
+ font-weight: 700;
883
+ letter-spacing: 0.03em;
884
+ text-transform: uppercase;
885
+ white-space: nowrap;
886
+ background: var(--gray-200);
887
+ color: var(--gray-800);
888
+ }
889
+ .plan-badge.plan-free {
890
+ background: var(--gray-200);
891
+ color: var(--gray-800);
892
+ }
893
+ .plan-badge.plan-pro {
894
+ background: linear-gradient(135deg, var(--primary), var(--primary-light));
895
+ color: #fff;
896
+ }
897
+ .plan-usage {
898
+ flex: 1;
899
+ min-width: 0;
900
+ }
901
+ .usage-bar-container {
902
+ height: 10px;
903
+ background: var(--gray-200);
904
+ border-radius: 999px;
905
+ overflow: hidden;
906
+ }
907
+ .usage-bar {
908
+ height: 100%;
909
+ border-radius: 999px;
910
+ background: var(--primary);
911
+ transition: width 0.6s ease;
912
+ }
913
+ .usage-bar.warn {
914
+ background: var(--warning);
915
+ }
916
+ .usage-bar.danger {
917
+ background: var(--danger);
918
+ }
919
+ .usage-text {
920
+ display: block;
921
+ margin-top: 0.4rem;
922
+ font-size: 0.8rem;
923
+ color: var(--muted);
924
+ }
925
+
926
+ /* Conversation filters */
927
+ .conversation-filters {
928
+ display: flex;
929
+ gap: 0.5rem;
930
+ margin-bottom: 1rem;
931
+ }
932
+
933
+ /* Verification badge */
934
+ .verification-badge {
935
+ display: inline-block;
936
+ padding: 0.25rem 0.75rem;
937
+ border-radius: 999px;
938
+ font-size: 0.8rem;
939
+ font-weight: 600;
940
+ margin-top: 0.5rem;
941
+ }
942
+ .verification-pending {
943
+ background: rgba(245, 158, 11, 0.15);
944
+ color: #b45309;
945
+ border: 1px solid rgba(245, 158, 11, 0.3);
946
+ }
947
+ .verification-verified {
948
+ background: rgba(41, 123, 86, 0.15);
949
+ color: #1e5c40;
950
+ border: 1px solid rgba(41, 123, 86, 0.3);
951
+ }
952
+ .verification-rejected {
953
+ background: rgba(220, 38, 38, 0.15);
954
+ color: #dc2626;
955
+ border: 1px solid rgba(220, 38, 38, 0.3);
956
+ }
957
+
958
+ /* Usage warning */
959
+ .usage-warning {
960
+ padding: 0.5rem 0.75rem;
961
+ border-radius: 8px;
962
+ font-size: 0.85rem;
963
+ margin-top: 0.75rem;
964
+ }
965
+ .usage-warning.warn {
966
+ background: rgba(245, 158, 11, 0.12);
967
+ color: #92400e;
968
+ border: 1px solid rgba(245, 158, 11, 0.25);
969
+ }
970
+ .usage-warning.danger {
971
+ background: rgba(220, 38, 38, 0.12);
972
+ color: #dc2626;
973
+ border: 1px solid rgba(220, 38, 38, 0.25);
974
+ }
975
+
976
+ /* Conversation delete button */
977
+ .conversation-item {
978
+ display: flex;
979
+ align-items: center;
980
+ gap: 0.5rem;
981
+ }
982
+ .conversation-delete-btn {
983
+ background: transparent;
984
+ border: none;
985
+ color: var(--gray-400);
986
+ font-size: 1rem;
987
+ cursor: pointer;
988
+ padding: 0.25rem 0.5rem;
989
+ border-radius: 4px;
990
+ opacity: 0;
991
+ transition: opacity 0.2s, color 0.2s;
992
+ }
993
+ .conversation-item:hover .conversation-delete-btn {
994
+ opacity: 1;
995
+ }
996
+ .conversation-delete-btn:hover {
997
+ color: var(--danger);
998
+ background: rgba(220, 38, 38, 0.1);
999
+ }
1000
+
1001
+ /* Onboarding checklist card */
1002
+ .onboarding-card {
1003
+ border-left: 4px solid var(--primary);
1004
+ }
1005
+ .onboarding-head {
1006
+ display: flex;
1007
+ justify-content: space-between;
1008
+ align-items: center;
1009
+ }
1010
+ .onboarding-head h2 {
1011
+ margin-bottom: 0;
1012
+ }
1013
+ .onboarding-percent {
1014
+ font-size: 0.9rem;
1015
+ font-weight: 700;
1016
+ color: var(--primary);
1017
+ }
1018
+ .onboarding-progress {
1019
+ height: 10px;
1020
+ background: var(--gray-200);
1021
+ border-radius: 999px;
1022
+ overflow: hidden;
1023
+ margin: 1rem 0;
1024
+ }
1025
+ .onboarding-progress-bar {
1026
+ height: 100%;
1027
+ border-radius: 999px;
1028
+ background: linear-gradient(135deg, var(--primary), var(--primary-light));
1029
+ transition: width 0.6s ease;
1030
+ }
1031
+ .onboarding-next {
1032
+ background: rgba(41, 123, 86, 0.08);
1033
+ border: 1px solid rgba(41, 123, 86, 0.25);
1034
+ color: var(--primary);
1035
+ padding: 0.6rem 0.9rem;
1036
+ border-radius: var(--radius-sm);
1037
+ font-weight: 600;
1038
+ font-size: 0.9rem;
1039
+ margin-bottom: 1rem;
1040
+ }
1041
+ .onboarding-steps {
1042
+ list-style: none;
1043
+ display: grid;
1044
+ gap: 0.5rem;
1045
+ }
1046
+ .onboarding-step {
1047
+ display: flex;
1048
+ align-items: center;
1049
+ gap: 0.6rem;
1050
+ font-size: 0.95rem;
1051
+ color: var(--ink);
1052
+ }
1053
+ .onboarding-step .check {
1054
+ font-weight: 700;
1055
+ width: 1.2rem;
1056
+ text-align: center;
1057
+ }
1058
+ .onboarding-step.done {
1059
+ color: var(--muted);
1060
+ }
1061
+ .onboarding-step.done .check {
1062
+ color: var(--primary);
1063
+ }
1064
+ .onboarding-step.todo .check {
1065
+ color: var(--gray-400);
1066
+ }
1067
+ .onboarding-step .optional-tag {
1068
+ font-size: 0.7rem;
1069
+ color: var(--muted);
1070
+ background: var(--gray-100);
1071
+ padding: 0.1rem 0.45rem;
1072
+ border-radius: 999px;
1073
+ }
1074
+
1075
+ /* Verification banner */
1076
+ .verification-banner {
1077
+ border-left: 4px solid var(--warning);
1078
+ }
1079
+ .verification-banner.is-pending {
1080
+ border-left-color: var(--warning);
1081
+ }
1082
+ .verification-banner.is-verified {
1083
+ border-left-color: var(--success);
1084
+ }
1085
+ .verification-banner.is-rejected {
1086
+ border-left-color: var(--danger);
1087
+ }
1088
+ .verification-banner h3 {
1089
+ margin-bottom: 0.5rem;
1090
+ }
1091
+ .verification-banner .verification-message {
1092
+ color: var(--ink);
1093
+ margin-bottom: 0.5rem;
1094
+ }
1095
+ .verification-banner .verification-detail {
1096
+ font-size: 0.875rem;
1097
+ color: var(--muted);
1098
+ margin-bottom: 0.5rem;
1099
+ }
1100
+ .verification-banner .verification-reason {
1101
+ background: rgba(220, 38, 38, 0.1);
1102
+ border: 1px solid rgba(220, 38, 38, 0.25);
1103
+ color: var(--danger);
1104
+ padding: 0.6rem 0.9rem;
1105
+ border-radius: var(--radius-sm);
1106
+ font-size: 0.875rem;
1107
+ margin-bottom: 0.75rem;
1108
+ }
1109
+
1110
+ /* Preview link callout */
1111
+ .preview-callout {
1112
+ background: rgba(41, 123, 86, 0.06);
1113
+ border: 1px solid rgba(41, 123, 86, 0.25);
1114
+ border-radius: var(--radius);
1115
+ padding: 1rem;
1116
+ margin-bottom: 1rem;
1117
+ }
1118
+ .preview-callout-head {
1119
+ margin-bottom: 0.5rem;
1120
+ }
1121
+ .preview-pill {
1122
+ display: inline-block;
1123
+ background: var(--primary);
1124
+ color: #fff;
1125
+ font-size: 0.75rem;
1126
+ font-weight: 700;
1127
+ padding: 0.25rem 0.7rem;
1128
+ border-radius: 999px;
1129
+ letter-spacing: 0.02em;
1130
+ }
1131
+ .preview-callout-text {
1132
+ margin-bottom: 0.5rem;
1133
+ font-weight: 600;
1134
+ color: var(--ink);
1135
+ }
1136
+ .preview-callout-link-row {
1137
+ display: flex;
1138
+ align-items: center;
1139
+ gap: 0.5rem;
1140
+ margin-bottom: 0.5rem;
1141
+ }
1142
+ .preview-callout-link {
1143
+ flex: 1;
1144
+ font-family: "SF Mono", "Monaco", monospace;
1145
+ font-size: 0.85rem;
1146
+ word-break: break-all;
1147
+ color: var(--primary);
1148
+ }
1149
+
1150
+ /* Account management */
1151
+ .account-actions {
1152
+ display: flex;
1153
+ flex-wrap: wrap;
1154
+ gap: 0.75rem;
1155
+ margin-top: 0.5rem;
1156
+ }
1157
+ .danger-btn {
1158
+ background: var(--danger);
1159
+ color: #fff;
1160
+ border: none;
1161
+ }
1162
+ .danger-btn:hover {
1163
+ background: #b91c1c;
1164
+ }
1165
+ .danger-btn:disabled {
1166
+ background: var(--danger);
1167
+ }
1168
+ .delete-confirm {
1169
+ margin-top: 1.25rem;
1170
+ padding: 1.25rem;
1171
+ border: 1px solid rgba(220, 38, 38, 0.3);
1172
+ border-radius: var(--radius);
1173
+ background: rgba(220, 38, 38, 0.04);
1174
+ }
1175
+ .delete-confirm-text {
1176
+ color: var(--danger);
1177
+ font-weight: 500;
1178
+ }
1179
+ .delete-confirm label {
1180
+ margin: 0.75rem 0;
1181
+ }
1182
+
1183
+ @media (prefers-color-scheme: dark) {
1184
+ :root {
1185
+ --background: #111827;
1186
+ --ink: #f3f4f6;
1187
+ --muted: rgba(243, 244, 246, 0.6);
1188
+ --gray-50: #1f2937;
1189
+ --gray-100: #374151;
1190
+ --gray-200: #4b5563;
1191
+ }
1192
+
1193
+ body {
1194
+ background-color: #111827;
1195
+ color: #f3f4f6;
1196
+ }
1197
+
1198
+ .card {
1199
+ background: #1f2937;
1200
+ border-color: #374151;
1201
+ }
1202
+
1203
+ input, select, textarea {
1204
+ background: #1f2937;
1205
+ color: #f3f4f6;
1206
+ border-color: #4b5563;
1207
+ }
1208
+
1209
+ .stat {
1210
+ color: #f3f4f6;
1211
+ }
1212
+
1213
+ .skeleton,
1214
+ .skeleton-line,
1215
+ .skeleton-stat,
1216
+ .stat-loading {
1217
+ background: linear-gradient(90deg, #1f2937 25%, #374151 50%, #1f2937 75%);
1218
+ background-size: 200% 100%;
1219
+ }
1220
+
1221
+ .onboarding-step,
1222
+ .onboarding-head h2,
1223
+ .verification-banner .verification-message,
1224
+ .preview-callout-text {
1225
+ color: #f3f4f6;
1226
+ }
1227
+ .onboarding-step.done {
1228
+ color: rgba(243, 244, 246, 0.6);
1229
+ }
1230
+ .onboarding-step .optional-tag {
1231
+ background: #374151;
1232
+ }
1233
+ .onboarding-next {
1234
+ background: rgba(58, 157, 111, 0.15);
1235
+ color: var(--primary-light);
1236
+ }
1237
+ .preview-callout {
1238
+ background: rgba(58, 157, 111, 0.1);
1239
+ }
1240
+ .preview-callout-link {
1241
+ color: var(--primary-light);
1242
+ }
1243
+ .delete-confirm {
1244
+ background: rgba(220, 38, 38, 0.1);
1245
+ }
1246
+ /* Onboarding progress stepper */
1247
+ .onboarding-progress {
1248
+ display: flex;
1249
+ align-items: center;
1250
+ justify-content: center;
1251
+ gap: 0;
1252
+ padding: 1.5rem 1rem;
1253
+ margin-bottom: 1rem;
1254
+ }
1255
+ .progress-step {
1256
+ display: flex;
1257
+ flex-direction: column;
1258
+ align-items: center;
1259
+ gap: 0.4rem;
1260
+ position: relative;
1261
+ }
1262
+ .progress-step .step-number {
1263
+ width: 2rem;
1264
+ height: 2rem;
1265
+ border-radius: 50%;
1266
+ display: flex;
1267
+ align-items: center;
1268
+ justify-content: center;
1269
+ font-weight: 600;
1270
+ font-size: 0.85rem;
1271
+ background: #2a2a2a;
1272
+ color: #666;
1273
+ border: 2px solid #333;
1274
+ transition: all 0.3s;
1275
+ }
1276
+ .progress-step .step-label {
1277
+ font-size: 0.75rem;
1278
+ color: #666;
1279
+ white-space: nowrap;
1280
+ }
1281
+ .progress-step.active .step-number {
1282
+ background: #4fb3a4;
1283
+ color: #fff;
1284
+ border-color: #4fb3a4;
1285
+ }
1286
+ .progress-step.active .step-label {
1287
+ color: #4fb3a4;
1288
+ font-weight: 600;
1289
+ }
1290
+ .progress-step.completed .step-number {
1291
+ background: #2d6a4f;
1292
+ color: #fff;
1293
+ border-color: #2d6a4f;
1294
+ }
1295
+ .progress-step.completed .step-label {
1296
+ color: #aaa;
1297
+ }
1298
+ .progress-connector {
1299
+ width: 3rem;
1300
+ height: 2px;
1301
+ background: #333;
1302
+ margin: 0 0.25rem;
1303
+ margin-bottom: 1.2rem;
1304
+ }
1305
+
1306
+ /* Usage limit warning bar */
1307
+ .usage-warning {
1308
+ padding: 0.75rem 1rem;
1309
+ border-radius: 8px;
1310
+ font-size: 0.85rem;
1311
+ font-weight: 500;
1312
+ margin-bottom: 1rem;
1313
+ display: flex;
1314
+ align-items: center;
1315
+ gap: 0.5rem;
1316
+ }
1317
+ .usage-warning.warn {
1318
+ background: rgba(255, 183, 77, 0.15);
1319
+ border: 1px solid rgba(255, 183, 77, 0.3);
1320
+ color: #ffb74d;
1321
+ }
1322
+ .usage-warning.critical {
1323
+ background: rgba(239, 83, 80, 0.15);
1324
+ border: 1px solid rgba(239, 83, 80, 0.3);
1325
+ color: #ef5350;
1326
+ }
1327
+ .usage-warning a {
1328
+ color: inherit;
1329
+ text-decoration: underline;
1330
+ }
1331
+
1332
+ /* Plan comparison cards */
1333
+ .plan-comparison {
1334
+ display: grid;
1335
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1336
+ gap: 1rem;
1337
+ margin: 1rem 0;
1338
+ }
1339
+ .plan-card {
1340
+ border: 2px solid #333;
1341
+ border-radius: 12px;
1342
+ padding: 1.5rem;
1343
+ text-align: center;
1344
+ transition: border-color 0.2s;
1345
+ }
1346
+ .plan-card.current {
1347
+ border-color: #4fb3a4;
1348
+ }
1349
+ .plan-card h3 {
1350
+ margin: 0 0 0.5rem 0;
1351
+ font-size: 1.1rem;
1352
+ }
1353
+ .plan-card .plan-price {
1354
+ font-size: 1.5rem;
1355
+ font-weight: 700;
1356
+ color: #4fb3a4;
1357
+ margin-bottom: 0.75rem;
1358
+ }
1359
+ .plan-card ul {
1360
+ list-style: none;
1361
+ padding: 0;
1362
+ margin: 0 0 1rem 0;
1363
+ text-align: left;
1364
+ }
1365
+ .plan-card ul li {
1366
+ padding: 0.3rem 0;
1367
+ font-size: 0.85rem;
1368
+ color: #ccc;
1369
+ }
1370
+ .plan-card ul li::before {
1371
+ content: "✓ ";
1372
+ color: #4fb3a4;
1373
+ }
1374
+ .plan-card .plan-btn {
1375
+ display: inline-block;
1376
+ padding: 0.5rem 1.5rem;
1377
+ border-radius: 6px;
1378
+ border: 1px solid #4fb3a4;
1379
+ color: #4fb3a4;
1380
+ background: transparent;
1381
+ cursor: pointer;
1382
+ font-size: 0.85rem;
1383
+ transition: all 0.2s;
1384
+ }
1385
+ .plan-card.current .plan-btn {
1386
+ background: #4fb3a4;
1387
+ color: #fff;
1388
+ }
1389
+
1390
+ /* Analytics export */
1391
+ .export-bar {
1392
+ display: flex;
1393
+ justify-content: flex-end;
1394
+ gap: 0.5rem;
1395
+ margin-bottom: 0.75rem;
1396
+ }
1397
+ .export-bar button {
1398
+ font-size: 0.8rem;
1399
+ padding: 0.4rem 0.8rem;
1400
+ }