stenotype 0.2.0 → 0.3.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,1966 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Stenotype · Memory Dashboard</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
+ <link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,600;1,9..144,300;1,9..144,400&family=Geist+Mono:wght@400;500&family=Geist:wght@300;400;500;600&display=swap" rel="stylesheet" />
10
+ <link rel="stylesheet" href="/styles.css" />
11
+ <style>
12
+ :root {
13
+ --sidebar-w: 240px;
14
+ --bg: #FAFAF8;
15
+ --sidebar-bg: #F2F0EB;
16
+ --card-bg: #FFFFFF;
17
+ --accent: #C9CB24;
18
+ --accent-hover: #b3b51e;
19
+ --text: #1A1A18;
20
+ --text-2: #4A4A46;
21
+ --muted: #8A8A84;
22
+ --border: #E8E6E1;
23
+ --sidebar-border: #DDD9D0;
24
+ --shadow-card: 0 1px 4px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
25
+ --shadow-hover: 0 6px 24px rgba(0,0,0,0.1), 0 2px 6px rgba(0,0,0,0.06);
26
+ --radius: 10px;
27
+ --radius-sm: 6px;
28
+
29
+ /* Category colors */
30
+ --cat-decision: #6366F1;
31
+ --cat-task: #F59E0B;
32
+ --cat-person: #10B981;
33
+ --cat-project: #3B82F6;
34
+ --cat-preference: #8B5CF6;
35
+ --cat-fact: #06B6D4;
36
+ --cat-emotion: #EC4899;
37
+ --cat-instruction: #EF4444;
38
+ --cat-other: #9CA3AF;
39
+
40
+ /* Temperature colors */
41
+ --temp-hot: #EF4444;
42
+ --temp-warm: #F59E0B;
43
+ --temp-cold: #60A5FA;
44
+ --temp-archived: #8B5CF6;
45
+
46
+ /* Commitment state colors */
47
+ --state-open: #F59E0B;
48
+ --state-in_progress: #3B82F6;
49
+ --state-blocked: #EF4444;
50
+ --state-done: #10B981;
51
+ }
52
+
53
+ * { box-sizing: border-box; margin: 0; padding: 0; }
54
+
55
+ html, body {
56
+ height: 100%;
57
+ font-family: 'Geist', -apple-system, sans-serif;
58
+ background: var(--bg);
59
+ color: var(--text);
60
+ font-size: 14px;
61
+ line-height: 1.5;
62
+ }
63
+
64
+ /* ─── Layout ─── */
65
+ .app-layout {
66
+ display: flex;
67
+ height: 100vh;
68
+ overflow: hidden;
69
+ }
70
+
71
+ /* ─── Sidebar ─── */
72
+ .sidebar {
73
+ width: var(--sidebar-w);
74
+ flex-shrink: 0;
75
+ background: var(--sidebar-bg);
76
+ border-right: 1px solid var(--sidebar-border);
77
+ display: flex;
78
+ flex-direction: column;
79
+ overflow: hidden;
80
+ }
81
+
82
+ .sidebar-header {
83
+ padding: 20px 16px 16px;
84
+ border-bottom: 1px solid var(--sidebar-border);
85
+ }
86
+
87
+ .sidebar-logo {
88
+ display: flex;
89
+ align-items: baseline;
90
+ gap: 8px;
91
+ }
92
+
93
+ .sidebar-wordmark {
94
+ font-family: 'Fraunces', Georgia, serif;
95
+ font-size: 22px;
96
+ font-weight: 400;
97
+ letter-spacing: -0.02em;
98
+ color: var(--text);
99
+ line-height: 1;
100
+ }
101
+
102
+ .sidebar-version {
103
+ font-size: 10px;
104
+ font-weight: 500;
105
+ color: var(--muted);
106
+ background: var(--border);
107
+ padding: 2px 6px;
108
+ border-radius: 100px;
109
+ letter-spacing: 0.04em;
110
+ }
111
+
112
+ /* ─── Nav ─── */
113
+ .sidebar-nav {
114
+ padding: 12px 8px;
115
+ flex: 1;
116
+ overflow-y: auto;
117
+ }
118
+
119
+ .nav-section-label {
120
+ font-size: 10px;
121
+ font-weight: 600;
122
+ letter-spacing: 0.08em;
123
+ text-transform: uppercase;
124
+ color: var(--muted);
125
+ padding: 8px 8px 4px;
126
+ }
127
+
128
+ .nav-item {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 10px;
132
+ padding: 9px 10px;
133
+ border-radius: var(--radius-sm);
134
+ cursor: pointer;
135
+ color: var(--text-2);
136
+ font-size: 13.5px;
137
+ font-weight: 400;
138
+ transition: background 0.1s ease, color 0.1s ease;
139
+ user-select: none;
140
+ }
141
+
142
+ .nav-item:hover {
143
+ background: rgba(0,0,0,0.05);
144
+ color: var(--text);
145
+ }
146
+
147
+ .nav-item.active {
148
+ background: rgba(201,203,36,0.18);
149
+ color: var(--text);
150
+ font-weight: 500;
151
+ }
152
+
153
+ .nav-icon {
154
+ width: 18px;
155
+ height: 18px;
156
+ opacity: 0.65;
157
+ flex-shrink: 0;
158
+ }
159
+ .nav-item.active .nav-icon { opacity: 1; }
160
+
161
+ .nav-badge {
162
+ margin-left: auto;
163
+ font-size: 11px;
164
+ font-weight: 600;
165
+ color: var(--muted);
166
+ background: rgba(0,0,0,0.07);
167
+ padding: 1px 6px;
168
+ border-radius: 100px;
169
+ min-width: 22px;
170
+ text-align: center;
171
+ }
172
+
173
+ /* ─── Stats mini-panel ─── */
174
+ .sidebar-stats {
175
+ padding: 12px 8px;
176
+ border-top: 1px solid var(--sidebar-border);
177
+ border-bottom: 1px solid var(--sidebar-border);
178
+ }
179
+
180
+ .stats-label {
181
+ font-size: 10px;
182
+ font-weight: 600;
183
+ letter-spacing: 0.08em;
184
+ text-transform: uppercase;
185
+ color: var(--muted);
186
+ padding: 0 8px 8px;
187
+ }
188
+
189
+ .stats-row {
190
+ display: flex;
191
+ align-items: center;
192
+ padding: 4px 8px;
193
+ gap: 8px;
194
+ }
195
+
196
+ .stats-dot {
197
+ width: 8px;
198
+ height: 8px;
199
+ border-radius: 50%;
200
+ flex-shrink: 0;
201
+ }
202
+
203
+ .stats-dot.hot { background: var(--temp-hot); }
204
+ .stats-dot.warm { background: var(--temp-warm); }
205
+ .stats-dot.cold { background: var(--temp-cold); }
206
+
207
+ .stats-dot-label {
208
+ font-size: 12.5px;
209
+ color: var(--text-2);
210
+ flex: 1;
211
+ text-transform: capitalize;
212
+ }
213
+
214
+ .stats-dot-count {
215
+ font-size: 12.5px;
216
+ font-weight: 600;
217
+ color: var(--text);
218
+ }
219
+
220
+ .stats-total {
221
+ display: flex;
222
+ align-items: baseline;
223
+ gap: 6px;
224
+ padding: 8px 8px 4px;
225
+ }
226
+
227
+ .stats-total-num {
228
+ font-family: 'Fraunces', serif;
229
+ font-size: 28px;
230
+ font-weight: 400;
231
+ line-height: 1;
232
+ color: var(--text);
233
+ }
234
+
235
+ .stats-total-label {
236
+ font-size: 12px;
237
+ color: var(--muted);
238
+ }
239
+
240
+ /* ─── Sidebar footer ─── */
241
+ .sidebar-footer {
242
+ padding: 12px 12px;
243
+ border-top: 1px solid var(--sidebar-border);
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 10px;
247
+ }
248
+
249
+ .user-avatar {
250
+ width: 30px;
251
+ height: 30px;
252
+ border-radius: 50%;
253
+ background: var(--accent);
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: center;
257
+ font-size: 12px;
258
+ font-weight: 600;
259
+ color: var(--text);
260
+ flex-shrink: 0;
261
+ }
262
+
263
+ .user-name {
264
+ font-size: 13px;
265
+ font-weight: 500;
266
+ color: var(--text);
267
+ flex: 1;
268
+ }
269
+
270
+ .logout-btn {
271
+ width: 28px;
272
+ height: 28px;
273
+ border-radius: var(--radius-sm);
274
+ border: none;
275
+ background: transparent;
276
+ cursor: pointer;
277
+ display: flex;
278
+ align-items: center;
279
+ justify-content: center;
280
+ color: var(--muted);
281
+ transition: background 0.1s ease, color 0.1s ease;
282
+ }
283
+ .logout-btn:hover {
284
+ background: rgba(0,0,0,0.06);
285
+ color: var(--text);
286
+ }
287
+
288
+ /* ─── Main content ─── */
289
+ .main-content {
290
+ flex: 1;
291
+ display: flex;
292
+ flex-direction: column;
293
+ overflow: hidden;
294
+ }
295
+
296
+ /* ─── Top header bar ─── */
297
+ .topbar {
298
+ height: 56px;
299
+ border-bottom: 1px solid var(--border);
300
+ display: flex;
301
+ align-items: center;
302
+ padding: 0 24px;
303
+ gap: 16px;
304
+ background: var(--bg);
305
+ flex-shrink: 0;
306
+ }
307
+
308
+ .page-title {
309
+ font-family: 'Fraunces', Georgia, serif;
310
+ font-size: 20px;
311
+ font-weight: 400;
312
+ letter-spacing: -0.01em;
313
+ color: var(--text);
314
+ white-space: nowrap;
315
+ }
316
+
317
+ .search-wrap {
318
+ flex: 1;
319
+ max-width: 480px;
320
+ position: relative;
321
+ }
322
+
323
+ .search-icon {
324
+ position: absolute;
325
+ left: 12px;
326
+ top: 50%;
327
+ transform: translateY(-50%);
328
+ width: 16px;
329
+ height: 16px;
330
+ color: var(--muted);
331
+ pointer-events: none;
332
+ }
333
+
334
+ .search-input {
335
+ width: 100%;
336
+ padding: 8px 12px 8px 36px;
337
+ font-family: 'Geist', sans-serif;
338
+ font-size: 13.5px;
339
+ background: var(--sidebar-bg);
340
+ border: 1.5px solid transparent;
341
+ border-radius: 8px;
342
+ color: var(--text);
343
+ outline: none;
344
+ transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
345
+ }
346
+
347
+ .search-input:focus {
348
+ background: #fff;
349
+ border-color: var(--accent);
350
+ box-shadow: 0 0 0 3px rgba(201,203,36,0.12);
351
+ }
352
+
353
+ .search-input::placeholder { color: var(--muted); }
354
+
355
+ .topbar-actions {
356
+ margin-left: auto;
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 8px;
360
+ }
361
+
362
+ /* ─── Filter row ─── */
363
+ .filter-row {
364
+ padding: 12px 24px;
365
+ border-bottom: 1px solid var(--border);
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 16px;
369
+ flex-wrap: wrap;
370
+ background: var(--bg);
371
+ flex-shrink: 0;
372
+ }
373
+
374
+ .filter-group {
375
+ display: flex;
376
+ align-items: center;
377
+ gap: 6px;
378
+ flex-wrap: wrap;
379
+ }
380
+
381
+ .filter-label {
382
+ font-size: 11px;
383
+ font-weight: 600;
384
+ letter-spacing: 0.06em;
385
+ text-transform: uppercase;
386
+ color: var(--muted);
387
+ white-space: nowrap;
388
+ }
389
+
390
+ .pill {
391
+ padding: 4px 10px;
392
+ border-radius: 100px;
393
+ font-size: 12px;
394
+ font-weight: 500;
395
+ cursor: pointer;
396
+ border: 1.5px solid transparent;
397
+ background: transparent;
398
+ color: var(--text-2);
399
+ transition: all 0.12s ease;
400
+ white-space: nowrap;
401
+ font-family: 'Geist', sans-serif;
402
+ }
403
+
404
+ .pill:hover {
405
+ background: var(--sidebar-bg);
406
+ color: var(--text);
407
+ }
408
+
409
+ .pill.active {
410
+ background: var(--text);
411
+ color: #fff;
412
+ border-color: var(--text);
413
+ }
414
+
415
+ .pill[data-cat].active { color: #fff; }
416
+ .pill[data-cat="decision"].active { background: var(--cat-decision); border-color: var(--cat-decision); }
417
+ .pill[data-cat="task"].active { background: var(--cat-task); border-color: var(--cat-task); }
418
+ .pill[data-cat="person"].active { background: var(--cat-person); border-color: var(--cat-person); }
419
+ .pill[data-cat="project"].active { background: var(--cat-project); border-color: var(--cat-project); }
420
+ .pill[data-cat="preference"].active { background: var(--cat-preference); border-color: var(--cat-preference); }
421
+ .pill[data-cat="fact"].active { background: var(--cat-fact); border-color: var(--cat-fact); }
422
+ .pill[data-cat="emotion"].active { background: var(--cat-emotion); border-color: var(--cat-emotion); }
423
+ .pill[data-cat="instruction"].active { background: var(--cat-instruction); border-color: var(--cat-instruction); }
424
+ .pill[data-cat="other"].active { background: var(--cat-other); border-color: var(--cat-other); }
425
+
426
+ .pill[data-temp="hot"].active { background: var(--temp-hot); border-color: var(--temp-hot); }
427
+ .pill[data-temp="warm"].active { background: var(--temp-warm); border-color: var(--temp-warm); }
428
+ .pill[data-temp="cold"].active { background: var(--temp-cold); border-color: var(--temp-cold); }
429
+
430
+ .agent-select {
431
+ padding: 4px 8px;
432
+ font-family: 'Geist', sans-serif;
433
+ font-size: 12px;
434
+ font-weight: 500;
435
+ background: var(--sidebar-bg);
436
+ border: 1.5px solid var(--border);
437
+ border-radius: 6px;
438
+ color: var(--text);
439
+ outline: none;
440
+ cursor: pointer;
441
+ }
442
+
443
+ /* ─── Content area ─── */
444
+ .content-area {
445
+ flex: 1;
446
+ overflow-y: auto;
447
+ padding: 20px 24px 80px;
448
+ }
449
+
450
+ /* ─── Views ─── */
451
+ .view { display: none; }
452
+ .view.active { display: block; }
453
+
454
+ /* ─── Memory grid ─── */
455
+ .memories-grid {
456
+ display: grid;
457
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
458
+ gap: 14px;
459
+ }
460
+
461
+ /* ─── Memory card ─── */
462
+ .memory-card {
463
+ background: var(--card-bg);
464
+ border: 1px solid var(--border);
465
+ border-radius: var(--radius);
466
+ padding: 14px 16px 12px;
467
+ cursor: pointer;
468
+ transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
469
+ box-shadow: var(--shadow-card);
470
+ position: relative;
471
+ overflow: hidden;
472
+ }
473
+
474
+ .memory-card:hover {
475
+ transform: scale(1.01) translateY(-1px);
476
+ box-shadow: var(--shadow-hover);
477
+ border-color: rgba(0,0,0,0.12);
478
+ }
479
+
480
+ .card-top {
481
+ display: flex;
482
+ align-items: center;
483
+ gap: 8px;
484
+ margin-bottom: 8px;
485
+ }
486
+
487
+ .cat-badge {
488
+ display: inline-flex;
489
+ align-items: center;
490
+ padding: 2px 8px;
491
+ border-radius: 100px;
492
+ font-size: 10.5px;
493
+ font-weight: 600;
494
+ letter-spacing: 0.04em;
495
+ text-transform: uppercase;
496
+ }
497
+
498
+ .cat-badge.decision { background: rgba(99,102,241,0.12); color: #5559D9; }
499
+ .cat-badge.task { background: rgba(245,158,11,0.12); color: #D18700; }
500
+ .cat-badge.person { background: rgba(16,185,129,0.12); color: #0A9566; }
501
+ .cat-badge.project { background: rgba(59,130,246,0.12); color: #2666DB; }
502
+ .cat-badge.preference { background: rgba(139,92,246,0.12); color: #7048DB; }
503
+ .cat-badge.fact { background: rgba(6,182,212,0.12); color: #0592AD; }
504
+ .cat-badge.emotion { background: rgba(236,72,153,0.12); color: #C0367A; }
505
+ .cat-badge.instruction { background: rgba(239,68,68,0.12); color: #CC2424; }
506
+ .cat-badge.other { background: rgba(156,163,175,0.12); color: #5A6070; }
507
+
508
+ .temp-dot {
509
+ width: 8px;
510
+ height: 8px;
511
+ border-radius: 50%;
512
+ flex-shrink: 0;
513
+ margin-left: auto;
514
+ }
515
+ .temp-dot.hot { background: var(--temp-hot); box-shadow: 0 0 6px rgba(239,68,68,0.5); }
516
+ .temp-dot.warm { background: var(--temp-warm); box-shadow: 0 0 6px rgba(245,158,11,0.4); }
517
+ .temp-dot.cold { background: var(--temp-cold); box-shadow: 0 0 6px rgba(96,165,250,0.4); }
518
+ .temp-dot.archived { background: var(--temp-archived); box-shadow: 0 0 6px rgba(139,92,246,0.4); }
519
+
520
+ .card-subject {
521
+ font-family: 'Fraunces', Georgia, serif;
522
+ font-size: 13px;
523
+ font-style: italic;
524
+ font-weight: 400;
525
+ color: var(--text);
526
+ margin-bottom: 6px;
527
+ line-height: 1.4;
528
+ }
529
+
530
+ .card-content {
531
+ font-size: 13px;
532
+ color: var(--text-2);
533
+ line-height: 1.55;
534
+ display: -webkit-box;
535
+ -webkit-line-clamp: 3;
536
+ -webkit-box-orient: vertical;
537
+ overflow: hidden;
538
+ margin-bottom: 12px;
539
+ }
540
+
541
+ .card-bars {
542
+ display: flex;
543
+ gap: 8px;
544
+ margin-bottom: 10px;
545
+ }
546
+
547
+ .bar-wrap {
548
+ flex: 1;
549
+ }
550
+
551
+ .bar-label {
552
+ font-size: 9.5px;
553
+ font-weight: 600;
554
+ letter-spacing: 0.06em;
555
+ text-transform: uppercase;
556
+ color: var(--muted);
557
+ margin-bottom: 3px;
558
+ }
559
+
560
+ .bar-track {
561
+ height: 4px;
562
+ background: var(--sidebar-bg);
563
+ border-radius: 100px;
564
+ overflow: hidden;
565
+ }
566
+
567
+ .bar-fill {
568
+ height: 100%;
569
+ border-radius: 100px;
570
+ transition: width 0.3s ease;
571
+ }
572
+
573
+ .bar-fill.confidence { background: var(--accent); }
574
+ .bar-fill.importance { background: #6366F1; }
575
+
576
+ .card-footer {
577
+ display: flex;
578
+ align-items: center;
579
+ gap: 6px;
580
+ flex-wrap: wrap;
581
+ }
582
+
583
+ .card-date {
584
+ font-size: 11px;
585
+ color: var(--muted);
586
+ font-family: 'Geist Mono', monospace;
587
+ }
588
+
589
+ .agent-chip {
590
+ font-size: 10.5px;
591
+ font-weight: 500;
592
+ color: var(--muted);
593
+ background: var(--sidebar-bg);
594
+ padding: 2px 6px;
595
+ border-radius: 4px;
596
+ font-family: 'Geist Mono', monospace;
597
+ }
598
+
599
+ .tags-row {
600
+ display: flex;
601
+ gap: 4px;
602
+ flex-wrap: wrap;
603
+ margin-top: 6px;
604
+ }
605
+
606
+ .tag-pill {
607
+ font-size: 10.5px;
608
+ color: var(--text-2);
609
+ background: var(--sidebar-bg);
610
+ border: 1px solid var(--border);
611
+ padding: 1px 7px;
612
+ border-radius: 100px;
613
+ }
614
+
615
+ /* ─── Loading/Empty states ─── */
616
+ .loading-state {
617
+ display: flex;
618
+ flex-direction: column;
619
+ align-items: center;
620
+ justify-content: center;
621
+ padding: 80px 20px;
622
+ text-align: center;
623
+ gap: 12px;
624
+ }
625
+
626
+ .loading-spinner {
627
+ width: 32px;
628
+ height: 32px;
629
+ border: 2.5px solid var(--border);
630
+ border-top-color: var(--accent);
631
+ border-radius: 50%;
632
+ animation: spin 0.7s linear infinite;
633
+ }
634
+
635
+ @keyframes spin { to { transform: rotate(360deg); } }
636
+
637
+ .loading-text {
638
+ font-size: 14px;
639
+ color: var(--muted);
640
+ }
641
+
642
+ .empty-state {
643
+ display: flex;
644
+ flex-direction: column;
645
+ align-items: center;
646
+ justify-content: center;
647
+ padding: 80px 20px;
648
+ text-align: center;
649
+ gap: 8px;
650
+ }
651
+
652
+ .empty-icon {
653
+ width: 48px;
654
+ height: 48px;
655
+ margin-bottom: 8px;
656
+ color: var(--muted);
657
+ display: flex;
658
+ align-items: center;
659
+ justify-content: center;
660
+ }
661
+
662
+ .empty-title {
663
+ font-family: 'Fraunces', serif;
664
+ font-size: 20px;
665
+ font-weight: 400;
666
+ color: var(--text);
667
+ }
668
+
669
+ .empty-subtitle {
670
+ font-size: 13px;
671
+ color: var(--muted);
672
+ max-width: 320px;
673
+ }
674
+
675
+ /* ─── Load more ─── */
676
+ .load-more-wrap {
677
+ display: flex;
678
+ justify-content: center;
679
+ padding: 24px 0 0;
680
+ }
681
+
682
+ .load-more-btn {
683
+ padding: 10px 28px;
684
+ background: transparent;
685
+ border: 1.5px solid var(--border);
686
+ border-radius: 100px;
687
+ font-family: 'Geist', sans-serif;
688
+ font-size: 13.5px;
689
+ font-weight: 500;
690
+ color: var(--text-2);
691
+ cursor: pointer;
692
+ transition: all 0.15s ease;
693
+ }
694
+
695
+ .load-more-btn:hover {
696
+ background: var(--sidebar-bg);
697
+ border-color: var(--text);
698
+ color: var(--text);
699
+ }
700
+
701
+ .load-more-btn:disabled {
702
+ opacity: 0.4;
703
+ cursor: not-allowed;
704
+ }
705
+
706
+ /* ─── Detail Modal ─── */
707
+ .modal-overlay {
708
+ position: fixed;
709
+ inset: 0;
710
+ background: rgba(0,0,0,0.35);
711
+ backdrop-filter: blur(4px);
712
+ z-index: 100;
713
+ display: flex;
714
+ align-items: flex-start;
715
+ justify-content: flex-end;
716
+ opacity: 0;
717
+ pointer-events: none;
718
+ transition: opacity 0.2s ease;
719
+ }
720
+
721
+ .modal-overlay.open {
722
+ opacity: 1;
723
+ pointer-events: all;
724
+ }
725
+
726
+ .modal-panel {
727
+ width: 520px;
728
+ max-width: 100vw;
729
+ height: 100vh;
730
+ background: #fff;
731
+ box-shadow: -8px 0 40px rgba(0,0,0,0.12);
732
+ display: flex;
733
+ flex-direction: column;
734
+ transform: translateX(40px);
735
+ transition: transform 0.25s cubic-bezier(0.22, 1, 0.36, 1);
736
+ overflow: hidden;
737
+ }
738
+
739
+ .modal-overlay.open .modal-panel {
740
+ transform: translateX(0);
741
+ }
742
+
743
+ .modal-header {
744
+ padding: 20px 24px 16px;
745
+ border-bottom: 1px solid var(--border);
746
+ display: flex;
747
+ align-items: flex-start;
748
+ gap: 12px;
749
+ flex-shrink: 0;
750
+ }
751
+
752
+ .modal-title {
753
+ flex: 1;
754
+ }
755
+
756
+ .modal-category {
757
+ font-size: 11px;
758
+ font-weight: 600;
759
+ letter-spacing: 0.06em;
760
+ text-transform: uppercase;
761
+ color: var(--muted);
762
+ margin-bottom: 4px;
763
+ }
764
+
765
+ .modal-subject-text {
766
+ font-family: 'Fraunces', serif;
767
+ font-size: 18px;
768
+ font-style: italic;
769
+ font-weight: 400;
770
+ color: var(--text);
771
+ line-height: 1.35;
772
+ }
773
+
774
+ .modal-close {
775
+ width: 32px;
776
+ height: 32px;
777
+ border: none;
778
+ background: var(--sidebar-bg);
779
+ border-radius: var(--radius-sm);
780
+ cursor: pointer;
781
+ display: flex;
782
+ align-items: center;
783
+ justify-content: center;
784
+ color: var(--muted);
785
+ transition: background 0.1s ease, color 0.1s ease;
786
+ flex-shrink: 0;
787
+ }
788
+ .modal-close:hover { background: var(--border); color: var(--text); }
789
+
790
+ .modal-body {
791
+ flex: 1;
792
+ overflow-y: auto;
793
+ padding: 20px 24px;
794
+ }
795
+
796
+ .modal-content-text {
797
+ font-family: 'Geist Mono', monospace;
798
+ font-size: 13px;
799
+ line-height: 1.65;
800
+ color: var(--text);
801
+ background: var(--sidebar-bg);
802
+ border-radius: var(--radius-sm);
803
+ padding: 14px 16px;
804
+ white-space: pre-wrap;
805
+ word-break: break-word;
806
+ margin-bottom: 20px;
807
+ border: 1px solid var(--border);
808
+ }
809
+
810
+ .modal-field {
811
+ margin-bottom: 16px;
812
+ }
813
+
814
+ .modal-field-label {
815
+ font-size: 10.5px;
816
+ font-weight: 600;
817
+ letter-spacing: 0.07em;
818
+ text-transform: uppercase;
819
+ color: var(--muted);
820
+ margin-bottom: 5px;
821
+ }
822
+
823
+ .modal-field-value {
824
+ font-size: 13.5px;
825
+ color: var(--text);
826
+ font-family: 'Geist Mono', monospace;
827
+ }
828
+
829
+ .modal-field-value.dim { color: var(--muted); }
830
+
831
+ .modal-grid {
832
+ display: grid;
833
+ grid-template-columns: 1fr 1fr;
834
+ gap: 16px;
835
+ margin-bottom: 16px;
836
+ }
837
+
838
+ .modal-bars {
839
+ display: flex;
840
+ gap: 12px;
841
+ margin-bottom: 20px;
842
+ }
843
+
844
+ .modal-bar-wrap {
845
+ flex: 1;
846
+ }
847
+
848
+ .modal-bar-label {
849
+ display: flex;
850
+ justify-content: space-between;
851
+ font-size: 11px;
852
+ font-weight: 600;
853
+ letter-spacing: 0.06em;
854
+ text-transform: uppercase;
855
+ color: var(--muted);
856
+ margin-bottom: 6px;
857
+ }
858
+
859
+ .modal-bar-label span:last-child {
860
+ font-family: 'Geist Mono', monospace;
861
+ font-weight: 500;
862
+ }
863
+
864
+ .modal-track {
865
+ height: 6px;
866
+ background: var(--sidebar-bg);
867
+ border-radius: 100px;
868
+ overflow: hidden;
869
+ }
870
+
871
+ .modal-fill {
872
+ height: 100%;
873
+ border-radius: 100px;
874
+ }
875
+ .modal-fill.confidence { background: var(--accent); }
876
+ .modal-fill.importance { background: #6366F1; }
877
+
878
+ .modal-tags {
879
+ display: flex;
880
+ flex-wrap: wrap;
881
+ gap: 6px;
882
+ margin-bottom: 20px;
883
+ }
884
+
885
+ .modal-tag {
886
+ font-size: 12px;
887
+ color: var(--text-2);
888
+ background: var(--sidebar-bg);
889
+ border: 1px solid var(--border);
890
+ padding: 3px 10px;
891
+ border-radius: 100px;
892
+ font-family: 'Geist', sans-serif;
893
+ }
894
+
895
+ .modal-footer {
896
+ padding: 16px 24px;
897
+ border-top: 1px solid var(--border);
898
+ display: flex;
899
+ align-items: center;
900
+ gap: 10px;
901
+ flex-shrink: 0;
902
+ }
903
+
904
+ .btn-delete {
905
+ padding: 9px 20px;
906
+ background: transparent;
907
+ border: 1.5px solid #EF4444;
908
+ color: #EF4444;
909
+ border-radius: 100px;
910
+ font-family: 'Geist', sans-serif;
911
+ font-size: 13px;
912
+ font-weight: 500;
913
+ cursor: pointer;
914
+ transition: all 0.15s ease;
915
+ }
916
+ .btn-delete:hover { background: #EF4444; color: #fff; }
917
+
918
+ .btn-restore {
919
+ padding: 9px 20px;
920
+ background: transparent;
921
+ border: 1.5px solid #10B981;
922
+ color: #10B981;
923
+ border-radius: 100px;
924
+ font-family: 'Geist', sans-serif;
925
+ font-size: 13px;
926
+ font-weight: 500;
927
+ cursor: pointer;
928
+ transition: all 0.15s ease;
929
+ }
930
+ .btn-restore:hover { background: #10B981; color: #fff; }
931
+
932
+ /* Temperature lifecycle */
933
+ .temp-lifecycle {
934
+ margin: 16px 0 8px;
935
+ border-radius: 8px;
936
+ overflow: hidden;
937
+ }
938
+ .lifecycle-track {
939
+ display: flex;
940
+ align-items: stretch;
941
+ border: 1px solid var(--border);
942
+ border-radius: 8px;
943
+ overflow: hidden;
944
+ }
945
+ .lifecycle-stage {
946
+ flex: 1;
947
+ padding: 10px 12px;
948
+ display: flex;
949
+ flex-direction: column;
950
+ gap: 2px;
951
+ position: relative;
952
+ }
953
+ .lifecycle-stage + .lifecycle-stage {
954
+ border-left: 1px solid var(--border);
955
+ }
956
+ .lifecycle-stage.current {
957
+ background: var(--bg);
958
+ }
959
+ .lifecycle-stage.inactive {
960
+ background: transparent;
961
+ opacity: 0.45;
962
+ }
963
+ .lifecycle-stage-dot {
964
+ width: 8px; height: 8px;
965
+ border-radius: 50%;
966
+ margin-bottom: 4px;
967
+ }
968
+ .lifecycle-stage-label {
969
+ font-size: 11px;
970
+ font-weight: 600;
971
+ text-transform: uppercase;
972
+ letter-spacing: 0.05em;
973
+ color: var(--text-2);
974
+ }
975
+ .lifecycle-stage.current .lifecycle-stage-label { color: var(--text); }
976
+ .lifecycle-stage-hint {
977
+ font-size: 11px;
978
+ color: var(--muted);
979
+ line-height: 1.4;
980
+ }
981
+ .lifecycle-stage.current .lifecycle-stage-hint { color: var(--text-2); }
982
+ .lifecycle-arrow {
983
+ display: flex;
984
+ align-items: center;
985
+ padding: 0 4px;
986
+ color: var(--muted);
987
+ font-size: 11px;
988
+ }
989
+ .lifecycle-warning {
990
+ margin-top: 8px;
991
+ padding: 8px 12px;
992
+ background: #FEF3C7;
993
+ border: 1px solid #FDE68A;
994
+ border-radius: 6px;
995
+ font-size: 12px;
996
+ color: #92400E;
997
+ display: flex;
998
+ align-items: center;
999
+ gap: 6px;
1000
+ }
1001
+ .lifecycle-danger {
1002
+ background: #FEE2E2;
1003
+ border-color: #FECACA;
1004
+ color: #991B1B;
1005
+ }
1006
+ .lifecycle-safe {
1007
+ margin-top: 8px;
1008
+ padding: 8px 12px;
1009
+ background: #D1FAE5;
1010
+ border: 1px solid #A7F3D0;
1011
+ border-radius: 6px;
1012
+ font-size: 12px;
1013
+ color: #065F46;
1014
+ display: flex;
1015
+ align-items: center;
1016
+ gap: 6px;
1017
+ }
1018
+
1019
+ .archived-toggle[data-active="true"] {
1020
+ background: #8B5CF6;
1021
+ border-color: #8B5CF6;
1022
+ color: #fff;
1023
+ }
1024
+ .archived-count {
1025
+ font-size: 11px;
1026
+ margin-left: 4px;
1027
+ opacity: 0.7;
1028
+ }
1029
+
1030
+ /* Archived card dimming */
1031
+ .memory-card.archived {
1032
+ opacity: 0.65;
1033
+ border-style: dashed;
1034
+ }
1035
+ .memory-card.archived:hover { opacity: 0.85; }
1036
+
1037
+ .modal-id {
1038
+ font-family: 'Geist Mono', monospace;
1039
+ font-size: 11px;
1040
+ color: var(--muted);
1041
+ overflow: hidden;
1042
+ text-overflow: ellipsis;
1043
+ white-space: nowrap;
1044
+ flex: 1;
1045
+ }
1046
+
1047
+ /* ─── Pinned section ─── */
1048
+ .pinned-grid {
1049
+ display: grid;
1050
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1051
+ gap: 12px;
1052
+ }
1053
+
1054
+ .pinned-card {
1055
+ background: linear-gradient(135deg, #FFFBEB, #FEFCE8);
1056
+ border: 1px solid rgba(201,203,36,0.35);
1057
+ border-radius: var(--radius);
1058
+ padding: 14px 16px;
1059
+ box-shadow: var(--shadow-card);
1060
+ }
1061
+
1062
+ .pinned-card-top {
1063
+ display: flex;
1064
+ align-items: center;
1065
+ gap: 8px;
1066
+ margin-bottom: 8px;
1067
+ }
1068
+
1069
+ .pin-icon {
1070
+ font-size: 14px;
1071
+ }
1072
+
1073
+ .pinned-category {
1074
+ font-size: 10.5px;
1075
+ font-weight: 600;
1076
+ letter-spacing: 0.06em;
1077
+ text-transform: uppercase;
1078
+ color: #8A7A00;
1079
+ }
1080
+
1081
+ .pinned-date {
1082
+ margin-left: auto;
1083
+ font-size: 11px;
1084
+ color: var(--muted);
1085
+ }
1086
+
1087
+ .pinned-content {
1088
+ font-size: 13px;
1089
+ color: var(--text);
1090
+ line-height: 1.55;
1091
+ }
1092
+
1093
+ .pinned-agent {
1094
+ margin-top: 8px;
1095
+ font-size: 11px;
1096
+ color: var(--muted);
1097
+ font-family: 'Geist Mono', monospace;
1098
+ }
1099
+
1100
+ /* ─── Commitments table ─── */
1101
+ .commitments-table-wrap {
1102
+ background: var(--card-bg);
1103
+ border: 1px solid var(--border);
1104
+ border-radius: var(--radius);
1105
+ overflow: hidden;
1106
+ box-shadow: var(--shadow-card);
1107
+ }
1108
+
1109
+ table {
1110
+ width: 100%;
1111
+ border-collapse: collapse;
1112
+ }
1113
+
1114
+ thead th {
1115
+ padding: 10px 16px;
1116
+ font-size: 11px;
1117
+ font-weight: 600;
1118
+ letter-spacing: 0.07em;
1119
+ text-transform: uppercase;
1120
+ color: var(--muted);
1121
+ text-align: left;
1122
+ background: var(--sidebar-bg);
1123
+ border-bottom: 1px solid var(--border);
1124
+ }
1125
+
1126
+ tbody tr {
1127
+ border-bottom: 1px solid var(--border);
1128
+ transition: background 0.1s ease;
1129
+ }
1130
+ tbody tr:last-child { border-bottom: none; }
1131
+ tbody tr:hover { background: var(--sidebar-bg); }
1132
+
1133
+ tbody td {
1134
+ padding: 12px 16px;
1135
+ font-size: 13px;
1136
+ color: var(--text);
1137
+ vertical-align: top;
1138
+ }
1139
+
1140
+ .commitment-text {
1141
+ line-height: 1.5;
1142
+ max-width: 400px;
1143
+ }
1144
+
1145
+ .state-badge {
1146
+ display: inline-flex;
1147
+ align-items: center;
1148
+ padding: 3px 10px;
1149
+ border-radius: 100px;
1150
+ font-size: 11px;
1151
+ font-weight: 600;
1152
+ white-space: nowrap;
1153
+ }
1154
+
1155
+ .state-badge.open { background: rgba(245,158,11,0.12); color: #B06800; }
1156
+ .state-badge.in_progress { background: rgba(59,130,246,0.12); color: #1D58CC; }
1157
+ .state-badge.blocked { background: rgba(239,68,68,0.12); color: #CC2424; }
1158
+ .state-badge.done { background: rgba(16,185,129,0.12); color: #0A7A54; }
1159
+
1160
+ .td-source {
1161
+ font-size: 12px;
1162
+ color: var(--muted);
1163
+ font-family: 'Geist Mono', monospace;
1164
+ max-width: 120px;
1165
+ overflow: hidden;
1166
+ text-overflow: ellipsis;
1167
+ white-space: nowrap;
1168
+ }
1169
+
1170
+ .td-date {
1171
+ font-size: 11.5px;
1172
+ color: var(--muted);
1173
+ font-family: 'Geist Mono', monospace;
1174
+ white-space: nowrap;
1175
+ }
1176
+
1177
+ /* ─── Section heading ─── */
1178
+ .section-header {
1179
+ display: flex;
1180
+ align-items: baseline;
1181
+ gap: 10px;
1182
+ margin-bottom: 16px;
1183
+ }
1184
+
1185
+ .section-title {
1186
+ font-family: 'Fraunces', serif;
1187
+ font-size: 22px;
1188
+ font-weight: 400;
1189
+ letter-spacing: -0.01em;
1190
+ color: var(--text);
1191
+ }
1192
+
1193
+ .section-count {
1194
+ font-size: 13px;
1195
+ color: var(--muted);
1196
+ }
1197
+
1198
+ /* ─── Delete confirm ─── */
1199
+ .confirm-overlay {
1200
+ position: fixed;
1201
+ inset: 0;
1202
+ background: rgba(0,0,0,0.5);
1203
+ z-index: 200;
1204
+ display: flex;
1205
+ align-items: center;
1206
+ justify-content: center;
1207
+ opacity: 0;
1208
+ pointer-events: none;
1209
+ transition: opacity 0.15s ease;
1210
+ }
1211
+
1212
+ .confirm-overlay.open {
1213
+ opacity: 1;
1214
+ pointer-events: all;
1215
+ }
1216
+
1217
+ .confirm-dialog {
1218
+ background: #fff;
1219
+ border-radius: 16px;
1220
+ padding: 28px 32px;
1221
+ max-width: 380px;
1222
+ width: 90%;
1223
+ box-shadow: 0 20px 60px rgba(0,0,0,0.2);
1224
+ transform: scale(0.95);
1225
+ transition: transform 0.15s ease;
1226
+ text-align: center;
1227
+ }
1228
+
1229
+ .confirm-overlay.open .confirm-dialog {
1230
+ transform: scale(1);
1231
+ }
1232
+
1233
+ .confirm-title {
1234
+ font-family: 'Fraunces', serif;
1235
+ font-size: 20px;
1236
+ font-weight: 400;
1237
+ color: var(--text);
1238
+ margin-bottom: 10px;
1239
+ }
1240
+
1241
+ .confirm-subtitle {
1242
+ font-size: 13.5px;
1243
+ color: var(--muted);
1244
+ margin-bottom: 24px;
1245
+ line-height: 1.5;
1246
+ }
1247
+
1248
+ .confirm-actions {
1249
+ display: flex;
1250
+ gap: 10px;
1251
+ justify-content: center;
1252
+ }
1253
+
1254
+ .btn-cancel {
1255
+ padding: 9px 20px;
1256
+ background: var(--sidebar-bg);
1257
+ border: 1.5px solid var(--border);
1258
+ color: var(--text);
1259
+ border-radius: 100px;
1260
+ font-family: 'Geist', sans-serif;
1261
+ font-size: 13px;
1262
+ font-weight: 500;
1263
+ cursor: pointer;
1264
+ transition: all 0.15s ease;
1265
+ }
1266
+ .btn-cancel:hover { background: var(--border); }
1267
+
1268
+ .btn-confirm-delete {
1269
+ padding: 9px 20px;
1270
+ background: #EF4444;
1271
+ border: 1.5px solid #EF4444;
1272
+ color: #fff;
1273
+ border-radius: 100px;
1274
+ font-family: 'Geist', sans-serif;
1275
+ font-size: 13px;
1276
+ font-weight: 500;
1277
+ cursor: pointer;
1278
+ transition: all 0.15s ease;
1279
+ }
1280
+ .btn-confirm-delete:hover { background: #DC2626; border-color: #DC2626; }
1281
+
1282
+ /* ─── Toast notifications ─── */
1283
+ .toast-container {
1284
+ position: fixed;
1285
+ bottom: 24px;
1286
+ right: 24px;
1287
+ z-index: 300;
1288
+ display: flex;
1289
+ flex-direction: column;
1290
+ gap: 8px;
1291
+ align-items: flex-end;
1292
+ }
1293
+
1294
+ .toast {
1295
+ background: var(--text);
1296
+ color: #fff;
1297
+ padding: 10px 16px;
1298
+ border-radius: 8px;
1299
+ font-size: 13px;
1300
+ font-weight: 500;
1301
+ box-shadow: 0 4px 16px rgba(0,0,0,0.2);
1302
+ animation: toastIn 0.2s ease;
1303
+ }
1304
+
1305
+ .toast.success { background: #10B981; }
1306
+ .toast.error { background: #EF4444; }
1307
+
1308
+ @keyframes toastIn {
1309
+ from { opacity: 0; transform: translateY(10px); }
1310
+ to { opacity: 1; transform: translateY(0); }
1311
+ }
1312
+
1313
+ /* ─── Scrollbar styling ─── */
1314
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
1315
+ ::-webkit-scrollbar-track { background: transparent; }
1316
+ ::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.12); border-radius: 3px; }
1317
+ ::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.2); }
1318
+
1319
+ /* ─── Wizard overlay ─── */
1320
+ .wizard-overlay {
1321
+ position: fixed;
1322
+ inset: 0;
1323
+ background: rgba(26,26,24,0.72);
1324
+ backdrop-filter: blur(8px);
1325
+ z-index: 500;
1326
+ display: flex;
1327
+ align-items: center;
1328
+ justify-content: center;
1329
+ opacity: 0;
1330
+ pointer-events: none;
1331
+ transition: opacity 0.3s ease;
1332
+ }
1333
+ .wizard-overlay.open {
1334
+ opacity: 1;
1335
+ pointer-events: all;
1336
+ }
1337
+ .wizard-card {
1338
+ background: #fff;
1339
+ border-radius: 20px;
1340
+ width: 560px;
1341
+ max-width: calc(100vw - 48px);
1342
+ max-height: calc(100vh - 80px);
1343
+ display: flex;
1344
+ flex-direction: column;
1345
+ box-shadow: 0 32px 80px rgba(0,0,0,0.22), 0 8px 24px rgba(0,0,0,0.12);
1346
+ overflow: hidden;
1347
+ }
1348
+ .wizard-header {
1349
+ padding: 32px 36px 0;
1350
+ }
1351
+ .wizard-steps {
1352
+ display: flex;
1353
+ align-items: center;
1354
+ gap: 6px;
1355
+ margin-bottom: 24px;
1356
+ min-height: 16px;
1357
+ }
1358
+ .wizard-step-dot {
1359
+ width: 8px;
1360
+ height: 8px;
1361
+ border-radius: 50%;
1362
+ background: var(--border);
1363
+ transition: all 0.2s ease;
1364
+ flex-shrink: 0;
1365
+ }
1366
+ .wizard-step-dot.active {
1367
+ background: var(--accent);
1368
+ width: 24px;
1369
+ border-radius: 4px;
1370
+ }
1371
+ .wizard-step-dot.done {
1372
+ background: var(--text);
1373
+ }
1374
+ .wizard-title {
1375
+ font-family: 'Fraunces', Georgia, serif;
1376
+ font-size: 26px;
1377
+ font-weight: 400;
1378
+ letter-spacing: -0.02em;
1379
+ color: var(--text);
1380
+ margin-bottom: 8px;
1381
+ line-height: 1.2;
1382
+ }
1383
+ .wizard-subtitle {
1384
+ font-size: 13.5px;
1385
+ color: var(--text-2);
1386
+ line-height: 1.6;
1387
+ margin-bottom: 4px;
1388
+ }
1389
+ .wizard-body {
1390
+ padding: 24px 36px;
1391
+ flex: 1;
1392
+ overflow-y: auto;
1393
+ }
1394
+ .wizard-footer {
1395
+ padding: 18px 36px 28px;
1396
+ display: flex;
1397
+ align-items: center;
1398
+ gap: 10px;
1399
+ border-top: 1px solid var(--border);
1400
+ }
1401
+ .wizard-footer .spacer { flex: 1; }
1402
+ .btn-wizard-back {
1403
+ padding: 10px 22px;
1404
+ background: transparent;
1405
+ border: 1.5px solid var(--border);
1406
+ border-radius: 100px;
1407
+ font-family: 'Geist', sans-serif;
1408
+ font-size: 13.5px;
1409
+ font-weight: 500;
1410
+ color: var(--text-2);
1411
+ cursor: pointer;
1412
+ transition: all 0.15s ease;
1413
+ }
1414
+ .btn-wizard-back:hover { background: var(--sidebar-bg); color: var(--text); }
1415
+ .btn-wizard-next {
1416
+ padding: 10px 28px;
1417
+ background: var(--accent);
1418
+ border: 1.5px solid var(--accent);
1419
+ border-radius: 100px;
1420
+ font-family: 'Geist', sans-serif;
1421
+ font-size: 13.5px;
1422
+ font-weight: 600;
1423
+ color: var(--text);
1424
+ cursor: pointer;
1425
+ transition: all 0.15s ease;
1426
+ }
1427
+ .btn-wizard-next:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
1428
+ .btn-wizard-next:disabled { opacity: 0.45; cursor: not-allowed; }
1429
+ .wizard-field { margin-bottom: 20px; }
1430
+ .wizard-field label {
1431
+ display: block;
1432
+ font-size: 11px;
1433
+ font-weight: 600;
1434
+ letter-spacing: 0.07em;
1435
+ text-transform: uppercase;
1436
+ color: var(--muted);
1437
+ margin-bottom: 8px;
1438
+ }
1439
+ .wizard-input {
1440
+ width: 100%;
1441
+ padding: 10px 14px;
1442
+ font-family: 'Geist', sans-serif;
1443
+ font-size: 14px;
1444
+ background: var(--sidebar-bg);
1445
+ border: 1.5px solid var(--border);
1446
+ border-radius: 8px;
1447
+ color: var(--text);
1448
+ outline: none;
1449
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
1450
+ }
1451
+ .wizard-input:focus {
1452
+ background: #fff;
1453
+ border-color: var(--accent);
1454
+ box-shadow: 0 0 0 3px rgba(201,203,36,0.12);
1455
+ }
1456
+ .wizard-input.error { border-color: #EF4444; box-shadow: 0 0 0 3px rgba(239,68,68,0.1); }
1457
+ .wizard-error { margin-top: 6px; font-size: 12.5px; color: #EF4444; }
1458
+ .wizard-hint { margin-top: 6px; font-size: 12.5px; color: var(--muted); line-height: 1.5; }
1459
+ .wizard-option-grid { display: flex; flex-direction: column; gap: 10px; }
1460
+ .wizard-option {
1461
+ display: flex;
1462
+ align-items: flex-start;
1463
+ gap: 14px;
1464
+ padding: 14px 16px;
1465
+ border: 1.5px solid var(--border);
1466
+ border-radius: 10px;
1467
+ cursor: pointer;
1468
+ transition: all 0.15s ease;
1469
+ background: transparent;
1470
+ text-align: left;
1471
+ width: 100%;
1472
+ font-family: 'Geist', sans-serif;
1473
+ }
1474
+ .wizard-option:hover:not(:disabled) { border-color: var(--accent); background: rgba(201,203,36,0.05); }
1475
+ .wizard-option.selected { border-color: var(--accent); background: rgba(201,203,36,0.08); }
1476
+ .wizard-option:disabled { opacity: 0.4; cursor: not-allowed; }
1477
+ .wizard-option-radio {
1478
+ width: 18px;
1479
+ height: 18px;
1480
+ border-radius: 50%;
1481
+ border: 2px solid var(--border);
1482
+ flex-shrink: 0;
1483
+ margin-top: 2px;
1484
+ display: flex;
1485
+ align-items: center;
1486
+ justify-content: center;
1487
+ transition: border-color 0.15s ease;
1488
+ }
1489
+ .wizard-option.selected .wizard-option-radio { border-color: var(--accent); }
1490
+ .wizard-option-radio-inner {
1491
+ width: 8px;
1492
+ height: 8px;
1493
+ border-radius: 50%;
1494
+ background: var(--accent);
1495
+ opacity: 0;
1496
+ transition: opacity 0.15s ease;
1497
+ }
1498
+ .wizard-option.selected .wizard-option-radio-inner { opacity: 1; }
1499
+ .wizard-option-title { font-size: 13.5px; font-weight: 500; color: var(--text); margin-bottom: 3px; }
1500
+ .wizard-option-desc { font-size: 12.5px; color: var(--muted); line-height: 1.5; }
1501
+ .wizard-option-badge {
1502
+ margin-left: auto;
1503
+ font-size: 10px;
1504
+ font-weight: 600;
1505
+ letter-spacing: 0.06em;
1506
+ text-transform: uppercase;
1507
+ color: var(--muted);
1508
+ background: var(--border);
1509
+ padding: 2px 8px;
1510
+ border-radius: 100px;
1511
+ white-space: nowrap;
1512
+ flex-shrink: 0;
1513
+ align-self: flex-start;
1514
+ }
1515
+ .wizard-success {
1516
+ display: flex;
1517
+ flex-direction: column;
1518
+ align-items: center;
1519
+ text-align: center;
1520
+ padding: 20px 0 8px;
1521
+ }
1522
+ .wizard-success-icon {
1523
+ width: 64px;
1524
+ height: 64px;
1525
+ border-radius: 50%;
1526
+ background: rgba(201,203,36,0.15);
1527
+ display: flex;
1528
+ align-items: center;
1529
+ justify-content: center;
1530
+ font-size: 28px;
1531
+ margin-bottom: 20px;
1532
+ border: 2px solid rgba(201,203,36,0.3);
1533
+ }
1534
+ .wizard-success-title {
1535
+ font-family: 'Fraunces', serif;
1536
+ font-size: 24px;
1537
+ font-weight: 400;
1538
+ color: var(--text);
1539
+ margin-bottom: 10px;
1540
+ }
1541
+ .wizard-success-sub {
1542
+ font-size: 13.5px;
1543
+ color: var(--muted);
1544
+ line-height: 1.65;
1545
+ max-width: 360px;
1546
+ }
1547
+ .wizard-welcome-list {
1548
+ display: grid;
1549
+ gap: 14px;
1550
+ padding: 8px 0;
1551
+ }
1552
+ .wizard-welcome-item {
1553
+ display: flex;
1554
+ align-items: flex-start;
1555
+ gap: 14px;
1556
+ }
1557
+ .wizard-welcome-icon {
1558
+ width: 36px;
1559
+ height: 36px;
1560
+ border-radius: 50%;
1561
+ background: rgba(201,203,36,0.12);
1562
+ display: flex;
1563
+ align-items: center;
1564
+ justify-content: center;
1565
+ flex-shrink: 0;
1566
+ font-size: 16px;
1567
+ border: 1px solid rgba(201,203,36,0.2);
1568
+ }
1569
+ .wizard-welcome-title { font-size: 13.5px; font-weight: 500; color: var(--text); margin-bottom: 2px; }
1570
+ .wizard-welcome-desc { font-size: 12.5px; color: var(--muted); line-height: 1.5; }
1571
+
1572
+ /* ─── Settings view ─── */
1573
+ .settings-max { max-width: 560px; }
1574
+ .settings-section { margin-bottom: 28px; }
1575
+ .settings-section-title {
1576
+ font-family: 'Fraunces', serif;
1577
+ font-size: 17px;
1578
+ font-weight: 400;
1579
+ color: var(--text);
1580
+ margin-bottom: 10px;
1581
+ }
1582
+ .settings-card {
1583
+ background: var(--card-bg);
1584
+ border: 1px solid var(--border);
1585
+ border-radius: var(--radius);
1586
+ padding: 18px 20px;
1587
+ box-shadow: var(--shadow-card);
1588
+ }
1589
+ .settings-field + .settings-field { margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border); }
1590
+ .settings-label {
1591
+ display: block;
1592
+ font-size: 11px;
1593
+ font-weight: 600;
1594
+ letter-spacing: 0.07em;
1595
+ text-transform: uppercase;
1596
+ color: var(--muted);
1597
+ margin-bottom: 8px;
1598
+ }
1599
+ .settings-current-key {
1600
+ font-size: 13.5px;
1601
+ color: var(--text-2);
1602
+ font-family: 'Geist Mono', monospace;
1603
+ margin-bottom: 8px;
1604
+ }
1605
+ .settings-value-text {
1606
+ font-size: 13.5px;
1607
+ color: var(--text);
1608
+ font-family: 'Geist Mono', monospace;
1609
+ }
1610
+ .settings-select {
1611
+ width: 100%;
1612
+ max-width: 320px;
1613
+ padding: 9px 12px;
1614
+ font-family: 'Geist', sans-serif;
1615
+ font-size: 13.5px;
1616
+ background: var(--sidebar-bg);
1617
+ border: 1.5px solid var(--border);
1618
+ border-radius: 8px;
1619
+ color: var(--text);
1620
+ outline: none;
1621
+ cursor: pointer;
1622
+ }
1623
+ .settings-select:focus {
1624
+ border-color: var(--accent);
1625
+ box-shadow: 0 0 0 3px rgba(201,203,36,0.12);
1626
+ }
1627
+ </style>
1628
+ </head>
1629
+ <body>
1630
+
1631
+ <div class="app-layout">
1632
+ <!-- ─── Sidebar ─── -->
1633
+ <aside class="sidebar">
1634
+ <div class="sidebar-header">
1635
+ <div class="sidebar-logo">
1636
+ <span class="sidebar-wordmark">Stenotype</span>
1637
+ <span class="sidebar-version">v1</span>
1638
+ </div>
1639
+ </div>
1640
+
1641
+ <nav class="sidebar-nav">
1642
+ <div class="nav-section-label">Views</div>
1643
+
1644
+ <div class="nav-item active" data-view="memories">
1645
+ <svg class="nav-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5">
1646
+ <path d="M9.5 2.5a7 7 0 1 1 0 14 7 7 0 0 1 0-14z" stroke-linecap="round"/>
1647
+ <path d="M9.5 6.5v4l2.5 1.5" stroke-linecap="round" stroke-linejoin="round"/>
1648
+ </svg>
1649
+ Memories
1650
+ <span class="nav-badge" id="nav-memories-count">—</span>
1651
+ </div>
1652
+
1653
+ <div class="nav-item" data-view="pinned">
1654
+ <svg class="nav-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5">
1655
+ <path d="M10 2l1.8 5.4H17l-4.6 3.4 1.8 5.4L10 13l-4.2 3.2 1.8-5.4L3 7.4h5.2L10 2z" stroke-linecap="round" stroke-linejoin="round"/>
1656
+ </svg>
1657
+ Pinned
1658
+ <span class="nav-badge" id="nav-pinned-count">—</span>
1659
+ </div>
1660
+
1661
+ <div class="nav-item" data-view="commitments">
1662
+ <svg class="nav-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5">
1663
+ <rect x="3" y="3" width="14" height="14" rx="2"/>
1664
+ <path d="M7 10l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"/>
1665
+ </svg>
1666
+ Commitments
1667
+ <span class="nav-badge" id="nav-commitments-count">—</span>
1668
+ </div>
1669
+
1670
+ <div class="nav-section-label" style="margin-top:8px">System</div>
1671
+ <div class="nav-item" data-view="settings">
1672
+ <svg class="nav-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5">
1673
+ <circle cx="10" cy="10" r="2.5"/>
1674
+ <path d="M10 2.5V4M10 16v1.5M2.5 10H4M16 10h1.5M4.55 4.55l1.06 1.06M14.39 14.39l1.06 1.06M4.55 15.45l1.06-1.06M14.39 5.61l1.06-1.06" stroke-linecap="round"/>
1675
+ </svg>
1676
+ Settings
1677
+ </div>
1678
+ </nav>
1679
+
1680
+ <!-- Stats mini-panel -->
1681
+ <div class="sidebar-stats" id="sidebar-stats">
1682
+ <div class="stats-label">Memory Bank</div>
1683
+ <div class="stats-total">
1684
+ <span class="stats-total-num" id="stats-active-count">—</span>
1685
+ <span class="stats-total-label">active memories</span>
1686
+ </div>
1687
+ <div class="stats-row">
1688
+ <span class="stats-dot hot"></span>
1689
+ <span class="stats-dot-label">Hot</span>
1690
+ <span class="stats-dot-count" id="stats-hot">—</span>
1691
+ </div>
1692
+ <div class="stats-row">
1693
+ <span class="stats-dot warm"></span>
1694
+ <span class="stats-dot-label">Warm</span>
1695
+ <span class="stats-dot-count" id="stats-warm">—</span>
1696
+ </div>
1697
+ <div class="stats-row">
1698
+ <span class="stats-dot cold"></span>
1699
+ <span class="stats-dot-label">Cold</span>
1700
+ <span class="stats-dot-count" id="stats-cold">—</span>
1701
+ </div>
1702
+ </div>
1703
+
1704
+ <!-- Footer -->
1705
+ <div class="sidebar-footer">
1706
+ <div class="user-avatar" id="user-avatar">J</div>
1707
+ <span class="user-name" id="user-name">juan</span>
1708
+ <button class="logout-btn" id="logout-btn" title="Sign out">
1709
+ <svg width="16" height="16" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5">
1710
+ <path d="M13.5 7.5L17 11l-3.5 3.5M7 11h10M7.5 3H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h3.5" stroke-linecap="round" stroke-linejoin="round"/>
1711
+ </svg>
1712
+ </button>
1713
+ </div>
1714
+ </aside>
1715
+
1716
+ <!-- ─── Main content ─── -->
1717
+ <div class="main-content">
1718
+
1719
+ <!-- Topbar -->
1720
+ <div class="topbar">
1721
+ <h1 class="page-title" id="page-title">Memories</h1>
1722
+ <div class="search-wrap" id="search-wrap">
1723
+ <svg class="search-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5">
1724
+ <circle cx="8.5" cy="8.5" r="5.5"/>
1725
+ <path d="M14.5 14.5l3 3" stroke-linecap="round"/>
1726
+ </svg>
1727
+ <input
1728
+ type="text"
1729
+ class="search-input"
1730
+ id="search-input"
1731
+ placeholder="Search memories…"
1732
+ autocomplete="off"
1733
+ />
1734
+ </div>
1735
+ </div>
1736
+
1737
+ <!-- Filter row -->
1738
+ <div class="filter-row" id="filter-row">
1739
+ <div class="filter-group">
1740
+ <span class="filter-label">Category</span>
1741
+ <button class="pill active" data-cat="all">All</button>
1742
+ <button class="pill" data-cat="decision">Decision</button>
1743
+ <button class="pill" data-cat="task">Task</button>
1744
+ <button class="pill" data-cat="person">Person</button>
1745
+ <button class="pill" data-cat="project">Project</button>
1746
+ <button class="pill" data-cat="preference">Preference</button>
1747
+ <button class="pill" data-cat="fact">Fact</button>
1748
+ <button class="pill" data-cat="emotion">Emotion</button>
1749
+ <button class="pill" data-cat="instruction">Instruction</button>
1750
+ <button class="pill" data-cat="other">Other</button>
1751
+ </div>
1752
+
1753
+ <div class="filter-group">
1754
+ <span class="filter-label">Temp</span>
1755
+ <button class="pill active" data-temp="all">All</button>
1756
+ <button class="pill" data-temp="hot">Hot</button>
1757
+ <button class="pill" data-temp="warm">Warm</button>
1758
+ <button class="pill" data-temp="cold">Cold</button>
1759
+ <button class="pill archived-toggle" id="archived-toggle" data-active="false">
1760
+ Archived <span class="archived-count" id="archived-pill-count"></span>
1761
+ </button>
1762
+ </div>
1763
+
1764
+ <div class="filter-group">
1765
+ <span class="filter-label">Period</span>
1766
+ <button class="pill active" data-period="all">All time</button>
1767
+ <button class="pill" data-period="today">Today</button>
1768
+ <button class="pill" data-period="7d">7 days</button>
1769
+ <button class="pill" data-period="30d">30 days</button>
1770
+ <button class="pill" data-period="90d">90 days</button>
1771
+ </div>
1772
+
1773
+ <div class="filter-group">
1774
+ <span class="filter-label">Agent</span>
1775
+ <select class="agent-select" id="agent-select">
1776
+ <option value="all">All agents</option>
1777
+ </select>
1778
+ </div>
1779
+ </div>
1780
+
1781
+ <!-- Content area -->
1782
+ <div class="content-area">
1783
+ <!-- Memories view -->
1784
+ <div class="view active" id="view-memories">
1785
+ <div id="memories-container"></div>
1786
+ <div class="load-more-wrap" id="load-more-wrap" style="display:none">
1787
+ <button class="load-more-btn" id="load-more-btn">Load more</button>
1788
+ </div>
1789
+ </div>
1790
+
1791
+ <!-- Pinned view -->
1792
+ <div class="view" id="view-pinned">
1793
+ <div class="section-header">
1794
+ <h2 class="section-title">Pinned Memories</h2>
1795
+ <span class="section-count" id="pinned-count-label"></span>
1796
+ </div>
1797
+ <div class="pinned-grid" id="pinned-container"></div>
1798
+ </div>
1799
+
1800
+ <!-- Commitments view -->
1801
+ <div class="view" id="view-commitments">
1802
+ <div class="section-header">
1803
+ <h2 class="section-title">Commitment Ledger</h2>
1804
+ <span class="section-count" id="commitments-count-label"></span>
1805
+ </div>
1806
+ <div class="commitments-table-wrap">
1807
+ <table>
1808
+ <thead>
1809
+ <tr>
1810
+ <th>Commitment</th>
1811
+ <th>State</th>
1812
+ <th>Source</th>
1813
+ <th>Agent</th>
1814
+ <th>Date</th>
1815
+ </tr>
1816
+ </thead>
1817
+ <tbody id="commitments-body"></tbody>
1818
+ </table>
1819
+ </div>
1820
+ </div>
1821
+
1822
+ <!-- Settings view -->
1823
+ <div class="view" id="view-settings">
1824
+ <div class="settings-max">
1825
+ <div class="section-header">
1826
+ <h2 class="section-title">Settings</h2>
1827
+ </div>
1828
+ <div id="settings-container"></div>
1829
+ </div>
1830
+ </div>
1831
+ </div>
1832
+ </div>
1833
+ </div>
1834
+
1835
+ <!-- ─── Detail Modal ─── -->
1836
+ <div class="modal-overlay" id="modal-overlay">
1837
+ <div class="modal-panel" id="modal-panel">
1838
+ <div class="modal-header">
1839
+ <div class="modal-title">
1840
+ <div class="modal-category" id="modal-cat"></div>
1841
+ <div class="modal-subject-text" id="modal-subject"></div>
1842
+ </div>
1843
+ <button class="modal-close" id="modal-close">
1844
+ <svg width="16" height="16" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5">
1845
+ <path d="M5 5l10 10M15 5l-10 10" stroke-linecap="round"/>
1846
+ </svg>
1847
+ </button>
1848
+ </div>
1849
+ <div class="modal-body">
1850
+ <pre class="modal-content-text" id="modal-content"></pre>
1851
+
1852
+ <div class="modal-bars" id="modal-bars">
1853
+ <div class="modal-bar-wrap">
1854
+ <div class="modal-bar-label">
1855
+ <span>Confidence</span>
1856
+ <span id="modal-confidence-val"></span>
1857
+ </div>
1858
+ <div class="modal-track">
1859
+ <div class="modal-fill confidence" id="modal-confidence-bar"></div>
1860
+ </div>
1861
+ </div>
1862
+ <div class="modal-bar-wrap">
1863
+ <div class="modal-bar-label">
1864
+ <span>Importance</span>
1865
+ <span id="modal-importance-val"></span>
1866
+ </div>
1867
+ <div class="modal-track">
1868
+ <div class="modal-fill importance" id="modal-importance-bar"></div>
1869
+ </div>
1870
+ </div>
1871
+ </div>
1872
+
1873
+ <div class="modal-tags" id="modal-tags"></div>
1874
+
1875
+ <div class="modal-grid">
1876
+ <div class="modal-field">
1877
+ <div class="modal-field-label">Temperature</div>
1878
+ <div class="modal-field-value" id="modal-temp"></div>
1879
+ </div>
1880
+ <div class="modal-field">
1881
+ <div class="modal-field-label">Agent</div>
1882
+ <div class="modal-field-value" id="modal-agent"></div>
1883
+ </div>
1884
+ <div class="modal-field">
1885
+ <div class="modal-field-label">Source Channel</div>
1886
+ <div class="modal-field-value" id="modal-source"></div>
1887
+ </div>
1888
+ <div class="modal-field">
1889
+ <div class="modal-field-label">Extracted By</div>
1890
+ <div class="modal-field-value" id="modal-extracted"></div>
1891
+ </div>
1892
+ <div class="modal-field">
1893
+ <div class="modal-field-label">Created</div>
1894
+ <div class="modal-field-value" id="modal-created"></div>
1895
+ </div>
1896
+ <div class="modal-field">
1897
+ <div class="modal-field-label">Updated</div>
1898
+ <div class="modal-field-value" id="modal-updated"></div>
1899
+ </div>
1900
+ <div class="modal-field">
1901
+ <div class="modal-field-label">Access Count</div>
1902
+ <div class="modal-field-value" id="modal-access-count"></div>
1903
+ </div>
1904
+ <div class="modal-field">
1905
+ <div class="modal-field-label">Last Accessed</div>
1906
+ <div class="modal-field-value" id="modal-last-accessed"></div>
1907
+ </div>
1908
+ </div>
1909
+
1910
+ <!-- Temperature lifecycle -->
1911
+ <div class="temp-lifecycle" id="modal-lifecycle"></div>
1912
+
1913
+ <div class="modal-field" id="modal-supersedes-wrap" style="display:none">
1914
+ <div class="modal-field-label">Supersedes</div>
1915
+ <div class="modal-field-value" id="modal-supersedes"></div>
1916
+ </div>
1917
+ <div class="modal-field" id="modal-superseded-by-wrap" style="display:none">
1918
+ <div class="modal-field-label">Superseded By</div>
1919
+ <div class="modal-field-value" id="modal-superseded-by"></div>
1920
+ </div>
1921
+ </div>
1922
+ <div class="modal-footer">
1923
+ <span class="modal-id" id="modal-id"></span>
1924
+ <div style="display:flex;gap:8px">
1925
+ <button class="btn-restore" id="modal-restore-btn" style="display:none">Restore</button>
1926
+ <button class="btn-delete" id="modal-delete-btn">Delete</button>
1927
+ </div>
1928
+ </div>
1929
+ </div>
1930
+ </div>
1931
+
1932
+ <!-- ─── Delete Confirm Dialog ─── -->
1933
+ <div class="confirm-overlay" id="confirm-overlay">
1934
+ <div class="confirm-dialog">
1935
+ <div class="confirm-title">Delete this memory?</div>
1936
+ <div class="confirm-subtitle">This will soft-delete the memory. It won't appear in the dashboard but remains in the database.</div>
1937
+ <div class="confirm-actions">
1938
+ <button class="btn-cancel" id="confirm-cancel">Cancel</button>
1939
+ <button class="btn-confirm-delete" id="confirm-delete">Delete</button>
1940
+ </div>
1941
+ </div>
1942
+ </div>
1943
+
1944
+ <!-- ─── Toast container ─── -->
1945
+ <div class="toast-container" id="toast-container"></div>
1946
+
1947
+ <!-- ─── Wizard overlay ─── -->
1948
+ <div class="wizard-overlay" id="wizard-overlay">
1949
+ <div class="wizard-card">
1950
+ <div class="wizard-header">
1951
+ <div class="wizard-steps" id="wizard-steps"></div>
1952
+ <div class="wizard-title" id="wizard-title"></div>
1953
+ <div class="wizard-subtitle" id="wizard-subtitle"></div>
1954
+ </div>
1955
+ <div class="wizard-body" id="wizard-body"></div>
1956
+ <div class="wizard-footer">
1957
+ <button class="btn-wizard-back" id="wizard-back" style="display:none">Back</button>
1958
+ <div class="spacer"></div>
1959
+ <button class="btn-wizard-next" id="wizard-next">Get started</button>
1960
+ </div>
1961
+ </div>
1962
+ </div>
1963
+
1964
+ <script src="/app.js"></script>
1965
+ </body>
1966
+ </html>