memorix 0.5.0 → 0.5.2

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.
@@ -0,0 +1,1048 @@
1
+ /* ============================================================
2
+ * Memorix Dashboard — Global Styles
3
+ * Dark theme, glassmorphism, premium developer aesthetic
4
+ * ============================================================ */
5
+
6
+ :root {
7
+ /* Colors */
8
+ --bg-base: #08080d;
9
+ --bg-surface: #0e0e16;
10
+ --bg-card: #13131d;
11
+ --bg-card-hover: #1a1a28;
12
+ --bg-sidebar: #0a0a12;
13
+
14
+ --border-subtle: rgba(255, 255, 255, 0.06);
15
+ --border-medium: rgba(255, 255, 255, 0.1);
16
+
17
+ --text-primary: #e8e8ed;
18
+ --text-secondary: #8b8b9e;
19
+ --text-muted: #55556a;
20
+
21
+ --accent-cyan: #00d4ff;
22
+ --accent-purple: #a855f7;
23
+ --accent-pink: #ec4899;
24
+ --accent-amber: #f59e0b;
25
+ --accent-green: #10b981;
26
+ --accent-red: #ef4444;
27
+ --accent-blue: #3b82f6;
28
+
29
+ /* Observation type colors */
30
+ --type-session-request: #3b82f6;
31
+ --type-gotcha: #ef4444;
32
+ --type-problem-solution: #f59e0b;
33
+ --type-how-it-works: #3b82f6;
34
+ --type-what-changed: #10b981;
35
+ --type-discovery: #a855f7;
36
+ --type-why-it-exists: #f97316;
37
+ --type-decision: #8b5cf6;
38
+ --type-trade-off: #6b7280;
39
+
40
+ /* Layout */
41
+ --sidebar-width: 60px;
42
+
43
+ /* Typography */
44
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
45
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
46
+
47
+ /* Effects */
48
+ --glow-cyan: 0 0 20px rgba(0, 212, 255, 0.15);
49
+ --glow-purple: 0 0 20px rgba(168, 85, 247, 0.15);
50
+
51
+ /* Transitions */
52
+ --transition-fast: 150ms ease;
53
+ --transition-normal: 250ms ease;
54
+ }
55
+
56
+ /* Light Theme */
57
+ [data-theme="light"] {
58
+ --bg-base: #f5f5f8;
59
+ --bg-surface: #eeeef2;
60
+ --bg-card: #ffffff;
61
+ --bg-card-hover: #f8f8fb;
62
+ --bg-sidebar: #ffffff;
63
+
64
+ --border-subtle: rgba(0, 0, 0, 0.07);
65
+ --border-medium: rgba(0, 0, 0, 0.12);
66
+
67
+ --text-primary: #1a1a2e;
68
+ --text-secondary: #5a5a7a;
69
+ --text-muted: #9494ad;
70
+
71
+ --accent-cyan: #0099cc;
72
+ --accent-purple: #7c3aed;
73
+ --accent-pink: #db2777;
74
+ --accent-amber: #d97706;
75
+ --accent-green: #059669;
76
+ --accent-red: #dc2626;
77
+ --accent-blue: #2563eb;
78
+
79
+ --type-session-request: #2563eb;
80
+ --type-gotcha: #dc2626;
81
+ --type-problem-solution: #d97706;
82
+ --type-how-it-works: #2563eb;
83
+ --type-what-changed: #059669;
84
+ --type-discovery: #7c3aed;
85
+ --type-why-it-exists: #ea580c;
86
+ --type-decision: #6d28d9;
87
+ --type-trade-off: #4b5563;
88
+
89
+ --glow-cyan: 0 0 20px rgba(0, 153, 204, 0.1);
90
+ --glow-purple: 0 0 20px rgba(124, 58, 237, 0.1);
91
+ }
92
+
93
+ [data-theme="light"] .brand-logo {
94
+ filter: drop-shadow(0 0 6px rgba(0, 153, 204, 0.2));
95
+ }
96
+
97
+ [data-theme="light"] .brand-logo:hover {
98
+ filter: drop-shadow(0 0 10px rgba(0, 153, 204, 0.35));
99
+ }
100
+
101
+ [data-theme="light"] ::-webkit-scrollbar-thumb {
102
+ background: rgba(0, 0, 0, 0.15);
103
+ }
104
+
105
+ [data-theme="light"] ::-webkit-scrollbar-thumb:hover {
106
+ background: rgba(0, 0, 0, 0.25);
107
+ }
108
+
109
+ [data-theme="light"] .stat-value {
110
+ background: linear-gradient(135deg, #1a1a2e, #5a5a7a);
111
+ -webkit-background-clip: text;
112
+ -webkit-text-fill-color: transparent;
113
+ background-clip: text;
114
+ }
115
+
116
+ [data-theme="light"] .retention-table tr:hover td {
117
+ background: rgba(0, 0, 0, 0.02);
118
+ }
119
+
120
+ [data-theme="light"] .score-bar {
121
+ background: rgba(0, 0, 0, 0.06);
122
+ }
123
+
124
+ [data-theme="light"] .fact-tag {
125
+ background: rgba(0, 153, 204, 0.08);
126
+ border-color: rgba(0, 153, 204, 0.18);
127
+ }
128
+
129
+ [data-theme="light"] .nav-btn.active {
130
+ background: rgba(0, 153, 204, 0.1);
131
+ }
132
+
133
+ [data-theme="light"] .filter-btn.active {
134
+ background: rgba(0, 153, 204, 0.1);
135
+ }
136
+
137
+ /* Reset */
138
+ *,
139
+ *::before,
140
+ *::after {
141
+ box-sizing: border-box;
142
+ margin: 0;
143
+ padding: 0;
144
+ }
145
+
146
+ html,
147
+ body {
148
+ height: 100%;
149
+ font-family: var(--font-sans);
150
+ background: var(--bg-base);
151
+ color: var(--text-primary);
152
+ overflow: hidden;
153
+ -webkit-font-smoothing: antialiased;
154
+ }
155
+
156
+ body {
157
+ display: flex;
158
+ }
159
+
160
+ /* Scrollbar */
161
+ ::-webkit-scrollbar {
162
+ width: 6px;
163
+ }
164
+
165
+ ::-webkit-scrollbar-track {
166
+ background: transparent;
167
+ }
168
+
169
+ ::-webkit-scrollbar-thumb {
170
+ background: var(--border-medium);
171
+ border-radius: 3px;
172
+ }
173
+
174
+ ::-webkit-scrollbar-thumb:hover {
175
+ background: var(--text-muted);
176
+ }
177
+
178
+ /* ============================================================
179
+ * Sidebar
180
+ * ============================================================ */
181
+
182
+ #sidebar {
183
+ width: var(--sidebar-width);
184
+ height: 100vh;
185
+ background: var(--bg-sidebar);
186
+ border-right: 1px solid var(--border-subtle);
187
+ display: flex;
188
+ flex-direction: column;
189
+ align-items: center;
190
+ padding: 16px 0;
191
+ flex-shrink: 0;
192
+ z-index: 10;
193
+ }
194
+
195
+ .sidebar-brand {
196
+ margin-bottom: 24px;
197
+ }
198
+
199
+ .brand-logo {
200
+ width: 36px;
201
+ height: 36px;
202
+ border-radius: 8px;
203
+ object-fit: cover;
204
+ display: block;
205
+ filter: drop-shadow(0 0 8px rgba(0, 212, 255, 0.3));
206
+ transition: filter var(--transition-normal);
207
+ }
208
+
209
+ .brand-logo:hover {
210
+ filter: drop-shadow(0 0 14px rgba(0, 212, 255, 0.5));
211
+ }
212
+
213
+ .sidebar-nav {
214
+ display: flex;
215
+ flex-direction: column;
216
+ gap: 4px;
217
+ }
218
+
219
+ .nav-btn {
220
+ width: 40px;
221
+ height: 40px;
222
+ border: none;
223
+ background: transparent;
224
+ color: var(--text-muted);
225
+ cursor: pointer;
226
+ border-radius: 10px;
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ transition: all var(--transition-fast);
231
+ position: relative;
232
+ }
233
+
234
+ .nav-btn:hover {
235
+ color: var(--text-secondary);
236
+ background: rgba(255, 255, 255, 0.04);
237
+ }
238
+
239
+ .nav-btn.active {
240
+ color: var(--accent-cyan);
241
+ background: rgba(0, 212, 255, 0.08);
242
+ }
243
+
244
+ .nav-btn.active::before {
245
+ content: '';
246
+ position: absolute;
247
+ left: -10px;
248
+ top: 50%;
249
+ transform: translateY(-50%);
250
+ width: 3px;
251
+ height: 20px;
252
+ background: var(--accent-cyan);
253
+ border-radius: 0 2px 2px 0;
254
+ }
255
+
256
+ .sidebar-spacer {
257
+ flex: 1;
258
+ }
259
+
260
+ .sidebar-footer {
261
+ padding: 8px 0;
262
+ }
263
+
264
+ .sidebar-footer {
265
+ display: flex;
266
+ flex-direction: column;
267
+ align-items: center;
268
+ gap: 6px;
269
+ padding: 8px 0;
270
+ }
271
+
272
+ .sidebar-action-btn {
273
+ width: 36px;
274
+ height: 36px;
275
+ border: 1px solid var(--border-subtle);
276
+ background: transparent;
277
+ color: var(--text-secondary);
278
+ cursor: pointer;
279
+ border-radius: 8px;
280
+ font-size: 11px;
281
+ font-weight: 600;
282
+ font-family: var(--font-sans);
283
+ transition: all var(--transition-fast);
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ }
288
+
289
+ .sidebar-action-btn:hover {
290
+ color: var(--accent-cyan);
291
+ border-color: var(--accent-cyan);
292
+ background: rgba(0, 212, 255, 0.06);
293
+ }
294
+
295
+ [data-theme="light"] .sidebar-action-btn:hover {
296
+ background: rgba(0, 153, 204, 0.08);
297
+ }
298
+
299
+ /* ============================================================
300
+ * Main Content
301
+ * ============================================================ */
302
+
303
+ #app {
304
+ flex: 1;
305
+ height: 100vh;
306
+ overflow-y: auto;
307
+ overflow-x: hidden;
308
+ }
309
+
310
+ .page {
311
+ display: none;
312
+ padding: 32px;
313
+ min-height: 100vh;
314
+ animation: fadeIn 0.3s ease;
315
+ }
316
+
317
+ .page.active {
318
+ display: block;
319
+ }
320
+
321
+ @keyframes fadeIn {
322
+ from {
323
+ opacity: 0;
324
+ transform: translateY(8px);
325
+ }
326
+
327
+ to {
328
+ opacity: 1;
329
+ transform: translateY(0);
330
+ }
331
+ }
332
+
333
+ /* ============================================================
334
+ * Page Header
335
+ * ============================================================ */
336
+
337
+ .page-header {
338
+ margin-bottom: 32px;
339
+ }
340
+
341
+ .page-title {
342
+ font-size: 24px;
343
+ font-weight: 600;
344
+ color: var(--text-primary);
345
+ margin-bottom: 4px;
346
+ }
347
+
348
+ .page-subtitle {
349
+ font-size: 14px;
350
+ color: var(--text-secondary);
351
+ }
352
+
353
+ /* ============================================================
354
+ * Stat Cards
355
+ * ============================================================ */
356
+
357
+ .stats-grid {
358
+ display: grid;
359
+ grid-template-columns: repeat(4, 1fr);
360
+ gap: 16px;
361
+ margin-bottom: 32px;
362
+ }
363
+
364
+ .stat-card {
365
+ background: var(--bg-card);
366
+ border: 1px solid var(--border-subtle);
367
+ border-radius: 12px;
368
+ padding: 20px;
369
+ transition: all var(--transition-normal);
370
+ position: relative;
371
+ overflow: hidden;
372
+ }
373
+
374
+ .stat-card::before {
375
+ content: '';
376
+ position: absolute;
377
+ top: 0;
378
+ left: 0;
379
+ right: 0;
380
+ height: 2px;
381
+ border-radius: 12px 12px 0 0;
382
+ }
383
+
384
+ .stat-card:hover {
385
+ background: var(--bg-card-hover);
386
+ border-color: var(--border-medium);
387
+ transform: translateY(-2px);
388
+ }
389
+
390
+ .stat-card[data-accent="cyan"]::before {
391
+ background: var(--accent-cyan);
392
+ }
393
+
394
+ .stat-card[data-accent="purple"]::before {
395
+ background: var(--accent-purple);
396
+ }
397
+
398
+ .stat-card[data-accent="amber"]::before {
399
+ background: var(--accent-amber);
400
+ }
401
+
402
+ .stat-card[data-accent="green"]::before {
403
+ background: var(--accent-green);
404
+ }
405
+
406
+ .stat-label {
407
+ font-size: 12px;
408
+ font-weight: 500;
409
+ color: var(--text-secondary);
410
+ text-transform: uppercase;
411
+ letter-spacing: 0.5px;
412
+ margin-bottom: 8px;
413
+ }
414
+
415
+ .stat-value {
416
+ font-size: 32px;
417
+ font-weight: 700;
418
+ font-family: var(--font-mono);
419
+ background: linear-gradient(135deg, var(--text-primary), var(--text-secondary));
420
+ -webkit-background-clip: text;
421
+ -webkit-text-fill-color: transparent;
422
+ background-clip: text;
423
+ }
424
+
425
+ /* ============================================================
426
+ * Cards & Panels
427
+ * ============================================================ */
428
+
429
+ .panel {
430
+ background: var(--bg-card);
431
+ border: 1px solid var(--border-subtle);
432
+ border-radius: 12px;
433
+ overflow: hidden;
434
+ }
435
+
436
+ .panel-header {
437
+ padding: 16px 20px;
438
+ border-bottom: 1px solid var(--border-subtle);
439
+ display: flex;
440
+ align-items: center;
441
+ justify-content: space-between;
442
+ }
443
+
444
+ .panel-title {
445
+ font-size: 14px;
446
+ font-weight: 600;
447
+ color: var(--text-primary);
448
+ }
449
+
450
+ .panel-body {
451
+ padding: 16px 20px;
452
+ }
453
+
454
+ /* ============================================================
455
+ * Observation Type Badges
456
+ * ============================================================ */
457
+
458
+ .type-badge {
459
+ display: inline-flex;
460
+ align-items: center;
461
+ gap: 4px;
462
+ padding: 2px 8px;
463
+ border-radius: 6px;
464
+ font-size: 11px;
465
+ font-weight: 500;
466
+ white-space: nowrap;
467
+ }
468
+
469
+ .type-badge[data-type="session-request"] {
470
+ background: rgba(59, 130, 246, 0.15);
471
+ color: var(--type-session-request);
472
+ }
473
+
474
+ .type-badge[data-type="gotcha"] {
475
+ background: rgba(239, 68, 68, 0.15);
476
+ color: var(--type-gotcha);
477
+ }
478
+
479
+ .type-badge[data-type="problem-solution"] {
480
+ background: rgba(245, 158, 11, 0.15);
481
+ color: var(--type-problem-solution);
482
+ }
483
+
484
+ .type-badge[data-type="how-it-works"] {
485
+ background: rgba(59, 130, 246, 0.15);
486
+ color: var(--type-how-it-works);
487
+ }
488
+
489
+ .type-badge[data-type="what-changed"] {
490
+ background: rgba(16, 185, 129, 0.15);
491
+ color: var(--type-what-changed);
492
+ }
493
+
494
+ .type-badge[data-type="discovery"] {
495
+ background: rgba(168, 85, 247, 0.15);
496
+ color: var(--type-discovery);
497
+ }
498
+
499
+ .type-badge[data-type="why-it-exists"] {
500
+ background: rgba(249, 115, 22, 0.15);
501
+ color: var(--type-why-it-exists);
502
+ }
503
+
504
+ .type-badge[data-type="decision"] {
505
+ background: rgba(139, 92, 246, 0.15);
506
+ color: var(--type-decision);
507
+ }
508
+
509
+ .type-badge[data-type="trade-off"] {
510
+ background: rgba(107, 114, 128, 0.15);
511
+ color: var(--type-trade-off);
512
+ }
513
+
514
+ /* Type icons */
515
+ .type-icon::before {
516
+ font-size: 10px;
517
+ }
518
+
519
+ .type-icon[data-type="session-request"]::before {
520
+ content: '🎯';
521
+ }
522
+
523
+ .type-icon[data-type="gotcha"]::before {
524
+ content: '🔴';
525
+ }
526
+
527
+ .type-icon[data-type="problem-solution"]::before {
528
+ content: '🟡';
529
+ }
530
+
531
+ .type-icon[data-type="how-it-works"]::before {
532
+ content: '🔵';
533
+ }
534
+
535
+ .type-icon[data-type="what-changed"]::before {
536
+ content: '🟢';
537
+ }
538
+
539
+ .type-icon[data-type="discovery"]::before {
540
+ content: '🟣';
541
+ }
542
+
543
+ .type-icon[data-type="why-it-exists"]::before {
544
+ content: '🟠';
545
+ }
546
+
547
+ .type-icon[data-type="decision"]::before {
548
+ content: '🟤';
549
+ }
550
+
551
+ .type-icon[data-type="trade-off"]::before {
552
+ content: '⚖️';
553
+ }
554
+
555
+ /* ============================================================
556
+ * Recent Activity List
557
+ * ============================================================ */
558
+
559
+ .activity-list {
560
+ list-style: none;
561
+ }
562
+
563
+ .activity-item {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 12px;
567
+ padding: 12px 0;
568
+ border-bottom: 1px solid var(--border-subtle);
569
+ transition: background var(--transition-fast);
570
+ }
571
+
572
+ .activity-item:last-child {
573
+ border-bottom: none;
574
+ }
575
+
576
+ .activity-id {
577
+ font-family: var(--font-mono);
578
+ font-size: 12px;
579
+ color: var(--text-muted);
580
+ min-width: 32px;
581
+ }
582
+
583
+ .activity-title {
584
+ flex: 1;
585
+ font-size: 13px;
586
+ color: var(--text-primary);
587
+ white-space: nowrap;
588
+ overflow: hidden;
589
+ text-overflow: ellipsis;
590
+ }
591
+
592
+ .activity-entity {
593
+ font-size: 11px;
594
+ color: var(--text-muted);
595
+ font-family: var(--font-mono);
596
+ }
597
+
598
+ /* ============================================================
599
+ * Knowledge Graph
600
+ * ============================================================ */
601
+
602
+ .graph-layout {
603
+ display: flex;
604
+ gap: 16px;
605
+ height: calc(100vh - 140px);
606
+ }
607
+
608
+ #graph-container {
609
+ flex: 1;
610
+ min-width: 0;
611
+ background: var(--bg-surface);
612
+ border: 1px solid var(--border-subtle);
613
+ border-radius: 12px;
614
+ overflow: hidden;
615
+ position: relative;
616
+ }
617
+
618
+ #graph-canvas {
619
+ width: 100%;
620
+ height: 100%;
621
+ }
622
+
623
+ .graph-detail {
624
+ width: 300px;
625
+ flex-shrink: 0;
626
+ background: var(--bg-card);
627
+ border: 1px solid var(--border-subtle);
628
+ border-radius: 12px;
629
+ overflow-y: auto;
630
+ padding: 0;
631
+ }
632
+
633
+ .graph-detail-empty {
634
+ display: flex;
635
+ align-items: center;
636
+ justify-content: center;
637
+ height: 100%;
638
+ color: var(--text-muted);
639
+ font-size: 13px;
640
+ text-align: center;
641
+ padding: 24px;
642
+ }
643
+
644
+ .graph-detail-header {
645
+ display: flex;
646
+ align-items: center;
647
+ gap: 12px;
648
+ padding: 20px;
649
+ border-bottom: 1px solid var(--border-subtle);
650
+ }
651
+
652
+ .graph-detail-dot {
653
+ width: 14px;
654
+ height: 14px;
655
+ border-radius: 50%;
656
+ flex-shrink: 0;
657
+ }
658
+
659
+ .graph-detail-name {
660
+ font-size: 16px;
661
+ font-weight: 600;
662
+ color: var(--text-primary);
663
+ }
664
+
665
+ .graph-detail-type {
666
+ font-size: 12px;
667
+ color: var(--text-muted);
668
+ font-family: var(--font-mono);
669
+ }
670
+
671
+ .graph-detail-section {
672
+ padding: 16px 20px;
673
+ border-bottom: 1px solid var(--border-subtle);
674
+ }
675
+
676
+ .graph-detail-section:last-child {
677
+ border-bottom: none;
678
+ }
679
+
680
+ .graph-detail-section h3 {
681
+ font-size: 12px;
682
+ font-weight: 600;
683
+ color: var(--text-secondary);
684
+ text-transform: uppercase;
685
+ letter-spacing: 0.5px;
686
+ margin-bottom: 10px;
687
+ display: flex;
688
+ align-items: center;
689
+ gap: 6px;
690
+ }
691
+
692
+ .graph-detail-count {
693
+ font-size: 11px;
694
+ font-weight: 500;
695
+ padding: 1px 6px;
696
+ border-radius: 4px;
697
+ background: var(--bg-surface);
698
+ color: var(--text-muted);
699
+ }
700
+
701
+ .graph-obs-item {
702
+ font-size: 12px;
703
+ color: var(--text-primary);
704
+ line-height: 1.5;
705
+ padding: 6px 8px;
706
+ margin-bottom: 4px;
707
+ border-radius: 6px;
708
+ background: var(--bg-surface);
709
+ border-left: 2px solid var(--accent-cyan);
710
+ }
711
+
712
+ .graph-rel-item {
713
+ font-size: 12px;
714
+ color: var(--text-primary);
715
+ padding: 5px 0;
716
+ display: flex;
717
+ align-items: center;
718
+ gap: 6px;
719
+ }
720
+
721
+ .graph-rel-arrow {
722
+ color: var(--accent-cyan);
723
+ font-weight: 600;
724
+ }
725
+
726
+ .graph-rel-type {
727
+ font-family: var(--font-mono);
728
+ font-size: 11px;
729
+ color: var(--text-muted);
730
+ padding: 1px 6px;
731
+ background: var(--bg-surface);
732
+ border-radius: 4px;
733
+ }
734
+
735
+ .graph-detail-muted {
736
+ font-size: 12px;
737
+ color: var(--text-muted);
738
+ font-style: italic;
739
+ }
740
+
741
+ .graph-tooltip {
742
+ position: absolute;
743
+ background: var(--bg-card);
744
+ border: 1px solid var(--border-medium);
745
+ border-radius: 8px;
746
+ padding: 12px 16px;
747
+ font-size: 13px;
748
+ pointer-events: none;
749
+ opacity: 0;
750
+ transition: opacity var(--transition-fast);
751
+ z-index: 100;
752
+ max-width: 300px;
753
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
754
+ }
755
+
756
+ .graph-tooltip.visible {
757
+ opacity: 1;
758
+ }
759
+
760
+ .graph-tooltip-name {
761
+ font-weight: 600;
762
+ color: var(--accent-cyan);
763
+ margin-bottom: 4px;
764
+ }
765
+
766
+ .graph-tooltip-type {
767
+ font-size: 11px;
768
+ color: var(--text-muted);
769
+ }
770
+
771
+ /* ============================================================
772
+ * Observations Page
773
+ * ============================================================ */
774
+
775
+ .search-bar {
776
+ display: flex;
777
+ gap: 12px;
778
+ margin-bottom: 24px;
779
+ }
780
+
781
+ .search-input {
782
+ flex: 1;
783
+ background: var(--bg-card);
784
+ border: 1px solid var(--border-subtle);
785
+ border-radius: 10px;
786
+ padding: 10px 16px;
787
+ color: var(--text-primary);
788
+ font-family: var(--font-sans);
789
+ font-size: 14px;
790
+ outline: none;
791
+ transition: border-color var(--transition-fast);
792
+ }
793
+
794
+ .search-input:focus {
795
+ border-color: var(--accent-cyan);
796
+ box-shadow: var(--glow-cyan);
797
+ }
798
+
799
+ .search-input::placeholder {
800
+ color: var(--text-muted);
801
+ }
802
+
803
+ .filter-btn {
804
+ background: var(--bg-card);
805
+ border: 1px solid var(--border-subtle);
806
+ border-radius: 10px;
807
+ padding: 10px 16px;
808
+ color: var(--text-secondary);
809
+ cursor: pointer;
810
+ font-size: 13px;
811
+ transition: all var(--transition-fast);
812
+ white-space: nowrap;
813
+ }
814
+
815
+ .filter-btn:hover {
816
+ background: var(--bg-card-hover);
817
+ border-color: var(--border-medium);
818
+ }
819
+
820
+ .filter-btn.active {
821
+ background: rgba(0, 212, 255, 0.08);
822
+ border-color: var(--accent-cyan);
823
+ color: var(--accent-cyan);
824
+ }
825
+
826
+ .obs-grid {
827
+ display: grid;
828
+ gap: 12px;
829
+ }
830
+
831
+ .obs-card {
832
+ background: var(--bg-card);
833
+ border: 1px solid var(--border-subtle);
834
+ border-radius: 12px;
835
+ padding: 16px 20px;
836
+ cursor: pointer;
837
+ transition: all var(--transition-normal);
838
+ }
839
+
840
+ .obs-card:hover {
841
+ background: var(--bg-card-hover);
842
+ border-color: var(--border-medium);
843
+ transform: translateX(4px);
844
+ }
845
+
846
+ .obs-card-header {
847
+ display: flex;
848
+ align-items: center;
849
+ gap: 8px;
850
+ margin-bottom: 8px;
851
+ }
852
+
853
+ .obs-card-id {
854
+ font-family: var(--font-mono);
855
+ font-size: 12px;
856
+ color: var(--text-muted);
857
+ }
858
+
859
+ .obs-card-title {
860
+ font-size: 14px;
861
+ font-weight: 500;
862
+ color: var(--text-primary);
863
+ flex: 1;
864
+ }
865
+
866
+ .obs-card-meta {
867
+ display: flex;
868
+ gap: 12px;
869
+ font-size: 12px;
870
+ color: var(--text-muted);
871
+ }
872
+
873
+ .obs-card-narrative {
874
+ font-size: 13px;
875
+ color: var(--text-secondary);
876
+ line-height: 1.5;
877
+ margin-top: 8px;
878
+ display: -webkit-box;
879
+ -webkit-line-clamp: 2;
880
+ line-clamp: 2;
881
+ -webkit-box-orient: vertical;
882
+ overflow: hidden;
883
+ }
884
+
885
+ .obs-card-facts {
886
+ display: flex;
887
+ flex-wrap: wrap;
888
+ gap: 6px;
889
+ margin-top: 8px;
890
+ }
891
+
892
+ .fact-tag {
893
+ background: rgba(0, 212, 255, 0.06);
894
+ border: 1px solid rgba(0, 212, 255, 0.12);
895
+ border-radius: 6px;
896
+ padding: 2px 8px;
897
+ font-size: 11px;
898
+ font-family: var(--font-mono);
899
+ color: var(--accent-cyan);
900
+ }
901
+
902
+ /* ============================================================
903
+ * Retention Page
904
+ * ============================================================ */
905
+
906
+ .retention-summary {
907
+ display: grid;
908
+ grid-template-columns: repeat(4, 1fr);
909
+ gap: 16px;
910
+ margin-bottom: 32px;
911
+ }
912
+
913
+ .retention-table {
914
+ width: 100%;
915
+ border-collapse: collapse;
916
+ }
917
+
918
+ .retention-table th {
919
+ text-align: left;
920
+ font-size: 11px;
921
+ font-weight: 600;
922
+ color: var(--text-muted);
923
+ text-transform: uppercase;
924
+ letter-spacing: 0.5px;
925
+ padding: 12px 16px;
926
+ border-bottom: 1px solid var(--border-subtle);
927
+ }
928
+
929
+ .retention-table td {
930
+ padding: 12px 16px;
931
+ font-size: 13px;
932
+ border-bottom: 1px solid var(--border-subtle);
933
+ }
934
+
935
+ .retention-table tr:hover td {
936
+ background: rgba(255, 255, 255, 0.02);
937
+ }
938
+
939
+ .score-bar {
940
+ width: 80px;
941
+ height: 6px;
942
+ background: rgba(255, 255, 255, 0.06);
943
+ border-radius: 3px;
944
+ overflow: hidden;
945
+ display: inline-block;
946
+ vertical-align: middle;
947
+ margin-right: 8px;
948
+ }
949
+
950
+ .score-bar-fill {
951
+ height: 100%;
952
+ border-radius: 3px;
953
+ transition: width var(--transition-normal);
954
+ }
955
+
956
+ .immune-badge {
957
+ display: inline-flex;
958
+ align-items: center;
959
+ gap: 4px;
960
+ padding: 2px 6px;
961
+ border-radius: 4px;
962
+ font-size: 10px;
963
+ font-weight: 600;
964
+ background: rgba(16, 185, 129, 0.12);
965
+ color: var(--accent-green);
966
+ }
967
+
968
+ /* ============================================================
969
+ * Empty State
970
+ * ============================================================ */
971
+
972
+ .empty-state {
973
+ display: flex;
974
+ flex-direction: column;
975
+ align-items: center;
976
+ justify-content: center;
977
+ padding: 80px 20px;
978
+ text-align: center;
979
+ }
980
+
981
+ .empty-state-icon {
982
+ font-size: 48px;
983
+ margin-bottom: 16px;
984
+ opacity: 0.5;
985
+ }
986
+
987
+ .empty-state-title {
988
+ font-size: 18px;
989
+ font-weight: 600;
990
+ color: var(--text-secondary);
991
+ margin-bottom: 8px;
992
+ }
993
+
994
+ .empty-state-desc {
995
+ font-size: 14px;
996
+ color: var(--text-muted);
997
+ max-width: 400px;
998
+ }
999
+
1000
+ /* ============================================================
1001
+ * Loading
1002
+ * ============================================================ */
1003
+
1004
+ .loading {
1005
+ display: flex;
1006
+ align-items: center;
1007
+ justify-content: center;
1008
+ padding: 60px;
1009
+ }
1010
+
1011
+ .spinner {
1012
+ width: 24px;
1013
+ height: 24px;
1014
+ border: 2px solid var(--border-subtle);
1015
+ border-top-color: var(--accent-cyan);
1016
+ border-radius: 50%;
1017
+ animation: spin 0.8s linear infinite;
1018
+ }
1019
+
1020
+ @keyframes spin {
1021
+ to {
1022
+ transform: rotate(360deg);
1023
+ }
1024
+ }
1025
+
1026
+ /* ============================================================
1027
+ * Responsive
1028
+ * ============================================================ */
1029
+
1030
+ @media (max-width: 900px) {
1031
+
1032
+ .stats-grid,
1033
+ .retention-summary {
1034
+ grid-template-columns: repeat(2, 1fr);
1035
+ }
1036
+ }
1037
+
1038
+ @media (max-width: 600px) {
1039
+
1040
+ .stats-grid,
1041
+ .retention-summary {
1042
+ grid-template-columns: 1fr;
1043
+ }
1044
+
1045
+ .page {
1046
+ padding: 16px;
1047
+ }
1048
+ }