opencode-mem 1.0.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.
Files changed (84) hide show
  1. package/README.md +588 -0
  2. package/dist/config.d.ts +33 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +258 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +618 -0
  8. package/dist/plugin.d.ts +5 -0
  9. package/dist/plugin.d.ts.map +1 -0
  10. package/dist/plugin.js +15 -0
  11. package/dist/services/api-handlers.d.ts +102 -0
  12. package/dist/services/api-handlers.d.ts.map +1 -0
  13. package/dist/services/api-handlers.js +494 -0
  14. package/dist/services/auto-capture.d.ts +32 -0
  15. package/dist/services/auto-capture.d.ts.map +1 -0
  16. package/dist/services/auto-capture.js +451 -0
  17. package/dist/services/cleanup-service.d.ts +20 -0
  18. package/dist/services/cleanup-service.d.ts.map +1 -0
  19. package/dist/services/cleanup-service.js +88 -0
  20. package/dist/services/client.d.ts +104 -0
  21. package/dist/services/client.d.ts.map +1 -0
  22. package/dist/services/client.js +251 -0
  23. package/dist/services/compaction.d.ts +92 -0
  24. package/dist/services/compaction.d.ts.map +1 -0
  25. package/dist/services/compaction.js +421 -0
  26. package/dist/services/context.d.ts +17 -0
  27. package/dist/services/context.d.ts.map +1 -0
  28. package/dist/services/context.js +41 -0
  29. package/dist/services/deduplication-service.d.ts +30 -0
  30. package/dist/services/deduplication-service.d.ts.map +1 -0
  31. package/dist/services/deduplication-service.js +131 -0
  32. package/dist/services/embedding.d.ts +10 -0
  33. package/dist/services/embedding.d.ts.map +1 -0
  34. package/dist/services/embedding.js +77 -0
  35. package/dist/services/jsonc.d.ts +7 -0
  36. package/dist/services/jsonc.d.ts.map +1 -0
  37. package/dist/services/jsonc.js +76 -0
  38. package/dist/services/logger.d.ts +2 -0
  39. package/dist/services/logger.d.ts.map +1 -0
  40. package/dist/services/logger.js +16 -0
  41. package/dist/services/migration-service.d.ts +42 -0
  42. package/dist/services/migration-service.d.ts.map +1 -0
  43. package/dist/services/migration-service.js +258 -0
  44. package/dist/services/privacy.d.ts +4 -0
  45. package/dist/services/privacy.d.ts.map +1 -0
  46. package/dist/services/privacy.js +10 -0
  47. package/dist/services/sqlite/connection-manager.d.ts +10 -0
  48. package/dist/services/sqlite/connection-manager.d.ts.map +1 -0
  49. package/dist/services/sqlite/connection-manager.js +45 -0
  50. package/dist/services/sqlite/shard-manager.d.ts +20 -0
  51. package/dist/services/sqlite/shard-manager.d.ts.map +1 -0
  52. package/dist/services/sqlite/shard-manager.js +221 -0
  53. package/dist/services/sqlite/types.d.ts +39 -0
  54. package/dist/services/sqlite/types.d.ts.map +1 -0
  55. package/dist/services/sqlite/types.js +1 -0
  56. package/dist/services/sqlite/vector-search.d.ts +18 -0
  57. package/dist/services/sqlite/vector-search.d.ts.map +1 -0
  58. package/dist/services/sqlite/vector-search.js +129 -0
  59. package/dist/services/sqlite-client.d.ts +116 -0
  60. package/dist/services/sqlite-client.d.ts.map +1 -0
  61. package/dist/services/sqlite-client.js +284 -0
  62. package/dist/services/tags.d.ts +20 -0
  63. package/dist/services/tags.d.ts.map +1 -0
  64. package/dist/services/tags.js +76 -0
  65. package/dist/services/web-server-lock.d.ts +12 -0
  66. package/dist/services/web-server-lock.d.ts.map +1 -0
  67. package/dist/services/web-server-lock.js +157 -0
  68. package/dist/services/web-server-worker.d.ts +2 -0
  69. package/dist/services/web-server-worker.d.ts.map +1 -0
  70. package/dist/services/web-server-worker.js +221 -0
  71. package/dist/services/web-server.d.ts +22 -0
  72. package/dist/services/web-server.d.ts.map +1 -0
  73. package/dist/services/web-server.js +134 -0
  74. package/dist/types/index.d.ts +48 -0
  75. package/dist/types/index.d.ts.map +1 -0
  76. package/dist/types/index.js +1 -0
  77. package/dist/web/app.d.ts +2 -0
  78. package/dist/web/app.d.ts.map +1 -0
  79. package/dist/web/app.js +691 -0
  80. package/dist/web/favicon.ico +0 -0
  81. package/dist/web/favicon.svg +14 -0
  82. package/dist/web/index.html +202 -0
  83. package/dist/web/styles.css +851 -0
  84. package/package.json +52 -0
@@ -0,0 +1,851 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace;
9
+ background: #0a0a0a;
10
+ color: #e0e0e0;
11
+ line-height: 1.6;
12
+ padding: 20px;
13
+ font-size: 14px;
14
+ }
15
+
16
+ .container {
17
+ max-width: 1400px;
18
+ margin: 0 auto;
19
+ }
20
+
21
+ .header {
22
+ border: 1px solid #333;
23
+ padding: 20px;
24
+ margin-bottom: 20px;
25
+ background: #111;
26
+ }
27
+
28
+ .header-top {
29
+ display: flex;
30
+ justify-content: space-between;
31
+ align-items: center;
32
+ margin-bottom: 10px;
33
+ }
34
+
35
+ .title {
36
+ color: #00ff00;
37
+ font-size: 18px;
38
+ font-weight: normal;
39
+ letter-spacing: 1px;
40
+ margin: 0;
41
+ }
42
+
43
+ .github-link {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ padding: 8px;
48
+ border: 1px solid #333;
49
+ background: #0a0a0a;
50
+ color: #00ff00;
51
+ text-decoration: none;
52
+ transition: all 0.2s;
53
+ }
54
+
55
+ .github-link:hover {
56
+ background: #00ff00;
57
+ color: #0a0a0a;
58
+ border-color: #00ff00;
59
+ }
60
+
61
+ .github-link .icon {
62
+ width: 20px;
63
+ height: 20px;
64
+ }
65
+
66
+ .stats-bar {
67
+ display: flex;
68
+ gap: 20px;
69
+ font-size: 12px;
70
+ color: #888;
71
+ margin-top: 10px;
72
+ }
73
+
74
+ .stats-bar span {
75
+ padding: 4px 8px;
76
+ border: 1px solid #333;
77
+ }
78
+
79
+ .controls {
80
+ border: 1px solid #333;
81
+ padding: 20px;
82
+ margin-bottom: 20px;
83
+ background: #111;
84
+ display: flex;
85
+ flex-wrap: wrap;
86
+ gap: 15px;
87
+ align-items: flex-end;
88
+ }
89
+
90
+ .filter-group,
91
+ .search-group {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 5px;
95
+ }
96
+
97
+ .filter-group label {
98
+ font-size: 11px;
99
+ color: #888;
100
+ text-transform: uppercase;
101
+ }
102
+
103
+ select,
104
+ input[type="text"],
105
+ textarea {
106
+ background: #0a0a0a;
107
+ border: 1px solid #333;
108
+ color: #e0e0e0;
109
+ padding: 8px 12px;
110
+ font-family: inherit;
111
+ font-size: 13px;
112
+ outline: none;
113
+ transition: border-color 0.2s;
114
+ }
115
+
116
+ select:focus,
117
+ input[type="text"]:focus,
118
+ textarea:focus {
119
+ border-color: #00ff00;
120
+ }
121
+
122
+ select {
123
+ cursor: pointer;
124
+ min-width: 150px;
125
+ }
126
+
127
+ .search-group {
128
+ flex: 1;
129
+ min-width: 300px;
130
+ }
131
+
132
+ .search-group input {
133
+ width: 100%;
134
+ }
135
+
136
+ .search-group {
137
+ flex-direction: row;
138
+ align-items: stretch;
139
+ }
140
+
141
+ .search-group input {
142
+ flex: 1;
143
+ border-right: none;
144
+ }
145
+
146
+ button {
147
+ background: #0a0a0a;
148
+ border: 1px solid #333;
149
+ color: #00ff00;
150
+ padding: 8px 16px;
151
+ font-family: inherit;
152
+ font-size: 13px;
153
+ cursor: pointer;
154
+ transition: all 0.2s;
155
+ }
156
+
157
+ button:hover:not(:disabled) {
158
+ background: #00ff00;
159
+ color: #0a0a0a;
160
+ border-color: #00ff00;
161
+ }
162
+
163
+ button:disabled {
164
+ opacity: 0.3;
165
+ cursor: not-allowed;
166
+ }
167
+
168
+ .btn-primary {
169
+ background: #00ff00;
170
+ color: #0a0a0a;
171
+ border-color: #00ff00;
172
+ }
173
+
174
+ .btn-primary:hover {
175
+ background: #00cc00;
176
+ border-color: #00cc00;
177
+ }
178
+
179
+ .btn-secondary {
180
+ background: #333;
181
+ color: #e0e0e0;
182
+ }
183
+
184
+ .btn-secondary:hover {
185
+ background: #444;
186
+ }
187
+
188
+ .bulk-actions {
189
+ display: flex;
190
+ gap: 10px;
191
+ align-items: center;
192
+ padding: 10px;
193
+ border: 1px solid #ff4444;
194
+ background: rgba(255, 68, 68, 0.1);
195
+ }
196
+
197
+ .bulk-actions span {
198
+ color: #ff4444;
199
+ font-size: 12px;
200
+ }
201
+
202
+ .bulk-actions button {
203
+ border-color: #ff4444;
204
+ color: #ff4444;
205
+ }
206
+
207
+ .bulk-actions button:hover {
208
+ background: #ff4444;
209
+ color: #0a0a0a;
210
+ }
211
+
212
+ .maintenance-actions {
213
+ display: flex;
214
+ gap: 10px;
215
+ }
216
+
217
+ .btn-maintenance {
218
+ border-color: #ffaa00;
219
+ color: #ffaa00;
220
+ padding: 8px 16px;
221
+ font-size: 12px;
222
+ }
223
+
224
+ .btn-maintenance:hover {
225
+ background: #ffaa00;
226
+ color: #0a0a0a;
227
+ }
228
+
229
+ .migration-section {
230
+ border: 2px solid #ff4444;
231
+ padding: 20px;
232
+ margin-bottom: 20px;
233
+ background: rgba(255, 68, 68, 0.05);
234
+ border-radius: 4px;
235
+ }
236
+
237
+ .migration-warning {
238
+ display: flex;
239
+ align-items: center;
240
+ gap: 10px;
241
+ color: #ff4444;
242
+ font-weight: bold;
243
+ margin-bottom: 15px;
244
+ font-size: 14px;
245
+ }
246
+
247
+ .migration-warning .icon {
248
+ width: 20px;
249
+ height: 20px;
250
+ flex-shrink: 0;
251
+ }
252
+
253
+ .migration-info {
254
+ margin-bottom: 15px;
255
+ padding: 12px;
256
+ background: rgba(0, 0, 0, 0.3);
257
+ border: 1px solid #333;
258
+ border-radius: 4px;
259
+ }
260
+
261
+ .migration-info label {
262
+ display: flex;
263
+ align-items: center;
264
+ gap: 10px;
265
+ color: #e0e0e0;
266
+ font-size: 13px;
267
+ cursor: pointer;
268
+ user-select: none;
269
+ }
270
+
271
+ .migration-info input[type="checkbox"] {
272
+ width: 18px;
273
+ height: 18px;
274
+ cursor: pointer;
275
+ accent-color: #ff4444;
276
+ flex-shrink: 0;
277
+ }
278
+
279
+ .migration-actions {
280
+ display: flex;
281
+ gap: 12px;
282
+ }
283
+
284
+ .btn-migration {
285
+ flex: 1;
286
+ padding: 12px 16px;
287
+ background: #0a0a0a;
288
+ border: 1px solid #ff4444;
289
+ color: #ff4444;
290
+ cursor: pointer;
291
+ border-radius: 4px;
292
+ display: flex;
293
+ align-items: center;
294
+ justent: center;
295
+ gap: 8px;
296
+ font-size: 13px;
297
+ font-weight: bold;
298
+ transition: all 0.2s;
299
+ }
300
+
301
+ .btn-migration:hover:not(:disabled) {
302
+ background: #ff4444;
303
+ color: #0a0a0a;
304
+ border-color: #ff4444;
305
+ }
306
+
307
+ .btn-migration:disabled {
308
+ opacity: 0.3;
309
+ cursor: not-allowed;
310
+ }
311
+
312
+ .btn-migration .icon {
313
+ width: 16px;
314
+ height: 16px;
315
+ }
316
+
317
+ .memories-section {
318
+ border: 1px solid #333;
319
+ padding: 20px;
320
+ margin-bottom: 20px;
321
+ background: #111;
322
+ }
323
+
324
+ .section-header {
325
+ display: flex;
326
+ justify-content: space-between;
327
+ align-items: center;
328
+ margin-bottom: 15px;
329
+ padding-bottom: 10px;
330
+ border-bottom: 1px solid #333;
331
+ }
332
+
333
+ .section-header h2 {
334
+ color: #00ff00;
335
+ font-size: 14px;
336
+ font-weight: normal;
337
+ }
338
+
339
+ .pagination {
340
+ display: flex;
341
+ gap: 10px;
342
+ align-items: center;
343
+ }
344
+
345
+ .pagination span {
346
+ font-size: 12px;
347
+ color: #888;
348
+ min-width: 100px;
349
+ text-align: center;
350
+ }
351
+
352
+ .pagination button {
353
+ padding: 4px 12px;
354
+ font-size: 12px;
355
+ display: inline-flex;
356
+ align-items: center;
357
+ justify-content: center;
358
+ min-width: 36px;
359
+ }
360
+
361
+ #pagination-bottom {
362
+ margin-top: 15px;
363
+ padding-top: 15px;
364
+ border-top: 1px solid #333;
365
+ justify-content: center;
366
+ }
367
+
368
+ .memories-list {
369
+ display: flex;
370
+ flex-direction: column;
371
+ gap: 10px;
372
+ min-height: 200px;
373
+ max-height: 600px;
374
+ overflow-y: auto;
375
+ padding-right: 10px;
376
+ }
377
+
378
+ .memories-list::-webkit-scrollbar {
379
+ width: 8px;
380
+ }
381
+
382
+ .memories-list::-webkit-scrollbar-track {
383
+ background: #0a0a0a;
384
+ }
385
+
386
+ .memories-list::-webkit-scrollbar-thumb {
387
+ background: #333;
388
+ border-radius: 4px;
389
+ }
390
+
391
+ .memories-list::-webkit-scrollbar-thumb:hover {
392
+ background: #444;
393
+ }
394
+
395
+ .memory-card {
396
+ border: 1px solid #333;
397
+ padding: 15px;
398
+ background: #0a0a0a;
399
+ transition: border-color 0.2s;
400
+ position: relative;
401
+ }
402
+
403
+ .memory-card:hover {
404
+ border-color: #00ff00;
405
+ }
406
+
407
+ .memory-card.selected {
408
+ border-color: #00ff00;
409
+ background: rgba(0, 255, 0, 0.05);
410
+ }
411
+
412
+ .memory-header {
413
+ display: flex;
414
+ justify-content: space-between;
415
+ align-items: flex-start;
416
+ margin-bottom: 10px;
417
+ }
418
+
419
+ .memory-meta {
420
+ display: flex;
421
+ gap: 8px;
422
+ align-items: center;
423
+ flex-wrap: wrap;
424
+ }
425
+
426
+ .memory-display-name {
427
+ color: #00ff00;
428
+ font-weight: bold;
429
+ font-size: 13px;
430
+ }
431
+
432
+ .memory-subtitle {
433
+ color: #888;
434
+ font-size: 11px;
435
+ margin-left: 5px;
436
+ }
437
+
438
+ .memory-checkbox {
439
+ width: 16px;
440
+ height: 16px;
441
+ cursor: pointer;
442
+ accent-color: #00ff00;
443
+ }
444
+
445
+ .badge {
446
+ font-size: 10px;
447
+ padding: 3px 8px;
448
+ border: 1px solid #333;
449
+ text-transform: uppercase;
450
+ letter-spacing: 0.5px;
451
+ }
452
+
453
+ .badge-user {
454
+ color: #00ccff;
455
+ border-color: #00ccff;
456
+ }
457
+
458
+ .badge-project {
459
+ color: #ffaa00;
460
+ border-color: #ffaa00;
461
+ }
462
+
463
+ .badge-type {
464
+ color: #888;
465
+ }
466
+
467
+ .badge-pinned {
468
+ color: #ff00ff;
469
+ border-color: #ff00ff;
470
+ font-weight: bold;
471
+ }
472
+
473
+ .memory-card.pinned {
474
+ border-left: 3px solid #ff00ff;
475
+ }
476
+
477
+ .memory-content {
478
+ color: #e0e0e0;
479
+ margin: 10px 0;
480
+ word-wrap: break-word;
481
+ }
482
+
483
+ .memory-footer {
484
+ display: flex;
485
+ justify-content: space-between;
486
+ align-items: center;
487
+ margin-top: 10px;
488
+ padding-top: 10px;
489
+ border-top: 1px solid #222;
490
+ font-size: 11px;
491
+ color: #666;
492
+ }
493
+
494
+ .memory-actions {
495
+ display: flex;
496
+ gap: 5px;
497
+ }
498
+
499
+ .memory-actions button {
500
+ padding: 4px 10px;
501
+ font-size: 11px;
502
+ display: inline-flex;
503
+ align-items: center;
504
+ justify-content: center;
505
+ gap: 4px;
506
+ }
507
+
508
+ .btn-edit {
509
+ border-color: #00ccff;
510
+ color: #00ccff;
511
+ }
512
+
513
+ .btn-edit:hover {
514
+ background: #00ccff;
515
+ color: #0a0a0a;
516
+ }
517
+
518
+ .btn-delete {
519
+ border-color: #ff4444;
520
+ color: #ff4444;
521
+ }
522
+
523
+ .btn-delete:hover {
524
+ background: #ff4444;
525
+ color: #0a0a0a;
526
+ }
527
+
528
+ .btn-pin {
529
+ border-color: #ff00ff;
530
+ color: #ff00ff;
531
+ font-size: 14px;
532
+ padding: 4px 8px;
533
+ min-width: 32px;
534
+ display: inline-flex;
535
+ align-items: center;
536
+ justify-content: center;
537
+ }
538
+
539
+ .btn-pin:hover {
540
+ background: #ff00ff;
541
+ color: #0a0a0a;
542
+ }
543
+
544
+ .btn-pin.pinned {
545
+ background: #ff00ff;
546
+ color: #0a0a0a;
547
+ }
548
+
549
+ .btn-pin.pinned .icon {
550
+ fill: #0a0a0a;
551
+ }
552
+
553
+ .btn-edit,
554
+ .btn-delete {
555
+ min-width: 32px;
556
+ display: inline-flex;
557
+ align-items: center;
558
+ justify-content: center;
559
+ gap: 4px;
560
+ }
561
+
562
+ .similarity-score {
563
+ color: #00ff00;
564
+ font-weight: bold;
565
+ }
566
+
567
+ .loading,
568
+ .empty-state,
569
+ .error-state {
570
+ text-align: center;
571
+ padding: 40px;
572
+ color: #666;
573
+ font-size: 13px;
574
+ }
575
+
576
+ .error-state {
577
+ color: #ff4444;
578
+ }
579
+
580
+ .add-section {
581
+ border: 1px solid #333;
582
+ padding: 20px;
583
+ background: #111;
584
+ }
585
+
586
+ .add-section h2 {
587
+ color: #00ff00;
588
+ font-size: 14px;
589
+ font-weight: normal;
590
+ margin-bottom: 15px;
591
+ }
592
+
593
+ .form-row {
594
+ display: flex;
595
+ gap: 15px;
596
+ margin-bottom: 15px;
597
+ flex-wrap: wrap;
598
+ }
599
+
600
+ .form-group {
601
+ display: flex;
602
+ flex-direction: column;
603
+ gap: 5px;
604
+ flex: 1;
605
+ min-width: 200px;
606
+ }
607
+
608
+ .form-group label {
609
+ font-size: 11px;
610
+ color: #888;
611
+ text-transform: uppercase;
612
+ }
613
+
614
+ textarea {
615
+ resize: vertical;
616
+ min-height: 80px;
617
+ }
618
+
619
+ .modal {
620
+ position: fixed;
621
+ top: 0;
622
+ left: 0;
623
+ right: 0;
624
+ bottom: 0;
625
+ background: rgba(0, 0, 0, 0.9);
626
+ display: flex;
627
+ align-items: center;
628
+ justify-content: center;
629
+ z-index: 1000;
630
+ }
631
+
632
+ .modal-content {
633
+ background: #111;
634
+ border: 1px solid #00ff00;
635
+ padding: 0;
636
+ max-width: 600px;
637
+ width: 90%;
638
+ max-height: 80vh;
639
+ overflow-y: auto;
640
+ }
641
+
642
+ .modal-header {
643
+ display: flex;
644
+ justify-content: space-between;
645
+ align-items: center;
646
+ padding: 20px;
647
+ border-bottom: 1px solid #333;
648
+ }
649
+
650
+ .modal-header h3 {
651
+ color: #00ff00;
652
+ font-size: 16px;
653
+ font-weight: normal;
654
+ }
655
+
656
+ .modal-close {
657
+ background: none;
658
+ border: 1px solid #ff4444;
659
+ color: #ff4444;
660
+ font-size: 20px;
661
+ padding: 0;
662
+ width: 30px;
663
+ height: 30px;
664
+ cursor: pointer;
665
+ display: inline-flex;
666
+ align-items: center;
667
+ justify-content: center;
668
+ }
669
+
670
+ .modal-close .icon {
671
+ width: 18px;
672
+ height: 18px;
673
+ }
674
+
675
+ .modal-close:hover {
676
+ color: #fff;
677
+ background: #ff4444;
678
+ }
679
+
680
+ .modal form {
681
+ padding: 20px;
682
+ }
683
+
684
+ .modal-actions {
685
+ display: flex;
686
+ gap: 10px;
687
+ justify-content: flex-end;
688
+ margin-top: 20px;
689
+ }
690
+
691
+ .toast {
692
+ position: fixed;
693
+ bottom: 20px;
694
+ right: 20px;
695
+ background: #111;
696
+ border: 1px solid #00ff00;
697
+ color: #e0e0e0;
698
+ padding: 15px 20px;
699
+ font-size: 13px;
700
+ z-index: 2000;
701
+ animation: slideIn 0.3s ease;
702
+ max-width: 400px;
703
+ }
704
+
705
+ .toast.error {
706
+ border-color: #ff4444;
707
+ }
708
+
709
+ .toast.success {
710
+ border-color: #00ff00;
711
+ }
712
+
713
+ @keyframes slideIn {
714
+ from {
715
+ transform: translateX(400px);
716
+ opacity: 0;
717
+ }
718
+ to {
719
+ transform: translateX(0);
720
+ opacity: 1;
721
+ }
722
+ }
723
+
724
+ .hidden {
725
+ display: none !important;
726
+ }
727
+
728
+ #refresh-indicator {
729
+ animation: spin 1s linear infinite;
730
+ }
731
+
732
+ @keyframes spin {
733
+ from {
734
+ transform: rotate(0deg);
735
+ }
736
+ to {
737
+ transform: rotate(360deg);
738
+ }
739
+ }
740
+
741
+ .icon {
742
+ width: 16px;
743
+ height: 16px;
744
+ stroke: currentColor;
745
+ stroke-width: 2;
746
+ stroke-linecap: round;
747
+ stroke-linejoin: round;
748
+ fill: none;
749
+ vertical-align: middle;
750
+ display: inline-block;
751
+ }
752
+
753
+ .icon-sm {
754
+ width: 14px;
755
+ height: 14px;
756
+ }
757
+
758
+ .icon-md {
759
+ width: 16px;
760
+ height: 16px;
761
+ }
762
+
763
+ .icon-lg {
764
+ width: 20px;
765
+ height: 20px;
766
+ }
767
+
768
+ .icon-spin {
769
+ animation: spin 1s linear infinite;
770
+ }
771
+
772
+ .icon-filled {
773
+ fill: currentColor;
774
+ }
775
+
776
+ button .icon {
777
+ margin-right: 4px;
778
+ }
779
+
780
+ button:only-child .icon,
781
+ .btn-pin .icon,
782
+ .btn-edit .icon,
783
+ .btn-delete .icon,
784
+ .modal-close .icon,
785
+ #search-btn .icon,
786
+ #clear-search-btn .icon,
787
+ .pagination button .icon {
788
+ margin-right: 0;
789
+ }
790
+
791
+ @media (max-width: 768px) {
792
+ body {
793
+ padding: 10px;
794
+ font-size: 12px;
795
+ }
796
+
797
+ .header-top {
798
+ flex-direction: row;
799
+ justify-content: space-between;
800
+ align-items: center;
801
+ }
802
+
803
+ .title {
804
+ font-size: 14px;
805
+ }
806
+
807
+ .github-link {
808
+ padding: 6px;
809
+ }
810
+
811
+ .github-link .icon {
812
+ width: 18px;
813
+ height: 18px;
814
+ }
815
+
816
+ .controls {
817
+ flex-direction: column;
818
+ align-items: stretch;
819
+ }
820
+
821
+ .filter-group,
822
+ .search-group {
823
+ width: 100%;
824
+ }
825
+
826
+ .section-header {
827
+ flex-direction: column;
828
+ align-items: flex-start;
829
+ gap: 10px;
830
+ }
831
+
832
+ .pagination {
833
+ width: 100%;
834
+ justify-content: center;
835
+ }
836
+
837
+ .form-row {
838
+ flex-direction: column;
839
+ }
840
+
841
+ .memory-header {
842
+ flex-direction: column;
843
+ gap: 10px;
844
+ }
845
+
846
+ .memory-footer {
847
+ flex-direction: column;
848
+ gap: 10px;
849
+ align-items: flex-start;
850
+ }
851
+ }