mbkbucket 3.8.3 → 4.0.1

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 (36) hide show
  1. package/.env.example +4 -3
  2. package/README.md +375 -167
  3. package/index.js +3 -1
  4. package/lib/cli.js +239 -239
  5. package/lib/public/bucketadmin.css +855 -521
  6. package/lib/public/bucketadmin.js +367 -31
  7. package/lib/public/mbkbucket-helper-demo.html +4 -24
  8. package/lib/public/mbkbucket-helper.css +28 -34
  9. package/lib/public/mbkbucket-helper.js +4 -3
  10. package/lib/src/config/validation.js +18 -5
  11. package/lib/src/controllers/api.controller.js +66 -17
  12. package/lib/src/controllers/dashboard.controller.js +30 -10
  13. package/lib/src/controllers/info.controller.js +34 -3
  14. package/lib/src/controllers/view.controller.js +16 -14
  15. package/lib/src/core/storage/errors.js +62 -0
  16. package/lib/src/core/storage/gdrive-auth.js +193 -0
  17. package/lib/src/core/storage/gdrive-provider.js +656 -0
  18. package/lib/src/core/storage/index.js +14 -0
  19. package/lib/src/core/storage/models.js +80 -0
  20. package/lib/src/core/storage/path-strategy.js +65 -0
  21. package/lib/src/core/storage/s3-provider.js +491 -0
  22. package/lib/src/core/storage/storage-manager.js +203 -0
  23. package/lib/src/core/storage/storage-provider.js +217 -0
  24. package/lib/src/middleware/bucket-resolver.js +6 -6
  25. package/lib/src/routes/api.routes.js +5 -1
  26. package/lib/src/routes/index.js +2 -2
  27. package/lib/src/routes/view.routes.js +5 -2
  28. package/lib/src/services/s3.service.js +16 -568
  29. package/lib/src/services/storage.service.js +213 -0
  30. package/lib/src/utils/errors.js +15 -5
  31. package/package.json +2 -3
  32. package/views/bucket.hbs +47 -71
  33. package/views/bucketadmin_move_modal.hbs +35 -0
  34. package/views/bucketadmin_preview_modal.hbs +81 -13
  35. package/views/bucketadmincontent.hbs +56 -7
  36. package/views/mbkbucket_info.hbs +109 -207
@@ -1,98 +1,137 @@
1
1
  /* ==========================================================================
2
- MBKBucket File Manager - Original Theme Palette + Gentelella v4 Layout
2
+ MBKBucket File Manager - Clean, Modern Storage Dashboard
3
+ Design System: Refined Slate & Deep Teal Palette
3
4
  ========================================================================== */
4
5
 
5
6
  :root {
7
+ /* Brand / Primary Palette */
6
8
  --primary-color-ml: #0f766e;
7
- --primary-light-color-ml: #d7f4ee;
8
- --primary-dark-color-ml: #0b4f4a;
9
- --secondary-color-ml: #1f8f84;
10
- --dark-color-ml: #1f2a2a;
11
- --light-color-ml: #f4f7f3;
12
- --gray-color-ml: #667c79;
13
- --gray-light-color-ml: #dce8e3;
14
- --danger-color-ml: #dc2626;
15
- --warning-color-ml: #d97706;
16
- --success-color-ml: #16a34a;
17
- --info-color-ml: #3b82f6;
18
-
9
+ --primary-light-color-ml: #f0fdfa;
10
+ --primary-dark-color-ml: #115e59;
11
+ --secondary-color-ml: #14b8a6;
12
+ --dark-color-ml: #0f172a;
13
+ --light-color-ml: #f8fafc;
14
+ --gray-color-ml: #64748b;
15
+ --gray-light-color-ml: #e2e8f0;
16
+ --danger-color-ml: #ef4444;
17
+ --warning-color-ml: #f59e0b;
18
+ --success-color-ml: #10b981;
19
+ --info-color-ml: #0284c7;
20
+
21
+ /* Aliases */
19
22
  --primary: var(--primary-color-ml);
20
23
  --primary-lt: var(--primary-light-color-ml);
21
24
  --primary-dk: var(--primary-dark-color-ml);
22
- --primary-hover: #0d635c;
23
-
24
- --body-bg: var(--light-color-ml);
25
- --bg-surface: rgba(255, 255, 255, 0.82);
26
- --bg-surface-secondary: rgba(244, 247, 243, 0.85);
27
- --bg-surface-tertiary: #e2ede8;
28
-
29
- --border-color: rgba(15, 118, 110, 0.16);
30
- --border-color-light: rgba(15, 118, 110, 0.08);
31
-
32
- --text: var(--dark-color-ml);
33
- --text-secondary: #425855;
34
- --text-muted: var(--gray-color-ml);
35
- --text-disabled: #a0b2af;
36
-
37
- --blue: #066fd1;
38
- --azure: #1f8f84;
39
- --green: #16a34a;
25
+ --primary-hover: #134e4a;
26
+ --primary-active: #084c47;
27
+
28
+ /* Surfaces & Backgrounds */
29
+ --body-bg: #f8fafc;
30
+ --bg-surface: #ffffff;
31
+ --bg-surface-secondary: #f8fafc;
32
+ --bg-surface-tertiary: #f1f5f9;
33
+ --bg-surface-hover: #f1f5f9;
34
+
35
+ /* Borders */
36
+ --border-color: #e2e8f0;
37
+ --border-color-light: #f1f5f9;
38
+ --border-color-focus: #0f766e;
39
+
40
+ /* Text */
41
+ --text: #0f172a;
42
+ --text-secondary: #475569;
43
+ --text-muted: #64748b;
44
+ --text-disabled: #94a3b8;
45
+
46
+ /* Accent Colors */
47
+ --blue: #2563eb;
48
+ --azure: #0891b2;
49
+ --green: #10b981;
40
50
  --yellow: #d97706;
41
51
  --orange: #ea580c;
42
- --red: #dc2626;
52
+ --red: #ef4444;
43
53
  --purple: #7c3aed;
44
54
  --cyan: #0f766e;
45
55
 
46
- --green-lt: rgba(22, 163, 74, 0.12);
47
- --red-lt: rgba(220, 38, 38, 0.1);
48
- --yellow-lt: rgba(217, 119, 6, 0.12);
49
- --blue-lt: rgba(6, 111, 209, 0.1);
50
- --azure-lt: rgba(31, 143, 132, 0.12);
51
- --purple-lt: rgba(124, 58, 237, 0.1);
52
- --cyan-lt: rgba(15, 118, 110, 0.12);
56
+ /* Light Accent Tints */
57
+ --green-lt: #ecfdf5;
58
+ --red-lt: #fef2f2;
59
+ --yellow-lt: #fffbeb;
60
+ --blue-lt: #eff6ff;
61
+ --azure-lt: #ecfeff;
62
+ --purple-lt: #f5f3ff;
63
+ --cyan-lt: #f0fdfa;
53
64
 
65
+ /* Geometry */
54
66
  --radius-sm: 6px;
55
67
  --radius: 8px;
56
- --radius-lg: 14px;
57
- --radius-xl: 18px;
68
+ --radius-lg: 12px;
69
+ --radius-xl: 16px;
58
70
 
59
- --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.04);
60
- --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
61
- --shadow-md: 0 10px 15px -3px rgba(15, 118, 110, 0.08), 0 4px 6px -2px rgba(0, 0, 0, 0.04);
62
- --shadow-lg: 0 20px 25px -5px rgba(15, 118, 110, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
63
- --shadow-dropdown: 0 12px 30px rgba(15, 42, 42, 0.14), 0 4px 10px rgba(0, 0, 0, 0.05);
71
+ /* Modern Subtle Shadows */
72
+ --shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.05);
73
+ --shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.06), 0 1px 2px rgba(15, 23, 42, 0.04);
74
+ --shadow: 0 4px 6px -1px rgba(15, 23, 42, 0.06), 0 2px 4px -2px rgba(15, 23, 42, 0.04);
75
+ --shadow-md: 0 10px 15px -3px rgba(15, 23, 42, 0.07), 0 4px 6px -4px rgba(15, 23, 42, 0.03);
76
+ --shadow-lg: 0 20px 25px -5px rgba(15, 23, 42, 0.08), 0 8px 10px -6px rgba(15, 23, 42, 0.04);
77
+ --shadow-dropdown: 0 10px 25px -5px rgba(15, 23, 42, 0.12), 0 8px 10px -6px rgba(15, 23, 42, 0.04);
64
78
 
65
- --font: "IBM Plex Sans", "Segoe UI", sans-serif;
66
- --font-headings: "Sora", "Segoe UI", sans-serif;
67
- --font-mono: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
79
+ /* Fonts */
80
+ --font: "Segoe UI", -apple-system, BlinkMacSystemFont, system-ui, Roboto, sans-serif;
81
+ --font-headings: "Segoe UI", -apple-system, BlinkMacSystemFont, system-ui, Roboto, sans-serif;
82
+ --font-mono: "Segoe UI Mono", "Cascadia Code", Consolas, "Courier New", monospace;
68
83
  }
69
84
 
70
- /* Base Layout & Page Header */
85
+ /* ==========================================================================
86
+ Base Layout & Reset
87
+ ========================================================================== */
71
88
  .page-wrapper,
72
89
  .page-wrapper *,
73
90
  .page-wrapper *::before,
74
- .page-wrapper *::after {
91
+ .page-wrapper *::after,
92
+ .modal,
93
+ .modal * {
75
94
  box-sizing: border-box;
76
95
  }
77
96
 
97
+ body,
98
+ button,
99
+ input,
100
+ optgroup,
101
+ select,
102
+ textarea,
103
+ .page-wrapper,
104
+ .modal,
105
+ .modal-content,
106
+ .info-card,
107
+ .info-value,
108
+ .info-label,
109
+ .file-info-pane,
110
+ .fm-context-menu,
111
+ .toast-notification,
112
+ .batch-bar-inner {
113
+ font-family: var(--font);
114
+ }
115
+
78
116
  .page-wrapper {
79
117
  max-width: 1600px;
80
118
  margin: 0 auto;
81
119
  width: 100%;
82
- max-width: 100%;
83
120
  }
84
121
 
122
+ /* ==========================================================================
123
+ Page Header
124
+ ========================================================================== */
85
125
  .page-header {
86
126
  display: flex;
87
127
  align-items: center;
88
128
  justify-content: space-between;
89
- margin-bottom: 1.2rem;
90
- padding: 0.9rem 1.3rem;
91
- border: 1px solid rgba(255, 255, 255, 0.9);
92
- border-radius: 1rem;
93
- background: rgba(255, 255, 255, 0.74);
94
- backdrop-filter: blur(10px);
95
- box-shadow: 0 12px 34px rgba(15, 23, 42, 0.05);
129
+ margin-bottom: 1rem;
130
+ padding: 0.85rem 1.25rem;
131
+ border: 1px solid var(--border-color);
132
+ border-radius: var(--radius-lg);
133
+ background: #ffffff;
134
+ box-shadow: var(--shadow-xs);
96
135
  }
97
136
 
98
137
  .page-header-row {
@@ -107,27 +146,33 @@
107
146
  font-size: 11px;
108
147
  font-weight: 700;
109
148
  text-transform: uppercase;
110
- letter-spacing: 0.6px;
111
- color: var(--primary-color-ml);
112
- margin-bottom: 2px;
149
+ letter-spacing: 0.06em;
150
+ color: var(--primary);
151
+ margin-bottom: 3px;
113
152
  }
114
153
 
115
154
  .page-title {
116
155
  font-family: var(--font-headings);
117
- font-size: 1.45rem;
156
+ font-size: 1.35rem;
118
157
  font-weight: 700;
119
- color: var(--dark-color-ml);
158
+ color: var(--text);
120
159
  margin: 0;
121
- line-height: 1.2;
160
+ line-height: 1.25;
161
+ letter-spacing: -0.015em;
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 0.5rem;
122
165
  }
123
166
 
124
167
  .page-actions {
125
168
  display: flex;
126
169
  align-items: center;
127
- gap: 0.65rem;
170
+ gap: 0.5rem;
128
171
  }
129
172
 
130
- /* Button System */
173
+ /* ==========================================================================
174
+ Button System
175
+ ========================================================================== */
131
176
  .btn {
132
177
  display: inline-flex;
133
178
  align-items: center;
@@ -137,60 +182,80 @@
137
182
  font-size: 13px;
138
183
  font-weight: 600;
139
184
  line-height: 1.4;
140
- padding: 7px 15px;
141
- border-radius: var(--radius);
185
+ padding: 7px 14px;
186
+ border-radius: var(--radius-sm);
142
187
  border: 1px solid transparent;
143
188
  cursor: pointer;
144
- transition: all 0.15s ease-in-out;
189
+ transition: background-color 0.12s ease, border-color 0.12s ease, box-shadow 0.12s ease, color 0.12s ease;
145
190
  text-decoration: none;
146
191
  white-space: nowrap;
192
+ user-select: none;
147
193
  }
148
194
 
149
195
  .btn svg {
150
196
  flex-shrink: 0;
151
197
  }
152
198
 
199
+ .btn:focus-visible {
200
+ outline: none;
201
+ box-shadow: 0 0 0 2px var(--primary-light-color-ml), 0 0 0 4px var(--primary);
202
+ }
203
+
153
204
  .btn-primary {
154
- background: var(--primary-color-ml);
205
+ background: var(--primary);
155
206
  color: #ffffff;
156
- border-color: var(--primary-color-ml);
157
- box-shadow: 0 2px 4px rgba(15, 118, 110, 0.2);
207
+ border-color: var(--primary-dark-color-ml);
208
+ box-shadow: var(--shadow-xs);
158
209
  }
159
210
 
160
211
  .btn-primary:hover {
161
- background: var(--primary-dark-color-ml);
162
- border-color: var(--primary-dark-color-ml);
212
+ background: var(--primary-hover);
213
+ border-color: var(--primary-hover);
163
214
  color: #ffffff;
164
- transform: translateY(-1px);
215
+ }
216
+
217
+ .btn-primary:active {
218
+ background: var(--primary-active);
165
219
  }
166
220
 
167
221
  .btn-outline {
168
- background: rgba(255, 255, 255, 0.9);
169
- color: var(--dark-color-ml);
222
+ background: #ffffff;
223
+ color: var(--text);
170
224
  border-color: var(--border-color);
225
+ box-shadow: var(--shadow-xs);
171
226
  }
172
227
 
173
228
  .btn-outline:hover {
174
- background: var(--primary-light-color-ml);
175
- color: var(--primary-dark-color-ml);
176
- border-color: var(--primary-color-ml);
229
+ background: #f8fafc;
230
+ color: var(--text);
231
+ border-color: #cbd5e1;
232
+ }
233
+
234
+ .btn-outline:active {
235
+ background: #f1f5f9;
177
236
  }
178
237
 
179
238
  .btn-danger {
180
239
  background: var(--danger-color-ml);
181
240
  color: #ffffff;
182
241
  border-color: var(--danger-color-ml);
242
+ box-shadow: var(--shadow-xs);
183
243
  }
184
244
 
185
245
  .btn-danger:hover {
186
- background: #b91c1c;
187
- border-color: #b91c1c;
246
+ background: #dc2626;
247
+ border-color: #dc2626;
188
248
  color: #ffffff;
189
249
  }
190
250
 
251
+ .btn-danger:active {
252
+ background: #b91c1c;
253
+ }
254
+
191
255
  .btn-sm {
192
- padding: 5px 11px;
256
+ padding: 5px 10px;
193
257
  font-size: 12px;
258
+ border-radius: var(--radius-sm);
194
259
  }
195
260
 
196
261
  .btn-icon {
@@ -202,28 +267,31 @@
202
267
  justify-content: center;
203
268
  }
204
269
 
205
- /* File Manager Card Layout */
270
+ /* ==========================================================================
271
+ Main File Manager Card & Layout
272
+ ========================================================================== */
206
273
  .card.file-manager {
207
- background: rgba(255, 255, 255, 0.85);
208
- backdrop-filter: blur(14px);
209
- border: 1px solid rgba(255, 255, 255, 0.9);
274
+ background: #ffffff;
275
+ border: 1px solid var(--border-color);
210
276
  border-radius: var(--radius-lg);
211
- box-shadow: 0 14px 38px rgba(15, 23, 42, 0.06);
277
+ box-shadow: var(--shadow-sm);
212
278
  overflow: hidden;
213
279
  }
214
280
 
215
281
  .fm-layout {
216
282
  display: grid;
217
283
  grid-template-columns: 260px minmax(0, 1fr);
218
- height: calc(100vh - 180px);
284
+ height: calc(100vh - 170px);
219
285
  min-height: 580px;
220
286
  max-height: 900px;
221
287
  }
222
288
 
223
- /* Left Sidebar Tree */
289
+ /* ==========================================================================
290
+ Left Sidebar Tree (Explorer)
291
+ ========================================================================== */
224
292
  .fm-tree-wrap {
225
293
  border-right: 1px solid var(--border-color);
226
- background: rgba(244, 247, 243, 0.65);
294
+ background: #f8fafc;
227
295
  display: flex;
228
296
  flex-direction: column;
229
297
  padding: 12px 10px;
@@ -231,7 +299,7 @@
231
299
  }
232
300
 
233
301
  .fm-tree-header {
234
- padding: 4px 10px 8px;
302
+ padding: 4px 8px 8px;
235
303
  display: flex;
236
304
  align-items: center;
237
305
  justify-content: space-between;
@@ -242,8 +310,8 @@
242
310
  font-size: 11px;
243
311
  font-weight: 700;
244
312
  text-transform: uppercase;
245
- letter-spacing: 0.6px;
246
- color: var(--primary-dark-color-ml);
313
+ letter-spacing: 0.06em;
314
+ color: var(--text-muted);
247
315
  }
248
316
 
249
317
  .fm-tree {
@@ -253,15 +321,16 @@
253
321
  }
254
322
 
255
323
  .fm-tree::-webkit-scrollbar {
256
- width: 5px;
324
+ width: 4px;
257
325
  }
326
+
258
327
  .fm-tree::-webkit-scrollbar-thumb {
259
- background: var(--gray-light-color-ml);
260
- border-radius: 3px;
328
+ background: #cbd5e1;
329
+ border-radius: 2px;
261
330
  }
262
331
 
263
332
  .tree-group {
264
- margin-bottom: 3px;
333
+ margin-bottom: 2px;
265
334
  }
266
335
 
267
336
  .tree-link {
@@ -269,7 +338,7 @@
269
338
  align-items: center;
270
339
  gap: 8px;
271
340
  width: 100%;
272
- padding: 7px 11px;
341
+ padding: 6px 10px;
273
342
  background: transparent;
274
343
  border: none;
275
344
  border-radius: var(--radius-sm);
@@ -278,14 +347,14 @@
278
347
  color: var(--text-secondary);
279
348
  text-align: left;
280
349
  cursor: pointer;
281
- transition: all 0.12s ease;
350
+ transition: background-color 0.12s ease, color 0.12s ease;
282
351
  user-select: none;
283
352
  font-weight: 500;
284
353
  }
285
354
 
286
355
  .tree-link:hover {
287
- background: rgba(255, 255, 255, 0.8);
288
- color: var(--primary-dark-color-ml);
356
+ background: #f1f5f9;
357
+ color: var(--text);
289
358
  }
290
359
 
291
360
  .tree-link.active {
@@ -295,12 +364,12 @@
295
364
  }
296
365
 
297
366
  .tree-link svg {
298
- color: var(--gray-color-ml);
367
+ color: var(--text-muted);
299
368
  flex-shrink: 0;
300
369
  }
301
370
 
302
371
  .tree-link.active svg {
303
- color: var(--primary-color-ml);
372
+ color: var(--primary);
304
373
  }
305
374
 
306
375
  .tree-link span {
@@ -309,7 +378,6 @@
309
378
  overflow: hidden;
310
379
  text-overflow: ellipsis;
311
380
  white-space: nowrap;
312
- color: inherit;
313
381
  font-size: 13px;
314
382
  }
315
383
 
@@ -322,34 +390,42 @@
322
390
  }
323
391
 
324
392
  .tree-sub {
325
- padding-left: 12px;
393
+ padding-left: 10px;
326
394
  }
327
395
 
328
396
  .tree-badge {
329
397
  font-size: 10.5px;
330
- padding: 1px 7px;
398
+ padding: 1px 6px;
331
399
  border-radius: 99px;
332
- background: var(--primary-light-color-ml);
333
- color: var(--primary-dark-color-ml);
400
+ background: #e2e8f0;
401
+ color: var(--text-secondary);
334
402
  font-weight: 600;
335
403
  }
336
404
 
337
- /* Sidebar Storage & Bucket Section */
405
+ .tree-link.active .tree-badge {
406
+ background: #ccfbf1;
407
+ color: var(--primary-dark-color-ml);
408
+ }
409
+
410
+ /* ==========================================================================
411
+ Sidebar Storage & Bucket Switcher
412
+ ========================================================================== */
338
413
  .fm-storage {
339
414
  margin-top: auto;
340
415
  padding: 12px;
341
416
  border-top: 1px solid var(--border-color);
342
- background: rgba(255, 255, 255, 0.85);
343
- border-radius: var(--radius);
344
- box-shadow: 0 2px 8px rgba(15, 118, 110, 0.05);
417
+ background: #ffffff;
418
+ border-radius: var(--radius-sm);
419
+ border: 1px solid var(--border-color);
420
+ box-shadow: var(--shadow-xs);
345
421
  }
346
422
 
347
423
  .fm-storage-label {
348
- font-size: 10.5px;
424
+ font-size: 11px;
349
425
  font-weight: 700;
350
426
  text-transform: uppercase;
351
- letter-spacing: 0.5px;
352
- color: var(--primary-dark-color-ml);
427
+ letter-spacing: 0.05em;
428
+ color: var(--text-muted);
353
429
  margin-bottom: 6px;
354
430
  }
355
431
 
@@ -365,70 +441,76 @@
365
441
 
366
442
  .bucket-switcher-icon {
367
443
  position: absolute;
368
- left: 10px;
369
- color: var(--primary-color-ml);
444
+ left: 9px;
445
+ color: var(--primary);
370
446
  pointer-events: none;
371
447
  }
372
448
 
373
449
  .bucket-switcher-select {
374
450
  width: 100%;
375
- padding: 6px 10px 6px 30px;
451
+ padding: 6px 10px 6px 28px;
376
452
  font-family: var(--font);
377
453
  font-size: 12.5px;
378
454
  font-weight: 600;
379
- color: var(--dark-color-ml);
380
- background: var(--light-color-ml);
455
+ color: var(--text);
456
+ background: #ffffff;
381
457
  border: 1px solid var(--border-color);
382
458
  border-radius: var(--radius-sm);
383
459
  outline: none;
384
460
  cursor: pointer;
385
461
  appearance: auto;
386
- transition: border-color 0.15s ease;
462
+ transition: border-color 0.12s ease, box-shadow 0.12s ease;
387
463
  }
388
464
 
389
465
  .bucket-switcher-select:focus {
390
- border-color: var(--primary-color-ml);
466
+ border-color: var(--primary);
467
+ box-shadow: 0 0 0 2px rgba(15, 118, 110, 0.15);
391
468
  }
392
469
 
393
470
  .bucket-switcher-status {
394
471
  font-size: 11px;
395
- color: var(--primary-color-ml);
472
+ color: var(--primary);
396
473
  margin-top: 4px;
397
474
  display: block;
398
475
  }
399
476
 
477
+ .bucket-switcher-status.is-hidden {
478
+ display: none;
479
+ }
480
+
400
481
  .storage-bar {
401
- height: 5px;
402
- background: var(--gray-light-color-ml);
403
- border-radius: 3px;
482
+ height: 4px;
483
+ background: #f1f5f9;
484
+ border-radius: 2px;
404
485
  overflow: hidden;
405
486
  margin: 8px 0 6px;
406
487
  }
407
488
 
408
489
  .fm-storage-meta {
409
490
  font-size: 11.5px;
410
- color: var(--gray-color-ml);
411
- font-weight: 600;
491
+ color: var(--text-muted);
492
+ font-weight: 500;
412
493
  }
413
494
 
414
495
  .fm-storage-subinfo {
415
- font-size: 10.5px;
416
- color: var(--gray-color-ml);
496
+ font-size: 11px;
497
+ color: var(--text-muted);
417
498
  margin-top: 2px;
418
499
  white-space: nowrap;
419
500
  overflow: hidden;
420
501
  text-overflow: ellipsis;
421
502
  }
422
503
 
423
- /* Main Content Area */
504
+ /* ==========================================================================
505
+ Main Content Area & Toolbar
506
+ ========================================================================== */
424
507
  .fm-main {
425
508
  display: flex;
426
509
  flex-direction: column;
427
510
  min-height: 0;
428
- background: rgba(255, 255, 255, 0.9);
511
+ background: #ffffff;
429
512
  }
430
513
 
431
- /* Toolbar */
432
514
  .fm-toolbar {
433
515
  display: flex;
434
516
  align-items: center;
@@ -437,14 +519,14 @@
437
519
  padding: 10px 16px;
438
520
  border-bottom: 1px solid var(--border-color);
439
521
  flex-shrink: 0;
440
- background: rgba(255, 255, 255, 0.7);
522
+ background: #ffffff;
441
523
  flex-wrap: wrap;
442
524
  }
443
525
 
444
526
  .fm-breadcrumb {
445
527
  display: flex;
446
528
  align-items: center;
447
- gap: 5px;
529
+ gap: 4px;
448
530
  flex-wrap: wrap;
449
531
  min-height: 32px;
450
532
  }
@@ -454,11 +536,11 @@
454
536
  border: none;
455
537
  font-family: var(--font);
456
538
  font-size: 13px;
457
- color: var(--gray-color-ml);
539
+ color: var(--text-muted);
458
540
  cursor: pointer;
459
- padding: 3px 8px;
541
+ padding: 3px 6px;
460
542
  border-radius: var(--radius-sm);
461
- transition: all 0.12s ease;
543
+ transition: background-color 0.12s ease, color 0.12s ease;
462
544
  display: inline-flex;
463
545
  align-items: center;
464
546
  gap: 4px;
@@ -466,13 +548,13 @@
466
548
  }
467
549
 
468
550
  .bc-link:hover {
469
- background: var(--primary-light-color-ml);
470
- color: var(--primary-dark-color-ml);
551
+ background: #f1f5f9;
552
+ color: var(--text);
471
553
  }
472
554
 
473
555
  .bc-link.current {
474
- color: var(--dark-color-ml);
475
- font-weight: 700;
556
+ color: var(--text);
557
+ font-weight: 600;
476
558
  cursor: default;
477
559
  }
478
560
 
@@ -481,25 +563,26 @@
481
563
  }
482
564
 
483
565
  .fm-breadcrumb .sep {
484
- color: var(--gray-color-ml);
485
- font-size: 13px;
566
+ color: #cbd5e1;
567
+ font-size: 12px;
486
568
  user-select: none;
487
569
  }
488
570
 
489
571
  .fm-toolbar-actions {
490
572
  display: flex;
491
573
  align-items: center;
492
- gap: 10px;
574
+ gap: 8px;
493
575
  margin-left: auto;
494
576
  }
495
577
 
496
- /* Quick Filters */
578
+ /* Quick Filters - Segmented Control */
497
579
  .quick-filter-group {
498
580
  display: inline-flex;
499
- background: rgba(15, 118, 110, 0.06);
581
+ background: #f1f5f9;
500
582
  border: 1px solid var(--border-color);
501
- border-radius: var(--radius);
583
+ border-radius: var(--radius-sm);
502
584
  padding: 2px;
585
+ gap: 2px;
503
586
  }
504
587
 
505
588
  .quick-filter-btn {
@@ -507,28 +590,29 @@
507
590
  border: none;
508
591
  font-family: var(--font);
509
592
  font-size: 12px;
510
- font-weight: 600;
593
+ font-weight: 500;
511
594
  color: var(--text-secondary);
512
- padding: 4px 11px;
513
- border-radius: var(--radius-sm);
595
+ padding: 3px 9px;
596
+ border-radius: 4px;
514
597
  cursor: pointer;
515
- transition: all 0.12s ease;
598
+ transition: background-color 0.12s ease, color 0.12s ease;
516
599
  }
517
600
 
518
601
  .quick-filter-btn:hover {
519
- color: var(--primary-dark-color-ml);
602
+ color: var(--text);
520
603
  }
521
604
 
522
605
  .quick-filter-btn.active {
523
606
  background: #ffffff;
524
- color: var(--primary-color-ml);
525
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
607
+ color: var(--primary-dark-color-ml);
608
+ font-weight: 600;
609
+ box-shadow: var(--shadow-xs);
526
610
  }
527
611
 
528
612
  /* Search Box */
529
613
  .search-box {
530
614
  position: relative;
531
- width: 210px;
615
+ width: 200px;
532
616
  display: flex;
533
617
  align-items: center;
534
618
  }
@@ -538,27 +622,26 @@
538
622
  left: 9px;
539
623
  width: 14px;
540
624
  height: 14px;
541
- color: var(--gray-color-ml);
625
+ color: var(--text-muted);
542
626
  pointer-events: none;
543
627
  }
544
628
 
545
629
  .search-box input {
546
630
  width: 100%;
547
- padding: 6px 26px 6px 28px;
631
+ padding: 5px 24px 5px 28px;
548
632
  font-family: var(--font);
549
633
  font-size: 12.5px;
550
634
  border: 1px solid var(--border-color);
551
- border-radius: var(--radius);
552
- background: rgba(255, 255, 255, 0.85);
553
- color: var(--dark-color-ml);
635
+ border-radius: var(--radius-sm);
636
+ background: #ffffff;
637
+ color: var(--text);
554
638
  outline: none;
555
- transition: all 0.15s ease;
639
+ transition: border-color 0.12s ease, box-shadow 0.12s ease;
556
640
  }
557
641
 
558
642
  .search-box input:focus {
559
- border-color: var(--primary-color-ml);
560
- background: #ffffff;
561
- box-shadow: 0 0 0 3px var(--primary-light-color-ml);
643
+ border-color: var(--primary);
644
+ box-shadow: 0 0 0 2px rgba(15, 118, 110, 0.15);
562
645
  }
563
646
 
564
647
  .search-clear-btn {
@@ -566,38 +649,42 @@
566
649
  right: 6px;
567
650
  background: transparent;
568
651
  border: none;
569
- color: var(--gray-color-ml);
652
+ color: var(--text-muted);
570
653
  cursor: pointer;
571
- font-size: 16px;
654
+ font-size: 15px;
572
655
  line-height: 1;
573
- padding: 2px 4px;
656
+ padding: 2px;
657
+ }
658
+
659
+ .search-clear-btn:hover {
660
+ color: var(--text);
574
661
  }
575
662
 
576
663
  /* View Switcher */
577
664
  .fm-view-toggle {
578
665
  display: inline-flex;
579
666
  border: 1px solid var(--border-color);
580
- border-radius: var(--radius);
667
+ border-radius: var(--radius-sm);
581
668
  overflow: hidden;
582
669
  background: #ffffff;
583
670
  }
584
671
 
585
672
  .view-btn {
586
- width: 32px;
587
- height: 30px;
673
+ width: 30px;
674
+ height: 28px;
588
675
  border: none;
589
676
  background: transparent;
590
677
  cursor: pointer;
591
- color: var(--gray-color-ml);
678
+ color: var(--text-muted);
592
679
  display: flex;
593
680
  align-items: center;
594
681
  justify-content: center;
595
- transition: all 0.12s ease;
682
+ transition: background-color 0.12s ease, color 0.12s ease;
596
683
  }
597
684
 
598
685
  .view-btn:hover {
599
- background: var(--light-color-ml);
600
- color: var(--dark-color-ml);
686
+ background: #f1f5f9;
687
+ color: var(--text);
601
688
  }
602
689
 
603
690
  .view-btn.active {
@@ -605,19 +692,27 @@
605
692
  color: var(--primary-dark-color-ml);
606
693
  }
607
694
 
608
- /* File Grid Wrap & Items */
695
+ .view-btn#view-thumbs {
696
+ border-left: 1px solid var(--border-color);
697
+ }
698
+
699
+ /* ==========================================================================
700
+ File Grid Container & Grid Items
701
+ ========================================================================== */
609
702
  .fm-grid-wrap {
610
703
  flex: 1 1 auto;
611
704
  overflow-y: auto;
612
705
  padding: 16px;
613
706
  position: relative;
707
+ background: #ffffff;
614
708
  }
615
709
 
616
710
  .fm-grid-wrap::-webkit-scrollbar {
617
711
  width: 6px;
618
712
  }
713
+
619
714
  .fm-grid-wrap::-webkit-scrollbar-thumb {
620
- background: var(--gray-light-color-ml);
715
+ background: #cbd5e1;
621
716
  border-radius: 3px;
622
717
  }
623
718
 
@@ -627,35 +722,34 @@
627
722
  grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
628
723
  grid-auto-rows: max-content;
629
724
  align-content: start;
630
- gap: 14px;
725
+ gap: 12px;
631
726
  }
632
727
 
633
728
  .fm-item {
634
729
  position: relative;
635
- background: rgba(255, 255, 255, 0.95);
636
- border: 1px solid rgba(15, 118, 110, 0.15);
637
- border-radius: var(--radius-lg);
730
+ background: #ffffff;
731
+ border: 1px solid var(--border-color);
732
+ border-radius: var(--radius);
638
733
  cursor: pointer;
639
734
  font-family: var(--font);
640
735
  text-align: left;
641
- transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
736
+ transition: border-color 0.12s ease, box-shadow 0.12s ease, background-color 0.12s ease;
642
737
  user-select: none;
643
738
  }
644
739
 
645
740
  .fm-item:hover {
646
- border-color: var(--primary-color-ml);
647
- transform: translateY(-2px);
648
- box-shadow: 0 8px 20px rgba(15, 118, 110, 0.1);
741
+ border-color: #cbd5e1;
742
+ box-shadow: var(--shadow-sm);
649
743
  }
650
744
 
651
745
  .fm-item.is-selected {
652
- border-color: var(--primary-color-ml);
746
+ border-color: var(--primary);
653
747
  background: var(--primary-light-color-ml);
654
748
  }
655
749
 
656
- /* Item styling in Grid View */
750
+ /* Item in Grid View */
657
751
  .fm-grid.view-grid .fm-item {
658
- padding: 12px;
752
+ padding: 10px;
659
753
  display: flex;
660
754
  flex-direction: column;
661
755
  align-items: flex-start;
@@ -665,25 +759,22 @@
665
759
  .fm-grid.view-grid .fm-item-icon {
666
760
  width: 100%;
667
761
  aspect-ratio: 16 / 10;
668
- border-radius: var(--radius);
762
+ border-radius: var(--radius-sm);
669
763
  display: flex;
670
764
  align-items: center;
671
765
  justify-content: center;
672
766
  flex-shrink: 0;
673
- background: var(--light-color-ml);
767
+ background: #f8fafc;
768
+ border: 1px solid var(--border-color-light);
674
769
  overflow: hidden;
675
770
  position: relative;
676
771
  }
677
772
 
678
- .view-btn#view-thumbs {
679
- border-left: 1px solid var(--border-color);
680
- }
681
-
682
773
  .fm-item-thumb {
683
774
  width: 100%;
684
775
  height: 100%;
685
776
  object-fit: cover;
686
- transition: opacity 0.25s ease-in-out;
777
+ transition: opacity 0.2s ease;
687
778
  }
688
779
 
689
780
  .fm-item-thumb.fm-lazy-thumb {
@@ -695,15 +786,17 @@
695
786
  }
696
787
 
697
788
  .fm-item-icon .ext {
698
- font-size: 13px;
789
+ font-size: 11px;
699
790
  font-weight: 700;
700
- letter-spacing: 0.6px;
791
+ letter-spacing: 0.04em;
701
792
  text-transform: uppercase;
793
+ padding: 2px 7px;
794
+ border-radius: 4px;
702
795
  }
703
796
 
704
797
  .fm-item-icon .folder-svg {
705
- width: 42px;
706
- height: 42px;
798
+ width: 40px;
799
+ height: 40px;
707
800
  }
708
801
 
709
802
  .fm-grid.view-grid .fm-item-details {
@@ -712,31 +805,32 @@
712
805
  }
713
806
 
714
807
  .fm-item-name {
715
- font-size: 13px;
808
+ font-size: 12.5px;
716
809
  font-weight: 600;
717
- color: var(--dark-color-ml);
810
+ color: var(--text);
718
811
  overflow: hidden;
719
812
  text-overflow: ellipsis;
720
813
  white-space: nowrap;
721
814
  min-width: 0;
815
+ line-height: 1.35;
722
816
  }
723
817
 
724
818
  .fm-item-meta {
725
- font-size: 11.5px;
726
- color: var(--gray-color-ml);
819
+ font-size: 11px;
820
+ color: var(--text-muted);
727
821
  margin-top: 2px;
728
822
  white-space: nowrap;
729
823
  overflow: hidden;
730
824
  text-overflow: ellipsis;
731
825
  }
732
826
 
733
- /* Star & Context Menu Buttons */
827
+ /* Star & Menu Action Triggers */
734
828
  .fm-star {
735
829
  position: absolute;
736
- top: 8px;
737
- left: 8px;
738
- width: 24px;
739
- height: 24px;
830
+ top: 6px;
831
+ left: 6px;
832
+ width: 22px;
833
+ height: 22px;
740
834
  display: flex;
741
835
  align-items: center;
742
836
  justify-content: center;
@@ -744,11 +838,11 @@
744
838
  border-radius: 50%;
745
839
  color: var(--text-disabled);
746
840
  opacity: 0;
747
- background: rgba(255, 255, 255, 0.9);
748
- backdrop-filter: blur(4px);
841
+ background: #ffffff;
842
+ border: 1px solid var(--border-color);
843
+ box-shadow: var(--shadow-xs);
749
844
  transition: opacity 0.12s ease, color 0.12s ease;
750
845
  z-index: 2;
751
- border: none;
752
846
  }
753
847
 
754
848
  .fm-item:hover .fm-star,
@@ -757,32 +851,31 @@
757
851
  }
758
852
 
759
853
  .fm-star.on {
760
- color: var(--yellow);
854
+ color: #eab308;
761
855
  opacity: 1;
762
856
  }
763
857
 
764
858
  .fm-star:hover {
765
- color: var(--yellow);
766
- transform: scale(1.1);
859
+ color: #eab308;
767
860
  }
768
861
 
769
862
  .fm-item-menu {
770
863
  position: absolute;
771
- top: 8px;
772
- right: 8px;
773
- width: 24px;
774
- height: 24px;
775
- border: none;
776
- background: rgba(255, 255, 255, 0.9);
777
- backdrop-filter: blur(4px);
864
+ top: 6px;
865
+ right: 6px;
866
+ width: 22px;
867
+ height: 22px;
868
+ border: 1px solid var(--border-color);
869
+ background: #ffffff;
778
870
  border-radius: 50%;
779
871
  display: flex;
780
872
  align-items: center;
781
873
  justify-content: center;
782
874
  cursor: pointer;
783
- color: var(--gray-color-ml);
875
+ color: var(--text-muted);
784
876
  opacity: 0;
785
- transition: opacity 0.12s ease, background 0.12s ease, color 0.12s ease;
877
+ box-shadow: var(--shadow-xs);
878
+ transition: opacity 0.12s ease, color 0.12s ease, background-color 0.12s ease;
786
879
  z-index: 2;
787
880
  }
788
881
 
@@ -791,45 +884,59 @@
791
884
  }
792
885
 
793
886
  .fm-item-menu:hover {
794
- background: #ffffff;
795
- color: var(--primary-dark-color-ml);
796
- box-shadow: var(--shadow-sm);
887
+ background: #f8fafc;
888
+ color: var(--text);
797
889
  }
798
890
 
799
- /* List View */
891
+ /* ==========================================================================
892
+ List View
893
+ ========================================================================== */
800
894
  .fm-grid.view-list {
801
895
  display: flex;
802
896
  flex-direction: column;
803
- gap: 4px;
897
+ gap: 2px;
804
898
  }
805
899
 
806
900
  .fm-grid.view-list .fm-item {
807
- padding: 8px 14px;
901
+ padding: 6px 12px;
808
902
  display: grid;
809
- grid-template-columns: 20px 32px 1fr 110px 140px 32px 32px;
810
- gap: 12px;
903
+ grid-template-columns: 20px 30px 1fr 110px 140px 28px 28px;
904
+ gap: 10px;
811
905
  align-items: center;
812
- border-radius: var(--radius);
906
+ border-radius: var(--radius-sm);
907
+ border: 1px solid transparent;
908
+ }
909
+
910
+ .fm-grid.view-list .fm-item:hover {
911
+ background: #f8fafc;
912
+ border-color: var(--border-color);
913
+ }
914
+
915
+ .fm-grid.view-list .fm-item.is-selected {
916
+ background: var(--primary-light-color-ml);
917
+ border-color: #ccfbf1;
813
918
  }
814
919
 
815
920
  .fm-grid.view-list .fm-item-icon {
816
- width: 32px;
817
- height: 32px;
818
- border-radius: var(--radius-sm);
921
+ width: 28px;
922
+ height: 28px;
923
+ border-radius: 4px;
819
924
  display: flex;
820
925
  align-items: center;
821
926
  justify-content: center;
822
- background: var(--light-color-ml);
927
+ background: #f8fafc;
928
+ border: 1px solid var(--border-color-light);
823
929
  }
824
930
 
825
931
  .fm-grid.view-list .fm-item-icon .ext {
826
- font-size: 10.5px;
932
+ font-size: 10px;
827
933
  font-weight: 700;
934
+ padding: 1px 4px;
828
935
  }
829
936
 
830
937
  .fm-grid.view-list .fm-item-icon .folder-svg {
831
- width: 22px;
832
- height: 22px;
938
+ width: 20px;
939
+ height: 20px;
833
940
  }
834
941
 
835
942
  .fm-grid.view-list .fm-star,
@@ -837,6 +944,8 @@
837
944
  position: static;
838
945
  opacity: 1;
839
946
  background: transparent;
947
+ border: none;
948
+ box-shadow: none;
840
949
  }
841
950
 
842
951
  .fm-grid.view-list .fm-item-meta {
@@ -844,27 +953,28 @@
844
953
  margin-top: 0;
845
954
  }
846
955
 
847
- /* Header row for list view */
848
956
  .fm-list-header {
849
957
  display: grid;
850
- grid-template-columns: 20px 32px 1fr 110px 140px 32px 32px;
851
- gap: 12px;
958
+ grid-template-columns: 20px 30px 1fr 110px 140px 28px 28px;
959
+ gap: 10px;
852
960
  align-items: center;
853
- padding: 6px 14px;
961
+ padding: 6px 12px;
854
962
  font-size: 11px;
855
963
  font-weight: 700;
856
964
  text-transform: uppercase;
857
- letter-spacing: 0.5px;
858
- color: var(--primary-dark-color-ml);
965
+ letter-spacing: 0.05em;
966
+ color: var(--text-muted);
859
967
  border-bottom: 1px solid var(--border-color);
860
- margin-bottom: 4px;
968
+ margin-bottom: 2px;
861
969
  }
862
970
 
863
- /* Empty State */
971
+ /* ==========================================================================
972
+ Empty State & Skeletons
973
+ ========================================================================== */
864
974
  .fm-empty {
865
- padding: 80px 20px;
975
+ padding: 64px 20px;
866
976
  text-align: center;
867
- color: var(--gray-color-ml);
977
+ color: var(--text-muted);
868
978
  display: flex;
869
979
  flex-direction: column;
870
980
  align-items: center;
@@ -877,7 +987,7 @@
877
987
  }
878
988
 
879
989
  .fm-empty svg {
880
- color: var(--text-disabled);
990
+ color: #cbd5e1;
881
991
  margin-bottom: 12px;
882
992
  }
883
993
 
@@ -885,28 +995,28 @@
885
995
  font-family: var(--font-headings);
886
996
  font-size: 15px;
887
997
  font-weight: 700;
888
- color: var(--dark-color-ml);
998
+ color: var(--text);
889
999
  margin-bottom: 4px;
890
1000
  }
891
1001
 
892
1002
  .fm-empty .empty-desc {
893
1003
  font-size: 13px;
894
1004
  max-width: 360px;
1005
+ color: var(--text-secondary);
895
1006
  }
896
1007
 
897
- /* Skeletons */
898
1008
  .fm-skeleton-grid {
899
1009
  display: grid;
900
1010
  grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
901
- gap: 14px;
1011
+ gap: 12px;
902
1012
  width: 100%;
903
1013
  }
904
1014
 
905
1015
  .fm-skeleton-card {
906
- background: rgba(255, 255, 255, 0.8);
907
- border: 1px solid var(--border-color-light);
908
- border-radius: var(--radius-lg);
909
- padding: 12px;
1016
+ background: #ffffff;
1017
+ border: 1px solid var(--border-color);
1018
+ border-radius: var(--radius);
1019
+ padding: 10px;
910
1020
  display: flex;
911
1021
  flex-direction: column;
912
1022
  gap: 8px;
@@ -915,16 +1025,16 @@
915
1025
  .fm-skeleton-icon {
916
1026
  width: 100%;
917
1027
  aspect-ratio: 16 / 10;
918
- border-radius: var(--radius);
919
- background: linear-gradient(90deg, #eaf2ee 25%, #dce8e3 50%, #eaf2ee 75%);
1028
+ border-radius: var(--radius-sm);
1029
+ background: linear-gradient(90deg, #f1f5f9 25%, #e2e8f0 50%, #f1f5f9 75%);
920
1030
  background-size: 200% 100%;
921
1031
  animation: fm-shimmer 1.5s infinite;
922
1032
  }
923
1033
 
924
1034
  .fm-skeleton-line {
925
- height: 12px;
1035
+ height: 10px;
926
1036
  border-radius: 4px;
927
- background: linear-gradient(90deg, #eaf2ee 25%, #dce8e3 50%, #eaf2ee 75%);
1037
+ background: linear-gradient(90deg, #f1f5f9 25%, #e2e8f0 50%, #f1f5f9 75%);
928
1038
  background-size: 200% 100%;
929
1039
  animation: fm-shimmer 1.5s infinite;
930
1040
  }
@@ -937,22 +1047,23 @@
937
1047
  100% { background-position: -200% 0; }
938
1048
  }
939
1049
 
940
- /* Context Menu */
1050
+ /* ==========================================================================
1051
+ Context Menu
1052
+ ========================================================================== */
941
1053
  .fm-context-menu {
942
1054
  position: fixed;
943
1055
  z-index: 1000;
944
- background: rgba(255, 255, 255, 0.95);
945
- backdrop-filter: blur(12px);
1056
+ background: #ffffff;
946
1057
  border: 1px solid var(--border-color);
947
- border-radius: var(--radius-lg);
1058
+ border-radius: var(--radius-sm);
948
1059
  box-shadow: var(--shadow-dropdown);
949
- padding: 6px;
950
- min-width: 175px;
951
- animation: fm-menu-pop 0.12s cubic-bezier(0.16, 1, 0.3, 1);
1060
+ padding: 4px;
1061
+ min-width: 165px;
1062
+ animation: fm-menu-pop 0.1s cubic-bezier(0.16, 1, 0.3, 1);
952
1063
  }
953
1064
 
954
1065
  @keyframes fm-menu-pop {
955
- from { opacity: 0; transform: scale(0.95); }
1066
+ from { opacity: 0; transform: scale(0.96); }
956
1067
  to { opacity: 1; transform: scale(1); }
957
1068
  }
958
1069
 
@@ -961,21 +1072,21 @@
961
1072
  align-items: center;
962
1073
  gap: 8px;
963
1074
  width: 100%;
964
- padding: 7px 11px;
1075
+ padding: 6px 10px;
965
1076
  border: none;
966
1077
  background: transparent;
967
1078
  font-family: var(--font);
968
1079
  font-size: 12.5px;
969
1080
  font-weight: 500;
970
- color: var(--dark-color-ml);
971
- border-radius: var(--radius-sm);
1081
+ color: var(--text);
1082
+ border-radius: 4px;
972
1083
  cursor: pointer;
973
1084
  text-align: left;
974
- transition: background 0.1s ease, color 0.1s ease;
1085
+ transition: background-color 0.1s ease, color 0.1s ease;
975
1086
  }
976
1087
 
977
1088
  .fm-context-item:hover {
978
- background: var(--primary-light-color-ml);
1089
+ background: #f1f5f9;
979
1090
  color: var(--primary-dark-color-ml);
980
1091
  }
981
1092
 
@@ -986,11 +1097,13 @@
986
1097
 
987
1098
  .fm-context-divider {
988
1099
  height: 1px;
989
- background: var(--border-color-light);
990
- margin: 4px 0;
1100
+ background: var(--border-color);
1101
+ margin: 3px 0;
991
1102
  }
992
1103
 
993
- /* Modals */
1104
+ /* ==========================================================================
1105
+ Modals & Dialogs
1106
+ ========================================================================== */
994
1107
  .modal {
995
1108
  display: none;
996
1109
  position: fixed;
@@ -998,8 +1111,8 @@
998
1111
  z-index: 1050;
999
1112
  overflow-x: hidden;
1000
1113
  overflow-y: auto;
1001
- background: rgba(15, 42, 42, 0.45);
1002
- backdrop-filter: blur(6px);
1114
+ background: rgba(15, 23, 42, 0.5);
1115
+ backdrop-filter: blur(4px);
1003
1116
  align-items: center;
1004
1117
  justify-content: center;
1005
1118
  padding: 1rem;
@@ -1014,7 +1127,7 @@
1014
1127
  width: 100%;
1015
1128
  max-width: 480px;
1016
1129
  margin: auto;
1017
- animation: modal-enter 0.2s cubic-bezier(0.16, 1, 0.3, 1);
1130
+ animation: modal-enter 0.18s cubic-bezier(0.16, 1, 0.3, 1);
1018
1131
  }
1019
1132
 
1020
1133
  .modal-dialog.modal-lg {
@@ -1039,7 +1152,7 @@
1039
1152
  }
1040
1153
 
1041
1154
  @keyframes modal-enter {
1042
- from { opacity: 0; transform: translateY(-12px) scale(0.98); }
1155
+ from { opacity: 0; transform: translateY(-8px) scale(0.98); }
1043
1156
  to { opacity: 1; transform: translateY(0) scale(1); }
1044
1157
  }
1045
1158
 
@@ -1051,16 +1164,18 @@
1051
1164
  background: #ffffff;
1052
1165
  border: 1px solid var(--border-color);
1053
1166
  border-radius: var(--radius-xl);
1054
- box-shadow: 0 20px 40px rgba(15, 42, 42, 0.16);
1167
+ box-shadow: var(--shadow-dropdown);
1055
1168
  outline: 0;
1169
+ overflow: hidden;
1056
1170
  }
1057
1171
 
1058
1172
  .modal-header {
1059
1173
  display: flex;
1060
1174
  align-items: center;
1061
1175
  justify-content: space-between;
1062
- padding: 14px 18px;
1176
+ padding: 12px 18px;
1063
1177
  border-bottom: 1px solid var(--border-color);
1178
+ background: #ffffff;
1064
1179
  }
1065
1180
 
1066
1181
  .modal-title {
@@ -1070,12 +1185,12 @@
1070
1185
  gap: 8px;
1071
1186
  font-size: 15px;
1072
1187
  font-weight: 700;
1073
- color: var(--primary-dark-color-ml);
1188
+ color: var(--text);
1074
1189
  margin: 0;
1075
1190
  }
1076
1191
 
1077
1192
  .modal-title-icon {
1078
- color: var(--primary-color-ml);
1193
+ color: var(--primary);
1079
1194
  }
1080
1195
 
1081
1196
  .btn-close {
@@ -1083,16 +1198,16 @@
1083
1198
  border: none;
1084
1199
  font-size: 20px;
1085
1200
  line-height: 1;
1086
- color: var(--gray-color-ml);
1201
+ color: var(--text-muted);
1087
1202
  cursor: pointer;
1088
1203
  padding: 4px;
1089
1204
  border-radius: var(--radius-sm);
1090
- transition: all 0.12s ease;
1205
+ transition: color 0.12s ease, background-color 0.12s ease;
1091
1206
  }
1092
1207
 
1093
1208
  .btn-close:hover {
1094
- color: var(--dark-color-ml);
1095
- background: var(--light-color-ml);
1209
+ color: var(--text);
1210
+ background: #f1f5f9;
1096
1211
  }
1097
1212
 
1098
1213
  .modal-body {
@@ -1108,48 +1223,48 @@
1108
1223
  gap: 8px;
1109
1224
  padding: 12px 18px;
1110
1225
  border-top: 1px solid var(--border-color);
1111
- background: var(--light-color-ml);
1112
- border-bottom-left-radius: var(--radius-xl);
1113
- border-bottom-right-radius: var(--radius-xl);
1226
+ background: #f8fafc;
1114
1227
  }
1115
1228
 
1116
- /* Upload Dropzone & Queue */
1229
+ /* ==========================================================================
1230
+ Upload Dropzone & Queue
1231
+ ========================================================================== */
1117
1232
  .upload-drop-zone {
1118
- border: 2px dashed var(--primary-color-ml);
1119
- border-radius: var(--radius-lg);
1120
- padding: 32px 20px;
1233
+ border: 1.5px dashed #cbd5e1;
1234
+ border-radius: var(--radius);
1235
+ padding: 28px 16px;
1121
1236
  text-align: center;
1122
- background: var(--primary-light-color-ml);
1237
+ background: #f8fafc;
1123
1238
  cursor: pointer;
1124
- transition: all 0.15s ease;
1239
+ transition: border-color 0.12s ease, background-color 0.12s ease;
1125
1240
  }
1126
1241
 
1127
1242
  .upload-drop-zone:hover,
1128
1243
  .upload-drop-zone.dragover {
1129
- border-color: var(--primary-dark-color-ml);
1130
- background: #c5efe7;
1244
+ border-color: var(--primary);
1245
+ background: var(--primary-light-color-ml);
1131
1246
  }
1132
1247
 
1133
1248
  .drop-icon {
1134
- color: var(--primary-color-ml);
1135
- margin-bottom: 10px;
1249
+ color: var(--primary);
1250
+ margin-bottom: 8px;
1136
1251
  }
1137
1252
 
1138
1253
  .drop-text {
1139
- font-size: 14px;
1254
+ font-size: 13.5px;
1140
1255
  font-weight: 600;
1141
- color: var(--dark-color-ml);
1256
+ color: var(--text);
1142
1257
  }
1143
1258
 
1144
1259
  .drop-browse-link {
1145
- color: var(--primary-color-ml);
1260
+ color: var(--primary);
1146
1261
  text-decoration: underline;
1147
1262
  cursor: pointer;
1148
1263
  }
1149
1264
 
1150
1265
  .drop-hint {
1151
- font-size: 12px;
1152
- color: var(--gray-color-ml);
1266
+ font-size: 11.5px;
1267
+ color: var(--text-muted);
1153
1268
  margin-top: 4px;
1154
1269
  }
1155
1270
 
@@ -1159,6 +1274,7 @@
1159
1274
  display: flex;
1160
1275
  flex-direction: column;
1161
1276
  gap: 6px;
1277
+ margin-top: 12px;
1162
1278
  }
1163
1279
 
1164
1280
  .upload-queue-item {
@@ -1166,81 +1282,127 @@
1166
1282
  align-items: center;
1167
1283
  justify-content: space-between;
1168
1284
  padding: 8px 12px;
1169
- background: var(--light-color-ml);
1285
+ background: #f8fafc;
1170
1286
  border: 1px solid var(--border-color);
1171
- border-radius: var(--radius);
1287
+ border-radius: var(--radius-sm);
1172
1288
  font-size: 12.5px;
1173
1289
  }
1174
1290
 
1175
1291
  .upload-queue-meta {
1176
- color: var(--gray-color-ml);
1292
+ color: var(--text-muted);
1177
1293
  font-size: 11.5px;
1178
1294
  }
1179
1295
 
1180
1296
  .progress-bar-wrap {
1181
- height: 6px;
1182
- background: var(--gray-light-color-ml);
1183
- border-radius: 3px;
1297
+ height: 4px;
1298
+ background: #e2e8f0;
1299
+ border-radius: 2px;
1184
1300
  overflow: hidden;
1185
1301
  }
1186
1302
 
1187
1303
  .progress-bar-inner {
1188
1304
  height: 100%;
1189
- background: var(--primary-color-ml);
1190
- transition: width 0.2s ease;
1305
+ background: var(--primary);
1306
+ transition: width 0.18s ease;
1191
1307
  }
1192
1308
 
1193
1309
  .upload-percent {
1194
1310
  font-size: 12px;
1195
1311
  font-weight: 700;
1196
- color: var(--primary-color-ml);
1312
+ color: var(--primary);
1197
1313
  }
1198
1314
 
1199
- /* Modal Form Inputs */
1315
+ /* Form Controls in Modals */
1200
1316
  .form-label {
1201
1317
  font-size: 12.5px;
1202
1318
  font-weight: 600;
1203
- color: var(--dark-color-ml);
1204
- margin-bottom: 6px;
1319
+ color: var(--text);
1320
+ margin-bottom: 5px;
1205
1321
  display: block;
1206
1322
  }
1207
1323
 
1208
1324
  .form-control {
1209
1325
  width: 100%;
1210
- padding: 8px 12px;
1326
+ padding: 7px 11px;
1211
1327
  font-family: var(--font);
1212
1328
  font-size: 13px;
1213
- color: var(--dark-color-ml);
1329
+ color: var(--text);
1214
1330
  background: #ffffff;
1215
1331
  border: 1px solid var(--border-color);
1216
- border-radius: var(--radius);
1332
+ border-radius: var(--radius-sm);
1217
1333
  outline: none;
1218
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
1334
+ transition: border-color 0.12s ease, box-shadow 0.12s ease;
1219
1335
  }
1220
1336
 
1221
1337
  .form-control:focus {
1222
- border-color: var(--primary-color-ml);
1223
- box-shadow: 0 0 0 3px var(--primary-light-color-ml);
1338
+ border-color: var(--primary);
1339
+ box-shadow: 0 0 0 2px rgba(15, 118, 110, 0.15);
1224
1340
  }
1225
1341
 
1226
1342
  .form-text {
1227
1343
  font-size: 11.5px;
1228
- color: var(--gray-color-ml);
1344
+ color: var(--text-muted);
1229
1345
  margin-top: 4px;
1230
1346
  }
1231
1347
 
1232
- /* Preview Modal Content */
1233
- .preview-content {
1234
- max-height: 70vh;
1235
- overflow: auto;
1348
+ /* ==========================================================================
1349
+ Preview Modal Content
1350
+ ========================================================================== */
1351
+ .preview-modal-header {
1236
1352
  display: flex;
1237
1353
  align-items: center;
1238
- justify-content: center;
1239
- background: #152222;
1240
- min-height: 280px;
1241
- }
1242
-
1243
- .preview-content img {
1354
+ justify-content: space-between;
1355
+ padding: 10px 16px;
1356
+ background: #ffffff;
1357
+ color: var(--text);
1358
+ border-bottom: 1px solid var(--border-color);
1359
+ }
1360
+
1361
+ .preview-header-left {
1362
+ display: flex;
1363
+ align-items: center;
1364
+ gap: 12px;
1365
+ }
1366
+
1367
+ .preview-tabs {
1368
+ display: inline-flex;
1369
+ background: #f1f5f9;
1370
+ padding: 2px;
1371
+ border-radius: var(--radius-sm);
1372
+ gap: 2px;
1373
+ }
1374
+
1375
+ .preview-tab {
1376
+ background: transparent;
1377
+ border: none;
1378
+ color: var(--text-secondary);
1379
+ font-size: 12px;
1380
+ font-weight: 500;
1381
+ padding: 3px 9px;
1382
+ border-radius: 4px;
1383
+ cursor: pointer;
1384
+ transition: background-color 0.12s ease, color 0.12s ease;
1385
+ font-family: var(--font);
1386
+ }
1387
+
1388
+ .preview-tab.active {
1389
+ background: #ffffff;
1390
+ color: var(--primary-dark-color-ml);
1391
+ font-weight: 600;
1392
+ box-shadow: var(--shadow-xs);
1393
+ }
1394
+
1395
+ .preview-content {
1396
+ max-height: 70vh;
1397
+ overflow: auto;
1398
+ display: flex;
1399
+ align-items: center;
1400
+ justify-content: center;
1401
+ background: #09090b;
1402
+ min-height: 280px;
1403
+ }
1404
+
1405
+ .preview-content img {
1244
1406
  max-width: 100%;
1245
1407
  max-height: 70vh;
1246
1408
  object-fit: contain;
@@ -1258,12 +1420,20 @@
1258
1420
  max-height: 70vh;
1259
1421
  margin: 0;
1260
1422
  padding: 16px;
1261
- background: #1a2828;
1262
- color: #f4f7f3;
1423
+ background: #18181b;
1424
+ color: #f4f4f5;
1263
1425
  font-family: var(--font-mono);
1264
1426
  font-size: 12.5px;
1265
1427
  overflow: auto;
1266
- line-height: 1.5;
1428
+ line-height: 1.55;
1429
+ tab-size: 2;
1430
+ }
1431
+
1432
+ .preview-code-block code {
1433
+ color: inherit;
1434
+ background: transparent;
1435
+ font-family: inherit;
1436
+ font-size: inherit;
1267
1437
  }
1268
1438
 
1269
1439
  .preview-iframe {
@@ -1272,13 +1442,184 @@
1272
1442
  border: none;
1273
1443
  }
1274
1444
 
1275
- .preview-actions {
1445
+ .rendered-markdown {
1446
+ padding: 1.5rem;
1447
+ color: var(--text);
1448
+ background: #ffffff;
1449
+ line-height: 1.65;
1450
+ max-height: 70vh;
1451
+ overflow-y: auto;
1452
+ font-family: var(--font);
1453
+ }
1454
+
1455
+ .rendered-markdown h1,
1456
+ .rendered-markdown h2,
1457
+ .rendered-markdown h3 {
1458
+ color: var(--text);
1459
+ font-family: var(--font-headings);
1460
+ font-weight: 700;
1461
+ margin-top: 1.25rem;
1462
+ margin-bottom: 0.5rem;
1463
+ }
1464
+
1465
+ .rendered-markdown code {
1466
+ background: #f1f5f9;
1467
+ color: var(--primary-dark-color-ml);
1468
+ padding: 2px 5px;
1469
+ border-radius: 4px;
1470
+ font-family: var(--font-mono);
1471
+ font-size: 12px;
1472
+ }
1473
+
1474
+ .rendered-markdown pre {
1475
+ background: #18181b;
1476
+ color: #f4f4f5;
1477
+ padding: 1rem;
1478
+ border-radius: var(--radius);
1479
+ overflow-x: auto;
1480
+ }
1481
+
1482
+ .rendered-markdown table {
1483
+ width: 100%;
1484
+ border-collapse: collapse;
1485
+ margin: 1rem 0;
1486
+ }
1487
+
1488
+ .rendered-markdown th,
1489
+ .rendered-markdown td {
1490
+ border: 1px solid var(--border-color);
1491
+ padding: 8px 12px;
1492
+ text-align: left;
1493
+ }
1494
+
1495
+ .rendered-markdown th {
1496
+ background: #f8fafc;
1497
+ font-weight: 600;
1498
+ color: var(--text);
1499
+ }
1500
+
1501
+ /* Metadata Info Cards */
1502
+ .file-info-pane {
1503
+ background: #f8fafc;
1504
+ padding: 1.25rem;
1505
+ }
1506
+
1507
+ .info-card {
1508
+ background: #ffffff;
1509
+ border: 1px solid var(--border-color);
1510
+ border-radius: var(--radius-sm);
1511
+ padding: 10px 12px;
1512
+ font-family: var(--font);
1513
+ }
1514
+
1515
+ .info-label {
1516
+ font-size: 11px;
1517
+ font-weight: 700;
1518
+ text-transform: uppercase;
1519
+ letter-spacing: 0.04em;
1520
+ color: var(--text-muted);
1521
+ margin-bottom: 3px;
1522
+ font-family: var(--font-headings);
1523
+ }
1524
+
1525
+ .info-value {
1526
+ font-size: 13px;
1527
+ color: var(--text);
1528
+ word-break: break-all;
1529
+ font-family: var(--font);
1530
+ line-height: 1.45;
1531
+ }
1532
+
1533
+ .info-value.font-mono,
1534
+ .font-mono {
1535
+ font-family: var(--font-mono) !important;
1536
+ font-size: 12px;
1537
+ }
1538
+
1539
+ .font-semibold {
1540
+ font-weight: 600 !important;
1541
+ }
1542
+
1543
+ .text-break {
1544
+ word-break: break-all !important;
1545
+ overflow-wrap: break-word !important;
1546
+ }
1547
+
1548
+ .text-truncate {
1549
+ overflow: hidden !important;
1550
+ text-overflow: ellipsis !important;
1551
+ white-space: nowrap !important;
1552
+ }
1553
+
1554
+ .small {
1555
+ font-size: 12px !important;
1556
+ }
1557
+
1558
+ /* ==========================================================================
1559
+ Floating Batch Action Bar
1560
+ ========================================================================== */
1561
+ .batch-action-bar {
1562
+ position: fixed;
1563
+ bottom: 24px;
1564
+ left: 50%;
1565
+ transform: translateX(-50%);
1566
+ z-index: 1000;
1567
+ animation: batch-slide 0.18s cubic-bezier(0.16, 1, 0.3, 1);
1568
+ }
1569
+
1570
+ @keyframes batch-slide {
1571
+ from { opacity: 0; transform: translate(-50%, 12px); }
1572
+ to { opacity: 1; transform: translate(-50%, 0); }
1573
+ }
1574
+
1575
+ .batch-bar-inner {
1576
+ display: flex;
1577
+ align-items: center;
1578
+ gap: 12px;
1579
+ padding: 8px 14px;
1580
+ background: #0f172a;
1581
+ color: #ffffff;
1582
+ border-radius: var(--radius-lg);
1583
+ box-shadow: var(--shadow-lg);
1584
+ border: 1px solid rgba(255, 255, 255, 0.12);
1585
+ }
1586
+
1587
+ .batch-selection-info {
1276
1588
  display: flex;
1277
1589
  align-items: center;
1278
1590
  gap: 8px;
1591
+ font-size: 12.5px;
1592
+ font-weight: 500;
1593
+ }
1594
+
1595
+ .batch-count-badge {
1596
+ background: var(--primary);
1597
+ color: #ffffff;
1598
+ font-weight: 700;
1599
+ font-size: 11px;
1600
+ padding: 1px 7px;
1601
+ border-radius: 999px;
1602
+ }
1603
+
1604
+ .batch-actions {
1605
+ display: flex;
1606
+ align-items: center;
1607
+ gap: 6px;
1608
+ }
1609
+
1610
+ .batch-actions .btn-outline-light {
1611
+ background: rgba(255, 255, 255, 0.1);
1612
+ color: #ffffff;
1613
+ border: 1px solid rgba(255, 255, 255, 0.2);
1614
+ }
1615
+
1616
+ .batch-actions .btn-outline-light:hover {
1617
+ background: rgba(255, 255, 255, 0.2);
1279
1618
  }
1280
1619
 
1281
- /* Toast Container & Notifications */
1620
+ /* ==========================================================================
1621
+ Toasts & Alerts
1622
+ ========================================================================== */
1282
1623
  .toast-container {
1283
1624
  position: fixed;
1284
1625
  bottom: 20px;
@@ -1295,9 +1636,9 @@
1295
1636
  display: flex;
1296
1637
  align-items: center;
1297
1638
  gap: 10px;
1298
- padding: 10px 16px;
1299
- border-radius: var(--radius);
1300
- background: var(--dark-color-ml);
1639
+ padding: 9px 14px;
1640
+ border-radius: var(--radius-sm);
1641
+ background: #0f172a;
1301
1642
  color: #ffffff;
1302
1643
  font-family: var(--font);
1303
1644
  font-size: 13px;
@@ -1305,38 +1646,73 @@
1305
1646
  box-shadow: var(--shadow-lg);
1306
1647
  min-width: 260px;
1307
1648
  max-width: 400px;
1308
- transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.25s ease;
1649
+ transition: transform 0.2s ease, opacity 0.2s ease;
1650
+ border: 1px solid rgba(255, 255, 255, 0.1);
1309
1651
  }
1310
1652
 
1311
1653
  .toast-notification.success {
1312
- background: linear-gradient(135deg, #10b981, #059669);
1654
+ background: #065f46;
1655
+ border-color: #047857;
1313
1656
  }
1314
1657
 
1315
1658
  .toast-notification.error {
1316
- background: linear-gradient(135deg, #ef4444, #dc2626);
1659
+ background: #991b1b;
1660
+ border-color: #b91c1c;
1317
1661
  }
1318
1662
 
1319
1663
  .toast-notification.warning {
1320
- background: linear-gradient(135deg, #f59e0b, #d97706);
1664
+ background: #92400e;
1665
+ border-color: #b45309;
1321
1666
  }
1322
1667
 
1323
1668
  .toast-close-btn {
1324
1669
  margin-left: auto;
1325
1670
  background: transparent;
1326
1671
  border: none;
1327
- color: rgba(255, 255, 255, 0.85);
1672
+ color: rgba(255, 255, 255, 0.8);
1328
1673
  cursor: pointer;
1329
1674
  font-size: 16px;
1330
1675
  line-height: 1;
1331
1676
  }
1332
1677
 
1333
- /* Pagination */
1678
+ .toast-close-btn:hover {
1679
+ color: #ffffff;
1680
+ }
1681
+
1682
+ /* Flash alerts */
1683
+ .alert {
1684
+ padding: 10px 14px;
1685
+ border-radius: var(--radius-sm);
1686
+ margin-bottom: 1rem;
1687
+ display: flex;
1688
+ align-items: center;
1689
+ gap: 8px;
1690
+ font-size: 13px;
1691
+ border: 1px solid transparent;
1692
+ }
1693
+
1694
+ .alert-success {
1695
+ background: #ecfdf5;
1696
+ color: #065f46;
1697
+ border-color: #a7f3d0;
1698
+ }
1699
+
1700
+ .alert-danger {
1701
+ background: #fef2f2;
1702
+ color: #991b1b;
1703
+ border-color: #fecaca;
1704
+ }
1705
+
1706
+ /* ==========================================================================
1707
+ Pagination
1708
+ ========================================================================== */
1334
1709
  .pagination-container {
1335
- padding: 12px 16px;
1710
+ padding: 10px 16px;
1336
1711
  border-top: 1px solid var(--border-color);
1337
1712
  display: flex;
1338
1713
  align-items: center;
1339
1714
  justify-content: flex-end;
1715
+ background: #ffffff;
1340
1716
  }
1341
1717
 
1342
1718
  .pagination {
@@ -1363,17 +1739,17 @@
1363
1739
  font-weight: 600;
1364
1740
  text-decoration: none;
1365
1741
  cursor: pointer;
1366
- transition: all 0.12s ease;
1742
+ transition: background-color 0.12s ease, color 0.12s ease, border-color 0.12s ease;
1367
1743
  }
1368
1744
 
1369
1745
  .page-item .page-link:hover {
1370
- background: var(--primary-light-color-ml);
1371
- color: var(--primary-dark-color-ml);
1746
+ background: #f1f5f9;
1747
+ color: var(--text);
1372
1748
  }
1373
1749
 
1374
1750
  .page-item.active .page-link {
1375
- background: var(--primary-color-ml);
1376
- border-color: var(--primary-color-ml);
1751
+ background: var(--primary);
1752
+ border-color: var(--primary);
1377
1753
  color: #ffffff;
1378
1754
  }
1379
1755
 
@@ -1382,7 +1758,116 @@
1382
1758
  cursor: not-allowed;
1383
1759
  }
1384
1760
 
1385
- /* Mobile & Tablet Responsiveness */
1761
+ /* ==========================================================================
1762
+ Provider Badges & Connection Status
1763
+ ========================================================================== */
1764
+ .provider-badge {
1765
+ display: inline-flex;
1766
+ align-items: center;
1767
+ gap: 4px;
1768
+ font-size: 11px;
1769
+ font-weight: 700;
1770
+ text-transform: uppercase;
1771
+ letter-spacing: 0.04em;
1772
+ padding: 2px 7px;
1773
+ border-radius: 4px;
1774
+ background: #f1f5f9;
1775
+ color: var(--text-secondary);
1776
+ border: 1px solid var(--border-color);
1777
+ vertical-align: middle;
1778
+ font-family: var(--font-headings);
1779
+ }
1780
+
1781
+ .provider-badge.provider-gdrive,
1782
+ .provider-badge.provider-googledrive,
1783
+ .provider-badge.provider-google-drive {
1784
+ background: #eff6ff;
1785
+ color: #1d4ed8;
1786
+ border-color: #bfdbfe;
1787
+ }
1788
+
1789
+ .provider-badge.provider-s3 {
1790
+ background: #fff7ed;
1791
+ color: #c2410c;
1792
+ border-color: #fed7aa;
1793
+ }
1794
+
1795
+ .provider-badge.provider-r2 {
1796
+ background: #fff7ed;
1797
+ color: #c2410c;
1798
+ border-color: #fed7aa;
1799
+ }
1800
+
1801
+ .provider-badge.provider-minio {
1802
+ background: #fef2f2;
1803
+ color: #b91c1c;
1804
+ border-color: #fecaca;
1805
+ }
1806
+
1807
+ .health-status-badge {
1808
+ display: inline-flex;
1809
+ align-items: center;
1810
+ gap: 5px;
1811
+ font-size: 11px;
1812
+ font-weight: 600;
1813
+ padding: 2px 7px;
1814
+ border-radius: 4px;
1815
+ background: #ecfdf5;
1816
+ color: #047857;
1817
+ border: 1px solid #a7f3d0;
1818
+ }
1819
+
1820
+ .health-status-badge.unhealthy {
1821
+ background: #fef2f2;
1822
+ color: #b91c1c;
1823
+ border-color: #fecaca;
1824
+ }
1825
+
1826
+ .health-status-badge.checking {
1827
+ background: #fffbeb;
1828
+ color: #b45309;
1829
+ border-color: #fde68a;
1830
+ }
1831
+
1832
+ .health-dot {
1833
+ width: 6px;
1834
+ height: 6px;
1835
+ border-radius: 50%;
1836
+ background: #10b981;
1837
+ }
1838
+
1839
+ .health-status-badge.unhealthy .health-dot {
1840
+ background: #ef4444;
1841
+ }
1842
+
1843
+ .health-status-badge.checking .health-dot {
1844
+ background: #f59e0b;
1845
+ }
1846
+
1847
+ .health-check-btn {
1848
+ background: transparent;
1849
+ border: none;
1850
+ cursor: pointer;
1851
+ color: var(--text-muted);
1852
+ padding: 2px 4px;
1853
+ border-radius: var(--radius-sm);
1854
+ transition: color 0.12s ease, background-color 0.12s ease;
1855
+ }
1856
+
1857
+ .health-check-btn:hover {
1858
+ color: var(--primary);
1859
+ background: var(--primary-light-color-ml);
1860
+ }
1861
+
1862
+ .storage-latency-tag {
1863
+ font-size: 11px;
1864
+ font-family: var(--font-mono);
1865
+ color: var(--text-muted);
1866
+ }
1867
+
1868
+ /* ==========================================================================
1869
+ Mobile & Responsive Adaptations
1870
+ ========================================================================== */
1386
1871
  @media (max-width: 900px) {
1387
1872
  .page-wrapper {
1388
1873
  padding: 0;
@@ -1391,10 +1876,8 @@
1391
1876
  }
1392
1877
 
1393
1878
  .card.file-manager {
1394
- border-radius: var(--radius-md);
1879
+ border-radius: var(--radius);
1395
1880
  width: 100%;
1396
- max-width: 100%;
1397
- overflow: hidden;
1398
1881
  }
1399
1882
 
1400
1883
  .fm-layout {
@@ -1402,20 +1885,13 @@
1402
1885
  height: auto;
1403
1886
  min-height: 0;
1404
1887
  max-height: none;
1405
- width: 100%;
1406
- max-width: 100%;
1407
- overflow: hidden;
1408
1888
  }
1409
1889
 
1410
1890
  .fm-tree-wrap {
1411
- display: flex;
1412
1891
  border-right: none;
1413
1892
  border-bottom: 1px solid var(--border-color);
1414
1893
  padding: 10px 14px;
1415
- background: rgba(244, 247, 243, 0.85);
1416
- width: 100%;
1417
- max-width: 100%;
1418
- box-sizing: border-box;
1894
+ background: #f8fafc;
1419
1895
  }
1420
1896
 
1421
1897
  .fm-tree-header,
@@ -1426,71 +1902,27 @@
1426
1902
  .fm-storage {
1427
1903
  margin-top: 0;
1428
1904
  padding: 8px 12px;
1429
- background: rgba(255, 255, 255, 0.95);
1905
+ background: #ffffff;
1430
1906
  border: 1px solid var(--border-color);
1431
- border-radius: var(--radius-sm);
1432
- box-shadow: 0 1px 4px rgba(15, 118, 110, 0.05);
1433
- width: 100%;
1434
- max-width: 100%;
1435
- box-sizing: border-box;
1436
1907
  }
1437
1908
 
1438
1909
  .fm-main {
1439
1910
  width: 100%;
1440
- max-width: 100%;
1441
1911
  min-width: 0;
1442
- overflow: hidden;
1443
1912
  }
1444
1913
 
1445
1914
  .fm-grid-wrap {
1446
- min-height: 400px;
1915
+ min-height: 380px;
1447
1916
  padding: 12px;
1448
- width: 100%;
1449
- max-width: 100%;
1450
- box-sizing: border-box;
1451
- overflow-x: hidden;
1452
1917
  }
1453
1918
 
1454
1919
  .fm-grid.view-grid {
1455
- grid-template-columns: repeat(auto-fill, minmax(135px, 1fr));
1456
- gap: 10px;
1457
- width: 100%;
1458
- max-width: 100%;
1459
- }
1460
-
1461
- .fm-item {
1462
- -webkit-tap-highlight-color: transparent;
1463
- width: 100%;
1464
- max-width: 100%;
1465
- min-width: 0;
1466
- box-sizing: border-box;
1467
- }
1468
-
1469
- .fm-item-details {
1470
- width: 100%;
1471
- max-width: 100%;
1472
- min-width: 0;
1473
- overflow: hidden;
1474
- }
1475
-
1476
- .fm-item-name {
1477
- width: 100%;
1478
- max-width: 100%;
1479
- min-width: 0;
1480
- overflow: hidden;
1481
- text-overflow: ellipsis;
1482
- white-space: nowrap;
1483
- }
1484
-
1485
- .fm-item:active {
1486
- transform: scale(0.98);
1487
- background: var(--primary-light-color-ml);
1920
+ grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
1921
+ gap: 8px;
1488
1922
  }
1489
1923
 
1490
1924
  .fm-item-menu {
1491
1925
  opacity: 1;
1492
- background: rgba(255, 255, 255, 0.92);
1493
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
1494
1926
  }
1495
1927
 
1496
1928
  .fm-star.on {
@@ -1503,29 +1935,26 @@
1503
1935
  padding: 0.75rem 1rem;
1504
1936
  margin-bottom: 0.75rem;
1505
1937
  border-radius: var(--radius);
1506
- width: 100%;
1507
- max-width: 100%;
1508
1938
  }
1509
1939
 
1510
1940
  .page-header-row {
1511
1941
  flex-direction: column;
1512
1942
  align-items: stretch;
1513
1943
  gap: 10px;
1514
- width: 100%;
1515
1944
  }
1516
1945
 
1517
1946
  .page-actions {
1518
1947
  width: 100%;
1519
1948
  display: flex;
1520
1949
  justify-content: stretch;
1521
- gap: 8px;
1950
+ gap: 6px;
1522
1951
  }
1523
1952
 
1524
1953
  .page-actions .btn {
1525
1954
  flex: 1 1 0;
1526
1955
  min-width: 0;
1527
1956
  justify-content: center;
1528
- padding: 7px 8px;
1957
+ padding: 6px 8px;
1529
1958
  font-size: 12px;
1530
1959
  }
1531
1960
 
@@ -1534,9 +1963,6 @@
1534
1963
  align-items: stretch;
1535
1964
  gap: 8px;
1536
1965
  padding: 8px 10px;
1537
- width: 100%;
1538
- max-width: 100%;
1539
- overflow: hidden;
1540
1966
  }
1541
1967
 
1542
1968
  .fm-breadcrumb {
@@ -1557,89 +1983,44 @@
1557
1983
  flex-direction: column;
1558
1984
  align-items: stretch;
1559
1985
  gap: 8px;
1560
- max-width: 100%;
1561
1986
  }
1562
1987
 
1563
1988
  .quick-filter-group {
1564
1989
  width: 100%;
1565
1990
  display: flex;
1566
- overflow-x: auto;
1567
- scrollbar-width: none;
1568
- max-width: 100%;
1569
- }
1570
-
1571
- .quick-filter-group::-webkit-scrollbar {
1572
- display: none;
1573
1991
  }
1574
1992
 
1575
1993
  .quick-filter-btn {
1576
1994
  flex: 1 1 0;
1577
1995
  text-align: center;
1578
- padding: 5px 6px;
1996
+ padding: 4px 6px;
1579
1997
  font-size: 11.5px;
1580
- white-space: nowrap;
1581
1998
  }
1582
1999
 
1583
2000
  .search-box {
1584
2001
  width: 100%;
1585
- max-width: 100%;
1586
- }
1587
-
1588
- .search-box input {
1589
- width: 100%;
1590
- box-sizing: border-box;
1591
2002
  }
1592
2003
 
1593
- /* Grid Mode on Small Phones */
1594
2004
  .fm-grid.view-grid {
1595
2005
  grid-template-columns: repeat(2, minmax(0, 1fr));
1596
2006
  gap: 8px;
1597
- width: 100%;
1598
- max-width: 100%;
1599
2007
  }
1600
2008
 
1601
2009
  .fm-grid.view-grid .fm-item {
1602
2010
  padding: 8px;
1603
- border-radius: var(--radius-md);
1604
2011
  gap: 6px;
1605
- width: 100%;
1606
- max-width: 100%;
1607
- min-width: 0;
1608
- }
1609
-
1610
- .fm-grid.view-grid .fm-item-icon {
1611
- aspect-ratio: 16 / 11;
1612
- width: 100%;
1613
2012
  }
1614
2013
 
1615
2014
  .fm-item-name {
1616
2015
  font-size: 12px;
1617
- line-height: 1.35;
1618
2016
  }
1619
2017
 
1620
2018
  .fm-item-meta {
1621
- font-size: 10px;
2019
+ font-size: 10.5px;
1622
2020
  }
1623
2021
 
1624
- .fm-item-menu {
1625
- top: 5px;
1626
- right: 5px;
1627
- width: 26px;
1628
- height: 26px;
1629
- }
1630
-
1631
- .fm-star {
1632
- top: 5px;
1633
- left: 5px;
1634
- width: 22px;
1635
- height: 22px;
1636
- }
1637
-
1638
- /* List Mode on Mobile */
1639
2022
  .fm-grid.view-list {
1640
- gap: 6px;
1641
- width: 100%;
1642
- max-width: 100%;
2023
+ gap: 4px;
1643
2024
  }
1644
2025
 
1645
2026
  .fm-grid.view-list .fm-item {
@@ -1647,35 +2028,6 @@
1647
2028
  align-items: center;
1648
2029
  gap: 8px;
1649
2030
  padding: 8px 10px;
1650
- border-radius: var(--radius-md);
1651
- width: 100%;
1652
- max-width: 100%;
1653
- min-width: 0;
1654
- }
1655
-
1656
- .fm-grid.view-list .fm-item-checkbox {
1657
- display: flex;
1658
- align-items: center;
1659
- justify-content: center;
1660
- flex-shrink: 0;
1661
- }
1662
-
1663
- .fm-grid.view-list .fm-item-icon {
1664
- width: 32px;
1665
- height: 32px;
1666
- flex-shrink: 0;
1667
- border-radius: var(--radius-sm);
1668
- }
1669
-
1670
- .fm-grid.view-list .fm-item-name {
1671
- flex: 1 1 auto;
1672
- min-width: 0;
1673
- font-size: 12.5px;
1674
- font-weight: 600;
1675
- color: var(--dark-color-ml);
1676
- overflow: hidden;
1677
- text-overflow: ellipsis;
1678
- white-space: nowrap;
1679
2031
  }
1680
2032
 
1681
2033
  .fm-grid.view-list .fm-item-size,
@@ -1684,24 +2036,6 @@
1684
2036
  display: none;
1685
2037
  }
1686
2038
 
1687
- .fm-grid.view-list .fm-item-menu {
1688
- flex-shrink: 0;
1689
- width: 28px;
1690
- height: 28px;
1691
- display: flex;
1692
- align-items: center;
1693
- justify-content: center;
1694
- opacity: 1;
1695
- color: var(--gray-color-ml);
1696
- border-radius: 6px;
1697
- background: transparent;
1698
- box-shadow: none;
1699
- }
1700
-
1701
- .fm-grid.view-list .fm-item-menu:active {
1702
- background: var(--light-color-ml);
1703
- }
1704
-
1705
2039
  .fm-list-header {
1706
2040
  display: none;
1707
2041
  }