@igorvaryvoda/sirv-upload-widget 0.1.0 → 0.1.3

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.
@@ -0,0 +1,874 @@
1
+ /**
2
+ * Sirv Upload Widget - Default Styles
3
+ *
4
+ * Customize using CSS variables:
5
+ *
6
+ * :root {
7
+ * --sirv-primary: #0066cc;
8
+ * --sirv-primary-hover: #0052a3;
9
+ * --sirv-bg: #ffffff;
10
+ * --sirv-text: #1a1a1a;
11
+ * // ... etc
12
+ * }
13
+ */
14
+
15
+ /* =============================================================================
16
+ CSS Variables (Theme)
17
+ ============================================================================= */
18
+
19
+ .sirv-uploader {
20
+ /* Colors */
21
+ --sirv-primary: #0066cc;
22
+ --sirv-primary-hover: #0052a3;
23
+ --sirv-primary-light: #e6f0fa;
24
+ --sirv-success: #22c55e;
25
+ --sirv-success-light: #dcfce7;
26
+ --sirv-error: #ef4444;
27
+ --sirv-error-light: #fee2e2;
28
+ --sirv-warning: #f59e0b;
29
+
30
+ /* Neutrals */
31
+ --sirv-bg: #ffffff;
32
+ --sirv-bg-subtle: #f8fafc;
33
+ --sirv-bg-muted: #f1f5f9;
34
+ --sirv-border: #e2e8f0;
35
+ --sirv-border-strong: #cbd5e1;
36
+ --sirv-text: #1e293b;
37
+ --sirv-text-muted: #64748b;
38
+ --sirv-text-subtle: #94a3b8;
39
+
40
+ /* Sizing */
41
+ --sirv-radius: 8px;
42
+ --sirv-radius-sm: 4px;
43
+ --sirv-radius-lg: 12px;
44
+ --sirv-spacing: 16px;
45
+ --sirv-spacing-sm: 8px;
46
+ --sirv-spacing-xs: 4px;
47
+
48
+ /* Typography */
49
+ --sirv-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
50
+ --sirv-font-size: 14px;
51
+ --sirv-font-size-sm: 12px;
52
+ --sirv-font-size-lg: 16px;
53
+
54
+ /* Transitions */
55
+ --sirv-transition: 150ms ease;
56
+
57
+ /* Shadows */
58
+ --sirv-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
59
+ --sirv-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
60
+ }
61
+
62
+ /* =============================================================================
63
+ Dark Mode (automatic via prefers-color-scheme)
64
+ ============================================================================= */
65
+
66
+ @media (prefers-color-scheme: dark) {
67
+ .sirv-uploader:not(.sirv-uploader--light) {
68
+ /* Colors */
69
+ --sirv-primary: #3b82f6;
70
+ --sirv-primary-hover: #60a5fa;
71
+ --sirv-primary-light: rgba(59, 130, 246, 0.15);
72
+ --sirv-success: #22c55e;
73
+ --sirv-success-light: rgba(34, 197, 94, 0.15);
74
+ --sirv-error: #f87171;
75
+ --sirv-error-light: rgba(248, 113, 113, 0.15);
76
+ --sirv-warning: #fbbf24;
77
+
78
+ /* Neutrals */
79
+ --sirv-bg: #1e1e1e;
80
+ --sirv-bg-subtle: #252525;
81
+ --sirv-bg-muted: #2d2d2d;
82
+ --sirv-border: #3d3d3d;
83
+ --sirv-border-strong: #4d4d4d;
84
+ --sirv-text: #e5e5e5;
85
+ --sirv-text-muted: #a3a3a3;
86
+ --sirv-text-subtle: #737373;
87
+
88
+ /* Shadows */
89
+ --sirv-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
90
+ --sirv-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2);
91
+ }
92
+ }
93
+
94
+ /* =============================================================================
95
+ Dark Mode (manual via class)
96
+ ============================================================================= */
97
+
98
+ .sirv-uploader--dark {
99
+ /* Colors */
100
+ --sirv-primary: #3b82f6;
101
+ --sirv-primary-hover: #60a5fa;
102
+ --sirv-primary-light: rgba(59, 130, 246, 0.15);
103
+ --sirv-success: #22c55e;
104
+ --sirv-success-light: rgba(34, 197, 94, 0.15);
105
+ --sirv-error: #f87171;
106
+ --sirv-error-light: rgba(248, 113, 113, 0.15);
107
+ --sirv-warning: #fbbf24;
108
+
109
+ /* Neutrals */
110
+ --sirv-bg: #1e1e1e;
111
+ --sirv-bg-subtle: #252525;
112
+ --sirv-bg-muted: #2d2d2d;
113
+ --sirv-border: #3d3d3d;
114
+ --sirv-border-strong: #4d4d4d;
115
+ --sirv-text: #e5e5e5;
116
+ --sirv-text-muted: #a3a3a3;
117
+ --sirv-text-subtle: #737373;
118
+
119
+ /* Shadows */
120
+ --sirv-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
121
+ --sirv-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2);
122
+ }
123
+
124
+ /* =============================================================================
125
+ Base Container
126
+ ============================================================================= */
127
+
128
+ .sirv-uploader {
129
+ font-family: var(--sirv-font);
130
+ font-size: var(--sirv-font-size);
131
+ color: var(--sirv-text);
132
+ background: var(--sirv-bg);
133
+ border-radius: var(--sirv-radius-lg);
134
+ border: 1px solid var(--sirv-border);
135
+ overflow: hidden;
136
+ }
137
+
138
+ /* =============================================================================
139
+ Tabs
140
+ ============================================================================= */
141
+
142
+ .sirv-tabs {
143
+ display: flex;
144
+ border-bottom: 1px solid var(--sirv-border);
145
+ background: var(--sirv-bg-subtle);
146
+ }
147
+
148
+ .sirv-tabs__tab {
149
+ flex: 1;
150
+ padding: var(--sirv-spacing-sm) var(--sirv-spacing);
151
+ background: none;
152
+ border: none;
153
+ border-bottom: 2px solid transparent;
154
+ color: var(--sirv-text-muted);
155
+ font-size: var(--sirv-font-size);
156
+ font-weight: 500;
157
+ cursor: pointer;
158
+ transition: all var(--sirv-transition);
159
+ }
160
+
161
+ .sirv-tabs__tab:hover {
162
+ color: var(--sirv-text);
163
+ background: var(--sirv-bg-muted);
164
+ }
165
+
166
+ .sirv-tabs__tab--active {
167
+ color: var(--sirv-primary);
168
+ border-bottom-color: var(--sirv-primary);
169
+ background: var(--sirv-bg);
170
+ }
171
+
172
+ /* =============================================================================
173
+ DropZone
174
+ ============================================================================= */
175
+
176
+ .sirv-dropzone {
177
+ display: flex;
178
+ flex-direction: column;
179
+ align-items: center;
180
+ justify-content: center;
181
+ min-height: 200px;
182
+ padding: var(--sirv-spacing) calc(var(--sirv-spacing) * 2);
183
+ border: 2px dashed var(--sirv-border-strong);
184
+ border-radius: var(--sirv-radius);
185
+ background: var(--sirv-bg-subtle);
186
+ cursor: pointer;
187
+ transition: all var(--sirv-transition);
188
+ margin: var(--sirv-spacing);
189
+ }
190
+
191
+ .sirv-dropzone:hover,
192
+ .sirv-dropzone:focus-visible {
193
+ border-color: var(--sirv-primary);
194
+ background: var(--sirv-primary-light);
195
+ }
196
+
197
+ .sirv-dropzone--drag-over {
198
+ border-color: var(--sirv-primary);
199
+ background: var(--sirv-primary-light);
200
+ transform: scale(1.01);
201
+ }
202
+
203
+ .sirv-dropzone--disabled {
204
+ opacity: 0.6;
205
+ cursor: not-allowed;
206
+ }
207
+
208
+ .sirv-dropzone--compact {
209
+ min-height: 120px;
210
+ padding: var(--sirv-spacing);
211
+ }
212
+
213
+ .sirv-dropzone__input {
214
+ position: absolute;
215
+ width: 1px;
216
+ height: 1px;
217
+ padding: 0;
218
+ margin: -1px;
219
+ overflow: hidden;
220
+ clip: rect(0, 0, 0, 0);
221
+ border: 0;
222
+ }
223
+
224
+ .sirv-dropzone__content {
225
+ display: flex;
226
+ flex-direction: column;
227
+ align-items: center;
228
+ gap: var(--sirv-spacing-sm);
229
+ text-align: center;
230
+ }
231
+
232
+ .sirv-dropzone__icon {
233
+ width: 48px;
234
+ height: 48px;
235
+ color: var(--sirv-text-muted);
236
+ }
237
+
238
+ .sirv-dropzone__text {
239
+ margin: 0;
240
+ font-size: var(--sirv-font-size-lg);
241
+ font-weight: 500;
242
+ color: var(--sirv-text);
243
+ }
244
+
245
+ .sirv-dropzone__hint {
246
+ margin: 0;
247
+ font-size: var(--sirv-font-size-sm);
248
+ color: var(--sirv-text-muted);
249
+ }
250
+
251
+ .sirv-dropzone__spinner {
252
+ width: 32px;
253
+ height: 32px;
254
+ border: 3px solid var(--sirv-border);
255
+ border-top-color: var(--sirv-primary);
256
+ border-radius: 50%;
257
+ animation: sirv-spin 0.8s linear infinite;
258
+ }
259
+
260
+ @keyframes sirv-spin {
261
+ to { transform: rotate(360deg); }
262
+ }
263
+
264
+ /* =============================================================================
265
+ FileList
266
+ ============================================================================= */
267
+
268
+ .sirv-filelist {
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: var(--sirv-spacing-xs);
272
+ padding: 0 var(--sirv-spacing) var(--sirv-spacing);
273
+ max-height: 300px;
274
+ overflow-y: auto;
275
+ }
276
+
277
+ .sirv-filelist__item {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: var(--sirv-spacing-sm);
281
+ padding: var(--sirv-spacing-sm);
282
+ background: var(--sirv-bg-subtle);
283
+ border-radius: var(--sirv-radius-sm);
284
+ position: relative;
285
+ }
286
+
287
+ .sirv-filelist__item--success {
288
+ background: var(--sirv-success-light);
289
+ }
290
+
291
+ .sirv-filelist__item--error {
292
+ background: var(--sirv-error-light);
293
+ }
294
+
295
+ .sirv-filelist__thumbnail {
296
+ width: 40px;
297
+ height: 40px;
298
+ border-radius: var(--sirv-radius-sm);
299
+ overflow: hidden;
300
+ flex-shrink: 0;
301
+ background: var(--sirv-bg-muted);
302
+ }
303
+
304
+ .sirv-filelist__thumbnail img {
305
+ width: 100%;
306
+ height: 100%;
307
+ object-fit: cover;
308
+ }
309
+
310
+ .sirv-filelist__info {
311
+ flex: 1;
312
+ min-width: 0;
313
+ }
314
+
315
+ .sirv-filelist__name {
316
+ font-weight: 500;
317
+ white-space: nowrap;
318
+ overflow: hidden;
319
+ text-overflow: ellipsis;
320
+ }
321
+
322
+ .sirv-filelist__meta {
323
+ display: flex;
324
+ gap: var(--sirv-spacing-sm);
325
+ font-size: var(--sirv-font-size-sm);
326
+ color: var(--sirv-text-muted);
327
+ }
328
+
329
+ .sirv-filelist__error {
330
+ font-size: var(--sirv-font-size-sm);
331
+ color: var(--sirv-error);
332
+ margin-top: var(--sirv-spacing-xs);
333
+ }
334
+
335
+ .sirv-filelist__status--success {
336
+ color: var(--sirv-success);
337
+ }
338
+
339
+ .sirv-filelist__status--error {
340
+ color: var(--sirv-error);
341
+ }
342
+
343
+ .sirv-filelist__progress {
344
+ position: absolute;
345
+ bottom: 0;
346
+ left: 0;
347
+ right: 0;
348
+ height: 3px;
349
+ background: var(--sirv-border);
350
+ border-radius: 0 0 var(--sirv-radius-sm) var(--sirv-radius-sm);
351
+ overflow: hidden;
352
+ }
353
+
354
+ .sirv-filelist__progress-bar {
355
+ height: 100%;
356
+ background: var(--sirv-primary);
357
+ transition: width var(--sirv-transition);
358
+ }
359
+
360
+ .sirv-filelist__actions {
361
+ display: flex;
362
+ gap: var(--sirv-spacing-xs);
363
+ flex-shrink: 0;
364
+ }
365
+
366
+ .sirv-filelist__action {
367
+ display: flex;
368
+ align-items: center;
369
+ justify-content: center;
370
+ width: 28px;
371
+ height: 28px;
372
+ padding: 0;
373
+ background: none;
374
+ border: none;
375
+ border-radius: var(--sirv-radius-sm);
376
+ color: var(--sirv-text-muted);
377
+ cursor: pointer;
378
+ transition: all var(--sirv-transition);
379
+ }
380
+
381
+ .sirv-filelist__action:hover {
382
+ background: var(--sirv-bg-muted);
383
+ color: var(--sirv-text);
384
+ }
385
+
386
+ .sirv-filelist__action svg {
387
+ width: 16px;
388
+ height: 16px;
389
+ }
390
+
391
+ .sirv-filelist__action--remove:hover {
392
+ color: var(--sirv-error);
393
+ }
394
+
395
+ .sirv-filelist__check {
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: center;
399
+ width: 28px;
400
+ height: 28px;
401
+ color: var(--sirv-success);
402
+ }
403
+
404
+ .sirv-filelist__check svg {
405
+ width: 18px;
406
+ height: 18px;
407
+ }
408
+
409
+ /* Summary */
410
+ .sirv-filelist-summary {
411
+ display: flex;
412
+ gap: var(--sirv-spacing);
413
+ padding: var(--sirv-spacing-sm) var(--sirv-spacing);
414
+ font-size: var(--sirv-font-size-sm);
415
+ color: var(--sirv-text-muted);
416
+ border-top: 1px solid var(--sirv-border);
417
+ }
418
+
419
+ .sirv-filelist-summary__success {
420
+ color: var(--sirv-success);
421
+ }
422
+
423
+ .sirv-filelist-summary__error {
424
+ color: var(--sirv-error);
425
+ }
426
+
427
+ /* =============================================================================
428
+ FilePicker Modal
429
+ ============================================================================= */
430
+
431
+ .sirv-filepicker-overlay {
432
+ position: fixed;
433
+ inset: 0;
434
+ background: rgba(0, 0, 0, 0.5);
435
+ display: flex;
436
+ align-items: center;
437
+ justify-content: center;
438
+ z-index: 9999;
439
+ padding: var(--sirv-spacing);
440
+ }
441
+
442
+ @media (prefers-color-scheme: dark) {
443
+ .sirv-filepicker-overlay {
444
+ background: rgba(0, 0, 0, 0.7);
445
+ }
446
+ }
447
+
448
+ .sirv-filepicker {
449
+ width: 100%;
450
+ max-width: 800px;
451
+ max-height: 90vh;
452
+ background: var(--sirv-bg);
453
+ border-radius: var(--sirv-radius-lg);
454
+ box-shadow: var(--sirv-shadow-lg);
455
+ display: flex;
456
+ flex-direction: column;
457
+ overflow: hidden;
458
+ }
459
+
460
+ .sirv-filepicker__header {
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: space-between;
464
+ padding: var(--sirv-spacing);
465
+ border-bottom: 1px solid var(--sirv-border);
466
+ }
467
+
468
+ .sirv-filepicker__title {
469
+ margin: 0;
470
+ font-size: var(--sirv-font-size-lg);
471
+ font-weight: 600;
472
+ }
473
+
474
+ .sirv-filepicker__close {
475
+ display: flex;
476
+ align-items: center;
477
+ justify-content: center;
478
+ width: 32px;
479
+ height: 32px;
480
+ padding: 0;
481
+ background: none;
482
+ border: none;
483
+ border-radius: var(--sirv-radius-sm);
484
+ color: var(--sirv-text-muted);
485
+ cursor: pointer;
486
+ transition: all var(--sirv-transition);
487
+ }
488
+
489
+ .sirv-filepicker__close:hover {
490
+ background: var(--sirv-bg-muted);
491
+ color: var(--sirv-text);
492
+ }
493
+
494
+ .sirv-filepicker__close svg {
495
+ width: 20px;
496
+ height: 20px;
497
+ }
498
+
499
+ .sirv-filepicker__toolbar {
500
+ display: flex;
501
+ align-items: center;
502
+ gap: var(--sirv-spacing);
503
+ padding: var(--sirv-spacing-sm) var(--sirv-spacing);
504
+ background: var(--sirv-bg-subtle);
505
+ border-bottom: 1px solid var(--sirv-border);
506
+ }
507
+
508
+ .sirv-filepicker__breadcrumbs {
509
+ display: flex;
510
+ align-items: center;
511
+ gap: var(--sirv-spacing-xs);
512
+ flex: 1;
513
+ min-width: 0;
514
+ overflow-x: auto;
515
+ }
516
+
517
+ .sirv-filepicker__breadcrumb {
518
+ display: flex;
519
+ align-items: center;
520
+ padding: var(--sirv-spacing-xs) var(--sirv-spacing-sm);
521
+ background: none;
522
+ border: none;
523
+ border-radius: var(--sirv-radius-sm);
524
+ color: var(--sirv-text-muted);
525
+ font-size: var(--sirv-font-size-sm);
526
+ cursor: pointer;
527
+ white-space: nowrap;
528
+ transition: all var(--sirv-transition);
529
+ }
530
+
531
+ .sirv-filepicker__breadcrumb:hover {
532
+ background: var(--sirv-bg-muted);
533
+ color: var(--sirv-text);
534
+ }
535
+
536
+ .sirv-filepicker__breadcrumb svg {
537
+ width: 16px;
538
+ height: 16px;
539
+ }
540
+
541
+ .sirv-filepicker__breadcrumb-separator {
542
+ color: var(--sirv-text-subtle);
543
+ }
544
+
545
+ .sirv-filepicker__search-input {
546
+ width: 200px;
547
+ padding: var(--sirv-spacing-xs) var(--sirv-spacing-sm);
548
+ background: var(--sirv-bg);
549
+ border: 1px solid var(--sirv-border);
550
+ border-radius: var(--sirv-radius-sm);
551
+ font-size: var(--sirv-font-size-sm);
552
+ color: var(--sirv-text);
553
+ }
554
+
555
+ .sirv-filepicker__search-input:focus {
556
+ outline: none;
557
+ border-color: var(--sirv-primary);
558
+ }
559
+
560
+ .sirv-filepicker__content {
561
+ flex: 1;
562
+ overflow-y: auto;
563
+ padding: var(--sirv-spacing);
564
+ min-height: 300px;
565
+ }
566
+
567
+ .sirv-filepicker__loading,
568
+ .sirv-filepicker__empty,
569
+ .sirv-filepicker__error {
570
+ display: flex;
571
+ flex-direction: column;
572
+ align-items: center;
573
+ justify-content: center;
574
+ height: 200px;
575
+ color: var(--sirv-text-muted);
576
+ gap: var(--sirv-spacing-sm);
577
+ }
578
+
579
+ .sirv-filepicker__spinner {
580
+ width: 32px;
581
+ height: 32px;
582
+ border: 3px solid var(--sirv-border);
583
+ border-top-color: var(--sirv-primary);
584
+ border-radius: 50%;
585
+ animation: sirv-spin 0.8s linear infinite;
586
+ }
587
+
588
+ .sirv-filepicker__grid {
589
+ display: grid;
590
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
591
+ gap: var(--sirv-spacing-sm);
592
+ }
593
+
594
+ .sirv-filepicker__item {
595
+ display: flex;
596
+ flex-direction: column;
597
+ align-items: center;
598
+ gap: var(--sirv-spacing-xs);
599
+ padding: var(--sirv-spacing-sm);
600
+ background: var(--sirv-bg-subtle);
601
+ border: 2px solid transparent;
602
+ border-radius: var(--sirv-radius);
603
+ cursor: pointer;
604
+ transition: all var(--sirv-transition);
605
+ position: relative;
606
+ }
607
+
608
+ .sirv-filepicker__item:hover {
609
+ background: var(--sirv-bg-muted);
610
+ }
611
+
612
+ .sirv-filepicker__item--selected {
613
+ border-color: var(--sirv-primary);
614
+ background: var(--sirv-primary-light);
615
+ }
616
+
617
+ .sirv-filepicker__item-icon {
618
+ width: 48px;
619
+ height: 48px;
620
+ display: flex;
621
+ align-items: center;
622
+ justify-content: center;
623
+ color: var(--sirv-text-muted);
624
+ }
625
+
626
+ .sirv-filepicker__item-icon svg {
627
+ width: 32px;
628
+ height: 32px;
629
+ }
630
+
631
+ .sirv-filepicker__item--folder .sirv-filepicker__item-icon {
632
+ color: var(--sirv-warning);
633
+ }
634
+
635
+ .sirv-filepicker__item-thumbnail {
636
+ width: 80px;
637
+ height: 60px;
638
+ border-radius: var(--sirv-radius-sm);
639
+ overflow: hidden;
640
+ background: var(--sirv-bg-muted);
641
+ }
642
+
643
+ .sirv-filepicker__item-thumbnail img {
644
+ width: 100%;
645
+ height: 100%;
646
+ object-fit: cover;
647
+ }
648
+
649
+ .sirv-filepicker__item-name {
650
+ font-size: var(--sirv-font-size-sm);
651
+ text-align: center;
652
+ word-break: break-word;
653
+ max-width: 100%;
654
+ overflow: hidden;
655
+ text-overflow: ellipsis;
656
+ display: -webkit-box;
657
+ -webkit-line-clamp: 2;
658
+ -webkit-box-orient: vertical;
659
+ }
660
+
661
+ .sirv-filepicker__item-size {
662
+ font-size: 10px;
663
+ color: var(--sirv-text-subtle);
664
+ }
665
+
666
+ .sirv-filepicker__item-check {
667
+ position: absolute;
668
+ top: var(--sirv-spacing-xs);
669
+ right: var(--sirv-spacing-xs);
670
+ width: 20px;
671
+ height: 20px;
672
+ background: var(--sirv-primary);
673
+ border-radius: 50%;
674
+ display: flex;
675
+ align-items: center;
676
+ justify-content: center;
677
+ color: white;
678
+ }
679
+
680
+ .sirv-filepicker__item-check svg {
681
+ width: 12px;
682
+ height: 12px;
683
+ }
684
+
685
+ .sirv-filepicker__footer {
686
+ display: flex;
687
+ align-items: center;
688
+ justify-content: space-between;
689
+ padding: var(--sirv-spacing);
690
+ border-top: 1px solid var(--sirv-border);
691
+ background: var(--sirv-bg-subtle);
692
+ }
693
+
694
+ .sirv-filepicker__selection-count {
695
+ font-size: var(--sirv-font-size-sm);
696
+ color: var(--sirv-text-muted);
697
+ }
698
+
699
+ .sirv-filepicker__actions {
700
+ display: flex;
701
+ gap: var(--sirv-spacing-sm);
702
+ }
703
+
704
+ .sirv-filepicker__btn {
705
+ padding: var(--sirv-spacing-sm) var(--sirv-spacing);
706
+ background: var(--sirv-bg);
707
+ border: 1px solid var(--sirv-border);
708
+ border-radius: var(--sirv-radius-sm);
709
+ font-size: var(--sirv-font-size);
710
+ font-weight: 500;
711
+ color: var(--sirv-text);
712
+ cursor: pointer;
713
+ transition: all var(--sirv-transition);
714
+ }
715
+
716
+ .sirv-filepicker__btn:hover {
717
+ background: var(--sirv-bg-muted);
718
+ }
719
+
720
+ .sirv-filepicker__btn--primary {
721
+ background: var(--sirv-primary);
722
+ border-color: var(--sirv-primary);
723
+ color: white;
724
+ }
725
+
726
+ .sirv-filepicker__btn--primary:hover {
727
+ background: var(--sirv-primary-hover);
728
+ }
729
+
730
+ .sirv-filepicker__btn:disabled {
731
+ opacity: 0.5;
732
+ cursor: not-allowed;
733
+ }
734
+
735
+ /* =============================================================================
736
+ Toolbar / Actions
737
+ ============================================================================= */
738
+
739
+ .sirv-uploader__toolbar {
740
+ display: flex;
741
+ align-items: center;
742
+ justify-content: space-between;
743
+ padding: var(--sirv-spacing-sm) var(--sirv-spacing);
744
+ border-top: 1px solid var(--sirv-border);
745
+ background: var(--sirv-bg-subtle);
746
+ }
747
+
748
+ .sirv-uploader__toolbar-left,
749
+ .sirv-uploader__toolbar-right {
750
+ display: flex;
751
+ gap: var(--sirv-spacing-sm);
752
+ }
753
+
754
+ .sirv-btn {
755
+ display: inline-flex;
756
+ align-items: center;
757
+ gap: var(--sirv-spacing-xs);
758
+ padding: var(--sirv-spacing-sm) var(--sirv-spacing);
759
+ background: var(--sirv-bg);
760
+ border: 1px solid var(--sirv-border);
761
+ border-radius: var(--sirv-radius-sm);
762
+ font-size: var(--sirv-font-size);
763
+ font-weight: 500;
764
+ color: var(--sirv-text);
765
+ cursor: pointer;
766
+ transition: all var(--sirv-transition);
767
+ }
768
+
769
+ .sirv-btn:hover {
770
+ background: var(--sirv-bg-muted);
771
+ }
772
+
773
+ .sirv-btn--primary {
774
+ background: var(--sirv-primary);
775
+ border-color: var(--sirv-primary);
776
+ color: white;
777
+ }
778
+
779
+ .sirv-btn--primary:hover {
780
+ background: var(--sirv-primary-hover);
781
+ }
782
+
783
+ .sirv-btn:disabled {
784
+ opacity: 0.5;
785
+ cursor: not-allowed;
786
+ }
787
+
788
+ .sirv-btn svg {
789
+ width: 16px;
790
+ height: 16px;
791
+ }
792
+
793
+ /* =============================================================================
794
+ Spreadsheet Import
795
+ ============================================================================= */
796
+
797
+ .sirv-spreadsheet {
798
+ padding: var(--sirv-spacing);
799
+ }
800
+
801
+ .sirv-spreadsheet__drop {
802
+ display: flex;
803
+ flex-direction: column;
804
+ align-items: center;
805
+ justify-content: center;
806
+ min-height: 150px;
807
+ padding: var(--sirv-spacing);
808
+ border: 2px dashed var(--sirv-border-strong);
809
+ border-radius: var(--sirv-radius);
810
+ background: var(--sirv-bg-subtle);
811
+ cursor: pointer;
812
+ transition: all var(--sirv-transition);
813
+ }
814
+
815
+ .sirv-spreadsheet__drop:hover {
816
+ border-color: var(--sirv-primary);
817
+ background: var(--sirv-primary-light);
818
+ }
819
+
820
+ .sirv-spreadsheet__icon {
821
+ width: 40px;
822
+ height: 40px;
823
+ color: var(--sirv-text-muted);
824
+ margin-bottom: var(--sirv-spacing-sm);
825
+ }
826
+
827
+ .sirv-spreadsheet__text {
828
+ font-size: var(--sirv-font-size);
829
+ color: var(--sirv-text);
830
+ margin: 0;
831
+ }
832
+
833
+ .sirv-spreadsheet__hint {
834
+ font-size: var(--sirv-font-size-sm);
835
+ color: var(--sirv-text-muted);
836
+ margin: var(--sirv-spacing-xs) 0 0;
837
+ }
838
+
839
+ .sirv-spreadsheet__preview {
840
+ margin-top: var(--sirv-spacing);
841
+ }
842
+
843
+ .sirv-spreadsheet__table {
844
+ width: 100%;
845
+ border-collapse: collapse;
846
+ font-size: var(--sirv-font-size-sm);
847
+ }
848
+
849
+ .sirv-spreadsheet__table th,
850
+ .sirv-spreadsheet__table td {
851
+ padding: var(--sirv-spacing-xs) var(--sirv-spacing-sm);
852
+ border: 1px solid var(--sirv-border);
853
+ text-align: left;
854
+ }
855
+
856
+ .sirv-spreadsheet__table th {
857
+ background: var(--sirv-bg-subtle);
858
+ font-weight: 600;
859
+ }
860
+
861
+ .sirv-spreadsheet__stats {
862
+ display: flex;
863
+ gap: var(--sirv-spacing);
864
+ margin-top: var(--sirv-spacing);
865
+ font-size: var(--sirv-font-size-sm);
866
+ }
867
+
868
+ .sirv-spreadsheet__stat--valid {
869
+ color: var(--sirv-success);
870
+ }
871
+
872
+ .sirv-spreadsheet__stat--invalid {
873
+ color: var(--sirv-error);
874
+ }