@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.
- package/README.md +53 -2
- package/package.json +4 -1
- package/src/components/CameraPlacement.jsx +1638 -0
- package/src/components/data/verkadaCameras.js +818 -0
- package/src/components/generic/GenericQuote.jsx +2 -20
- package/src/components/styles/CameraMarkers.scss +200 -0
- package/src/components/styles/CameraPlacement.module.scss +1318 -0
- package/src/components/styles/CameraPlacementModal.module.scss +185 -0
- package/src/components/styles/GenericQuote.module.scss +7 -6
- package/src/components/utils/CameraIcon.jsx +18 -0
- package/src/index.js +2 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// Additional styles for Verkada camera modal
|
|
2
|
+
.cameraSpec {
|
|
3
|
+
font-size: 12px;
|
|
4
|
+
color: #6b7280;
|
|
5
|
+
margin-bottom: 4px;
|
|
6
|
+
line-height: 1.4;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.noModel {
|
|
10
|
+
color: #ef4444;
|
|
11
|
+
font-style: italic;
|
|
12
|
+
font-size: 13px;
|
|
13
|
+
margin-bottom: 8px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.cameraPreview {
|
|
17
|
+
background: #f9fafb;
|
|
18
|
+
border: 1px solid #e5e7eb;
|
|
19
|
+
border-radius: 8px;
|
|
20
|
+
padding: 16px;
|
|
21
|
+
margin: 16px 0;
|
|
22
|
+
|
|
23
|
+
h4 {
|
|
24
|
+
margin: 0 0 12px 0;
|
|
25
|
+
color: #374151;
|
|
26
|
+
font-size: 16px;
|
|
27
|
+
font-weight: 600;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.cameraSpecs {
|
|
32
|
+
display: flex;
|
|
33
|
+
flex-direction: column;
|
|
34
|
+
gap: 6px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.specRow {
|
|
38
|
+
display: flex;
|
|
39
|
+
font-size: 13px;
|
|
40
|
+
line-height: 1.4;
|
|
41
|
+
color: #4b5563;
|
|
42
|
+
|
|
43
|
+
strong {
|
|
44
|
+
width: 100px;
|
|
45
|
+
flex-shrink: 0;
|
|
46
|
+
color: #374151;
|
|
47
|
+
font-weight: 500;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.directionHelper {
|
|
52
|
+
font-size: 11px;
|
|
53
|
+
color: #9ca3af;
|
|
54
|
+
margin-top: 4px;
|
|
55
|
+
text-align: center;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.directionControl {
|
|
59
|
+
background: #f8fafc;
|
|
60
|
+
border: 1px solid #e2e8f0;
|
|
61
|
+
border-radius: 6px;
|
|
62
|
+
padding: 12px;
|
|
63
|
+
margin: 8px 0;
|
|
64
|
+
|
|
65
|
+
label {
|
|
66
|
+
display: block;
|
|
67
|
+
font-size: 13px;
|
|
68
|
+
font-weight: 500;
|
|
69
|
+
color: #374151;
|
|
70
|
+
margin-bottom: 8px;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.directionSlider {
|
|
75
|
+
width: 100%;
|
|
76
|
+
height: 6px;
|
|
77
|
+
border-radius: 3px;
|
|
78
|
+
background: #e2e8f0;
|
|
79
|
+
outline: none;
|
|
80
|
+
opacity: 0.7;
|
|
81
|
+
transition: opacity 0.2s;
|
|
82
|
+
margin-bottom: 8px;
|
|
83
|
+
|
|
84
|
+
&:hover {
|
|
85
|
+
opacity: 1;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
&::-webkit-slider-thumb {
|
|
89
|
+
appearance: none;
|
|
90
|
+
width: 20px;
|
|
91
|
+
height: 20px;
|
|
92
|
+
border-radius: 50%;
|
|
93
|
+
background: #3b82f6;
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
box-shadow: 0 2px 6px rgba(59, 130, 246, 0.4);
|
|
96
|
+
transition: all 0.2s ease;
|
|
97
|
+
|
|
98
|
+
&:hover {
|
|
99
|
+
background: #2563eb;
|
|
100
|
+
transform: scale(1.1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
&::-moz-range-thumb {
|
|
105
|
+
width: 20px;
|
|
106
|
+
height: 20px;
|
|
107
|
+
border-radius: 50%;
|
|
108
|
+
background: #3b82f6;
|
|
109
|
+
cursor: pointer;
|
|
110
|
+
border: none;
|
|
111
|
+
box-shadow: 0 2px 6px rgba(59, 130, 246, 0.4);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.cameraModelName {
|
|
116
|
+
font-size: 14px;
|
|
117
|
+
color: #1f2937;
|
|
118
|
+
margin-bottom: 12px;
|
|
119
|
+
padding-bottom: 8px;
|
|
120
|
+
border-bottom: 1px solid #e5e7eb;
|
|
121
|
+
|
|
122
|
+
strong {
|
|
123
|
+
font-weight: 600;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.cameraSpecGrid {
|
|
128
|
+
display: grid;
|
|
129
|
+
grid-template-columns: 1fr 1fr;
|
|
130
|
+
gap: 8px;
|
|
131
|
+
margin-bottom: 12px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.specItem {
|
|
135
|
+
display: flex;
|
|
136
|
+
flex-direction: column;
|
|
137
|
+
gap: 2px;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.specLabel {
|
|
141
|
+
font-size: 11px;
|
|
142
|
+
font-weight: 500;
|
|
143
|
+
color: #6b7280;
|
|
144
|
+
text-transform: uppercase;
|
|
145
|
+
letter-spacing: 0.05em;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.specValue {
|
|
149
|
+
font-size: 12px;
|
|
150
|
+
color: #374151;
|
|
151
|
+
font-weight: 500;
|
|
152
|
+
|
|
153
|
+
&.indoor {
|
|
154
|
+
color: #059669;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
&.outdoor {
|
|
158
|
+
color: #d97706;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.cameraFeatures {
|
|
163
|
+
margin-bottom: 12px;
|
|
164
|
+
|
|
165
|
+
.specLabel {
|
|
166
|
+
display: block;
|
|
167
|
+
margin-bottom: 6px;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.featuresList {
|
|
172
|
+
display: flex;
|
|
173
|
+
flex-wrap: wrap;
|
|
174
|
+
gap: 4px;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.featureTag {
|
|
178
|
+
background: #f1f5f9;
|
|
179
|
+
color: #475569;
|
|
180
|
+
font-size: 10px;
|
|
181
|
+
font-weight: 500;
|
|
182
|
+
padding: 2px 6px;
|
|
183
|
+
border-radius: 4px;
|
|
184
|
+
border: 1px solid #e2e8f0;
|
|
185
|
+
}
|
|
@@ -246,10 +246,10 @@
|
|
|
246
246
|
background: white;
|
|
247
247
|
border-radius: 12px;
|
|
248
248
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
|
|
249
|
-
width:
|
|
250
|
-
max-width:
|
|
251
|
-
height:
|
|
252
|
-
max-height:
|
|
249
|
+
width: 98%;
|
|
250
|
+
max-width: 1600px;
|
|
251
|
+
height: 95vh;
|
|
252
|
+
max-height: 95vh;
|
|
253
253
|
display: flex;
|
|
254
254
|
flex-direction: column;
|
|
255
255
|
overflow: hidden;
|
|
@@ -313,7 +313,7 @@
|
|
|
313
313
|
|
|
314
314
|
.contentEditorBody {
|
|
315
315
|
flex: 1;
|
|
316
|
-
padding:
|
|
316
|
+
padding: 12px;
|
|
317
317
|
overflow: hidden;
|
|
318
318
|
background: var(--tertiary-color);
|
|
319
319
|
display: flex;
|
|
@@ -374,7 +374,8 @@
|
|
|
374
374
|
flex: 1; /* Take all remaining space */
|
|
375
375
|
display: flex;
|
|
376
376
|
flex-direction: column;
|
|
377
|
-
min-height:
|
|
377
|
+
min-height: 500px; /* Ensure minimum height for editor */
|
|
378
|
+
height: 100%; /* Fill available height */
|
|
378
379
|
|
|
379
380
|
/* TinyMCE overrides */
|
|
380
381
|
:global(.tox-tinymce) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
// Wrapper component to render Lucide icons for cameras
|
|
4
|
+
const CameraIcon = ({ icon: IconComponent, size = 16, className = '', ...props }) => {
|
|
5
|
+
if (!IconComponent) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<IconComponent
|
|
11
|
+
size={size}
|
|
12
|
+
className={className}
|
|
13
|
+
{...props}
|
|
14
|
+
/>
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default CameraIcon;
|
package/src/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import Autocomplete from './components/Autocomplete';
|
|
|
15
15
|
import Breadcrumb from './components/Breadcrumb';
|
|
16
16
|
import BusinessCardOcr from './components/BusinessCardOcr';
|
|
17
17
|
import Call from './components/Call';
|
|
18
|
+
import CameraPlacement from './components/CameraPlacement';
|
|
18
19
|
import ClientAssociationManager from './components/ClientAssociationManager';
|
|
19
20
|
import CustomFetch from './components/Fetch';
|
|
20
21
|
import Download from './components/Download';
|
|
@@ -93,6 +94,7 @@ export {
|
|
|
93
94
|
Breadcrumb,
|
|
94
95
|
BusinessCardOcr,
|
|
95
96
|
Call,
|
|
97
|
+
CameraPlacement,
|
|
96
98
|
CellWithTooltip,
|
|
97
99
|
ClientAssociationManager,
|
|
98
100
|
ClientLogin,
|