@striae-org/striae 3.2.2 → 4.0.0

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 (82) hide show
  1. package/.env.example +1 -1
  2. package/app/components/actions/case-export/core-export.ts +5 -2
  3. package/app/components/actions/case-export/download-handlers.ts +51 -3
  4. package/app/components/actions/case-import/confirmation-import.ts +65 -40
  5. package/app/components/actions/case-import/confirmation-package.ts +86 -0
  6. package/app/components/actions/case-import/image-operations.ts +20 -49
  7. package/app/components/actions/case-import/index.ts +1 -0
  8. package/app/components/actions/case-import/orchestrator.ts +13 -3
  9. package/app/components/actions/case-import/storage-operations.ts +54 -89
  10. package/app/components/actions/case-import/validation.ts +7 -111
  11. package/app/components/actions/case-import/zip-processing.ts +44 -2
  12. package/app/components/actions/case-manage.ts +15 -27
  13. package/app/components/actions/confirm-export.ts +44 -13
  14. package/app/components/actions/generate-pdf.ts +3 -7
  15. package/app/components/actions/image-manage.ts +63 -129
  16. package/app/components/button/button.module.css +12 -8
  17. package/app/components/form/form-button.tsx +1 -1
  18. package/app/components/form/form.module.css +9 -0
  19. package/app/components/public-signing-key-modal/public-signing-key-modal.module.css +163 -49
  20. package/app/components/public-signing-key-modal/public-signing-key-modal.tsx +365 -88
  21. package/app/components/sidebar/case-export/case-export.tsx +13 -60
  22. package/app/components/sidebar/case-import/case-import.tsx +18 -6
  23. package/app/components/sidebar/case-import/hooks/useFilePreview.ts +6 -4
  24. package/app/components/sidebar/case-import/utils/file-validation.ts +57 -2
  25. package/app/components/sidebar/cases/case-sidebar.tsx +122 -52
  26. package/app/components/sidebar/cases/cases.module.css +101 -18
  27. package/app/components/sidebar/notes/notes.module.css +33 -13
  28. package/app/components/sidebar/sidebar.module.css +0 -2
  29. package/app/components/user/delete-account.tsx +7 -7
  30. package/app/components/user/manage-profile.tsx +1 -1
  31. package/app/components/user/mfa-phone-update.tsx +15 -12
  32. package/app/config-example/config.json +2 -8
  33. package/app/hooks/useInactivityTimeout.ts +2 -5
  34. package/app/root.tsx +96 -65
  35. package/app/routes/auth/login.tsx +132 -11
  36. package/app/routes/auth/route.ts +4 -3
  37. package/app/routes/striae/striae.tsx +4 -8
  38. package/app/services/audit/audit-api-client.ts +40 -0
  39. package/app/services/audit/audit-worker-client.ts +14 -17
  40. package/app/styles/root.module.css +13 -101
  41. package/app/tailwind.css +9 -2
  42. package/app/utils/SHA256.ts +5 -1
  43. package/app/utils/auth.ts +5 -32
  44. package/app/utils/confirmation-signature.ts +5 -1
  45. package/app/utils/data-api-client.ts +43 -0
  46. package/app/utils/data-operations.ts +59 -75
  47. package/app/utils/export-verification.ts +353 -0
  48. package/app/utils/image-api-client.ts +130 -0
  49. package/app/utils/pdf-api-client.ts +43 -0
  50. package/app/utils/permissions.ts +10 -23
  51. package/app/utils/signature-utils.ts +74 -4
  52. package/app/utils/user-api-client.ts +90 -0
  53. package/functions/api/_shared/firebase-auth.ts +255 -0
  54. package/functions/api/audit/[[path]].ts +150 -0
  55. package/functions/api/data/[[path]].ts +141 -0
  56. package/functions/api/image/[[path]].ts +127 -0
  57. package/functions/api/pdf/[[path]].ts +110 -0
  58. package/functions/api/user/[[path]].ts +196 -0
  59. package/package.json +8 -4
  60. package/public/favicon.ico +0 -0
  61. package/public/icon-256.png +0 -0
  62. package/public/icon-512.png +0 -0
  63. package/public/manifest.json +39 -0
  64. package/public/shortcut.png +0 -0
  65. package/public/social-image.png +0 -0
  66. package/react-router.config.ts +5 -0
  67. package/scripts/deploy-all.sh +22 -8
  68. package/scripts/deploy-config.sh +143 -148
  69. package/scripts/deploy-pages-secrets.sh +231 -0
  70. package/scripts/deploy-worker-secrets.sh +1 -1
  71. package/workers/audit-worker/wrangler.jsonc.example +1 -8
  72. package/workers/data-worker/wrangler.jsonc.example +1 -8
  73. package/workers/image-worker/wrangler.jsonc.example +1 -8
  74. package/workers/keys-worker/wrangler.jsonc.example +2 -9
  75. package/workers/pdf-worker/scripts/generate-assets.js +94 -0
  76. package/workers/pdf-worker/src/assets/icon-256.png +0 -0
  77. package/workers/pdf-worker/wrangler.jsonc.example +1 -8
  78. package/workers/user-worker/src/user-worker.example.ts +121 -41
  79. package/workers/user-worker/wrangler.jsonc.example +1 -8
  80. package/wrangler.toml.example +1 -1
  81. package/app/styles/legal-pages.module.css +0 -113
  82. package/public/favicon.svg +0 -9
@@ -2,7 +2,7 @@
2
2
  "name": "USER_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/user-worker.ts",
5
- "compatibility_date": "2026-03-14",
5
+ "compatibility_date": "2026-03-15",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -18,12 +18,5 @@
18
18
  }
19
19
  ],
20
20
 
21
- "routes": [
22
- {
23
- "pattern": "USER_WORKER_DOMAIN",
24
- "custom_domain": true
25
- }
26
- ],
27
-
28
21
  "placement": { "mode": "smart" }
29
22
  }
@@ -1,6 +1,6 @@
1
1
  #:schema node_modules/wrangler/config-schema.json
2
2
  name = "PAGES_PROJECT_NAME"
3
- compatibility_date = "2026-03-14"
3
+ compatibility_date = "2026-03-15"
4
4
  compatibility_flags = ["nodejs_compat"]
5
5
  pages_build_output_dir = "./build/client"
6
6
 
@@ -1,113 +0,0 @@
1
- .content {
2
- background: color-mix(in lab, var(--backgroundLight) 95%, transparent);
3
- border-radius: var(--spaceXS);
4
- padding: var(--space2XL);
5
- box-shadow: 0 var(--spaceXS) var(--spaceL) color-mix(in lab, var(--black) 10%, transparent);
6
- line-height: var(--lineHeightBody);
7
- }
8
-
9
- .content h1 {
10
- font-size: var(--fontSizeH4);
11
- margin-bottom: var(--spaceM);
12
- color: var(--textTitle);
13
- }
14
-
15
- .content p {
16
- margin-bottom: var(--spaceM);
17
- color: var(--textBody);
18
- }
19
-
20
- .content h2 {
21
- font-size: var(--fontSizeH5);
22
- }
23
-
24
- .section {
25
- margin-bottom: var(--space2XL);
26
- }
27
-
28
- .section h4 {
29
- color: var(--textTitle);
30
- margin-bottom: var(--spaceM);
31
- }
32
-
33
- .section h2 {
34
- font-size: var(--fontSizeH5);
35
- margin-top: var(--spaceXL);
36
- }
37
-
38
- .section h2:first-child {
39
- margin-top: 0;
40
- }
41
-
42
- .section h3 {
43
- font-size: var(--fontSizeBodyXL);
44
- margin-top: var(--spaceXL);
45
- }
46
-
47
- .section h4 {
48
- font-size: var(--fontSizeBodyL);
49
- }
50
-
51
- .section p,
52
- .section ul {
53
- margin-bottom: var(--spaceM);
54
- color: var(--textBody);
55
- }
56
-
57
- .section ul {
58
- padding-left: var(--spaceXL);
59
- list-style-type: disc;
60
- }
61
-
62
- .section ol {
63
- padding-left: var(--spaceXL);
64
- list-style-type: decimal;
65
- margin-bottom: var(--spaceM);
66
- color: var(--textBody);
67
- }
68
-
69
- .section li {
70
- margin-bottom: var(--spaceS);
71
- color: var(--textBody);
72
- }
73
-
74
- .lastUpdated {
75
- color: var(--textLight);
76
- font-size: var(--fontSizeBodyXS);
77
- margin-bottom: var(--space2XL);
78
- }
79
-
80
- .section p small {
81
- font-size: var(--fontSizeBodyS);
82
- color: var(--textLight);
83
- opacity: 0.9;
84
- }
85
-
86
- .section a {
87
- color: var(--primary);
88
- text-decoration: underline;
89
- }
90
-
91
- .section a:hover {
92
- color: var(--accent);
93
- }
94
-
95
- @media (max-width: 1296px) {
96
- .logo {
97
- display: none;
98
- }
99
-
100
- .returnLink {
101
- display: block;
102
- margin-left: auto;
103
- margin-right: auto;
104
- }
105
-
106
- .container {
107
- padding: var(--spaceM);
108
- }
109
-
110
- .content {
111
- padding: var(--spaceXL);
112
- }
113
- }
@@ -1,9 +0,0 @@
1
- <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2
- <rect width="64" height="64" fill="url(#pattern0_17_2)"/>
3
- <defs>
4
- <pattern id="pattern0_17_2" patternContentUnits="objectBoundingBox" width="1" height="1">
5
- <use xlink:href="#image0_17_2" transform="scale(0.015625)"/>
6
- </pattern>
7
- <image id="image0_17_2" width="64" height="64" xlink:href="data:image/png;base64,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"/>
8
- </defs>
9
- </svg>