@visns-studio/visns-components 6.0.4 → 6.1.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 (26) hide show
  1. package/package.json +1 -1
  2. package/src/components/DataGrid.jsx +37 -12
  3. package/src/components/Navigation.jsx +59 -3
  4. package/src/components/auth/Login.jsx +203 -175
  5. package/src/components/columns/ColumnRenderers.jsx +34 -0
  6. package/src/components/generic/GenericDashboard.jsx +181 -1
  7. package/src/components/generic/GenericFormBuilder.jsx +735 -37
  8. package/src/components/generic/GenericIndex.jsx +15 -5
  9. package/src/components/generic/OutstandingRuleEditor.jsx +313 -0
  10. package/src/components/styles/DataGrid.module.scss +38 -22
  11. package/src/components/styles/Form.module.scss +32 -33
  12. package/src/components/styles/GenericDashboard.module.scss +155 -0
  13. package/src/components/styles/GenericDetail.module.scss +28 -30
  14. package/src/components/styles/GenericDynamic.module.scss +7 -21
  15. package/src/components/styles/GenericEditableTable.module.scss +5 -22
  16. package/src/components/styles/GenericFormBuilder.module.scss +605 -30
  17. package/src/components/styles/GenericIndex.module.scss +17 -32
  18. package/src/components/styles/GenericMain.module.scss +18 -6
  19. package/src/components/styles/GenericQuote.module.scss +7 -22
  20. package/src/components/styles/GenericReport.module.scss +5 -37
  21. package/src/components/styles/Login.module.scss +415 -239
  22. package/src/components/styles/Navigation.module.scss +124 -35
  23. package/src/components/styles/Profile.module.scss +5 -26
  24. package/src/components/styles/QuickAction.module.scss +34 -29
  25. package/src/components/styles/_controls.scss +139 -0
  26. package/src/components/styles/global.css +54 -15
@@ -1,322 +1,498 @@
1
- .formItem {
2
- width: 100%;
3
- position: relative;
4
- box-sizing: border-box;
5
- margin-bottom: 1rem;
1
+ /**
2
+ * Prime Builders sign in.
3
+ *
4
+ * An asymmetric split: the company's own completed work on the left, the form
5
+ * on the right. Colours are taken from that photograph and the logo rather
6
+ * than a stock palette — the navy is the console's own #1A589D, the neutral is
7
+ * warmed toward the interior light in the shot, and the logo's red appears
8
+ * exactly once so it still reads as an accent.
9
+ *
10
+ * Type is Barlow throughout, already loaded locally by the app via
11
+ * @fontsource, so there is no webfont request to fail.
12
+ */
13
+
14
+ .auth {
15
+ /* Local aliases only — every brand value comes from the consuming app's
16
+ token layer so this library stays reusable. The fallbacks are neutral
17
+ on purpose: a project that defines nothing gets a plain, working sign
18
+ in rather than Prime's colours. */
19
+ --ink: var(--header-color, #10192a);
20
+ --navy: var(--primary-color, #26364a);
21
+ --navy-deep: var(--primary-color-darker, #16202e);
22
+ --flag: var(--accent-color, #8a8f98);
23
+ --paper: var(--surface-color, #ffffff);
24
+ --warm: var(--hover-color, #f4f4f2);
25
+ --line: var(--border-color, #e4e1dc);
26
+ --muted: var(--muted-color, #6b7688);
6
27
 
7
- .fi__label {
8
- position: relative;
9
- display: flex;
10
- align-items: center;
28
+ position: fixed;
29
+ inset: 0;
30
+ display: grid;
31
+ // Asymmetric on purpose. A 50/50 split reads as a template; giving the
32
+ // photograph the larger share makes it the subject and the form the task.
33
+ grid-template-columns: 52fr 48fr;
34
+ background: var(--paper);
35
+ font-family: 'Barlow', system-ui, sans-serif;
36
+ color: var(--ink);
37
+
38
+ @media (max-width: 900px) {
39
+ grid-template-columns: 1fr;
11
40
  }
41
+ }
42
+
43
+ /* --- Brand panel --------------------------------------------------------- */
44
+
45
+ .brand {
46
+ position: relative;
47
+ background-color: var(--navy-deep);
48
+ background-size: cover;
49
+ background-position: center 62%;
50
+ overflow: hidden;
12
51
 
13
- .fi__span {
52
+ // A scrim anchored to the bottom-left, where the copy sits — not a flat
53
+ // wash over the whole image, which would dull the dusk light that makes
54
+ // the photograph worth using.
55
+ &::after {
56
+ content: '';
14
57
  position: absolute;
15
- transition: all 200ms;
16
- opacity: 0.7;
17
- left: 0;
18
- transform-origin: top left;
19
- cursor: text;
20
- padding: 0 1rem;
21
- font-size: 0.9rem;
22
- color: #6b7280;
58
+ inset: 0;
59
+ background:
60
+ linear-gradient(
61
+ to top,
62
+ rgba(16, 25, 42, 0.92) 0%,
63
+ rgba(16, 25, 42, 0.55) 32%,
64
+ rgba(16, 25, 42, 0.08) 62%
65
+ ),
66
+ linear-gradient(
67
+ to right,
68
+ rgba(16, 25, 42, 0.5) 0%,
69
+ rgba(16, 25, 42, 0) 55%
70
+ );
23
71
  }
24
72
 
25
- .fi__div {
26
- transition: all 200ms;
27
- opacity: 0.8;
28
- left: 0;
29
- padding: 19px 13px;
30
- border-radius: 0.5rem;
31
- border: 1px solid #e5e7eb;
32
- box-shadow: none;
73
+ @media (max-width: 900px) {
74
+ display: none;
33
75
  }
76
+ }
34
77
 
35
- .fi__toggle {
36
- width: max-content;
37
- padding: 0 10px 0 0;
38
- box-sizing: border-box;
39
- display: inline;
40
- }
78
+ .brandInk {
79
+ position: absolute;
80
+ left: clamp(2rem, 4vw, 3.5rem);
81
+ right: clamp(2rem, 4vw, 3.5rem);
82
+ bottom: clamp(2rem, 5vh, 3.5rem);
83
+ z-index: 1;
84
+ color: #fff;
85
+ animation: rise 0.7s cubic-bezier(0.2, 0.7, 0.3, 1) both;
86
+ }
87
+
88
+ .eyebrow {
89
+ margin: 0 0 0.75rem;
90
+ font-size: 0.72rem;
91
+ font-weight: 700;
92
+ letter-spacing: 0.22em;
93
+ text-transform: uppercase;
94
+ color: rgba(255, 255, 255, 0.75);
95
+ // The single use of the logo's red in the whole screen.
96
+ padding-left: 2.1rem;
97
+ position: relative;
41
98
 
42
- .fi__toggletxt {
43
- position: relative;
44
- left: 5px;
45
- font-size: 0.95em;
46
- top: -5px;
99
+ &::before {
100
+ content: '';
101
+ position: absolute;
102
+ left: 0;
103
+ top: 50%;
104
+ width: 1.5rem;
105
+ height: 2px;
106
+ background: var(--flag);
47
107
  }
48
108
  }
49
109
 
50
- .fwItem,
51
- .fwBuilderItem {
52
- grid-column: 1 / -1;
53
- width: 100%;
110
+ .brandLine {
111
+ margin: 0 0 0.6rem;
112
+ font-size: clamp(2.4rem, 4.2vw, 3.6rem);
113
+ font-weight: 700;
114
+ line-height: 1;
115
+ // Tight tracking at display size — Barlow opens up as it scales.
116
+ letter-spacing: -0.02em;
117
+ text-wrap: balance;
118
+ }
119
+
120
+ .brandSub {
121
+ margin: 0;
122
+ max-width: 34ch;
123
+ font-size: 1rem;
124
+ font-weight: 300;
125
+ line-height: 1.5;
126
+ color: rgba(255, 255, 255, 0.82);
127
+ }
128
+
129
+ /* --- Form panel ---------------------------------------------------------- */
130
+
131
+ .panel {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ padding: 2rem clamp(1.5rem, 5vw, 4.5rem);
136
+ background: var(--paper);
137
+ overflow-y: auto;
138
+
139
+ @media (max-width: 900px) {
140
+ // Stacked, the warm neutral stops the screen being a blank white sheet.
141
+ background:
142
+ linear-gradient(var(--warm), var(--paper) 22rem);
143
+ }
54
144
  }
55
145
 
56
- .lastItem .btn {
146
+ .panelInner {
57
147
  width: 100%;
148
+ max-width: 24rem;
149
+ // Left aligned, not centred. Centred text over a form is a template look,
150
+ // and the eye has to travel back and forth to read labels and fields.
151
+ text-align: left;
152
+ animation: rise 0.55s cubic-bezier(0.2, 0.7, 0.3, 1) both;
153
+ animation-delay: 0.08s;
58
154
  }
59
155
 
60
- .loginlogo {
156
+ .logo {
61
157
  display: block;
62
- width: 100%;
63
- max-width: 150px;
64
- height: auto;
65
- margin: 0 auto;
66
- padding-bottom: 1.5rem;
158
+ width: auto;
159
+ height: 3.1rem;
160
+ margin-bottom: 2.4rem;
67
161
  }
68
162
 
69
- .logincontainer {
70
- width: 100%;
71
- min-height: 100vh;
72
- display: grid;
73
- place-items: center;
74
- padding: 1rem;
75
- background-color: #f9fafb;
163
+ .title {
164
+ margin: 0 0 0.35rem;
165
+ font-size: 1.9rem;
166
+ font-weight: 700;
167
+ letter-spacing: -0.02em;
168
+ line-height: 1.1;
76
169
  }
77
170
 
78
- .login {
79
- width: 28rem;
80
- padding: 2rem;
81
- margin: 0;
82
- display: grid;
83
- grid-template-columns: 1fr;
84
- gap: 1rem;
85
- background-color: white;
86
- border-radius: 0.75rem;
87
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
88
- 0 2px 4px -1px rgba(0, 0, 0, 0.06);
89
-
90
- > .formItem {
91
- padding: 0;
92
-
93
- small {
94
- position: absolute;
95
- width: 18px;
96
- height: 18px;
97
- right: 14px;
98
- top: 14px;
99
- opacity: 0.4;
100
- color: #6b7280;
101
- }
102
- }
171
+ .subtitle {
172
+ margin: 0 0 2rem;
173
+ font-size: 0.95rem;
174
+ font-weight: 400;
175
+ color: var(--muted);
176
+ }
177
+
178
+ .form {
179
+ display: flex;
180
+ flex-direction: column;
181
+ gap: 0.9rem;
182
+ }
183
+
184
+ /* Floating label. The label sits in the field until it holds something, so
185
+ the field is self-describing without a separate line of text above it. */
186
+ .field {
187
+ position: relative;
103
188
 
104
- > .loginitem {
105
- grid-column: 1 / -1;
106
- padding: 0.25em 0;
189
+ input {
190
+ width: 100%;
191
+ height: 3.35rem;
192
+ padding: 1.15rem 0.9rem 0.4rem;
193
+ border: 1px solid var(--line);
194
+ border-radius: 0.6rem;
195
+ background: var(--paper);
196
+ font-family: inherit;
197
+ font-size: 1rem;
198
+ color: var(--ink);
199
+ transition:
200
+ border-color 0.15s ease,
201
+ box-shadow 0.15s ease;
107
202
 
108
- label {
109
- width: 100%;
203
+ &:hover {
204
+ border-color: #c9c5be;
110
205
  }
111
206
 
112
- button {
113
- width: 100%;
207
+ &:focus {
208
+ outline: none;
209
+ border-color: var(--navy);
210
+ // A ring rather than a thicker border, so nothing shifts on focus.
211
+ box-shadow: 0 0 0 3px var(--focus-ring-soft, rgba(38, 54, 74, 0.16));
114
212
  }
115
213
  }
214
+
215
+ label {
216
+ position: absolute;
217
+ left: 0.95rem;
218
+ top: 1.05rem;
219
+ font-size: 1rem;
220
+ font-weight: 400;
221
+ color: var(--muted);
222
+ pointer-events: none;
223
+ transition:
224
+ transform 0.14s ease,
225
+ font-size 0.14s ease,
226
+ color 0.14s ease;
227
+ transform-origin: 0 0;
228
+ }
229
+
230
+ // :not(:placeholder-shown) is why every input carries placeholder=" ".
231
+ input:focus + label,
232
+ input:not(:placeholder-shown) + label {
233
+ transform: translateY(-0.72rem);
234
+ font-size: 0.72rem;
235
+ font-weight: 600;
236
+ letter-spacing: 0.02em;
237
+ color: var(--navy);
238
+ }
239
+
240
+ // Room for the reveal button so long values do not run underneath it.
241
+ &:has(.reveal) input {
242
+ padding-right: 3rem;
243
+ }
116
244
  }
117
245
 
118
- .forgotten span {
119
- display: block;
120
- text-align: center;
121
- color: #6b7280;
122
- padding: 1rem 0;
123
- font-size: 0.875rem;
246
+ /* Set imperatively by the login handler on a failed attempt, so it is a plain
247
+ global class rather than a module one. */
248
+ :global(.inputError) {
249
+ border-color: var(--danger-color, #b3261e) !important;
250
+ box-shadow: 0 0 0 3px var(--danger-ring, rgba(179, 38, 30, 0.14)) !important;
251
+ }
124
252
 
125
- a {
126
- color: var(--primary-color, #4f46e5);
127
- text-decoration: none;
128
- font-weight: 500;
253
+ .reveal {
254
+ position: absolute;
255
+ right: 0.55rem;
256
+ top: 50%;
257
+ transform: translateY(-50%);
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ width: 2.1rem;
262
+ height: 2.1rem;
263
+ border: none;
264
+ border-radius: 0.4rem;
265
+ background: none;
266
+ color: var(--muted);
267
+ cursor: pointer;
129
268
 
130
- &:hover {
131
- text-decoration: underline;
132
- }
269
+ &:hover {
270
+ background: var(--warm);
271
+ color: var(--ink);
133
272
  }
134
273
  }
135
274
 
136
- .rememberMeContainer {
275
+ .row {
137
276
  display: flex;
138
277
  align-items: center;
139
278
  justify-content: space-between;
140
- width: 100%;
141
- padding: 0 0.25rem;
142
- box-sizing: border-box;
143
- margin-top: -0.5rem;
279
+ gap: 1rem;
280
+ margin: 0.1rem 0 0.5rem;
144
281
  }
145
282
 
146
- .rememberMeCheckboxWrapper {
283
+ .remember {
147
284
  display: flex;
148
285
  align-items: center;
149
- justify-content: center;
150
- margin-right: 0.5rem;
286
+ gap: 0.5rem;
287
+ font-size: 0.88rem;
288
+ color: var(--muted);
289
+ cursor: pointer;
290
+
291
+ input {
292
+ width: 1rem;
293
+ height: 1rem;
294
+ accent-color: var(--navy);
295
+ cursor: pointer;
296
+ }
151
297
  }
152
298
 
153
- .rememberMeLabel {
299
+ .link {
300
+ font-size: 0.88rem;
301
+ font-weight: 600;
302
+ color: var(--navy);
303
+ text-decoration: none;
304
+
305
+ &:hover {
306
+ text-decoration: underline;
307
+ }
308
+ }
309
+
310
+ /* Secondary. Microsoft is the primary action above, so this is outlined —
311
+ two filled buttons on one screen give no answer to "which one". */
312
+ .submit {
313
+ width: 100%;
314
+ height: 3.1rem;
315
+ border: 1px solid var(--line);
316
+ border-radius: 0.6rem;
317
+ background: var(--paper);
318
+ color: var(--ink);
319
+ font-family: inherit;
320
+ font-size: 0.95rem;
321
+ font-weight: 600;
322
+ letter-spacing: 0.01em;
154
323
  cursor: pointer;
155
- user-select: none;
156
- color: #6b7280;
157
- font-size: 0.875rem;
158
- white-space: nowrap;
324
+ transition:
325
+ border-color 0.15s ease,
326
+ background 0.15s ease,
327
+ transform 0.08s ease;
328
+
329
+ &:hover:not(:disabled) {
330
+ border-color: #c9c5be;
331
+ background: var(--warm);
332
+ }
333
+
334
+ &:active:not(:disabled) {
335
+ transform: translateY(1px);
336
+ }
337
+
338
+ &:focus-visible {
339
+ outline: 3px solid var(--focus-ring-strong, rgba(38, 54, 74, 0.3));
340
+ outline-offset: 2px;
341
+ }
342
+
343
+ &:disabled {
344
+ opacity: 0.65;
345
+ cursor: default;
346
+ }
159
347
  }
160
348
 
161
- .rememberMeCheckbox {
162
- width: 16px;
163
- height: 16px;
349
+ /* A quiet way down to the secondary path. Not a link — it performs an action
350
+ on this page rather than navigating anywhere. */
351
+ .altToggle {
352
+ display: block;
353
+ width: 100%;
354
+ margin-top: 1rem;
355
+ padding: 0.6rem;
356
+ border: none;
357
+ border-radius: 0.5rem;
358
+ background: none;
359
+ font-family: inherit;
360
+ font-size: 0.9rem;
361
+ font-weight: 600;
362
+ color: var(--navy);
164
363
  cursor: pointer;
165
- position: relative;
166
- accent-color: var(--primary-color, #4f46e5);
167
- border-radius: 0.25rem;
168
- margin-right: 0.5rem;
169
364
 
170
365
  &:hover {
171
- accent-color: var(--secondary-color, #3cbf7d);
366
+ background: var(--warm);
172
367
  }
173
368
 
174
- &:focus {
175
- outline: 2px solid rgba(var(--primary-rgb), 0.25);
369
+ &:focus-visible {
370
+ outline: 3px solid var(--focus-ring-strong, rgba(38, 54, 74, 0.3));
176
371
  outline-offset: 2px;
177
372
  }
178
373
  }
179
374
 
180
- .lcontainer {
181
- min-height: 100vh;
182
- display: flex;
183
- align-items: center;
184
- justify-content: center;
185
- background-color: #f9fafb;
375
+ /* Animates 0fr -> 1fr, so it opens to whatever height the form needs rather
376
+ than a hardcoded max-height that would either clip or overshoot. */
377
+ .collapse {
378
+ display: grid;
379
+ grid-template-rows: 0fr;
380
+ opacity: 0;
381
+ transition:
382
+ grid-template-rows 0.28s cubic-bezier(0.2, 0.7, 0.3, 1),
383
+ opacity 0.22s ease;
186
384
  }
187
385
 
188
- .lwrap {
189
- display: grid;
190
- grid-template-columns: 1fr;
386
+ .collapseInner {
387
+ // Required for the row to be able to collapse to nothing.
388
+ overflow: hidden;
389
+ min-height: 0;
191
390
  }
192
391
 
193
- .aside {
392
+ .collapseOpen {
393
+ grid-template-rows: 1fr;
194
394
  opacity: 1;
195
- position: fixed;
196
- overflow: hidden;
197
- height: 101%;
198
- width: var(--sidebar-width);
199
395
  }
200
396
 
201
- .btn {
202
- width: max-content;
203
- display: inline-block;
204
- position: relative;
205
- padding: 0.75rem 1rem;
397
+ .divider {
398
+ display: flex;
399
+ align-items: center;
400
+ gap: 0.9rem;
401
+ margin: 1.4rem 0;
402
+ color: var(--muted);
403
+ font-size: 0.78rem;
404
+ letter-spacing: 0.08em;
405
+ text-transform: uppercase;
406
+
407
+ &::before,
408
+ &::after {
409
+ content: '';
410
+ flex: 1;
411
+ height: 1px;
412
+ background: var(--line);
413
+ }
414
+ }
415
+
416
+ /* Primary. This is how Prime staff actually sign in, so it carries the fill
417
+ and sits above the fold of the form. */
418
+ .sso {
419
+ display: flex;
420
+ align-items: center;
421
+ justify-content: center;
422
+ gap: 0.65rem;
423
+ width: 100%;
424
+ height: 3.4rem;
425
+ border: none;
426
+ border-radius: 0.6rem;
427
+ background: var(--navy);
428
+ font-family: inherit;
429
+ font-size: 1rem;
430
+ font-weight: 600;
431
+ color: #fff;
206
432
  cursor: pointer;
207
- font-size: 0.875rem;
208
- font-weight: 500;
209
- color: white;
210
- text-decoration: none;
211
- overflow: hidden;
212
- background: var(--primary-color, #4f46e5);
213
- border: 1px solid var(--primary-color, #4f46e5);
214
- border-radius: 0.5rem;
215
- outline: none;
216
- transition: all 0.2s ease;
217
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
433
+ transition:
434
+ background 0.15s ease,
435
+ transform 0.08s ease;
218
436
 
219
437
  &:hover {
220
- background: var(--secondary-color, #3cbf7d);
221
- border-color: var(--secondary-color, #3cbf7d);
222
- }
223
-
224
- &:focus {
225
- box-shadow: 0 0 0 2px rgba(var(--secondary-rgb, 60, 191, 125), 0.25);
438
+ background: var(--navy-deep);
226
439
  }
227
- }
228
440
 
229
- /* Login component wrapper for all scoped styles */
230
- .login,
231
- .logincontainer,
232
- .lcontainer {
233
- /* Input, textarea, and select styling */
234
- input:not(:placeholder-shown) + .fi__span,
235
- textarea:not(:placeholder-shown) + .fi__span,
236
- select:not(:placeholder-shown) + .fi__span {
237
- transform: translateY(-135%) translateX(10px) scale(0.85);
238
- opacity: 1;
239
- padding: 0;
240
- background: white;
241
- font-weight: 500;
242
- transition: all 0.3s ease;
243
- color: var(--primary-color, #4f46e5) !important;
441
+ &:active {
442
+ transform: translateY(1px);
244
443
  }
245
444
 
246
- input:focus + .fi__span,
247
- textarea:focus + .fi__span,
248
- select:focus + .fi__span {
249
- color: var(--primary-color, #4f46e5) !important;
445
+ &:focus-visible {
446
+ outline: 3px solid var(--focus-ring-strong, rgba(38, 54, 74, 0.3));
447
+ outline-offset: 2px;
250
448
  }
449
+ }
251
450
 
252
- input:focus,
253
- textarea:focus,
254
- select:focus {
255
- border-color: var(--primary-color, #4f46e5) !important;
256
- outline: none;
257
- box-shadow: 0 0 0 2px rgba(var(--primary-rgb), 0.25);
258
- }
451
+ /* The Microsoft squares are drawn for a white ground, so they keep one
452
+ instead of sitting straight on the navy. */
453
+ .ssoMark {
454
+ display: flex;
455
+ align-items: center;
456
+ justify-content: center;
457
+ width: 1.65rem;
458
+ height: 1.65rem;
459
+ border-radius: 0.3rem;
460
+ background: #fff;
461
+ flex: none;
462
+ }
259
463
 
260
- /* Divider styling for the OR section */
261
- .divider {
262
- display: flex;
263
- align-items: center;
264
- text-align: center;
265
- margin: 1rem 0;
266
- color: #9ca3af;
267
- font-size: 0.875rem;
268
- }
464
+ .foot {
465
+ margin: 2.5rem 0 0;
466
+ font-size: 0.78rem;
467
+ color: var(--muted);
468
+ }
269
469
 
270
- .divider::before,
271
- .divider::after {
272
- content: '';
273
- flex: 1;
274
- border-bottom: 1px solid #e5e7eb;
470
+ /* One entrance, staggered between the two panels. Anything more would be
471
+ decoration on a screen people pass through several times a day. */
472
+ @keyframes rise {
473
+ from {
474
+ opacity: 0;
475
+ transform: translateY(0.75rem);
275
476
  }
276
-
277
- .divider::before {
278
- margin-right: 1rem;
477
+ to {
478
+ opacity: 1;
479
+ transform: none;
279
480
  }
481
+ }
280
482
 
281
- .divider::after {
282
- margin-left: 1rem;
483
+ @media (prefers-reduced-motion: reduce) {
484
+ .brandInk,
485
+ .panelInner {
486
+ animation: none;
283
487
  }
284
488
 
285
- /* SSO button styling */
286
- .ssoButton {
287
- display: flex;
288
- align-items: center;
289
- justify-content: center;
290
- width: 100%;
291
- padding: 0.75rem 1rem;
292
- background-color: white;
293
- border: 1px solid #e5e7eb;
294
- border-radius: 0.5rem;
295
- font-size: 0.875rem;
296
- font-weight: 500;
297
- color: #374151;
298
- transition: all 0.2s ease;
299
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
300
-
301
- &:hover {
302
- background-color: var(--bg-color, #f5f3ef);
303
- border-color: var(--border-color, #e1e1e1);
304
- }
305
-
306
- img {
307
- margin-right: 0.5rem;
308
- }
489
+ .collapse {
490
+ transition: none;
309
491
  }
310
492
 
311
- .forgotPasswordLink {
312
- &:hover {
313
- color: var(--secondary-color, #3cbf7d) !important;
314
- text-decoration: underline !important;
315
- }
316
-
317
- &:focus {
318
- outline: 2px solid rgba(var(--primary-rgb), 0.25) !important;
319
- outline-offset: 2px !important;
320
- }
493
+ .submit,
494
+ .field input,
495
+ .field label {
496
+ transition: none;
321
497
  }
322
498
  }