@memextend/webui 0.1.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.
@@ -0,0 +1,1436 @@
1
+ /* apps/webui/src/public/styles.css */
2
+ /* memextend Web UI Styles - Refined Dark Theme */
3
+
4
+ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Outfit:wght@300;400;500;600;700&display=swap');
5
+
6
+ :root {
7
+ /* Refined dark palette with subtle warmth */
8
+ --bg-primary: #0a0c10;
9
+ --bg-secondary: #12151c;
10
+ --bg-tertiary: #1a1e28;
11
+ --bg-elevated: #222736;
12
+ --border-color: #2a303c;
13
+ --border-subtle: #1e232d;
14
+
15
+ /* Text hierarchy */
16
+ --text-primary: #e4e8f0;
17
+ --text-secondary: #9aa3b8;
18
+ --text-muted: #5e6880;
19
+
20
+ /* Accent colors with depth */
21
+ --accent-blue: #4d9fff;
22
+ --accent-blue-dim: rgba(77, 159, 255, 0.15);
23
+ --accent-green: #34d399;
24
+ --accent-green-dim: rgba(52, 211, 153, 0.15);
25
+ --accent-yellow: #fbbf24;
26
+ --accent-yellow-dim: rgba(251, 191, 36, 0.15);
27
+ --accent-red: #f87171;
28
+ --accent-red-dim: rgba(248, 113, 113, 0.15);
29
+ --accent-purple: #a78bfa;
30
+ --accent-purple-dim: rgba(167, 139, 250, 0.15);
31
+ --accent-teal: #2dd4bf;
32
+ --accent-teal-dim: rgba(45, 212, 191, 0.15);
33
+
34
+ /* Typography */
35
+ --font-mono: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', monospace;
36
+ --font-sans: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
37
+
38
+ /* Spatial rhythm */
39
+ --radius-sm: 4px;
40
+ --radius: 8px;
41
+ --radius-lg: 12px;
42
+ --radius-xl: 16px;
43
+
44
+ /* Shadows with depth */
45
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.2);
46
+ --shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
47
+ --shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.4);
48
+ --shadow-glow: 0 0 40px rgba(77, 159, 255, 0.1);
49
+
50
+ /* Transitions */
51
+ --transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
52
+ --transition: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
53
+ --transition-slow: 0.4s cubic-bezier(0.4, 0, 0.2, 1);
54
+ }
55
+
56
+ * {
57
+ box-sizing: border-box;
58
+ margin: 0;
59
+ padding: 0;
60
+ }
61
+
62
+ body {
63
+ font-family: var(--font-sans);
64
+ background: var(--bg-primary);
65
+ color: var(--text-primary);
66
+ line-height: 1.6;
67
+ min-height: 100vh;
68
+ font-weight: 400;
69
+ letter-spacing: 0.01em;
70
+ -webkit-font-smoothing: antialiased;
71
+ -moz-osx-font-smoothing: grayscale;
72
+ }
73
+
74
+ /* Subtle background texture */
75
+ body::before {
76
+ content: '';
77
+ position: fixed;
78
+ top: 0;
79
+ left: 0;
80
+ right: 0;
81
+ bottom: 0;
82
+ background:
83
+ radial-gradient(ellipse 80% 50% at 50% -20%, rgba(77, 159, 255, 0.05), transparent),
84
+ radial-gradient(ellipse 60% 40% at 100% 100%, rgba(167, 139, 250, 0.03), transparent);
85
+ pointer-events: none;
86
+ z-index: -1;
87
+ }
88
+
89
+ /* Header */
90
+ .header {
91
+ background: linear-gradient(180deg, var(--bg-secondary) 0%, rgba(18, 21, 28, 0.95) 100%);
92
+ backdrop-filter: blur(12px);
93
+ border-bottom: 1px solid var(--border-subtle);
94
+ padding: 1rem 2.5rem;
95
+ display: flex;
96
+ justify-content: space-between;
97
+ align-items: center;
98
+ position: sticky;
99
+ top: 0;
100
+ z-index: 100;
101
+ }
102
+
103
+ .header-brand {
104
+ display: flex;
105
+ align-items: baseline;
106
+ gap: 1rem;
107
+ }
108
+
109
+ .header-brand h1 {
110
+ font-size: 1.375rem;
111
+ font-weight: 600;
112
+ color: var(--text-primary);
113
+ letter-spacing: -0.02em;
114
+ background: linear-gradient(135deg, var(--text-primary), var(--accent-blue));
115
+ -webkit-background-clip: text;
116
+ -webkit-text-fill-color: transparent;
117
+ background-clip: text;
118
+ }
119
+
120
+ .header-tagline {
121
+ color: var(--text-muted);
122
+ font-size: 0.8rem;
123
+ font-weight: 400;
124
+ letter-spacing: 0.02em;
125
+ }
126
+
127
+ .header-nav {
128
+ display: flex;
129
+ gap: 0.375rem;
130
+ padding: 0.25rem;
131
+ background: var(--bg-primary);
132
+ border-radius: var(--radius-lg);
133
+ border: 1px solid var(--border-subtle);
134
+ }
135
+
136
+ .nav-btn {
137
+ background: transparent;
138
+ border: none;
139
+ color: var(--text-muted);
140
+ padding: 0.625rem 1.125rem;
141
+ border-radius: var(--radius);
142
+ cursor: pointer;
143
+ font-size: 0.8125rem;
144
+ font-weight: 500;
145
+ transition: all var(--transition-fast);
146
+ font-family: var(--font-sans);
147
+ }
148
+
149
+ .nav-btn:hover {
150
+ background: var(--bg-tertiary);
151
+ color: var(--text-primary);
152
+ }
153
+
154
+ .nav-btn.active {
155
+ background: var(--accent-blue);
156
+ color: white;
157
+ box-shadow: 0 2px 8px rgba(77, 159, 255, 0.3);
158
+ }
159
+
160
+ /* Main Content */
161
+ .main-content {
162
+ padding: 2.5rem;
163
+ max-width: 1440px;
164
+ margin: 0 auto;
165
+ animation: fadeIn 0.4s ease-out;
166
+ }
167
+
168
+ @keyframes fadeIn {
169
+ from {
170
+ opacity: 0;
171
+ transform: translateY(8px);
172
+ }
173
+ to {
174
+ opacity: 1;
175
+ transform: translateY(0);
176
+ }
177
+ }
178
+
179
+ .view {
180
+ display: none;
181
+ }
182
+
183
+ .view.active {
184
+ display: block;
185
+ animation: fadeIn 0.3s ease-out;
186
+ }
187
+
188
+ /* Cards */
189
+ .card {
190
+ background: var(--bg-secondary);
191
+ border: 1px solid var(--border-subtle);
192
+ border-radius: var(--radius-lg);
193
+ padding: 1.5rem;
194
+ transition: all var(--transition);
195
+ }
196
+
197
+ .card:hover {
198
+ border-color: var(--border-color);
199
+ box-shadow: var(--shadow-sm);
200
+ }
201
+
202
+ .card h3 {
203
+ margin-bottom: 1rem;
204
+ color: var(--text-primary);
205
+ font-size: 0.9375rem;
206
+ font-weight: 600;
207
+ letter-spacing: -0.01em;
208
+ }
209
+
210
+ /* Dashboard */
211
+ .dashboard-grid {
212
+ display: grid;
213
+ grid-template-columns: repeat(4, 1fr);
214
+ gap: 1.5rem;
215
+ }
216
+
217
+ .stats-row {
218
+ grid-column: 1 / -1;
219
+ display: grid;
220
+ grid-template-columns: repeat(4, 1fr);
221
+ gap: 1.5rem;
222
+ }
223
+
224
+ .stat-card {
225
+ background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%);
226
+ border: 1px solid var(--border-subtle);
227
+ border-radius: var(--radius-lg);
228
+ padding: 1.75rem;
229
+ text-align: center;
230
+ position: relative;
231
+ overflow: hidden;
232
+ transition: all var(--transition);
233
+ }
234
+
235
+ .stat-card::before {
236
+ content: '';
237
+ position: absolute;
238
+ top: 0;
239
+ left: 0;
240
+ right: 0;
241
+ height: 2px;
242
+ background: linear-gradient(90deg, var(--accent-blue), var(--accent-purple));
243
+ opacity: 0;
244
+ transition: opacity var(--transition);
245
+ }
246
+
247
+ .stat-card:hover {
248
+ transform: translateY(-2px);
249
+ box-shadow: var(--shadow);
250
+ }
251
+
252
+ .stat-card:hover::before {
253
+ opacity: 1;
254
+ }
255
+
256
+ .stat-card:nth-child(1) .stat-value { color: var(--accent-blue); }
257
+ .stat-card:nth-child(2) .stat-value { color: var(--accent-purple); }
258
+ .stat-card:nth-child(3) .stat-value { color: var(--accent-teal); }
259
+ .stat-card:nth-child(4) .stat-value { color: var(--accent-green); }
260
+
261
+ .stat-value {
262
+ font-size: 2.75rem;
263
+ font-weight: 700;
264
+ margin-bottom: 0.5rem;
265
+ letter-spacing: -0.03em;
266
+ font-family: var(--font-mono);
267
+ }
268
+
269
+ .stat-label {
270
+ color: var(--text-muted);
271
+ font-size: 0.8125rem;
272
+ font-weight: 500;
273
+ text-transform: uppercase;
274
+ letter-spacing: 0.05em;
275
+ }
276
+
277
+ .activity-card {
278
+ grid-column: span 2;
279
+ }
280
+
281
+ .full-width {
282
+ grid-column: 1 / -1;
283
+ }
284
+
285
+ /* Activity Chart */
286
+ .activity-chart {
287
+ height: 140px;
288
+ display: flex;
289
+ align-items: flex-end;
290
+ gap: 3px;
291
+ padding-top: 1rem;
292
+ padding-bottom: 0.5rem;
293
+ }
294
+
295
+ .activity-bar {
296
+ flex: 1;
297
+ background: linear-gradient(180deg, var(--accent-blue) 0%, rgba(77, 159, 255, 0.5) 100%);
298
+ border-radius: 3px 3px 0 0;
299
+ min-height: 4px;
300
+ transition: all var(--transition-fast);
301
+ position: relative;
302
+ cursor: pointer;
303
+ }
304
+
305
+ .activity-bar:hover {
306
+ background: linear-gradient(180deg, var(--accent-teal) 0%, rgba(45, 212, 191, 0.5) 100%);
307
+ transform: scaleY(1.05);
308
+ transform-origin: bottom;
309
+ }
310
+
311
+ .activity-bar:hover::after {
312
+ content: attr(data-count) ' memories';
313
+ position: absolute;
314
+ bottom: 100%;
315
+ left: 50%;
316
+ transform: translateX(-50%);
317
+ background: var(--bg-elevated);
318
+ padding: 0.375rem 0.625rem;
319
+ border-radius: var(--radius);
320
+ font-size: 0.75rem;
321
+ white-space: nowrap;
322
+ margin-bottom: 6px;
323
+ box-shadow: var(--shadow);
324
+ border: 1px solid var(--border-color);
325
+ color: var(--text-primary);
326
+ font-weight: 500;
327
+ }
328
+
329
+ /* Breakdown Lists */
330
+ .breakdown-list {
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: 0.625rem;
334
+ }
335
+
336
+ .breakdown-item {
337
+ display: flex;
338
+ justify-content: space-between;
339
+ align-items: center;
340
+ padding: 0.75rem 1rem;
341
+ background: var(--bg-tertiary);
342
+ border-radius: var(--radius);
343
+ border: 1px solid transparent;
344
+ transition: all var(--transition-fast);
345
+ }
346
+
347
+ .breakdown-item:hover {
348
+ background: var(--bg-elevated);
349
+ border-color: var(--border-subtle);
350
+ }
351
+
352
+ .breakdown-label {
353
+ color: var(--text-secondary);
354
+ font-size: 0.8125rem;
355
+ font-weight: 500;
356
+ }
357
+
358
+ .breakdown-value {
359
+ color: var(--text-primary);
360
+ font-weight: 600;
361
+ font-family: var(--font-mono);
362
+ font-size: 0.875rem;
363
+ }
364
+
365
+ /* Memory List */
366
+ .memory-list {
367
+ display: flex;
368
+ flex-direction: column;
369
+ gap: 0.875rem;
370
+ }
371
+
372
+ .memory-item {
373
+ background: var(--bg-secondary);
374
+ border: 1px solid var(--border-subtle);
375
+ border-radius: var(--radius-lg);
376
+ padding: 1.25rem;
377
+ cursor: pointer;
378
+ transition: all var(--transition-fast);
379
+ position: relative;
380
+ }
381
+
382
+ .memory-item::before {
383
+ content: '';
384
+ position: absolute;
385
+ left: 0;
386
+ top: 0;
387
+ bottom: 0;
388
+ width: 3px;
389
+ background: transparent;
390
+ border-radius: var(--radius-lg) 0 0 var(--radius-lg);
391
+ transition: background var(--transition-fast);
392
+ }
393
+
394
+ .memory-item:hover {
395
+ border-color: var(--border-color);
396
+ background: var(--bg-tertiary);
397
+ transform: translateX(2px);
398
+ }
399
+
400
+ .memory-item:hover::before {
401
+ background: var(--accent-blue);
402
+ }
403
+
404
+ .memory-item-header {
405
+ display: flex;
406
+ justify-content: space-between;
407
+ align-items: flex-start;
408
+ margin-bottom: 0.75rem;
409
+ }
410
+
411
+ .memory-item-meta {
412
+ display: flex;
413
+ gap: 0.625rem;
414
+ align-items: center;
415
+ }
416
+
417
+ .memory-type-badge {
418
+ font-size: 0.6875rem;
419
+ padding: 0.3125rem 0.625rem;
420
+ border-radius: var(--radius);
421
+ background: var(--bg-primary);
422
+ color: var(--text-secondary);
423
+ font-weight: 600;
424
+ text-transform: uppercase;
425
+ letter-spacing: 0.03em;
426
+ }
427
+
428
+ .memory-type-badge.reasoning { background: var(--accent-teal-dim); color: var(--accent-teal); }
429
+ .memory-type-badge.tool_capture { background: var(--accent-blue-dim); color: var(--accent-blue); }
430
+ .memory-type-badge.summary { background: var(--accent-purple-dim); color: var(--accent-purple); }
431
+ .memory-type-badge.manual { background: var(--accent-green-dim); color: var(--accent-green); }
432
+
433
+ .memory-source {
434
+ font-size: 0.75rem;
435
+ color: var(--text-muted);
436
+ font-family: var(--font-mono);
437
+ }
438
+
439
+ .memory-date {
440
+ font-size: 0.75rem;
441
+ color: var(--text-muted);
442
+ font-weight: 500;
443
+ }
444
+
445
+ .memory-content {
446
+ color: var(--text-secondary);
447
+ font-size: 0.875rem;
448
+ line-height: 1.7;
449
+ white-space: pre-wrap;
450
+ word-break: break-word;
451
+ max-height: 120px;
452
+ overflow: hidden;
453
+ mask-image: linear-gradient(180deg, black 70%, transparent 100%);
454
+ -webkit-mask-image: linear-gradient(180deg, black 70%, transparent 100%);
455
+ }
456
+
457
+ .memory-id {
458
+ font-family: var(--font-mono);
459
+ font-size: 0.6875rem;
460
+ color: var(--text-muted);
461
+ margin-top: 0.75rem;
462
+ opacity: 0.7;
463
+ }
464
+
465
+ /* Filters */
466
+ .memories-header {
467
+ margin-bottom: 2rem;
468
+ }
469
+
470
+ .memories-header-top {
471
+ display: flex;
472
+ justify-content: space-between;
473
+ align-items: flex-start;
474
+ gap: 1rem;
475
+ margin-bottom: 1rem;
476
+ }
477
+
478
+ .memories-header-top h2 {
479
+ margin: 0;
480
+ }
481
+
482
+ .memories-header h2 {
483
+ margin-bottom: 0.5rem;
484
+ font-size: 1.5rem;
485
+ font-weight: 600;
486
+ letter-spacing: -0.02em;
487
+ }
488
+
489
+ .form-group {
490
+ margin-bottom: 1rem;
491
+ }
492
+
493
+ .form-group label {
494
+ display: block;
495
+ font-size: 0.875rem;
496
+ font-weight: 500;
497
+ color: var(--text-secondary);
498
+ margin-bottom: 0.5rem;
499
+ }
500
+
501
+ .filters {
502
+ display: flex;
503
+ gap: 0.75rem;
504
+ flex-wrap: wrap;
505
+ align-items: center;
506
+ padding: 1rem 1.25rem;
507
+ background: var(--bg-secondary);
508
+ border-radius: var(--radius-lg);
509
+ border: 1px solid var(--border-subtle);
510
+ }
511
+
512
+ .filter-select,
513
+ .filter-input {
514
+ background: var(--bg-tertiary);
515
+ border: 1px solid var(--border-color);
516
+ color: var(--text-primary);
517
+ padding: 0.625rem 0.875rem;
518
+ border-radius: var(--radius);
519
+ font-size: 0.8125rem;
520
+ font-family: var(--font-sans);
521
+ transition: all var(--transition-fast);
522
+ }
523
+
524
+ .filter-select:focus,
525
+ .filter-input:focus {
526
+ outline: none;
527
+ border-color: var(--accent-blue);
528
+ box-shadow: 0 0 0 3px var(--accent-blue-dim);
529
+ }
530
+
531
+ .filter-select:hover,
532
+ .filter-input:hover {
533
+ border-color: var(--text-muted);
534
+ }
535
+
536
+ /* Buttons */
537
+ .btn {
538
+ padding: 0.625rem 1.125rem;
539
+ border-radius: var(--radius);
540
+ font-size: 0.8125rem;
541
+ cursor: pointer;
542
+ border: none;
543
+ transition: all var(--transition-fast);
544
+ font-weight: 600;
545
+ font-family: var(--font-sans);
546
+ display: inline-flex;
547
+ align-items: center;
548
+ justify-content: center;
549
+ gap: 0.5rem;
550
+ }
551
+
552
+ .btn-primary {
553
+ background: linear-gradient(135deg, var(--accent-blue) 0%, #3d8bff 100%);
554
+ color: white;
555
+ box-shadow: 0 2px 8px rgba(77, 159, 255, 0.25);
556
+ }
557
+
558
+ .btn-primary:hover {
559
+ background: linear-gradient(135deg, #5aa8ff 0%, var(--accent-blue) 100%);
560
+ box-shadow: 0 4px 16px rgba(77, 159, 255, 0.35);
561
+ transform: translateY(-1px);
562
+ }
563
+
564
+ .btn-secondary {
565
+ background: var(--bg-tertiary);
566
+ color: var(--text-primary);
567
+ border: 1px solid var(--border-color);
568
+ }
569
+
570
+ .btn-secondary:hover {
571
+ background: var(--bg-elevated);
572
+ border-color: var(--text-muted);
573
+ }
574
+
575
+ .btn-danger {
576
+ background: linear-gradient(135deg, var(--accent-red) 0%, #e55b5b 100%);
577
+ color: white;
578
+ box-shadow: 0 2px 8px rgba(248, 113, 113, 0.25);
579
+ }
580
+
581
+ .btn-danger:hover {
582
+ background: linear-gradient(135deg, #ff8080 0%, var(--accent-red) 100%);
583
+ box-shadow: 0 4px 16px rgba(248, 113, 113, 0.35);
584
+ transform: translateY(-1px);
585
+ }
586
+
587
+ .btn-lg {
588
+ padding: 0.875rem 1.75rem;
589
+ font-size: 0.9375rem;
590
+ }
591
+
592
+ .btn-small {
593
+ padding: 0.375rem 0.75rem;
594
+ font-size: 0.75rem;
595
+ }
596
+
597
+ .btn-tiny {
598
+ padding: 0.25rem 0.5rem;
599
+ font-size: 0.75rem;
600
+ min-width: unset;
601
+ line-height: 1;
602
+ }
603
+
604
+ /* Filter group */
605
+ .filter-group {
606
+ display: flex;
607
+ gap: 0.5rem;
608
+ align-items: center;
609
+ }
610
+
611
+ /* Header actions */
612
+ .header-actions {
613
+ display: flex;
614
+ gap: 0.75rem;
615
+ align-items: center;
616
+ }
617
+
618
+ /* Warning text */
619
+ .warning-text {
620
+ color: var(--accent-red);
621
+ font-size: 0.875rem;
622
+ margin-top: 0.5rem;
623
+ }
624
+
625
+ /* Search */
626
+ .search-container {
627
+ margin-bottom: 2rem;
628
+ }
629
+
630
+ .search-box {
631
+ display: flex;
632
+ gap: 0.75rem;
633
+ margin-bottom: 1.25rem;
634
+ }
635
+
636
+ .search-input {
637
+ flex: 1;
638
+ background: var(--bg-secondary);
639
+ border: 1px solid var(--border-color);
640
+ color: var(--text-primary);
641
+ padding: 1rem 1.25rem;
642
+ border-radius: var(--radius-lg);
643
+ font-size: 1rem;
644
+ font-family: var(--font-sans);
645
+ transition: all var(--transition-fast);
646
+ }
647
+
648
+ .search-input::placeholder {
649
+ color: var(--text-muted);
650
+ }
651
+
652
+ .search-input:focus {
653
+ outline: none;
654
+ border-color: var(--accent-blue);
655
+ box-shadow: 0 0 0 3px var(--accent-blue-dim);
656
+ }
657
+
658
+ .search-options {
659
+ display: flex;
660
+ gap: 1.5rem;
661
+ align-items: center;
662
+ color: var(--text-secondary);
663
+ font-size: 0.8125rem;
664
+ padding: 1rem 1.25rem;
665
+ background: var(--bg-secondary);
666
+ border-radius: var(--radius-lg);
667
+ border: 1px solid var(--border-subtle);
668
+ }
669
+
670
+ .search-options label {
671
+ display: flex;
672
+ align-items: center;
673
+ gap: 0.5rem;
674
+ cursor: pointer;
675
+ transition: color var(--transition-fast);
676
+ }
677
+
678
+ .search-options label:hover {
679
+ color: var(--text-primary);
680
+ }
681
+
682
+ .search-options input[type="radio"] {
683
+ accent-color: var(--accent-blue);
684
+ }
685
+
686
+ .search-info {
687
+ margin-top: 1.25rem;
688
+ padding: 1rem 1.25rem;
689
+ background: var(--bg-secondary);
690
+ border-radius: var(--radius-lg);
691
+ font-size: 0.875rem;
692
+ color: var(--text-secondary);
693
+ border: 1px solid var(--border-subtle);
694
+ }
695
+
696
+ /* Pagination */
697
+ .pagination {
698
+ display: flex;
699
+ justify-content: center;
700
+ align-items: center;
701
+ gap: 0.75rem;
702
+ margin-top: 2rem;
703
+ padding-top: 1.5rem;
704
+ border-top: 1px solid var(--border-subtle);
705
+ }
706
+
707
+ .pagination button {
708
+ padding: 0.625rem 1.25rem;
709
+ background: var(--bg-secondary);
710
+ border: 1px solid var(--border-color);
711
+ color: var(--text-primary);
712
+ border-radius: var(--radius);
713
+ cursor: pointer;
714
+ transition: all var(--transition-fast);
715
+ font-weight: 500;
716
+ font-size: 0.8125rem;
717
+ font-family: var(--font-sans);
718
+ }
719
+
720
+ .pagination button:hover:not(:disabled) {
721
+ background: var(--bg-tertiary);
722
+ border-color: var(--accent-blue);
723
+ color: var(--accent-blue);
724
+ }
725
+
726
+ .pagination button:disabled {
727
+ opacity: 0.4;
728
+ cursor: not-allowed;
729
+ }
730
+
731
+ .pagination .page-info {
732
+ padding: 0.625rem 1rem;
733
+ color: var(--text-muted);
734
+ font-size: 0.8125rem;
735
+ font-weight: 500;
736
+ }
737
+
738
+ /* Modal */
739
+ .modal {
740
+ display: none;
741
+ position: fixed;
742
+ top: 0;
743
+ left: 0;
744
+ right: 0;
745
+ bottom: 0;
746
+ background: rgba(0, 0, 0, 0.8);
747
+ backdrop-filter: blur(4px);
748
+ z-index: 200;
749
+ justify-content: center;
750
+ align-items: center;
751
+ }
752
+
753
+ .modal.active {
754
+ display: flex;
755
+ animation: modalFadeIn 0.25s ease-out;
756
+ }
757
+
758
+ @keyframes modalFadeIn {
759
+ from {
760
+ opacity: 0;
761
+ }
762
+ to {
763
+ opacity: 1;
764
+ }
765
+ }
766
+
767
+ .modal-content {
768
+ background: var(--bg-secondary);
769
+ border: 1px solid var(--border-color);
770
+ border-radius: var(--radius-xl);
771
+ width: 90%;
772
+ max-width: 700px;
773
+ max-height: 85vh;
774
+ overflow: hidden;
775
+ display: flex;
776
+ flex-direction: column;
777
+ box-shadow: var(--shadow-lg);
778
+ animation: modalSlideIn 0.3s ease-out;
779
+ }
780
+
781
+ @keyframes modalSlideIn {
782
+ from {
783
+ transform: translateY(20px) scale(0.98);
784
+ opacity: 0;
785
+ }
786
+ to {
787
+ transform: translateY(0) scale(1);
788
+ opacity: 1;
789
+ }
790
+ }
791
+
792
+ .modal-small {
793
+ max-width: 420px;
794
+ }
795
+
796
+ .modal-header {
797
+ display: flex;
798
+ justify-content: space-between;
799
+ align-items: center;
800
+ padding: 1.25rem 1.75rem;
801
+ border-bottom: 1px solid var(--border-subtle);
802
+ background: var(--bg-tertiary);
803
+ }
804
+
805
+ .modal-header h3 {
806
+ font-size: 1.125rem;
807
+ font-weight: 600;
808
+ letter-spacing: -0.01em;
809
+ }
810
+
811
+ .modal-close {
812
+ background: var(--bg-elevated);
813
+ border: none;
814
+ color: var(--text-secondary);
815
+ font-size: 1.25rem;
816
+ cursor: pointer;
817
+ line-height: 1;
818
+ width: 32px;
819
+ height: 32px;
820
+ border-radius: var(--radius);
821
+ display: flex;
822
+ align-items: center;
823
+ justify-content: center;
824
+ transition: all var(--transition-fast);
825
+ }
826
+
827
+ .modal-close:hover {
828
+ background: var(--accent-red-dim);
829
+ color: var(--accent-red);
830
+ }
831
+
832
+ .modal-body {
833
+ padding: 1.75rem;
834
+ overflow-y: auto;
835
+ flex: 1;
836
+ }
837
+
838
+ .modal-footer {
839
+ padding: 1.25rem 1.75rem;
840
+ border-top: 1px solid var(--border-subtle);
841
+ display: flex;
842
+ gap: 0.75rem;
843
+ justify-content: flex-end;
844
+ background: var(--bg-tertiary);
845
+ }
846
+
847
+ /* Memory Detail Modal */
848
+ .memory-detail-meta {
849
+ display: flex;
850
+ gap: 1rem;
851
+ margin-bottom: 1.25rem;
852
+ flex-wrap: wrap;
853
+ font-size: 0.8125rem;
854
+ color: var(--text-secondary);
855
+ }
856
+
857
+ .memory-detail-meta code {
858
+ font-family: var(--font-mono);
859
+ background: var(--bg-elevated);
860
+ padding: 0.25rem 0.5rem;
861
+ border-radius: var(--radius-sm);
862
+ font-size: 0.75rem;
863
+ }
864
+
865
+ .memory-detail-content {
866
+ margin-bottom: 1.25rem;
867
+ }
868
+
869
+ .memory-detail-content label {
870
+ display: block;
871
+ margin-bottom: 0.625rem;
872
+ color: var(--text-muted);
873
+ font-size: 0.8125rem;
874
+ font-weight: 500;
875
+ text-transform: uppercase;
876
+ letter-spacing: 0.04em;
877
+ }
878
+
879
+ .content-editor {
880
+ width: 100%;
881
+ min-height: 240px;
882
+ background: var(--bg-primary);
883
+ border: 1px solid var(--border-color);
884
+ color: var(--text-primary);
885
+ padding: 1.25rem;
886
+ border-radius: var(--radius-lg);
887
+ font-family: var(--font-mono);
888
+ font-size: 0.8125rem;
889
+ line-height: 1.7;
890
+ resize: vertical;
891
+ transition: all var(--transition-fast);
892
+ }
893
+
894
+ .content-editor:focus {
895
+ outline: none;
896
+ border-color: var(--accent-blue);
897
+ box-shadow: 0 0 0 3px var(--accent-blue-dim);
898
+ }
899
+
900
+ /* Model Status */
901
+ .model-status {
902
+ display: flex;
903
+ align-items: center;
904
+ gap: 0.875rem;
905
+ }
906
+
907
+ .model-status-indicator {
908
+ width: 10px;
909
+ height: 10px;
910
+ border-radius: 50%;
911
+ position: relative;
912
+ }
913
+
914
+ .model-status-indicator::after {
915
+ content: '';
916
+ position: absolute;
917
+ top: -3px;
918
+ left: -3px;
919
+ right: -3px;
920
+ bottom: -3px;
921
+ border-radius: 50%;
922
+ opacity: 0.3;
923
+ }
924
+
925
+ .model-status-indicator.available {
926
+ background: var(--accent-green);
927
+ box-shadow: 0 0 8px var(--accent-green);
928
+ }
929
+
930
+ .model-status-indicator.available::after {
931
+ border: 1px solid var(--accent-green);
932
+ }
933
+
934
+ .model-status-indicator.unavailable {
935
+ background: var(--accent-yellow);
936
+ box-shadow: 0 0 8px var(--accent-yellow);
937
+ }
938
+
939
+ .model-status-indicator.unavailable::after {
940
+ border: 1px solid var(--accent-yellow);
941
+ }
942
+
943
+ .model-status-text {
944
+ font-size: 0.8125rem;
945
+ }
946
+
947
+ .model-status-text strong {
948
+ font-weight: 600;
949
+ color: var(--text-primary);
950
+ }
951
+
952
+ /* Toast Notifications */
953
+ .toast-container {
954
+ position: fixed;
955
+ bottom: 2rem;
956
+ right: 2rem;
957
+ z-index: 300;
958
+ display: flex;
959
+ flex-direction: column;
960
+ gap: 0.625rem;
961
+ }
962
+
963
+ .toast {
964
+ background: var(--bg-elevated);
965
+ border: 1px solid var(--border-color);
966
+ border-radius: var(--radius-lg);
967
+ padding: 1rem 1.5rem;
968
+ box-shadow: var(--shadow-lg);
969
+ animation: toastSlideIn 0.35s cubic-bezier(0.16, 1, 0.3, 1);
970
+ font-size: 0.875rem;
971
+ font-weight: 500;
972
+ display: flex;
973
+ align-items: center;
974
+ gap: 0.75rem;
975
+ }
976
+
977
+ .toast::before {
978
+ content: '';
979
+ width: 8px;
980
+ height: 8px;
981
+ border-radius: 50%;
982
+ flex-shrink: 0;
983
+ }
984
+
985
+ .toast.success {
986
+ border-left: 3px solid var(--accent-green);
987
+ }
988
+
989
+ .toast.success::before {
990
+ background: var(--accent-green);
991
+ box-shadow: 0 0 8px var(--accent-green);
992
+ }
993
+
994
+ .toast.error {
995
+ border-left: 3px solid var(--accent-red);
996
+ }
997
+
998
+ .toast.error::before {
999
+ background: var(--accent-red);
1000
+ box-shadow: 0 0 8px var(--accent-red);
1001
+ }
1002
+
1003
+ .toast.info {
1004
+ border-left: 3px solid var(--accent-blue);
1005
+ }
1006
+
1007
+ .toast.info::before {
1008
+ background: var(--accent-blue);
1009
+ box-shadow: 0 0 8px var(--accent-blue);
1010
+ }
1011
+
1012
+ @keyframes toastSlideIn {
1013
+ from {
1014
+ transform: translateX(120%);
1015
+ opacity: 0;
1016
+ }
1017
+ to {
1018
+ transform: translateX(0);
1019
+ opacity: 1;
1020
+ }
1021
+ }
1022
+
1023
+ /* Section description */
1024
+ .section-desc {
1025
+ color: var(--text-muted);
1026
+ margin-bottom: 2rem;
1027
+ font-size: 0.9375rem;
1028
+ line-height: 1.6;
1029
+ }
1030
+
1031
+ /* Global Profile Items */
1032
+ .global-item {
1033
+ background: var(--bg-secondary);
1034
+ border: 1px solid var(--border-subtle);
1035
+ border-radius: var(--radius-lg);
1036
+ padding: 1.25rem;
1037
+ transition: all var(--transition-fast);
1038
+ }
1039
+
1040
+ .global-item:hover {
1041
+ border-color: var(--border-color);
1042
+ background: var(--bg-tertiary);
1043
+ }
1044
+
1045
+ .global-item-header {
1046
+ display: flex;
1047
+ justify-content: space-between;
1048
+ align-items: center;
1049
+ margin-bottom: 0.75rem;
1050
+ }
1051
+
1052
+ .global-key-badge {
1053
+ font-size: 0.6875rem;
1054
+ padding: 0.375rem 0.75rem;
1055
+ border-radius: var(--radius);
1056
+ background: var(--accent-purple-dim);
1057
+ color: var(--accent-purple);
1058
+ font-weight: 600;
1059
+ text-transform: uppercase;
1060
+ letter-spacing: 0.03em;
1061
+ }
1062
+
1063
+ .global-content {
1064
+ color: var(--text-secondary);
1065
+ font-size: 0.875rem;
1066
+ white-space: pre-wrap;
1067
+ line-height: 1.7;
1068
+ }
1069
+
1070
+ /* Loading state */
1071
+ .loading {
1072
+ text-align: center;
1073
+ padding: 3rem 2rem;
1074
+ color: var(--text-muted);
1075
+ font-size: 0.9375rem;
1076
+ }
1077
+
1078
+ /* Empty state */
1079
+ .empty-state {
1080
+ text-align: center;
1081
+ padding: 4rem 2rem;
1082
+ color: var(--text-secondary);
1083
+ background: var(--bg-secondary);
1084
+ border-radius: var(--radius-lg);
1085
+ border: 1px dashed var(--border-color);
1086
+ }
1087
+
1088
+ .empty-state h3 {
1089
+ color: var(--text-primary);
1090
+ margin-bottom: 0.625rem;
1091
+ font-size: 1.125rem;
1092
+ font-weight: 600;
1093
+ }
1094
+
1095
+ .empty-state p {
1096
+ font-size: 0.875rem;
1097
+ color: var(--text-muted);
1098
+ }
1099
+
1100
+ /* Search result score */
1101
+ .search-score {
1102
+ font-size: 0.6875rem;
1103
+ color: var(--accent-green);
1104
+ background: var(--accent-green-dim);
1105
+ padding: 0.25rem 0.625rem;
1106
+ border-radius: var(--radius);
1107
+ font-weight: 600;
1108
+ font-family: var(--font-mono);
1109
+ }
1110
+
1111
+ /* ============================================
1112
+ SETTINGS PAGE STYLES
1113
+ ============================================ */
1114
+
1115
+ .settings-container {
1116
+ max-width: 900px;
1117
+ margin: 0 auto;
1118
+ }
1119
+
1120
+ .settings-header {
1121
+ margin-bottom: 2.5rem;
1122
+ }
1123
+
1124
+ .settings-header h2 {
1125
+ font-size: 1.75rem;
1126
+ font-weight: 600;
1127
+ letter-spacing: -0.02em;
1128
+ margin-bottom: 0.5rem;
1129
+ }
1130
+
1131
+ .settings-grid {
1132
+ display: grid;
1133
+ gap: 1.5rem;
1134
+ }
1135
+
1136
+ /* Settings Card */
1137
+ .settings-card {
1138
+ background: var(--bg-secondary);
1139
+ border: 1px solid var(--border-subtle);
1140
+ border-radius: var(--radius-xl);
1141
+ padding: 1.75rem;
1142
+ transition: all var(--transition);
1143
+ }
1144
+
1145
+ .settings-card:hover {
1146
+ border-color: var(--border-color);
1147
+ }
1148
+
1149
+ .settings-card-header {
1150
+ display: flex;
1151
+ align-items: center;
1152
+ gap: 1rem;
1153
+ margin-bottom: 0.75rem;
1154
+ }
1155
+
1156
+ .settings-card-icon {
1157
+ width: 44px;
1158
+ height: 44px;
1159
+ background: linear-gradient(135deg, var(--accent-blue-dim) 0%, var(--accent-purple-dim) 100%);
1160
+ border-radius: var(--radius-lg);
1161
+ display: flex;
1162
+ align-items: center;
1163
+ justify-content: center;
1164
+ color: var(--accent-blue);
1165
+ }
1166
+
1167
+ .settings-card-icon svg {
1168
+ width: 22px;
1169
+ height: 22px;
1170
+ }
1171
+
1172
+ .settings-card-header h3 {
1173
+ font-size: 1.125rem;
1174
+ font-weight: 600;
1175
+ margin: 0;
1176
+ color: var(--text-primary);
1177
+ letter-spacing: -0.01em;
1178
+ }
1179
+
1180
+ .settings-card-desc {
1181
+ color: var(--text-muted);
1182
+ font-size: 0.875rem;
1183
+ margin-bottom: 1.5rem;
1184
+ line-height: 1.5;
1185
+ }
1186
+
1187
+ /* Settings Group */
1188
+ .settings-group {
1189
+ display: flex;
1190
+ flex-direction: column;
1191
+ gap: 1rem;
1192
+ }
1193
+
1194
+ .setting-row {
1195
+ display: flex;
1196
+ justify-content: space-between;
1197
+ align-items: center;
1198
+ padding: 1rem 1.25rem;
1199
+ background: var(--bg-tertiary);
1200
+ border-radius: var(--radius-lg);
1201
+ border: 1px solid transparent;
1202
+ transition: all var(--transition-fast);
1203
+ }
1204
+
1205
+ .setting-row:hover {
1206
+ background: var(--bg-elevated);
1207
+ border-color: var(--border-subtle);
1208
+ }
1209
+
1210
+ .setting-info {
1211
+ display: flex;
1212
+ flex-direction: column;
1213
+ gap: 0.25rem;
1214
+ }
1215
+
1216
+ .setting-info label {
1217
+ font-size: 0.9375rem;
1218
+ font-weight: 500;
1219
+ color: var(--text-primary);
1220
+ cursor: pointer;
1221
+ }
1222
+
1223
+ .setting-hint {
1224
+ font-size: 0.8125rem;
1225
+ color: var(--text-muted);
1226
+ }
1227
+
1228
+ /* Toggle Switch */
1229
+ .toggle {
1230
+ position: relative;
1231
+ display: inline-block;
1232
+ width: 52px;
1233
+ height: 28px;
1234
+ flex-shrink: 0;
1235
+ }
1236
+
1237
+ .toggle input {
1238
+ opacity: 0;
1239
+ width: 0;
1240
+ height: 0;
1241
+ }
1242
+
1243
+ .toggle-slider {
1244
+ position: absolute;
1245
+ cursor: pointer;
1246
+ top: 0;
1247
+ left: 0;
1248
+ right: 0;
1249
+ bottom: 0;
1250
+ background: var(--bg-primary);
1251
+ border: 2px solid var(--border-color);
1252
+ transition: all var(--transition-fast);
1253
+ border-radius: 28px;
1254
+ }
1255
+
1256
+ .toggle-slider::before {
1257
+ position: absolute;
1258
+ content: '';
1259
+ height: 20px;
1260
+ width: 20px;
1261
+ left: 2px;
1262
+ bottom: 2px;
1263
+ background: var(--text-muted);
1264
+ transition: all var(--transition-fast);
1265
+ border-radius: 50%;
1266
+ }
1267
+
1268
+ .toggle input:checked + .toggle-slider {
1269
+ background: var(--accent-blue);
1270
+ border-color: var(--accent-blue);
1271
+ }
1272
+
1273
+ .toggle input:checked + .toggle-slider::before {
1274
+ background: white;
1275
+ transform: translateX(24px);
1276
+ }
1277
+
1278
+ .toggle input:focus + .toggle-slider {
1279
+ box-shadow: 0 0 0 3px var(--accent-blue-dim);
1280
+ }
1281
+
1282
+ /* Settings Input */
1283
+ .setting-input {
1284
+ width: 140px;
1285
+ padding: 0.625rem 0.875rem;
1286
+ background: var(--bg-primary);
1287
+ border: 1px solid var(--border-color);
1288
+ border-radius: var(--radius);
1289
+ color: var(--text-primary);
1290
+ font-size: 0.875rem;
1291
+ font-family: var(--font-mono);
1292
+ text-align: right;
1293
+ transition: all var(--transition-fast);
1294
+ }
1295
+
1296
+ .setting-input:focus {
1297
+ outline: none;
1298
+ border-color: var(--accent-blue);
1299
+ box-shadow: 0 0 0 3px var(--accent-blue-dim);
1300
+ }
1301
+
1302
+ .setting-input:hover {
1303
+ border-color: var(--text-muted);
1304
+ }
1305
+
1306
+ /* Settings Actions */
1307
+ .settings-actions {
1308
+ display: flex;
1309
+ gap: 1rem;
1310
+ margin-top: 2.5rem;
1311
+ padding-top: 2rem;
1312
+ border-top: 1px solid var(--border-subtle);
1313
+ }
1314
+
1315
+ /* Responsive */
1316
+ @media (max-width: 1024px) {
1317
+ .dashboard-grid {
1318
+ grid-template-columns: repeat(2, 1fr);
1319
+ }
1320
+
1321
+ .stats-row {
1322
+ grid-template-columns: repeat(2, 1fr);
1323
+ }
1324
+
1325
+ .activity-card {
1326
+ grid-column: 1 / -1;
1327
+ }
1328
+
1329
+ .setting-row {
1330
+ flex-direction: column;
1331
+ align-items: flex-start;
1332
+ gap: 1rem;
1333
+ }
1334
+
1335
+ .setting-input {
1336
+ width: 100%;
1337
+ text-align: left;
1338
+ }
1339
+ }
1340
+
1341
+ @media (max-width: 768px) {
1342
+ .header {
1343
+ flex-direction: column;
1344
+ gap: 1rem;
1345
+ padding: 1rem 1.5rem;
1346
+ }
1347
+
1348
+ .header-nav {
1349
+ width: 100%;
1350
+ justify-content: center;
1351
+ flex-wrap: wrap;
1352
+ padding: 0.375rem;
1353
+ }
1354
+
1355
+ .nav-btn {
1356
+ padding: 0.5rem 0.875rem;
1357
+ font-size: 0.75rem;
1358
+ }
1359
+
1360
+ .main-content {
1361
+ padding: 1.5rem;
1362
+ }
1363
+
1364
+ .dashboard-grid {
1365
+ grid-template-columns: 1fr;
1366
+ }
1367
+
1368
+ .stats-row {
1369
+ grid-template-columns: repeat(2, 1fr);
1370
+ }
1371
+
1372
+ .filters {
1373
+ flex-direction: column;
1374
+ align-items: stretch;
1375
+ padding: 1rem;
1376
+ }
1377
+
1378
+ .search-options {
1379
+ flex-direction: column;
1380
+ align-items: flex-start;
1381
+ gap: 1rem;
1382
+ }
1383
+
1384
+ .settings-actions {
1385
+ flex-direction: column;
1386
+ }
1387
+
1388
+ .settings-card {
1389
+ padding: 1.25rem;
1390
+ }
1391
+
1392
+ .toggle {
1393
+ width: 46px;
1394
+ height: 24px;
1395
+ }
1396
+
1397
+ .toggle-slider::before {
1398
+ height: 16px;
1399
+ width: 16px;
1400
+ }
1401
+
1402
+ .toggle input:checked + .toggle-slider::before {
1403
+ transform: translateX(22px);
1404
+ }
1405
+ }
1406
+
1407
+ /* Custom scrollbar */
1408
+ ::-webkit-scrollbar {
1409
+ width: 8px;
1410
+ height: 8px;
1411
+ }
1412
+
1413
+ ::-webkit-scrollbar-track {
1414
+ background: var(--bg-primary);
1415
+ }
1416
+
1417
+ ::-webkit-scrollbar-thumb {
1418
+ background: var(--bg-elevated);
1419
+ border-radius: 4px;
1420
+ }
1421
+
1422
+ ::-webkit-scrollbar-thumb:hover {
1423
+ background: var(--border-color);
1424
+ }
1425
+
1426
+ /* Selection styling */
1427
+ ::selection {
1428
+ background: var(--accent-blue-dim);
1429
+ color: var(--text-primary);
1430
+ }
1431
+
1432
+ /* Focus visible for accessibility */
1433
+ :focus-visible {
1434
+ outline: 2px solid var(--accent-blue);
1435
+ outline-offset: 2px;
1436
+ }