@codingfactory/mediables-vue 2.11.0 → 2.13.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 (64) hide show
  1. package/dist/{PixiFrameExporter-apC6SqIv.cjs → PixiFrameExporter-BnAievFi.cjs} +2 -2
  2. package/dist/{PixiFrameExporter-apC6SqIv.cjs.map → PixiFrameExporter-BnAievFi.cjs.map} +1 -1
  3. package/dist/{PixiFrameExporter-D9swI3PO.js → PixiFrameExporter-DwbBy1Iu.js} +2 -2
  4. package/dist/{PixiFrameExporter-D9swI3PO.js.map → PixiFrameExporter-DwbBy1Iu.js.map} +1 -1
  5. package/dist/components/ImageEditorModal.vue.d.ts +9 -2
  6. package/dist/composables/useImageEditorModal.d.ts +1262 -86
  7. package/dist/composables/useRadialMenu.d.ts +1 -1
  8. package/dist/editor-BoDU3YXD.js +10862 -0
  9. package/dist/editor-BoDU3YXD.js.map +1 -0
  10. package/dist/editor-D-cJRASf.cjs +2 -0
  11. package/dist/editor-D-cJRASf.cjs.map +1 -0
  12. package/dist/{index-BFYtEc-Y.js → index-BGC4rPDc.js} +16370 -14565
  13. package/dist/index-BGC4rPDc.js.map +1 -0
  14. package/dist/index-CljyFIEv.cjs +357 -0
  15. package/dist/index-CljyFIEv.cjs.map +1 -0
  16. package/dist/mediables-vanilla.cjs +1 -1
  17. package/dist/mediables-vanilla.mjs +1 -1
  18. package/dist/mediables-vue.cjs +1 -1
  19. package/dist/mediables-vue.mjs +2 -2
  20. package/dist/style.css +1 -1
  21. package/dist/types/editor.d.ts +212 -27
  22. package/dist/vanilla-editor/VanillaImageEditor.d.ts +18 -0
  23. package/dist/vanilla-editor/VanillaImageEditorV2.d.ts +16 -0
  24. package/dist/vanilla-editor/core/EventEmitter.d.ts +12 -0
  25. package/dist/vanilla-editor/core/State.d.ts +98 -0
  26. package/dist/vanilla-editor/filters/categories.d.ts +69 -0
  27. package/dist/vanilla-editor/icons/icons.d.ts +42 -0
  28. package/dist/vanilla-editor/index.d.ts +342 -0
  29. package/dist/vanilla-editor/presets/index.d.ts +114 -0
  30. package/dist/vanilla-editor/renderer/CropManager.d.ts +140 -0
  31. package/dist/vanilla-editor/renderer/FilterManager.d.ts +132 -0
  32. package/dist/vanilla-editor/renderer/PixiRenderer.d.ts +274 -0
  33. package/dist/vanilla-editor/renderer/RemoveBgManager.d.ts +108 -0
  34. package/dist/vanilla-editor/styles/editor-v2.css +1366 -0
  35. package/dist/vanilla-editor/styles/editor.css +1403 -0
  36. package/dist/vanilla-editor/ui/ActiveFiltersPanel.d.ts +93 -0
  37. package/dist/vanilla-editor/ui/CategoryCarousel.d.ts +66 -0
  38. package/dist/vanilla-editor/ui/CropControls.d.ts +65 -0
  39. package/dist/vanilla-editor/ui/FilterAdjustments.d.ts +93 -0
  40. package/dist/vanilla-editor/ui/FilterCarousel.d.ts +74 -0
  41. package/dist/vanilla-editor/ui/MobileActiveFilters.d.ts +21 -0
  42. package/dist/vanilla-editor/ui/MobileFilterDrawer.d.ts +79 -0
  43. package/dist/vanilla-editor/ui/Toolbar.d.ts +35 -0
  44. package/dist/vanilla-editor/ui/UIBuilder.d.ts +87 -0
  45. package/dist/vanilla-editor/ui-v2/ActiveFiltersStack.d.ts +16 -0
  46. package/dist/vanilla-editor/ui-v2/BackgroundPanel.d.ts +16 -0
  47. package/dist/vanilla-editor/ui-v2/BottomDrawer.d.ts +55 -0
  48. package/dist/vanilla-editor/ui-v2/CategoryTabs.d.ts +21 -0
  49. package/dist/vanilla-editor/ui-v2/FilterControlsView.d.ts +16 -0
  50. package/dist/vanilla-editor/ui-v2/FilterListView.d.ts +32 -0
  51. package/dist/vanilla-editor/ui-v2/LayerStackPanel.d.ts +30 -0
  52. package/dist/vanilla-editor/ui-v2/MobileActiveChips.d.ts +23 -0
  53. package/dist/vanilla-editor/ui-v2/MobileNavigation.d.ts +51 -0
  54. package/dist/vanilla-editor/ui-v2/SplitPanelLayout.d.ts +70 -0
  55. package/dist/vanilla-editor/ui-v2/TextPanel.d.ts +58 -0
  56. package/dist/vanilla-exports.d.ts +9 -0
  57. package/package.json +3 -2
  58. package/dist/editor-BTwIhrcA.cjs +0 -2
  59. package/dist/editor-BTwIhrcA.cjs.map +0 -1
  60. package/dist/editor-CYj5y5bp.js +0 -8893
  61. package/dist/editor-CYj5y5bp.js.map +0 -1
  62. package/dist/index-BFYtEc-Y.js.map +0 -1
  63. package/dist/index-CAPdRZVb.cjs +0 -357
  64. package/dist/index-CAPdRZVb.cjs.map +0 -1
@@ -0,0 +1,1403 @@
1
+ /**
2
+ * Vanilla Image Editor Styles
3
+ * Framework-agnostic CSS with CSS custom properties for theming
4
+ */
5
+
6
+ /* ==================== CSS Variables ==================== */
7
+ .vanilla-image-editor {
8
+ /* Light theme (default) */
9
+ --editor-bg: #ffffff;
10
+ --editor-surface: #f5f5f5;
11
+ --editor-surface-2: #eeeeee;
12
+ --editor-text: #1a1a1a;
13
+ --editor-text-muted: #666666;
14
+ --editor-border: #dddddd;
15
+ --editor-border-light: #eeeeee;
16
+ --editor-primary: #3880ff;
17
+ --editor-primary-hover: #3171e0;
18
+ --editor-primary-light: #e6f0ff;
19
+ --editor-danger: #eb445a;
20
+ --editor-danger-hover: #cf3c4f;
21
+ --editor-success: #2dd36f;
22
+ --editor-shadow: rgba(0, 0, 0, 0.1);
23
+ --editor-overlay: rgba(0, 0, 0, 0.5);
24
+
25
+ /* Sizing */
26
+ --editor-radius: 8px;
27
+ --editor-radius-sm: 4px;
28
+ --editor-spacing: 16px;
29
+ --editor-spacing-sm: 8px;
30
+ --editor-spacing-xs: 4px;
31
+
32
+ /* Sliders */
33
+ --slider-track-height: 6px;
34
+ --slider-thumb-size: 20px;
35
+ --slider-track-bg: #cccccc;
36
+ --slider-track-fill: var(--editor-primary);
37
+ }
38
+
39
+ .vanilla-image-editor.dark {
40
+ --editor-bg: #0a0a0a;
41
+ --editor-surface: #1a1a1a;
42
+ --editor-surface-2: #252525;
43
+ --editor-text: #ffffff;
44
+ --editor-text-muted: #999999;
45
+ --editor-border: #333333;
46
+ --editor-border-light: #444444;
47
+ --editor-primary-light: #1a2744;
48
+ --editor-shadow: rgba(0, 0, 0, 0.3);
49
+ --slider-track-bg: #444444;
50
+ }
51
+
52
+ /* ==================== Base Layout ==================== */
53
+ .vanilla-image-editor {
54
+ width: 100%;
55
+ height: 100%;
56
+ display: flex;
57
+ flex-direction: column;
58
+ background: var(--editor-bg);
59
+ color: var(--editor-text);
60
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
61
+ font-size: 14px;
62
+ overflow: hidden;
63
+ }
64
+
65
+ .editor-content {
66
+ flex: 1 1 auto;
67
+ display: flex;
68
+ flex-direction: column;
69
+ min-height: 0;
70
+ overflow: hidden;
71
+ }
72
+
73
+ /* ==================== Toolbar ==================== */
74
+ .editor-toolbar-container {
75
+ flex: 0 0 auto;
76
+ border-bottom: 1px solid var(--editor-border);
77
+ }
78
+
79
+ .editor-toolbar {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: space-between;
83
+ padding: var(--editor-spacing-sm) var(--editor-spacing);
84
+ background: var(--editor-surface);
85
+ }
86
+
87
+ .toolbar-section {
88
+ display: flex;
89
+ align-items: center;
90
+ gap: var(--editor-spacing-sm);
91
+ }
92
+
93
+ .remove-bg-control {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ gap: 6px;
97
+ }
98
+
99
+ .remove-bg-tier-select {
100
+ width: 92px;
101
+ height: 36px;
102
+ border: 1px solid var(--editor-border);
103
+ border-radius: var(--editor-radius-sm);
104
+ background: var(--editor-surface);
105
+ color: var(--editor-text);
106
+ font-size: 12px;
107
+ padding: 0 8px;
108
+ }
109
+
110
+ .toolbar-btn-remove-bg[aria-busy="true"] {
111
+ background: var(--editor-surface-2);
112
+ }
113
+
114
+ .sr-only {
115
+ position: absolute;
116
+ width: 1px;
117
+ height: 1px;
118
+ padding: 0;
119
+ margin: -1px;
120
+ overflow: hidden;
121
+ clip: rect(0, 0, 0, 0);
122
+ white-space: nowrap;
123
+ border: 0;
124
+ }
125
+
126
+ .toolbar-center {
127
+ justify-content: center;
128
+ }
129
+
130
+ .zoom-label {
131
+ font-size: 12px;
132
+ font-weight: 500;
133
+ min-width: 50px;
134
+ text-align: center;
135
+ color: var(--editor-text-muted);
136
+ }
137
+
138
+ /* ==================== Canvas Section ==================== */
139
+ .canvas-section {
140
+ flex: 1 1 auto;
141
+ min-height: 200px;
142
+ max-height: 45vh;
143
+ position: relative;
144
+ background: var(--editor-surface);
145
+ overflow: hidden;
146
+ }
147
+
148
+ .canvas-container {
149
+ width: 100%;
150
+ height: 100%;
151
+ }
152
+
153
+ .canvas-container canvas.pixi-canvas {
154
+ display: block;
155
+ width: 100%;
156
+ height: 100%;
157
+ }
158
+
159
+ .crop-overlay {
160
+ position: absolute;
161
+ top: 0;
162
+ left: 0;
163
+ width: 100%;
164
+ height: 100%;
165
+ pointer-events: none;
166
+ z-index: 10;
167
+ }
168
+
169
+ /* ==================== Controls Section ==================== */
170
+ .controls-section {
171
+ flex: 1 1 auto;
172
+ display: flex;
173
+ flex-direction: column;
174
+ background: var(--editor-bg);
175
+ border-top: 1px solid var(--editor-border);
176
+ padding: var(--editor-spacing);
177
+ overflow-y: auto;
178
+ overflow-x: hidden;
179
+ -webkit-overflow-scrolling: touch;
180
+ min-height: 250px;
181
+ }
182
+
183
+ /* ==================== Category Carousel ==================== */
184
+ .category-carousel-container {
185
+ position: relative;
186
+ margin-bottom: var(--editor-spacing-sm);
187
+ }
188
+
189
+ .category-carousel {
190
+ display: flex;
191
+ gap: var(--editor-spacing-sm);
192
+ overflow-x: auto;
193
+ scroll-behavior: smooth;
194
+ -webkit-overflow-scrolling: touch;
195
+ scrollbar-width: none;
196
+ padding: var(--editor-spacing-sm) 40px;
197
+ }
198
+
199
+ .category-carousel::-webkit-scrollbar {
200
+ display: none;
201
+ }
202
+
203
+ /* ==================== Chips ==================== */
204
+ .chip {
205
+ flex-shrink: 0;
206
+ display: flex;
207
+ flex-direction: column;
208
+ align-items: center;
209
+ gap: var(--editor-spacing-xs);
210
+ padding: 12px 16px;
211
+ background: var(--editor-surface);
212
+ border: 2px solid var(--editor-border);
213
+ border-radius: var(--editor-radius);
214
+ cursor: pointer;
215
+ transition: all 0.2s;
216
+ min-width: 80px;
217
+ font-size: 12px;
218
+ font-weight: 500;
219
+ color: var(--editor-text);
220
+ }
221
+
222
+ .chip:hover {
223
+ border-color: var(--editor-primary);
224
+ }
225
+
226
+ .chip.active {
227
+ background: var(--editor-primary-light);
228
+ border-color: var(--editor-primary);
229
+ }
230
+
231
+ .chip-icon {
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ color: var(--editor-text-muted);
236
+ }
237
+
238
+ .chip.active .chip-icon {
239
+ color: var(--editor-primary);
240
+ }
241
+
242
+ .chip-icon svg {
243
+ width: 24px;
244
+ height: 24px;
245
+ }
246
+
247
+ /* ==================== Navigation Buttons ==================== */
248
+ .carousel-nav {
249
+ position: absolute;
250
+ top: 50%;
251
+ transform: translateY(-50%);
252
+ background: var(--editor-surface);
253
+ border: 1px solid var(--editor-border);
254
+ border-radius: 50%;
255
+ width: 32px;
256
+ height: 32px;
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ cursor: pointer;
261
+ z-index: 2;
262
+ transition: opacity 0.2s, background 0.2s;
263
+ padding: 0;
264
+ color: var(--editor-text);
265
+ }
266
+
267
+ .carousel-nav:hover:not(:disabled) {
268
+ background: var(--editor-surface-2);
269
+ }
270
+
271
+ .carousel-nav:disabled {
272
+ opacity: 0.3;
273
+ cursor: not-allowed;
274
+ }
275
+
276
+ .carousel-nav-left {
277
+ left: 0;
278
+ }
279
+
280
+ .carousel-nav-right {
281
+ right: 0;
282
+ }
283
+
284
+ /* ==================== Pagination Dots ==================== */
285
+ .carousel-pagination {
286
+ display: flex;
287
+ justify-content: center;
288
+ gap: var(--editor-spacing-xs);
289
+ margin-top: var(--editor-spacing-sm);
290
+ }
291
+
292
+ .pagination-dot {
293
+ width: 6px;
294
+ height: 6px;
295
+ border-radius: 50%;
296
+ background: var(--editor-border);
297
+ cursor: pointer;
298
+ transition: background 0.2s;
299
+ }
300
+
301
+ .pagination-dot.active {
302
+ background: var(--editor-primary);
303
+ }
304
+
305
+ /* ==================== Filter Layout ==================== */
306
+ .filter-controls-container {
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: var(--editor-spacing);
310
+ }
311
+
312
+ .filter-layout {
313
+ display: flex;
314
+ gap: var(--editor-spacing);
315
+ min-height: 200px;
316
+ }
317
+
318
+ .filter-left-column {
319
+ flex: 1 1 65%;
320
+ display: flex;
321
+ flex-direction: column;
322
+ gap: var(--editor-spacing);
323
+ overflow-y: auto;
324
+ overflow-x: hidden;
325
+ padding-right: var(--editor-spacing-sm);
326
+ }
327
+
328
+ .filter-right-column {
329
+ flex: 0 0 35%;
330
+ min-width: 280px;
331
+ overflow-y: auto;
332
+ overflow-x: hidden;
333
+ border-left: 1px solid var(--editor-border);
334
+ padding-left: var(--editor-spacing);
335
+ }
336
+
337
+ /* ==================== Filter Carousel ==================== */
338
+ .filter-carousel-container {
339
+ position: relative;
340
+ }
341
+
342
+ .filter-carousel {
343
+ display: flex;
344
+ gap: var(--editor-spacing-sm);
345
+ overflow-x: auto;
346
+ scroll-behavior: smooth;
347
+ -webkit-overflow-scrolling: touch;
348
+ scrollbar-width: none;
349
+ padding: var(--editor-spacing-sm) 40px;
350
+ }
351
+
352
+ .filter-carousel::-webkit-scrollbar {
353
+ display: none;
354
+ }
355
+
356
+ .filter-card {
357
+ flex-shrink: 0;
358
+ width: 100px;
359
+ padding: var(--editor-spacing-sm);
360
+ background: var(--editor-surface);
361
+ border: 2px solid var(--editor-border);
362
+ border-radius: var(--editor-radius);
363
+ cursor: pointer;
364
+ transition: all 0.2s;
365
+ display: flex;
366
+ flex-direction: column;
367
+ align-items: center;
368
+ gap: var(--editor-spacing-xs);
369
+ }
370
+
371
+ .filter-card:hover {
372
+ border-color: var(--editor-primary);
373
+ }
374
+
375
+ .filter-card.active {
376
+ border-color: var(--editor-success);
377
+ }
378
+
379
+ .filter-card.selected {
380
+ background: var(--editor-primary-light);
381
+ border-color: var(--editor-primary);
382
+ }
383
+
384
+ .filter-preview {
385
+ width: 60px;
386
+ height: 60px;
387
+ background: var(--editor-surface-2);
388
+ border-radius: var(--editor-radius-sm);
389
+ display: flex;
390
+ align-items: center;
391
+ justify-content: center;
392
+ }
393
+
394
+ .filter-preview-text {
395
+ font-size: 24px;
396
+ font-weight: bold;
397
+ color: var(--editor-text-muted);
398
+ }
399
+
400
+ .filter-name {
401
+ font-size: 11px;
402
+ font-weight: 500;
403
+ text-align: center;
404
+ white-space: nowrap;
405
+ overflow: hidden;
406
+ text-overflow: ellipsis;
407
+ max-width: 100%;
408
+ }
409
+
410
+ .filter-toggle {
411
+ width: 20px;
412
+ height: 20px;
413
+ border-radius: 50%;
414
+ border: 2px solid var(--editor-border);
415
+ background: transparent;
416
+ display: flex;
417
+ align-items: center;
418
+ justify-content: center;
419
+ cursor: pointer;
420
+ transition: all 0.2s;
421
+ padding: 0;
422
+ }
423
+
424
+ .filter-toggle.active {
425
+ background: var(--editor-success);
426
+ border-color: var(--editor-success);
427
+ color: white;
428
+ }
429
+
430
+ .filter-toggle svg {
431
+ width: 12px;
432
+ height: 12px;
433
+ }
434
+
435
+ /* ==================== Filter Adjustments ==================== */
436
+ .filter-adjustments {
437
+ background: var(--editor-surface);
438
+ border: 1px solid var(--editor-border);
439
+ border-radius: var(--editor-radius);
440
+ padding: var(--editor-spacing);
441
+ }
442
+
443
+ .adjustments-header {
444
+ display: flex;
445
+ justify-content: space-between;
446
+ align-items: center;
447
+ margin-bottom: var(--editor-spacing);
448
+ padding-bottom: var(--editor-spacing-sm);
449
+ border-bottom: 1px solid var(--editor-border);
450
+ }
451
+
452
+ .adjustments-title {
453
+ font-weight: 600;
454
+ font-size: 14px;
455
+ }
456
+
457
+ .adjustments-grid {
458
+ display: grid;
459
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
460
+ gap: var(--editor-spacing);
461
+ }
462
+
463
+ .no-filter-selected {
464
+ text-align: center;
465
+ padding: var(--editor-spacing);
466
+ color: var(--editor-text-muted);
467
+ }
468
+
469
+ /* ==================== Slider Control ==================== */
470
+ .slider-control {
471
+ display: flex;
472
+ flex-direction: column;
473
+ gap: var(--editor-spacing-xs);
474
+ }
475
+
476
+ .slider-header {
477
+ display: flex;
478
+ justify-content: space-between;
479
+ align-items: center;
480
+ }
481
+
482
+ .slider-label {
483
+ font-size: 12px;
484
+ font-weight: 500;
485
+ }
486
+
487
+ .slider-value {
488
+ font-size: 11px;
489
+ color: var(--editor-text-muted);
490
+ min-width: 40px;
491
+ text-align: right;
492
+ }
493
+
494
+ .slider-input {
495
+ width: 100%;
496
+ height: var(--slider-thumb-size);
497
+ background: transparent;
498
+ -webkit-appearance: none;
499
+ appearance: none;
500
+ cursor: pointer;
501
+ }
502
+
503
+ .slider-input::-webkit-slider-runnable-track {
504
+ width: 100%;
505
+ height: var(--slider-track-height);
506
+ background: var(--slider-track-bg);
507
+ border-radius: var(--slider-track-height);
508
+ }
509
+
510
+ .slider-input::-webkit-slider-thumb {
511
+ -webkit-appearance: none;
512
+ width: var(--slider-thumb-size);
513
+ height: var(--slider-thumb-size);
514
+ background: var(--editor-primary);
515
+ border-radius: 50%;
516
+ margin-top: calc((var(--slider-track-height) - var(--slider-thumb-size)) / 2);
517
+ cursor: pointer;
518
+ box-shadow: 0 2px 4px var(--editor-shadow);
519
+ transition: transform 0.1s;
520
+ }
521
+
522
+ .slider-input::-webkit-slider-thumb:hover {
523
+ transform: scale(1.1);
524
+ }
525
+
526
+ .slider-input::-moz-range-track {
527
+ width: 100%;
528
+ height: var(--slider-track-height);
529
+ background: var(--slider-track-bg);
530
+ border-radius: var(--slider-track-height);
531
+ }
532
+
533
+ .slider-input::-moz-range-thumb {
534
+ width: var(--slider-thumb-size);
535
+ height: var(--slider-thumb-size);
536
+ background: var(--editor-primary);
537
+ border-radius: 50%;
538
+ cursor: pointer;
539
+ border: none;
540
+ box-shadow: 0 2px 4px var(--editor-shadow);
541
+ }
542
+
543
+ /* ==================== Toggle Control ==================== */
544
+ .toggle-control {
545
+ display: flex;
546
+ justify-content: space-between;
547
+ align-items: center;
548
+ }
549
+
550
+ .toggle-label {
551
+ font-size: 12px;
552
+ font-weight: 500;
553
+ }
554
+
555
+ .toggle-switch {
556
+ position: relative;
557
+ width: 44px;
558
+ height: 24px;
559
+ }
560
+
561
+ .toggle-input {
562
+ opacity: 0;
563
+ width: 0;
564
+ height: 0;
565
+ }
566
+
567
+ .toggle-slider {
568
+ position: absolute;
569
+ cursor: pointer;
570
+ top: 0;
571
+ left: 0;
572
+ right: 0;
573
+ bottom: 0;
574
+ background-color: var(--slider-track-bg);
575
+ transition: 0.2s;
576
+ border-radius: 24px;
577
+ }
578
+
579
+ .toggle-slider::before {
580
+ position: absolute;
581
+ content: '';
582
+ height: 18px;
583
+ width: 18px;
584
+ left: 3px;
585
+ bottom: 3px;
586
+ background-color: white;
587
+ transition: 0.2s;
588
+ border-radius: 50%;
589
+ }
590
+
591
+ .toggle-input:checked + .toggle-slider {
592
+ background-color: var(--editor-primary);
593
+ }
594
+
595
+ .toggle-input:checked + .toggle-slider::before {
596
+ transform: translateX(20px);
597
+ }
598
+
599
+ /* ==================== Color Control ==================== */
600
+ .color-control {
601
+ display: flex;
602
+ flex-direction: column;
603
+ gap: var(--editor-spacing-xs);
604
+ }
605
+
606
+ .color-label {
607
+ font-size: 12px;
608
+ font-weight: 500;
609
+ }
610
+
611
+ .color-input {
612
+ width: 100%;
613
+ height: 36px;
614
+ border: 1px solid var(--editor-border);
615
+ border-radius: var(--editor-radius-sm);
616
+ cursor: pointer;
617
+ padding: 2px;
618
+ }
619
+
620
+ /* ==================== Select Control ==================== */
621
+ .select-control {
622
+ display: flex;
623
+ flex-direction: column;
624
+ gap: var(--editor-spacing-xs);
625
+ }
626
+
627
+ .select-label {
628
+ font-size: 12px;
629
+ font-weight: 500;
630
+ }
631
+
632
+ .select-input {
633
+ width: 100%;
634
+ padding: 8px 12px;
635
+ background: var(--editor-surface);
636
+ border: 1px solid var(--editor-border);
637
+ border-radius: var(--editor-radius-sm);
638
+ font-size: 14px;
639
+ color: var(--editor-text);
640
+ cursor: pointer;
641
+ }
642
+
643
+ /* ==================== Button Styles ==================== */
644
+ .btn {
645
+ display: inline-flex;
646
+ align-items: center;
647
+ justify-content: center;
648
+ gap: var(--editor-spacing-xs);
649
+ padding: 8px 16px;
650
+ border-radius: var(--editor-radius-sm);
651
+ border: none;
652
+ font-size: 14px;
653
+ font-weight: 500;
654
+ cursor: pointer;
655
+ transition: all 0.2s;
656
+ }
657
+
658
+ .btn-primary {
659
+ background: var(--editor-primary);
660
+ color: white;
661
+ }
662
+
663
+ .btn-primary:hover {
664
+ background: var(--editor-primary-hover);
665
+ }
666
+
667
+ .btn-secondary {
668
+ background: var(--editor-surface);
669
+ border: 1px solid var(--editor-border);
670
+ color: var(--editor-text);
671
+ }
672
+
673
+ .btn-secondary:hover {
674
+ background: var(--editor-surface-2);
675
+ }
676
+
677
+ .btn-text {
678
+ background: transparent;
679
+ color: var(--editor-text-muted);
680
+ padding: 4px 8px;
681
+ }
682
+
683
+ .btn-text:hover {
684
+ color: var(--editor-text);
685
+ }
686
+
687
+ .btn-danger {
688
+ color: var(--editor-danger);
689
+ }
690
+
691
+ .btn-danger:hover {
692
+ color: var(--editor-danger-hover);
693
+ }
694
+
695
+ .btn-icon {
696
+ display: flex;
697
+ align-items: center;
698
+ justify-content: center;
699
+ }
700
+
701
+ .icon-btn {
702
+ display: flex;
703
+ align-items: center;
704
+ justify-content: center;
705
+ width: 36px;
706
+ height: 36px;
707
+ padding: 0;
708
+ background: var(--editor-surface);
709
+ border: 1px solid var(--editor-border);
710
+ border-radius: var(--editor-radius-sm);
711
+ cursor: pointer;
712
+ transition: all 0.2s;
713
+ color: var(--editor-text);
714
+ }
715
+
716
+ .icon-btn:hover:not(:disabled) {
717
+ background: var(--editor-surface-2);
718
+ }
719
+
720
+ .icon-btn:disabled {
721
+ opacity: 0.5;
722
+ cursor: not-allowed;
723
+ }
724
+
725
+ .icon-btn svg {
726
+ width: 20px;
727
+ height: 20px;
728
+ }
729
+
730
+ .toolbar-btn-primary {
731
+ background: var(--editor-primary);
732
+ border-color: var(--editor-primary);
733
+ color: white;
734
+ }
735
+
736
+ .toolbar-btn-primary:hover {
737
+ background: var(--editor-primary-hover);
738
+ }
739
+
740
+ /* Crop button — only visible on mobile (on desktop, crop is in category carousel) */
741
+ .toolbar-btn-crop {
742
+ display: none;
743
+ }
744
+
745
+ @media (max-width: 768px) {
746
+ .toolbar-btn-crop {
747
+ display: flex;
748
+ }
749
+ }
750
+
751
+ .btn-icon-sm {
752
+ width: 28px;
753
+ height: 28px;
754
+ }
755
+
756
+ .btn-icon-sm svg {
757
+ width: 16px;
758
+ height: 16px;
759
+ }
760
+
761
+ /* ==================== Active Filters Panel ==================== */
762
+ .active-filters-panel {
763
+ background: var(--editor-surface);
764
+ border-radius: var(--editor-radius);
765
+ padding: var(--editor-spacing);
766
+ }
767
+
768
+ .panel-header {
769
+ display: flex;
770
+ justify-content: space-between;
771
+ align-items: center;
772
+ margin-bottom: var(--editor-spacing);
773
+ }
774
+
775
+ .panel-title {
776
+ font-size: 14px;
777
+ font-weight: 600;
778
+ margin: 0;
779
+ }
780
+
781
+ .active-filters-list {
782
+ display: flex;
783
+ flex-direction: column;
784
+ gap: var(--editor-spacing-sm);
785
+ }
786
+
787
+ .no-filters-message {
788
+ text-align: center;
789
+ padding: var(--editor-spacing);
790
+ color: var(--editor-text-muted);
791
+ font-size: 13px;
792
+ }
793
+
794
+ .active-filter-item {
795
+ background: var(--editor-bg);
796
+ border: 1px solid var(--editor-border);
797
+ border-radius: var(--editor-radius-sm);
798
+ padding: var(--editor-spacing-sm);
799
+ cursor: pointer;
800
+ transition: border-color 0.2s, background-color 0.2s;
801
+ }
802
+
803
+ .active-filter-item:hover {
804
+ border-color: var(--editor-primary);
805
+ }
806
+
807
+ .active-filter-item.selected {
808
+ border-color: var(--editor-primary);
809
+ background: color-mix(in srgb, var(--editor-primary) 10%, var(--editor-bg));
810
+ }
811
+
812
+ .filter-item-header {
813
+ display: flex;
814
+ justify-content: space-between;
815
+ align-items: center;
816
+ margin-bottom: var(--editor-spacing-xs);
817
+ }
818
+
819
+ .filter-item-name {
820
+ font-weight: 500;
821
+ font-size: 13px;
822
+ }
823
+
824
+ .filter-item-actions {
825
+ display: flex;
826
+ gap: var(--editor-spacing-xs);
827
+ }
828
+
829
+ .filter-item-summary {
830
+ font-size: 11px;
831
+ color: var(--editor-text-muted);
832
+ white-space: nowrap;
833
+ overflow: hidden;
834
+ text-overflow: ellipsis;
835
+ }
836
+
837
+ /* ==================== Crop Controls ==================== */
838
+ .crop-controls {
839
+ display: flex;
840
+ flex-direction: column;
841
+ gap: var(--editor-spacing);
842
+ }
843
+
844
+ .crop-section {
845
+ display: flex;
846
+ flex-direction: column;
847
+ gap: var(--editor-spacing-sm);
848
+ }
849
+
850
+ .section-label {
851
+ font-size: 12px;
852
+ font-weight: 600;
853
+ color: var(--editor-text-muted);
854
+ text-transform: uppercase;
855
+ }
856
+
857
+ .chip-row {
858
+ display: flex;
859
+ gap: var(--editor-spacing-sm);
860
+ flex-wrap: wrap;
861
+ }
862
+
863
+ .aspect-row .chip {
864
+ min-width: 60px;
865
+ padding: 8px 12px;
866
+ }
867
+
868
+ .rotation-action-row {
869
+ display: grid;
870
+ grid-template-columns: repeat(2, minmax(0, 1fr));
871
+ gap: var(--editor-spacing-sm);
872
+ }
873
+
874
+ .rotation-action-btn {
875
+ min-height: 40px;
876
+ padding: 8px 10px;
877
+ white-space: nowrap;
878
+ }
879
+
880
+ .rotation-preset-row .chip {
881
+ min-width: 56px;
882
+ justify-content: center;
883
+ }
884
+
885
+ .rotation-arbitrary {
886
+ display: flex;
887
+ flex-direction: column;
888
+ gap: var(--editor-spacing-xs);
889
+ padding: var(--editor-spacing-sm);
890
+ border: 1px solid var(--editor-border);
891
+ border-radius: var(--editor-radius-sm);
892
+ background: var(--editor-surface);
893
+ }
894
+
895
+ .rotation-angle-header,
896
+ .rotation-angle-row {
897
+ display: flex;
898
+ align-items: center;
899
+ gap: var(--editor-spacing-sm);
900
+ }
901
+
902
+ .rotation-angle-header {
903
+ justify-content: space-between;
904
+ }
905
+
906
+ .rotation-angle-label,
907
+ .rotation-angle-value {
908
+ font-size: 12px;
909
+ font-weight: 500;
910
+ }
911
+
912
+ .rotation-angle-value {
913
+ color: var(--editor-text-muted);
914
+ font-variant-numeric: tabular-nums;
915
+ }
916
+
917
+ .rotation-range {
918
+ flex: 1 1 auto;
919
+ min-width: 0;
920
+ }
921
+
922
+ .rotation-number-input {
923
+ flex: 0 0 76px;
924
+ min-width: 0;
925
+ text-align: right;
926
+ }
927
+
928
+ .rotation-reset-btn {
929
+ align-self: flex-end;
930
+ }
931
+
932
+ .crop-actions {
933
+ display: flex;
934
+ gap: var(--editor-spacing-sm);
935
+ justify-content: flex-end;
936
+ margin-top: var(--editor-spacing);
937
+ }
938
+
939
+ /* ==================== Hidden Elements ==================== */
940
+ /* Use visibility-based hiding instead of display:none for better browser compatibility */
941
+ .hidden-file-input {
942
+ position: absolute;
943
+ width: 1px;
944
+ height: 1px;
945
+ padding: 0;
946
+ margin: -1px;
947
+ overflow: hidden;
948
+ clip: rect(0, 0, 0, 0);
949
+ white-space: nowrap;
950
+ border: 0;
951
+ }
952
+
953
+ /* ==================== Responsive - Mobile ==================== */
954
+ @media (max-width: 768px) {
955
+ .canvas-section {
956
+ min-height: 180px;
957
+ max-height: none; /* Remove 40vh cap — let image grow to fill available space */
958
+ }
959
+
960
+ .controls-section {
961
+ flex: 0 0 auto; /* Don't grow — fixed height based on content */
962
+ padding: var(--editor-spacing-sm);
963
+ min-height: 0; /* Remove 200px minimum */
964
+ overflow: visible;
965
+ position: relative; /* Anchor for drawer absolute positioning */
966
+ }
967
+
968
+ .filter-layout {
969
+ flex-direction: column;
970
+ min-height: 0; /* Remove 200px minimum from filter-layout */
971
+ }
972
+
973
+ .filter-left-column {
974
+ flex: 1 1 auto;
975
+ padding-right: 0;
976
+ overflow: visible;
977
+ }
978
+
979
+ /* Hide inline adjustments on mobile — use bottom drawer instead */
980
+ .filter-adjustments {
981
+ display: none !important;
982
+ }
983
+
984
+ /* Hide active filters panel on mobile — desktop only */
985
+ .filter-right-column {
986
+ display: none !important;
987
+ }
988
+
989
+ /* Hide pagination dots — just swipe on touch */
990
+ .carousel-pagination {
991
+ display: none;
992
+ }
993
+
994
+ /* Make filter cards chip-style on mobile */
995
+ .filter-card {
996
+ width: auto;
997
+ min-width: 64px;
998
+ max-width: 90px;
999
+ flex-direction: column;
1000
+ gap: 2px;
1001
+ padding: 6px 12px;
1002
+ align-items: center;
1003
+ justify-content: center;
1004
+ }
1005
+
1006
+ /* Hide the preview square on mobile — live preview on canvas is enough */
1007
+ .filter-preview {
1008
+ display: none;
1009
+ }
1010
+
1011
+ .filter-toggle {
1012
+ display: none; /* Hide radio toggle — selection shown via chip styling */
1013
+ }
1014
+
1015
+ .filter-name {
1016
+ font-size: 11px;
1017
+ white-space: normal;
1018
+ text-align: center;
1019
+ line-height: 1.2;
1020
+ }
1021
+
1022
+ /* Hide crop category chip on mobile — crop is in toolbar */
1023
+ .category-carousel .chip[data-category="crop"] {
1024
+ display: none;
1025
+ }
1026
+
1027
+ .toolbar-section {
1028
+ gap: var(--editor-spacing-xs);
1029
+ }
1030
+
1031
+ .zoom-label {
1032
+ display: none;
1033
+ }
1034
+
1035
+ /* Hide theme toggle on mobile to save toolbar space */
1036
+ .toolbar-btn-theme {
1037
+ display: none;
1038
+ }
1039
+
1040
+ .adjustments-grid {
1041
+ grid-template-columns: 1fr;
1042
+ }
1043
+
1044
+ /* Mobile tap targets — 44px minimum per WCAG / Apple HIG */
1045
+ .icon-btn {
1046
+ width: 44px;
1047
+ height: 44px;
1048
+ }
1049
+
1050
+ .icon-btn svg {
1051
+ width: 24px;
1052
+ height: 24px;
1053
+ }
1054
+ }
1055
+
1056
+ /* ==================== Mobile Active Filters Carousel ==================== */
1057
+ /* Hidden on desktop — only shown on mobile below the filter carousel */
1058
+ .mobile-active-filters {
1059
+ display: none;
1060
+ }
1061
+
1062
+ @media (max-width: 768px) {
1063
+ .mobile-active-filters {
1064
+ display: block;
1065
+ padding: 4px 0;
1066
+ }
1067
+ }
1068
+
1069
+ .mobile-active-filters-scroll {
1070
+ display: flex;
1071
+ gap: 6px;
1072
+ overflow-x: auto;
1073
+ -webkit-overflow-scrolling: touch;
1074
+ padding: 2px var(--editor-spacing-sm);
1075
+ scrollbar-width: none;
1076
+ }
1077
+
1078
+ .mobile-active-filters-scroll::-webkit-scrollbar {
1079
+ display: none;
1080
+ }
1081
+
1082
+ .active-filter-placeholder {
1083
+ font-size: 11px;
1084
+ color: var(--editor-text-muted);
1085
+ padding: 6px 0;
1086
+ white-space: nowrap;
1087
+ user-select: none;
1088
+ }
1089
+
1090
+ .active-filter-chip {
1091
+ display: flex;
1092
+ align-items: center;
1093
+ gap: 6px;
1094
+ padding: 4px 8px 4px 10px;
1095
+ background: var(--editor-primary-light);
1096
+ border: 1px solid var(--editor-primary);
1097
+ border-radius: 20px;
1098
+ white-space: nowrap;
1099
+ flex-shrink: 0;
1100
+ font-size: 11px;
1101
+ color: var(--editor-text);
1102
+ cursor: pointer;
1103
+ transition: background-color 0.15s, border-color 0.15s;
1104
+ }
1105
+
1106
+ .active-filter-chip.selected {
1107
+ background: var(--editor-primary);
1108
+ color: #fff;
1109
+ }
1110
+
1111
+ .active-filter-chip-label {
1112
+ cursor: pointer;
1113
+ user-select: none;
1114
+ line-height: 1;
1115
+ }
1116
+
1117
+ .active-filter-chip-check {
1118
+ display: flex;
1119
+ align-items: center;
1120
+ justify-content: center;
1121
+ width: 18px;
1122
+ height: 18px;
1123
+ border-radius: 50%;
1124
+ border: 1.5px solid var(--editor-primary);
1125
+ background: var(--editor-bg);
1126
+ color: var(--editor-primary);
1127
+ cursor: pointer;
1128
+ padding: 0;
1129
+ flex-shrink: 0;
1130
+ transition: background-color 0.15s, color 0.15s;
1131
+ }
1132
+
1133
+ .active-filter-chip-check:hover {
1134
+ background: var(--editor-danger);
1135
+ border-color: var(--editor-danger);
1136
+ color: #fff;
1137
+ }
1138
+
1139
+ .active-filter-chip.selected .active-filter-chip-check {
1140
+ background: rgba(255, 255, 255, 0.3);
1141
+ border-color: rgba(255, 255, 255, 0.6);
1142
+ color: #fff;
1143
+ }
1144
+
1145
+ .active-filter-chip.selected .active-filter-chip-check:hover {
1146
+ background: var(--editor-danger);
1147
+ border-color: var(--editor-danger);
1148
+ color: #fff;
1149
+ }
1150
+
1151
+ /* ==================== Mobile Filter Drawer ==================== */
1152
+ .mobile-filter-drawer-container {
1153
+ position: relative;
1154
+ }
1155
+
1156
+ /* Backdrop is hidden — drawer replaces carousels in-place, no overlay needed */
1157
+ .mobile-filter-drawer-backdrop {
1158
+ display: none;
1159
+ }
1160
+
1161
+ .mobile-filter-drawer {
1162
+ position: absolute;
1163
+ bottom: 0;
1164
+ left: 0;
1165
+ right: 0;
1166
+ background: var(--editor-bg);
1167
+ border-top: 1px solid var(--editor-border);
1168
+ transform: translateY(100%);
1169
+ z-index: 10;
1170
+ display: flex;
1171
+ flex-direction: column;
1172
+ overflow: hidden;
1173
+ }
1174
+
1175
+ .drawer-handle {
1176
+ display: none; /* No handle — drawer is inline, not a sheet */
1177
+ }
1178
+
1179
+ .drawer-header {
1180
+ display: flex;
1181
+ justify-content: space-between;
1182
+ align-items: center;
1183
+ padding: 4px 12px;
1184
+ border-bottom: 1px solid var(--editor-border);
1185
+ flex-shrink: 0;
1186
+ }
1187
+
1188
+ .drawer-title {
1189
+ font-weight: 600;
1190
+ font-size: 13px;
1191
+ }
1192
+
1193
+ .drawer-header-actions {
1194
+ display: flex;
1195
+ align-items: center;
1196
+ gap: var(--editor-spacing-sm);
1197
+ }
1198
+
1199
+ .drawer-body {
1200
+ flex: 1 1 auto;
1201
+ overflow-y: auto;
1202
+ -webkit-overflow-scrolling: touch;
1203
+ padding: 8px 12px;
1204
+ }
1205
+
1206
+ .drawer-body .adjustments-grid {
1207
+ grid-template-columns: 1fr;
1208
+ }
1209
+
1210
+ .drawer-footer {
1211
+ display: flex;
1212
+ gap: var(--editor-spacing-sm);
1213
+ padding: 6px 12px;
1214
+ border-top: 1px solid var(--editor-border);
1215
+ flex-shrink: 0;
1216
+ }
1217
+
1218
+ .drawer-footer .btn {
1219
+ flex: 1;
1220
+ }
1221
+
1222
+ /* ==================== Responsive - Tablet ==================== */
1223
+ @media (min-width: 768px) and (max-width: 1024px) {
1224
+ .filter-right-column {
1225
+ min-width: 220px;
1226
+ flex: 0 0 30%;
1227
+ }
1228
+ }
1229
+
1230
+ /* ==================== Scrollbar Styling ==================== */
1231
+ .controls-section::-webkit-scrollbar,
1232
+ .filter-left-column::-webkit-scrollbar,
1233
+ .filter-right-column::-webkit-scrollbar,
1234
+ .active-filters-list::-webkit-scrollbar {
1235
+ width: 6px;
1236
+ }
1237
+
1238
+ .controls-section::-webkit-scrollbar-track,
1239
+ .filter-left-column::-webkit-scrollbar-track,
1240
+ .filter-right-column::-webkit-scrollbar-track,
1241
+ .active-filters-list::-webkit-scrollbar-track {
1242
+ background: transparent;
1243
+ }
1244
+
1245
+ .controls-section::-webkit-scrollbar-thumb,
1246
+ .filter-left-column::-webkit-scrollbar-thumb,
1247
+ .filter-right-column::-webkit-scrollbar-thumb,
1248
+ .active-filters-list::-webkit-scrollbar-thumb {
1249
+ background: var(--editor-border);
1250
+ border-radius: 3px;
1251
+ }
1252
+
1253
+ .controls-section::-webkit-scrollbar-thumb:hover,
1254
+ .filter-left-column::-webkit-scrollbar-thumb:hover,
1255
+ .filter-right-column::-webkit-scrollbar-thumb:hover,
1256
+ .active-filters-list::-webkit-scrollbar-thumb:hover {
1257
+ background: var(--editor-text-muted);
1258
+ }
1259
+
1260
+ /* ==================== Loading Overlay ==================== */
1261
+ .editor-loading-overlay {
1262
+ position: absolute;
1263
+ inset: 0;
1264
+ background: var(--editor-overlay);
1265
+ display: flex;
1266
+ flex-direction: column;
1267
+ align-items: center;
1268
+ justify-content: center;
1269
+ gap: var(--editor-spacing);
1270
+ color: white;
1271
+ z-index: 100;
1272
+ }
1273
+
1274
+ .editor-loading-spinner {
1275
+ width: 40px;
1276
+ height: 40px;
1277
+ border: 3px solid rgba(255, 255, 255, 0.3);
1278
+ border-top-color: white;
1279
+ border-radius: 50%;
1280
+ animation: editor-spin 0.8s linear infinite;
1281
+ }
1282
+
1283
+ @keyframes editor-spin {
1284
+ to { transform: rotate(360deg); }
1285
+ }
1286
+
1287
+ .editor-loading-text {
1288
+ font-size: 14px;
1289
+ text-align: center;
1290
+ }
1291
+
1292
+ /* ==================== Background Removal Panel ==================== */
1293
+ .bg-removal-panel {
1294
+ padding: var(--editor-spacing);
1295
+ border-radius: var(--editor-radius);
1296
+ background: var(--editor-surface);
1297
+ display: grid;
1298
+ gap: var(--editor-spacing-sm);
1299
+ }
1300
+
1301
+ .bg-removal-panel .panel-header h3 {
1302
+ margin: 0;
1303
+ font-size: 14px;
1304
+ font-weight: 600;
1305
+ }
1306
+
1307
+ .bg-removal-panel .subtitle {
1308
+ margin: 4px 0 0;
1309
+ font-size: 12px;
1310
+ color: var(--editor-text-muted);
1311
+ }
1312
+
1313
+ .bg-removal-panel .form-grid {
1314
+ display: grid;
1315
+ gap: var(--editor-spacing-sm);
1316
+ }
1317
+
1318
+ .bg-removal-panel .actions {
1319
+ display: flex;
1320
+ justify-content: flex-end;
1321
+ gap: var(--editor-spacing-sm);
1322
+ }
1323
+
1324
+ /* ==================== Error Message ==================== */
1325
+ .editor-error {
1326
+ background: rgba(235, 68, 90, 0.1);
1327
+ border: 1px solid var(--editor-danger);
1328
+ border-radius: var(--editor-radius-sm);
1329
+ padding: var(--editor-spacing-sm) var(--editor-spacing);
1330
+ color: var(--editor-danger);
1331
+ font-size: 13px;
1332
+ display: flex;
1333
+ align-items: center;
1334
+ gap: var(--editor-spacing-sm);
1335
+ }
1336
+
1337
+ .editor-error-icon {
1338
+ flex-shrink: 0;
1339
+ }
1340
+
1341
+ .editor-error-message {
1342
+ flex: 1;
1343
+ }
1344
+
1345
+ .editor-error-close {
1346
+ flex-shrink: 0;
1347
+ background: none;
1348
+ border: none;
1349
+ color: var(--editor-danger);
1350
+ cursor: pointer;
1351
+ padding: 4px;
1352
+ }
1353
+
1354
+ /* ==================== Empty State ==================== */
1355
+ .editor-empty-state {
1356
+ display: flex;
1357
+ flex-direction: column;
1358
+ align-items: center;
1359
+ justify-content: center;
1360
+ padding: var(--editor-spacing);
1361
+ text-align: center;
1362
+ color: var(--editor-text-muted);
1363
+ gap: var(--editor-spacing-sm);
1364
+ }
1365
+
1366
+ .editor-empty-state-icon {
1367
+ opacity: 0.5;
1368
+ }
1369
+
1370
+ .editor-empty-state-icon svg {
1371
+ width: 48px;
1372
+ height: 48px;
1373
+ }
1374
+
1375
+ .editor-empty-state-text {
1376
+ font-size: 14px;
1377
+ }
1378
+
1379
+ .editor-empty-state-hint {
1380
+ font-size: 12px;
1381
+ color: var(--editor-text-muted);
1382
+ }
1383
+
1384
+ /* ==================== Focus States ==================== */
1385
+ .slider-input:focus,
1386
+ .select-input:focus,
1387
+ .toggle-input:focus + .toggle-slider,
1388
+ .btn:focus,
1389
+ .icon-btn:focus,
1390
+ .chip:focus {
1391
+ outline: 2px solid var(--editor-primary);
1392
+ outline-offset: 2px;
1393
+ }
1394
+
1395
+ /* Remove focus outline for mouse users */
1396
+ .slider-input:focus:not(:focus-visible),
1397
+ .select-input:focus:not(:focus-visible),
1398
+ .toggle-input:focus:not(:focus-visible) + .toggle-slider,
1399
+ .btn:focus:not(:focus-visible),
1400
+ .icon-btn:focus:not(:focus-visible),
1401
+ .chip:focus:not(:focus-visible) {
1402
+ outline: none;
1403
+ }