@striae-org/striae 5.3.2 → 5.4.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 (112) hide show
  1. package/app/components/auth/auth.module.css +531 -0
  2. package/app/components/auth/mfa-enrollment.tsx +132 -79
  3. package/app/components/auth/mfa-totp-enrollment.tsx +231 -0
  4. package/app/components/auth/mfa-verification.tsx +162 -33
  5. package/app/components/{sidebar/cases/cases-modal.tsx → navbar/case-modals/all-cases-modal.tsx} +4 -4
  6. package/app/components/navbar/case-modals/archive-case-modal.tsx +9 -10
  7. package/app/components/navbar/case-modals/case-modal-shared.module.css +88 -0
  8. package/app/components/navbar/case-modals/delete-case-modal.tsx +9 -10
  9. package/app/components/navbar/case-modals/export-case-modal.tsx +9 -10
  10. package/app/components/navbar/case-modals/export-confirmations-modal.tsx +9 -10
  11. package/app/components/navbar/case-modals/open-case-modal.tsx +4 -4
  12. package/app/components/navbar/case-modals/rename-case-modal.tsx +9 -10
  13. package/app/components/navbar/navbar.tsx +1 -1
  14. package/app/components/sidebar/files/delete-files-modal.tsx +3 -3
  15. package/app/components/sidebar/files/files-modal.module.css +29 -0
  16. package/app/components/sidebar/notes/{class-details-fields.tsx → class-details/class-details-fields.tsx} +1 -1
  17. package/app/components/sidebar/notes/{class-details-modal.tsx → class-details/class-details-modal.tsx} +1 -1
  18. package/app/components/sidebar/notes/{class-details-sections.tsx → class-details/class-details-sections.tsx} +1 -1
  19. package/app/components/sidebar/notes/notes-editor-form.tsx +2 -2
  20. package/app/components/sidebar/notes/notes-editor-modal.tsx +6 -6
  21. package/app/components/sidebar/notes/notes.module.css +52 -0
  22. package/app/components/toolbar/toolbar-color-selector.tsx +8 -8
  23. package/app/components/toolbar/toolbar.module.css +181 -2
  24. package/app/components/user/delete-account.tsx +7 -7
  25. package/app/components/user/inactivity-warning.tsx +6 -6
  26. package/app/components/user/manage-profile.tsx +18 -1
  27. package/app/components/user/mfa-enrolled-factors.tsx +117 -0
  28. package/app/components/user/mfa-phone-update.tsx +8 -4
  29. package/app/components/user/mfa-totp-section.tsx +446 -0
  30. package/app/components/user/user.module.css +665 -0
  31. package/app/routes/striae/striae.tsx +1 -1
  32. package/app/services/audit/audit.service.ts +1 -1
  33. package/app/services/audit/builders/audit-event-builders-user-security.ts +4 -2
  34. package/app/services/firebase/errors.ts +2 -0
  35. package/app/utils/auth/mfa.ts +35 -1
  36. package/package.json +23 -28
  37. package/scripts/deploy-all.sh +166 -0
  38. package/scripts/deploy-config/modules/env-utils.sh +322 -0
  39. package/scripts/deploy-config/modules/keys.sh +404 -0
  40. package/scripts/deploy-config/modules/prompt.sh +375 -0
  41. package/scripts/deploy-config/modules/scaffolding.sh +310 -0
  42. package/scripts/deploy-config/modules/validation.sh +354 -0
  43. package/scripts/deploy-config.sh +236 -0
  44. package/scripts/deploy-pages-secrets.sh +231 -0
  45. package/scripts/deploy-pages.sh +34 -0
  46. package/scripts/deploy-primershear-emails.sh +167 -0
  47. package/scripts/deploy-worker-secrets.sh +385 -0
  48. package/scripts/dev.cjs +23 -0
  49. package/scripts/enable-totp-mfa.mjs +57 -0
  50. package/scripts/install-workers.sh +87 -0
  51. package/scripts/run-eslint.cjs +43 -0
  52. package/scripts/unenroll-totp-mfa.mjs +82 -0
  53. package/scripts/update-compatibility-dates.cjs +124 -0
  54. package/scripts/update-markdown-versions.cjs +43 -0
  55. package/workers/audit-worker/.editorconfig +12 -0
  56. package/workers/audit-worker/.prettierrc +6 -0
  57. package/workers/audit-worker/package.json +1 -1
  58. package/workers/audit-worker/wrangler.jsonc.example +1 -1
  59. package/workers/data-worker/.editorconfig +12 -0
  60. package/workers/data-worker/.prettierrc +6 -0
  61. package/workers/data-worker/package.json +1 -1
  62. package/workers/data-worker/wrangler.jsonc.example +1 -1
  63. package/workers/image-worker/.editorconfig +12 -0
  64. package/workers/image-worker/.prettierrc +6 -0
  65. package/workers/image-worker/package.json +1 -1
  66. package/workers/image-worker/wrangler.jsonc.example +1 -1
  67. package/workers/pdf-worker/.editorconfig +12 -0
  68. package/workers/pdf-worker/.prettierrc +6 -0
  69. package/workers/pdf-worker/package.json +1 -1
  70. package/workers/pdf-worker/wrangler.jsonc.example +1 -1
  71. package/workers/user-worker/.editorconfig +12 -0
  72. package/workers/user-worker/.prettierrc +6 -0
  73. package/workers/user-worker/package.json +1 -1
  74. package/workers/user-worker/wrangler.jsonc.example +1 -1
  75. package/wrangler.toml.example +1 -1
  76. package/app/components/auth/mfa-enrollment.module.css +0 -276
  77. package/app/components/auth/mfa-verification.module.css +0 -259
  78. package/app/components/navbar/case-modals/archive-case-modal.module.css +0 -34
  79. package/app/components/navbar/case-modals/delete-case-modal.module.css +0 -9
  80. package/app/components/navbar/case-modals/export-case-modal.module.css +0 -27
  81. package/app/components/navbar/case-modals/export-confirmations-modal.module.css +0 -24
  82. package/app/components/navbar/case-modals/open-case-modal.module.css +0 -82
  83. package/app/components/navbar/case-modals/rename-case-modal.module.css +0 -9
  84. package/app/components/sidebar/files/delete-files-modal.module.css +0 -26
  85. package/app/components/sidebar/notes/notes-editor-modal.module.css +0 -49
  86. package/app/components/toolbar/toolbar-color-selector.module.css +0 -171
  87. package/app/components/user/delete-account.module.css +0 -277
  88. package/app/components/user/inactivity-warning.module.css +0 -148
  89. package/app/components/user/manage-profile.module.css +0 -192
  90. package/app/routes/auth/login.module.css +0 -523
  91. package/app/routes/auth/login.tsx +0 -705
  92. package/workers/audit-worker/worker-configuration.d.ts +0 -7448
  93. package/workers/data-worker/worker-configuration.d.ts +0 -7448
  94. package/workers/image-worker/worker-configuration.d.ts +0 -7448
  95. package/workers/pdf-worker/worker-configuration.d.ts +0 -7447
  96. package/workers/user-worker/worker-configuration.d.ts +0 -7450
  97. /package/app/components/{sidebar → navbar}/case-import/case-import.module.css +0 -0
  98. /package/app/components/{sidebar → navbar}/case-import/case-import.tsx +0 -0
  99. /package/app/components/{sidebar → navbar}/case-import/components/CasePreviewSection.tsx +0 -0
  100. /package/app/components/{sidebar → navbar}/case-import/components/ConfirmationDialog.tsx +0 -0
  101. /package/app/components/{sidebar → navbar}/case-import/components/ConfirmationPreviewSection.tsx +0 -0
  102. /package/app/components/{sidebar → navbar}/case-import/components/ExistingCaseSection.tsx +0 -0
  103. /package/app/components/{sidebar → navbar}/case-import/components/FileSelector.tsx +0 -0
  104. /package/app/components/{sidebar → navbar}/case-import/components/ProgressSection.tsx +0 -0
  105. /package/app/components/{sidebar → navbar}/case-import/hooks/useFilePreview.ts +0 -0
  106. /package/app/components/{sidebar → navbar}/case-import/hooks/useImportExecution.ts +0 -0
  107. /package/app/components/{sidebar → navbar}/case-import/hooks/useImportState.ts +0 -0
  108. /package/app/components/{sidebar → navbar}/case-import/index.ts +0 -0
  109. /package/app/components/{sidebar → navbar}/case-import/utils/file-validation.ts +0 -0
  110. /package/app/components/{sidebar/cases/cases-modal.module.css → navbar/case-modals/all-cases-modal.module.css} +0 -0
  111. /package/app/components/sidebar/notes/{class-details-shared.ts → class-details/class-details-shared.ts} +0 -0
  112. /package/app/components/sidebar/notes/{use-class-details-state.ts → class-details/use-class-details-state.ts} +0 -0
@@ -1,259 +0,0 @@
1
- .container {
2
- position: fixed;
3
- top: 0;
4
- left: 0;
5
- right: 0;
6
- bottom: 0;
7
- background: rgba(0, 0, 0, 0.5);
8
- display: flex;
9
- justify-content: center;
10
- align-items: center;
11
- z-index: 1000;
12
- cursor: default;
13
- }
14
-
15
- .modal {
16
- background: white;
17
- border-radius: var(--spaceXS);
18
- padding: var(--space2XL);
19
- width: 100%;
20
- max-width: 400px;
21
- box-shadow: 0 var(--spaceM) var(--spaceXL) rgba(0, 0, 0, 0.2);
22
- cursor: default;
23
- }
24
-
25
- .title {
26
- text-align: center;
27
- color: var(--textTitle);
28
- margin-bottom: var(--spaceXL);
29
- font-size: var(--fontSizeH4);
30
- }
31
-
32
- .hintSelection {
33
- margin-bottom: var(--spaceL);
34
- }
35
-
36
- .label {
37
- display: block;
38
- margin-bottom: var(--spaceS);
39
- font-weight: 600;
40
- color: var(--textBody);
41
- }
42
-
43
- .select {
44
- width: 100%;
45
- padding: var(--spaceM);
46
- border: 1.5px solid color-mix(in lab, var(--text) 20%, transparent);
47
- border-radius: var(--spaceXS);
48
- font-size: var(--fontSizeBodyM);
49
- background: white;
50
- transition: border-color var(--durationS) var(--bezierFastoutSlowin);
51
- box-sizing: border-box;
52
- }
53
-
54
- .select:focus {
55
- outline: none;
56
- border-color: var(--primary);
57
- box-shadow: 0 0 0 2px color-mix(in lab, var(--primary) 25%, transparent);
58
- }
59
-
60
- .description {
61
- text-align: center;
62
- color: var(--textLight);
63
- margin-bottom: var(--spaceL);
64
- line-height: 1.5;
65
- }
66
-
67
- .errorMessage {
68
- background: linear-gradient(
69
- 135deg,
70
- color-mix(in lab, var(--error) 12%, transparent),
71
- color-mix(in lab, var(--error) 8%, transparent)
72
- );
73
- border: 1px solid color-mix(in lab, var(--error) 30%, transparent);
74
- border-left: 4px solid var(--error);
75
- color: color-mix(in lab, var(--error) 90%, var(--black));
76
- padding: var(--spaceL);
77
- border-radius: var(--spaceS);
78
- font-size: var(--fontSizeBodyS);
79
- margin-bottom: var(--spaceL);
80
- text-align: left;
81
- line-height: 1.4;
82
- position: relative;
83
- overflow: hidden;
84
- box-shadow: 0 4px 16px color-mix(in lab, var(--text) 10%, transparent);
85
- animation: slideInError var(--durationM) var(--bezierFastoutSlowin);
86
- }
87
-
88
- .errorMessage::before {
89
- content: "";
90
- position: absolute;
91
- top: 0;
92
- left: 0;
93
- right: 0;
94
- height: 2px;
95
- background: linear-gradient(
96
- 90deg,
97
- var(--error),
98
- color-mix(in lab, var(--error) 60%, transparent)
99
- );
100
- animation: shimmer 2s ease-in-out infinite;
101
- }
102
-
103
- .errorMessage:empty {
104
- display: none;
105
- }
106
-
107
- .input {
108
- width: 100%;
109
- padding: var(--spaceM);
110
- border: 1.5px solid color-mix(in lab, var(--text) 20%, transparent);
111
- border-radius: var(--spaceXS);
112
- font-size: var(--fontSizeBodyM);
113
- text-align: center;
114
- font-family: monospace;
115
- letter-spacing: 2px;
116
- margin-bottom: var(--spaceL);
117
- transition: border-color var(--durationS) var(--bezierFastoutSlowin);
118
- box-sizing: border-box;
119
- }
120
-
121
- .input:focus {
122
- outline: none;
123
- border-color: var(--primary);
124
- box-shadow: 0 0 0 2px color-mix(in lab, var(--primary) 25%, transparent);
125
- }
126
-
127
- .button {
128
- width: 100%;
129
- padding: var(--spaceM) var(--spaceL);
130
- border-radius: var(--spaceXS);
131
- font-size: var(--fontSizeBodyS);
132
- cursor: pointer;
133
- background-color: var(--primary);
134
- color: var(--white);
135
- border: none;
136
- transition: all var(--durationS) var(--bezierFastoutSlowin);
137
- margin-bottom: var(--spaceM);
138
- box-sizing: border-box;
139
- }
140
-
141
- .button:hover:not(:disabled) {
142
- background-color: color-mix(in lab, var(--primary) 85%, var(--black));
143
- }
144
-
145
- .button:disabled {
146
- background-color: color-mix(in lab, var(--background) 95%, transparent);
147
- color: var(--textLight);
148
- cursor: not-allowed;
149
- }
150
-
151
- .buttons {
152
- display: flex;
153
- flex-direction: column;
154
- gap: var(--spaceS);
155
- }
156
-
157
- .secondaryButton {
158
- padding: var(--spaceS) var(--spaceM);
159
- border: 1.5px solid color-mix(in lab, var(--text) 20%, transparent);
160
- border-radius: var(--spaceXS);
161
- background: transparent;
162
- cursor: pointer;
163
- font-size: var(--fontSizeBodyS);
164
- color: var(--textBody);
165
- transition: all var(--durationS) var(--bezierFastoutSlowin);
166
- box-sizing: border-box;
167
- width: 100%;
168
- }
169
-
170
- .secondaryButton:hover:not(:disabled) {
171
- background-color: color-mix(in lab, var(--background) 95%, transparent);
172
- border-color: color-mix(in lab, var(--text) 30%, transparent);
173
- }
174
-
175
- .actions {
176
- margin-top: var(--spaceL);
177
- text-align: center;
178
- }
179
-
180
- .cancelButton {
181
- padding: var(--spaceS) var(--spaceL);
182
- border: none;
183
- background: transparent;
184
- cursor: pointer;
185
- font-size: var(--fontSizeBodyS);
186
- color: var(--textLight);
187
- transition: color var(--durationS) var(--bezierFastoutSlowin);
188
- }
189
-
190
- .cancelButton:hover {
191
- color: var(--textBody);
192
- }
193
-
194
- .signOutContainer {
195
- margin-top: var(--spaceL);
196
- padding-top: var(--spaceL);
197
- border-top: 1px solid var(--borderLight);
198
- text-align: center;
199
- }
200
-
201
- .signOutText {
202
- color: var(--textLight);
203
- font-size: var(--fontSizeSmall);
204
- margin-bottom: var(--spaceM);
205
- }
206
-
207
- .sendCode,
208
- .verifyCode {
209
- text-align: center;
210
- }
211
-
212
- #recaptcha-container {
213
- margin-top: var(--spaceM);
214
- }
215
-
216
- /* Animations */
217
- @keyframes slideInError {
218
- from {
219
- opacity: 0;
220
- transform: translateY(calc(-1 * var(--spaceM))) scaleY(0.8);
221
- max-height: 0;
222
- padding-top: 0;
223
- padding-bottom: 0;
224
- margin-top: 0;
225
- margin-bottom: 0;
226
- }
227
- to {
228
- opacity: 1;
229
- transform: translateY(0) scaleY(1);
230
- max-height: 200px;
231
- padding-top: var(--spaceL);
232
- padding-bottom: var(--spaceL);
233
- margin-top: 0;
234
- margin-bottom: var(--spaceL);
235
- }
236
- }
237
-
238
- @keyframes shimmer {
239
- 0%,
240
- 100% {
241
- opacity: 0.6;
242
- transform: translateX(-100%);
243
- }
244
- 50% {
245
- opacity: 1;
246
- transform: translateX(100%);
247
- }
248
- }
249
-
250
- /* Reduce motion for accessibility */
251
- @media (prefers-reduced-motion: reduce) {
252
- .errorMessage {
253
- animation: none;
254
- }
255
-
256
- .errorMessage::before {
257
- animation: none;
258
- }
259
- }
@@ -1,34 +0,0 @@
1
- .modal {
2
- width: min(560px, calc(100vw - 2rem));
3
- }
4
-
5
- .reasonLabel {
6
- display: block;
7
- margin-bottom: 0.35rem;
8
- color: #495057;
9
- font-size: 0.8rem;
10
- font-weight: 600;
11
- }
12
-
13
- .reasonInput {
14
- width: 100%;
15
- box-sizing: border-box;
16
- border: 1px solid #cdd5dd;
17
- border-radius: 8px;
18
- padding: 0.6rem 0.75rem;
19
- font-size: 0.9rem;
20
- font-family: inherit;
21
- resize: vertical;
22
- }
23
-
24
- .reasonInput:focus {
25
- outline: none;
26
- border-color: #1f6feb;
27
- box-shadow: 0 0 0 2px rgba(31, 111, 235, 0.2);
28
- }
29
-
30
- .confirmButton {
31
- background: #dc3545;
32
- color: #ffffff;
33
- border-color: #c82333;
34
- }
@@ -1,9 +0,0 @@
1
- .modal {
2
- width: min(560px, calc(100vw - 2rem));
3
- }
4
-
5
- .confirmButton {
6
- background: #dc3545;
7
- color: #ffffff;
8
- border-color: #c82333;
9
- }
@@ -1,27 +0,0 @@
1
- .modal {
2
- width: min(480px, calc(100vw - 2rem));
3
- }
4
-
5
- .description {
6
- margin: 0 0 0.9rem;
7
- color: #4b5563;
8
- font-size: 0.86rem;
9
- line-height: 1.5;
10
- }
11
-
12
- .confirmButton {
13
- background: #1f6feb;
14
- color: #ffffff;
15
- border-color: #1560d4;
16
- }
17
-
18
- .confirmButton:not(:disabled):hover {
19
- background: #1560d4;
20
- }
21
-
22
- .emailError {
23
- margin: 0.45rem 0 0;
24
- color: #b91c1c;
25
- font-size: 0.83rem;
26
- line-height: 1.4;
27
- }
@@ -1,24 +0,0 @@
1
- .modal {
2
- width: min(400px, calc(100vw - 2rem));
3
- }
4
-
5
- .warningPanel {
6
- margin-bottom: 0.8rem;
7
- }
8
-
9
- .description {
10
- margin: 0 0 0.3rem;
11
- color: #4b5563;
12
- font-size: 0.86rem;
13
- line-height: 1.5;
14
- }
15
-
16
- .confirmButton {
17
- background: #1f6feb;
18
- color: #ffffff;
19
- border-color: #1560d4;
20
- }
21
-
22
- .confirmButton:not(:disabled):hover {
23
- background: #1560d4;
24
- }
@@ -1,82 +0,0 @@
1
- .overlay {
2
- position: fixed;
3
- inset: 0;
4
- background: rgba(0, 0, 0, 0.45);
5
- display: flex;
6
- align-items: center;
7
- justify-content: center;
8
- z-index: 120;
9
- }
10
-
11
- .modal {
12
- position: relative;
13
- width: min(460px, calc(100vw - 2rem));
14
- background: #ffffff;
15
- border-radius: var(--spaceXS);
16
- overflow: hidden;
17
- border: 1px solid #d9e0e7;
18
- box-shadow: 0 14px 36px rgba(0, 0, 0, 0.2);
19
- padding: 1.1rem;
20
- }
21
-
22
- .title {
23
- margin: 0;
24
- color: #212529;
25
- font-size: 1.02rem;
26
- }
27
-
28
- .helperText {
29
- margin: 0.4rem 0 0.9rem;
30
- color: #6c757d;
31
- font-size: 0.85rem;
32
- }
33
-
34
- .input {
35
- width: 100%;
36
- box-sizing: border-box;
37
- border: 1px solid #cdd5dd;
38
- border-radius: 8px;
39
- padding: 0.6rem 0.75rem;
40
- font-size: 0.92rem;
41
- }
42
-
43
- .input:focus {
44
- outline: none;
45
- border-color: #1f6feb;
46
- box-shadow: 0 0 0 2px rgba(31, 111, 235, 0.2);
47
- }
48
-
49
- .actions {
50
- display: flex;
51
- justify-content: flex-end;
52
- gap: 0.65rem;
53
- margin-top: 1rem;
54
- }
55
-
56
- .cancelButton,
57
- .confirmButton {
58
- border: 1px solid transparent;
59
- border-radius: 8px;
60
- padding: 0.55rem 0.9rem;
61
- font-size: 0.86rem;
62
- font-weight: 500;
63
- cursor: pointer;
64
- }
65
-
66
- .cancelButton {
67
- background: #f3f4f6;
68
- color: #3c4651;
69
- border-color: #d6dce2;
70
- }
71
-
72
- .confirmButton {
73
- background: #198754;
74
- color: #ffffff;
75
- border-color: #157347;
76
- }
77
-
78
- .cancelButton:disabled,
79
- .confirmButton:disabled {
80
- cursor: not-allowed;
81
- opacity: 0.6;
82
- }
@@ -1,9 +0,0 @@
1
- .modal {
2
- width: min(460px, calc(100vw - 2rem));
3
- }
4
-
5
- .confirmButton {
6
- background: #ffc107;
7
- color: #3f2f00;
8
- border-color: #e8b103;
9
- }
@@ -1,26 +0,0 @@
1
- .modal {
2
- width: min(620px, calc(100vw - 2rem));
3
- }
4
-
5
- .filePreviewList {
6
- margin: 0.6rem 0 0;
7
- padding-left: 1.1rem;
8
- color: #3f2a2e;
9
- font-size: 0.86rem;
10
- }
11
-
12
- .filePreviewList li + li {
13
- margin-top: 0.3rem;
14
- }
15
-
16
- .remainingNote {
17
- margin-top: 0.5rem;
18
- font-size: 0.84rem;
19
- color: #6b2f35;
20
- }
21
-
22
- .confirmButton {
23
- background: #dc3545;
24
- color: #ffffff;
25
- border-color: #c82333;
26
- }
@@ -1,49 +0,0 @@
1
- .overlay {
2
- position: fixed;
3
- inset: 0;
4
- background-color: color-mix(in lab, var(--background) 56%, transparent);
5
- display: flex;
6
- justify-content: center;
7
- align-items: center;
8
- z-index: var(--zIndex5);
9
- }
10
-
11
- .modal {
12
- position: relative;
13
- width: min(900px, calc(100vw - 2rem));
14
- max-height: calc(100vh - 4rem);
15
- background: var(--backgroundLight);
16
- border-radius: var(--spaceXS);
17
- box-shadow: 0 var(--spaceXS) var(--spaceL)
18
- color-mix(in lab, var(--black) 16%, transparent);
19
- display: flex;
20
- flex-direction: column;
21
- overflow: hidden;
22
- }
23
-
24
- .header {
25
- display: flex;
26
- align-items: center;
27
- justify-content: space-between;
28
- padding: var(--spaceM) var(--spaceL);
29
- border-bottom: 1px solid color-mix(in lab, var(--text) 12%, transparent);
30
- }
31
-
32
- .title {
33
- margin: 0;
34
- color: var(--textTitle);
35
- font-size: var(--fontSizeBodyM);
36
- font-weight: var(--fontWeightMedium);
37
- }
38
-
39
- .closeButton {
40
- background: none;
41
- border: none;
42
- color: var(--textLight);
43
- }
44
-
45
- .content {
46
- padding: var(--spaceM) var(--spaceL);
47
- overflow-y: auto;
48
- max-height: calc(100vh - 11rem);
49
- }
@@ -1,171 +0,0 @@
1
- .toolbarColorSelector {
2
- position: absolute;
3
- left: calc(100% + var(--spaceM));
4
- bottom: 0;
5
- background: var(--background);
6
- border-radius: 5px;
7
- box-shadow: 0 var(--spaceXS) var(--spaceM)
8
- color-mix(in lab, var(--black) 10%, transparent);
9
- padding: var(--spaceS);
10
- width: 200px;
11
- z-index: 50;
12
- }
13
-
14
- .header {
15
- display: flex;
16
- justify-content: flex-start;
17
- align-items: center;
18
- margin-bottom: var(--spaceS);
19
- padding-bottom: var(--spaceXS);
20
- border-bottom: 1px solid var(--border);
21
- }
22
-
23
- .title {
24
- font-size: var(--fontSizeS);
25
- font-weight: 600;
26
- color: var(--foreground);
27
- }
28
-
29
- .actions {
30
- display: flex;
31
- flex-direction: column;
32
- gap: var(--spaceXS);
33
- margin-top: var(--spaceS);
34
- padding-top: var(--spaceS);
35
- border-top: 1px solid var(--border);
36
- }
37
-
38
- .actionButton {
39
- width: 100%;
40
- min-height: 38px;
41
- border: none;
42
- border-radius: 4px;
43
- display: flex;
44
- align-items: center;
45
- justify-content: center;
46
- cursor: pointer;
47
- font-size: var(--fontSizeS);
48
- font-weight: 600;
49
- color: white;
50
- transition: background-color var(--durationS) var(--bezierFastoutSlowin);
51
- }
52
-
53
- .confirmButton {
54
- background: var(--success);
55
- }
56
-
57
- .confirmButton:hover {
58
- background: color-mix(in lab, var(--success) 80%, var(--black));
59
- }
60
-
61
- .cancelButton {
62
- background: var(--error);
63
- }
64
-
65
- .cancelButton:hover {
66
- background: color-mix(in lab, var(--error) 80%, var(--black));
67
- }
68
-
69
- .content {
70
- display: flex;
71
- flex-direction: column;
72
- gap: var(--spaceS);
73
- }
74
-
75
- .toggleSection {
76
- display: flex;
77
- justify-content: center;
78
- }
79
-
80
- .toggleButton {
81
- background: var(--backgroundSecondary);
82
- color: var(--foreground);
83
- border: 1px solid var(--border);
84
- border-radius: 3px;
85
- padding: var(--spaceXS) var(--spaceS);
86
- cursor: pointer;
87
- font-size: var(--fontSizeBodyXS);
88
- }
89
-
90
- .toggleButton:hover {
91
- background: var(--backgroundTertiary);
92
- }
93
-
94
- .colorWheelSection {
95
- display: flex;
96
- justify-content: center;
97
- }
98
-
99
- .colorWheel {
100
- width: 60px;
101
- height: 40px;
102
- border: 1px solid var(--border);
103
- border-radius: 3px;
104
- cursor: pointer;
105
- }
106
-
107
- .colorGrid {
108
- display: grid;
109
- grid-template-columns: repeat(5, 1fr);
110
- gap: var(--spaceXS);
111
- padding: var(--spaceXS);
112
- }
113
-
114
- .colorSwatch {
115
- width: 28px;
116
- height: 28px;
117
- border: 2px solid var(--border);
118
- border-radius: 3px;
119
- cursor: pointer;
120
- position: relative;
121
- transition: all 0.2s ease;
122
- }
123
-
124
- .colorSwatch:hover {
125
- transform: scale(1.1);
126
- border-color: var(--foreground);
127
- }
128
-
129
- .colorSwatch.selected {
130
- border-color: var(--foreground);
131
- border-width: 3px;
132
- box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--foreground);
133
- transform: scale(1.15);
134
- position: relative;
135
- }
136
-
137
- .colorSwatch.selected::after {
138
- content: "✓";
139
- position: absolute;
140
- top: 50%;
141
- left: 50%;
142
- transform: translate(-50%, -50%);
143
- color: var(--foreground);
144
- font-weight: bold;
145
- font-size: 14px;
146
- text-shadow: 0 0 3px var(--background), 0 0 6px var(--background);
147
- pointer-events: none;
148
- }
149
-
150
- .preview {
151
- display: flex;
152
- align-items: center;
153
- gap: var(--spaceS);
154
- padding: var(--spaceXS);
155
- background: var(--backgroundSecondary);
156
- border-radius: 3px;
157
- }
158
-
159
- .previewLabel {
160
- font-size: var(--fontSizeBodyXS);
161
- color: var(--foreground);
162
- font-weight: 500;
163
- }
164
-
165
- .previewSwatch {
166
- width: 20px;
167
- height: 20px;
168
- border: 1px solid var(--border);
169
- border-radius: 2px;
170
- flex-shrink: 0;
171
- }