@visns-studio/visns-components 5.15.3 → 5.15.5

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,1318 @@
1
+ /* Mapbox GL and Mapbox Geocoder styles are imported in the component file */
2
+
3
+ .cameraPlacement {
4
+ padding: 0;
5
+ margin: 0;
6
+ height: 100vh;
7
+ display: flex;
8
+ flex-direction: column;
9
+ background: #f8fafc;
10
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
11
+
12
+ .header {
13
+ background: #374151;
14
+ padding: 16px 32px;
15
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
16
+ border-bottom: none;
17
+ z-index: 100;
18
+ position: relative;
19
+
20
+ border-bottom: 1px solid #4b5563;
21
+
22
+ .title {
23
+ font-size: 24px;
24
+ font-weight: 700;
25
+ color: white;
26
+ margin: 0 0 16px 0;
27
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
28
+ letter-spacing: -0.5px;
29
+ }
30
+
31
+ .controls {
32
+ display: flex;
33
+ gap: 16px;
34
+ align-items: center;
35
+ flex-wrap: wrap;
36
+ justify-content: space-between;
37
+
38
+ .leftControls {
39
+ display: flex;
40
+ gap: 16px;
41
+ align-items: center;
42
+ flex: 1;
43
+
44
+ .uploadBtn {
45
+ padding: 8px 16px;
46
+ background: #059669;
47
+ color: white;
48
+ border: none;
49
+ border-radius: 6px;
50
+ cursor: pointer;
51
+ font-weight: 500;
52
+ font-size: 13px;
53
+ transition: all 0.2s ease;
54
+ border: 1px solid #10b981;
55
+
56
+ &:hover:not(:disabled) {
57
+ background: #047857;
58
+ transform: translateY(-1px);
59
+ box-shadow: 0 2px 8px rgba(5, 150, 105, 0.3);
60
+ }
61
+ }
62
+
63
+ .addCameraBtn {
64
+ padding: 8px 16px;
65
+ background: #3b82f6;
66
+ color: white;
67
+ border: none;
68
+ border-radius: 6px;
69
+ cursor: pointer;
70
+ font-weight: 500;
71
+ font-size: 13px;
72
+ transition: all 0.2s ease;
73
+ border: 1px solid #2563eb;
74
+
75
+ &:hover:not(:disabled) {
76
+ background: #2563eb;
77
+ transform: translateY(-1px);
78
+ box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3);
79
+ }
80
+
81
+ &.activeControl {
82
+ background: #ef4444 !important;
83
+ border-color: #dc2626 !important;
84
+
85
+ &:hover:not(:disabled) {
86
+ background: #dc2626 !important;
87
+ box-shadow: 0 2px 8px rgba(239, 68, 68, 0.3) !important;
88
+ }
89
+ }
90
+ }
91
+ }
92
+
93
+ .rightControls {
94
+ display: flex;
95
+ gap: 12px;
96
+ }
97
+
98
+ .searchContainer {
99
+ position: relative;
100
+ flex: 1;
101
+ max-width: 500px;
102
+ margin-right: 20px;
103
+ }
104
+
105
+ .mapControls {
106
+ display: flex;
107
+ gap: 8px;
108
+ background: rgba(255, 255, 255, 0.9);
109
+ padding: 6px;
110
+ border-radius: 8px;
111
+ border: 1px solid rgba(255, 255, 255, 0.4);
112
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
113
+ }
114
+
115
+ button {
116
+ padding: 8px 16px;
117
+ background: #6b7280;
118
+ color: white;
119
+ border: none;
120
+ border-radius: 6px;
121
+ cursor: pointer;
122
+ font-weight: 500;
123
+ font-size: 13px;
124
+ transition: all 0.2s ease;
125
+ border: 1px solid #9ca3af;
126
+
127
+ &:hover:not(:disabled) {
128
+ background: #4b5563;
129
+ transform: translateY(-1px);
130
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
131
+ }
132
+
133
+ &:disabled {
134
+ background: #9ca3af;
135
+ cursor: not-allowed;
136
+ opacity: 0.6;
137
+ }
138
+
139
+ &.saveFileBtn {
140
+ background: #8b5cf6;
141
+ border-color: #7c3aed;
142
+
143
+ &:hover:not(:disabled) {
144
+ background: #7c3aed;
145
+ transform: translateY(-1px);
146
+ box-shadow: 0 2px 8px rgba(139, 92, 246, 0.3);
147
+ }
148
+ }
149
+
150
+ &.loadFileBtn {
151
+ background: #f59e0b;
152
+ border-color: #d97706;
153
+
154
+ &:hover:not(:disabled) {
155
+ background: #d97706;
156
+ transform: translateY(-1px);
157
+ box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);
158
+ }
159
+ }
160
+
161
+ &.exportBtn {
162
+ background: #10b981;
163
+ border-color: #059669;
164
+
165
+ &:hover:not(:disabled) {
166
+ background: #059669;
167
+ transform: translateY(-1px);
168
+ box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3);
169
+ }
170
+ }
171
+
172
+ &.activeControl {
173
+ background: #3b82f6 !important;
174
+ border-color: #2563eb !important;
175
+ color: white !important;
176
+ box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3);
177
+
178
+ &:hover:not(:disabled) {
179
+ background: #2563eb !important;
180
+ box-shadow: 0 3px 12px rgba(59, 130, 246, 0.4) !important;
181
+ }
182
+ }
183
+ }
184
+ }
185
+
186
+ .imageControls {
187
+ display: flex;
188
+ gap: 8px;
189
+ background: rgba(255, 255, 255, 0.9);
190
+ padding: 6px;
191
+ border-radius: 8px;
192
+ border: 1px solid rgba(255, 255, 255, 0.4);
193
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
194
+ margin-right: 16px;
195
+
196
+ button {
197
+ padding: 8px 16px;
198
+ background: #6b7280;
199
+ color: white;
200
+ border: none;
201
+ border-radius: 6px;
202
+ cursor: pointer;
203
+ font-weight: 500;
204
+ font-size: 13px;
205
+ transition: all 0.2s ease;
206
+ border: 1px solid #9ca3af;
207
+
208
+ &:hover:not(:disabled) {
209
+ background: #4b5563;
210
+ transform: translateY(-1px);
211
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
212
+ }
213
+
214
+ &.activeControl {
215
+ background: #3b82f6 !important;
216
+ border-color: #2563eb !important;
217
+ color: white !important;
218
+ box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3);
219
+
220
+ &:hover:not(:disabled) {
221
+ background: #2563eb !important;
222
+ box-shadow: 0 3px 12px rgba(59, 130, 246, 0.4) !important;
223
+ }
224
+ }
225
+
226
+ &.uploadBtn {
227
+ background: #059669;
228
+ border-color: #10b981;
229
+
230
+ &:hover:not(:disabled) {
231
+ background: #047857;
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
237
+
238
+ .mainContent {
239
+ display: flex;
240
+ flex: 1;
241
+ overflow: hidden;
242
+ gap: 0;
243
+ position: relative;
244
+ }
245
+
246
+ .mapContainer {
247
+ flex: 1;
248
+ position: relative;
249
+ min-height: calc(100vh - 100px);
250
+ height: calc(100vh - 100px);
251
+ width: 100%;
252
+ border-radius: 0;
253
+ overflow: hidden;
254
+
255
+ // Enhanced zoom controls styling for Mapbox GL
256
+ :global(.mapboxgl-ctrl-top-right) {
257
+ top: 20px;
258
+ right: 20px;
259
+
260
+ .mapboxgl-ctrl {
261
+ margin-bottom: 10px;
262
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
263
+ border-radius: 8px;
264
+
265
+ button {
266
+ width: 44px;
267
+ height: 44px;
268
+ font-size: 18px;
269
+ font-weight: bold;
270
+ border-radius: 8px;
271
+ transition: all 0.2s ease;
272
+
273
+ &:hover {
274
+ background-color: #f1f5f9 !important;
275
+ transform: scale(1.05);
276
+ }
277
+
278
+ &:active {
279
+ transform: scale(0.95);
280
+ }
281
+ }
282
+ }
283
+
284
+ .mapboxgl-ctrl-zoom-in {
285
+ border-bottom: 1px solid #e2e8f0;
286
+ }
287
+
288
+ .mapboxgl-ctrl-fullscreen {
289
+ .mapboxgl-ctrl-icon {
290
+ width: 20px;
291
+ height: 20px;
292
+ }
293
+ }
294
+ }
295
+ }
296
+
297
+ .imageContainer {
298
+ flex: 1;
299
+ position: relative;
300
+ min-height: calc(100vh - 100px);
301
+ height: calc(100vh - 100px);
302
+ width: calc(100% - 400px); /* Account for sidebar width */
303
+ background: #f8fafc;
304
+ overflow: hidden;
305
+ cursor: default;
306
+
307
+ &.addMode {
308
+ cursor: crosshair;
309
+ }
310
+
311
+ &.sidebarCollapsed {
312
+ width: 100%; /* Full width when sidebar is collapsed */
313
+ }
314
+
315
+ .imageWrapper {
316
+ position: relative;
317
+ width: 100%;
318
+ height: 100%;
319
+ display: flex;
320
+ align-items: center;
321
+ justify-content: center;
322
+
323
+ .uploadedImage {
324
+ max-width: 100%;
325
+ max-height: 100%;
326
+ object-fit: contain;
327
+ user-select: none;
328
+ pointer-events: none;
329
+ }
330
+ }
331
+
332
+ .uploadPlaceholder {
333
+ display: flex;
334
+ flex-direction: column;
335
+ align-items: center;
336
+ justify-content: center;
337
+ height: 100%;
338
+ color: #64748b;
339
+ text-align: center;
340
+ padding: 40px;
341
+
342
+ .uploadIcon {
343
+ font-size: 64px;
344
+ margin-bottom: 20px;
345
+ opacity: 0.5;
346
+ }
347
+
348
+ h3 {
349
+ margin: 0 0 12px 0;
350
+ font-size: 24px;
351
+ font-weight: 600;
352
+ color: #374151;
353
+ }
354
+
355
+ p {
356
+ margin: 0 0 24px 0;
357
+ font-size: 16px;
358
+ max-width: 400px;
359
+ line-height: 1.5;
360
+ }
361
+
362
+ button {
363
+ padding: 12px 24px;
364
+ background: #3b82f6;
365
+ color: white;
366
+ border: none;
367
+ border-radius: 8px;
368
+ font-size: 16px;
369
+ font-weight: 600;
370
+ cursor: pointer;
371
+ transition: all 0.2s ease;
372
+
373
+ &:hover {
374
+ background: #2563eb;
375
+ transform: translateY(-1px);
376
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
377
+ }
378
+ }
379
+ }
380
+ }
381
+
382
+ .imageMarker {
383
+ z-index: 10;
384
+ pointer-events: none;
385
+
386
+ .imageMarkerContent {
387
+ pointer-events: auto;
388
+ cursor: pointer;
389
+ }
390
+ }
391
+
392
+ .circularMarker {
393
+ width: 40px;
394
+ height: 40px;
395
+ border-radius: 50%;
396
+ background: rgba(107, 114, 128, 0.9);
397
+ color: white;
398
+ display: flex;
399
+ align-items: center;
400
+ justify-content: center;
401
+ font-size: 14px;
402
+ font-weight: 700;
403
+ cursor: pointer;
404
+ border: 3px solid white;
405
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
406
+ transition: all 0.2s ease;
407
+ pointer-events: auto;
408
+
409
+ &:hover {
410
+ transform: scale(1.1);
411
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
412
+ }
413
+
414
+ &.indoor {
415
+ background: rgba(16, 185, 129, 0.9);
416
+ }
417
+
418
+ &.outdoor {
419
+ background: rgba(245, 158, 11, 0.9);
420
+ }
421
+
422
+ &.ptzMarker {
423
+ border-color: #ef4444;
424
+ border-width: 4px;
425
+ }
426
+ }
427
+
428
+ .markerNumber {
429
+ color: white;
430
+ font-size: 14px;
431
+ font-weight: 700;
432
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
433
+ }
434
+
435
+ .rotationHandle {
436
+ position: absolute;
437
+ top: -15px;
438
+ right: -15px;
439
+ width: 12px;
440
+ height: 12px;
441
+ background: #ef4444;
442
+ border: 2px solid white;
443
+ border-radius: 50%;
444
+ cursor: grab;
445
+ opacity: 0;
446
+ transition: opacity 0.2s ease;
447
+ z-index: 10;
448
+
449
+ &:hover {
450
+ cursor: grabbing;
451
+ }
452
+
453
+ &::after {
454
+ content: '';
455
+ position: absolute;
456
+ top: 50%;
457
+ left: 50%;
458
+ width: 2px;
459
+ height: 6px;
460
+ background: white;
461
+ transform: translate(-50%, -50%);
462
+ border-radius: 1px;
463
+ }
464
+ }
465
+
466
+ // Show rotation handle on marker hover
467
+ .imageMarker:hover .rotationHandle {
468
+ opacity: 1;
469
+ }
470
+
471
+ .sidebar {
472
+ position: absolute;
473
+ top: 0;
474
+ right: 0;
475
+ width: 400px;
476
+ height: 100%;
477
+ background: #ffffff;
478
+ border-left: 1px solid #e5e7eb;
479
+ display: flex;
480
+ flex-direction: column;
481
+ z-index: 20;
482
+ box-shadow: -4px 0 16px rgba(0, 0, 0, 0.1);
483
+ transform: translateX(0);
484
+ transition: transform 0.3s ease;
485
+
486
+ &.collapsed {
487
+ transform: translateX(100%);
488
+ }
489
+
490
+ }
491
+
492
+ .sidebarHeader {
493
+ padding: 20px 24px;
494
+ border-bottom: 1px solid #e5e7eb;
495
+ background: #f9fafb;
496
+ position: relative;
497
+ z-index: 1;
498
+
499
+
500
+ .sidebarTitle {
501
+ font-size: 18px;
502
+ font-weight: 700;
503
+ color: #1e293b;
504
+ margin: 0 0 6px 0;
505
+ letter-spacing: -0.3px;
506
+ }
507
+
508
+ .cameraCount {
509
+ font-size: 14px;
510
+ color: #64748b;
511
+ margin: 0;
512
+ font-weight: 500;
513
+ }
514
+ }
515
+
516
+ .camerasList {
517
+ flex: 1;
518
+ overflow-y: auto;
519
+ padding: 20px 24px;
520
+ position: relative;
521
+ z-index: 1;
522
+
523
+ &::-webkit-scrollbar {
524
+ width: 6px;
525
+ }
526
+
527
+ &::-webkit-scrollbar-track {
528
+ background: rgba(0, 0, 0, 0.05);
529
+ border-radius: 3px;
530
+ }
531
+
532
+ &::-webkit-scrollbar-thumb {
533
+ background: #d1d5db;
534
+ border-radius: 3px;
535
+
536
+ &:hover {
537
+ background: #9ca3af;
538
+ }
539
+ }
540
+
541
+ .cameraItem {
542
+ display: flex;
543
+ flex-direction: column;
544
+ padding: 16px;
545
+ background: #ffffff;
546
+ border-radius: 8px;
547
+ margin-bottom: 12px;
548
+ border: 1px solid #e5e7eb;
549
+ transition: all 0.2s ease;
550
+ position: relative;
551
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
552
+
553
+ &::before {
554
+ content: '';
555
+ position: absolute;
556
+ top: 0;
557
+ left: 0;
558
+ right: 0;
559
+ height: 2px;
560
+ background: #6b7280;
561
+ transform: scaleX(0);
562
+ transition: transform 0.2s ease;
563
+ }
564
+
565
+ &:hover {
566
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
567
+ border-color: #d1d5db;
568
+ transform: translateY(-1px);
569
+
570
+ &::before {
571
+ transform: scaleX(1);
572
+ }
573
+ }
574
+
575
+ .cameraHeader {
576
+ display: flex;
577
+ justify-content: space-between;
578
+ align-items: center;
579
+ margin-bottom: 12px;
580
+
581
+ .cameraName {
582
+ font-size: 18px;
583
+ font-weight: 700;
584
+ color: #1e293b;
585
+ margin: 0;
586
+ letter-spacing: -0.2px;
587
+ }
588
+
589
+ .cameraType {
590
+ padding: 6px 12px;
591
+ border-radius: 16px;
592
+ font-size: 11px;
593
+ font-weight: 700;
594
+ text-transform: uppercase;
595
+ letter-spacing: 0.5px;
596
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
597
+
598
+ &.indoor {
599
+ background: #10b981;
600
+ color: white;
601
+ }
602
+
603
+ &.outdoor {
604
+ background: #f59e0b;
605
+ color: white;
606
+ }
607
+ }
608
+ }
609
+ }
610
+ }
611
+ }
612
+
613
+ .indoor {
614
+ background: #10b981;
615
+ color: white;
616
+ }
617
+
618
+ .outdoor {
619
+ background: #f59e0b;
620
+ color: white;
621
+ }
622
+
623
+ .cameraDetails {
624
+ font-size: 14px;
625
+ color: #64748b;
626
+ margin-bottom: 10px;
627
+ line-height: 1.5;
628
+ font-weight: 500;
629
+ }
630
+
631
+ .cameraCoords {
632
+ font-size: 12px;
633
+ color: #6b7280;
634
+ font-family: 'SF Mono', Monaco, 'Consolas', monospace;
635
+ font-weight: 500;
636
+ margin-bottom: 16px;
637
+ background: #f3f4f6;
638
+ padding: 8px 12px;
639
+ border-radius: 6px;
640
+ border: 1px solid #e5e7eb;
641
+ }
642
+
643
+ .cameraActions {
644
+ display: flex;
645
+ gap: 12px;
646
+
647
+ button {
648
+ flex: 1;
649
+ padding: 10px 16px;
650
+ border: none;
651
+ border-radius: 8px;
652
+ cursor: pointer;
653
+ font-size: 13px;
654
+ font-weight: 600;
655
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
656
+ position: relative;
657
+ overflow: hidden;
658
+
659
+ &::before {
660
+ content: '';
661
+ position: absolute;
662
+ top: 0;
663
+ left: -100%;
664
+ width: 100%;
665
+ height: 100%;
666
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
667
+ transition: left 0.5s ease;
668
+ }
669
+
670
+ &:hover::before {
671
+ left: 100%;
672
+ }
673
+
674
+ &.editBtn {
675
+ background: #3b82f6;
676
+ color: white;
677
+ border: 1px solid #2563eb;
678
+
679
+ &:hover {
680
+ background: #2563eb;
681
+ transform: translateY(-1px);
682
+ }
683
+ }
684
+
685
+ &.removeBtn {
686
+ background: #ef4444;
687
+ color: white;
688
+ border: 1px solid #dc2626;
689
+
690
+ &:hover {
691
+ background: #dc2626;
692
+ transform: translateY(-1px);
693
+ }
694
+ }
695
+ }
696
+ }
697
+
698
+ .modalOverlay {
699
+ position: fixed;
700
+ top: 0;
701
+ left: 0;
702
+ right: 0;
703
+ bottom: 0;
704
+ background: rgba(0, 0, 0, 0.4);
705
+ display: flex;
706
+ align-items: center;
707
+ justify-content: center;
708
+ z-index: 1000;
709
+ padding: 20px;
710
+ }
711
+
712
+ .modal {
713
+ background: white;
714
+ border-radius: 8px;
715
+ padding: 24px;
716
+ max-width: 500px;
717
+ width: 90%;
718
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
719
+ border: 1px solid #e5e7eb;
720
+
721
+ h3 {
722
+ margin: 0 0 20px 0;
723
+ color: #374151;
724
+ font-size: 18px;
725
+ font-weight: 600;
726
+ text-align: center;
727
+ }
728
+ }
729
+
730
+ .formGroup {
731
+ margin-bottom: 20px;
732
+
733
+ label {
734
+ display: block;
735
+ margin-bottom: 8px;
736
+ font-weight: 500;
737
+ color: #555;
738
+ font-size: 14px;
739
+ }
740
+
741
+ input[type="text"], select {
742
+ width: 100%;
743
+ padding: 10px 12px;
744
+ border: 1px solid #d1d5db;
745
+ border-radius: 6px;
746
+ font-size: 14px;
747
+ transition: border-color 0.2s ease;
748
+ background: #ffffff;
749
+
750
+ &:focus {
751
+ outline: none;
752
+ border-color: #6b7280;
753
+ box-shadow: 0 0 0 3px rgba(107, 114, 128, 0.1);
754
+ }
755
+ }
756
+
757
+ input[type="range"] {
758
+ width: 100%;
759
+ height: 6px;
760
+ border-radius: 3px;
761
+ background: #e5e7eb;
762
+ outline: none;
763
+
764
+ &::-webkit-slider-thumb {
765
+ appearance: none;
766
+ width: 18px;
767
+ height: 18px;
768
+ border-radius: 50%;
769
+ background: #6b7280;
770
+ cursor: pointer;
771
+ }
772
+
773
+ &::-moz-range-thumb {
774
+ width: 18px;
775
+ height: 18px;
776
+ border-radius: 50%;
777
+ background: #6b7280;
778
+ cursor: pointer;
779
+ border: none;
780
+ }
781
+ }
782
+
783
+ input[type="checkbox"] {
784
+ margin-right: 8px;
785
+ transform: scale(1.2);
786
+ }
787
+ }
788
+
789
+ .modalActions {
790
+ display: flex;
791
+ gap: 12px;
792
+ justify-content: flex-end;
793
+ margin-top: 30px;
794
+
795
+ button {
796
+ padding: 10px 20px;
797
+ border: none;
798
+ border-radius: 6px;
799
+ cursor: pointer;
800
+ font-weight: 500;
801
+ transition: all 0.2s ease;
802
+
803
+ &:first-child {
804
+ background: #3b82f6;
805
+ color: white;
806
+
807
+ &:hover {
808
+ background: #2563eb;
809
+ }
810
+ }
811
+
812
+ &:last-child {
813
+ background: #6b7280;
814
+ color: white;
815
+
816
+ &:hover {
817
+ background: #4b5563;
818
+ }
819
+ }
820
+ }
821
+ }
822
+
823
+ // New Camera Selection Modal Styles
824
+ .cameraSelectionModal {
825
+ background: white;
826
+ border-radius: 12px;
827
+ max-width: 1200px;
828
+ width: 90vw;
829
+ max-height: 90vh;
830
+ display: flex;
831
+ flex-direction: column;
832
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
833
+ overflow: hidden;
834
+ }
835
+
836
+ .modalHeader {
837
+ display: flex;
838
+ justify-content: space-between;
839
+ align-items: center;
840
+ padding: 24px 32px;
841
+ border-bottom: 1px solid #e5e7eb;
842
+ background: #f9fafb;
843
+
844
+ h3 {
845
+ margin: 0;
846
+ font-size: 24px;
847
+ font-weight: 700;
848
+ color: #111827;
849
+ }
850
+
851
+ .closeBtn {
852
+ background: none;
853
+ border: none;
854
+ font-size: 28px;
855
+ cursor: pointer;
856
+ color: #6b7280;
857
+ transition: color 0.2s ease;
858
+
859
+ &:hover {
860
+ color: #374151;
861
+ }
862
+ }
863
+ }
864
+
865
+ .modalContent {
866
+ flex: 1;
867
+ display: flex;
868
+ flex-direction: column;
869
+ overflow: hidden;
870
+ }
871
+
872
+ .topSection {
873
+ padding: 24px 32px;
874
+ border-bottom: 1px solid #e5e7eb;
875
+ background: white;
876
+
877
+ .formGroup {
878
+ margin-bottom: 20px;
879
+
880
+ label {
881
+ display: block;
882
+ margin-bottom: 8px;
883
+ font-weight: 600;
884
+ color: #374151;
885
+ font-size: 14px;
886
+ }
887
+
888
+ input {
889
+ width: 100%;
890
+ max-width: 400px;
891
+ padding: 10px 14px;
892
+ border: 2px solid #e5e7eb;
893
+ border-radius: 8px;
894
+ font-size: 14px;
895
+ transition: border-color 0.2s ease;
896
+
897
+ &:focus {
898
+ outline: none;
899
+ border-color: #3b82f6;
900
+ }
901
+ }
902
+ }
903
+ }
904
+
905
+ .categoryFilter {
906
+ label {
907
+ display: block;
908
+ margin-bottom: 12px;
909
+ font-weight: 600;
910
+ color: #374151;
911
+ font-size: 14px;
912
+ }
913
+ }
914
+
915
+ .categoryButtons {
916
+ display: flex;
917
+ gap: 8px;
918
+ flex-wrap: wrap;
919
+
920
+ button {
921
+ padding: 8px 16px;
922
+ background: #f3f4f6;
923
+ color: #6b7280;
924
+ border: 2px solid #e5e7eb;
925
+ border-radius: 20px;
926
+ cursor: pointer;
927
+ font-size: 13px;
928
+ font-weight: 500;
929
+ transition: all 0.2s ease;
930
+
931
+ &:hover {
932
+ background: #e5e7eb;
933
+ color: #374151;
934
+ }
935
+
936
+ &.active {
937
+ background: #3b82f6;
938
+ color: white;
939
+ border-color: #3b82f6;
940
+ }
941
+ }
942
+ }
943
+
944
+ .cameraGrid {
945
+ flex: 1;
946
+ padding: 24px 32px;
947
+ overflow-y: auto;
948
+ display: grid;
949
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
950
+ gap: 20px;
951
+
952
+ &::-webkit-scrollbar {
953
+ width: 8px;
954
+ }
955
+
956
+ &::-webkit-scrollbar-track {
957
+ background: #f1f5f9;
958
+ }
959
+
960
+ &::-webkit-scrollbar-thumb {
961
+ background: #cbd5e1;
962
+ border-radius: 4px;
963
+
964
+ &:hover {
965
+ background: #94a3b8;
966
+ }
967
+ }
968
+ }
969
+
970
+ .cameraCard {
971
+ background: white;
972
+ border: 2px solid #e5e7eb;
973
+ border-radius: 12px;
974
+ padding: 16px;
975
+ cursor: pointer;
976
+ transition: all 0.2s ease;
977
+ display: flex;
978
+ flex-direction: column;
979
+ gap: 12px;
980
+
981
+ &:hover {
982
+ border-color: #cbd5e1;
983
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
984
+ transform: translateY(-2px);
985
+ }
986
+
987
+ &.selectedCard {
988
+ border-color: #3b82f6;
989
+ background: #eff6ff;
990
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);
991
+
992
+ &:hover {
993
+ border-color: #2563eb;
994
+ }
995
+ }
996
+ }
997
+
998
+ .cardHeader {
999
+ display: flex;
1000
+ align-items: flex-start;
1001
+ gap: 12px;
1002
+ }
1003
+
1004
+ .cameraIcon {
1005
+ display: flex;
1006
+ align-items: center;
1007
+ justify-content: center;
1008
+ width: 40px;
1009
+ height: 40px;
1010
+ background: #f3f4f6;
1011
+ border-radius: 8px;
1012
+ flex-shrink: 0;
1013
+ }
1014
+
1015
+ .cameraTitle {
1016
+ flex: 1;
1017
+
1018
+ h4 {
1019
+ margin: 0 0 4px 0;
1020
+ font-size: 16px;
1021
+ font-weight: 600;
1022
+ color: #111827;
1023
+ line-height: 1.2;
1024
+ }
1025
+ }
1026
+
1027
+ .environmentBadge {
1028
+ display: inline-block;
1029
+ padding: 2px 8px;
1030
+ border-radius: 12px;
1031
+ font-size: 11px;
1032
+ font-weight: 600;
1033
+ text-transform: uppercase;
1034
+
1035
+ &.indoor {
1036
+ background: #dcfce7;
1037
+ color: #166534;
1038
+ }
1039
+
1040
+ &.outdoor {
1041
+ background: #fef3c7;
1042
+ color: #92400e;
1043
+ }
1044
+ }
1045
+
1046
+ .cardBody {
1047
+ display: flex;
1048
+ flex-direction: column;
1049
+ gap: 8px;
1050
+ position: relative;
1051
+
1052
+ .ptzBadge {
1053
+ position: absolute;
1054
+ top: -4px;
1055
+ right: 0;
1056
+ background: #ef4444;
1057
+ color: white;
1058
+ padding: 2px 6px;
1059
+ border-radius: 4px;
1060
+ font-size: 10px;
1061
+ font-weight: 700;
1062
+ }
1063
+ }
1064
+
1065
+ .specRow {
1066
+ display: flex;
1067
+ justify-content: space-between;
1068
+ align-items: center;
1069
+ }
1070
+
1071
+ .specLabel {
1072
+ font-size: 13px;
1073
+ color: #6b7280;
1074
+ font-weight: 500;
1075
+ }
1076
+
1077
+ .specValue {
1078
+ font-size: 13px;
1079
+ color: #111827;
1080
+ font-weight: 600;
1081
+ }
1082
+
1083
+ .cardFooter {
1084
+ border-top: 1px solid #f3f4f6;
1085
+ padding-top: 12px;
1086
+ margin-top: 4px;
1087
+ }
1088
+
1089
+ .features {
1090
+ display: flex;
1091
+ flex-wrap: wrap;
1092
+ gap: 4px;
1093
+ align-items: center;
1094
+ }
1095
+
1096
+ .featureBadge {
1097
+ background: #f3f4f6;
1098
+ color: #6b7280;
1099
+ padding: 2px 6px;
1100
+ border-radius: 4px;
1101
+ font-size: 10px;
1102
+ font-weight: 500;
1103
+ }
1104
+
1105
+ .moreFeatures {
1106
+ color: #6b7280;
1107
+ font-size: 11px;
1108
+ font-style: italic;
1109
+ }
1110
+
1111
+ // Updated modal actions for new design
1112
+ .cameraSelectionModal .modalActions {
1113
+ display: flex;
1114
+ justify-content: space-between;
1115
+ align-items: center;
1116
+ padding: 20px 32px;
1117
+ border-top: 1px solid #e5e7eb;
1118
+ background: #f9fafb;
1119
+ margin-top: 0;
1120
+ }
1121
+
1122
+ .selectedInfo {
1123
+ font-size: 14px;
1124
+ color: #6b7280;
1125
+ font-weight: 500;
1126
+ }
1127
+
1128
+ .actionButtons {
1129
+ display: flex;
1130
+ gap: 12px;
1131
+ }
1132
+
1133
+ .cancelBtn {
1134
+ padding: 10px 20px;
1135
+ background: #f3f4f6;
1136
+ color: #6b7280;
1137
+ border: 1px solid #d1d5db;
1138
+ border-radius: 8px;
1139
+ cursor: pointer;
1140
+ font-weight: 500;
1141
+ font-size: 14px;
1142
+ transition: all 0.2s ease;
1143
+
1144
+ &:hover {
1145
+ background: #e5e7eb;
1146
+ color: #374151;
1147
+ }
1148
+ }
1149
+
1150
+ .saveBtn {
1151
+ padding: 10px 24px;
1152
+ background: #3b82f6;
1153
+ color: white;
1154
+ border: none;
1155
+ border-radius: 8px;
1156
+ cursor: pointer;
1157
+ font-weight: 600;
1158
+ font-size: 14px;
1159
+ transition: all 0.2s ease;
1160
+
1161
+ &:hover:not(:disabled) {
1162
+ background: #2563eb;
1163
+ transform: translateY(-1px);
1164
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
1165
+ }
1166
+
1167
+ &:disabled {
1168
+ background: #d1d5db;
1169
+ cursor: not-allowed;
1170
+ transform: none;
1171
+ box-shadow: none;
1172
+ }
1173
+ }
1174
+
1175
+ /* Global styles for map markers and geocoder */
1176
+ :global {
1177
+ .camera-map-marker {
1178
+ background: rgba(0, 0, 0, 0.9);
1179
+ color: white;
1180
+ border-radius: 16px;
1181
+ padding: 6px 12px;
1182
+ font-size: 11px;
1183
+ font-weight: 600;
1184
+ cursor: pointer;
1185
+ white-space: nowrap;
1186
+ border: 2px solid white;
1187
+ transition: all 0.2s ease;
1188
+ min-width: 70px;
1189
+ text-align: center;
1190
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
1191
+
1192
+ &:hover {
1193
+ transform: scale(1.05);
1194
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
1195
+ }
1196
+
1197
+ &.indoor {
1198
+ background: rgba(0, 128, 0, 0.95);
1199
+ border-color: #00ff00;
1200
+ }
1201
+
1202
+ &.outdoor {
1203
+ background: rgba(255, 140, 0, 0.95);
1204
+ border-color: #ffa500;
1205
+ }
1206
+
1207
+ &.ptz {
1208
+ border-color: #ff4444;
1209
+ border-width: 3px;
1210
+ }
1211
+ }
1212
+
1213
+ .mapboxgl-popup {
1214
+ z-index: 1001;
1215
+ }
1216
+
1217
+ .mapboxgl-ctrl-geocoder {
1218
+ width: 100% !important;
1219
+ max-width: none !important;
1220
+ border-radius: 12px !important;
1221
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15) !important;
1222
+ backdrop-filter: blur(10px) !important;
1223
+ background: rgba(255, 255, 255, 0.95) !important;
1224
+ min-width: 100% !important;
1225
+
1226
+ .mapboxgl-ctrl-geocoder--input {
1227
+ height: 44px !important;
1228
+ padding: 0 50px 0 20px !important;
1229
+ font-size: 15px !important;
1230
+ border: 2px solid rgba(255, 255, 255, 0.3) !important;
1231
+ border-radius: 12px !important;
1232
+ background: rgba(255, 255, 255, 0.9) !important;
1233
+ color: #1e293b !important;
1234
+ font-weight: 500 !important;
1235
+ backdrop-filter: blur(10px) !important;
1236
+ width: 100% !important;
1237
+
1238
+ &::placeholder {
1239
+ color: #94a3b8 !important;
1240
+ font-weight: 400 !important;
1241
+ }
1242
+
1243
+ &:focus {
1244
+ border-color: #6b7280 !important;
1245
+ box-shadow: 0 0 0 3px rgba(107, 114, 128, 0.1) !important;
1246
+ background: rgba(255, 255, 255, 1) !important;
1247
+ outline: none !important;
1248
+ }
1249
+ }
1250
+
1251
+ .mapboxgl-ctrl-geocoder--button {
1252
+ top: 50% !important;
1253
+ transform: translateY(-50%) !important;
1254
+ right: 12px !important;
1255
+ background: none !important;
1256
+ width: 32px !important;
1257
+ height: 32px !important;
1258
+ border-radius: 8px !important;
1259
+ transition: all 0.2s ease !important;
1260
+
1261
+ &:hover {
1262
+ background: #f3f4f6 !important;
1263
+ }
1264
+
1265
+ .mapboxgl-ctrl-geocoder--icon {
1266
+ fill: #6b7280 !important;
1267
+ width: 18px !important;
1268
+ height: 18px !important;
1269
+ }
1270
+ }
1271
+
1272
+ .suggestions {
1273
+ border-radius: 12px !important;
1274
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15) !important;
1275
+ backdrop-filter: blur(20px) !important;
1276
+ background: rgba(255, 255, 255, 0.95) !important;
1277
+ border: 1px solid rgba(0, 0, 0, 0.1) !important;
1278
+ margin-top: 8px !important;
1279
+ width: 100% !important;
1280
+
1281
+ .suggestion {
1282
+ padding: 12px 20px !important;
1283
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05) !important;
1284
+ font-weight: 500 !important;
1285
+ transition: all 0.2s ease !important;
1286
+
1287
+ &:hover, &.suggestion--selected {
1288
+ background: #f3f4f6 !important;
1289
+ color: #374151 !important;
1290
+ }
1291
+ }
1292
+ }
1293
+ }
1294
+
1295
+ .mapboxgl-ctrl-geocoder.mapboxgl-ctrl-geocoder--collapsed {
1296
+ width: 100% !important;
1297
+ min-width: 100% !important;
1298
+ }
1299
+
1300
+ // Enhanced map controls for Mapbox GL
1301
+ .mapboxgl-ctrl-group {
1302
+ border-radius: 12px !important;
1303
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15) !important;
1304
+ backdrop-filter: blur(10px) !important;
1305
+ background: rgba(255, 255, 255, 0.9) !important;
1306
+ border: 1px solid rgba(255, 255, 255, 0.2) !important;
1307
+
1308
+ button {
1309
+ background: transparent !important;
1310
+ border: none !important;
1311
+ transition: all 0.2s ease !important;
1312
+
1313
+ &:hover {
1314
+ background: #f3f4f6 !important;
1315
+ }
1316
+ }
1317
+ }
1318
+ }