@pheem49/mint 1.6.3 → 1.6.4

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 (50) hide show
  1. package/Cargo.lock +3 -3
  2. package/Cargo.toml +1 -1
  3. package/README.md +82 -21
  4. package/assets/Mint_CLI.png +0 -0
  5. package/assets/Mint_Desktop.png +0 -0
  6. package/assets/Mint_Web.png +0 -0
  7. package/assets/Mint_WorkSpace.png +0 -0
  8. package/assets/Setting.png +0 -0
  9. package/assets/bridges.svg +4 -0
  10. package/assets/chat.svg +3 -0
  11. package/assets/code.svg +4 -0
  12. package/assets/features.svg +3 -0
  13. package/assets/imagegen.svg +5 -0
  14. package/assets/live2d.svg +6 -0
  15. package/assets/memory.svg +5 -0
  16. package/assets/screencapture.svg +4 -0
  17. package/assets/setup.svg +3 -0
  18. package/assets/tools.svg +4 -0
  19. package/bin/mint +0 -0
  20. package/crates/mint-cli/src/agent.rs +6 -2
  21. package/crates/mint-cli/src/main.rs +145 -5
  22. package/crates/mint-cli/src/onboard.rs +134 -1
  23. package/crates/mint-core/src/api_server.rs +108 -3
  24. package/crates/mint-core/src/config.rs +20 -1
  25. package/crates/mint-core/src/image_gen.rs +895 -0
  26. package/crates/mint-core/src/lib.rs +4 -0
  27. package/package.json +1 -1
  28. package/src/bin/index.js +0 -0
  29. package/src/renderer/src/components/ChatPanel.tsx +252 -26
  30. package/src/renderer/src/components/DashboardSidebar.tsx +9 -1
  31. package/src/renderer/src/components/ImageStudioPanel.tsx +638 -0
  32. package/src/renderer/src/components/MintDashboard.tsx +13 -4
  33. package/src/renderer/src/components/SettingsWindow.tsx +29 -20
  34. package/src/renderer/src/css/image-studio.css +722 -0
  35. package/src/renderer/src/css/settings.css +13 -3
  36. package/src/renderer/src/css/styles.css +50 -26
  37. package/src/renderer/src/index.css +106 -0
  38. package/src/renderer/src/tauri.ts +123 -0
  39. package/src/renderer/src-web/components/ChatPanel.tsx +272 -24
  40. package/src/renderer/src-web/components/DashboardSidebar.tsx +9 -1
  41. package/src/renderer/src-web/components/ImageStudioPanel.tsx +638 -0
  42. package/src/renderer/src-web/components/MintDashboard.tsx +12 -3
  43. package/src/renderer/src-web/components/SettingsWindow.tsx +29 -20
  44. package/src/renderer/src-web/css/image-studio.css +722 -0
  45. package/src/renderer/src-web/css/settings.css +14 -4
  46. package/src/renderer/src-web/css/styles.css +50 -26
  47. package/src/renderer/src-web/index.css +106 -0
  48. package/src/renderer/src-web/tauri.ts +124 -0
  49. package/src-tauri/src/lib.rs +48 -5
  50. package/src-tauri/tauri.conf.json +1 -1
@@ -0,0 +1,722 @@
1
+ /* ============================================================
2
+ Image Studio Panel — Multi-provider Image Generation
3
+ ============================================================ */
4
+
5
+ /* Root panel: overlays the main content area, aligned with sidebar */
6
+ .img-studio {
7
+ display: none;
8
+ position: absolute;
9
+ top: 0;
10
+ bottom: 0;
11
+ right: 0;
12
+ left: var(--sidebar-expanded-width, 264px);
13
+ flex-direction: column;
14
+ overflow: hidden;
15
+ background: var(--bg-gradient, radial-gradient(circle at top left, #064e3b, #111827 52%, #0b1020));
16
+ z-index: 10;
17
+ transition: left 0.22s ease;
18
+ }
19
+
20
+ /* Adjust left position when the sidebar is collapsed */
21
+ .app-body.sidebar-collapsed .img-studio {
22
+ left: calc(var(--sidebar-collapsed-width, 56px) + var(--sidebar-content-gap, 10px));
23
+ }
24
+
25
+ /* Only visible when view === 'imagine' */
26
+ .img-studio[id="image-studio-panel"]:not([hidden]) {
27
+ display: flex;
28
+ }
29
+
30
+ /* MintDashboard renders ImageStudioPanel always, use view prop to show/hide via :not class trick */
31
+ /* We handle display via the component returning null if view !== 'imagine' */
32
+
33
+ /* ── Header ─────────────────────────────────────────────── */
34
+ .img-studio-header {
35
+ padding: 20px 28px 12px;
36
+ border-bottom: 1px solid var(--border);
37
+ background: var(--chrome-bg);
38
+ backdrop-filter: var(--glass-blur, blur(16px));
39
+ flex-shrink: 0;
40
+ }
41
+
42
+ .img-studio-header-title {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: 10px;
46
+ color: var(--text-main);
47
+ }
48
+
49
+ .img-studio-header-title h1 {
50
+ margin: 0;
51
+ font-size: 1.18rem;
52
+ font-weight: 700;
53
+ color: var(--text-main);
54
+ }
55
+
56
+ .img-studio-header-title svg {
57
+ color: var(--accent);
58
+ flex-shrink: 0;
59
+ }
60
+
61
+ .img-studio-badge {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ padding: 2px 8px;
65
+ border-radius: 99px;
66
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
67
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
68
+ color: var(--accent-hover);
69
+ font-size: 0.68rem;
70
+ font-weight: 600;
71
+ letter-spacing: 0.03em;
72
+ text-transform: uppercase;
73
+ }
74
+
75
+ .img-studio-subtitle {
76
+ margin: 6px 0 0;
77
+ color: var(--text-muted);
78
+ font-size: 0.80rem;
79
+ }
80
+
81
+ /* ── Main layout: 2-column ─────────────────────────────── */
82
+ .img-studio-content {
83
+ display: grid;
84
+ grid-template-columns: 320px 1fr;
85
+ min-height: 0;
86
+ flex: 1;
87
+ overflow: hidden;
88
+ }
89
+
90
+ /* ── Controls (left column) ────────────────────────────── */
91
+ .img-studio-controls {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 18px;
95
+ padding: 22px 20px;
96
+ border-right: 1px solid var(--border);
97
+ background: var(--panel-soft);
98
+ overflow-y: auto;
99
+ scrollbar-width: thin;
100
+ scrollbar-color: color-mix(in srgb, var(--accent) 20%, transparent) transparent;
101
+ }
102
+
103
+ .img-studio-controls::-webkit-scrollbar,
104
+ .img-studio-results::-webkit-scrollbar {
105
+ width: 6px;
106
+ }
107
+ .img-studio-controls::-webkit-scrollbar-track,
108
+ .img-studio-results::-webkit-scrollbar-track {
109
+ background: transparent;
110
+ }
111
+ .img-studio-controls::-webkit-scrollbar-thumb,
112
+ .img-studio-results::-webkit-scrollbar-thumb {
113
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
114
+ border-radius: 99px;
115
+ }
116
+ .img-studio-controls::-webkit-scrollbar-thumb:hover,
117
+ .img-studio-results::-webkit-scrollbar-thumb:hover {
118
+ background: color-mix(in srgb, var(--accent) 30%, transparent);
119
+ }
120
+
121
+ /* ── Field groups ──────────────────────────────────────── */
122
+ .img-studio-field {
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: 7px;
126
+ }
127
+
128
+ .img-studio-label {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 8px;
132
+ color: var(--text-soft);
133
+ font-size: 0.76rem;
134
+ font-weight: 500;
135
+ letter-spacing: 0.02em;
136
+ text-transform: uppercase;
137
+ }
138
+
139
+ .img-studio-label-hint {
140
+ text-transform: none;
141
+ font-weight: 400;
142
+ color: var(--text-muted);
143
+ letter-spacing: 0;
144
+ }
145
+
146
+ /* ── Textarea ──────────────────────────────────────────── */
147
+ .img-studio-textarea {
148
+ width: 100%;
149
+ padding: 10px 12px;
150
+ border: 1px solid var(--border);
151
+ border-radius: 10px;
152
+ background: var(--input-bg);
153
+ color: var(--text-main);
154
+ font-size: 0.87rem;
155
+ line-height: 1.55;
156
+ resize: vertical;
157
+ outline: none;
158
+ transition: border-color 0.15s, box-shadow 0.15s;
159
+ }
160
+
161
+ .img-studio-textarea:focus {
162
+ border-color: var(--accent);
163
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 15%, transparent);
164
+ }
165
+
166
+ .img-studio-textarea--sm {
167
+ font-size: 0.82rem;
168
+ }
169
+
170
+ .img-studio-prompt-hint {
171
+ color: var(--text-muted);
172
+ font-size: 0.70rem;
173
+ text-align: right;
174
+ opacity: 0.85;
175
+ }
176
+
177
+ /* ── Style chips ───────────────────────────────────────── */
178
+ .img-studio-chips {
179
+ display: flex;
180
+ flex-wrap: wrap;
181
+ gap: 6px;
182
+ }
183
+
184
+ .img-studio-chip {
185
+ padding: 4px 10px;
186
+ border: 1px solid var(--border);
187
+ border-radius: 99px;
188
+ background: var(--panel-raised);
189
+ color: var(--text-soft);
190
+ font-size: 0.73rem;
191
+ cursor: pointer;
192
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
193
+ }
194
+
195
+ .img-studio-chip:hover:not(:disabled) {
196
+ border-color: var(--accent-hover);
197
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
198
+ color: var(--accent-hover);
199
+ }
200
+
201
+ /* ── Negative prompt toggle ────────────────────────────── */
202
+ .img-studio-toggle {
203
+ display: inline-flex;
204
+ align-items: center;
205
+ gap: 6px;
206
+ padding: 0;
207
+ border: none;
208
+ background: transparent;
209
+ color: var(--text-soft);
210
+ font-size: 0.78rem;
211
+ cursor: pointer;
212
+ transition: color 0.15s;
213
+ }
214
+
215
+ .img-studio-toggle:hover {
216
+ color: var(--text-main);
217
+ }
218
+
219
+ .img-studio-badge-dot {
220
+ display: inline-block;
221
+ width: 6px;
222
+ height: 6px;
223
+ border-radius: 50%;
224
+ background: var(--accent);
225
+ margin-left: 2px;
226
+ }
227
+
228
+ /* ── Provider selector ─────────────────────────────────── */
229
+ .img-studio-provider-group {
230
+ display: flex;
231
+ flex-wrap: wrap;
232
+ gap: 5px;
233
+ }
234
+
235
+ .img-studio-provider-btn {
236
+ display: inline-flex;
237
+ align-items: center;
238
+ padding: 5px 11px;
239
+ border: 1px solid var(--border);
240
+ border-radius: 99px;
241
+ background: var(--panel-raised);
242
+ color: var(--text-soft);
243
+ font-size: 0.72rem;
244
+ font-weight: 500;
245
+ cursor: pointer;
246
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
247
+ white-space: nowrap;
248
+ }
249
+
250
+ .img-studio-provider-btn:hover:not(:disabled) {
251
+ border-color: var(--accent-hover);
252
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
253
+ color: var(--accent-hover);
254
+ }
255
+
256
+ .img-studio-provider-btn.is-active {
257
+ border-color: var(--accent);
258
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
259
+ color: var(--accent-hover);
260
+ font-weight: 600;
261
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 15%, transparent) inset;
262
+ }
263
+
264
+ .img-studio-provider-btn:disabled {
265
+ opacity: 0.4;
266
+ cursor: not-allowed;
267
+ }
268
+
269
+ /* ── Aspect ratio buttons ──────────────────────────────── */
270
+ .img-studio-aspect-group,
271
+ .img-studio-count-group {
272
+ display: flex;
273
+ gap: 6px;
274
+ flex-wrap: wrap;
275
+ }
276
+
277
+ .img-studio-aspect-btn,
278
+ .img-studio-count-btn {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: 5px;
282
+ padding: 6px 12px;
283
+ border: 1px solid var(--border);
284
+ border-radius: 8px;
285
+ background: var(--panel-raised);
286
+ color: var(--text-soft);
287
+ font-size: 0.78rem;
288
+ cursor: pointer;
289
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
290
+ }
291
+
292
+ .img-studio-aspect-btn:hover:not(:disabled),
293
+ .img-studio-count-btn:hover:not(:disabled) {
294
+ border-color: var(--accent-hover);
295
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
296
+ color: var(--accent-hover);
297
+ }
298
+
299
+ .img-studio-aspect-btn.is-active,
300
+ .img-studio-count-btn.is-active {
301
+ border-color: var(--accent);
302
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
303
+ color: var(--accent-hover);
304
+ font-weight: 600;
305
+ }
306
+
307
+ .img-studio-aspect-icon {
308
+ font-size: 0.65rem;
309
+ opacity: 0.7;
310
+ }
311
+
312
+ .img-studio-count-btn {
313
+ min-width: 40px;
314
+ justify-content: center;
315
+ font-size: 0.88rem;
316
+ font-weight: 600;
317
+ }
318
+
319
+ /* ── Generate button ───────────────────────────────────── */
320
+ .img-studio-generate-btn {
321
+ display: inline-flex;
322
+ align-items: center;
323
+ justify-content: center;
324
+ gap: 8px;
325
+ padding: 11px 18px;
326
+ border: none;
327
+ border-radius: 10px;
328
+ background: linear-gradient(135deg, var(--accent) 0%, color-mix(in srgb, var(--accent) 80%, #000) 100%);
329
+ color: #fff;
330
+ font-size: 0.88rem;
331
+ font-weight: 600;
332
+ cursor: pointer;
333
+ transition: opacity 0.2s, transform 0.15s, box-shadow 0.2s;
334
+ box-shadow: 0 2px 12px color-mix(in srgb, var(--accent) 30%, transparent);
335
+ }
336
+
337
+ .img-studio-generate-btn:hover:not(:disabled) {
338
+ opacity: 0.92;
339
+ transform: translateY(-1px);
340
+ box-shadow: 0 4px 18px color-mix(in srgb, var(--accent) 45%, transparent);
341
+ }
342
+
343
+ .img-studio-generate-btn:disabled {
344
+ opacity: 0.45;
345
+ cursor: not-allowed;
346
+ transform: none;
347
+ box-shadow: none;
348
+ }
349
+
350
+ .img-studio-generate-btn.is-loading {
351
+ cursor: wait;
352
+ }
353
+
354
+ /* ── Spinner ───────────────────────────────────────────── */
355
+ .img-studio-spinner {
356
+ display: inline-block;
357
+ width: 14px;
358
+ height: 14px;
359
+ border: 2px solid rgba(255, 255, 255, 0.3);
360
+ border-top-color: #fff;
361
+ border-radius: 50%;
362
+ animation: img-studio-spin 0.6s linear infinite;
363
+ }
364
+
365
+ @keyframes img-studio-spin {
366
+ to { transform: rotate(360deg); }
367
+ }
368
+
369
+ /* ── Error ─────────────────────────────────────────────── */
370
+ .img-studio-error {
371
+ display: flex;
372
+ align-items: flex-start;
373
+ gap: 8px;
374
+ padding: 10px 12px;
375
+ border: 1px solid rgba(239, 68, 68, 0.35);
376
+ border-radius: 8px;
377
+ background: rgba(239, 68, 68, 0.1);
378
+ color: #ef4444;
379
+ font-size: 0.80rem;
380
+ line-height: 1.45;
381
+ }
382
+
383
+ .img-studio-error svg {
384
+ flex-shrink: 0;
385
+ margin-top: 1px;
386
+ }
387
+
388
+ .img-studio-error span { flex: 1; }
389
+
390
+ .img-studio-error button {
391
+ padding: 0;
392
+ border: none;
393
+ background: transparent;
394
+ color: #ef4444;
395
+ font-size: 1rem;
396
+ cursor: pointer;
397
+ line-height: 1;
398
+ opacity: 0.7;
399
+ }
400
+
401
+ .img-studio-error button:hover { opacity: 1; }
402
+
403
+ /* ── History ───────────────────────────────────────────── */
404
+ .img-studio-history {
405
+ display: flex;
406
+ flex-direction: column;
407
+ gap: 3px;
408
+ }
409
+
410
+ .img-studio-history-item {
411
+ display: flex;
412
+ align-items: center;
413
+ gap: 7px;
414
+ padding: 5px 8px;
415
+ border: none;
416
+ border-radius: 6px;
417
+ background: transparent;
418
+ color: var(--text-soft);
419
+ font-size: 0.75rem;
420
+ text-align: left;
421
+ cursor: pointer;
422
+ transition: background 0.15s, color 0.15s;
423
+ overflow: hidden;
424
+ }
425
+
426
+ .img-studio-history-item:hover:not(:disabled) {
427
+ background: var(--panel-raised);
428
+ color: var(--text-main);
429
+ }
430
+
431
+ .img-studio-history-item span {
432
+ overflow: hidden;
433
+ text-overflow: ellipsis;
434
+ white-space: nowrap;
435
+ }
436
+
437
+ .img-studio-history-item svg { flex-shrink: 0; }
438
+
439
+ /* ── Results (right column) ────────────────────────────── */
440
+ .img-studio-results {
441
+ display: flex;
442
+ flex-direction: column;
443
+ gap: 16px;
444
+ padding: 24px 28px;
445
+ overflow-y: auto;
446
+ scrollbar-width: thin;
447
+ scrollbar-color: color-mix(in srgb, var(--accent) 20%, transparent) transparent;
448
+ }
449
+
450
+ /* ── Skeleton loading ──────────────────────────────────── */
451
+ .img-studio-skeleton-grid {
452
+ display: grid;
453
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
454
+ gap: 14px;
455
+ }
456
+
457
+ .img-studio-skeleton {
458
+ position: relative;
459
+ aspect-ratio: 1;
460
+ border-radius: 12px;
461
+ background: var(--panel-raised);
462
+ overflow: hidden;
463
+ }
464
+
465
+ .img-studio-skeleton-shine {
466
+ position: absolute;
467
+ inset: 0;
468
+ background: linear-gradient(
469
+ 90deg,
470
+ transparent 0%,
471
+ color-mix(in srgb, var(--accent) 8%, transparent) 50%,
472
+ transparent 100%
473
+ );
474
+ animation: img-studio-shimmer 1.4s ease-in-out infinite;
475
+ }
476
+
477
+ @keyframes img-studio-shimmer {
478
+ 0% { transform: translateX(-100%); }
479
+ 100% { transform: translateX(100%); }
480
+ }
481
+
482
+ .img-studio-generating-label {
483
+ grid-column: 1 / -1;
484
+ margin: 4px 0 0;
485
+ color: var(--text-soft);
486
+ font-size: 0.78rem;
487
+ text-align: center;
488
+ animation: img-studio-pulse 1.6s ease-in-out infinite;
489
+ }
490
+
491
+ @keyframes img-studio-pulse {
492
+ 0%, 100% { opacity: 1; }
493
+ 50% { opacity: 0.45; }
494
+ }
495
+
496
+ /* ── Result grid ───────────────────────────────────────── */
497
+ .img-studio-description {
498
+ margin: 0;
499
+ color: var(--text-soft);
500
+ font-size: 0.82rem;
501
+ line-height: 1.5;
502
+ padding: 10px 12px;
503
+ border-radius: 8px;
504
+ background: var(--panel-raised);
505
+ border: 1px solid var(--border);
506
+ }
507
+
508
+ .img-studio-grid {
509
+ display: grid;
510
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
511
+ gap: 14px;
512
+ }
513
+
514
+ /* ── Individual image card ─────────────────────────────── */
515
+ .img-studio-card {
516
+ display: flex;
517
+ flex-direction: column;
518
+ border-radius: 12px;
519
+ background: var(--panel-raised);
520
+ border: 1px solid var(--border);
521
+ overflow: hidden;
522
+ transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
523
+ }
524
+
525
+ .img-studio-card:hover {
526
+ transform: translateY(-2px);
527
+ box-shadow: var(--shadow);
528
+ border-color: var(--accent);
529
+ }
530
+
531
+ .img-studio-card-img-wrap {
532
+ position: relative;
533
+ aspect-ratio: 1;
534
+ background: var(--panel-soft);
535
+ overflow: hidden;
536
+ }
537
+
538
+ .img-studio-card-img {
539
+ width: 100%;
540
+ height: 100%;
541
+ object-fit: cover;
542
+ display: block;
543
+ transition: transform 0.3s;
544
+ }
545
+
546
+ .img-studio-card:hover .img-studio-card-img {
547
+ transform: scale(1.02);
548
+ }
549
+
550
+ .img-studio-card-actions {
551
+ display: flex;
552
+ gap: 6px;
553
+ padding: 8px 10px;
554
+ border-top: 1px solid var(--border);
555
+ }
556
+
557
+ .img-studio-action-btn {
558
+ display: inline-flex;
559
+ align-items: center;
560
+ gap: 5px;
561
+ flex: 1;
562
+ justify-content: center;
563
+ padding: 5px 8px;
564
+ border: 1px solid var(--border);
565
+ border-radius: 7px;
566
+ background: transparent;
567
+ color: var(--text-soft);
568
+ font-size: 0.72rem;
569
+ cursor: pointer;
570
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
571
+ }
572
+
573
+ .img-studio-action-btn:hover {
574
+ background: var(--panel-soft);
575
+ color: var(--text-main);
576
+ border-color: var(--border-light);
577
+ }
578
+
579
+ .img-studio-action-btn--primary {
580
+ border-color: color-mix(in srgb, var(--accent) 30%, transparent);
581
+ color: var(--accent);
582
+ }
583
+
584
+ .img-studio-action-btn--primary:hover {
585
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
586
+ color: var(--accent-hover);
587
+ border-color: var(--accent);
588
+ }
589
+
590
+ .img-studio-meta {
591
+ margin: 0;
592
+ color: var(--text-muted);
593
+ font-size: 0.73rem;
594
+ text-align: right;
595
+ }
596
+
597
+ .img-studio-meta strong { color: var(--text-soft); }
598
+
599
+ /* ── Empty state ───────────────────────────────────────── */
600
+ .img-studio-empty {
601
+ display: flex;
602
+ flex-direction: column;
603
+ align-items: center;
604
+ justify-content: center;
605
+ gap: 10px;
606
+ flex: 1;
607
+ min-height: 300px;
608
+ text-align: center;
609
+ color: var(--text-muted);
610
+ }
611
+
612
+ .img-studio-empty-icon {
613
+ opacity: 0.35;
614
+ color: var(--accent);
615
+ }
616
+
617
+ .img-studio-empty p {
618
+ margin: 0;
619
+ color: var(--text-soft);
620
+ font-size: 0.92rem;
621
+ }
622
+
623
+ .img-studio-empty span {
624
+ font-size: 0.78rem;
625
+ color: var(--text-muted);
626
+ }
627
+
628
+ /* ── History Header & Divider ──────────────────────────── */
629
+ .img-studio-history-header {
630
+ margin-top: 28px;
631
+ padding: 12px 0;
632
+ border-top: 1px dashed var(--border);
633
+ display: flex;
634
+ align-items: center;
635
+ justify-content: space-between;
636
+ }
637
+
638
+ .img-studio-history-title {
639
+ display: flex;
640
+ align-items: center;
641
+ gap: 8px;
642
+ color: var(--text-soft);
643
+ font-size: 0.88rem;
644
+ font-weight: 600;
645
+ }
646
+
647
+ .img-studio-history-title svg {
648
+ color: var(--accent);
649
+ }
650
+
651
+ .img-studio-history-badge {
652
+ display: inline-flex;
653
+ align-items: center;
654
+ justify-content: center;
655
+ padding: 1px 6px;
656
+ font-size: 0.7rem;
657
+ font-weight: 700;
658
+ border-radius: 99px;
659
+ background: var(--panel-soft);
660
+ border: 1px solid var(--border);
661
+ color: var(--text-soft);
662
+ }
663
+
664
+ .img-studio-gallery-empty {
665
+ padding: 30px 20px;
666
+ text-align: center;
667
+ color: var(--text-muted);
668
+ border: 1px dashed var(--border);
669
+ border-radius: 10px;
670
+ background: rgba(255, 255, 255, 0.01);
671
+ }
672
+
673
+ .img-studio-gallery-empty p {
674
+ margin: 0 0 4px;
675
+ font-size: 0.82rem;
676
+ color: var(--text-soft);
677
+ }
678
+
679
+ .img-studio-gallery-empty span {
680
+ font-size: 0.74rem;
681
+ }
682
+
683
+ .img-studio-active-empty {
684
+ display: flex;
685
+ flex-direction: column;
686
+ align-items: center;
687
+ justify-content: center;
688
+ gap: 10px;
689
+ padding: 40px 20px;
690
+ border: 1px dashed var(--border);
691
+ border-radius: 12px;
692
+ background: var(--panel-soft);
693
+ color: var(--text-muted);
694
+ text-align: center;
695
+ }
696
+
697
+ .img-studio-active-empty p {
698
+ margin: 0;
699
+ color: var(--text-soft);
700
+ font-size: 0.88rem;
701
+ font-weight: 500;
702
+ }
703
+
704
+ .img-studio-active-empty span {
705
+ font-size: 0.78rem;
706
+ }
707
+
708
+ /* ── Responsive ───────────────────────────────────────── */
709
+ @media (max-width: 860px) {
710
+ .img-studio-content {
711
+ grid-template-columns: 1fr;
712
+ grid-template-rows: auto 1fr;
713
+ overflow-y: auto;
714
+ }
715
+
716
+ .img-studio-controls {
717
+ border-right: none;
718
+ border-bottom: 1px solid var(--border);
719
+ max-height: 50vh;
720
+ overflow-y: auto;
721
+ }
722
+ }