10
<body>
11
<div x-data>
12
<template x-if="$store.memoryDashboardStore">
13
- <div x-create="$store.memoryDashboardStore.onOpen()"
14
- x-destroy="$store.memoryDashboardStore.cleanup()" class="memory-dashboard">
15
-
16
- <!-- Search and Filters -->
17
- <div class="filters-section">
18
- <div class="filter-row">
19
- <div class="filter-group">
20
- <label for="memory-subdir-select">Memory Directory:</label>
21
- <select id="memory-subdir-select" x-model="$store.memoryDashboardStore.selectedMemorySubdir"
22
- @change="$store.memoryDashboardStore.onMemorySubdirChange()"
23
- :disabled="$store.memoryDashboardStore.loadingSubdirs">
24
- <template x-for="subdir in $store.memoryDashboardStore.memorySubdirs" :key="subdir">
25
- <option :value="subdir" x-text="subdir"
26
- :selected="subdir === $store.memoryDashboardStore.selectedMemorySubdir">
27
- </option>
28
- </template>
29
- </select>
30
- <span x-show="$store.memoryDashboardStore.loadingSubdirs"
31
- class="loading-text">Loading...</span>
32
- </div>
13
+ <div x-create="$store.memoryDashboardStore.onOpen()" x-destroy="$store.memoryDashboardStore.cleanup()"
14
+ class="memory-dashboard">
15
+
16
+ <!-- Search and Filters Section -->
17
+ <div class="memory-filters-header">
18
+ <div class="filter-group-inline filter-memory-dir">
19
+ <label for="memory-subdir-select">Memory Directory</label>
20
+ <select id="memory-subdir-select" x-model="$store.memoryDashboardStore.selectedMemorySubdir"
21
+ @change="$store.memoryDashboardStore.onMemorySubdirChange()"
22
+ :disabled="$store.memoryDashboardStore.loadingSubdirs">
23
+ <template x-for="subdir in $store.memoryDashboardStore.memorySubdirs" :key="subdir">
24
+ <option :value="subdir" x-text="subdir"
25
+ :selected="subdir === $store.memoryDashboardStore.selectedMemorySubdir">
26
+ </option>
27
+ </template>
28
+ </select>
29
+ </div>
30
34
- <div class="filter-group">
35
- <label for="area-filter">Area:</label>
36
- <select id="area-filter" x-model="$store.memoryDashboardStore.areaFilter">
37
- <option value="">All Areas</option>
38
- <option value="main">Main</option>
39
- <option value="fragments">Fragments</option>
40
- <option value="solutions">Solutions</option>
41
- <option value="instruments">Instruments</option>
42
- </select>
43
- </div>
31
+ <div class="filter-group-inline filter-area">
32
+ <label for="area-filter">Area</label>
33
+ <select id="area-filter" x-model="$store.memoryDashboardStore.areaFilter">
34
+ <option value="">All Areas</option>
35
+ <option value="main">Main</option>
36
+ <option value="fragments">Fragments</option>
37
+ <option value="solutions">Solutions</option>
38
+ <option value="instruments">Instruments</option>
39
+ </select>
40
+ </div>
41
45
- <div class="filter-group">
46
- <label for="search-input">Search:</label>
47
- <input type="text" id="search-input" x-model="$store.memoryDashboardStore.searchQuery"
48
- placeholder="Search memory content..."
49
- @keyup.enter="$store.memoryDashboardStore.searchMemories()" />
50
- </div>
42
+ <div class="filter-group-inline filter-limit">
43
+ <label for="limit-input">Limit:</label>
44
+ <input type="number" id="limit-input" x-model.number="$store.memoryDashboardStore.limit"
45
+ min="10" max="1000" step="10" />
46
+ </div>
47
52
- <div class="filter-group">
53
- <label for="limit-input">Limit:</label>
54
- <input type="number" id="limit-input" x-model.number="$store.memoryDashboardStore.limit"
55
- min="10" max="1000" step="10" style="min-width: 100px;" />
56
- </div>
48
+ <div class="filter-threshold">
49
+ <label for="threshold-input">Threshold: <strong
50
+ x-text="$store.memoryDashboardStore.threshold.toFixed(2)"></strong></label>
51
+ <input type="range" id="threshold-input" x-model.number="$store.memoryDashboardStore.threshold"
52
+ min="0" max="1" step="0.01" />
53
+ </div>
54
58
- <div class="filter-group">
59
- <label for="threshold-input">Threshold: <span x-text="$store.memoryDashboardStore.threshold.toFixed(2)"></span></label>
60
- <input type="range" id="threshold-input" x-model.number="$store.memoryDashboardStore.threshold"
61
- min="0" max="1" step="0.01" style="min-width: 10em;" />
62
- </div>
55
+ <input type="text" id="search-input" x-model="$store.memoryDashboardStore.searchQuery"
56
+ placeholder="Search memory content..."
57
+ @keyup.enter="$store.memoryDashboardStore.searchMemories()" />
58
64
- <div class="filter-actions">
65
- <button class="btn primary slim" @click="$store.memoryDashboardStore.searchMemories()"
66
- :disabled="$store.memoryDashboardStore.loading || $store.memoryDashboardStore.loadingSubdirs">
67
- <span x-show="!$store.memoryDashboardStore.initializingMemory">Search</span>
68
- <span x-show="$store.memoryDashboardStore.initializingMemory">Initializing
69
- Memory...</span>
70
- </button>
71
- <button class="btn slim" @click="$store.memoryDashboardStore.clearSearch()">
72
- Clear
73
- </button>
74
- </div>
75
- </div>
59
+ <button class="btn btn-ok btn-search" @click="$store.memoryDashboardStore.searchMemories()"
60
+ :disabled="$store.memoryDashboardStore.loading || $store.memoryDashboardStore.loadingSubdirs">
61
+ <span x-show="!$store.memoryDashboardStore.initializingMemory">Search</span>
62
+ <span x-show="$store.memoryDashboardStore.initializingMemory">Init...</span>
63
+ </button>
64
+
65
+ <button class="btn btn-cancel btn-clear" @click="$store.memoryDashboardStore.clearSearch()">
66
+ Clear
67
+ </button>
68
</div>
69
70
<!-- Loading state -->
83
<div x-show="!$store.memoryDashboardStore.loading && !$store.memoryDashboardStore.error"
84
class="memory-table-container">
85
94
- <!-- Combined stats and pagination header -->
95
- <div class="stats-pagination-header" x-show="!$store.memoryDashboardStore.loading">
96
- <!-- Statistics -->
97
- <div class="memory-stats-compact">
98
- <div class="stat-item">
99
- <span class="stat-label">DB Total:</span>
100
- <span class="stat-value" x-text="$store.memoryDashboardStore.totalDbCount"></span>
101
- </div>
102
- <div class="stat-item">
103
- <span class="stat-label">Filtered:</span>
104
- <span class="stat-value" x-text="$store.memoryDashboardStore.totalCount"></span>
105
- </div>
106
- <div class="stat-item">
107
- <span class="stat-label">Knowledge:</span>
108
- <span class="stat-value" x-text="$store.memoryDashboardStore.knowledgeCount"></span>
109
- </div>
110
- <div class="stat-item">
111
- <span class="stat-label">Conversation:</span>
112
- <span class="stat-value" x-text="$store.memoryDashboardStore.conversationCount"></span>
113
- </div>
86
+ <!-- Status Bar -->
87
+ <div class="memory-status-bar" x-show="!$store.memoryDashboardStore.loading">
88
+ <div class="status-info">
89
+ <span class="status-item">
90
+ <span class="material-symbols-outlined">database</span>
91
+ Total: <strong x-text="$store.memoryDashboardStore.totalDbCount"></strong>
92
+ </span>
93
+ <span class="status-separator">•</span>
94
+ <span class="status-item">
95
+ Filtered: <strong x-text="$store.memoryDashboardStore.totalCount"></strong>
96
+ </span>
97
+ <span class="status-separator">•</span>
98
+ <span class="status-item">
99
+ Knowledge: <strong x-text="$store.memoryDashboardStore.knowledgeCount"></strong>
100
+ </span>
101
+ <span class="status-separator">•</span>
102
+ <span class="status-item">
103
+ Conversation: <strong x-text="$store.memoryDashboardStore.conversationCount"></strong>
104
+ </span>
105
</div>
106
116
- <!-- Pagination controls -->
117
- <div class="pagination-controls-compact" x-show="$store.memoryDashboardStore.totalPages > 1">
118
- <div class="pagination-info-inline">
119
- <span>Page <span x-text="$store.memoryDashboardStore.currentPage"></span>
120
- of <span x-text="$store.memoryDashboardStore.totalPages"></span>
121
- </span>
122
- </div>
123
-
124
- <div class="pagination-controls">
125
- <button class="btn slim" @click="$store.memoryDashboardStore.prevPage()"
126
- :disabled="$store.memoryDashboardStore.currentPage === 1">
127
- Previous
128
- </button>
129
-
130
- <select class="page-select" x-model.number="$store.memoryDashboardStore.currentPage"
131
- @change="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)">
132
- <template
133
- x-for="page in Array.from({length: $store.memoryDashboardStore.totalPages}, (_, i) => i + 1)"
134
- :key="page">
135
- <option :value="page" x-text="'Page ' + page"></option>
136
- </template>
137
- </select>
138
-
139
- <button class="btn slim" @click="$store.memoryDashboardStore.nextPage()"
140
- :disabled="$store.memoryDashboardStore.currentPage === $store.memoryDashboardStore.totalPages">
141
- Next
142
- </button>
107
+ <!-- Pagination -->
108
+ <div class="status-pagination" x-show="$store.memoryDashboardStore.totalPages > 1">
109
+ <button class="btn btn-icon" @click="$store.memoryDashboardStore.prevPage()"
110
+ :disabled="$store.memoryDashboardStore.currentPage === 1" title="Previous Page">
111
+ <span class="material-symbols-outlined">chevron_left</span>
112
+ </button>
113
+ <div class="page-input-group">
114
+ <label>Page</label>
115
+ <input type="number" class="page-input"
116
+ x-model.number="$store.memoryDashboardStore.currentPage"
117
+ @change="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)"
118
+ @keyup.enter="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)"
119
+ :min="1" :max="$store.memoryDashboardStore.totalPages" />
120
+ <span class="page-total">of <strong
121
+ x-text="$store.memoryDashboardStore.totalPages"></strong></span>
122
</div>
123
+ <button class="btn btn-icon" @click="$store.memoryDashboardStore.nextPage()"
124
+ :disabled="$store.memoryDashboardStore.currentPage === $store.memoryDashboardStore.totalPages"
125
+ title="Next Page">
126
+ <span class="material-symbols-outlined">chevron_right</span>
127
+ </button>
128
</div>
129
</div>
130
135
</div>
136
137
<div class="mass-actions">
154
- <button class="btn-mass copy" @click="$store.memoryDashboardStore.bulkCopyMemories()"
138
+ <button class="btn btn-mass copy" @click="$store.memoryDashboardStore.bulkCopyMemories()"
139
title="Copy Selected Content">
156
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
157
- stroke-width="2">
158
- <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
159
- <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
160
- </svg>
140
+ <span class="material-symbols-outlined">content_copy</span>
141
Copy
142
</button>
143
164
- <button class="btn-mass export" @click="$store.memoryDashboardStore.bulkExportMemories()"
144
+ <button class="btn btn-mass export"
145
+ @click="$store.memoryDashboardStore.bulkExportMemories()"
146
title="Export Selected Memories">
166
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
167
- stroke-width="2">
168
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
169
- <polyline points="7,10 12,15 17,10"></polyline>
170
- <line x1="12" y1="15" x2="12" y2="3"></line>
171
- </svg>
147
+ <span class="material-symbols-outlined">download</span>
148
Export
149
</button>
150
175
- <button class="btn-mass delete" @click="$store.memoryDashboardStore.bulkDeleteMemories()"
151
+ <button class="btn btn-mass delete"
152
+ @click="$store.memoryDashboardStore.bulkDeleteMemories()"
153
title="Delete Selected Memories">
177
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
178
- stroke-width="2">
179
- <polyline points="3,6 5,6 21,6"></polyline>
180
- <path
181
- d="M19,6V20a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V6m3,0V4a2,2,0,0,1,2-2h4a2,2,0,0,1,2,2V6">
182
- </path>
183
- <line x1="10" y1="11" x2="10" y2="17"></line>
184
- <line x1="14" y1="11" x2="14" y2="17"></line>
185
- </svg>
154
+ <span class="material-symbols-outlined">delete</span>
155
Delete
156
</button>
157
189
- <button class="btn-mass clear" @click="$store.memoryDashboardStore.clearSelection()"
158
+ <button class="btn btn-mass clear" @click="$store.memoryDashboardStore.clearSelection()"
159
title="Clear Selection">
191
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
192
- stroke-width="2">
193
- <line x1="18" y1="6" x2="6" y2="18"></line>
194
- <line x1="6" y1="6" x2="18" y2="18"></line>
195
- </svg>
160
+ <span class="material-symbols-outlined">close</span>
161
Clear
162
</button>
163
</div>
185
@click="$store.memoryDashboardStore.showMemoryDetails(memory)"
186
style="cursor: pointer;">
187
<!-- Selection checkbox -->
223
- <td class="select-cell" @click.stop>
188
+ <td class="select-cell" @click.stop="memory.selected = !memory.selected">
189
<input type="checkbox" x-model="memory.selected" />
190
</td>
191
197
:style="`background-color: ${$store.memoryDashboardStore.getAreaColor(memory.area)}`"
198
x-text="(memory.area || 'UNKNOWN').toUpperCase()"></span>
199
</div>
235
- <div class="metadata-row metadata-timestamp">
236
- <span
237
- x-text="$store.memoryDashboardStore.formatTimestamp(memory.timestamp, true)"
238
- :title="$store.memoryDashboardStore.formatTimestamp(memory.timestamp, false)"></span>
239
- </div>
200
<div class="metadata-row">
201
<template x-if="memory.knowledge_source">
202
<span class="source-type knowledge">Knowledge</span>
205
<span class="source-type conversation">Conversation</span>
206
</template>
207
</div>
208
+ <div class="metadata-row metadata-timestamp">
209
+ <span
210
+ x-text="$store.memoryDashboardStore.formatTimestamp(memory.timestamp, true)"
211
+ :title="$store.memoryDashboardStore.formatTimestamp(memory.timestamp, false)"></span>
212
+ </div>
213
+
214
</div>
215
</td>
216
217
<!-- Content preview -->
218
<td class="preview-cell">
253
- <div class="content-preview" x-text="memory.content_preview"></div>
219
+ <div class="content-preview"
220
+ x-text="memory.content_full.substring(0, 200) + (memory.content_full.length > 200 ? '...' : '')">
221
+ </div>
222
<div class="tags" x-show="memory.tags && memory.tags.length > 0">
223
<template x-for="tag in memory.tags" :key="tag">
224
<span class="tag" x-text="tag"></span>
229
<!-- Actions -->
230
<td class="actions-cell" @click.stop>
231
<div class="actions-wrapper">
264
- <button class="btn-action copy"
232
+ <button class="btn btn-action copy"
233
@click="$store.memoryDashboardStore.copyToClipboard($store.memoryDashboardStore.formatMemoryForCopy(memory))"
234
title="Copy Memory">
267
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none"
268
- stroke="currentColor" stroke-width="2">
269
- <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
270
- <path
271
- d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">
272
- </path>
273
- </svg>
235
+ <span class="material-symbols-outlined">content_copy</span>
236
</button>
237
276
- <button class="btn-action delete"
238
+ <button class="btn btn-action delete"
239
@click="$store.memoryDashboardStore.deleteMemory(memory)"
240
title="Delete Memory">
279
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none"
280
- stroke="currentColor" stroke-width="2">
281
- <polyline points="3,6 5,6 21,6"></polyline>
282
- <path
283
- 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">
284
- </path>
285
- <line x1="10" y1="11" x2="10" y2="17"></line>
286
- <line x1="14" y1="11" x2="14" y2="17"></line>
287
- </svg>
241
+ <span class="material-symbols-outlined">delete</span>
242
</button>
243
</div>
244
</td>
251
252
</div>
253
254
+ <!-- Mass action toolbar -->
255
+ <div x-show="$store.memoryDashboardStore.selectedCount > 0" class="mass-action-toolbar">
256
+ <div class="selection-info">
257
+ <span x-text="$store.memoryDashboardStore.selectedCount"></span> memories selected
258
+ </div>
259
+
260
+ <div class="mass-actions">
261
+ <button class="btn btn-mass copy" @click="$store.memoryDashboardStore.bulkCopyMemories()"
262
+ title="Copy Selected Content">
263
+ <span class="material-symbols-outlined">content_copy</span>
264
+ Copy
265
+ </button>
266
+
267
+ <button class="btn btn-mass export"
268
+ @click="$store.memoryDashboardStore.bulkExportMemories()"
269
+ title="Export Selected Memories">
270
+ <span class="material-symbols-outlined">download</span>
271
+ Export
272
+ </button>
273
+
274
+ <button class="btn btn-mass delete"
275
+ @click="$store.memoryDashboardStore.bulkDeleteMemories()"
276
+ title="Delete Selected Memories">
277
+ <span class="material-symbols-outlined">delete</span>
278
+ Delete
279
+ </button>
280
+
281
+ <button class="btn btn-mass clear" @click="$store.memoryDashboardStore.clearSelection()"
282
+ title="Clear Selection">
283
+ <span class="material-symbols-outlined">close</span>
284
+ Clear
285
+ </button>
286
+ </div>
287
+ </div>
288
+
289
+
290
+ <!-- Status Bar -->
291
+ <div class="memory-status-bar" x-show="!$store.memoryDashboardStore.loading">
292
+ <div class="status-info">
293
+ <span class="status-item">
294
+ <span class="material-symbols-outlined">database</span>
295
+ Total: <strong x-text="$store.memoryDashboardStore.totalDbCount"></strong>
296
+ </span>
297
+ <span class="status-separator">•</span>
298
+ <span class="status-item">
299
+ Filtered: <strong x-text="$store.memoryDashboardStore.totalCount"></strong>
300
+ </span>
301
+ <span class="status-separator">•</span>
302
+ <span class="status-item">
303
+ Knowledge: <strong x-text="$store.memoryDashboardStore.knowledgeCount"></strong>
304
+ </span>
305
+ <span class="status-separator">•</span>
306
+ <span class="status-item">
307
+ Conversation: <strong x-text="$store.memoryDashboardStore.conversationCount"></strong>
308
+ </span>
309
+ </div>
310
+
311
+ <!-- Pagination -->
312
+ <div class="status-pagination" x-show="$store.memoryDashboardStore.totalPages > 1">
313
+ <button class="btn btn-icon" @click="$store.memoryDashboardStore.prevPage()"
314
+ :disabled="$store.memoryDashboardStore.currentPage === 1" title="Previous Page">
315
+ <span class="material-symbols-outlined">chevron_left</span>
316
+ </button>
317
+ <div class="page-input-group">
318
+ <label>Page</label>
319
+ <input type="number" class="page-input"
320
+ x-model.number="$store.memoryDashboardStore.currentPage"
321
+ @change="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)"
322
+ @keyup.enter="$store.memoryDashboardStore.goToPage($store.memoryDashboardStore.currentPage)"
323
+ :min="1" :max="$store.memoryDashboardStore.totalPages" />
324
+ <span class="page-total">of <strong
325
+ x-text="$store.memoryDashboardStore.totalPages"></strong></span>
326
+ </div>
327
+ <button class="btn btn-icon" @click="$store.memoryDashboardStore.nextPage()"
328
+ :disabled="$store.memoryDashboardStore.currentPage === $store.memoryDashboardStore.totalPages"
329
+ title="Next Page">
330
+ <span class="material-symbols-outlined">chevron_right</span>
331
+ </button>
332
+ </div>
333
+ </div>
334
+
335
+
336
<!-- No memories message -->
337
<div x-show="$store.memoryDashboardStore.memories.length === 0 && !$store.memoryDashboardStore.message"
338
class="no-memories">
346
347
348
313
- <!-- Export button -->
314
- <div class="export-section">
315
- <button class="btn slim" @click="$store.memoryDashboardStore.exportMemories()">
316
- Export Memories (JSON)
317
- </button>
318
- </div>
349
</div>
350
351
355
</div>
356
357
<style>
328
- [x-cloak] {
329
- display: none !important;
358
+ .modal-inner.modal-with-footer {
359
+ display: flex;
360
+ flex-direction: column;
361
}
362
332
- .memory-dashboard {
333
- padding: 1rem;
334
- max-width: 100%;
335
- background: var(--color-background);
336
- color: var(--color-text);
363
+ .modal-inner.modal-with-footer .modal-scroll {
364
+ flex: 1;
365
+ min-height: 0;
366
}
367
339
- .memory-dashboard h3 {
340
- color: var(--color-text);
341
- margin: 0;
342
- font-size: 1.5rem;
343
- font-weight: 600;
368
+ .modal-inner.modal-with-footer .modal-footer {
369
+ flex-shrink: 0;
370
}
371
346
-
347
-
348
- .stats-pagination-header {
349
- display: flex;
350
- justify-content: space-between;
372
+ .memory-filters-header {
373
+ display: grid;
374
+ grid-template-columns: 35% 25% 10% auto;
375
+ grid-template-rows: auto auto;
376
+ gap: 0.75rem;
377
align-items: center;
378
+ margin: 1rem 0;
379
padding: 1rem;
380
background: var(--color-panel);
381
border: 1px solid var(--color-border);
382
border-radius: 8px;
356
- border-bottom: none;
357
- border-bottom-left-radius: 0;
358
- border-bottom-right-radius: 0;
383
}
384
361
- .memory-stats-compact {
362
- display: flex;
363
- gap: 1rem;
364
- flex-wrap: wrap;
385
+ /* Grid positioning for desktop - 2 rows */
386
+ .filter-memory-dir {
387
+ grid-column: 1;
388
+ grid-row: 1;
389
}
390
367
- .pagination-controls-compact {
368
- display: flex;
369
- align-items: center;
370
- gap: 1rem;
391
+ .filter-area {
392
+ grid-column: 2;
393
+ grid-row: 1;
394
+ }
395
+
396
+ .filter-limit {
397
+ grid-column: 3;
398
+ grid-row: 1;
399
}
400
373
- .stat-item {
401
+ .filter-threshold {
402
+ grid-column: 4;
403
+ grid-row: 2;
404
+ }
405
+
406
+ #search-input {
407
+ grid-column: 1 / 3;
408
+ grid-row: 2;
409
+ }
410
+
411
+ .btn-search {
412
+ grid-column: 3;
413
+ grid-row: 2;
414
+ justify-content: center;
415
+ }
416
+
417
+ .btn-clear {
418
+ grid-column: 4;
419
+ grid-row: 1;
420
+ justify-self: end;
421
+ }
422
+
423
+ .filter-group-inline {
424
display: flex;
375
- flex-direction: column;
425
+ flex: 1;
426
align-items: center;
377
- padding: 0.5rem;
378
- background: var(--color-panel);
379
- border: 1px solid var(--color-border);
380
- border-radius: 8px;
381
- min-width: 80px;
427
+ gap: 0.5rem;
428
}
429
384
- .stat-label {
385
- font-size: 0.8rem;
430
+ .filter-group-inline label {
431
+ font-size: 0.85rem;
432
+ font-weight: 600;
433
color: var(--color-text);
387
- opacity: 0.7;
388
- margin-bottom: 0.25rem;
434
+ opacity: 0.8;
435
+ white-space: nowrap;
436
}
437
391
- .light-mode .stat-label {
392
- opacity: 0.8;
438
+ .filter-group-inline select,
439
+ .filter-group-inline input {
440
+ border: 1px solid var(--color-border);
441
+ flex: 0 auto;
442
+ min-width: 0;
443
}
444
395
- .stat-value {
396
- font-size: 1.1rem;
397
- font-weight: bold;
398
- color: var(--color-primary);
445
+ .filter-group-inline select:focus,
446
+ .filter-group-inline input:focus {
447
+ outline: none;
448
+ border-color: var(--color-primary);
449
+ background: var(--color-input-focus);
450
}
451
401
- .filters-section {
402
- margin-bottom: 1.5rem;
403
- padding: 1rem;
404
- background: var(--color-panel);
452
+ .filter-group-inline.filter-limit {
453
+ flex: 0 0 auto;
454
+ }
455
+
456
+ .filter-limit input {
457
+ flex: 0 0 150%;
458
+ }
459
+
460
+
461
+ #search-input {
462
+ flex: 1;
463
border: 1px solid var(--color-border);
464
+ font-size: 0.9rem;
465
+ height: 38px;
466
+ }
467
+
468
+ #search-input:focus {
469
+ outline: none;
470
+ border-color: var(--color-primary);
471
+ background: var(--color-input-focus);
472
+ }
473
+
474
+ .filter-threshold label {
475
+ font-size: 0.85rem;
476
+ opacity: 0.8;
477
+ }
478
+
479
+ .memory-status-bar {
480
+ display: flex;
481
+ justify-content: space-between;
482
+ align-items: center;
483
+ padding: 0.75rem 1rem;
484
+ background: var(--color-panel);
485
+ border-bottom: 1px solid var(--color-border);
486
border-radius: 8px;
487
+ /* margin-bottom: 1rem; */
488
+ font-size: 0.9rem;
489
}
490
409
- .filter-row {
491
+ .status-info {
492
display: flex;
411
- gap: 1rem;
412
- align-items: end;
493
+ align-items: center;
494
+ gap: 0.5rem;
495
flex-wrap: wrap;
496
}
497
416
- .filter-group {
498
+ .status-item {
499
display: flex;
418
- flex-direction: column;
500
+ align-items: center;
501
gap: 0.25rem;
502
}
503
422
- .filter-group label {
423
- font-size: 0.9rem;
424
- font-weight: 500;
425
- color: var(--color-text);
504
+ .status-item strong {
505
+ color: var(--color-primary);
506
+ font-weight: 600;
507
+ }
508
+
509
+ .status-item .material-symbols-outlined {
510
+ font-size: 18px;
511
+ opacity: 0.6;
512
}
513
428
- .filter-group input,
429
- .filter-group select {
430
- padding: 0.5rem;
514
+ .status-separator {
515
+ color: var(--color-border);
516
+ margin: 0 0.25rem;
517
+ }
518
+
519
+ .status-pagination {
520
+ display: flex;
521
+ align-items: center;
522
+ gap: 0.5rem;
523
+ }
524
+
525
+ .btn-icon {
526
+ background: transparent;
527
border: 1px solid var(--color-border);
432
- background: var(--color-background);
528
color: var(--color-text);
434
- border-radius: 6px;
435
- font-size: 0.9rem;
436
- min-width: 200px;
437
- height: 40px;
438
- box-sizing: border-box;
529
+ padding: 0.25rem;
530
+ display: flex;
531
+ align-items: center;
532
+ font-size: 0;
533
}
534
441
- .filter-group input:focus,
442
- .filter-group select:focus {
443
- outline: none;
535
+ .btn-icon:hover:not(:disabled) {
536
+ background: var(--color-panel);
537
border-color: var(--color-primary);
445
- box-shadow: 0 0 0 2px rgba(115, 122, 129, 0.2);
446
- background: var(--color-input-focus);
538
+ color: var(--color-text);
539
}
540
449
- .light-mode .filter-group input:focus,
450
- .light-mode .filter-group select:focus {
451
- box-shadow: 0 0 0 2px rgba(56, 70, 83, 0.1);
541
+ .btn-icon:disabled {
542
+ opacity: 0.4;
543
+ cursor: not-allowed;
544
}
545
454
- .filter-actions {
455
- display: flex;
456
- gap: 0.5rem;
457
- align-items: stretch;
546
+ .btn-icon .material-symbols-outlined {
547
+ font-size: 20px;
548
}
549
460
- .filter-actions .btn {
461
- height: 40px;
550
+ .page-input-group {
551
display: flex;
552
align-items: center;
464
- justify-content: center;
553
+ gap: 0.5rem;
554
+ }
555
+
556
+ .page-input-group label {
557
+ opacity: 0.8;
558
}
559
467
- .loading-text {
560
+ .page-total {
561
+ color: var(--color-text);
562
+ opacity: 0.8;
563
font-size: 0.85rem;
564
+ white-space: nowrap;
565
+ }
566
+
567
+ .page-total strong {
568
+ color: var(--color-primary);
569
+ font-weight: 600;
570
+ }
571
+
572
+ .page-input {
573
+ width: 60px;
574
+ padding: 0.25rem 0.5rem;
575
+ text-align: center;
576
+ border: 1px solid var(--color-border);
577
+ background: var(--color-input);
578
color: var(--color-text);
470
- opacity: 0.7;
471
- font-style: italic;
579
+ border-radius: 4px;
580
+ font-size: 0.85rem;
581
+ height: 28px;
582
+ }
583
+
584
+ .page-input:focus {
585
+ outline: none;
586
+ border-color: var(--color-primary);
587
+ background: var(--color-input-focus);
588
+ }
589
+
590
+ /* Remove spinner arrows */
591
+ .page-input::-webkit-inner-spin-button,
592
+ .page-input::-webkit-outer-spin-button {
593
+ -webkit-appearance: none;
594
+ margin: 0;
595
+ }
596
+
597
+ .page-input[type=number] {
598
+ -moz-appearance: textfield;
599
+ appearance: textfield;
600
}
601
602
.loading-state,
613
margin: 1rem 0;
614
}
615
616
+ .loading-state {
617
+ display: grid;
618
+ align-items: center;
619
+ }
620
+
621
.init-message {
622
color: var(--color-primary);
490
- background: rgba(115, 122, 129, 0.2);
623
border-color: var(--color-primary);
624
}
625
494
- .light-mode .init-message {
495
- background: rgba(56, 70, 83, 0.1);
496
- }
497
-
626
.error-state {
627
color: var(--color-accent);
500
- background: rgba(207, 102, 121, 0.2);
628
border-color: var(--color-accent);
629
}
630
504
- .light-mode .error-state {
505
- background: rgba(176, 0, 32, 0.1);
506
- }
507
-
631
.loading-spinner {
632
width: 24px;
633
height: 24px;
654
}
655
656
.memory-table-container {
534
- background: var(--color-background);
657
border: 1px solid var(--color-border);
658
border-radius: 8px;
537
- overflow: hidden;
538
- margin-bottom: 1rem;
539
- }
540
-
541
- .table-wrapper {
542
- width: 100%;
543
- overflow-x: auto;
659
}
660
661
.memory-table {
664
table-layout: fixed;
665
}
666
552
- /* Fixed column widths for proper fit */
667
.col-select {
668
width: 5%;
669
}
670
671
.col-metadata {
558
- width: 25%;
672
+ width: 10em;
673
}
674
561
- .col-preview {
562
- width: 60%;
563
- }
675
+ .col-preview {}
676
677
.col-actions {
566
- width: 10%;
678
+ width: 4em;
679
}
680
681
.memory-table th,
687
overflow: hidden;
688
}
689
578
- /* Metadata cell styling */
690
.metadata-cell {
691
overflow: visible;
692
white-space: normal;
711
font-family: monospace;
712
}
713
603
- .source-type {
604
- font-size: 0.8rem;
605
- color: var(--color-text);
606
- font-weight: 500;
714
+ .area-badge {
715
+ color: white;
716
+ padding: 0.35rem 0.75rem;
717
+ border-radius: 16px;
718
+ font-size: 0.75rem;
719
+ font-weight: bold;
720
+ text-transform: uppercase;
721
}
722
609
- /* Selection column styling */
723
.select-cell,
724
.col-select {
725
text-align: center;
613
- padding: 0.5rem !important;
726
+ padding: 0.65rem 0.5rem !important;
727
}
728
729
.select-cell input[type="checkbox"],
732
transform: scale(1.2);
733
}
734
622
- /* Selected row styling */
735
.memory-row.selected {
624
- background: rgba(115, 122, 129, 0.2);
736
+ background: var(--color-panel);
737
border-left: 3px solid var(--color-primary);
738
}
739
628
- .light-mode .memory-row.selected {
629
- background: rgba(56, 70, 83, 0.1);
630
- }
631
-
632
- /* Mass action toolbar */
740
.mass-action-toolbar {
741
display: flex;
742
justify-content: space-between;
743
align-items: center;
744
padding: 1rem;
638
- background: rgba(115, 122, 129, 0.2);
639
- border: 1px solid var(--color-primary);
640
- border-radius: 8px;
641
- margin: 1rem 0;
745
+ background: var(--color-panel);
746
+ /* border: 1px solid var(--color-primary); */
747
+ /* border-radius: 8px; */
748
+ /* margin: 1rem 0; */
749
+ margin: 0;
750
animation: slideDown 0.3s ease;
751
}
752
645
- .light-mode .mass-action-toolbar {
646
- background: rgba(56, 70, 83, 0.1);
647
- }
648
-
649
- .selection-info {
650
- font-weight: 600;
651
- color: var(--color-primary);
652
- }
653
-
654
- .mass-actions {
655
- display: flex;
656
- gap: 0.5rem;
657
- }
658
-
753
.btn-mass {
660
- display: flex;
754
align-items: center;
662
- gap: 0.5rem;
663
- padding: 0.5rem 1rem;
755
border: 1px solid var(--color-border);
756
+ gap: 0.25rem;
757
+ display: flex;
758
background: var(--color-background);
759
color: var(--color-text);
667
- border-radius: 6px;
668
- cursor: pointer;
669
- font-size: 0.9rem;
670
- font-weight: 500;
671
- transition: all 0.2s ease;
760
}
761
762
.btn-mass:hover {
763
border-color: var(--color-primary);
676
- background: var(--color-panel);
764
+ color: var(--color-primary);
765
}
766
679
- .btn-mass.copy:hover {
680
- border-color: var(--color-primary);
681
- color: var(--color-primary);
767
+ .btn-mass.delete:hover {
768
+ border-color: var(--color-accent);
769
+ color: var(--color-accent);
770
+ }
771
+
772
+ .selection-info {
773
+ font-weight: 600;
774
+ }
775
+
776
+ .mass-actions {
777
+ display: flex;
778
+ gap: 0.5rem;
779
}
780
684
- .btn-mass.export:hover {
781
+ .btn-mass .material-symbols-outlined {
782
+ font-size: 18px;
783
+ }
784
+
785
+ .btn-mass:hover {
786
border-color: var(--color-primary);
686
- color: var(--color-primary);
787
+ background: var(--color-panel);
788
}
789
790
.btn-mass.delete:hover {
792
color: var(--color-accent);
793
}
794
694
- .btn-mass.clear:hover {
695
- border-color: var(--color-primary);
696
- color: var(--color-primary);
697
- }
698
-
795
@keyframes slideDown {
796
from {
797
opacity: 0;
816
817
.memory-table tbody tr {
818
border-bottom: 1px solid var(--color-border);
723
- transition: background-color 0.2s ease;
724
- }
725
-
726
- .memory-table tbody tr:nth-child(even) {
727
- background: var(--color-panel);
728
- }
729
-
730
- .memory-table tbody tr:hover {
731
- background: var(--color-panel);
819
}
820
821
.memory-table tbody tr:last-child {
822
border-bottom: none;
823
}
824
738
- .area-badge {
739
- padding: 0.25rem 0.5rem;
740
- border-radius: 12px;
741
- color: white;
742
- font-size: 0.75rem;
743
- font-weight: bold;
744
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
745
- border: 1px solid rgba(255, 255, 255, 0.1);
746
- }
747
-
748
- .light-mode .area-badge {
749
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
750
- border: 1px solid rgba(0, 0, 0, 0.1);
751
- }
752
-
753
- .timestamp-cell {
754
- font-size: 0.85rem;
755
- color: var(--color-text);
756
- opacity: 0.7;
757
- white-space: normal;
758
- word-break: break-word;
759
- font-family: monospace;
760
- line-height: 1.2;
761
- }
762
-
763
- .source-info {
764
- display: flex;
765
- flex-direction: column;
766
- gap: 0.25rem;
767
- align-items: flex-start;
825
+ .memory-table tbody tr.memory-row>td {
826
+ height: 5em;
827
}
828
829
.source-type {
830
padding: 0.25rem 0.5rem;
772
- border-radius: 6px;
831
+ border-radius: var(--border-radius);
832
font-size: 0.75rem;
833
font-weight: 500;
834
text-align: center;
837
flex-shrink: 0;
838
}
839
781
- .source-type.knowledge {
782
- background: rgba(115, 122, 129, 0.2);
783
- color: var(--color-primary);
784
- border-color: var(--color-primary);
785
- }
786
-
787
- .light-mode .source-type.knowledge {
788
- background: rgba(56, 70, 83, 0.1);
789
- color: var(--color-primary);
790
- }
791
-
792
- .source-type.conversation {
793
- background: rgba(101, 101, 101, 0.2);
794
- color: var(--color-text);
795
- opacity: 0.8;
796
- border-color: var(--color-border);
797
- }
798
-
799
- .light-mode .source-type.conversation {
800
- background: rgba(232, 234, 246, 0.5);
801
- color: var(--color-text);
802
- opacity: 0.9;
803
- }
804
-
805
- .source-file {
806
- font-size: 0.7rem;
807
- color: var(--color-text);
808
- opacity: 0.7;
809
- font-family: monospace;
810
- background: var(--color-panel);
811
- padding: 0.2rem 0.4rem;
812
- border-radius: 4px;
813
- border: 1px solid var(--color-border);
814
- word-break: break-all;
815
- white-space: normal;
816
- max-width: 100%;
817
- overflow-wrap: break-word;
818
- }
819
-
820
- .content-preview {
821
- line-height: 1.4;
822
- font-size: 0.9rem;
823
- color: var(--color-text);
840
+ .content-preview,
841
+ .metadata-info {
842
+ height: 5.5em;
843
+ overflow: hidden;
844
word-wrap: break-word;
845
overflow-wrap: break-word;
826
- max-width: 100%;
827
- overflow: hidden;
828
- text-overflow: ellipsis;
846
}
847
848
.tags {
863
}
864
865
.actions-cell {
849
- min-width: 60px;
850
- width: 60px;
866
padding: 0 !important;
852
- height: 60px;
867
position: relative;
868
}
869
879
justify-content: center;
880
}
881
868
- .actions-cell .btn-action {
869
- display: block;
870
- margin: 0.1rem 0;
871
- width: 28px;
872
- height: 28px;
873
- }
874
-
882
+ /* Table action buttons - extends .btn */
883
.btn-action {
884
background: none;
885
border: 1px solid var(--color-border);
878
- padding: 0.3rem;
886
+ padding: 0.25rem;
887
margin: 0 0.1rem;
880
- cursor: pointer;
881
- border-radius: 6px;
888
color: var(--color-text);
889
opacity: 0.7;
884
- transition: all 0.2s ease;
890
display: inline-flex;
886
- align-items: center;
887
- justify-content: center;
888
- min-width: 32px;
889
- height: 32px;
891
+ }
892
+
893
+ .btn-action .material-symbols-outlined {
894
+ font-size: 18px;
895
}
896
897
.btn-action:hover {
920
color: var(--color-accent);
921
}
922
918
-
919
-
920
- .pagination-info-inline {
921
- color: var(--color-text);
922
- opacity: 0.7;
923
- font-size: 0.9rem;
924
- }
925
-
926
- .pagination-controls {
927
- display: flex;
928
- align-items: center;
929
- gap: 0.5rem;
930
- }
931
-
932
- .page-select {
933
- background: var(--color-background);
934
- border: 1px solid var(--color-border);
935
- color: var(--color-text);
936
- padding: 0.5rem 0.75rem;
937
- border-radius: 6px;
938
- font-size: 0.9rem;
939
- cursor: pointer;
940
- min-width: 120px;
941
- }
942
-
943
- .page-select:focus {
944
- outline: none;
945
- border-color: var(--color-primary);
946
- box-shadow: 0 0 0 2px rgba(115, 122, 129, 0.2);
947
- background: var(--color-input-focus);
948
- }
949
-
950
- .light-mode .page-select:focus {
951
- box-shadow: 0 0 0 2px rgba(56, 70, 83, 0.1);
952
- }
953
-
954
-
955
-
956
- .export-section {
957
- text-align: center;
958
- margin-top: 1rem;
959
- padding: 1rem;
960
- background: var(--color-panel);
961
- border: 1px solid var(--color-border);
962
- border-radius: 8px;
963
- border-top: 1px solid var(--color-border);
964
- }
965
-
966
- /* Enhanced Modal Styles */
967
- .modal-overlay {
968
- position: fixed;
969
- top: 0;
970
- left: 0;
971
- right: 0;
972
- bottom: 0;
973
- background: rgba(0, 0, 0, 0.6);
974
- backdrop-filter: blur(4px);
975
- display: flex;
976
- align-items: flex-start;
977
- justify-content: center;
978
- z-index: 1000;
979
- overflow-y: auto;
980
- padding: 2rem 0;
981
- }
982
-
983
- .modal-enter {
984
- transition: all 0.3s ease;
985
- }
986
-
987
- .modal-enter-start {
988
- opacity: 0;
989
- }
990
-
991
- .modal-enter-end {
992
- opacity: 1;
993
- }
994
-
995
- .modal-leave {
996
- transition: all 0.2s ease;
997
- }
998
-
999
- .modal-leave-start {
1000
- opacity: 1;
1001
- }
1002
-
1003
- .modal-leave-end {
1004
- opacity: 0;
1005
- }
1006
-
1007
- .memory-detail-modal {
1008
- background: var(--color-background);
1009
- border: 1px solid var(--color-border);
1010
- border-radius: 16px;
1011
- width: 95%;
1012
- max-width: 1200px;
1013
- max-height: 90vh;
1014
- min-height: 60vh;
1015
- overflow: hidden;
1016
- display: flex;
1017
- flex-direction: column;
1018
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
1019
- animation: modalSlideIn 0.3s ease-out;
1020
- margin: 0 auto;
1021
- }
1022
-
1023
- @keyframes modalSlideIn {
1024
- from {
1025
- transform: translateY(20px) scale(0.95);
1026
- opacity: 0;
923
+ /* Responsive design */
924
+ @media (max-width: 870px) {
925
+ .memory-dashboard {
926
+ padding: 0.5rem;
927
}
928
1029
- to {
1030
- transform: translateY(0) scale(1);
1031
- opacity: 1;
929
+ .memory-filters-header {
930
+ padding: 0.75rem;
931
}
1033
- }
1034
-
1035
- .modal-header-enhanced {
1036
- background: var(--color-panel);
1037
- padding: 1.5rem 2rem;
1038
- border-bottom: 2px solid var(--color-border);
1039
- display: flex;
1040
- justify-content: space-between;
1041
- align-items: flex-start;
1042
- }
1043
-
1044
- .header-left {
1045
- flex: 1;
1046
- }
1047
-
1048
- .memory-title {
1049
- display: flex;
1050
- align-items: center;
1051
- gap: 1rem;
1052
- margin-bottom: 0.75rem;
1053
- }
1054
-
1055
- .memory-title h3 {
1056
- margin: 0;
1057
- font-size: 1.5rem;
1058
- font-weight: 600;
1059
- color: var(--color-text);
1060
- }
1061
-
1062
- .area-badge-large {
1063
- padding: 0.5rem 1rem;
1064
- border-radius: 20px;
1065
- color: white;
1066
- font-size: 0.75rem;
1067
- font-weight: 700;
1068
- text-transform: uppercase;
1069
- letter-spacing: 0.5px;
1070
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1071
- }
1072
-
1073
- .memory-meta-quick {
1074
- display: flex;
1075
- gap: 0.75rem;
1076
- align-items: center;
1077
- flex-wrap: wrap;
1078
- }
1079
-
1080
- .timestamp-badge {
1081
- background: var(--color-panel);
1082
- border: 1px solid var(--color-border);
1083
- color: var(--color-text);
1084
- opacity: 0.8;
1085
- padding: 0.25rem 0.75rem;
1086
- border-radius: 12px;
1087
- font-size: 0.8rem;
1088
- font-weight: 500;
1089
- }
1090
-
1091
- .source-badge {
1092
- padding: 0.25rem 0.75rem;
1093
- border-radius: 12px;
1094
- font-size: 0.8rem;
1095
- font-weight: 500;
1096
- border: 1px solid;
1097
- }
1098
-
1099
- .source-badge.knowledge {
1100
- background: rgba(115, 122, 129, 0.1);
1101
- color: var(--color-primary);
1102
- border-color: var(--color-primary);
1103
- }
1104
-
1105
- .source-badge.conversation {
1106
- background: rgba(101, 101, 101, 0.1);
1107
- color: var(--color-text);
1108
- opacity: 0.8;
1109
- border-color: var(--color-border);
1110
- }
1111
-
1112
- .header-actions {
1113
- display: flex;
1114
- gap: 0.5rem;
1115
- align-items: flex-start;
1116
- }
1117
-
1118
- .btn-action-header {
1119
- background: var(--color-background);
1120
- border: 1px solid var(--color-border);
1121
- padding: 0.75rem;
1122
- border-radius: 12px;
1123
- cursor: pointer;
1124
- color: var(--color-secondary);
1125
- transition: all 0.2s ease;
1126
- display: flex;
1127
- align-items: center;
1128
- justify-content: center;
1129
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
1130
- }
1131
-
1132
- .btn-action-header:hover {
1133
- background: rgba(255, 255, 255, 0.1);
1134
- border-color: var(--color-primary);
1135
- transform: translateY(-1px);
1136
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1137
- }
1138
-
1139
- .btn-action-header.copy:hover {
1140
- background: rgba(76, 175, 80, 0.05);
1141
- border-color: #4CAF50;
1142
- color: #4CAF50;
1143
- }
1144
-
1145
- .btn-action-header.delete:hover {
1146
- background: rgba(244, 67, 54, 0.05);
1147
- border-color: #f44336;
1148
- color: #f44336;
1149
- }
1150
-
1151
- .btn-close-enhanced {
1152
- background: rgba(207, 102, 121, 0.1);
1153
- border: 1px solid var(--color-accent);
1154
- padding: 0.75rem;
1155
- border-radius: 12px;
1156
- cursor: pointer;
1157
- color: var(--color-accent);
1158
- transition: all 0.2s ease;
1159
- display: flex;
1160
- align-items: center;
1161
- justify-content: center;
1162
- }
1163
-
1164
- .btn-close-enhanced:hover {
1165
- background: rgba(207, 102, 121, 0.15);
1166
- border-color: var(--color-accent);
1167
- transform: translateY(-1px);
1168
- }
1169
-
1170
- .modal-body-enhanced {
1171
- display: flex;
1172
- flex: 1;
1173
- overflow: hidden;
1174
- min-height: 0;
1175
- }
1176
-
1177
- .content-section-main {
1178
- flex: 2;
1179
- padding: 2rem;
1180
- overflow-y: auto;
1181
- background: var(--color-background);
1182
- }
1183
-
1184
- .metadata-sidebar {
1185
- flex: 1;
1186
- min-width: 320px;
1187
- background: var(--color-panel);
1188
- border-left: 1px solid var(--color-border);
1189
- padding: 2rem;
1190
- overflow-y: auto;
1191
- }
932
1193
- .section-header {
1194
- margin-bottom: 1.5rem;
1195
- }
933
+ .memory-filters-header {
934
+ display: flex;
935
+ flex-wrap: wrap;
936
+ gap: 0.75rem;
937
+ }
938
1197
- .section-header h4 {
1198
- margin: 0;
1199
- font-size: 1.1rem;
1200
- font-weight: 600;
1201
- color: var(--color-text);
1202
- display: flex;
1203
- align-items: center;
1204
- gap: 0.5rem;
1205
- }
939
+ /* Reset grid positioning */
940
+ .filter-memory-dir,
941
+ .filter-area,
942
+ .filter-limit,
943
+ .filter-threshold,
944
+ #search-input,
945
+ .btn-search,
946
+ .btn-clear {
947
+ grid-column: auto;
948
+ grid-row: auto;
949
+ }
950
1207
- .content-display {
1208
- background: var(--color-background);
1209
- border: 1px solid var(--color-border);
1210
- border-radius: 12px;
1211
- padding: 1.5rem;
1212
- font-size: 0.95rem;
1213
- line-height: 1.6;
1214
- color: var(--color-text);
1215
- white-space: pre-wrap;
1216
- max-height: 60vh;
1217
- overflow-y: auto;
1218
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
1219
- }
951
+ .filter-group-inline {
952
+ width: 100%;
953
+ flex-direction: row;
954
+ align-items: center;
955
+ gap: 0.5rem;
956
+ }
957
1221
- .metadata-grid {
1222
- display: flex;
1223
- flex-direction: column;
1224
- gap: 1.25rem;
1225
- }
958
+ .filter-group-inline label {
959
+ font-size: 0.9rem;
960
+ margin-bottom: 0.25rem;
961
+ }
962
1227
- .metadata-item {
1228
- display: flex;
1229
- flex-direction: column;
1230
- gap: 0.5rem;
1231
- }
963
+ .filter-group-inline select,
964
+ .filter-group-inline input {
965
+ height: 42px;
966
+ font-size: 1rem;
967
+ }
968
1233
- .metadata-item label {
1234
- font-size: 0.8rem;
1235
- font-weight: 600;
1236
- color: var(--color-secondary);
1237
- text-transform: uppercase;
1238
- letter-spacing: 0.5px;
1239
- }
969
+ .filter-group-inline.filter-limit {
970
+ flex: 33%;
971
+ }
972
1241
- .metadata-item value {
1242
- font-size: 0.9rem;
1243
- color: var(--color-text);
1244
- background: var(--color-background);
1245
- padding: 0.75rem;
1246
- border-radius: 8px;
1247
- border: 1px solid var(--color-border);
1248
- word-break: break-all;
1249
- }
973
+ .filter-limit input {
974
+ flex: 1;
975
+ }
976
1251
- .metadata-item value.monospace {
1252
- font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1253
- font-size: 0.85rem;
1254
- }
977
+ /* Mobile order and layout - force items to specific widths */
978
+ .filter-memory-dir {
979
+ order: 1;
980
+ flex: 1 1 100%;
981
+ }
982
1256
- .consolidation-badge {
1257
- background: var(--color-accent) !important;
1258
- color: white !important;
1259
- padding: 0.5rem 1rem !important;
1260
- border-radius: 20px !important;
1261
- font-weight: 600 !important;
1262
- text-transform: capitalize !important;
1263
- border: none !important;
1264
- }
983
+ .filter-area {
984
+ order: 2;
985
+ flex: 1 1 100%;
986
+ }
987
1266
- .tags-display {
1267
- display: flex;
1268
- flex-wrap: wrap;
1269
- gap: 0.5rem;
1270
- background: var(--color-background);
1271
- padding: 0.75rem;
1272
- border-radius: 8px;
1273
- border: 1px solid var(--color-border);
1274
- }
988
+ .filter-limit {
989
+ order: 3;
990
+ flex: 1 1 100%;
991
+ }
992
1276
- .tag-pill {
1277
- background: var(--color-primary);
1278
- color: white;
1279
- padding: 0.25rem 0.75rem;
1280
- border-radius: 12px;
1281
- font-size: 0.75rem;
1282
- font-weight: 500;
1283
- }
993
+ .btn-clear {
994
+ order: 6;
995
+ flex: 40%;
996
+ min-width: 80px;
997
+ padding: 0;
998
+ height: 42px;
999
+ justify-content: center;
1000
+ }
1001
1285
- /* Responsive design */
1286
- @media (max-width: 768px) {
1287
- .modal-overlay {
1288
- padding: 1rem 0;
1002
+ #search-input {
1003
+ order: 5;
1004
+ flex: auto;
1005
+ width: 100%;
1006
+ height: 42px;
1007
}
1008
1291
- .memory-dashboard {
1292
- padding: 0.5rem;
1009
+ /* Search button and threshold on same row */
1010
+ .btn-search {
1011
+ order: 7;
1012
+ flex: 40%;
1013
+ height: 42px;
1014
+ padding: 0 1rem;
1015
+ min-width: 80px;
1016
}
1017
1295
- .stats-pagination-header {
1018
+ .filter-threshold {
1019
+ order: 4;
1020
+ flex: 40%;
1021
flex-direction: column;
1297
- align-items: flex-start;
1298
- gap: 1rem;
1022
+ align-items: stretch;
1023
+ gap: 0.5rem;
1024
+ padding: 0;
1025
}
1026
1301
- .memory-stats-compact {
1027
+ .filter-threshold label {
1028
+ font-size: 0.9rem;
1029
width: 100%;
1030
+ display: flex;
1031
justify-content: space-between;
1032
}
1033
1306
- .pagination-controls-compact {
1307
- align-self: stretch;
1308
- justify-content: center;
1034
+ .filter-threshold input[type="range"] {
1035
+ width: 100%;
1036
}
1037
1311
- .filter-row {
1038
+ .memory-status-bar {
1039
flex-direction: column;
1313
- align-items: stretch;
1040
+ gap: 0.75rem;
1041
+ }
1042
+
1043
+ .status-info {
1044
+ width: 100%;
1045
+ justify-content: center;
1046
+ flex-wrap: wrap;
1047
+ gap: 0.5rem 1rem;
1048
+ }
1049
+
1050
+ .status-info .material-symbols-outlined {
1051
+ font-size: 18px;
1052
}
1053
1316
- .filter-group input,
1317
- .filter-group select {
1318
- min-width: unset;
1054
+ .status-pagination {
1055
width: 100%;
1056
+ justify-content: center;
1057
+ padding-top: 0.5rem;
1058
+ border-top: 1px solid var(--color-border);
1059
}
1060
1061
.memory-table th,
1084
.col-actions {
1085
width: 10%;
1086
}
1348
-
1349
- .memory-detail-modal {
1350
- width: 98%;
1351
- max-height: 95vh;
1352
- min-height: 50vh;
1353
- margin: 0;
1354
- }
1355
-
1356
- .modal-body-enhanced {
1357
- flex-direction: column;
1358
- }
1359
-
1360
- .metadata-sidebar {
1361
- min-width: unset;
1362
- border-left: none;
1363
- border-top: 1px solid var(--color-border);
1364
- }
1365
-
1366
- .modal-header-enhanced {
1367
- padding: 1rem;
1368
- }
1369
-
1370
- .memory-title {
1371
- flex-direction: column;
1372
- align-items: flex-start;
1373
- gap: 0.5rem;
1374
- }
1375
-
1376
- .content-section-main,
1377
- .metadata-sidebar {
1378
- padding: 1rem;
1379
- }
1380
-
1381
-
1382
-
1383
- .pagination-controls {
1384
- flex-wrap: wrap;
1385
- }
1386
- }
1387
-
1388
- /* Memory Detail Modal Styles */
1389
- .modal-header-enhanced {
1390
- display: flex;
1391
- justify-content: space-between;
1392
- align-items: flex-start;
1393
- padding: 1.5rem;
1394
- border-bottom: 2px solid var(--color-border);
1395
- background: linear-gradient(135deg, var(--color-panel) 0%, var(--color-background) 100%);
1396
- }
1397
-
1398
- .memory-title {
1399
- display: flex;
1400
- align-items: center;
1401
- gap: 1rem;
1402
- margin-bottom: 0.5rem;
1403
- }
1404
-
1405
- .area-badge-large {
1406
- color: white;
1407
- padding: 0.5rem 1rem;
1408
- border-radius: 20px;
1409
- font-size: 0.8rem;
1410
- font-weight: bold;
1411
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
1412
- }
1413
-
1414
- .memory-meta-quick {
1415
- display: flex;
1416
- gap: 1rem;
1417
- align-items: center;
1418
- }
1419
-
1420
- .timestamp-badge,
1421
- .source-badge {
1422
- padding: 0.25rem 0.75rem;
1423
- border-radius: 12px;
1424
- font-size: 0.75rem;
1425
- font-weight: 500;
1426
- background: var(--color-panel);
1427
- border: 1px solid var(--color-border);
1428
- }
1429
-
1430
- .source-badge.knowledge {
1431
- background: rgba(115, 122, 129, 0.1);
1432
- color: var(--color-primary);
1433
- border-color: var(--color-primary);
1434
- }
1435
-
1436
- .source-badge.conversation {
1437
- background: rgba(101, 101, 101, 0.1);
1438
- color: var(--color-text);
1439
- opacity: 0.8;
1440
- border-color: var(--color-border);
1441
- }
1442
-
1443
- .header-actions {
1444
- display: flex;
1445
- gap: 0.5rem;
1446
- }
1447
-
1448
- .btn-action-header {
1449
- background: var(--color-background);
1450
- border: 1px solid var(--color-border);
1451
- color: var(--color-text);
1452
- padding: 0.5rem;
1453
- border-radius: 8px;
1454
- cursor: pointer;
1455
- transition: all 0.2s ease;
1456
- }
1457
-
1458
- .btn-action-header:hover {
1459
- border-color: var(--color-primary);
1460
- background: rgba(115, 122, 129, 0.1);
1461
- }
1462
-
1463
- .modal-body-enhanced {
1464
- display: flex;
1465
- min-height: 60vh;
1466
- max-height: 70vh;
1467
- }
1468
-
1469
- .content-section-main {
1470
- flex: 1;
1471
- padding: 1.5rem;
1472
- overflow-y: auto;
1473
- }
1474
-
1475
- .content-block {
1476
- margin-bottom: 2rem;
1477
- }
1478
-
1479
- .content-block h4 {
1480
- margin: 0 0 1rem 0;
1481
- color: var(--color-primary);
1482
- font-size: 1.1rem;
1483
- font-weight: 600;
1484
- border-bottom: 1px solid var(--color-border);
1485
- padding-bottom: 0.5rem;
1486
- }
1487
-
1488
- .memory-content-display {
1489
- background: var(--color-panel);
1490
- border: 1px solid var(--color-border);
1491
- border-radius: 8px;
1492
- padding: 1.5rem;
1493
- line-height: 1.6;
1494
- color: var(--color-text);
1495
- white-space: pre-wrap;
1496
- word-break: break-word;
1497
- max-height: 300px;
1498
- overflow-y: auto;
1499
- }
1500
-
1501
- .tags-display {
1502
- display: flex;
1503
- flex-wrap: wrap;
1504
- gap: 0.5rem;
1505
- }
1506
-
1507
- .tag-display {
1508
- background: var(--color-primary);
1509
- color: white;
1510
- padding: 0.25rem 0.75rem;
1511
- border-radius: 12px;
1512
- font-size: 0.75rem;
1513
- font-weight: 500;
1514
- }
1515
-
1516
- .metadata-sidebar {
1517
- min-width: 300px;
1518
- max-width: 350px;
1519
- background: var(--color-panel);
1520
- border-left: 1px solid var(--color-border);
1521
- padding: 1.5rem;
1522
- overflow-y: auto;
1523
- }
1524
-
1525
- .metadata-sidebar h4 {
1526
- margin: 0 0 1rem 0;
1527
- color: var(--color-primary);
1528
- font-size: 1.1rem;
1529
- font-weight: 600;
1530
- }
1531
-
1532
- .metadata-group {
1533
- margin-bottom: 1.5rem;
1534
- }
1535
-
1536
- .metadata-group h5 {
1537
- margin: 0 0 0.75rem 0;
1538
- color: var(--color-text);
1539
- opacity: 0.7;
1540
- font-size: 0.9rem;
1541
- font-weight: 600;
1542
- text-transform: uppercase;
1543
- letter-spacing: 0.5px;
1544
- }
1545
-
1546
- .metadata-item {
1547
- display: flex;
1548
- flex-direction: column;
1549
- gap: 0.25rem;
1550
- margin-bottom: 0.75rem;
1551
- padding: 0.5rem;
1552
- background: var(--color-background);
1553
- border: 1px solid var(--color-border);
1554
- border-radius: 6px;
1555
- }
1556
-
1557
- .metadata-label {
1558
- font-size: 0.8rem;
1559
- font-weight: 600;
1560
- color: var(--color-text);
1561
- opacity: 0.7;
1562
- text-transform: uppercase;
1563
- letter-spacing: 0.3px;
1564
- }
1565
-
1566
- .metadata-value {
1567
- font-size: 0.9rem;
1568
- color: var(--color-text);
1569
- word-break: break-all;
1570
- line-height: 1.4;
1571
- }
1572
-
1573
- .source-file-display {
1574
- font-family: monospace;
1575
- background: var(--color-panel);
1576
- padding: 0.5rem;
1577
- border-radius: 4px;
1578
- border: 1px solid var(--color-border);
1579
- }
1580
-
1581
- .metadata-actions {
1582
- display: flex;
1583
- flex-direction: column;
1584
- gap: 0.5rem;
1585
- }
1586
-
1587
- .metadata-actions .btn {
1588
- display: flex;
1589
- align-items: center;
1590
- gap: 0.5rem;
1591
- justify-content: flex-start;
1592
- font-size: 0.9rem;
1593
- }
1594
-
1595
- /* Light mode adjustments for modal */
1596
- .light-mode .modal-header-enhanced {
1597
- background: linear-gradient(135deg, rgba(240, 240, 240, 0.8) 0%, rgba(255, 255, 255, 0.9) 100%);
1598
- }
1599
-
1600
- .light-mode .memory-content-display {
1601
- background: rgba(248, 248, 248, 0.8);
1602
- }
1603
-
1604
- .light-mode .metadata-sidebar {
1605
- background: rgba(248, 248, 248, 0.8);
1606
- }
1607
-
1608
- .light-mode .metadata-item {
1609
- background: rgba(255, 255, 255, 0.9);
1610
- }
1611
-
1612
- /* Responsive design for modal */
1613
- @media (max-width: 768px) {
1614
- .modal-body-enhanced {
1615
- flex-direction: column;
1616
- max-height: 80vh;
1617
- }
1618
-
1619
- .metadata-sidebar {
1620
- min-width: unset;
1621
- max-width: unset;
1622
- border-left: none;
1623
- border-top: 1px solid var(--color-border);
1624
- }
1625
-
1626
- .modal-header-enhanced {
1627
- padding: 1rem;
1628
- }
1629
-
1630
- .memory-title {
1631
- flex-direction: column;
1632
- align-items: flex-start;
1633
- gap: 0.5rem;
1634
- }
1635
-
1636
- .content-section-main,
1637
- .metadata-sidebar {
1638
- padding: 1rem;
1639
- }
1087
}
1088
</style>
1089