@striae-org/striae 4.1.0 → 4.2.1

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 (124) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +1 -1
  3. package/app/components/actions/case-export/core-export.ts +14 -8
  4. package/app/components/actions/case-export/data-processing.ts +1 -0
  5. package/app/components/actions/case-export/download-handlers.ts +7 -0
  6. package/app/components/actions/case-export/metadata-helpers.ts +2 -1
  7. package/app/components/actions/case-import/confirmation-import.ts +12 -2
  8. package/app/components/actions/case-import/orchestrator.ts +78 -32
  9. package/app/components/actions/case-import/storage-operations.ts +97 -8
  10. package/app/components/actions/case-import/zip-processing.ts +159 -86
  11. package/app/components/actions/case-manage.ts +463 -8
  12. package/app/components/actions/confirm-export.ts +9 -2
  13. package/app/components/actions/image-manage.ts +77 -44
  14. package/app/components/audit/user-audit-viewer.tsx +19 -8
  15. package/app/components/audit/user-audit.module.css +21 -0
  16. package/app/components/audit/viewer/audit-entries-list.tsx +12 -2
  17. package/app/components/audit/viewer/audit-filters-panel.tsx +1 -0
  18. package/app/components/audit/viewer/audit-viewer-utils.ts +2 -0
  19. package/app/components/audit/viewer/use-audit-viewer-data.ts +24 -1
  20. package/app/components/audit/viewer/use-audit-viewer-export.ts +1 -1
  21. package/app/components/canvas/box-annotations/box-annotations.module.css +22 -18
  22. package/app/components/canvas/box-annotations/box-annotations.tsx +15 -0
  23. package/app/components/canvas/canvas.module.css +64 -54
  24. package/app/components/canvas/canvas.tsx +14 -16
  25. package/app/components/canvas/confirmation/confirmation.module.css +1 -0
  26. package/app/components/canvas/confirmation/confirmation.tsx +12 -14
  27. package/app/components/colors/colors.module.css +4 -3
  28. package/app/components/navbar/case-modals/archive-case-modal.module.css +110 -0
  29. package/app/components/navbar/case-modals/archive-case-modal.tsx +129 -0
  30. package/app/components/navbar/case-modals/open-case-modal.module.css +81 -0
  31. package/app/components/navbar/case-modals/open-case-modal.tsx +120 -0
  32. package/app/components/navbar/case-modals/rename-case-modal.module.css +81 -0
  33. package/app/components/navbar/case-modals/rename-case-modal.tsx +107 -0
  34. package/app/components/navbar/navbar.module.css +447 -0
  35. package/app/components/navbar/navbar.tsx +402 -0
  36. package/app/components/public-signing-key-modal/public-signing-key-modal.module.css +1 -0
  37. package/app/components/public-signing-key-modal/public-signing-key-modal.tsx +15 -16
  38. package/app/components/sidebar/case-export/case-export.module.css +1 -0
  39. package/app/components/sidebar/case-export/case-export.tsx +8 -46
  40. package/app/components/sidebar/case-import/case-import.module.css +23 -0
  41. package/app/components/sidebar/case-import/case-import.tsx +64 -16
  42. package/app/components/sidebar/case-import/components/CasePreviewSection.tsx +20 -1
  43. package/app/components/sidebar/case-import/components/ConfirmationDialog.tsx +15 -0
  44. package/app/components/sidebar/cases/case-sidebar.tsx +68 -588
  45. package/app/components/sidebar/cases/cases-modal.module.css +1 -0
  46. package/app/components/sidebar/cases/cases-modal.tsx +82 -43
  47. package/app/components/sidebar/cases/cases.module.css +82 -21
  48. package/app/components/sidebar/files/files-modal.module.css +1 -0
  49. package/app/components/sidebar/files/files-modal.tsx +49 -52
  50. package/app/components/sidebar/notes/addl-notes-modal.tsx +82 -0
  51. package/app/components/sidebar/notes/{notes-sidebar.tsx → notes-editor-form.tsx} +187 -138
  52. package/app/components/sidebar/notes/notes-editor-modal.module.css +49 -0
  53. package/app/components/sidebar/notes/notes-editor-modal.tsx +64 -0
  54. package/app/components/sidebar/notes/notes.module.css +170 -1
  55. package/app/components/sidebar/sidebar-container.tsx +16 -28
  56. package/app/components/sidebar/sidebar.module.css +5 -69
  57. package/app/components/sidebar/sidebar.tsx +27 -125
  58. package/app/components/sidebar/upload/image-upload-zone.module.css +13 -13
  59. package/app/components/user/inactivity-warning.module.css +1 -0
  60. package/app/components/user/inactivity-warning.tsx +15 -2
  61. package/app/components/user/manage-profile.tsx +23 -10
  62. package/app/{tailwind.css → global.css} +1 -3
  63. package/app/hooks/useOverlayDismiss.ts +54 -4
  64. package/app/root.tsx +1 -1
  65. package/app/routes/auth/login.tsx +785 -774
  66. package/app/routes/striae/striae.module.css +10 -3
  67. package/app/routes/striae/striae.tsx +475 -30
  68. package/app/services/audit/audit.service.ts +173 -27
  69. package/app/services/audit/builders/audit-event-builders-case-file.ts +43 -0
  70. package/app/services/audit/builders/audit-event-builders-workflow.ts +2 -0
  71. package/app/services/audit/builders/index.ts +1 -0
  72. package/app/types/audit.ts +4 -1
  73. package/app/types/case.ts +29 -0
  74. package/app/types/import.ts +3 -0
  75. package/app/utils/data/confirmation-summary/summary-core.ts +279 -0
  76. package/app/utils/data/data-operations.ts +17 -861
  77. package/app/utils/data/index.ts +11 -1
  78. package/app/utils/data/operations/batch-operations.ts +113 -0
  79. package/app/utils/data/operations/case-operations.ts +168 -0
  80. package/app/utils/data/operations/confirmation-summary-operations.ts +301 -0
  81. package/app/utils/data/operations/file-annotation-operations.ts +196 -0
  82. package/app/utils/data/operations/index.ts +7 -0
  83. package/app/utils/data/operations/signing-operations.ts +225 -0
  84. package/app/utils/data/operations/types.ts +42 -0
  85. package/app/utils/data/operations/validation-operations.ts +48 -0
  86. package/app/utils/data/permissions.ts +16 -1
  87. package/app/utils/forensics/audit-export-signature.ts +5 -1
  88. package/app/utils/forensics/confirmation-signature.ts +3 -0
  89. package/app/utils/forensics/export-verification.ts +426 -22
  90. package/functions/api/_shared/firebase-auth.ts +2 -7
  91. package/functions/api/image/[[path]].ts +20 -23
  92. package/functions/api/pdf/[[path]].ts +27 -8
  93. package/package.json +7 -12
  94. package/scripts/deploy-primershear-emails.sh +2 -1
  95. package/worker-configuration.d.ts +3 -3
  96. package/workers/audit-worker/package.json +1 -1
  97. package/workers/audit-worker/worker-configuration.d.ts +7448 -11323
  98. package/workers/audit-worker/wrangler.jsonc.example +1 -1
  99. package/workers/data-worker/package.json +1 -1
  100. package/workers/data-worker/worker-configuration.d.ts +7448 -11323
  101. package/workers/data-worker/wrangler.jsonc.example +1 -1
  102. package/workers/image-worker/package.json +1 -1
  103. package/workers/image-worker/src/image-worker.example.ts +16 -5
  104. package/workers/image-worker/worker-configuration.d.ts +7447 -11322
  105. package/workers/image-worker/wrangler.jsonc.example +1 -1
  106. package/workers/keys-worker/package.json +1 -1
  107. package/workers/keys-worker/worker-configuration.d.ts +7447 -11322
  108. package/workers/keys-worker/wrangler.jsonc.example +1 -1
  109. package/workers/pdf-worker/package.json +1 -1
  110. package/workers/pdf-worker/src/formats/format-striae.ts +9 -14
  111. package/workers/pdf-worker/src/pdf-worker.example.ts +37 -58
  112. package/workers/pdf-worker/src/report-types.ts +3 -3
  113. package/workers/pdf-worker/worker-configuration.d.ts +7448 -11323
  114. package/workers/pdf-worker/wrangler.jsonc.example +1 -1
  115. package/workers/user-worker/package.json +1 -1
  116. package/workers/user-worker/src/user-worker.example.ts +17 -0
  117. package/workers/user-worker/worker-configuration.d.ts +7448 -11323
  118. package/workers/user-worker/wrangler.jsonc.example +1 -1
  119. package/wrangler.toml.example +1 -1
  120. package/NOTICE +0 -13
  121. package/app/components/sidebar/notes/notes-modal.tsx +0 -53
  122. package/postcss.config.js +0 -6
  123. package/public/.well-known/keybase.txt +0 -56
  124. package/tailwind.config.ts +0 -22
@@ -0,0 +1,447 @@
1
+ .navbar {
2
+ height: 60px;
3
+ width: 100%;
4
+ flex-shrink: 0;
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: space-between;
8
+ padding: 0 var(--spaceL);
9
+ box-sizing: border-box;
10
+ background-color: #f8f9fa;
11
+ border-bottom: 1px solid #dee2e6;
12
+ z-index: 35;
13
+ position: relative;
14
+ gap: var(--spaceL);
15
+ }
16
+
17
+ .companyLabelContainer {
18
+ display: flex;
19
+ align-items: center;
20
+ overflow-x: auto;
21
+ overflow-y: hidden;
22
+ max-width: calc(100% - 500px);
23
+ flex-shrink: 1;
24
+ min-width: 150px;
25
+ scroll-behavior: smooth;
26
+ }
27
+
28
+ .companyLabelContainer::-webkit-scrollbar {
29
+ height: 4px;
30
+ }
31
+
32
+ .companyLabelContainer::-webkit-scrollbar-track {
33
+ background: transparent;
34
+ }
35
+
36
+ .companyLabelContainer::-webkit-scrollbar-thumb {
37
+ background: #adb5bd;
38
+ border-radius: 2px;
39
+ }
40
+
41
+ .companyLabelContainer::-webkit-scrollbar-thumb:hover {
42
+ background: #868e96;
43
+ }
44
+
45
+ .companyLabel {
46
+ color: #495057;
47
+ font-size: var(--fontSizeBodyM);
48
+ font-weight: var(--fontWeightMedium);
49
+ white-space: nowrap;
50
+ flex-shrink: 0;
51
+ padding-right: var(--spaceM);
52
+ }
53
+
54
+ .navbar a {
55
+ text-decoration: none;
56
+ }
57
+
58
+ .navbar a:hover,
59
+ .navbar a:focus,
60
+ .navbar a:active,
61
+ .navbar a:visited {
62
+ text-decoration: none;
63
+ }
64
+
65
+ .navCenterTrack {
66
+ position: absolute;
67
+ left: calc(var(--spaceL) + 300px);
68
+ right: var(--spaceL);
69
+ display: flex;
70
+ justify-content: center;
71
+ pointer-events: none;
72
+ }
73
+
74
+ .navCentral {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: var(--spaceS);
78
+ margin: 0;
79
+ flex-shrink: 0;
80
+ padding: 0.4rem;
81
+ border: 1px solid #dde3e9;
82
+ border-radius: 999px;
83
+ background: rgba(255, 255, 255, 0.78);
84
+ box-shadow: 0 1px 3px rgba(33, 37, 41, 0.06);
85
+ pointer-events: auto;
86
+ }
87
+
88
+ .navActions {
89
+ display: flex;
90
+ align-items: center;
91
+ gap: var(--spaceM);
92
+ flex-shrink: 0;
93
+ }
94
+
95
+ .navTextButton {
96
+ border: none;
97
+ background: transparent;
98
+ padding: 0;
99
+ margin: 0;
100
+ color: #495057;
101
+ font-size: var(--fontSizeBodyS);
102
+ font-weight: var(--fontWeightMedium);
103
+ cursor: pointer;
104
+ text-decoration: none;
105
+ }
106
+
107
+ .navTextButton:hover {
108
+ color: #212529;
109
+ text-decoration: none;
110
+ }
111
+
112
+ .navTextButton:focus,
113
+ .navTextButton:active,
114
+ .navTextButton:visited {
115
+ text-decoration: none;
116
+ }
117
+
118
+ .navTextButton:disabled {
119
+ color: #adb5bd;
120
+ cursor: not-allowed;
121
+ text-decoration: none;
122
+ }
123
+
124
+ .navSectionButton {
125
+ border: 1px solid transparent;
126
+ background: transparent;
127
+ padding: 0.5rem 0.9rem;
128
+ margin: 0;
129
+ color: #495057;
130
+ font-size: var(--fontSizeBodyS);
131
+ font-weight: var(--fontWeightMedium);
132
+ line-height: 1;
133
+ border-radius: 999px;
134
+ cursor: pointer;
135
+ text-decoration: none;
136
+ transition:
137
+ color var(--durationS) var(--bezierFastoutSlowin),
138
+ background-color var(--durationS) var(--bezierFastoutSlowin),
139
+ border-color var(--durationS) var(--bezierFastoutSlowin),
140
+ box-shadow var(--durationS) var(--bezierFastoutSlowin);
141
+ }
142
+
143
+ .navSectionButton:hover {
144
+ color: #212529;
145
+ background: rgba(73, 80, 87, 0.08);
146
+ border-color: rgba(73, 80, 87, 0.12);
147
+ }
148
+
149
+ .navSectionButtonActive {
150
+ color: #0f5132;
151
+ background: rgba(25, 135, 84, 0.16);
152
+ border-color: rgba(25, 135, 84, 0.28);
153
+ box-shadow: inset 0 0 0 1px rgba(25, 135, 84, 0.08);
154
+ }
155
+
156
+ .navSectionButtonActive:hover {
157
+ color: #0b3d28;
158
+ background: rgba(25, 135, 84, 0.22);
159
+ border-color: rgba(25, 135, 84, 0.34);
160
+ }
161
+
162
+ .navSectionButton:focus,
163
+ .navSectionButton:active,
164
+ .navSectionButton:visited {
165
+ text-decoration: none;
166
+ }
167
+
168
+ .navSectionButton:disabled {
169
+ color: #adb5bd;
170
+ background: rgba(173, 181, 189, 0.12);
171
+ border-color: transparent;
172
+ cursor: not-allowed;
173
+ opacity: 0.9;
174
+ }
175
+
176
+ .navPrimaryButton {
177
+ background: rgba(25, 135, 84, 0.12);
178
+ border-color: rgba(25, 135, 84, 0.2);
179
+ color: #146c43;
180
+ }
181
+
182
+ .navPrimaryButton:hover {
183
+ background: rgba(25, 135, 84, 0.18);
184
+ border-color: rgba(25, 135, 84, 0.3);
185
+ color: #0f5132;
186
+ }
187
+
188
+ .navPrimaryButton:disabled {
189
+ color: #adb5bd;
190
+ background: rgba(173, 181, 189, 0.12);
191
+ border-color: transparent;
192
+ }
193
+
194
+ .caseMenuContainer {
195
+ position: relative;
196
+ }
197
+
198
+ .fileMenuContainer {
199
+ position: relative;
200
+ }
201
+
202
+ .caseMenu {
203
+ position: absolute;
204
+ top: calc(100% + 0.5rem);
205
+ left: 0;
206
+ min-width: 220px;
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: 0.3rem;
210
+ padding: 0.45rem;
211
+ background: #ffffff;
212
+ border: 1px solid #dde3e9;
213
+ border-radius: 12px;
214
+ box-shadow: 0 10px 26px rgba(0, 0, 0, 0.14);
215
+ z-index: 60;
216
+ }
217
+
218
+ .fileMenu {
219
+ position: absolute;
220
+ top: calc(100% + 0.5rem);
221
+ left: 0;
222
+ min-width: 220px;
223
+ display: flex;
224
+ flex-direction: column;
225
+ gap: 0.3rem;
226
+ padding: 0.45rem;
227
+ background: #ffffff;
228
+ border: 1px solid #dde3e9;
229
+ border-radius: 12px;
230
+ box-shadow: 0 10px 26px rgba(0, 0, 0, 0.14);
231
+ z-index: 60;
232
+ }
233
+
234
+ .caseMenuItem {
235
+ width: 100%;
236
+ border: 1px solid transparent;
237
+ background: #f8f9fa;
238
+ color: #343a40;
239
+ border-radius: 8px;
240
+ padding: 0.5rem 0.7rem;
241
+ font-size: var(--fontSizeBodyS);
242
+ font-weight: var(--fontWeightMedium);
243
+ text-align: left;
244
+ cursor: pointer;
245
+ transition: all var(--durationS) var(--bezierFastoutSlowin);
246
+ }
247
+
248
+ .fileMenuItem {
249
+ width: 100%;
250
+ border: 1px solid transparent;
251
+ background: #f8f9fa;
252
+ color: #343a40;
253
+ border-radius: 8px;
254
+ padding: 0.5rem 0.7rem;
255
+ font-size: var(--fontSizeBodyS);
256
+ font-weight: var(--fontWeightMedium);
257
+ text-align: left;
258
+ cursor: pointer;
259
+ transition: all var(--durationS) var(--bezierFastoutSlowin);
260
+ }
261
+
262
+ .caseMenuItem:hover {
263
+ background: #eef1f4;
264
+ border-color: #d6dce2;
265
+ }
266
+
267
+ .fileMenuItem:hover {
268
+ background: #eef1f4;
269
+ border-color: #d6dce2;
270
+ }
271
+
272
+ .caseMenuItem:disabled {
273
+ color: #adb5bd;
274
+ background: rgba(173, 181, 189, 0.14);
275
+ border-color: transparent;
276
+ cursor: not-allowed;
277
+ }
278
+
279
+ .fileMenuItem:disabled {
280
+ color: #adb5bd;
281
+ background: rgba(173, 181, 189, 0.14);
282
+ border-color: transparent;
283
+ cursor: not-allowed;
284
+ }
285
+
286
+ .fileMenuItemViewAll {
287
+ background: color-mix(in lab, #4a90e2 16%, #ffffff);
288
+ color: #1f5fa7;
289
+ border-color: color-mix(in lab, #4a90e2 30%, transparent);
290
+ }
291
+
292
+ .fileMenuItemViewAll:hover {
293
+ background: color-mix(in lab, #4a90e2 22%, #ffffff);
294
+ }
295
+
296
+ .fileMenuItemDelete {
297
+ background: color-mix(in lab, #dc3545 15%, #ffffff);
298
+ color: #b02a37;
299
+ border-color: color-mix(in lab, #dc3545 28%, transparent);
300
+ }
301
+
302
+ .fileMenuItemDelete:hover {
303
+ background: color-mix(in lab, #dc3545 21%, #ffffff);
304
+ }
305
+
306
+ .caseMenuItemOpen {
307
+ background: color-mix(in lab, #4a90e2 16%, #ffffff);
308
+ color: #1f5fa7;
309
+ border-color: color-mix(in lab, #4a90e2 30%, transparent);
310
+ }
311
+
312
+ .caseMenuItemOpen:hover {
313
+ background: color-mix(in lab, #4a90e2 22%, #ffffff);
314
+ }
315
+
316
+ .caseMenuItemList {
317
+ background: color-mix(in lab, #0d6efd 20%, #ffffff);
318
+ color: #0a4fad;
319
+ border-color: color-mix(in lab, #0d6efd 34%, transparent);
320
+ }
321
+
322
+ .caseMenuItemList:hover {
323
+ background: color-mix(in lab, #0d6efd 26%, #ffffff);
324
+ }
325
+
326
+ .caseMenuItemExport {
327
+ background: color-mix(in lab, #198754 16%, #ffffff);
328
+ color: #146c43;
329
+ border-color: color-mix(in lab, #198754 30%, transparent);
330
+ }
331
+
332
+ .caseMenuItemExport:hover {
333
+ background: color-mix(in lab, #198754 22%, #ffffff);
334
+ }
335
+
336
+ .caseMenuItemAudit {
337
+ background: color-mix(in lab, #6f42c1 16%, #ffffff);
338
+ color: #5a359a;
339
+ border-color: color-mix(in lab, #6f42c1 30%, transparent);
340
+ }
341
+
342
+ .caseMenuItemAudit:hover {
343
+ background: color-mix(in lab, #6f42c1 22%, #ffffff);
344
+ }
345
+
346
+ .caseMenuItemRename {
347
+ background: color-mix(in lab, #ffc107 16%, #ffffff);
348
+ color: #7a5a00;
349
+ border-color: color-mix(in lab, #ffc107 30%, transparent);
350
+ }
351
+
352
+ .caseMenuItemRename:hover {
353
+ background: color-mix(in lab, #ffc107 22%, #ffffff);
354
+ border-color: color-mix(in lab, #ffc107 36%, transparent);
355
+ }
356
+
357
+ .caseMenuItemDelete {
358
+ background: color-mix(in lab, #dc3545 15%, #ffffff);
359
+ color: #b02a37;
360
+ border-color: color-mix(in lab, #dc3545 28%, transparent);
361
+ }
362
+
363
+ .caseMenuItemDelete:hover {
364
+ background: color-mix(in lab, #dc3545 21%, #ffffff);
365
+ }
366
+
367
+ .caseMenuItemArchive {
368
+ background: color-mix(in lab, #6c757d 15%, #ffffff);
369
+ color: #495057;
370
+ border-color: color-mix(in lab, #6c757d 28%, transparent);
371
+ }
372
+
373
+ .caseMenuItemArchive:hover {
374
+ background: color-mix(in lab, #6c757d 21%, #ffffff);
375
+ }
376
+
377
+ .caseMenuItemKey {
378
+ background: color-mix(in lab, #0d9488 14%, #ffffff);
379
+ color: #0f766e;
380
+ border-color: color-mix(in lab, #0d9488 28%, transparent);
381
+ }
382
+
383
+ .caseMenuItemKey:hover {
384
+ background: color-mix(in lab, #0d9488 20%, #ffffff);
385
+ }
386
+
387
+ .caseMenuCaption {
388
+ margin-top: 0.25rem;
389
+ padding: 0.3rem 0.45rem 0.1rem;
390
+ border-top: 1px solid #e9ecef;
391
+ color: #6c757d;
392
+ font-size: 0.72rem;
393
+ font-weight: 500;
394
+ }
395
+
396
+ .caseArchiveDetails {
397
+ margin-top: 0.3rem;
398
+ padding: 0.45rem;
399
+ border-top: 1px solid #e9ecef;
400
+ border-radius: 8px;
401
+ background: color-mix(in lab, #0d9488 8%, #ffffff);
402
+ display: flex;
403
+ flex-direction: column;
404
+ gap: 0.2rem;
405
+ color: #0f766e;
406
+ font-size: 0.72rem;
407
+ }
408
+
409
+ .caseArchiveDetails strong {
410
+ font-size: 0.74rem;
411
+ color: #0b5f59;
412
+ }
413
+
414
+ .caseMenuSectionLabel {
415
+ margin-top: 0.2rem;
416
+ padding: 0.32rem 0.45rem 0.15rem;
417
+ border-top: 1px solid #e9ecef;
418
+ color: #6c757d;
419
+ font-size: 0.68rem;
420
+ font-weight: 600;
421
+ letter-spacing: 0.03em;
422
+ text-transform: uppercase;
423
+ }
424
+
425
+ .fileMenuCaption {
426
+ margin-top: 0.25rem;
427
+ padding: 0.3rem 0.45rem 0.1rem;
428
+ border-top: 1px solid #e9ecef;
429
+ color: #6c757d;
430
+ font-size: 0.72rem;
431
+ font-weight: 500;
432
+ max-width: 240px;
433
+ white-space: nowrap;
434
+ overflow: hidden;
435
+ text-overflow: ellipsis;
436
+ }
437
+
438
+ .fileMenuSectionLabel {
439
+ margin-top: 0.2rem;
440
+ padding: 0.32rem 0.45rem 0.15rem;
441
+ border-top: 1px solid #e9ecef;
442
+ color: #6c757d;
443
+ font-size: 0.68rem;
444
+ font-weight: 600;
445
+ letter-spacing: 0.03em;
446
+ text-transform: uppercase;
447
+ }