1
-<script type="module">
2
- import { store } from "/components/settings/memory/memory-dashboard-store.js";
3
-</script>
4
-
1
+<html>
2
+<head>
3
+ <title>Memory Dashboard</title>
4
+ <script type="module">
5
+ import { store } from "/components/settings/memory/memory-dashboard-store.js";
6
+ </script>
7
+</head>
8
+<body>
9
<div x-data>
10
<template x-if="$store.memoryDashboardStore">
7
- <div x-init="$store.memoryDashboardStore.initialize()" class="memory-dashboard">
8
-
9
- <!-- Header with title and statistics -->
10
- <div class="dashboard-header">
11
- <h3>Memory Dashboard</h3>
12
- <div class="memory-stats" x-show="!$store.memoryDashboardStore.loading">
13
- <div class="stat-item">
14
- <span class="stat-label">Total:</span>
15
- <span class="stat-value" x-text="$store.memoryDashboardStore.totalCount"></span>
16
- </div>
17
- <div class="stat-item">
18
- <span class="stat-label">Knowledge:</span>
19
- <span class="stat-value" x-text="$store.memoryDashboardStore.knowledgeCount"></span>
20
- </div>
21
- <div class="stat-item">
22
- <span class="stat-label">Conversation:</span>
23
- <span class="stat-value" x-text="$store.memoryDashboardStore.conversationCount"></span>
24
- </div>
25
- </div>
26
- </div>
11
+ <div x-init="
12
+ $store.memoryDashboardStore.initialize();
13
+
14
+ // Setup cleanup when component is removed from DOM
15
+ const observer = new MutationObserver((mutations) => {
16
+ mutations.forEach((mutation) => {
17
+ if (mutation.type === 'childList') {
18
+ mutation.removedNodes.forEach((node) => {
19
+ if (node.contains && node.contains($el)) {
20
+ // Dashboard is being removed, cleanup polling
21
+ $store.memoryDashboardStore.cleanup();
22
+ observer.disconnect();
23
+ }
24
+ });
25
+ }
26
+ });
27
+ });
28
+
29
+ // Watch for DOM changes
30
+ observer.observe(document.body, {
31
+ childList: true,
32
+ subtree: true
33
+ });
34
+ " class="memory-dashboard">
35
+
36
+
37
38
<!-- Search and Filters -->
39
<div class="filters-section">
55
<label for="area-filter">Area:</label>
56
<select id="area-filter" x-model="$store.memoryDashboardStore.areaFilter">
57
<option value="">All Areas</option>
48
- <option value="MAIN">Main</option>
49
- <option value="FRAGMENTS">Fragments</option>
50
- <option value="SOLUTIONS">Solutions</option>
51
- <option value="INSTRUMENTS">Instruments</option>
58
+ <option value="main">Main</option>
59
+ <option value="fragments">Fragments</option>
60
+ <option value="solutions">Solutions</option>
61
+ <option value="instruments">Instruments</option>
62
</select>
63
</div>
64
105
<div x-show="!$store.memoryDashboardStore.loading && !$store.memoryDashboardStore.error"
106
class="memory-table-container">
107
98
- <!-- Pagination controls at top -->
99
- <div class="pagination-controls-top" x-show="$store.memoryDashboardStore.totalPages > 1">
100
- <div class="pagination-info-inline">
101
- <span>Page <span x-text="$store.memoryDashboardStore.currentPage"></span>
102
- of <span x-text="$store.memoryDashboardStore.totalPages"></span>
103
- (<span x-text="$store.memoryDashboardStore.memories.length"></span> total memories)
104
- </span>
108
+ <!-- Combined stats and pagination header -->
109
+ <div class="stats-pagination-header" x-show="!$store.memoryDashboardStore.loading">
110
+ <!-- Statistics -->
111
+ <div class="memory-stats-compact">
112
+ <div class="stat-item">
113
+ <span class="stat-label">DB Total:</span>
114
+ <span class="stat-value" x-text="$store.memoryDashboardStore.totalDbCount"></span>
115
+ </div>
116
+ <div class="stat-item">
117
+ <span class="stat-label">Filtered:</span>
118
+ <span class="stat-value" x-text="$store.memoryDashboardStore.totalCount"></span>
119
+ </div>
120
+ <div class="stat-item">
121
+ <span class="stat-label">Knowledge:</span>
122
+ <span class="stat-value" x-text="$store.memoryDashboardStore.knowledgeCount"></span>
123
+ </div>
124
+ <div class="stat-item">
125
+ <span class="stat-label">Conversation:</span>
126
+ <span class="stat-value" x-text="$store.memoryDashboardStore.conversationCount"></span>
127
+ </div>
128
</div>
129
107
- <div class="pagination-controls">
108
- <button class="btn slim" @click="$store.memoryDashboardStore.prevPage()"
109
- :disabled="$store.memoryDashboardStore.currentPage === 1">
110
- Previous
111
- </button>
112
-
113
- <select class="page-select"
114
- x-model.number="$store.memoryDashboardStore.currentPage"
115
- @change="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)">
116
- <template x-for="page in Array.from({length: $store.memoryDashboardStore.totalPages}, (_, i) => i + 1)" :key="page">
117
- <option :value="page" x-text="'Page ' + page"></option>
118
- </template>
119
- </select>
120
-
121
- <button class="btn slim" @click="$store.memoryDashboardStore.nextPage()"
122
- :disabled="$store.memoryDashboardStore.currentPage === $store.memoryDashboardStore.totalPages">
123
- Next
124
- </button>
130
+ <!-- Pagination controls -->
131
+ <div class="pagination-controls-compact" x-show="$store.memoryDashboardStore.totalPages > 1">
132
+ <div class="pagination-info-inline">
133
+ <span>Page <span x-text="$store.memoryDashboardStore.currentPage"></span>
134
+ of <span x-text="$store.memoryDashboardStore.totalPages"></span>
135
+ </span>
136
+ </div>
137
+
138
+ <div class="pagination-controls">
139
+ <button class="btn slim" @click="$store.memoryDashboardStore.prevPage()"
140
+ :disabled="$store.memoryDashboardStore.currentPage === 1">
141
+ Previous
142
+ </button>
143
+
144
+ <select class="page-select"
145
+ x-model.number="$store.memoryDashboardStore.currentPage"
146
+ @change="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)">
147
+ <template x-for="page in Array.from({length: $store.memoryDashboardStore.totalPages}, (_, i) => i + 1)" :key="page">
148
+ <option :value="page" x-text="'Page ' + page"></option>
149
+ </template>
150
+ </select>
151
+
152
+ <button class="btn slim" @click="$store.memoryDashboardStore.nextPage()"
153
+ :disabled="$store.memoryDashboardStore.currentPage === $store.memoryDashboardStore.totalPages">
154
+ Next
155
+ </button>
156
+ </div>
157
</div>
158
</div>
159
218
</th>
219
<th class="col-metadata">Metadata</th>
220
<th class="col-preview">Preview</th>
189
- <th class="col-actions">Actions</th>
221
+ <th class="col-actions"></th>
222
</tr>
223
</thead>
224
<tbody>
236
<td class="metadata-cell">
237
<div class="metadata-info">
238
<div class="metadata-row">
207
- <span class="area-badge"
208
- :style="`background-color: ${$store.memoryDashboardStore.getAreaColor(memory.area)}`"
209
- x-text="memory.area"></span>
239
+ <span class="area-badge"
240
+ :style="`background-color: ${$store.memoryDashboardStore.getAreaColor(memory.area)}`"
241
+ x-text="(memory.area || 'UNKNOWN').toUpperCase()"></span>
242
</div>
243
<div class="metadata-row metadata-timestamp">
244
<span x-text="$store.memoryDashboardStore.formatTimestamp(memory.timestamp, true)"
246
</div>
247
<div class="metadata-row">
248
<template x-if="memory.knowledge_source">
217
- <span class="source-type knowledge">📚 Knowledge</span>
249
+ <span class="source-type knowledge">Knowledge</span>
250
</template>
251
<template x-if="!memory.knowledge_source">
220
- <span class="source-type conversation">💬 Conversation</span>
252
+ <span class="source-type conversation">Conversation</span>
253
</template>
254
</div>
255
</div>
267
268
<!-- Actions -->
269
<td class="actions-cell" @click.stop>
238
- <button class="btn-action copy" @click="$store.memoryDashboardStore.copyToClipboard($store.memoryDashboardStore.formatMemoryForCopy(memory))"
239
- title="Copy Memory">
240
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
241
- <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
242
- <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
243
- </svg>
244
- </button>
245
-
246
- <button class="btn-action delete" @click="$store.memoryDashboardStore.deleteMemory(memory)"
247
- title="Delete Memory">
248
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
249
- <polyline points="3,6 5,6 21,6"></polyline>
250
- <path d="M19,6V20a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V6M8,6V4a2,2,0,0,1,2-2h4a2,2,0,0,1,2,2V6"></path>
251
- <line x1="10" y1="11" x2="10" y2="17"></line>
252
- <line x1="14" y1="11" x2="14" y2="17"></line>
253
- </svg>
254
- </button>
270
+ <div class="actions-wrapper">
271
+ <button class="btn-action copy" @click="$store.memoryDashboardStore.copyToClipboard($store.memoryDashboardStore.formatMemoryForCopy(memory))"
272
+ title="Copy Memory">
273
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
274
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
275
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
276
+ </svg>
277
+ </button>
278
+
279
+ <button class="btn-action delete" @click="$store.memoryDashboardStore.deleteMemory(memory)"
280
+ title="Delete Memory">
281
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
282
+ <polyline points="3,6 5,6 21,6"></polyline>
283
+ <path d="M19,6V20a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V6M8,6V4a2,2,0,0,1,2-2h4a2,2,0,0,1,2,2V6"></path>
284
+ <line x1="10" y1="11" x2="10" y2="17"></line>
285
+ <line x1="14" y1="11" x2="14" y2="17"></line>
286
+ </svg>
287
+ </button>
288
+ </div>
289
</td>
290
</tr>
291
</template>
292
</tbody>
293
</table>
294
261
- <!-- Pagination controls at bottom -->
262
- <div class="pagination-controls-bottom" x-show="$store.memoryDashboardStore.totalPages > 1">
263
- <div class="pagination-info-inline">
264
- <span>Page <span x-text="$store.memoryDashboardStore.currentPage"></span>
265
- of <span x-text="$store.memoryDashboardStore.totalPages"></span>
266
- (<span x-text="$store.memoryDashboardStore.memories.length"></span> total memories)
267
- </span>
268
- </div>
295
270
- <div class="pagination-controls">
271
- <button class="btn slim" @click="$store.memoryDashboardStore.prevPage()"
272
- :disabled="$store.memoryDashboardStore.currentPage === 1">
273
- Previous
274
- </button>
275
-
276
- <select class="page-select"
277
- x-model.number="$store.memoryDashboardStore.currentPage"
278
- @change="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)">
279
- <template x-for="page in Array.from({length: $store.memoryDashboardStore.totalPages}, (_, i) => i + 1)" :key="page">
280
- <option :value="page" x-text="'Page ' + page"></option>
281
- </template>
282
- </select>
283
-
284
- <button class="btn slim" @click="$store.memoryDashboardStore.nextPage()"
285
- :disabled="$store.memoryDashboardStore.currentPage === $store.memoryDashboardStore.totalPages">
286
- Next
287
- </button>
288
- </div>
289
- </div>
296
297
</div>
298
334
color: var(--color-text);
335
}
336
331
- .dashboard-header {
337
+ .memory-dashboard h3 {
338
+ color: var(--color-text);
339
+ margin: 0;
340
+ font-size: 1.5rem;
341
+ font-weight: 600;
342
+ }
343
+
344
+
345
+
346
+ .stats-pagination-header {
347
display: flex;
348
justify-content: space-between;
349
align-items: center;
335
- margin-bottom: 1.5rem;
336
- padding-bottom: 1rem;
337
- border-bottom: 1px solid var(--color-border);
350
+ padding: 1rem;
351
+ background: var(--color-panel);
352
+ border: 1px solid var(--color-border);
353
+ border-radius: 8px;
354
+ border-bottom: none;
355
+ border-bottom-left-radius: 0;
356
+ border-bottom-right-radius: 0;
357
}
358
340
- .memory-stats {
359
+ .memory-stats-compact {
360
display: flex;
361
gap: 1rem;
362
+ flex-wrap: wrap;
363
+ }
364
+
365
+ .pagination-controls-compact {
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 1rem;
369
}
370
371
.stat-item {
381
382
.stat-label {
383
font-size: 0.8rem;
358
- color: var(--color-secondary);
384
+ color: var(--color-text);
385
+ opacity: 0.7;
386
margin-bottom: 0.25rem;
387
}
388
389
+ .light-mode .stat-label {
390
+ opacity: 0.8;
391
+ }
392
+
393
.stat-value {
394
font-size: 1.1rem;
395
font-weight: bold;
438
.filter-group input:focus, .filter-group select:focus {
439
outline: none;
440
border-color: var(--color-primary);
410
- box-shadow: 0 0 0 2px rgba(115, 122, 129, 0.1);
441
+ box-shadow: 0 0 0 2px rgba(115, 122, 129, 0.2);
442
+ background: var(--color-input-focus);
443
+ }
444
+
445
+ .light-mode .filter-group input:focus,
446
+ .light-mode .filter-group select:focus {
447
+ box-shadow: 0 0 0 2px rgba(56, 70, 83, 0.1);
448
}
449
450
.filter-actions {
462
463
.loading-text {
464
font-size: 0.85rem;
428
- color: var(--color-secondary);
465
+ color: var(--color-text);
466
+ opacity: 0.7;
467
font-style: italic;
468
}
469
470
.loading-state, .error-state, .no-memories, .init-message {
471
text-align: center;
472
padding: 2rem;
435
- color: var(--color-secondary);
473
+ color: var(--color-text);
474
+ opacity: 0.8;
475
background: var(--color-panel);
476
border: 1px solid var(--color-border);
477
border-radius: 8px;
480
481
.init-message {
482
color: var(--color-primary);
444
- background: rgba(115, 122, 129, 0.1);
483
+ background: rgba(115, 122, 129, 0.2);
484
border-color: var(--color-primary);
485
}
486
487
+ .light-mode .init-message {
488
+ background: rgba(56, 70, 83, 0.1);
489
+ }
490
+
491
.error-state {
492
color: var(--color-accent);
450
- background: rgba(207, 102, 121, 0.1);
493
+ background: rgba(207, 102, 121, 0.2);
494
border-color: var(--color-accent);
495
}
496
497
+ .light-mode .error-state {
498
+ background: rgba(176, 0, 32, 0.1);
499
+ }
500
+
501
.loading-spinner {
455
- width: 20px;
456
- height: 20px;
457
- border: 2px solid var(--color-border);
458
- border-left-color: var(--color-primary);
502
+ width: 24px;
503
+ height: 24px;
504
+ min-width: 24px;
505
+ min-height: 24px;
506
+ max-width: 24px;
507
+ max-height: 24px;
508
+ border: 3px solid var(--color-border);
509
+ border-top-color: var(--color-primary);
510
border-radius: 50%;
511
animation: spin 1s linear infinite;
512
margin: 0 auto 0.5rem;
513
+ flex-shrink: 0;
514
+ flex-grow: 0;
515
+ display: inline-block;
516
+ position: relative;
517
+ box-sizing: border-box;
518
}
519
520
@keyframes spin {
543
/* Fixed column widths for proper fit */
544
.col-select { width: 5%; }
545
.col-metadata { width: 25%; }
490
- .col-preview { width: 55%; }
491
- .col-actions { width: 15%; }
546
+ .col-preview { width: 60%; }
547
+ .col-actions { width: 10%; }
548
549
.memory-table th,
550
.memory-table td {
600
601
/* Selected row styling */
602
.memory-row.selected {
547
- background: rgba(115, 122, 129, 0.1);
603
+ background: rgba(115, 122, 129, 0.2);
604
border-left: 3px solid var(--color-primary);
605
}
606
607
.light-mode .memory-row.selected {
552
- background: rgba(115, 122, 129, 0.05);
608
+ background: rgba(56, 70, 83, 0.1);
609
}
610
611
/* Mass action toolbar */
614
justify-content: space-between;
615
align-items: center;
616
padding: 1rem;
561
- background: rgba(115, 122, 129, 0.1);
617
+ background: rgba(115, 122, 129, 0.2);
618
border: 1px solid var(--color-primary);
619
border-radius: 8px;
620
margin: 1rem 0;
622
}
623
624
.light-mode .mass-action-toolbar {
569
- background: rgba(115, 122, 129, 0.05);
625
+ background: rgba(56, 70, 83, 0.1);
626
}
627
628
.selection-info {
652
653
.btn-mass:hover {
654
border-color: var(--color-primary);
599
- background: rgba(115, 122, 129, 0.1);
655
+ background: var(--color-panel);
656
}
657
658
.btn-mass.copy:hover {
603
- border-color: #4caf50;
604
- color: #4caf50;
659
+ border-color: var(--color-primary);
660
+ color: var(--color-primary);
661
}
662
663
.btn-mass.export:hover {
608
- border-color: #2196f3;
609
- color: #2196f3;
664
+ border-color: var(--color-primary);
665
+ color: var(--color-primary);
666
}
667
668
.btn-mass.delete:hover {
613
- border-color: #f44336;
614
- color: #f44336;
669
+ border-color: var(--color-accent);
670
+ color: var(--color-accent);
671
}
672
673
.btn-mass.clear:hover {
618
- border-color: #ff9800;
619
- color: #ff9800;
674
+ border-color: var(--color-primary);
675
+ color: var(--color-primary);
676
}
677
678
@keyframes slideDown {
706
}
707
708
.memory-table tbody tr:hover {
653
- background: rgba(255, 255, 255, 0.1);
709
+ background: var(--color-panel);
710
}
711
712
.memory-table tbody tr:last-child {
719
color: white;
720
font-size: 0.75rem;
721
font-weight: bold;
666
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
722
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
723
+ border: 1px solid rgba(255, 255, 255, 0.1);
724
+ }
725
+
726
+ .light-mode .area-badge {
727
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
728
+ border: 1px solid rgba(0, 0, 0, 0.1);
729
}
730
731
.timestamp-cell {
732
font-size: 0.85rem;
671
- color: var(--color-secondary);
733
+ color: var(--color-text);
734
+ opacity: 0.7;
735
white-space: normal;
736
word-break: break-word;
737
font-family: monospace;
757
}
758
759
.source-type.knowledge {
697
- background: rgba(115, 122, 129, 0.1);
760
+ background: rgba(115, 122, 129, 0.2);
761
color: var(--color-primary);
762
border-color: var(--color-primary);
763
}
764
765
+ .light-mode .source-type.knowledge {
766
+ background: rgba(56, 70, 83, 0.1);
767
+ color: var(--color-primary);
768
+ }
769
+
770
.source-type.conversation {
703
- background: rgba(101, 101, 101, 0.1);
704
- color: var(--color-secondary);
705
- border-color: var(--color-secondary);
771
+ background: rgba(101, 101, 101, 0.2);
772
+ color: var(--color-text);
773
+ opacity: 0.8;
774
+ border-color: var(--color-border);
775
+ }
776
+
777
+ .light-mode .source-type.conversation {
778
+ background: rgba(232, 234, 246, 0.5);
779
+ color: var(--color-text);
780
+ opacity: 0.9;
781
}
782
783
.source-file {
784
font-size: 0.7rem;
710
- color: var(--color-secondary);
785
+ color: var(--color-text);
786
+ opacity: 0.7;
787
font-family: monospace;
788
background: var(--color-panel);
789
padding: 0.2rem 0.4rem;
819
padding: 0.2rem 0.4rem;
820
border-radius: 6px;
821
font-size: 0.7rem;
746
- color: var(--color-secondary);
822
+ color: var(--color-text);
823
+ opacity: 0.8;
824
}
825
826
.actions-cell {
750
- white-space: nowrap;
751
- text-align: center;
752
- min-width: 140px;
753
- padding: 0.5rem 0.25rem !important;
827
+ min-width: 60px;
828
+ width: 60px;
829
+ padding: 0 !important;
830
+ height: 60px;
831
+ position: relative;
832
+ }
833
+
834
+ .actions-wrapper {
835
+ position: absolute;
836
+ top: 0;
837
+ left: 0;
838
+ right: 0;
839
+ bottom: 0;
840
+ display: flex;
841
+ flex-direction: column;
842
+ align-items: center;
843
+ justify-content: center;
844
+ }
845
+
846
+ .actions-cell .btn-action {
847
+ display: block;
848
+ margin: 0.1rem 0;
849
+ width: 28px;
850
+ height: 28px;
851
}
852
853
.btn-action {
857
margin: 0 0.1rem;
858
cursor: pointer;
859
border-radius: 6px;
763
- color: var(--color-secondary);
860
+ color: var(--color-text);
861
+ opacity: 0.7;
862
transition: all 0.2s ease;
863
display: inline-flex;
864
align-items: center;
868
}
869
870
.btn-action:hover {
773
- background: rgba(0, 0, 0, 0.05);
774
- border-color: rgba(0, 0, 0, 0.2);
775
- color: var(--color-text);
871
+ opacity: 1;
872
+ background: var(--color-panel);
873
+ border-color: var(--color-primary);
874
+ color: var(--color-primary);
875
transform: translateY(-1px);
876
}
877
878
.btn-action.view:hover {
780
- background: rgba(33, 150, 243, 0.1);
781
- border-color: #2196F3;
782
- color: #2196F3;
879
+ background: var(--color-panel);
880
+ border-color: var(--color-primary);
881
+ color: var(--color-primary);
882
}
883
884
.btn-action.copy:hover {
786
- background: rgba(76, 175, 80, 0.1);
787
- border-color: #4CAF50;
788
- color: #4CAF50;
885
+ background: var(--color-panel);
886
+ border-color: var(--color-primary);
887
+ color: var(--color-primary);
888
}
889
890
.btn-action.delete:hover {
792
- background: rgba(244, 67, 54, 0.1);
793
- border-color: #f44336;
794
- color: #f44336;
795
- }
796
-
797
- .pagination-controls-top {
798
- display: flex;
799
- justify-content: space-between;
800
- align-items: center;
801
- margin-bottom: 1rem;
802
- padding: 1rem;
891
background: var(--color-panel);
804
- border: 1px solid var(--color-border);
805
- border-radius: 8px;
892
+ border-color: var(--color-accent);
893
+ color: var(--color-accent);
894
}
895
896
+
897
+
898
.pagination-info-inline {
809
- color: var(--color-secondary);
899
+ color: var(--color-text);
900
+ opacity: 0.7;
901
font-size: 0.9rem;
902
}
903
904
.pagination-controls {
905
display: flex;
815
- justify-content: center;
906
align-items: center;
907
gap: 0.5rem;
818
- margin: 1rem 0;
819
- padding: 1rem;
820
- background: var(--color-panel);
821
- border: 1px solid var(--color-border);
822
- border-radius: 8px;
908
}
909
910
.page-select {
921
.page-select:focus {
922
outline: none;
923
border-color: var(--color-primary);
839
- box-shadow: 0 0 0 2px rgba(115, 122, 129, 0.1);
924
+ box-shadow: 0 0 0 2px rgba(115, 122, 129, 0.2);
925
+ background: var(--color-input-focus);
926
}
927
842
- .pagination-controls-top, .pagination-controls-bottom {
843
- display: flex;
844
- justify-content: space-between;
845
- align-items: center;
846
- padding: 1rem;
847
- background: var(--color-panel);
848
- border-bottom: 1px solid var(--color-border);
928
+ .light-mode .page-select:focus {
929
+ box-shadow: 0 0 0 2px rgba(56, 70, 83, 0.1);
930
}
931
851
- .pagination-controls-bottom {
852
- border-top: 1px solid var(--color-border);
853
- border-bottom: none;
854
- }
932
+
933
934
.export-section {
935
text-align: center;
1057
.timestamp-badge {
1058
background: var(--color-panel);
1059
border: 1px solid var(--color-border);
982
- color: var(--color-secondary);
1060
+ color: var(--color-text);
1061
+ opacity: 0.8;
1062
padding: 0.25rem 0.75rem;
1063
border-radius: 12px;
1064
font-size: 0.8rem;
1081
1082
.source-badge.conversation {
1083
background: rgba(101, 101, 101, 0.1);
1005
- color: var(--color-secondary);
1006
- border-color: var(--color-secondary);
1084
+ color: var(--color-text);
1085
+ opacity: 0.8;
1086
+ border-color: var(--color-border);
1087
}
1088
1089
.header-actions {
1269
padding: 0.5rem;
1270
}
1271
1192
- .dashboard-header {
1272
+ .stats-pagination-header {
1273
flex-direction: column;
1274
align-items: flex-start;
1275
gap: 1rem;
1276
}
1277
1198
- .memory-stats {
1278
+ .memory-stats-compact {
1279
width: 100%;
1280
justify-content: space-between;
1281
}
1282
1283
+ .pagination-controls-compact {
1284
+ align-self: stretch;
1285
+ justify-content: center;
1286
+ }
1287
+
1288
.filter-row {
1289
flex-direction: column;
1290
align-items: stretch;
1302
}
1303
1304
.actions-cell {
1220
- min-width: 120px;
1305
+ min-width: 60px;
1306
+ width: 60px;
1307
}
1308
1223
- .col-area { width: 15%; }
1224
- .col-timestamp { width: 15%; }
1225
- .col-source { width: 25%; }
1226
- .col-preview { width: 25%; }
1227
- .col-actions { width: 20%; }
1309
+ .col-select { width: 8%; }
1310
+ .col-metadata { width: 27%; }
1311
+ .col-preview { width: 55%; }
1312
+ .col-actions { width: 10%; }
1313
1314
.memory-detail-modal {
1315
width: 98%;
1343
padding: 1rem;
1344
}
1345
1261
- .pagination-controls-top {
1262
- flex-direction: column;
1263
- gap: 1rem;
1264
- align-items: stretch;
1265
- }
1346
1267
- .pagination-controls {
1268
- flex-wrap: wrap;
1269
- justify-content: center;
1270
- }
1347
1272
- .page-numbers {
1348
+ .pagination-controls {
1349
flex-wrap: wrap;
1274
- justify-content: center;
1350
}
1351
}
1352
1399
1400
.source-badge.conversation {
1401
background: rgba(101, 101, 101, 0.1);
1327
- color: var(--color-secondary);
1328
- border-color: var(--color-secondary);
1402
+ color: var(--color-text);
1403
+ opacity: 0.8;
1404
+ border-color: var(--color-border);
1405
}
1406
1407
.header-actions {
1499
1500
.metadata-group h5 {
1501
margin: 0 0 0.75rem 0;
1426
- color: var(--color-secondary);
1502
+ color: var(--color-text);
1503
+ opacity: 0.7;
1504
font-size: 0.9rem;
1505
font-weight: 600;
1506
text-transform: uppercase;
1521
.metadata-label {
1522
font-size: 0.8rem;
1523
font-weight: 600;
1447
- color: var(--color-secondary);
1524
+ color: var(--color-text);
1525
+ opacity: 0.7;
1526
text-transform: uppercase;
1527
letter-spacing: 0.3px;
1528
}
1606
1607
</template>
1608
</div>
1531
-</div>
1609
+</body>
1610
+</html>