@visns-studio/visns-components 5.11.1 → 5.11.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.
Files changed (60) hide show
  1. package/package.json +2 -2
  2. package/src/components/cms/DataGrid.jsx +8 -8
  3. package/src/components/cms/DropZone.jsx +1 -1
  4. package/src/components/cms/Form.jsx +1 -1
  5. package/src/components/cms/Gallery.jsx +1 -1
  6. package/src/components/cms/sorting/Item.jsx +1 -1
  7. package/src/components/crm/AssociationManager.jsx +431 -0
  8. package/src/components/crm/Autocomplete.jsx +3 -3
  9. package/src/components/crm/Breadcrumb.jsx +4 -4
  10. package/src/components/crm/BusinessCardOcr.jsx +681 -95
  11. package/src/components/crm/ClientAssociationManager.jsx +362 -0
  12. package/src/components/crm/DataGrid.jsx +34 -32
  13. package/src/components/crm/Field.jsx +12 -12
  14. package/src/components/crm/Form.jsx +2 -2
  15. package/src/components/crm/MergeEntity.jsx +1049 -0
  16. package/src/components/crm/MultiSelect.jsx +14 -3
  17. package/src/components/crm/Navigation.jsx +14 -15
  18. package/src/components/crm/Notification.jsx +2 -2
  19. package/src/components/crm/QuickAction.jsx +3 -3
  20. package/src/components/crm/SectionHeader.jsx +1 -1
  21. package/src/components/crm/SwitchAccount.jsx +4 -4
  22. package/src/components/crm/auth/ClientLogin.jsx +2 -2
  23. package/src/components/crm/auth/ClientOTPVerify.jsx +2 -2
  24. package/src/components/crm/auth/Login.jsx +3 -3
  25. package/src/components/crm/auth/Reset.jsx +2 -2
  26. package/src/components/crm/auth/TwoFactorAuth.jsx +2 -2
  27. package/src/components/crm/cells/CellWithTooltip.jsx +35 -28
  28. package/src/components/crm/columns/ColumnRenderers.jsx +320 -259
  29. package/src/components/crm/controls/DataGridSearch.jsx +5 -5
  30. package/src/components/crm/generic/AlternativeActionModal.jsx +100 -0
  31. package/src/components/crm/generic/ContactSelectorModal.jsx +59 -16
  32. package/src/components/crm/generic/DateRangeSelectorModal.jsx +181 -0
  33. package/src/components/crm/generic/GenericClientPortal.jsx +1 -1
  34. package/src/components/crm/generic/GenericDashboard.jsx +4 -4
  35. package/src/components/crm/generic/GenericDetail.jsx +31 -6
  36. package/src/components/crm/generic/GenericDynamic.jsx +3 -3
  37. package/src/components/crm/generic/GenericEditableTable.jsx +4 -4
  38. package/src/components/crm/generic/GenericFormBuilder.jsx +6 -6
  39. package/src/components/crm/generic/GenericGrid.jsx +1622 -268
  40. package/src/components/crm/generic/GenericReport.jsx +966 -646
  41. package/src/components/crm/generic/GenericReportForm.jsx +1 -1
  42. package/src/components/crm/generic/NotificationList.jsx +1 -1
  43. package/src/components/crm/generic/ReasonCollectorModal.jsx +194 -0
  44. package/src/components/crm/generic/SortableQuoteItems.jsx +3 -3
  45. package/src/components/crm/generic/shared/formatters.js +107 -1
  46. package/src/components/crm/generic/styles/AlternativeActionModal.css +127 -0
  47. package/src/components/crm/generic/styles/DateRangeSelectorModal.css +115 -0
  48. package/src/components/crm/generic/styles/GenericIndex.module.scss +206 -0
  49. package/src/components/crm/generic/styles/GenericReport.module.scss +96 -0
  50. package/src/components/crm/generic/styles/ReasonCollectorModal.css +217 -0
  51. package/src/components/crm/modals/GalleryModal.jsx +2 -2
  52. package/src/components/crm/sorting/Item.jsx +3 -3
  53. package/src/components/crm/styles/AssociationManager.module.scss +364 -0
  54. package/src/components/crm/styles/BusinessCardOcr.module.scss +197 -4
  55. package/src/components/crm/styles/ClientAssociationManager.module.scss +290 -0
  56. package/src/components/crm/styles/MergeEntity.module.scss +690 -0
  57. package/src/components/crm/styles/MultiSelect.module.scss +18 -0
  58. package/src/components/crm/styles/Navigation.module.scss +68 -8
  59. package/src/components/crm/styles/global-datagrid.css +9 -0
  60. package/src/index.js +6 -0
@@ -0,0 +1,364 @@
1
+ .container {
2
+ padding: 20px;
3
+ background: var(--bg-color);
4
+ border-radius: var(--radius);
5
+ box-shadow: var(--box-shadow-small);
6
+ }
7
+
8
+ .header {
9
+ margin-bottom: 30px;
10
+ border-bottom: 1px solid rgba(var(--paragraph-rgb), 0.15);
11
+ padding-bottom: 15px;
12
+
13
+ h3 {
14
+ margin: 0 0 5px 0;
15
+ color: var(--primary-color);
16
+ font-size: 1.4em;
17
+ font-weight: 600;
18
+ }
19
+
20
+ p {
21
+ margin: 0;
22
+ color: var(--paragraph-color);
23
+ font-size: 0.9em;
24
+ opacity: 0.8;
25
+ }
26
+ }
27
+
28
+ .loading {
29
+ text-align: center;
30
+ padding: 40px;
31
+ color: var(--paragraph-color);
32
+ opacity: 0.7;
33
+ }
34
+
35
+ /* Multiple Primary Warning */
36
+ .multiplePrimaryWarning {
37
+ display: flex;
38
+ align-items: flex-start;
39
+ gap: 12px;
40
+ padding: 16px;
41
+ margin-bottom: 24px;
42
+ background: rgba(255, 193, 7, 0.1);
43
+ border: 1px solid rgba(255, 193, 7, 0.3);
44
+ border-left: 4px solid rgba(255, 193, 7, 1);
45
+ border-radius: var(--radius);
46
+ color: #856404;
47
+
48
+ .warningContent {
49
+ flex: 1;
50
+
51
+ strong {
52
+ display: block;
53
+ margin-bottom: 4px;
54
+ font-size: 0.95em;
55
+ }
56
+
57
+ p {
58
+ margin: 0 0 12px 0;
59
+ font-size: 0.85em;
60
+ line-height: 1.4;
61
+ opacity: 0.9;
62
+ }
63
+ }
64
+ }
65
+
66
+ .clearAllPrimaryBtn {
67
+ padding: 6px 12px;
68
+ background: rgba(255, 193, 7, 1);
69
+ color: #fff;
70
+ border: none;
71
+ border-radius: var(--radius);
72
+ font-size: 0.8em;
73
+ font-weight: 500;
74
+ cursor: pointer;
75
+ transition: all 0.2s ease;
76
+
77
+ &:hover {
78
+ background: rgba(255, 173, 7, 1);
79
+ transform: translateY(-1px);
80
+ }
81
+ }
82
+
83
+ /* Existing Associations */
84
+ .existingAssociations {
85
+ margin-bottom: 40px;
86
+
87
+ h4 {
88
+ margin: 0 0 15px 0;
89
+ color: var(--secondary-color);
90
+ font-size: 1.1em;
91
+ font-weight: 500;
92
+ }
93
+ }
94
+
95
+ .noAssociations {
96
+ padding: 20px;
97
+ text-align: center;
98
+ color: var(--paragraph-color);
99
+ background: rgba(var(--paragraph-rgb), 0.05);
100
+ border-radius: var(--radius);
101
+ font-style: italic;
102
+ opacity: 0.8;
103
+ }
104
+
105
+ .associationsList {
106
+ display: flex;
107
+ flex-direction: column;
108
+ gap: 12px;
109
+ }
110
+
111
+ .associationItem {
112
+ display: flex;
113
+ justify-content: space-between;
114
+ align-items: center;
115
+ padding: 15px;
116
+ border: 1px solid rgba(var(--paragraph-rgb), 0.15);
117
+ border-radius: var(--radius);
118
+ background: var(--tertiary-color);
119
+ transition: all 0.2s ease;
120
+
121
+ &:hover {
122
+ background: rgba(var(--paragraph-rgb), 0.05);
123
+ border-color: rgba(var(--paragraph-rgb), 0.25);
124
+ }
125
+
126
+ &.primary {
127
+ border-color: var(--primary-color);
128
+ background: rgba(var(--primary-rgb), 0.1);
129
+
130
+ &:hover {
131
+ background: rgba(var(--primary-rgb), 0.15);
132
+ }
133
+ }
134
+ }
135
+
136
+ .associationInfo {
137
+ flex: 1;
138
+
139
+ .entityName {
140
+ font-weight: 600;
141
+ color: var(--secondary-color);
142
+ margin-bottom: 4px;
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 8px;
146
+ }
147
+
148
+ .primaryBadge {
149
+ background: var(--primary-color);
150
+ color: var(--bg-color);
151
+ padding: 2px 6px;
152
+ border-radius: var(--radius);
153
+ font-size: 0.75em;
154
+ font-weight: 500;
155
+ text-transform: uppercase;
156
+ }
157
+
158
+ .relationshipInfo {
159
+ margin-bottom: 4px;
160
+
161
+ .relationshipType {
162
+ color: var(--paragraph-color);
163
+ font-weight: 500;
164
+ text-transform: capitalize;
165
+ }
166
+
167
+ .notes {
168
+ color: var(--paragraph-color);
169
+ font-size: 0.9em;
170
+ opacity: 0.7;
171
+ }
172
+ }
173
+
174
+ .associatedAt {
175
+ color: var(--paragraph-color);
176
+ font-size: 0.8em;
177
+ opacity: 0.6;
178
+ }
179
+ }
180
+
181
+ .associationActions {
182
+ display: flex;
183
+ gap: 8px;
184
+ align-items: center;
185
+ }
186
+
187
+ .setPrimaryBtn,
188
+ .removePrimaryBtn,
189
+ .removeBtn,
190
+ .associateBtn {
191
+ padding: 6px 12px;
192
+ border: none;
193
+ border-radius: var(--radius);
194
+ font-size: 0.85em;
195
+ cursor: pointer;
196
+ transition: all 0.2s ease;
197
+ font-weight: 500;
198
+
199
+ &:disabled {
200
+ opacity: 0.6;
201
+ cursor: not-allowed;
202
+ }
203
+ }
204
+
205
+ .setPrimaryBtn {
206
+ background: var(--highlight-color);
207
+ color: #ffffff;
208
+
209
+ &:hover:not(:disabled) {
210
+ background: #0056b3;
211
+ color: #ffffff;
212
+ transform: translateY(-1px);
213
+ }
214
+ }
215
+
216
+ .removePrimaryBtn {
217
+ background: rgba(108, 117, 125, 1);
218
+ color: var(--bg-color);
219
+
220
+ &:hover:not(:disabled) {
221
+ background: rgba(90, 98, 104, 1);
222
+ transform: translateY(-1px);
223
+ }
224
+ }
225
+
226
+ .removeBtn {
227
+ background: rgba(220, 53, 69, 1);
228
+ color: var(--bg-color);
229
+
230
+ &:hover:not(:disabled) {
231
+ background: rgba(200, 35, 51, 1);
232
+ transform: translateY(-1px);
233
+ }
234
+ }
235
+
236
+ .associateBtn {
237
+ background: var(--primary-color);
238
+ color: var(--bg-color);
239
+ padding: 10px 20px;
240
+ font-size: 0.9em;
241
+
242
+ &:hover:not(:disabled) {
243
+ background: rgba(var(--primary-rgb), 0.9);
244
+ transform: translateY(-1px);
245
+ }
246
+ }
247
+
248
+ /* New Association Form */
249
+ .newAssociation {
250
+ border-top: 1px solid rgba(var(--paragraph-rgb), 0.15);
251
+ padding-top: 30px;
252
+
253
+ h4 {
254
+ margin: 0 0 20px 0;
255
+ color: var(--secondary-color);
256
+ font-size: 1.1em;
257
+ font-weight: 500;
258
+ }
259
+ }
260
+
261
+ .associationForm {
262
+ background: rgba(var(--paragraph-rgb), 0.05);
263
+ padding: 20px;
264
+ border-radius: var(--radius);
265
+ border: 1px solid rgba(var(--paragraph-rgb), 0.1);
266
+ }
267
+
268
+ .formRow {
269
+ display: flex;
270
+ gap: 20px;
271
+ margin-bottom: 20px;
272
+
273
+ &:last-child {
274
+ margin-bottom: 0;
275
+ }
276
+
277
+ @media (max-width: 768px) {
278
+ flex-direction: column;
279
+ gap: 15px;
280
+ }
281
+ }
282
+
283
+ .formField {
284
+ flex: 1;
285
+
286
+ label {
287
+ display: block;
288
+ margin-bottom: 5px;
289
+ color: var(--secondary-color);
290
+ font-weight: 500;
291
+ font-size: 0.9em;
292
+
293
+ input[type="checkbox"] {
294
+ margin-right: 8px;
295
+ }
296
+ }
297
+ }
298
+
299
+ .selectField,
300
+ .textField {
301
+ width: 100%;
302
+ padding: 8px 12px;
303
+ border: 1px solid rgba(var(--paragraph-rgb), 0.25);
304
+ border-radius: var(--radius);
305
+ background: var(--bg-color);
306
+ font-size: 0.9em;
307
+ color: var(--paragraph-color);
308
+ transition: all 0.2s ease;
309
+
310
+ &:focus {
311
+ outline: none;
312
+ border-color: var(--primary-color);
313
+ box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.25);
314
+ }
315
+ }
316
+
317
+ .textareaField {
318
+ width: 100%;
319
+ padding: 8px 12px;
320
+ border: 1px solid rgba(var(--paragraph-rgb), 0.25);
321
+ border-radius: var(--radius);
322
+ background: var(--bg-color);
323
+ font-size: 0.9em;
324
+ color: var(--paragraph-color);
325
+ resize: vertical;
326
+ min-height: 60px;
327
+ transition: all 0.2s ease;
328
+
329
+ &:focus {
330
+ outline: none;
331
+ border-color: var(--primary-color);
332
+ box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.25);
333
+ }
334
+ }
335
+
336
+ .formActions {
337
+ margin-top: 20px;
338
+ text-align: right;
339
+ }
340
+
341
+ /* Responsive Design */
342
+ @media (max-width: 768px) {
343
+ .container {
344
+ padding: 15px;
345
+ }
346
+
347
+ .associationItem {
348
+ flex-direction: column;
349
+ align-items: flex-start;
350
+ gap: 15px;
351
+ }
352
+
353
+ .associationActions {
354
+ align-self: flex-end;
355
+ }
356
+
357
+ .formActions {
358
+ text-align: center;
359
+ }
360
+
361
+ .associateBtn {
362
+ width: 100%;
363
+ }
364
+ }
@@ -113,6 +113,7 @@
113
113
  display: flex;
114
114
  align-items: center;
115
115
  justify-content: center;
116
+ padding: 1rem;
116
117
  pointer-events: none;
117
118
  }
118
119
 
@@ -136,17 +137,43 @@
136
137
 
137
138
  .cameraControls {
138
139
  display: flex;
140
+ flex-direction: column;
139
141
  gap: 1rem;
140
- flex-wrap: wrap;
141
- justify-content: center;
142
- align-items: center;
142
+ padding: 1rem;
143
143
  }
144
144
 
145
145
  .captureButton {
146
146
  background: var(--primary-color, #007bff);
147
147
  color: white;
148
148
  border: none;
149
- border-radius: var(--br, 50px);
149
+ border-radius: 50%;
150
+ width: 80px;
151
+ height: 80px;
152
+ display: flex;
153
+ flex-direction: column;
154
+ align-items: center;
155
+ justify-content: center;
156
+ gap: 0.25rem;
157
+ font-size: 0.8rem;
158
+ font-weight: 600;
159
+ cursor: pointer;
160
+ transition: all 0.2s ease;
161
+ box-shadow: 0 4px 12px rgba(var(--primary-color-rgb, 0, 123, 255), 0.3);
162
+
163
+ &:hover:not(:disabled) {
164
+ background: var(--primary-hover, #0056b3);
165
+ transform: scale(1.05);
166
+ box-shadow: 0 6px 16px rgba(var(--primary-color-rgb, 0, 123, 255), 0.4);
167
+ }
168
+
169
+ &:disabled {
170
+ opacity: 0.6;
171
+ cursor: not-allowed;
172
+ }
173
+
174
+ &.focusing {
175
+ animation: pulse 1s infinite;
176
+ }
150
177
  padding: 0.5rem 1.25rem;
151
178
  font-size: 0.9rem;
152
179
  font-weight: var(--h-weight, 600);
@@ -907,3 +934,169 @@
907
934
  border-top-color: var(--primary-color, #007bff);
908
935
  }
909
936
  }
937
+
938
+ // Enhanced Camera UI Styles
939
+ .focusFrame {
940
+ position: relative;
941
+ width: 90%;
942
+ max-width: 500px;
943
+ aspect-ratio: 1.6; // Business card ratio
944
+ border: 2px solid rgba(255, 255, 255, 0.8);
945
+ border-radius: 12px;
946
+ background: rgba(0, 0, 0, 0.05);
947
+ display: flex;
948
+ align-items: center;
949
+ justify-content: center;
950
+
951
+ &::before {
952
+ content: '';
953
+ position: absolute;
954
+ top: -2px;
955
+ left: -2px;
956
+ right: -2px;
957
+ bottom: -2px;
958
+ border: 1px solid rgba(255, 255, 255, 0.4);
959
+ border-radius: 14px;
960
+ opacity: 0;
961
+ animation: pulse 2s infinite;
962
+ }
963
+ }
964
+
965
+ .focusCorner {
966
+ position: absolute;
967
+ width: 50px;
968
+ height: 50px;
969
+ border: 4px solid rgba(255, 255, 255, 0.9);
970
+ background: transparent;
971
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
972
+
973
+ &.topLeft {
974
+ top: -25px;
975
+ left: -25px;
976
+ border-right: none;
977
+ border-bottom: none;
978
+ border-radius: 16px 0 0 0;
979
+ }
980
+
981
+ &.topRight {
982
+ top: -25px;
983
+ right: -25px;
984
+ border-left: none;
985
+ border-bottom: none;
986
+ border-radius: 0 16px 0 0;
987
+ }
988
+
989
+ &.bottomLeft {
990
+ bottom: -25px;
991
+ left: -25px;
992
+ border-right: none;
993
+ border-top: none;
994
+ border-radius: 0 0 0 16px;
995
+ }
996
+
997
+ &.bottomRight {
998
+ bottom: -25px;
999
+ right: -25px;
1000
+ border-left: none;
1001
+ border-top: none;
1002
+ border-radius: 0 0 16px 0;
1003
+ }
1004
+ }
1005
+
1006
+ .focusIndicator {
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ align-items: center;
1010
+ gap: 0.5rem;
1011
+ color: var(--primary-color, #007bff);
1012
+ font-weight: 600;
1013
+ background: rgba(255, 255, 255, 0.9);
1014
+ padding: 1rem;
1015
+ border-radius: 12px;
1016
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1017
+
1018
+ .focusIcon {
1019
+ animation: spin 1s linear infinite;
1020
+ }
1021
+ }
1022
+
1023
+ .helpText {
1024
+ text-align: center;
1025
+ color: white;
1026
+ background: rgba(0, 0, 0, 0.7);
1027
+ padding: 1rem 1.5rem;
1028
+ border-radius: 12px;
1029
+ backdrop-filter: blur(8px);
1030
+
1031
+ p {
1032
+ margin: 0;
1033
+ font-size: 0.9rem;
1034
+ line-height: 1.4;
1035
+
1036
+ &:first-child {
1037
+ font-weight: 600;
1038
+ margin-bottom: 0.25rem;
1039
+ }
1040
+
1041
+ &:last-child {
1042
+ opacity: 0.8;
1043
+ }
1044
+ }
1045
+ }
1046
+
1047
+ .controlsTop {
1048
+ display: flex;
1049
+ justify-content: space-between;
1050
+ align-items: center;
1051
+ padding: 0 1rem;
1052
+ }
1053
+
1054
+ .controlsBottom {
1055
+ display: flex;
1056
+ justify-content: space-between;
1057
+ align-items: center;
1058
+ gap: 1rem;
1059
+ }
1060
+
1061
+ .controlButton {
1062
+ background: rgba(0, 0, 0, 0.6);
1063
+ color: white;
1064
+ border: none;
1065
+ border-radius: 50%;
1066
+ width: 48px;
1067
+ height: 48px;
1068
+ display: flex;
1069
+ align-items: center;
1070
+ justify-content: center;
1071
+ cursor: pointer;
1072
+ transition: all 0.2s ease;
1073
+ backdrop-filter: blur(8px);
1074
+
1075
+ &:hover {
1076
+ background: rgba(0, 0, 0, 0.8);
1077
+ transform: scale(1.05);
1078
+ }
1079
+
1080
+ &.active {
1081
+ background: var(--primary-color, #007bff);
1082
+ color: white;
1083
+
1084
+ &:hover {
1085
+ background: var(--primary-hover, #0056b3);
1086
+ }
1087
+ }
1088
+ }
1089
+
1090
+ .placeholder {
1091
+ width: 48px; // Same as controlButton for balance
1092
+ }
1093
+
1094
+ @keyframes pulse {
1095
+ 0%, 100% { opacity: 0; transform: scale(1); }
1096
+ 50% { opacity: 0.3; transform: scale(1.02); }
1097
+ }
1098
+
1099
+ @keyframes spin {
1100
+ from { transform: rotate(0deg); }
1101
+ to { transform: rotate(360deg); }
1102
+ }