@visns-studio/visns-components 5.15.5 → 5.15.7

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.
@@ -1,241 +1,180 @@
1
1
  /* Mapbox GL and Mapbox Geocoder styles are imported in the component file */
2
2
 
3
+ // Uses project color variables for consistency
4
+
3
5
  .cameraPlacement {
4
6
  padding: 0;
5
7
  margin: 0;
6
8
  height: 100vh;
7
9
  display: flex;
8
10
  flex-direction: column;
9
- background: #f8fafc;
11
+ background: var(--bg);
10
12
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
11
13
 
12
- .header {
13
- background: #374151;
14
+ .header {
15
+ background: var(--primary-color);
14
16
  padding: 16px 32px;
15
17
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
16
- border-bottom: none;
18
+ border-bottom: 1px solid rgba(var(--primary-rgb), 0.7);
17
19
  z-index: 100;
18
20
  position: relative;
19
21
 
20
- border-bottom: 1px solid #4b5563;
22
+ .headerContent {
23
+ display: flex;
24
+ justify-content: space-between;
25
+ align-items: center;
26
+ }
21
27
 
22
- .title {
28
+ .title {
23
29
  font-size: 24px;
24
30
  font-weight: 700;
25
31
  color: white;
26
- margin: 0 0 16px 0;
32
+ margin: 0;
27
33
  text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
28
34
  letter-spacing: -0.5px;
29
35
  }
30
36
 
31
- .controls {
37
+ .controls {
32
38
  display: flex;
33
- gap: 16px;
39
+ gap: 12px;
34
40
  align-items: center;
35
- flex-wrap: wrap;
36
- justify-content: space-between;
41
+ }
37
42
 
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
- }
43
+ .iconButton {
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ width: 44px;
48
+ height: 44px;
49
+ padding: 0;
50
+ background: var(--secondary-color, #6b7280);
51
+ color: white;
52
+ border: none;
53
+ border-radius: var(--br, 8px);
54
+ cursor: pointer;
55
+ transition: all 0.2s ease;
56
+ border: 1px solid rgba(var(--secondary-rgb, 107, 114, 128), 1);
57
+ position: relative;
58
+ margin: 0 2px;
92
59
 
93
- .rightControls {
94
- display: flex;
95
- gap: 12px;
60
+ &::after {
61
+ content: attr(title);
62
+ position: absolute;
63
+ bottom: -35px;
64
+ left: 50%;
65
+ transform: translateX(-50%);
66
+ background: rgba(0, 0, 0, 0.8);
67
+ color: white;
68
+ padding: 6px 8px;
69
+ border-radius: 4px;
70
+ font-size: 12px;
71
+ white-space: nowrap;
72
+ opacity: 0;
73
+ visibility: hidden;
74
+ transition: all 0.2s ease;
75
+ z-index: 1000;
76
+ pointer-events: none;
96
77
  }
97
78
 
98
- .searchContainer {
99
- position: relative;
100
- flex: 1;
101
- max-width: 500px;
102
- margin-right: 20px;
79
+ &::before {
80
+ content: '';
81
+ position: absolute;
82
+ bottom: -28px;
83
+ left: 50%;
84
+ transform: translateX(-50%);
85
+ width: 0;
86
+ height: 0;
87
+ border-left: 4px solid transparent;
88
+ border-right: 4px solid transparent;
89
+ border-bottom: 4px solid rgba(0, 0, 0, 0.8);
90
+ opacity: 0;
91
+ visibility: hidden;
92
+ transition: all 0.2s ease;
93
+ z-index: 1000;
94
+ pointer-events: none;
103
95
  }
104
96
 
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);
97
+ &:hover::after,
98
+ &:hover::before {
99
+ opacity: 1;
100
+ visibility: visible;
113
101
  }
114
102
 
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
- }
103
+ &:hover:not(:disabled) {
104
+ background: rgba(var(--secondary-rgb, 107, 114, 128), 0.8);
105
+ transform: translateY(-2px);
106
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
107
+ }
149
108
 
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
- }
109
+ &:disabled {
110
+ background: var(--muted-color, #9ca3af);
111
+ cursor: not-allowed;
112
+ opacity: 0.6;
113
+ transform: none;
114
+
115
+ &::after,
116
+ &::before {
117
+ display: none;
159
118
  }
119
+ }
160
120
 
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
- }
121
+ &.uploadBtn {
122
+ background: var(--success-color, #059669);
123
+ border-color: rgba(var(--success-rgb, 5, 150, 105), 1);
124
+
125
+ &:hover:not(:disabled) {
126
+ background: rgba(var(--success-rgb, 5, 150, 105), 0.8);
127
+ transform: translateY(-2px);
128
+ box-shadow: 0 4px 12px rgba(var(--success-rgb, 5, 150, 105), 0.3);
170
129
  }
130
+ }
171
131
 
172
- &.activeControl {
173
- background: #3b82f6 !important;
174
- border-color: #2563eb !important;
132
+ &.saveFileBtn {
133
+ background: var(--secondary-color, #6b7280);
134
+ border-color: rgba(var(--secondary-rgb, 107, 114, 128), 1);
135
+ color: white !important;
136
+
137
+ svg {
175
138
  color: white !important;
176
- box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3);
139
+ opacity: 1 !important;
140
+ }
141
+
142
+ &:hover:not(:disabled) {
143
+ background: rgba(var(--secondary-rgb, 107, 114, 128), 0.8);
144
+ transform: translateY(-2px);
145
+ box-shadow: 0 4px 12px rgba(var(--secondary-rgb, 107, 114, 128), 0.3);
177
146
 
178
- &:hover:not(:disabled) {
179
- background: #2563eb !important;
180
- box-shadow: 0 3px 12px rgba(59, 130, 246, 0.4) !important;
147
+ svg {
148
+ color: white !important;
181
149
  }
182
150
  }
183
151
  }
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
152
 
153
+ &.loadFileBtn {
154
+ background: var(--neutral-color, #64748b);
155
+ border-color: rgba(var(--neutral-rgb, 100, 116, 139), 1);
156
+
208
157
  &:hover:not(:disabled) {
209
- background: #4b5563;
210
- transform: translateY(-1px);
211
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
158
+ background: rgba(var(--neutral-rgb, 100, 116, 139), 0.8);
159
+ transform: translateY(-2px);
160
+ box-shadow: 0 4px 12px rgba(var(--neutral-rgb, 100, 116, 139), 0.3);
212
161
  }
162
+ }
213
163
 
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
- }
164
+ &.exportBtn {
165
+ background: var(--success-color, #10b981);
166
+ border-color: rgba(var(--success-rgb, 16, 185, 129), 1);
225
167
 
226
- &.uploadBtn {
227
- background: #059669;
228
- border-color: #10b981;
229
-
230
- &:hover:not(:disabled) {
231
- background: #047857;
232
- }
168
+ &:hover:not(:disabled) {
169
+ background: rgba(var(--success-rgb, 16, 185, 129), 0.8);
170
+ transform: translateY(-2px);
171
+ box-shadow: 0 4px 12px rgba(var(--success-rgb, 16, 185, 129), 0.3);
233
172
  }
234
173
  }
235
174
  }
236
175
  }
237
176
 
238
- .mainContent {
177
+ .mainContent {
239
178
  display: flex;
240
179
  flex: 1;
241
180
  overflow: hidden;
@@ -243,7 +182,7 @@
243
182
  position: relative;
244
183
  }
245
184
 
246
- .mapContainer {
185
+ .mapContainer {
247
186
  flex: 1;
248
187
  position: relative;
249
188
  min-height: calc(100vh - 100px);
@@ -294,86 +233,332 @@
294
233
  }
295
234
  }
296
235
 
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 {
236
+ .imageContainer {
237
+ flex: 1;
316
238
  position: relative;
317
- width: 100%;
318
- height: 100%;
319
- display: flex;
320
- align-items: center;
321
- justify-content: center;
239
+ min-height: calc(100vh - 100px);
240
+ height: calc(100vh - 100px);
241
+ width: calc(100% - 400px);
242
+ background: var(--bg);
243
+ overflow: hidden;
244
+ cursor: default;
322
245
 
323
- .uploadedImage {
324
- max-width: 100%;
325
- max-height: 100%;
326
- object-fit: contain;
327
- user-select: none;
328
- pointer-events: none;
246
+ &.addMode {
247
+ cursor: crosshair;
329
248
  }
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
249
 
342
- .uploadIcon {
343
- font-size: 64px;
344
- margin-bottom: 20px;
345
- opacity: 0.5;
250
+ &.sidebarCollapsed {
251
+ width: 100%;
346
252
  }
347
253
 
348
- h3 {
349
- margin: 0 0 12px 0;
350
- font-size: 24px;
351
- font-weight: 600;
352
- color: #374151;
254
+ &.dragOver {
255
+ background: rgba(var(--primary-rgb), 0.05);
256
+ border: 2px dashed rgba(var(--primary-rgb), 0.3);
257
+
258
+ .uploadPlaceholder {
259
+ background: rgba(var(--primary-rgb), 0.1);
260
+ transform: scale(1.02);
261
+ transition: all 0.2s ease;
262
+
263
+ .dragDropHint {
264
+ background: rgba(var(--primary-rgb), 0.2);
265
+ border-color: rgba(var(--primary-rgb), 0.5);
266
+ }
267
+ }
353
268
  }
354
269
 
355
- p {
356
- margin: 0 0 24px 0;
357
- font-size: 16px;
358
- max-width: 400px;
359
- line-height: 1.5;
270
+ .imageWrapper {
271
+ position: relative;
272
+ width: 100%;
273
+ height: 100%;
274
+ display: flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+
278
+ .uploadedImage {
279
+ max-width: 100%;
280
+ max-height: 100%;
281
+ object-fit: contain;
282
+ user-select: none;
283
+ pointer-events: none;
284
+ }
360
285
  }
361
286
 
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;
287
+ .uploadPlaceholder {
288
+ display: flex;
289
+ flex-direction: column;
290
+ align-items: center;
291
+ justify-content: center;
292
+ height: 100%;
293
+ color: #64748b;
294
+ text-align: center;
295
+ padding: 40px;
372
296
 
373
- &:hover {
374
- background: #2563eb;
375
- transform: translateY(-1px);
376
- box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
297
+ .uploadIcon {
298
+ margin-bottom: 20px;
299
+ opacity: 0.5;
300
+ color: var(--primary-color);
301
+ display: flex;
302
+ justify-content: center;
303
+ }
304
+
305
+ h3 {
306
+ margin: 0 0 12px 0;
307
+ font-size: 24px;
308
+ font-weight: 600;
309
+ color: #374151;
310
+ }
311
+
312
+ p {
313
+ margin: 0 0 24px 0;
314
+ font-size: 16px;
315
+ max-width: 400px;
316
+ line-height: 1.5;
317
+ }
318
+
319
+ button {
320
+ padding: 12px 24px;
321
+ background: var(--primary-color);
322
+ color: white;
323
+ border: none;
324
+ border-radius: var(--br, 8px);
325
+ font-size: 16px;
326
+ font-weight: 600;
327
+ cursor: pointer;
328
+ transition: all 0.2s ease;
329
+
330
+ &:hover {
331
+ background: rgba(var(--primary-rgb), 0.8);
332
+ transform: translateY(-1px);
333
+ box-shadow: 0 4px 12px rgba(var(--primary-rgb), 0.3);
334
+ }
335
+ }
336
+
337
+ .dragDropHint {
338
+ margin-top: 20px;
339
+ padding: 12px 20px;
340
+ background: rgba(var(--primary-rgb), 0.1);
341
+ border-radius: var(--br, 8px);
342
+ border: 1px dashed rgba(var(--primary-rgb), 0.3);
343
+ display: flex;
344
+ align-items: center;
345
+ gap: 8px;
346
+
347
+ .hintIcon {
348
+ color: var(--primary-color);
349
+ flex-shrink: 0;
350
+ }
351
+
352
+ span {
353
+ font-size: 14px;
354
+ color: var(--paragraph-color, #64748b);
355
+ font-style: italic;
356
+ }
357
+ }
358
+ }
359
+ }
360
+
361
+ .sidebar {
362
+ position: absolute;
363
+ top: 70px;
364
+ right: 0;
365
+ width: 400px;
366
+ height: calc(100% - 70px);
367
+ background: var(--item-color);
368
+ border-left: 1px solid var(--border-color, #e5e7eb);
369
+ display: flex;
370
+ flex-direction: column;
371
+ z-index: 20;
372
+ box-shadow: -4px 0 16px rgba(0, 0, 0, 0.1);
373
+ transform: translateX(0);
374
+ transition: transform 0.3s ease;
375
+
376
+ &.collapsed {
377
+ transform: translateX(100%);
378
+ }
379
+
380
+ .sidebarHeader {
381
+ padding: 20px 24px;
382
+ border-bottom: 1px solid var(--border-color, #e5e7eb);
383
+ background: var(--surface-color, #f9fafb);
384
+ position: relative;
385
+ z-index: 1;
386
+
387
+ .sidebarTitle {
388
+ font-size: 18px;
389
+ font-weight: 700;
390
+ color: var(--heading-color, #1e293b);
391
+ margin: 0 0 6px 0;
392
+ letter-spacing: -0.3px;
393
+ }
394
+
395
+ .cameraCount {
396
+ font-size: 14px;
397
+ color: var(--paragraph-color, #64748b);
398
+ margin: 0;
399
+ font-weight: 500;
400
+ }
401
+ }
402
+
403
+ .camerasList {
404
+ flex: 1;
405
+ overflow-y: auto;
406
+ padding: 20px 24px;
407
+ position: relative;
408
+ z-index: 1;
409
+
410
+ &::-webkit-scrollbar {
411
+ width: 6px;
412
+ }
413
+
414
+ &::-webkit-scrollbar-track {
415
+ background: rgba(0, 0, 0, 0.05);
416
+ border-radius: 3px;
417
+ }
418
+
419
+ &::-webkit-scrollbar-thumb {
420
+ background: #d1d5db;
421
+ border-radius: 3px;
422
+
423
+ &:hover {
424
+ background: #9ca3af;
425
+ }
426
+ }
427
+
428
+ .cameraItem {
429
+ display: flex;
430
+ flex-direction: column;
431
+ padding: 16px;
432
+ background: var(--item-color);
433
+ border-radius: var(--br, 8px);
434
+ margin-bottom: 12px;
435
+ border: 1px solid var(--border-color, #e5e7eb);
436
+ transition: all 0.2s ease;
437
+ position: relative;
438
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
439
+
440
+ &::before {
441
+ content: '';
442
+ position: absolute;
443
+ top: 0;
444
+ left: 0;
445
+ right: 0;
446
+ height: 2px;
447
+ background: #6b7280;
448
+ transform: scaleX(0);
449
+ transition: transform 0.2s ease;
450
+ }
451
+
452
+ &:hover {
453
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
454
+ border-color: #d1d5db;
455
+ transform: translateY(-1px);
456
+
457
+ &::before {
458
+ transform: scaleX(1);
459
+ }
460
+ }
461
+
462
+ .cameraHeader {
463
+ display: flex;
464
+ justify-content: space-between;
465
+ align-items: center;
466
+ margin-bottom: 12px;
467
+
468
+ .sidebarCameraInfo {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 12px;
472
+ flex: 1;
473
+ }
474
+
475
+ .sidebarCameraImageContainer {
476
+ position: relative;
477
+ width: 40px;
478
+ height: 40px;
479
+ flex-shrink: 0;
480
+ }
481
+
482
+ .sidebarCameraImage {
483
+ width: 100%;
484
+ height: 100%;
485
+ object-fit: contain;
486
+ border-radius: 6px;
487
+ background: #f8fafc;
488
+ border: 1px solid #e5e7eb;
489
+ padding: 2px;
490
+ }
491
+
492
+ .sidebarCameraIcon {
493
+ display: flex;
494
+ align-items: center;
495
+ justify-content: center;
496
+ width: 40px;
497
+ height: 40px;
498
+ background: #f3f4f6;
499
+ border-radius: 6px;
500
+ }
501
+
502
+ .sidebarCameraText {
503
+ flex: 1;
504
+ min-width: 0;
505
+ }
506
+
507
+ .cameraName {
508
+ font-size: 18px;
509
+ font-weight: 700;
510
+ color: var(--heading-color, #1e293b);
511
+ margin: 0;
512
+ letter-spacing: -0.2px;
513
+ }
514
+
515
+ .cameraType {
516
+ padding: 6px 12px;
517
+ border-radius: 16px;
518
+ font-size: 11px;
519
+ font-weight: 700;
520
+ text-transform: uppercase;
521
+ letter-spacing: 0.5px;
522
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
523
+
524
+ &.indoor {
525
+ background: var(--success-color, #10b981);
526
+ color: white;
527
+ }
528
+
529
+ &.outdoor {
530
+ background: var(--warning-color, #f59e0b);
531
+ color: white;
532
+ }
533
+ }
534
+ }
535
+
536
+ .cameraDetails {
537
+ font-size: 14px;
538
+ color: var(--paragraph-color, #64748b);
539
+ margin-bottom: 10px;
540
+ line-height: 1.5;
541
+ font-weight: 500;
542
+ }
543
+
544
+ .cameraCoords {
545
+ font-size: 12px;
546
+ color: var(--paragraph-color, #6b7280);
547
+ font-family: 'SF Mono', Monaco, 'Consolas', monospace;
548
+ font-weight: 500;
549
+ margin-bottom: 16px;
550
+ background: var(--surface-color, #f3f4f6);
551
+ padding: 8px 12px;
552
+ border-radius: var(--br, 6px);
553
+ border: 1px solid var(--border-color, #e5e7eb);
554
+ }
555
+
556
+ .cameraActions {
557
+ display: flex;
558
+ gap: 6px;
559
+ align-items: center;
560
+ flex-shrink: 0;
561
+ }
377
562
  }
378
563
  }
379
564
  }
@@ -434,263 +619,183 @@
434
619
 
435
620
  .rotationHandle {
436
621
  position: absolute;
437
- top: -15px;
438
- right: -15px;
439
- width: 12px;
440
- height: 12px;
441
- background: #ef4444;
622
+ top: -8px;
623
+ right: -8px;
624
+ width: 16px;
625
+ height: 16px;
626
+ background: var(--primary-color);
442
627
  border: 2px solid white;
443
628
  border-radius: 50%;
444
629
  cursor: grab;
445
- opacity: 0;
446
- transition: opacity 0.2s ease;
447
- z-index: 10;
630
+ opacity: 0.9;
631
+ display: flex;
632
+ align-items: center;
633
+ justify-content: center;
634
+ transition: all 0.2s ease;
635
+ z-index: 1001;
636
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
448
637
 
449
638
  &:hover {
450
- cursor: grabbing;
639
+ opacity: 1;
640
+ cursor: grab;
641
+ transform: scale(1.25);
642
+ background: rgba(var(--primary-rgb), 0.8);
643
+ box-shadow: 0 3px 10px rgba(var(--primary-rgb), 0.6);
644
+ }
645
+
646
+ &:active {
647
+ background: rgba(var(--primary-rgb), 0.7);
648
+ transform: scale(1.1);
451
649
  }
452
650
 
453
651
  &::after {
454
652
  content: '';
455
653
  position: absolute;
456
- top: 50%;
457
- left: 50%;
458
- width: 2px;
654
+ width: 6px;
459
655
  height: 6px;
460
- background: white;
461
- transform: translate(-50%, -50%);
462
- border-radius: 1px;
656
+ border: 1px solid white;
657
+ border-left-color: transparent;
658
+ border-radius: 50%;
659
+ animation: spin 2s linear infinite;
463
660
  }
464
661
  }
465
662
 
466
- // Show rotation handle on marker hover
467
- .imageMarker:hover .rotationHandle {
468
- opacity: 1;
663
+ @keyframes spin {
664
+ 0% { transform: rotate(0deg); }
665
+ 100% { transform: rotate(360deg); }
469
666
  }
470
667
 
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
-
668
+ .imageMarker {
669
+ .rotationHandle {
670
+ pointer-events: auto;
671
+ z-index: 1001;
490
672
  }
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;
673
+
674
+ &:hover .rotationHandle {
675
+ opacity: 1;
676
+ transform: scale(1.15);
677
+ background: rgba(var(--primary-rgb), 0.8);
678
+ box-shadow: 0 4px 16px rgba(var(--primary-rgb), 0.5);
679
+ }
680
+
681
+ &.rotating {
682
+ .circularMarker {
683
+ transform: scale(1.1);
684
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
506
685
  }
507
-
508
- .cameraCount {
509
- font-size: 14px;
510
- color: #64748b;
511
- margin: 0;
512
- font-weight: 500;
686
+
687
+ .rotationHandle {
688
+ opacity: 1 !important;
689
+ transform: scale(1.3) !important;
690
+ background: rgba(var(--primary-rgb), 0.9) !important;
691
+ box-shadow: 0 8px 24px rgba(var(--primary-rgb), 0.6) !important;
692
+ cursor: grabbing !important;
693
+ z-index: 1002 !important;
513
694
  }
514
695
  }
696
+ }
515
697
 
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;
698
+ .cameraTooltip {
699
+ position: absolute;
700
+ background: white;
701
+ border: 2px solid #e5e7eb;
702
+ border-radius: 12px;
703
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);
704
+ padding: 0;
705
+ z-index: 999;
706
+ width: 280px;
707
+ pointer-events: none;
708
+ opacity: 0;
709
+ animation: fadeInTooltip 0.2s ease forwards;
710
+
711
+ @keyframes fadeInTooltip {
712
+ from {
713
+ opacity: 0;
714
+ transform: translateY(10px);
530
715
  }
531
-
532
- &::-webkit-scrollbar-thumb {
533
- background: #d1d5db;
534
- border-radius: 3px;
535
-
536
- &:hover {
537
- background: #9ca3af;
538
- }
716
+ to {
717
+ opacity: 1;
718
+ transform: translateY(0);
539
719
  }
720
+ }
721
+ }
540
722
 
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;
723
+ .tooltipImage {
724
+ width: 100%;
725
+ height: 80px;
726
+ overflow: hidden;
727
+ border-radius: 10px 10px 0 0;
728
+ background: #f8fafc;
729
+
730
+ img {
731
+ width: 100%;
732
+ height: 100%;
733
+ object-fit: contain;
734
+ padding: 8px;
735
+ }
736
+ }
580
737
 
581
- .cameraName {
582
- font-size: 18px;
583
- font-weight: 700;
584
- color: #1e293b;
585
- margin: 0;
586
- letter-spacing: -0.2px;
587
- }
738
+ .tooltipContent {
739
+ padding: 12px 16px;
740
+ }
588
741
 
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
- }
742
+ .tooltipTitle {
743
+ font-size: 14px;
744
+ font-weight: 600;
745
+ color: #1f2937;
746
+ margin-bottom: 8px;
747
+ line-height: 1.3;
748
+ }
602
749
 
603
- &.outdoor {
604
- background: #f59e0b;
605
- color: white;
606
- }
607
- }
608
- }
609
- }
750
+ .tooltipSpecs {
751
+ display: flex;
752
+ flex-direction: column;
753
+ gap: 4px;
754
+
755
+ div {
756
+ font-size: 12px;
757
+ color: #6b7280;
758
+ line-height: 1.4;
610
759
  }
611
760
  }
612
761
 
613
762
  .indoor {
614
- background: #10b981;
763
+ background: var(--success-color, #10b981);
615
764
  color: white;
616
765
  }
617
766
 
618
767
  .outdoor {
619
- background: #f59e0b;
768
+ background: var(--warning-color, #f59e0b);
620
769
  color: white;
621
770
  }
622
771
 
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 {
772
+ .iconBtn {
644
773
  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
- }
774
+ align-items: center;
775
+ justify-content: center;
776
+ width: 32px;
777
+ height: 32px;
778
+ border: none;
779
+ border-radius: var(--br, 6px);
780
+ background: var(--surface-color, #f3f4f6);
781
+ color: var(--paragraph-color, #6b7280);
782
+ cursor: pointer;
783
+ transition: all 0.2s ease;
784
+
785
+ &:hover {
786
+ background: var(--border-color, #e5e7eb);
787
+ color: var(--heading-color, #374151);
788
+ transform: translateY(-1px);
789
+ }
790
+
791
+ &:active {
792
+ transform: translateY(0);
793
+ }
794
+
795
+ &:nth-child(2) {
796
+ &:hover {
797
+ background: var(--danger-light, #fee2e2);
798
+ color: var(--danger-color, #dc2626);
694
799
  }
695
800
  }
696
801
  }
@@ -710,17 +815,17 @@
710
815
  }
711
816
 
712
817
  .modal {
713
- background: white;
714
- border-radius: 8px;
818
+ background: var(--item-color);
819
+ border-radius: var(--br, 8px);
715
820
  padding: 24px;
716
821
  max-width: 500px;
717
822
  width: 90%;
718
823
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
719
- border: 1px solid #e5e7eb;
824
+ border: 1px solid var(--border-color, #e5e7eb);
720
825
 
721
826
  h3 {
722
827
  margin: 0 0 20px 0;
723
- color: #374151;
828
+ color: var(--heading-color, #374151);
724
829
  font-size: 18px;
725
830
  font-weight: 600;
726
831
  text-align: center;
@@ -734,23 +839,23 @@
734
839
  display: block;
735
840
  margin-bottom: 8px;
736
841
  font-weight: 500;
737
- color: #555;
842
+ color: var(--paragraph-color, #555);
738
843
  font-size: 14px;
739
844
  }
740
845
 
741
846
  input[type="text"], select {
742
847
  width: 100%;
743
848
  padding: 10px 12px;
744
- border: 1px solid #d1d5db;
745
- border-radius: 6px;
849
+ border: 1px solid var(--border-color, #d1d5db);
850
+ border-radius: var(--br, 6px);
746
851
  font-size: 14px;
747
852
  transition: border-color 0.2s ease;
748
- background: #ffffff;
853
+ background: var(--item-color);
749
854
 
750
855
  &:focus {
751
856
  outline: none;
752
- border-color: #6b7280;
753
- box-shadow: 0 0 0 3px rgba(107, 114, 128, 0.1);
857
+ border-color: var(--primary-color);
858
+ box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.1);
754
859
  }
755
860
  }
756
861
 
@@ -758,7 +863,7 @@
758
863
  width: 100%;
759
864
  height: 6px;
760
865
  border-radius: 3px;
761
- background: #e5e7eb;
866
+ background: var(--border-color, #e5e7eb);
762
867
  outline: none;
763
868
 
764
869
  &::-webkit-slider-thumb {
@@ -766,7 +871,7 @@
766
871
  width: 18px;
767
872
  height: 18px;
768
873
  border-radius: 50%;
769
- background: #6b7280;
874
+ background: var(--primary-color);
770
875
  cursor: pointer;
771
876
  }
772
877
 
@@ -774,7 +879,7 @@
774
879
  width: 18px;
775
880
  height: 18px;
776
881
  border-radius: 50%;
777
- background: #6b7280;
882
+ background: var(--primary-color);
778
883
  cursor: pointer;
779
884
  border: none;
780
885
  }
@@ -795,35 +900,34 @@
795
900
  button {
796
901
  padding: 10px 20px;
797
902
  border: none;
798
- border-radius: 6px;
903
+ border-radius: var(--br, 6px);
799
904
  cursor: pointer;
800
905
  font-weight: 500;
801
906
  transition: all 0.2s ease;
802
907
 
803
908
  &:first-child {
804
- background: #3b82f6;
909
+ background: var(--primary-color);
805
910
  color: white;
806
911
 
807
912
  &:hover {
808
- background: #2563eb;
913
+ background: rgba(var(--primary-rgb), 0.8);
809
914
  }
810
915
  }
811
916
 
812
917
  &:last-child {
813
- background: #6b7280;
918
+ background: var(--secondary-color, #6b7280);
814
919
  color: white;
815
920
 
816
921
  &:hover {
817
- background: #4b5563;
922
+ background: rgba(var(--secondary-rgb, 107, 114, 128), 0.8);
818
923
  }
819
924
  }
820
925
  }
821
926
  }
822
927
 
823
- // New Camera Selection Modal Styles
824
928
  .cameraSelectionModal {
825
- background: white;
826
- border-radius: 12px;
929
+ background: var(--item-color);
930
+ border-radius: var(--br, 12px);
827
931
  max-width: 1200px;
828
932
  width: 90vw;
829
933
  max-height: 90vh;
@@ -838,14 +942,14 @@
838
942
  justify-content: space-between;
839
943
  align-items: center;
840
944
  padding: 24px 32px;
841
- border-bottom: 1px solid #e5e7eb;
842
- background: #f9fafb;
945
+ border-bottom: 1px solid var(--border-color, #e5e7eb);
946
+ background: var(--surface-color, #f9fafb);
843
947
 
844
948
  h3 {
845
949
  margin: 0;
846
950
  font-size: 24px;
847
951
  font-weight: 700;
848
- color: #111827;
952
+ color: var(--heading-color, #111827);
849
953
  }
850
954
 
851
955
  .closeBtn {
@@ -1001,12 +1105,33 @@
1001
1105
  gap: 12px;
1002
1106
  }
1003
1107
 
1108
+ .cameraImageContainer {
1109
+ position: relative;
1110
+ width: 60px;
1111
+ height: 60px;
1112
+ flex-shrink: 0;
1113
+ border: 2px solid #10b981;
1114
+ border-radius: 8px;
1115
+ background: #fef3c7;
1116
+ }
1117
+
1118
+ .cameraImage {
1119
+ width: 100%;
1120
+ height: 100%;
1121
+ object-fit: contain;
1122
+ border-radius: 8px;
1123
+ background: #f8fafc;
1124
+ border: 1px solid #e5e7eb;
1125
+ padding: 4px;
1126
+ transition: transform 0.2s ease;
1127
+ }
1128
+
1004
1129
  .cameraIcon {
1005
1130
  display: flex;
1006
1131
  align-items: center;
1007
1132
  justify-content: center;
1008
- width: 40px;
1009
- height: 40px;
1133
+ width: 60px;
1134
+ height: 60px;
1010
1135
  background: #f3f4f6;
1011
1136
  border-radius: 8px;
1012
1137
  flex-shrink: 0;
@@ -1108,7 +1233,6 @@
1108
1233
  font-style: italic;
1109
1234
  }
1110
1235
 
1111
- // Updated modal actions for new design
1112
1236
  .cameraSelectionModal .modalActions {
1113
1237
  display: flex;
1114
1238
  justify-content: space-between;
@@ -1172,7 +1296,6 @@
1172
1296
  }
1173
1297
  }
1174
1298
 
1175
- /* Global styles for map markers and geocoder */
1176
1299
  :global {
1177
1300
  .camera-map-marker {
1178
1301
  background: rgba(0, 0, 0, 0.9);
@@ -1297,7 +1420,6 @@
1297
1420
  min-width: 100% !important;
1298
1421
  }
1299
1422
 
1300
- // Enhanced map controls for Mapbox GL
1301
1423
  .mapboxgl-ctrl-group {
1302
1424
  border-radius: 12px !important;
1303
1425
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15) !important;